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:

user profile iconrealerHanno hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconrealerHanno hat folgendes geschrieben Zum zitierten Posting springen:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  meine_shapes: array[1..9of tShape;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
  var
    n: Integer;
begin
  for n := 1 to 9 do     // Array erzeugen
    meine_shapes[n] := TShape(FindComponent('shape'+IntToStr(n)));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //shape5.Hide;          // bewirkt jetzt beides
  meine_shapes[5].Hide;   // das gleiche!
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
    n: Integer;
begin
  for n := 1 to 9 do       //alle Verbergen
    meine_shapes[n].Hide;
end;

procedure TForm1.Button3Click(Sender: TObject);
  var
    n: Integer;
begin
  for n := 1 to 9 do       // alle Zeigen
    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!