Announcement

Collapse
No announcement yet.

Funktionsgraphen von einfachen ganzrationalen Funktionen zeichnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Funktionsgraphen von einfachen ganzrationalen Funktionen zeichnen

    Hallo,
    das ist das erste delphi forum dass ich besuche und da ich Anfänger ich hoffe dass ich mit meiner banalen Frage hier richtig bin .
    Es geht wie der Titel schon sagt darum dass ich in einer PaintBox ein Koordinatensystem und darin Funktionsgraphen auf basis von vom benutzer eingestellten parametern zeichnen will.
    Da ich aufgrund des problems keine weiteren funktionen als die 2. grades in die auswahl mit reingenommen habe,geht es nur um eben diese.
    nachdem ich die x-,y-Achse und die Einteilung gemacht habe ,habe ich mich daran gemacht den graph mit hilfe von jedem pixel einzeln zu zeichnen.
    das funktioniert soweit auch ganz gut ,nur dass die graphen nur bis zu einem bestimmten Punkt im Koordinatensystem gezeichnet werden udn dann abbrechen,als ob eine unsichtbare barriere delphi daran hindern würde weiter zu zeichnen,egal wie oft ich delphi die schleife ,in der die anweisung zum zeichnen steht , durchlaufen lasse. hier der code: for k := -200 to 200 do
    begin

    x := 200 + k;
    y := (((Power(k / Abschnitt,2)) * Grad2) + ((k / Abschnitt) * Grad1) + Grad0) * Abschnitt;
    Pixels[200 + k,round(200 - y)] := clGreen;
    TextOut(100,100,IntToStr(200 +k));
    TextOut(140,100,IntToStr(round(200 - y)));
    sleep(100);



    falls es von relevanz ist hier der rest des programms :

    procedure TForm1.Button1Click(Sender: TObject);
    var
    i : Integer;
    z : Integer;
    begin
    with PaintBox1.Canvas do
    begin
    // y-Achse zeichnen :
    MoveTo(200,0);
    LineTo(200,400);
    // x-Achse zeichnen :
    MoveTo(0,200);
    LineTo(400,200);
    // y-Achse einteilen :
    for i := 0 to 20 do
    begin
    MoveTo(200,i* Abschnitt);
    LineTo(190,i* Abschnitt);
    if i <> 10 then
    TextOut(185,i*Abschnitt,IntToStr(400 div Abschnitt div 2 - i));
    end;
    // x-Achse einteilen :
    for z := 0 to 20 do
    begin
    MoveTo(z * Abschnitt,200);
    LineTo(z * Abschnitt,210);
    if z <> 10 then
    TextOut(z* Abschnitt,215,IntToStr(z - 400 div Abschnitt div 2));
    end;
    end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    //var
    //recta : TRect;
    begin
    Abschnitt := 50;
    //with PaintBox1.Canvas do
    //begin
    //recta := Rect(0,0,400,400);
    //brush.color := clwhite;
    //FillRect(recta);
    //end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    k : Integer;
    begin
    with PaintBox1.Canvas do
    begin
    try
    Grad2 := StrToFloat(Edit1.Text) ;
    except
    Grad2 := 0;
    end;
    try
    Grad1 := StrToFloat(Edit2.Text);
    except
    Grad2 := 0;
    end;
    try
    Grad0 := StrToFloat(Edit3.Text);
    except
    Grad0 := 0;
    end;

  • #2
    Ein Grundsatz bei der Windowprogrammierung ist:

    Jedes Fenster muss sich zu jeder Zeit selbst neu zeichnen können.
    Für Windows ist jedes Objekt (ob Button, Label, Listbox) ein Fenster. Es wird nur anders dargestellt. Für diese Objekte kann Windows selbst nach o.a Regel verfahren, da es das Aussehen und den Inhalt kennt.
    Für Objekte wie die Paintbox allerdings trifft das nicht zu.
    Hier kennt nur der Programmierer die Inhalte und weiss wann diese wie angezeigt werden sollen.
    Die Folge davon ist, das Zeichnen in dem OnPaint Ereignis auszuführen. Dieses Ereignis versendet Windoes, wenn es der Meinung ist, dass das Objekt neu dargestellt werden muss.

    Ein typisches Verhalte bei nicht Beachtung dieser Regel ist, dass Inhalte verschwinden, wenn das Fenster verdeckt wird und wieder sichbar wird oder der Inhalt bei Größenänderungen verschwindet.

    Insofern wäre dein Programm erstmal dahingehend umzustellen
    Christian

    Comment


    • #3
      Hallo Christian,
      Danke für deine schnelle Antwort!
      Leider ist es so,dass das Problem bei mir nicht nur auftritt wenn ich irgendetwas an der paintbox mache(also sie z.b verdecke,maximiere oder ähnliches) ,sondern ständig anwesend ist.
      Ich habe das Programm jetzt so umgeschrieben dass das zeichnen in der PaintBoxPaint prozedur stattfindet die durch den buttonclick aufgerufen wird,das problem besteht aber leider weiterhin

      Comment


      • #4
        Die Folge davon ist, das Zeichnen in dem OnPaint Ereignis auszuführen.
        Da sollte das erfolgen!
        Christian

        Comment


        • #5
          also ich hab jetzt im objectinspektor dem onpaint ereignis die paintbox1paint prozedur zugewiesen,war das so in der art gemeint?

          Comment


          • #6
            in dieser erfolgt das Zeichnen
            Christian

            Comment


            • #7
              sry für die dummen fragen,bin aber wie gesagt noch anfänger.
              aber nach meinem wissensstand kann ein ereignis nur eine prozedur/funktion auslösen und nicht selbst wie eine aufgebaut sein oder?

              Comment


              • #8
                Ich verstehe dein Problem nicht:

                Mache im Objectinspektor ein Doppelklick auf das OnPaintereignis der Paintbox, programmiere dein Code da rein

                Gehe jetzt in die Heia
                Christian

                Comment

                Working...
                X