Page 1 of 4 1 2 3 ... LastLast
Results 1 to 15 of 56

Thread: Nieuw Project

  1. #1

    Wink Nieuw Project

    .. ik ben van plan een programma te schrijven dat de grafiek weergeeft van een teedegraads functie (ax^2+bx+c) waarbij de gebruiker met scrollbars de waarden van a, b en c kan varieren om te kijken wat het effect is op de grafiek. Ik ben zo begonnen:

    Code:
    unit TweedeGraadsFunctie;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
      Forms, Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormActivate(Sender: TObject);
    
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure grafiek(x,y: real);
    begin
       Canvas.Pixels[3,32];
       sleep(10000);
    end;
    
    procedure TForm1.FormActivate(Sender: TObject);
    begin
       Canvas.Rectangle(1,1,400,500);
       Canvas.Brush.Color :=RGB(255,0,0);
       grafiek(1,1);
    end;
    
    end.
    Maar ik krijg de foutmelding van een undeclared identifier vanuit de grafiek procedure met betrekking tot Canvas. Canvas in het hoofdprogramma (TForm1.FormActivate) kent hij wel. Ondanks dat ik de procedure grafiek niet heb gedeclareerd kent het programma deze wel. Maar de Uses Units zijn in grafiek blijkbaar onbekend. Weet iemand een oplossing? Kun je met de component chart ook een grafiek genereren? Ik ben een beginneling :-)

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Welkom op NLDelphi.

    Lijkt me een leuk project!
    Maar ik krijg de foutmelding van een undeclared identifier vanuit de grafiek procedure met betrekking tot Canvas. Canvas in het hoofdprogramma (TForm1.FormActivate) kent hij wel.
    Allereerst: Canvas, hetgeen waar de compiler over klaagt niet te herkennen, is een onderdeel van TForm1.

    Dat "hoofdprogramma" FormActivate waar je het over hebt heet een method: een routine (een procedure of functie) van een object. In dit geval is dat object TForm1.
    De procedure Grafiek daarentegen is slechts onderdeel van de unit, maar dus niet van TForm1.

    Om Canvas te laten herkennen in Grafiek, zou je die routine onderdeel kunnen maken van TForm1, als volgt:
    Delphi Code:
    1. type
    2.   ...
    3.   private
    4.     { Private declarations }
    5.     procedure Grafiek;
    6.   protected
    7.   ...
    8.  
    9. procedure TForm1.Grafiek;
    10. ...
    Kun je met de component chart ook een grafiek genereren?
    Vertrouwd met TChart ben ik niet, maar ik geloof dat dat niet kan. Maar dit lijkt me juist zo'n leuk oefenproject om zelf te tekenen.

    Handig daarbij is om te realiseren dat jouw tekening op het canvas van het form (nu nog) niet definitief is! Deze implementatie in OnActivate zorgt er in ieder geval al wel voor dat de tekening hertekend wordt als je het venster verbergt en daarna weer tevoorschijn haalt. Maar jouw tekening wordt nog niet ververst bij bijvoorbeeld het verkleinen en vergroten van het Form. Je kunt je code daarom beter onderbrengen in OnPaint.

    Misschien heb je ook wat aan Introductie tekenen in Delphi.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    .. heel erg bedankt. Het werkt. Ik snap het en zo kan ik weer verder. Kun je hier ook een delphi project plaatsen of posten om reacties/kritiek van ervaren programmeurs te krijgen?

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708

    Thumbs up

    Jazeker en dat wordt zeker aangemoedigd

    In plaats van te reageren in een draadje door gebruik te maken van het "Snel reageren"-
    gedeelte onderin het scherm, moet je op de -knop drukken om de full-size
    berichteditor te krijgen.

    In de fullsize editor vind je onderaan de "Beheer Bijlagen"-knop; wanneer je hierop
    klikt opent er zich een nieuw scherm waar je bestanden mee kunt uploaden.


    Met de "Browse..."-knop in dat venster kun je een bestand op je schijf selecteren
    en daarna uploaden door op de "Uploaden"-knop te drukken.
    Wanneer je klaar bent met het toevoegen van bijlagen, kun je dat venstertje weer
    sluiten door op de "sluit dit venster"-link rechtsboven te drukken.

    Enkele dingen waar je op moet letten bij het uploaden:
    • Pak je project in een ZIP-bestand zonder wachtwoord e.d.
    • We hebben alleen de code zelf nodig, dus niet de executable (*.exe); dit zou
      de upload ook veel te groot maken.
      In feitte hebben we alleen de *.dpr, *.pas en *.dfm-bestanden nodig; deze bron-
      bestanden zijn, over het algemeen, bij elkaar niet groter dan 5~50kB, afhankelijk
      van hoe ingewikkeld je project is.
    • De maximaal toegestane grootte van een (ZIP) bestand is 100kB.
    • Wanneer je slechts enkele regels code wilt laten zien heeft een upoad van jouw
      gehele project niet veel zin en kun je beter gebruik maken van de [ HIGHLIGHT ]-tag
      om je code op het forum zelf te plaatsen (zoals in je eerste post).
    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  5. #5
    .. ok, dank je. Ik heb net mijn, min of meer, eerste programma geschreven en wil het graag laten zien. Ik neem aan dat daar een speciale plaats voor is en dat het niet de bedoeling is om het in een willekeurige thread te posten. Of is het de bedoeling een nieuwe thread te maken. Nu ja, ik hoor het wel
    Attached Files Attached Files

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Het is mij nog niet helemaal duidelijk wat het doel is van het project dat je gepost hebt
    (ik mis de grafiek nog) , maar qua code ziet het er goed uit.

    Het is niet helemaal mijn stijl van code schrijven, maar het is zeker niet verkeerd

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  7. #7

    Smile

    .. .. wat is jouw stijl dan? Maar dank je. De grafiek procedure laat drie horizontale balkjes zien (edit vensters) die de R,G en B waarden representeren. Dus zoiets als een rij led's die het output signaal in dB geven zo als op een oude cassettrecorder.

    Maar ik heb weer een heel elementair probleem. Ik heb nu dit:

    Code:
    unit TweedeGraadsFunctie;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
      Forms, Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormActivate(Sender: TObject);
    
      private
        { Private declarations }
      public
        { Public declarations }
           procedure grafiek(x,y: real);
           function f(x:real):real;
      end;
    
    const min=-5; max=5; interval=0.01;
    var
      Form1: TForm1;
      x,y  : real;
    
    implementation
    
    {$R *.dfm}
    
    procedure Tform1.grafiek(x,y: real);
    var p,q : integer;
    begin
       p:=(1/interval)*x;
       q:=(1/interval)*y;
       Canvas.Pixels[p,q];
    end;
    
    function Tform1.f(x:real):real;
    begin
       f:=x*x;
    end;
    
    procedure TForm1.FormActivate(Sender: TObject);
    begin
       Canvas.Rectangle(1,1,400,500);
       Canvas.Brush.Color :=RGB(255,1,1);
       x:=min;
       While x<=max do
            begin
              y:=f(x);
              x:=x+interval;
            end;
    end;
    
    end.
    Hier:

    Code:
    procedure Tform1.grafiek(x,y: real);
    var p,q : integer;
    begin
       p:=(1/interval)*x;
       q:=(1/interval)*y;
       Canvas.Pixels[p,q];
    end;
    krijg ik een foutmelding: p is integer en het resultaat is extended. Als ik p en q het type extended geef krijg ik:

    Code:
    Canvas.Pixels[p,q];
    Canvas.Pixels accepteert alleen integers maar ik heb p en q nu juist als extended opgegeven.

    Wie weet raad?

  8. #8
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Delphi is een strong-typed language, wat wil zeggen dat je zelf voor alle conversie naar de juiste types moet zorgen.

    In dit geval vereist de Pixels property inderdaad alleen maar Integers (er is immers niet een halve pixel op je beeldscherm), dus moet je die Extended waarde naar een Integer converteren. Dat kan bijvoorbeeld met Trunc(), Round(), RoundTo(), Ceil() of Floor(). Zie de help voor de verschillen.

    Delphi Code:
    1. procedure TForm1.DrawGraphic(X, Y: Extended);
    2. var
    3.   P: Integer;
    4.   Q: Integer;
    5. begin
    6.   P := Trunc(X / Interval);
    7.   Q := Trunc(Y / Interval);
    8.   Canvas.Pixels[P, Q] := clYellow;
    9. end;
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  9. #9
    .. ik had je al eerder willen antwoorden maar er was een serverfout of iets dergelijks. Mijn project is uitgelopen op een volledig functieonderzoek. Er is iets wat ik niet voor elkaar kan krijgen wat toch vrij essentieel is. Functievoorschrift: f(x)=dx^3+ax^2+bx+c. Ik heb voor a..c+d 4 scrollbars. Daar stel ik de waarden mee in en druk vervolgens op een knop om de functie te tekenen. Maar als ik de tekenopdracht in de Scrollbarprocedure zelf opneem vertoont de bar eigenaardig gedrag. Als ik de muisaanwijzer aan het eind van de bar houdt zonder te klikken dan schiet de schuif meteen door naar zijn max/min waarde met als gevolg dat er veel grafieken achter elkaar worden getekend. Daarna zit de bar vast. De code is al aardig lang en ik ben bang dat je er niet een twee drie uitkomt. Nu ja, ik zie wel wat je er van vindt. Code:

    Code:
    unit TweedeGraadsFunctie;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        KnopWissen: TButton;
        GroupBox1: TGroupBox;
        ScrollBara: TScrollBar;
        ScrollBarb: TScrollBar;
        ScrollBarc: TScrollBar;
        KnopReset: TButton;
        KnopTekenF: TButton;
        GroupBox2: TGroupBox;
        Panel1: TPanel;
        Label1: TLabel;
        KnopNulpuntenNumeriek: TButton;
        KnopExtremeWaardeParaboolABCformule: TButton;
        KnopNulpuntenParaboolABCformule: TButton;
        GroupBox3: TGroupBox;
        ScrollBard: TScrollBar;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        KnopTekenG: TButton;
        Uit_fx: TEdit;
        Uit_gx: TEdit;
        Uit_a: TEdit;
        Uit_b: TEdit;
        Uit_c: TEdit;
        Uit_NE: TEdit;  {Nulpunten Exact}
        Uit_EE: TEdit;
        Uit_NN1: TEdit;
        KnopFunctiegenerator: TButton;
        KnopStopGenereren: TButton;
        KnopRaaklijnenExact: TButton;
        Uit_NN2: TEdit;
        Panel6: TPanel;
        Label6: TLabel;
        Label7: TLabel;
        Label8: TLabel;
        Label9: TLabel;
        Uit_d: TEdit;
        KnopExtremeWaarden: TButton;
        Uit_EW: TEdit;  {Nulpunten Numeriek}
        procedure FormActivate(Sender: TObject);
        procedure KnopWissenClick(Sender: TObject);
        procedure ScrollBaraScroll(Sender: TObject; ScrollCode: TScrollCode;
          var ScrollPos: Integer);
        procedure ScrollBarbScroll(Sender: TObject; ScrollCode: TScrollCode;
          var ScrollPos: Integer);
        procedure ScrollBarcScroll(Sender: TObject; ScrollCode: TScrollCode;
          var ScrollPos: Integer);
        procedure KnopResetClick(Sender: TObject);
        procedure KnopTekenFClick(Sender: TObject);
        procedure KnopNulpuntenNumeriekClick(Sender: TObject);
        procedure KnopExtremeWaardeParaboolABCformuleClick(Sender: TObject);
        procedure KnopNulpuntenParaboolABCformuleClick(Sender: TObject);
        procedure ScrollBardScroll(Sender: TObject; ScrollCode: TScrollCode;
          var ScrollPos: Integer);
        procedure KnopTekenGClick(Sender: TObject);
        procedure KnopFunctiegeneratorClick(Sender: TObject);
        procedure KnopStopGenererenClick(Sender: TObject);
        procedure KnopRaaklijnenExactClick(Sender: TObject);
        procedure KnopExtremeWaardenClick(Sender: TObject);
    
      private
        { Private declarations }
      public
        { Public declarations }
           procedure plaatspixel(x,y: real; Kleur: TColor);
           procedure ToonFunctievoorschrift;
           procedure TekenAssenstelsel;
           procedure plotten(k:char);
           procedure wissen;
           function f(x:real):real;
           function g(x:real):real;
           function r(x:real):real;
      end;
    
    const dint=10; dmin=-dint div 2; dmax=-dmin;
          interval=0.001; m=10; pix=696;
          x0=m+(pix div 2); y0=m+(pix div 2);
          KleurRectangle=clGray; KleurAssen=clPurple;
    var
      Form1                   : TForm1;
      stoppen                 : boolean;
      gereset                 : boolean;
      doorgaan                : boolean;
      x,y,xmax,ymax,aa,bb     : real;
      a,b,c,d                 : integer;
    
    implementation
    
    {$R *.dfm}
    
    function Tform1.f(x:real):real;
    begin
       f:=d*x*x*x+a*x*x+b*x+c;
    end;
    
    function Tform1.g(x:real):real;
    begin
       g:=3*d*x*x+2*a*x+b;
    end;
    
    function Tform1.r(x:real):real;
    begin
       r:=(aa*x)+bb;
    end;
    
    
    Procedure TForm1.ToonFunctievoorschrift;
    var t4,t1,t2,t3 : char;
        S4,S1,S2,S3 : string[20];
        g4,g1,g2,g3 : string[3];
        e4,e1,e2    : string[2];
    begin
       if d<=1 then t4:='-';
       if d=0 then t4:=' ';
       if d>0 then t4:=' ';
    
       if a<=1 then t1:='-';
       if a=0 then t1:=' ';
       if a>0 then t1:='+';
    
       if b<=1 then t2:='-';
       if b=0 then t2:=' ';
       if b>0 then t2:='+';
    
       if c<=1 then t3:='-';
       if c=0 then t3:=' ';
       if c>0 then t3:='+';
    
       if ((d>=-1) and (d<=1)) then g4:=' ' else
         if d>1 then g4:=IntToStr(d)else g4:=IntToStr(-d);
       if ((a>=-1) and (a<=1)) then g1:=' ' else
         if a>1 then g1:=IntToStr(a)else g1:=IntToStr(-a);
       if ((b>=-1) and (b<=1)) then g2:=' ' else
         if b>1 then g2:=IntToStr(b)else g2:=IntToStr(-b);
       if c=0 then g3:=' ' else
        if c>=1 then g3:=IntToStr(c)else g3:=IntToStr(-c);
    
       if d=0 then e4:=' ' else e4:='x'+#179;
       if a=0 then e1:=' ' else e1:='x'+#178;
       if b=0 then e2:=' ' else e2:='x';
    
       S4:=t4+g4+e4;
       S1:=t1+g1+e1;
       S2:=t2+g2+e2;
       S3:=t3+g3;
    
       Uit_fx.Text:='y='+S4+S1+S2+S3;
    
       if d<=1 then t4:='-';
       if d=0 then t4:=' ';
       if d>0 then t4:=' ';
    
       if a<=1 then t1:='-';
       if a=0 then t1:=' ';
       if a>0 then t1:='+';
    
       if b<=1 then t2:='-';
       if b=0 then t2:=' ';
       if b>0 then t2:='+';
    
       if ((d>-1) and (d<1)) then g4:=' ' else
         if d>=1 then g4:=IntToStr(3*d)else g4:=IntToStr(-3*d);
       if ((a>-1) and (a<1)) then g1:=' ' else
         if a>=1 then g1:=IntToStr(2*a)else g1:=IntToStr(-2*a);
       if ((b>-1) and (b<1)) then g2:=' ' else
         if b>=1 then g2:=IntToStr(b)else g2:=IntToStr(-b);
    
       if d=0 then e4:=' ' else e4:='x'+#178;
       if a=0 then e1:=' ' else e1:='x';
    
       S4:=t4+g4+e4;
       S1:=t1+g1+e1;
       S2:=t2+g2;
    
       Uit_gx.Text:='y='+S4+S1+S2;
    end;
    
    procedure TForm1.KnopTekenFClick(Sender: TObject);
    begin
      doorgaan:=false; plotten('f');
    end;
    
    procedure TForm1.KnopTekenGClick(Sender: TObject);
    begin
      doorgaan:=false; plotten('g');
    end;
    
    procedure TForm1.KnopWissenClick(Sender: TObject);
    begin
      wissen; stoppen:=true; doorgaan:=false;
    end;
    
    procedure TForm1.KnopResetClick(Sender: TObject);
    begin
      d:=0; Uit_d.Text:=IntToStr(d);
      a:=0; Uit_a.Text:=IntToStr(a);
      b:=0; Uit_b.Text:=IntToStr(b);
      c:=0; Uit_c.Text:=IntToStr(c);
      gereset:=true;
      doorgaan:=false;
      ToonFunctievoorschrift;
    end;
    
    procedure TForm1.KnopNulpuntenParaboolABCformuleClick(Sender: TObject);
    var Dis,x1,x2 : real;
    begin
       doorgaan:=false;
       if a<>0 then Dis:=((b*b)-(4*a*c));
       if ((Dis>=0) and (a<>0) and (d=0)) then
         begin
          x1:=(-b-sqrt(Dis))/(2*a);
          x2:=(-b+sqrt(Dis))/(2*a);
          Uit_NE.Text:=
           FloatToStrF(x1,ffFixed,1,2)+' '+
           FloatToStrF(x2,ffFixed,1,2);
         end;
      if D<0 then Uit_NE.Text:=
              'Er zijn geen nulpunten';
      if a=0 then  Uit_NE.Text:=
              'Deze methode is alleen mogelijk als a<>0';
      if d<>0 then  Uit_NE.Text:=
              'Deze methode is alleen mogelijk als d=0';
    end;
    
    procedure TForm1.KnopExtremeWaardeParaboolABCformuleClick(Sender: TObject);
    var x1,x2 : real;
    begin
      doorgaan:=false;
      if ((a<>0) and (d=0)) then
        begin
         ymax:=f(-b/(2*a));
        Uit_EE.Text:=
         FloatToStrF(-b/(2*a),ffFixed,1,2)+'  '+
         FloatToStrF(ymax,ffFixed,1,2);
        end else
      if a=0 then
        Uit_EE.Text:=
          'Deze methode is alleen mogelijk als a<>0';
      if d<>0 then
        Uit_EE.Text:=
          'Deze methode is alleen mogelijk als d=0';
    end;
    
    procedure TForm1.KnopNulpuntenNumeriekClick(Sender: TObject);
    const                                      max=100;
    type          NulpuntenGeheugen = array[1..max] of real;
    var N       : NulpuntenGeheugen;
        m,x,y,dx: real;
        i,s     : integer;
        Ns      : string;
        kleur   : TColor;
    begin
     wissen; doorgaan:=false; for i:=1 to max do N[i]:=0;
     i:=1; dx:=0.01; m:=5*dx; x:=dmin; s:=0; Ns:=' '; kleur:=clBlue;
     while x<=dmax do
      begin
        y:=f(x);
        plaatspixel(x,y,kleur);
        sleep(s);
        if ((y>-m) and (y<m)) then
          begin
           N[i]:=x; inc(i); Ns:=Ns+FloatToStrF(x,ffFixed,1,2)+' ';
           Uit_NN1.text:=' ... zoeken ... '+
            FloatToStrF(x,ffFixed,1,2)+' '+
            FloatToStrF(y,ffFixed,1,2);
           s:=500;
          end;
        if not ((y>-m) and (y<m)) then s:=0;
        x:=x+dx;
      end;
      Uit_NN2.text:=' '+IntToStr(i-1);
      Uit_NN1.text:=Ns;
      plotten('f');
    end;
    
    procedure TForm1.KnopRaaklijnenExactClick(Sender: TObject);
    const dxx=0.1;
    var   xx: real;
    begin
      xx:=dmin;
      while xx<=dmax do
       begin
        aa:=g(xx); bb:=f(xx)-(xx*g(xx));
        plotten('r');
        xx:=xx+dxx;
       end;
    end;
    
    procedure TForm1.KnopFunctiegeneratorClick(Sender: TObject);
    const max=5;
    begin
     while doorgaan do
      begin
       Randomize;
       d:=Random(max)-(max div 2);
       a:=Random(max)-(max div 2);
       b:=Random(max)-(max div 2);
       c:=Random(max)-(max div 2);
       Uit_a.text:=IntToStr(a); Uit_b.text:=IntToStr(b);
       Uit_c.text:=IntToStr(c); Uit_d.text:=IntToStr(d);
       plotten('f'); plotten('g');
       sleep(350); wissen;
      end;
    end;
    
    procedure TForm1.KnopStopGenererenClick(Sender: TObject);
    begin
      doorgaan:=not doorgaan;
    end;
    
    procedure TForm1.TekenAssenstelsel;
    var i : integer;
    begin
      for i:=1 to pix do Canvas.Pixels[x0-(pix div 2)+i,y0]:=KleurAssen;;
      for i:=1 to pix do Canvas.Pixels[x0-(pix div 2)+i,y0+pix div 2]:=KleurRectangle;
      for i:=1 to pix do Canvas.Pixels[x0-(pix div 2)+i,y0-pix div 2]:=KleurRectangle;
      for i:=1 to pix do Canvas.Pixels[x0,y0-(pix div 2)+i]:=KleurAssen;
      for i:=1 to pix do Canvas.Pixels[x0- pix div 2,y0-(pix div 2)+i]:=KleurRectangle;
      for i:=1 to pix do Canvas.Pixels[x0+ pix div 2,y0-(pix div 2)+i]:=KleurRectangle;
      Canvas.TextOut(pix,(pix div 2)-5,'x'); Canvas.TextOut(m+(pix div 2)+5,m+1,'y');
    end;
    
    procedure TForm1.wissen;
    begin
      Canvas.Rectangle(m,m,m+pix+1,m+pix+1);
      Canvas.Refresh; TekenAssenstelsel;
    end;
    
    procedure Tform1.plaatspixel(x,y: real; kleur: TColor);
    var   p,q : integer; Sx, Sy : real;
    begin
      application.processmessages;
      Sx:=pix div (dmax-dmin); Sy:=(pix div 2) div dmax;
      if x<(dmin+2*interval) then TekenAssenstelsel;
      p:=x0+ROUND(x*Sx);
      q:=y0-ROUND(y*Sy);
      if ((p>m) and (p<m+pix) and (q>m) and (q<m+pix)) then
       Canvas.Pixels[p,q]:=kleur;
    end;
    
    procedure TForm1.plotten(k:char);
    var kleur: TColor;
    begin
      x:=dmin;
      While ((x<=dmax) and (not stoppen)) do
        begin
         if k='f' then begin y:=f(x); kleur:=clPurple; end;
         if k='g' then begin y:=g(x); kleur:=clRed;    end;
         if k='r' then begin y:=r(x); kleur:=clGreen;  end;
         x:=x+interval;
         plaatspixel(x,y,kleur);
        end;
        stoppen:=false; ToonFunctievoorschrift;
    end;
    
    procedure TForm1.KnopExtremeWaardenClick(Sender: TObject);
    var dis,aa,bb,cc,x1,x2,y1,y2: real;
    begin
       doorgaan:=false;
    
       if d<>0 then
        begin
          aa:=3*d; bb:=2*a; cc:=b;
          if aa<>0 then dis:=((bb*bb)-(4*aa*cc));
          if ((dis>=0) and (a<>0)) then
           begin
            x1:=(-bb-sqrt(dis))/(2*aa); y1:=f(x1);
            x2:=(-bb+sqrt(dis))/(2*aa); y2:=f(x2);
           end;
          if dis >=0 then
           Uit_EW.Text:=FloatToStrF(x1,ffFixed,1,2)+' '+
                        FloatToStrF(y1,ffFixed,1,2)+'   '+
                        FloatToStrF(x2,ffFixed,1,2)+' '+
                        FloatToStrF(y2,ffFixed,1,2);
           if dis<0 then Uit_EW.Text:='... er is/zijn geen extreme waarde(n)';
        end;
    
       if ((d=0) and (a<>0)) then
        begin
         aa:=a; bb:=b; 
         x1:=-bb/(2*aa); y1:=f(x1);
         Uit_EW.Text:=FloatToStrF(x1,ffFixed,1,2)+' '+
                      FloatToStrF(y1,ffFixed,1,2);
        end;
    end;
    
    procedure TForm1.ScrollBardScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    begin
      doorgaan:=false; if gereset then ScrollPos:=d;
      d:=ScrollPos; Uit_d.Text:=IntToStr(d);
      gereset:=false; ToonFunctievoorschrift;
    end;
    
    procedure TForm1.ScrollBaraScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    begin
      doorgaan:=false; if gereset then ScrollPos:=a;
      a:=ScrollPos; Uit_a.Text:=IntToStr(a); plotten('f');
      gereset:=false; ToonFunctievoorschrift;
    end;
    
    procedure TForm1.ScrollBarbScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    begin
      doorgaan:=false; if gereset then ScrollPos:=b;
      b:=ScrollPos; Uit_b.Text:=IntToStr(b);
      gereset:=false; ToonFunctievoorschrift;
    end;
    
    procedure TForm1.ScrollBarcScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    begin
      doorgaan:=false; if gereset then ScrollPos:=c;
      c:=ScrollPos; Uit_c.Text:=IntToStr(c);
      gereset:=false; ToonFunctievoorschrift;
    end;
    
    procedure TForm1.FormActivate(Sender: TObject);
    begin
     application.processmessages;
     stoppen:=false; gereset:=false;
     doorgaan:=true;
     d:=0; Uit_d.Text:=IntToStr(d);
     a:=0; Uit_a.Text:=IntToStr(a);
     b:=0; Uit_b.Text:=IntToStr(b);
     c:=0; Uit_c.Text:=IntToStr(c);
     ToonFunctievoorschrift;
     wissen;
    end;
    
    end.

  10. #10
    Kennelijk word het scroll-event afgevuurd zodra je met de muis over de scrollbar hoovert?

    Daarnaast zou je eventueel in je plotten functie af en toe een Application.ProcessMessages kunen opnemen, zodat je GUI ge-update wordt.

    Verder niet echt een antwoord op je vraag, maar waarom gebruik je geen Trackbar i.p.v een ScrollBar (of een (Float)SpinEdit). Qua GUI design vind ik dat wat meer intuitief.

    Bart

  11. #11
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Het is voor ons wat makkelijker debuggen als je ook de dfm of gewoon het hele project even upload. Enfin, ik heb - omdat ik zo'n aardige jongen ben - jouw componenten even gemimmickt en moet zeggen dat dat wonderwel werkt.

    Het probleem is dat de routine plotten te veel tijd vraagt waardoor de windowmessages die de ScrollBar te verhandelen krijgt niet meer worden afgerond voordat de volgende arriveert. Daardoor lijkt het alsof er problemen optreden wanneer je slechts over de scrollbar hovert, maar in feite komt dat omdat de scrollbar/windows denkt dat de linker muisknop nog is ingedrukt. Dit is heel eenvoudig te testen door de volgende regel aan het begin van de OnScroll-eventhandler toe te voegen:
    Delphi Code:
    1. SendMessage(ScrollBara.Handle, WM_CANCELMODE, 0, 0);
    Application.ProcessMessages biedt ook vaak uitkomst, zoals Bart_B aanhaalt, maar in dit geval heb je daarbij het probleem zoals uitvoerig in dit topic wordt beschreven (in het kort: je creëert messageloops within messageloops).

    Hoewel CancelMode het probleem oplost, werkt de ScrollBar dan niet meer zoals hij hoort te werken. Dé oplossing voor jou kan zijn (één of meerdere van onderstaande):
    - beter gebruik maken van de variabele Stoppen die je nu al hebt,
    - een variabele IsPlotting aanmaken waarop je test of er al geplot wordt. Zo ja, dan het nieuwe plotten uitstellen (niets doen), of het huidige plotten annuleren (d.m.v. de variabele Stoppen),
    - een timer toevoegen om na een bepaalde tijd te checken of er opnieuw geplot moet worden.

    De meest vloeiende en intuitieve oplossing zou volgens mij zijn om de huidige plotopdracht te annuleren, er is immers een nieuw plotverzoek.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  12. #12
    Zeer bedankt voor jullie reacties!

    Kennelijk word het scroll-event afgevuurd zodra je met de muis over de scrollbar hoovert?

    Daarnaast zou je eventueel in je plotten functie af en toe een Application.ProcessMessages kunen opnemen, zodat je GUI ge-update wordt.

    Verder niet echt een antwoord op je vraag, maar waarom gebruik je geen Trackbar i.p.v een ScrollBar (of een (Float)SpinEdit). Qua GUI design vind ik dat wat meer intuitief.

    Bart
    .. ik weet niet eens wat een trackbar en/of SpinEdit is en dus ook niet wat het verschil is met een scrollbar. Die staan niet in de sectie standard en in additional zie ik ze ook niet. Maar ik zoek verder :-)

    Het is voor ons wat makkelijker debuggen als je ook de dfm of gewoon het hele project even upload. Enfin, ik heb - omdat ik zo'n aardige jongen ben - jouw componenten even gemimmickt en moet zeggen dat dat wonderwel werkt.

    Het probleem is dat de routine plotten te veel tijd vraagt waardoor de windowmessages die de ScrollBar te verhandelen krijgt niet meer worden afgerond voordat de volgende arriveert. Daardoor lijkt het alsof er problemen optreden wanneer je slechts over de scrollbar hovert, maar in feite komt dat omdat de scrollbar/windows denkt dat de linker muisknop nog is ingedrukt. Dit is heel eenvoudig te testen door de volgende regel aan het begin van de OnScroll-eventhandler toe te voegen:

    Delphi Code:
    SendMessage(ScrollBara.Handle, WM_CANCELMODE, 0, 0);
    Application.ProcessMessages biedt ook vaak uitkomst, zoals Bart_B aanhaalt, maar in dit geval heb je daarbij het probleem zoals uitvoerig in dit topic wordt beschreven (in het kort: je creëert messageloops within messageloops).

    Hoewel CancelMode het probleem oplost, werkt de ScrollBar dan niet meer zoals hij hoort te werken. Dé oplossing voor jou kan zijn (één of meerdere van onderstaande):
    - beter gebruik maken van de variabele Stoppen die je nu al hebt,
    - een variabele IsPlotting aanmaken waarop je test of er al geplot wordt. Zo ja, dan het nieuwe plotten uitstellen (niets doen), of het huidige plotten annuleren (d.m.v. de variabele Stoppen),
    - een timer toevoegen om na een bepaalde tijd te checken of er opnieuw geplot moet worden.

    De meest vloeiende en intuitieve oplossing zou volgens mij zijn om de huidige plotopdracht te annuleren, er is immers een nieuw plotverzoek.
    Gisteren 23:34
    Dank je. Ik ga het proberen. Maar ik wil eerst nog een procedure schrijven om het oppervlak ingesloten tussen x as en parabool te vullen. Dit om het oppervlak aanschouwelijk te maken dat te berekenen is met de primitieve van f(x). Nog bedankt voor je moeite Ik stuur het hele project mee. Misschien dat je er dan nog eens naar wilt kijken. Ben zeer benieuwd naar je/jullie mening
    Attached Files Attached Files

  13. #13
    .. hiermee vervalt de vorige zip ..
    Attached Files Attached Files

  14. #14
    Nice.

    Alleen als ik op grafiek wissen klik, dan moet ik daarna 2 x klikken op plot grafiek om een plot te krijgen.
    Ook is het wel handig de scrollbars te resetten als je op de reset knop klikt.
    En ik ben de grafiek op het scherm kwijt als de grafiek door een ander venster tijdelijk werd afgedekt....
    (e.e.a getest onder Lazarus/Linux)

    Daarnaast zou ik geneigd zijn om de variabelen a,b,c,d, stoppen, gereset etc private variabelen te maken van het form.
    En ik zou overwegen om a,b,c,d andere namen te geven, bijv. FactorMacht3, FactorMacht2, FactorMacht1, Constante, dat leest later makkelijke als jij (of een ander) de code weer doorspit.

    Nu nog een Eval functie zodat je de gebruiker een willekeurige formule (bijv.: y= (ln(x) + pi*x!) * arctan(x) ) kunt laten inkloppen en dan is het helemaal af .

    Bart

  15. #15
    .. ha mooi. Leuk dat je het leuk vindt Je noemt allerlei dingen waar ik vrij enthousiast van word, vooral dat zelf een functievoorschrift opgeven. Ik had/heb geen flauw idee hoe dat moet. Maar met jouw opmerkingen kom ik verder. .. dat klopt, dat twee keer klikken om te wissen. Daar erger ik me ook aan. Daar moet ik nog naar kijken. En die namen, ja .. maar ik denk dat iemand die een beetje wiskundig onderlegd is het wel herkent. f is een functie en dat is op zich heel duidelijk. Dan kun je de wiskundige notatie gewoon aanhouden. Heb je misschien enig idee hoe je een vierde macht als een klein superscript zou kunnen weergeven? En 1/4? Ik heb de tweede en derde macht uit de ascii tabel. Bedankt dat je er naar hebt gekeken. Ik voeg hierbij de laatste versie nog bij.
    Attached Files Attached Files

Page 1 of 4 1 2 3 ... LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •