Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Ein Graphenzeichner

  Alt 29. Dez 2004, 03:36
Wie man so was auch wunderbar objektorientiert lösen kann, kannst du dir mal an meinem Schiefen Wurf angucken.

Desweiteren finde ich das mit den zwei Fenstern etwas unhandlich. Und warum kann man das Fenster mit dem Grafen nicht maximieren? Eie Zoomfunktion wäre auch nicht schlecht.

In den Code habe ich nur kurz reingeguckt aber das:
Delphi-Quellcode:
    if Combobox1.text = 'Geradenfunktionthen
    begin
      //...
    end
    else if Combobox1.Text = 'Potenzfunktionthen
    begin
      //...
    end
    else if Combobox1.Text = 'Wurzelfunktionthen
    begin
      //...
    end;
Läßt sich mit einer case-Anweisung eleganter lösen:
Delphi-Quellcode:
case ComboBox1.ItemIndex of
  0:;
  1:;
  2:;
end;
Und mir ist noch aufgefallen, dass der Code sehr stark an die GUI gebunden ist. Willst du jetzt eine andere Oberfläche aufsetzten, bedeutet das ziemlich viel Arbeit. Trenne Code von der GUI besser und du hast es einfacher bei Änderungen. Dann bietet sich auch gleich an das ganze OOP gerecht zu machen.
Ich habe bei meinem Programm eine extra Klasse nur für das Koordinatensystem. Da könnte ich einen beliebeigen Grafen drauf zeichen, ohne den Code für das Koordinatensystem zu ändern, anzupassen oder gar neu schreiben zu müssen.

Wenn ich das Fenster mit dem Grafen minimier und wieder maximiere, ist er weg. Wie man auch das Problem löst, kannst du dir auch an meinem Programm angucken.

Wäre auch schön, wenn man nicht noch mal den Grafen zeichnen müsste, wenn man den Maßstab ändert.

Und du solltest den Quellcode besser formatieren. Das:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var c,d,i,n,y:Integer;
    a,b,m:real;
    einheity,einheitx:integer;
begin
einheity:=strtoint(Combobox2.Text);
einheitx:=strtoint(Combobox3.Text);
with Form1.Canvas do begin

if Combobox1.text='Geradenfunktionthen begin
m:=strtofloat(Edit1.Text);
n:=strtoint(Edit3.Text);
moveto(400,300-n);
for i:=0 to 401 do begin
y:=geraden(m,i, einheitx,einheity,n);
lineto(400+i, 300-y);
moveto(400+i, 300-y);
end;
moveto(400,300-n);
for i:=0 to 401 do begin
y:=geraden(m,i, einheitx,einheity,n);
lineto(400-i, 300-(2*n*einheity)+y);
moveto(400-i, 300-(2*n*einheity)+y);
end;

end else if Combobox1.Text='Potenzfunktionthen begin
a:=strtofloat(Edit8.text);
b:=strtofloat(Edit10.text);
d:=strtoint(Edit11.Text);
c:=strtoint(Edit12.Text);
moveto(400,300-d);
for i:=0 to 401 do begin
y:=Potenz(a,b, einheitx,einheity,i,d,c);
lineto(400+i, 300-y);
moveto(400+i, 300-y);
end;
moveto(400,300);
for i:=0 to 401 do begin
y:=Potenz(a,b, einheitx,einheity,-1*i,d,c);
lineto(400-i, 300-y);
moveto(400-i, 300-y);
end;

end else if Combobox1.Text='Wurzelfunktionthen begin
a:=strtofloat(Edit4.text);
b:=strtofloat(Edit6.text);
c:=strtoint(Edit7.Text);
moveto(400+(round(b)*einheitx),300-(c*einheity));
for i:=1 to 401 do begin
if (i div einheitx)>=b then begin
y:=Wurzel(a,i,b,einheitx,einheity,c);
lineto(400+i, 300-y);
moveto(400+i, 300-y);
end;
end;
end;

end;

end;
ist so gut wie nicht wartbar. Wenn du da einen Fehler suchst oder wenn du da was erweitern willst, wünsche ich viel Spass. Das hingegen:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  c, d, i, n, y: Integer;
  a, b, m : real;
  einheity, einheitx: integer;
begin
  einheity := strtoint(Combobox2.Text);
  einheitx := strtoint(Combobox3.Text);
  with Form1.Canvas do
  begin

    if Combobox1.text = 'Geradenfunktionthen
    begin
      m := strtofloat(Edit1.Text);
      n := strtoint(Edit3.Text);
      moveto(400, 300 - n);
      for i := 0 to 401 do
      begin
        y := geraden(m, i, einheitx, einheity, n);
        lineto(400 + i, 300 - y);
        moveto(400 + i, 300 - y);
      end;
      moveto(400, 300 - n);
      for i := 0 to 401 do
      begin
        y := geraden(m, i, einheitx, einheity, n);
        lineto(400 - i, 300 - (2 * n * einheity) + y);
        moveto(400 - i, 300 - (2 * n * einheity) + y);
      end;

    end
    else if Combobox1.Text = 'Potenzfunktionthen
    begin
      a := strtofloat(Edit8.text);
      b := strtofloat(Edit10.text);
      d := strtoint(Edit11.Text);
      c := strtoint(Edit12.Text);
      moveto(400, 300 - d);
      for i := 0 to 401 do
      begin
        y := Potenz(a, b, einheitx, einheity, i, d, c);
        lineto(400 + i, 300 - y);
        moveto(400 + i, 300 - y);
      end;
      moveto(400, 300);
      for i := 0 to 401 do
      begin
        y := Potenz(a, b, einheitx, einheity, -1 * i, d, c);
        lineto(400 - i, 300 - y);
        moveto(400 - i, 300 - y);
      end;

    end
    else if Combobox1.Text = 'Wurzelfunktionthen
    begin
      a := strtofloat(Edit4.text);
      b := strtofloat(Edit6.text);
      c := strtoint(Edit7.Text);
      moveto(400 + (round(b) * einheitx), 300 - (c * einheity));
      for i := 1 to 401 do
      begin
        if (i div einheitx) >= b then
        begin
          y := Wurzel(a, i, b, einheitx, einheity, c);
          lineto(400 + i, 300 - y);
          moveto(400 + i, 300 - y);
        end;
      end;
    end;
  end;
end;
kann man lesen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat