Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Properties über Schleife ändern
realerHanno - Mi 27.04.11 17:41
Titel: Properties über Schleife ändern
Hallo,
suche seit einigen Stunden nach einer einfachen Lösung, um properties über eine Schleife zu ändern.
z.B. ist mir folgendes bei einer größeren Anzahl von Objekten wirklich zu dumm:
shape1.visible:=FALSE;
shape2.visible:=FALSE;
shape3.visible:=FALSE;
...
Die eigentlich logische Variante funktioniert nicht in Delphi:
for i:=1 to n do shape[i].visible:=FALSE;
Wäre noch die Möglichkeit, den Umweg über ein Array zu machen (hab ich öfters gelesen), aber alle meine Ansätze sind falsch.
Sicher gibt es eine einfache Lösung dafür, aber ich finde sie nicht. Wer kann helfen?
jaenicke - Mi 27.04.11 17:47
Hallo und :welcome:
realerHanno hat folgendes geschrieben : |
| Wäre noch die Möglichkeit, den Umweg über ein Array zu machen (hab ich öfters gelesen) |
Zumindest wenn du die Objekte oft ansprichst wäre das sicher sinnvoll.
realerHanno hat folgendes geschrieben : |
| Sicher gibt es eine einfache Lösung dafür, aber ich finde sie nicht. Wer kann helfen? |
Zum Füllen des Arrays kannst du FindComponent verwenden um die Komponenten über den Namen zu suchen.
realerHanno - Mi 27.04.11 18:25
Hallo,
Das Problem ist nicht ganz so trivial wie angenommen.
Es geht ja nicht nur ums Erzeugen und Zuweisen wie empfohlen, obwohl diese Methode recht rentabel ist.
Aber hier müßte ich ja jedes mal die erzeugten Teile löschen und eine neue Schleife mit neuen properties laufen lassen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var i: Integer; const NamePrefix = 'Shape_'; begin for i := 1 to 20 do begin TShape.Create(Self).Name := NamePrefix + IntToStr(i); with TShape(FindComponent(NamePrefix + IntToStr(i))) do begin Left := i*5; Top := 20; Parent := self; end; end; end; |
Um das Problem etwas näher zu beleuchten, hier ein kleines Beispiel:
Ich habe zB. 20 gleiche Objekte, denen ich die properties ändern möchte - einmal für alle oder auch wahlfrei, nur für einzelne.
Das o.g. nicht funktionierende Beispiel mit der property-Schleife zeigt hier nur die Änderungen für alle. Daraus könnte ich dann auch den nächsten Step ableiten.
Aber leider hab ich immer noch keinen Musenkuss dafür... :cry:
Tilman - Mi 27.04.11 18:35
Dann hier ein einfaches Beispiel mit 9 Shapes:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Shape1: TShape; Shape2: TShape; Shape3: TShape; Shape4: TShape; Shape5: TShape; Shape6: TShape; Shape7: TShape; Shape8: TShape; Shape9: TShape; Button1: TButton; Button2: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private public end;
var Form1: TForm1; meine_shapes: array[1..9] of tShape;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var n: Integer; begin for n := 1 to 9 do meine_shapes[n] := TShape(FindComponent('shape'+IntToStr(n))); end;
procedure TForm1.Button1Click(Sender: TObject); begin meine_shapes[5].Hide; end;
procedure TForm1.Button2Click(Sender: TObject); var n: Integer; begin for n := 1 to 9 do meine_shapes[n].Hide; end;
procedure TForm1.Button3Click(Sender: TObject); var n: Integer; begin for n := 1 to 9 do meine_shapes[n].show; end; |
realerHanno - Mi 27.04.11 18:58
Hallo,
da hast's mir gezeigt!
Hatte mich schon auf viel kompliziertere Sachen eingestellt... und es läuft wie geschmiert!
Recht vielen Dank!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!