Autor Beitrag
realerHanno
Hält's aus hier
Beiträge: 13

Win XP
Delphi Enterprise V7.0
BeitragVerfasst: Mi 27.04.11 17:41 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13

Win XP
Delphi Enterprise V7.0
BeitragVerfasst: 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:

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


Zuletzt bearbeitet von realerHanno am Mi 27.04.11 18:36, insgesamt 1-mal bearbeitet
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mi 27.04.11 18:35 
Dann hier ein einfaches Beispiel mit 9 Shapes:
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:
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;

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)

Für diesen Beitrag haben gedankt: KleinesPferd
realerHanno Threadstarter
Hält's aus hier
Beiträge: 13

Win XP
Delphi Enterprise V7.0
BeitragVerfasst: 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!