Autor Beitrag
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 04.02.14 09:42 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
for MyComp in Self do					

Für diesen Beitrag haben gedankt: jasocul
jasocul Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 04.02.14 09:59 
:autsch:
Da hätte ich auch selbst drauf kommen können. Danke.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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.

Für diesen Beitrag haben gedankt: jasocul
jasocul Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 04.02.14 11:05 
Gute Idee.
Meistens will man ja nur bestimmte Komponenten verarbeiten. :zustimm: