Entwickler-Ecke

Sonstiges (Delphi) - Controls per ControlCount durchlaufen, Wert zuweisen..


trm - Mi 18.04.12 23:23
Titel: Controls per ControlCount durchlaufen, Wert zuweisen..
Hi,

wenn ich auf einer Form Controls durchlaufe, benötige ich eine Möglichkeit, um dem aktuellen Control ein anderes Control zuzuweisen.
Wenn man das über das Control direkt macht, funktioniert das.

Funktionierendes Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
x:TButton;
begin
 x:=Button1;
 x.name:='neuerName';
 Button1:=x;
end;


Folgendes funktioniert nicht, weil die Eigenschaft schreibgeschützt ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
x:TButton;
y:Integer;
begin
 for y:=0 to form1.controlcount-1 do
  if form1.controls[y] is tbutton then
   begin
    x:=form1.controls[y] as tbutton ;
    x.name:='neuerName';

//Hier tritt der Fehler auf. kann man das umgehen ?
    form1.controls[y] := x;
// !
   end;
end;


bummi - Mi 18.04.12 23:50

Ich schätze Nein, die Property Controls liest über
GetControl(Index: Integer): TControl
und liefert ein Control aus einer privaten Liste, an die Liste selbst kommst Du IMHO nicht (ohne Dirty-Tricks) heran


jaenicke - Do 19.04.12 00:33

Ich frage mich sowieso was das werden soll. Zumindest in dem Beispiel macht das keinerlei Sinn. :nixweiss:
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
    form1.controls[y] := x;
// !
   end;
end;
In x ist doch ohnehin schon form1.controls[y] drin. Also wozu willst du das denn überhaupt noch einmal in form1.controls[y] hineinpacken, selbst wenn es gehen sollte.

Ich glaube du solltest dir einmal anschauen wie Objekte und Objektreferenzen in Delphi funktionieren...

Ein kleines Beispiel:

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:
type
  TTest = class
  private
    FTest: Integer;
    procedure SetTest(const Value: Integer);
  public
    property Test: Integer read FTest write SetTest;
  end;

// ...

procedure TTest.SetTest(const Value: Integer);
begin
  FTest := Value;
end;

// ...

var
  MyTest, MyCopy: TTest;
begin
  MyTest := TTest.Create;
  try
    MyTest.Test := 100;
    MyCopy := MyTest;
    MyCopy.Test := 400;
    ShowMessage(IntToStr(MyTest.Test));
  finally
    MyTest.Free;
  end;
end;
Was meinst du was angezeigt wird? Probier es aus...


trm - Do 19.04.12 00:55

Hallo Sebastian,

der Snn der Sache hängt mit dem Post zusammen: http://www.delphi-forum.de/viewtopic.php?t=109126

Dort wird der Originalkomponente der Name weggenommen, damit das Control geklont werden kann und dabei nicht zwei Controls/Komponenten mit dem gleichen Namen erstellt werden.

Nachdem alles fertig ist, wird das kopierte Control dem Originalen Control wieder "zurückgegeben".
Wenn dies nicht passiert, "schwebt" das Originalcontrol irgendwo/irgendwie ohne Namen herum und kann nicht wieder korrekt angesprochen werden.

Deshalb die eigenartige Logik.