Autor |
Beitrag |
acillus
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 09.07.07 17:31
Hallo Leute,
ich habe bis vor kurzem noch nie mit Delphi gearbeitet, allerdings schon Grundkenntnisse mit Turbo Pascal gesammelt.
Die Aufgabenstellung lautete wie folgt: Programmiere ein programm zum Zeichnen von Objekten (Dreiecke, Rechtecke, Kreise), welche man verschieben kann und verschiedene Größen, Farben und Ausgangpunkte haben. Zudem sollen alle Objekte einzeln löschbar sein.
Das habe ich auch quasi so gelöst, allerdings nur mit records. Die Aufgabenstellung lautet aber, es objektorientiert zu machen (get & set ect). Wie schreibe ich das nun am sinnvollsten um? Im Anhang ist das Projekt und hier Quellcodeauszüge:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127:
| type ...
... private procedure pFarbe; procedure pClear; procedure pNeuZeichnen(WertA, WertB : integer; Neu : boolean); procedure Zeichnen(Typ : String); function pKante : integer;
type TPunkte = record irStartA : integer; irStartB : integer; srTyp : String; irKante : integer; srFarbe : String; end; var iiIndex : integer; iiAktIndex : integer; ibNeu, ibNeuFarbe : boolean; isFarbe : String; Punkte : Array[1..20] of TPunkte; public
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Zeichnen(Typ : String); var iKante, iStartA, iStartB : integer; begin ibNeu := true; iKante := pKante() * 3; pFarbe();
randomize; iStartA := random(300) + 226; iStartB := random(300) + 21;
iiIndex := iiIndex + 1; Punkte[iiIndex].irStartA := iStartA; Punkte[iiIndex].irStartB := iStartB; Punkte[iiIndex].irKante := iKante; Punkte[iiIndex].srFarbe := isFarbe; lb_objekte.items.add(inttostr(iiIndex));
if Typ = 'Rechteck' then begin Punkte[iiIndex].srTyp := 'Rechteck'; end else if Typ = 'Kreis' then begin Punkte[iiIndex].srTyp := 'Kreis'; end else begin Punkte[iiIndex].srTyp := 'Dreieck'; end; pNeuZeichnen(0,0, true); end;
procedure TForm1.pNeuZeichnen(WertA, WertB : integer; Neu : boolean); var iAktIndex, iStartA, iStartB, iNr, iKante : integer; iAlterWertA, iAlterWertB : integer; sTyp : String; fTest : real; A,B,C : TPoint; begin if Neu = false then begin ibNeu := false; iAktIndex := strtoint(Form1.lb_objekte.Items.strings[Form1.lb_objekte.ItemIndex]);
iAlterWertA := Punkte[iAktIndex].irStartA; iAlterWertB := Punkte[iAktIndex].irStartB;
if iAlterWertA + WertA >= 225 then begin if iAlterWertB + WertB >= 20 then begin Punkte[iAktIndex].irStartA := iAlterWertA + WertA; Punkte[iAktIndex].irStartB := iAlterWertB + WertB; end; end; pClear(); end;
for iNr := 1 to lb_objekte.Count do begin iStartA := Punkte[iNr].irStartA; iStartB := Punkte[iNr].irStartB; iKante := Punkte[iNr].irKante; isFarbe := Punkte[iNr].srFarbe; sTyp := Punkte[iNr].srTyp;
ibNeuFarbe := true; pFarbe(); ibNeuFarbe := false;
if sTyp = 'Rechteck' then begin canvas.Rectangle(iStartA, iStartB, iStartA + iKante, iStartB + iKante); end else if sTyp = 'Kreis' then begin canvas.ellipse(iStartA, iStartB, iStartA + iKante, iStartB + iKante); end else begin fTest := round((sqrt(3) / 2) * iKante); A := Point(iStartA, iStartB); B := Point(iStartA + iKante, iStartB); C := Point(iStartA + round(iKante / 2), iStartB - round(fTest)); canvas.polygon([A,B,C]); end; end; ibNeu := true; end; |
Einloggen, um Attachments anzusehen!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 09.07.07 18:03
Moin und  im Forum!
acillus hat folgendes geschrieben: | nur mit records. Die Aufgabenstellung lautet aber, es objektorientiert zu machen (get & set ect). Wie schreibe ich das nun am sinnvollsten um? |
Also  ehrlich gesagt, sowas schreibt man am besten nicht um, sondern OOP-konform neu.  Die Denke ist bei OOP eigentlich komplett anders, das kann nur nach Hinten losgehen, das andersrum zu machen.  (meine bescheidene Meinung)
Schau doch mal nach ein paar OOP-Tutorials hier, war nicht in Christian S. Crashkurs auch was zu OOP drin?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
acillus 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 09.07.07 23:39
so, habe mal aufgrund des tutorials neu angefangen...
bisher habe ich:
5 Units (dreieck,kreis,rechteck,geoForm und die mainunit)
3 buttons (kreis, dreieck & rechteck erstellen)
aber ich raffe nicht, wie ich ein bestimmtes objekt anspreche, nachdem ich es created habe. Beispiel:
Ich erstelle 3 rechtecke. nun möchte ich das zu erst erstellte rechteck um 5 pixel nach rechts verschieben.
wie gehe ich da vor und vor allem, wie greife ich auf das objekt zu?
mainunit:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99:
| unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, geomForm, StdCtrls, rechteck, kreis, dreieck;
type TForm1 = class(TForm) bt_rechteck: TButton; bt_kreis: TButton; bt_dreieck: TButton; procedure FormCreate(Sender: TObject); procedure bt_rechteckClick(Sender: TObject); procedure bt_kreisClick(Sender: TObject); procedure bt_dreieckClick(Sender: TObject); private procedure Zeichnen(Typ : String); public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bt_dreieckClick(Sender: TObject); begin Zeichnen('Dreieck'); end;
procedure TForm1.bt_kreisClick(Sender: TObject); begin Zeichnen('Kreis'); end;
procedure TForm1.bt_rechteckClick(Sender: TObject); begin Zeichnen('Rechteck'); end;
procedure TForm1.FormCreate(Sender: TObject); var geomForm : TgeomForm; begin geomForm := TgeomForm.Create; geomForm.Free; end;
procedure TForm1.Zeichnen(Typ : String); var kante, startA, startB, hoehe, breite, radius, zufall : integer; sFarbe : String; fTemp : real; A,B,C : TPoint; rechteck : TRechteck; kreis : TKreis; dreieck : TDreieck;
begin randomize; kante := random(100) + 10; radius := random(100) + 10; hoehe := random(100) + 10; breite := random(100) + 10;
randomize; startA := random(300) + 10; startB := random(300) + 10;
randomize; zufall := random(5)+1; case zufall of 1: sFarbe := 'Rot'; 2: sFarbe := 'Gelb'; 3: sFarbe := 'Grün'; 4: sFarbe := 'Schwarz'; 5: sFarbe := 'Blau'; end;
if Typ = 'Rechteck' then begin rechteck := TRechteck.create(hoehe, breite, startA, startB, sFarbe); end else if Typ = 'Kreis' then begin kreis := TKreis.create(radius, startA, startB, sFarbe); end else begin dreieck := TDreieck.create(kante, startA, startB, sFarbe); end; end;
end. |
geomForm:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| unit geomForm;
interface type TgeomForm = class private Fx : Integer; Fy : Integer; public procedure verschieben(dx, dy : Integer); end;
implementation
procedure TgeomForm.verschieben(dx, dy: Integer); begin self.Fx := self.Fx + dx; self.Fy := self.Fy + dy; end;
end. |
und beispiel an rechteckunit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| unit rechteck;
interface
uses geomForm;
type TRechteck = class(TgeomForm) private Fhoehe : Integer; Fbreite : Integer; FStartA, FStartB : Integer; FFarbe : String; public constructor create(hoehe, breite, startA, startB : Integer; farbe : String); end; implementation
constructor TRechteck.create(hoehe, breite, startA, startB : Integer; farbe : String); begin inherited create;
FHoehe := hoehe; FBreite := breite; FStartA := startA; FStartB := startB; FFarbe := farbe; end;
end. |
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Di 10.07.07 00:17
Meiner Meinung nach sollte sich ein Objekt selbst zeichnen können. Dazu müsste das Objekt wissen, wo es gezeichnet werden soll (auf welcher Canvas).
Das Ansprechen eines solchen Objektes könnte dann etwa so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var Rechteck : TRechteck; begin Rechteck:=TRechteck.Create(...); with Rechteck do begin SetCanvas(MeineCanvas); Zeichne; Verschiebe(...); Free; end; end; |
ub60
|
|
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Di 10.07.07 00:23
|
|
acillus 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 10.07.07 14:35
erstmal Danke für den Link, bin nun auch weiter gekommen.
Habe auch nicht in units ausgelagert, sondern jetzt 4 klassen in der mainunit deklariert.
Nun habe ich das problem das ich nicht drauf komme, wie ich alle 3 klassenobjekte (rechteck ,dreieck und kreis) in eine
Objektliste bekomme. Noch benutze ich 3 Listen, was auch funktioniert, allerdings möchte ich jedes objekt über eine methode verschieben können und nicht über 3 verschiedene (wo jede eine andere objektliste anspricht). Genau das gleiche mit dem löschen (ich brauche 3 buttons zum löschen) und der listbox (habe da auch 3 verschiedene). Das löschen geht auch noch nicht richtig, wenn ich löschen drücke wird das gewählte objekt schwarz und verschwindet erst wenn ich ein neues zeichne (wird es überschrieben).
Kann mir da bitte jemand ein paar tipps geben?
Hier code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329:
| unit mainunit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, contnrs;
type TForm1 = class(TForm) bt_rechteck: TButton; bt_kreis: TButton; bt_dreieck: TButton; lb_rechtecke: TListBox; bt_krdel: TButton; Label1: TLabel; Label2: TLabel; lb_dreiecke: TListBox; lb_kreise: TListBox; Label3: TLabel; bt_drdel: TButton; bt_redel: TButton; bt_oben: TButton; procedure bt_rechteckClick(Sender: TObject); procedure bt_kreisClick(Sender: TObject); procedure bt_dreieckClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure bt_redelClick(Sender: TObject); procedure bt_obenClick(Sender: TObject); private FListRechteck : TObjectList; FListDreieck : TObjectList; FListKreis : TObjectList; procedure Speichern(Typ : String); procedure Zeichnen; procedure pClear; procedure pFarbe(sFarbe : String); procedure verschieben(x,y : integer); var IndexRechteck, IndexDreieck, IndexKreis : Integer; public end;
TRechteck = class private Fhoehe : Integer; Fbreite : Integer; FStartA, FStartB : Integer; FFarbe : String; public constructor create(hoehe, breite, startA, startB : Integer; farbe : String); end;
TDreieck = class private Fkante : Integer; FStartA, FStartB : Integer; FFarbe : String; public constructor create(kante, startA, startB : Integer; farbe : String); end;
TKreis = class private Fradius : Integer; FStartA, FStartB : Integer; FFarbe : String; public constructor create(radius, startA, startB : Integer; farbe : String); end;
var Form1: TForm1;
implementation
{$R *.dfm}
constructor TDreieck.create(kante, startA, startB: Integer; farbe : String); begin inherited create;
Fkante := kante; FStartA := startA; FStartB := startB; FFarbe := farbe; end;
constructor TKreis.create(radius, startA, startB: Integer; farbe : String); begin inherited create;
FRadius := radius; FStartA := startA; FStartB := startB; FFarbe := farbe; end;
constructor TRechteck.create(hoehe, breite, startA, startB : Integer; farbe : String); begin inherited create;
FHoehe := hoehe; FBreite := breite; FStartA := startA; FStartB := startB; FFarbe := farbe; end;
procedure TForm1.bt_dreieckClick(Sender: TObject); begin Speichern('Dreieck'); end;
procedure TForm1.bt_kreisClick(Sender: TObject); begin Speichern('Kreis'); end;
procedure TForm1.bt_obenClick(Sender: TObject); begin verschieben(0,-5); end;
procedure TForm1.bt_rechteckClick(Sender: TObject); begin Speichern('Rechteck'); end;
procedure TForm1.bt_redelClick(Sender: TObject); var iAktIndex : integer; Objekt : TRechteck; begin iAktIndex := strtoint(Form1.lb_rechtecke.Items.strings[Form1.lb_rechtecke.ItemIndex]); Objekt := TRechteck(FListRechteck[iAktIndex]); Objekt.free; FListKreis.remove(Objekt); zeichnen(); end;
procedure TForm1.FormCreate(Sender: TObject); begin FListRechteck := TObjectList.Create; FListDreieck := TObjectList.Create; FListKreis := TObjectList.Create; end;
procedure TForm1.FormDestroy(Sender: TObject); begin FListRechteck.free; FListDreieck.free; FListKreis.free; end;
procedure TForm1.Speichern(Typ : String); var kante, startA, startB, hoehe, breite, radius, zufall : integer; sFarbe : String; rechteck : TRechteck; kreis : TKreis; dreieck : TDreieck; begin
randomize; kante := random(100) + 10; radius := random(100) + 10; hoehe := random(100) + 10; breite := random(100) + 10;
randomize; startA := random(300) + 10; startB := random(300) + 10;
randomize; zufall := random(5)+1; case zufall of 1: sFarbe := 'Rot'; 2: sFarbe := 'Gelb'; 3: sFarbe := 'Grün'; 4: sFarbe := 'Schwarz'; 5: sFarbe := 'Blau'; end;
if Typ = 'Rechteck' then begin rechteck := TRechteck.create(hoehe, breite, startA, startB, sFarbe); FListRechteck.add(rechteck); lb_rechtecke.items.add(inttostr(FListRechteck.count-1)); IndexRechteck := IndexRechteck + 1; end else if Typ = 'Kreis' then begin kreis := TKreis.create(radius, startA, startB, sFarbe); FListKreis.add(kreis); lb_kreise.items.add(inttostr(FListKreis.count-1)); IndexKreis := IndexKreis + 1; end else begin dreieck := TDreieck.create(kante, startA, startB, sFarbe); FListDreieck.add(dreieck); lb_dreiecke.items.add(inttostr(FListDreieck.count-1)); IndexDreieck := IndexDreieck + 1; end; Zeichnen(); end;
procedure TForm1.Zeichnen(); var iNr : integer; FObjektR : TRechteck; FObjektD : TDreieck; FObjektK : TKreis; startA, startB, breite, hoehe, kante, radius : integer; farbe : String; fTemp : real; A,B,C : TPoint; begin pClear();
for iNr := 0 to FListRechteck.Count -1 do begin FObjektR := TRechteck(FListRechteck[iNr]); startA := FObjektR.FStartA; startB := FObjektR.FStartB; breite := FObjektR.fBreite; hoehe := FObjektR.FHoehe; farbe := FObjektR.FFarbe;
pFarbe(farbe);
canvas.Rectangle(startA, startB, startA + breite, startB + hoehe); end;
for iNr := 0 to FListDreieck.Count -1 do begin FObjektD := TDreieck(FListDreieck[iNr]); startA := FObjektD.FStartA; startB := FObjektD.FStartB; kante := FObjektD.FKante; farbe := FObjektD.FFarbe;
pFarbe(farbe);
fTemp := round((sqrt(3) / 2) * kante); A := Point(startA, startB); B := Point(startA + kante, startB); C := Point(startA + round(kante / 2), startB - round(fTemp)); canvas.polygon([A,B,C]); end;
for iNr := 0 to FListKreis.Count -1 do begin FObjektK := TKreis(FListKreis[iNr]); startA := FObjektK.FStartA; startB := FObjektK.FStartB; radius := FObjektK.FRadius; farbe := FObjektK.FFarbe;
pFarbe(farbe);
canvas.ellipse(startA, startB, startA + radius, startB + radius); end; end;
procedure TForm1.pClear; begin canvas.pen.color := clBtnFace; canvas.brush.color := clBtnFace; canvas.Rectangle(1, 1, 500, 500); end;
procedure TForm1.pFarbe(sFarbe : String); begin if sFarbe = 'Rot' then begin canvas.pen.color := clred; canvas.brush.color := clred; end else if sFarbe = 'Gelb' then begin canvas.pen.color := clyellow; canvas.brush.color := clyellow; end else if sFarbe = 'Grün' then begin canvas.pen.color := clgreen; canvas.brush.color := clgreen; end else if sFarbe = 'Blau' then begin canvas.pen.color := clblue; canvas.brush.color := clblue; end else begin canvas.pen.color := clblack; canvas.brush.color := clblack; end; end;
procedure TForm1.verschieben(x,y :integer); var iAktIndex : integer; Objekt : TRechteck; FObjektR : TRechteck; begin iAktIndex := strtoint(Form1.lb_rechtecke.Items.strings[Form1.lb_rechtecke.ItemIndex]); Objekt := TRechteck(FListRechteck[iAktIndex]);
FObjektR := TRechteck(FListRechteck[iAktIndex]); FObjektR.FStartA := FObjektR.FStartA + x; FObjektR.FStartB := FObjektR.FStartB + y;
zeichnen(); end;
end. |
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Di 10.07.07 16:58
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.verschieben(x,y :integer); var iAktIndex : integer; Objekt : TRechteck; FObjektR : TRechteck; begin iAktIndex := strtoint(Form1.lb_rechtecke.Items.strings[Form1.lb_rechtecke.ItemIndex]); Objekt := TRechteck(FListRechteck[iAktIndex]);
FObjektR := TRechteck(FListRechteck[iAktIndex]); FObjektR.FStartA := FObjektR.FStartA + x; FObjektR.FStartB := FObjektR.FStartB + y;
zeichnen(); end; |
Dein Entwurf ist leider in OO-Hinsicht nicht besonders gut, der zweite Entwurf sah besser aus. Einige Fehler:
- Das farbig Markierte ist der größte Fehler. Totaler Verstoß gegen die Datenkapselung. An der Uni ein Grund für einen sofortigen Ausfall. Hier war die Variante mit den 4 (oder mehr) Units besser, da funktioniert so ein Zugriff gar nicht erst.
- TGeoForm ist die Basisklasse und hat u. a. die Methoden Zeichne, Loesche und Verschiebe.
- Verschiebe ist ruft Loesche und Zeichne auf.
- Loesche und Zeichne sind abstrakte Methoden, die dann in den Nachfolgeklassen überschrieben werden.
Den Rest (Aufruf) hatte ich schon mal geschieben.
Hoffe, das hilft.
ub60
|
|
acillus 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 10.07.07 18:18
Erstmal danke für die Hinweise.
Zu allererst die Frage ob die Unit Rechteck so korrekt und vollständig im Hinblick auf die Aufgabenstellung ist:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| unit rechteck;
interface
uses geomForm;
type TRechteck = class private Fhoehe : Integer; Fbreite : Integer; FStartA, FStartB : Integer; FFarbe : String; procedure SetStartA(const Value: Integer); procedure SetStartB(const Value: Integer); public constructor create(hoehe, breite, startA, startB : Integer; farbe : String); property StartA:Integer read FStartA write SetStartA; property StartB:Integer read FStartB write SetStartB; end; implementation
constructor TRechteck.create(hoehe, breite, startA, startB : Integer; farbe : String); begin inherited create;
FHoehe := hoehe; FBreite := breite; FStartA := startA; FStartB := startB; FFarbe := farbe; end;
procedure TRechteck.SetStartA(const Value: Integer); begin FStartA := Value; end;
procedure TRechteck.SetStartB(const Value: Integer); begin FStartB := Value; end;
end. |
Damit ich das richtig verstanden habe:
In die geomForm Unit kommen die Proceduren: Bildschirm löschen, Löschen eines Objektes, Verschieben, Zeichnen
In die mainunit wo auch das Formular ist kommt lediglich das speichern eines neuen Objektes
Wenn das soweit stimmt habe ich wieder ein paar Fragen (manche davon wurden schon gestellt, aber noch nicht beantwortet):
1. Speichere ich nun alle Objekte aller Klassen in einer ObjectList oder habe ich für jede Klasse eine eigene ObjectList?
2. Wenn nun die Antwort auf Frage 1 die ist, das ich nur eine Liste benötige, dann Frage ich euch wie ich beim verschieben und löschen eines Objektes auch die richtige Klasse übergeben kann. Also woher weiss das Objekt aus der ObjectList welcher klasse es zugehört?
3. Wenn ich das richtig verstanden habe, verschiebe ich dann das Object mit den SetStartA und SetStartB Proceduren der jeweiligen Klasse. Richtig?
4. Ist es sinnvoll alle Objekte aller Klassen in einer Listbox auszugeben als den Indexwert der ObjectList? (Zum Selektieren des Objektes welches verschoben bzw gelöscht werden soll).
So, nun noch Anmerkungen bzw Fragen zu ub60 Statements:
5. Bezüglich des zeichnens auf welcher Canvas... ich brauche doch nur eine Canvas, oder nicht?
6. Lösche und Zeichne sind abstrakte Methoden, die... kann ich mir das so vorstellen, das je nachdem welches Objekt einer Klasse gezeichnet werden soll, sich die Methode dementsprechend ändert? Wie realisiere ich das?
So das wars auch schon
Ich weiss das es euch viel Arbeit bereitet diese Fragen zu beantworten und das bedeutet mir auch sehr viel das ihr euch die Zeit nehmt, da ihr mir sehr damit helfen könnt. Ich programmiere zwar seit 4 Jahren, allerdings weder mit Delphi noch Objektorientiert. 
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Di 10.07.07 18:52
Ich habe leider im Moment nicht so viel Zeit, alles zu erklären, deshalb mal eine fertige Version eines ähnlichen Programms.
TFigur ist die Basisklasse, von der alle anderen Figuren abgeleitet sind.
In TRechteck und anderen Figurenklassen muss dann nur noch überschrieben werden, wie die konkrete Figur gezeichnet wird, der Rest ist jeweils schon in TFigur vorhanden.
Ich hoffe, die zwei Units helfen.
ub60
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168:
| unit uTFigur;
interface
uses Graphics, uPause;
type TFigur = class(TObject) protected Fx1 : Integer; Fx2 : Integer; Fy1 : Integer; Fy2 : Integer; FFarbe : TColor; FHGFarbe : TColor; FGefuellt : Boolean; FStiftBreite : Integer; FCanvas : TCanvas; procedure ZeichneFigur; virtual; abstract; public constructor Create (x1, y1, x2, y2 : Integer); procedure SetCanvas(Canvas: TCanvas); virtual; procedure SetFarbe(Farbe: TColor); virtual; procedure SetHGFarbe(HGFarbe: TColor); virtual; procedure SetGefuellt(Gefuellt: Boolean); virtual; procedure SetStiftBreite(StiftBreite: Integer); virtual; procedure SetX(x: Integer); virtual; procedure SetY(y: Integer); virtual; procedure Zeichne; virtual; procedure Loesche; virtual; procedure SpringeZu(x: Integer; y: Integer); virtual; procedure BewegeZu(x: Integer; y: Integer; Schrittzahl: Integer; Dauer: Integer); virtual; function GetFarbe: TColor; virtual; function GetHGFarbe: TColor; virtual; function GetX: Integer; virtual; function GetY: Integer; virtual; end;
implementation
procedure TFigur.BewegeZu(x, y, Schrittzahl, Dauer: Integer); var i, xMerke, yMerke, xNeu, yNeu, Intervall : Integer; begin xMerke:=Fx1; yMerke:=Fy1; Intervall:=Round(Dauer/Schrittzahl); for i:=1 to Schrittzahl do begin xNeu:=xMerke+Round((x-xMerke)*i/Schrittzahl); yNeu:=yMerke+Round((y-yMerke)*i/Schrittzahl); SpringeZu(xNeu,yNeu); Pause(Intervall); end; end;
constructor TFigur.Create(x1, y1, x2, y2: Integer); begin inherited Create; Fx1:=x1; Fy1:=y1; Fx2:=x2; Fy2:=y2; FStiftBreite:=1; FGefuellt:=False; FFarbe:=clBlack; FHGFarbe:=clWhite; end;
function TFigur.GetFarbe: TColor; begin Result:=FFarbe; end;
function TFigur.GetHGFarbe: TColor; begin Result:=FHGFarbe; end;
function TFigur.GetX: Integer; begin Result:=Fx1; end;
function TFigur.GetY: Integer; begin Result:=Fy1; end;
procedure TFigur.SetCanvas(Canvas: TCanvas); begin FCanvas:=Canvas; end;
procedure TFigur.SetFarbe(Farbe: TColor); begin FFarbe:=Farbe; end;
procedure TFigur.SetGefuellt(Gefuellt: Boolean); begin FGefuellt:=Gefuellt; end;
procedure TFigur.SetHGFarbe(HGFarbe: TColor); begin FHGFarbe:=HGFarbe; end;
procedure TFigur.SetStiftBreite(StiftBreite: Integer); begin if StiftBreite>5 then StiftBreite:=5; FStiftBreite:=StiftBreite; end;
procedure TFigur.SetX(x: Integer); begin Fx1:=x; end;
procedure TFigur.SetY(y: Integer); begin Fy1:=y; end;
procedure TFigur.Zeichne; begin with FCanvas do begin Pen.Color:=FFarbe; Pen.Width:=FStiftBreite; Pen.Style:=psSolid; Brush.Color:=FFarbe; if FGefuellt then Brush.Style:=bsSolid else Brush.Style:=bsClear; end; ZeichneFigur; end;
procedure TFigur.Loesche; begin with FCanvas do begin Pen.Color:=FHGFarbe; Pen.Width:=FStiftBreite; Pen.Style:=psSolid; Brush.Color:=FHGFarbe; if FGefuellt then Brush.Style:=bsSolid else Brush.Style:=bsClear; end; ZeichneFigur; end;
procedure TFigur.SpringeZu(x, y: Integer); begin Loesche; Fx1:=x; Fy1:=y; Zeichne; end;
end. |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| unit uTRechteck;
interface
uses uTFigur;
type TRechteck = class(TFigur) protected procedure ZeichneFigur; override; public procedure SetBreite(Breite:Integer); virtual; procedure SetHoehe(Hoehe:Integer); virtual; function GetBreite:Integer; virtual; function GetHoehe:Integer; virtual; end;
implementation
function TRechteck.GetBreite: Integer; begin Result:=Fx2; end;
function TRechteck.GetHoehe: Integer; begin Result:=Fy2; end;
procedure TRechteck.SetBreite(Breite: Integer); begin Fx2:=Breite; end;
procedure TRechteck.SetHoehe(Hoehe: Integer); begin Fy2:=Hoehe; end;
procedure TRechteck.ZeichneFigur; begin with FCanvas do begin Rectangle(Fx1,Fy1,Fx1+Fx2,Fy1+Fy2); end; end;
end. |
|
|
acillus 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 11.07.07 11:49
dank ub60, hat es mir auf jedenfall erleichtert es zu verstehen.
allerdings bin ich immernoch zu blöd um das von meiner Form aufzurufen, weiss immer noch nicht wie man die richtig in einer ObjectList speichert und hab immer noch nicht gerafft woher die geomForm weiss, obs ein rechteck, kreis oder dreieck werden soll
bisher siehts so aus:
Form:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93:
| unit mainunit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, geomForm, kreis, rechteck, dreieck;
type TForm1 = class(TForm) bt_rechteck: TButton; bt_dreieck: TButton; bt_kreis: TButton; bt_delete: TButton; ListBox1: TListBox; bt_up: TButton; bt_down: TButton; bt_right: TButton; bt_left: TButton; bbt_exit: TBitBtn; procedure bt_rechteckClick(Sender: TObject); procedure bt_dreieckClick(Sender: TObject); procedure bt_kreisClick(Sender: TObject); private public procedure Speichern(Typ : String); end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bt_dreieckClick(Sender: TObject); begin Speichern('Dreieck'); end;
procedure TForm1.bt_kreisClick(Sender: TObject); begin Speichern('Kreis'); end;
procedure TForm1.bt_rechteckClick(Sender: TObject); begin Speichern('Rechteck'); end;
procedure TForm1.Speichern(Typ : String); var kante, startA, startB, hoehe, breite, radius, zufall : integer; Farbe : TColor; form : TGeomForm; begin
randomize; kante := random(100) + 10; radius := random(100) + 10; hoehe := random(100) + 10; breite := random(100) + 10;
randomize; startA := random(300) + 10; startB := random(300) + 10;
randomize; zufall := random(5)+1; case zufall of 1: Farbe := clred; 2: Farbe := clblack; 3: Farbe := clblue; 4: Farbe := clgreen; 5: Farbe := clyellow; end;
if Typ = 'Rechteck' then begin form := TGeomForm.create(hoehe, breite, startA, startB, Farbe); end else if Typ = 'Kreis' then begin form := TGeomForm.create(radius, radius, startA, startB, Farbe); end else begin form := TGeomForm.create(kante, kante, startA, startB, Farbe); end; end;
end. |
geomForm:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86:
| unit geomForm;
interface
uses Windows, Graphics;
type TGeomForm = class(TObject) protected Fx1 : Integer; Fx2 : Integer; Fy1 : Integer; Fy2 : Integer; radius : Integer; A,B,C : TPoint; FFarbe : TColor; FCanvas : TCanvas; procedure ZeichneForm; virtual; abstract; public constructor Create (x1, y1, x2, y2 : Integer; Farbe : TColor); procedure SetCanvas(Canvas: TCanvas); virtual; procedure SetFarbe(Farbe: TColor); virtual; procedure SpringeZu(x: Integer; y: Integer); virtual; procedure Zeichne; virtual; procedure Loesche; virtual; end;
implementation
constructor TGeomForm.Create(x1, y1, x2, y2: Integer; Farbe : TColor); begin inherited Create; Fx1 := x1; Fy1 := y1; Fx2 := x2; Fy2 := y2; FFarbe := Farbe; end;
procedure TGeomForm.SetCanvas(Canvas: TCanvas); begin FCanvas:=Canvas; end;
procedure TGeomForm.SetFarbe(Farbe: TColor); begin FFarbe:=Farbe; end;
procedure TGeomForm.SpringeZu(x, y: Integer); var xMerke, yMerke : Integer; begin xMerke := Fx1; yMerke := Fy1;
Loesche; Fx1 := xMerke + x; Fy1 := yMerke + y; Zeichne; end;
procedure TGeomForm.Loesche; begin with FCanvas do begin Pen.Color:=cl3DLight; Brush.Color:=cl3DLight; end; ZeichneForm; end;
procedure TGeomForm.Zeichne; begin with FCanvas do begin Pen.Color:=FFarbe; Brush.Color:=FFarbe; end; ZeichneForm; end;
end. |
Beispiel Rechteck:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| unit rechteck;
interface
uses geomForm;
type TRechteck = class(TGeomForm) protected procedure ZeichneForm; override; public procedure SetStartX(x : Integer); virtual; procedure SetStartY(y : Integer); virtual; function GetStartX : Integer; virtual; function GetStartY : Integer; virtual; end;
implementation
function TRechteck.GetStartX : Integer; begin Result := Fx2; end;
function TRechteck.GetStartY : Integer; begin Result := Fy2; end;
procedure TRechteck.SetStartX(x : Integer); begin Fx2 := x; end;
procedure TRechteck.SetStartY(y : Integer); begin Fy2 := y; end;
procedure TRechteck.ZeichneForm; begin with FCanvas do begin Rectangle(Fx1,Fy1,Fx1+Fx2,Fy1+Fy2); end; end;
end. |
|
|
acillus 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 12.07.07 14:21
anscheinend hat keiner die Zeit/Lust zu helfen
Hier mal die neuen Codes:
Mainunit mit der Form1:
Frage: Wie erstelle ich eine instanz von Dreieck/Viereck/Kreis ohne fehler (siehe //Speichern
case Typ of...
)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108:
| unit mainunit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, geomForm, rechteck, contnrs, Typ, kreis, dreieck;
type
TForm1 = class(TForm) bt_rechteck: TButton; bt_dreieck: TButton; bt_kreis: TButton; bt_delete: TButton; bt_up: TButton; bt_down: TButton; bt_right: TButton; bt_left: TButton; bbt_exit: TBitBtn; la_objekt: TLabel; bt_zurueck: TButton; bt_vor: TButton; procedure bt_rechteckClick(Sender: TObject); procedure bt_dreieckClick(Sender: TObject); procedure bt_kreisClick(Sender: TObject); procedure FormCreate(Sender: TObject); private FList : TObjectList; public procedure Speichern(Typ : TTyp); end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bt_dreieckClick(Sender: TObject); begin speichern(Typ.Dreieck); end;
procedure TForm1.bt_kreisClick(Sender: TObject); begin speichern(Typ.Kreis); end;
procedure TForm1.bt_rechteckClick(Sender: TObject); begin speichern(Typ.Rechteck); end;
procedure TForm1.FormCreate(Sender: TObject); begin FList := TObjectList.Create; end;
procedure TForm1.Speichern(Typ : TTyp); var kante, startA, startB, hoehe, breite, iNr, radius, zufall : integer; Farbe : TColor; FForm : TGeomForm; begin randomize; kante := random(100) + 10; radius := random(100) + 10; hoehe := random(100) + 10; breite := random(100) + 10;
randomize; startA := random(300) + 10; startB := random(300) + 10;
randomize; zufall := random(5)+1; case zufall of 1: Farbe := clred; 2: Farbe := clblack; 3: Farbe := clblue; 4: Farbe := clgreen; 5: Farbe := clyellow; end;
case Typ of Dreieck: FForm := TDreieck.create(startA,startB,kante,Farbe); Rechteck: FForm := TRechteck.create(startA,startB,hoehe,breite,Farbe); Kreis: FForm := TKreis.create(startA,startB,radius,Farbe); end;
FList.add(FForm);
for iNr := 0 to FList.count - 1 do begin FForm := (FList[iNr] as TGeomForm); FForm.Zeichne; end;
end;
end. |
TGeoForm: Leider noch unvollständig. Fragen: Wie setzte ich die canvas auf fom1? setcanvas(form1.canvas); geht irgendwie nicht.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
| unit geomForm;
interface
uses Windows, Graphics, typ;
type TGeomForm = class(TObject) protected FTyp : TTyp; FCanvas : TCanvas; procedure ZeichneForm; virtual; abstract; public procedure SetCanvas(Canvas: TCanvas); virtual; procedure SetFarbe(Farbe: TColor); virtual; procedure SpringeZu(x: Integer; y: Integer); virtual; procedure Zeichne; virtual; procedure Loesche; virtual; function GetX: Integer; virtual; function GetY: Integer; virtual; end;
implementation
procedure TGeomForm.SetCanvas(Canvas: TCanvas); begin FCanvas := Canvas; end;
procedure TGeomForm.SetFarbe(Farbe: TColor); begin end;
function TGeomForm.GetX: Integer; begin end;
function TGeomForm.GetY: Integer; begin end;
procedure TGeomForm.SpringeZu(x, y: Integer); var xMerke, yMerke : Integer; begin
end;
procedure TGeomForm.Loesche; begin with FCanvas do begin Pen.Color:=cl3DLight; Brush.Color:=cl3DLight; end; ZeichneForm; end;
procedure TGeomForm.Zeichne; begin
end;
end. |
Beispiel rechteck:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| unit rechteck;
interface
uses geomForm, Graphics, contnrs, classes, Windows;
type TRechteck = class(TGeomForm) protected procedure ZeichneForm; override; var Fx1 : Integer; Fx2 : Integer; Fy1 : Integer; Fy2 : Integer; FFarbe : TColor; private procedure SetStartX(x : Integer); virtual; procedure SetStartY(y : Integer); virtual; function GetStartX : Integer; virtual; function GetStartY : Integer; virtual; public constructor Create(x1, y1, x2, y2 : Integer; Farbe : TColor); property X : Integer read Fx2 write SetStartX; property Y : Integer read Fy2 write SetStartY; end;
implementation
constructor TRechteck.Create(x1, y1, x2, y2 : Integer; Farbe : TColor); begin Fx1 := x1; Fy1 := y1; Fx2 := x2; Fy2 := y2; FFarbe := Farbe; end;
function TRechteck.GetStartX : Integer; begin Result := Fx1; end;
function TRechteck.GetStartY : Integer; begin Result := Fy1; end;
procedure TRechteck.SetStartX(x : Integer); begin Fx1 := x; end;
procedure TRechteck.SetStartY(y : Integer); begin Fy1 := y; end;
procedure TRechteck.ZeichneForm; begin with FCanvas do begin Rectangle(Fx1,Fy1,Fx1+Fx2,Fy1+Fy2); end; end;
end. |
Beispiel Dreieck:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| unit dreieck;
interface
uses geomForm, Graphics, contnrs, classes, Windows;
type TDreieck = class(TGeomForm) protected procedure ZeichneForm; override; var Fx1 : Integer; Fx2 : Integer; Fy1 : Integer; FFarbe : TColor; private procedure SetStartX(x : Integer); virtual; procedure SetStartY(y : Integer); virtual; function GetStartX : Integer; virtual; function GetStartY : Integer; virtual; procedure Punkte(Fx1, Fy1, Fx2 : Integer); var A,B,C : TPoint; public constructor Create(x1, y1, kante : Integer; Farbe : TColor); property X : Integer read Fx2 write SetStartX; end;
implementation
constructor TDreieck.Create(x1, y1, kante : Integer; Farbe : TColor); begin Fx1 := x1; Fy1 := y1; Fx2 := kante; FFarbe := Farbe; Punkte(Fx1,Fy1,Fx2); end;
procedure TDreieck.Punkte(Fx1, Fy1, Fx2 : Integer); var fTemp : real; begin fTemp := round((sqrt(3) / 2) * Fx2); A := Point(Fx1, Fy1); B := Point(Fx1 + Fx2, Fy1); C := Point(Fx1 + round(Fx2 / 2), Fy1 - round(fTemp)); end;
function TDreieck.GetStartX : Integer; begin Result := Fx1; end;
function TDreieck.GetStartY : Integer; begin Result := Fy1; end;
procedure TDreieck.SetStartX(x : Integer); begin Fx1 := x; end;
procedure TDreieck.SetStartY(y : Integer); begin Fy1 := y; end;
procedure TDreieck.ZeichneForm; begin with FCanvas do begin Punkte(Fx1,Fy1,Fx2); polygon([A,B,C]); end; end;
end. |
dazu noch die unit Typ wo das drinsteht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit Typ;
interface type TTyp = (Rechteck, Dreieck, Kreis);
implementation
end. |
|
|
acillus 
Hält's aus hier
Beiträge: 7
|
Verfasst: Fr 13.07.07 12:19
Habe nun alle Probleme lösn können und das Programm funktioniert einwandfrei (auch wenn optimierungsbedarf besteht), falls interesse bestehen sollte schreibe ich die sources bzw lade das project hoch.
|
|
|