Delphi 2006 Professional
|
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 = 'Geradenfunktion' then
begin
//...
end
else if Combobox1.Text = 'Potenzfunktion' then
begin
//...
end
else if Combobox1.Text = 'Wurzelfunktion' then
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='Geradenfunktion' then 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='Potenzfunktion' then 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='Wurzelfunktion' then 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 = 'Geradenfunktion' then
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 = 'Potenzfunktion' then
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 = 'Wurzelfunktion' then
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
|