Problem mit for ... in

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Problem mit for ... in

Beitrag von braunbär »

Kann mir jemand sagen, was bei dem folgenden Konstrukt falsch ist:

Code: Alles auswählen

 
procedure TfrmTicker.LoadComplete;
var  c: TComponent;
    fdData: IfdData;
begin
  for c in Components do
    if c.getinterface(stringtoguid(GUID_fdData),fdData)
    then fdData.Loadcomplete;
end;
 
 


Ich bekomme die Fehlermeldung.

Code: Alles auswählen

 
Projekt kompilieren, Ziel: Optionen.exe: Exit code 1, Fehler: 3
Ticker.pas(191,12) Error: Wrong number of parameters specified for call to "GetComponent"
Error: Found declaration: GetComponent(LongInt):TComponent;
Ticker.pas(191,12) Error: Cannot find an enumerator for the type "<erroneous type>"
 


Das gleiche mit einer normalen Schleife von 0 bis Componentcount-1 kompiliert einwandfrei:

Code: Alles auswählen

 
procedure TfrmTicker.Loadcomplete;
var fdData: IfdData;
    i: integer;
begin
  for i:=0 to ComponentCount-1 do
      if Components[i].getinterface(stringtoguid(GUID_fdData),fdData)
         then fdData.Loadcomplete;
end;
 

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Problem mit for ... in

Beitrag von Socke »

Components ist eine Array-Property, d.h. du musst beim Zugriff darauf einen Index angeben. Der Enumerator kann aber nicht erraten, dass für die Array-Property die Anzahl über ComponentCount ermittelt werden, und dass dies überhaupt in Integer ist.
Der Default-Enumerator für Formulare iteriert bereits über die Komponenten. Versuch mal Folgendes:

Code: Alles auswählen

 
procedure TfrmTicker.LoadComplete;
var  c: TComponent;
    fdData: IfdData;
begin
  for c in Self do
    if c.getinterface(stringtoguid(GUID_fdData),fdData)
    then fdData.Loadcomplete;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Problem mit for ... in

Beitrag von braunbär »

Super! Funktioniert so.
Irgendwie ist mir mittlerweile ohnehin gedämmert, wo das Problem liegt. Aber auf die Lösung wäre ich sicher nicht gekommen. Es ist zwar nicht wichtig, aber ich finde, "for ... in" ist da schon viel schöner als eine Zählschleife. :)

Antworten