Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit For..in Schleife


jasocul - Di 04.02.14 09:42
Titel: Problem mit For..in Schleife
Ich "experimentiere" gerade mit der for..in Schleife und wollte eine alte Schleife dadurch ersetzen. Nach dem, was ich zu dieser Schleife gelesen habe, sollte folgendes mMn funktionieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Initialisierung;
var
  MyComp : TComponent;

begin
  for MyComp in Components do
  begin
    ...
  end;
end;

Ich bekomme aber die Meldung:
Zitat:
[DCC Fehler] Main.pas(92): E2029 '[' erwartet, aber 'DO' gefunden

Ein GetEnumerator existiert laut DOH.

Weiß jemand, warum das nicht funktioniert und kann mir erklären, was ich falsch mache? Oder geht das in bestimmten Fällen einfach nicht?

Mein Programm läuft auch ohne diese Änderung einwandfrei. Mir geht es nicht darum, welches Schleifenkonstrukt besser oder schlechter ist und ob man unbedingt etwas umstellen muss. Ich möchte einfach nur wissen, was das Problem ist.


jaenicke - Di 04.02.14 09:52

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Ein GetEnumerator existiert laut DOH.
Das kann nicht sein, denn Components ist eine indizierte Property, darin kann es nicht existieren.

Das GetEnumerator existiert in TComponent. Dementsprechend im Formular selbst. Deshalb musst du das auch so schreiben:

Delphi-Quelltext
1:
for MyComp in Self do                    


jasocul - Di 04.02.14 09:59

:autsch:
Da hätte ich auch selbst drauf kommen können. Danke.


jaenicke - Di 04.02.14 10:49

Nebenbei habe ich eine Zusatzfunktion als Classhelper geschrieben, bei dem du den Typ angeben kannst. Das sieht dann so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TComponentHelper = class helper for TComponent
    function GetComponents<T: class>: TArray<T>; overload;
    function GetComponents<T: class>(const AFilterFunc: TComponentListFilterFunc<T>): TArray<T>; overload;
  end;

for CurrentButton in Self.GetComponents<TButton> do
  CurrentButton.Caption := 'Foo';
Auch eine Filterfunktion kann man so direkt übergeben.


jasocul - Di 04.02.14 11:05

Gute Idee.
Meistens will man ja nur bestimmte Komponenten verarbeiten. :zustimm: