Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Frage zu For Schleifen


MrBlack - Sa 21.11.09 20:16
Titel: Frage zu For Schleifen
Hallo zusammen,

ich hab gerade erst angeangen mit Delphi zu programmieren und habe daher folgende Frage. Ich habe 60 Shapes und möchte die alle an bestimmte Positionen setzen. Aber anstelle von

Delphi-Quelltext
1:
2:
3:
4:
shape1.left:=500;
shape2.left:=200;
shape3.left:=xxx;
...


wäre es doch gut eine For Schleife verwenden zu können. Ich hatte mir dazu folgendes überlegt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.FormCreate(Sender: TObject);
var shapenr,left,top,i:integer;
begin
left:=201;
top:=718;

for shapenr:=1 to 60 do
  shape[shapenr].left:=left;
  shape[shapenr].top:=top;
  left:=left+47;
  top:=top-53;
end;
end;


Das funktioniert so leider nicht... Was mache ich falsch?

Danke für eure Hilfe!

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


platzwart - Sa 21.11.09 20:20

So wie du es geschrieben hast, muss dann "shape" vom Typ "array[1..60] of TShape" sein. Ist das so?!?


MrBlack - Sa 21.11.09 20:25

nee... Ich hab keinen Array gemacht. Wie würde ich das denn mit nem Array genau machen? Gibt es denn noch andere Lösungen für das Problem?


Delete - Sa 21.11.09 20:30

Eine andere Lösung wäre eine Objektliste.


MrBlack - Sa 21.11.09 20:38

Sry, ich weiß nicht was ne Objectliste ist. Wie erzeug ich die, wie funktioniert die? Danke


Delete - Sa 21.11.09 20:45

Guck mal in der Delphi Hilfe unter TObjectList nach.


der organist - Sa 21.11.09 21:23

gabs da nich mal was von wegen SearchComponent etc oder so?


platzwart - Sa 21.11.09 21:42

Das hieß FindComponent() ;)


Andreas L. - Sa 21.11.09 21:48


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
 i: Integer;
begin
  for i := 0 to ComponentCount -1 do
  begin
    if Components[i] is TShape then
      TShape(Components[i]).Left := 111;
  end;
end;


Das verschiebt alle Shapes die auf der Form sind.


ffgorcky - So 22.11.09 09:17

Das kann so ja noch nicht funktionieren, da ja Dein Shape-Array so noch gar keine Inhalte hat, wenn Du es nicht vorher damit füllst.
Es ist ja die Frage, ob Du auf dies Objekte nur einmal zugreifen möchtest, oder vielleicht öfter.
Wenn Du das öfter machen möchtest, dann solltest Du die Shapes in OnCreate(..) erst mal in ein Array aufnehmen und danach kannst Du sie dann ja ohne weiteres immer im Array abarbeiten:


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:
//Form-Variablen:
var
 hoechsterArrayIndex:Integer;
 shape:Array[0..100of TShape;



//Und hier dann Deine OnCreate-Prozedur:
procedure TForm1.FormCreate(Sender: TObject);
var 
    left,top,i,momentanerIndex:integer;
begin
//Also hier erst mal alle in ein Array aufnehmen:
momentanerIndex:=0;
for i := 0 to ComponentCount -1 do
  begin
    if Components[i] is TShape then
      begin
      shape[momentanerIndex]:=TShape(Components[i]);
      momentanerIndex:=momentanerIndex+1;
      end;
  end;
hoechsterArrayIndex:=momentanerIndex;
//und hier dann diese alle abarbeiten:
left:=201;
top:=718;
for momentanerIndex:=0 to hoechsterArrayIndex do
  shape[shapenr].left:=left;
  shape[shapenr].top:=top;
  left:=left+47;
  top:=top-53;
end;

So ich hoffe, dass Du damit was anfangen kannst.


Andreas L. - So 22.11.09 09:36

@ffgorcky: Ist aber keine gute Idee deine Variablen die selben Namen wie Eigenschaften der Form zu geben.


Delphi-Quelltext
1:
2:
var 
    left,top,i,momentanerIndex:integer;


MrBlack - So 22.11.09 12:19

Hey, Vielen Dank ffgorcky!!! Jetzt klappts auch bei mir =) Dann kann ich mir die mühselige Tipparbeit sparen! 60 Shapes auf 60 verschiedene Positionen zu bringen kann nämlich etwas dauern! =)

@Andreas: Die Variablennamen hab ich auch noch geändert.

Vielen dank für eure Hilfe! =)