Autor Beitrag
acillus
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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..20of TPunkte;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Neues Objekt anlegen
procedure TForm1.Zeichnen(Typ : String);
var iKante, iStartA, iStartB : integer;
begin
  ibNeu := true;
  iKante := pKante() * 3;
  pFarbe();

  //Startpunkte festlegen
  randomize;
  iStartA := random(300) + 226;
  iStartB := random(300) + 21;

  //Objekt Speichern
  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));

  //Zeichnen
  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;

//Zeichnen
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;

    //verschieben
    if iAlterWertA + WertA >= 225 then begin
      if iAlterWertB + WertB >= 20 then begin
        Punkte[iAktIndex].irStartA := iAlterWertA + WertA;
        Punkte[iAktIndex].irStartB := iAlterWertB + WertB;
      end;
    end;
    //Löscht Bildschirm
    pClear();
  end;

  //Jedes Objekt zeichnen
  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;

    //Farbe ändern
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 09.07.07 18:03 
Moin und :welcome: im Forum!

user profile iconacillus 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. :mahn: (meine bescheidene Meinung)

Schau doch mal nach ein paar OOP-Tutorials hier, war nicht in Christian S. Crashkurs auch was zu OOP drin? :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
acillus Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
    procedure Zeichnen(Typ : String);
  public
    { Public-Deklarationen }
  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
  //Größe festlegen
  randomize;
  kante := random(100) + 10;
  radius := random(100) + 10;
  hoehe := random(100) + 10;
  breite := random(100) + 10;

  //Startpunkte festlegen
  randomize;
  startA := random(300) + 10;
  startB := random(300) + 10;

  //Farbe festlegen
  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;

  //Zeichnen
  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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: 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:

ausblenden 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;
      // Pause
      Verschiebe(...);
      // ...
      Free;
    end;
end;


ub60
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Di 10.07.07 00:23 
acillus Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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
    { Public-Deklarationen }
  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 Dreieck
constructor TDreieck.create(kante, startA, startB: Integer; farbe : String);
begin
  inherited create;

  Fkante := kante;
  FStartA := startA;
  FStartB := startB;
  FFarbe := farbe;
end;

//Constructor Kreis
constructor TKreis.create(radius, startA, startB: Integer; farbe : String);
begin
  inherited create;

  FRadius := radius;
  FStartA := startA;
  FStartB := startB;
  FFarbe := farbe;
end;

//Constructor Rechteck
constructor TRechteck.create(hoehe, breite, startA, startB : Integer; farbe : String);
begin
  inherited create;

  FHoehe := hoehe;
  FBreite := breite;
  FStartA := startA;
  FStartB := startB;
  FFarbe := farbe;
end;

//Dreieck button
procedure TForm1.bt_dreieckClick(Sender: TObject);
begin
  Speichern('Dreieck');
end;

//Kreis button
procedure TForm1.bt_kreisClick(Sender: TObject);
begin
  Speichern('Kreis');
end;

procedure TForm1.bt_obenClick(Sender: TObject);
begin
  verschieben(0,-5);
end;

//Rechteck button
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;

//Listen erstellen
procedure TForm1.FormCreate(Sender: TObject);
begin
  FListRechteck := TObjectList.Create;
  FListDreieck := TObjectList.Create;
  FListKreis := TObjectList.Create;
end;

//Listen zerstören
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FListRechteck.free;
  FListDreieck.free;
  FListKreis.free;
end;

//Speichern
procedure TForm1.Speichern(Typ : String);
var kante, startA, startB, hoehe, breite, radius, zufall : integer;
    sFarbe : String;
    rechteck : TRechteck;
    kreis : TKreis;
    dreieck : TDreieck;
begin

  //Größe festlegen
  randomize;
  kante := random(100) + 10;
  radius := random(100) + 10;
  hoehe := random(100) + 10;
  breite := random(100) + 10;

  //Startpunkte festlegen
  randomize;
  startA := random(300) + 10;
  startB := random(300) + 10;

  //Farbe festlegen
  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;

  //Speichern
  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;

//Zeichnen
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();

  //Rechtecke
  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;

  //Dreiecke
  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;

  //Kreise
  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;

//Bildschirm leeren
procedure TForm1.pClear;
begin
  canvas.pen.color := clBtnFace;
  canvas.brush.color := clBtnFace;
  canvas.Rectangle(11500500);
end;

//Farbe ändern
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: Di 10.07.07 16:58 
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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 :oops:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: 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

ausblenden volle Höhe 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:
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; virtualabstract;
  public
    constructor Create (x1, y1, x2, y2 : Integer); {virtual; }
    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

{ TFigur }

procedure TFigur.BewegeZu(x, y, Schrittzahl, Dauer: Integer);
var i, xMerke, yMerke, xNeu, yNeu, Intervall : Integer;
begin
  xMerke:=Fx1;  // oder GetX
  yMerke:=Fy1;  // oder Gety
  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.


ausblenden volle Höhe 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:
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

{ TRechteck }

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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 :roll:

bisher siehts so aus:

Form:

ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  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

  //Größe festlegen
  randomize;
  kante := random(100) + 10;
  radius := random(100) + 10;
  hoehe := random(100) + 10;
  breite := random(100) + 10;

  //Startpunkte festlegen
  randomize;
  startA := random(300) + 10;
  startB := random(300) + 10;

  //Farbe festlegen
  randomize;
  zufall := random(5)+1;
  case zufall of
    1: Farbe := clred;
    2: Farbe := clblack;
    3: Farbe := clblue;
    4: Farbe := clgreen;
    5: Farbe := clyellow;
  end;

  //Speichern
  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:

ausblenden volle Höhe 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:
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; virtualabstract;
  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
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;

//Verschieben
procedure TGeomForm.SpringeZu(x, y: Integer);
var xMerke, yMerke : Integer;
begin
  xMerke := Fx1;
  yMerke := Fy1;

  Loesche;
  Fx1 := xMerke + x;
  Fy1 := yMerke + y;
  Zeichne;
end;

//Lösche
procedure TGeomForm.Loesche;
begin
  with FCanvas do
    begin
      Pen.Color:=cl3DLight;
      Brush.Color:=cl3DLight;
    end;
  ZeichneForm;
end;

//Zeichne
procedure TGeomForm.Zeichne;
begin
  with FCanvas do
    begin
      Pen.Color:=FFarbe;
      Brush.Color:=FFarbe;
    end;
  ZeichneForm;
end;

end.


Beispiel Rechteck:

ausblenden volle Höhe 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:
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

{ TRechteck }

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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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...
)

ausblenden volle Höhe 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:
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
  //Größe festlegen
  randomize;
  kante := random(100) + 10;
  radius := random(100) + 10;
  hoehe := random(100) + 10;
  breite := random(100) + 10;

  //Startpunkte festlegen
  randomize;
  startA := random(300) + 10;
  startB := random(300) + 10;

  //Farbe festlegen
  randomize;
  zufall := random(5)+1;
  case zufall of
    1: Farbe := clred;
    2: Farbe := clblack;
    3: Farbe := clblue;
    4: Farbe := clgreen;
    5: Farbe := clyellow;
  end;

  //Speichern
  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);

  //Zeichnen
  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.

ausblenden volle Höhe 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:
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; virtualabstract;
  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
 // FFarbe:=Farbe;
end;

function TGeomForm.GetX: Integer;
begin
 // Result := Fx1;
end;

function TGeomForm.GetY: Integer;
begin
 // Result := Fy1;
end;

//Verschieben
procedure TGeomForm.SpringeZu(x, y: Integer);
var xMerke, yMerke : Integer;
begin
{
  xMerke := Fx1;
  yMerke := Fy1;

  Loesche;
  Fx1 := xMerke + x;
  Fy1 := yMerke + y;
  Zeichne;
  }

end;

//Lösche
procedure TGeomForm.Loesche;
begin
  with FCanvas do
    begin
      Pen.Color:=cl3DLight;
      Brush.Color:=cl3DLight;
    end;
  ZeichneForm;
end;

//Zeichne
procedure TGeomForm.Zeichne;
begin
{
  with FCanvas do
    begin
      Pen.Color := FFarbe;
      Brush.Color := FFarbe;
    end;
  ZeichneForm;
  }

end;

end.


Beispiel rechteck:

ausblenden volle Höhe 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:
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

{ TRechteck }

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:

ausblenden volle Höhe 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:
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;
    //    function getx: integer; override;
  public
    constructor Create(x1, y1, kante : Integer; Farbe : TColor);
    property X : Integer read Fx2 write SetStartX;
  end;

implementation

{ TDreieck }

//Constructor
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
unit Typ;

interface
type
 TTyp = (Rechteck, Dreieck, Kreis);

implementation

end.
acillus Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.