For-In-Do mit Components-Liste? [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

For-In-Do mit Components-Liste? [gelöst]

Beitrag von MmVisual »

Hallo,

Ich wollte einmal die neue For-In-Do testen.

Dazu habe ich den Code:

Code: Alles auswählen

For i := 0 To ComponentCount - 1 Do
    If Components[i] Is TDBGrid Then
      TDBGrid(Components[i]).OnMouseUp := @grdMouseUp;
Umgebaut und sieht jetzt so aus:

Code: Alles auswählen

Var co: TComponent;
 : : :
  For co In Components Do
    If co Is TDBGrid Then
      TDBGrid(co).OnMouseUp := @grdMouseUp;
Aber FPC meckert:
fMain.pas(4722,13) Error: Wrong number of parameters specified for call to "GetComponent"
fMain.pas(4722,13) Error: Cannot find an enumerator for the type "<erroneous type>"

hmm. Was mache ich falsch?

Gruß Markus
Zuletzt geändert von MmVisual am Sa 25. Dez 2010, 00:35, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Socke
Lazarusforum e. V.
Beiträge: 3178
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: For-In-Do mit Components-Liste?

Beitrag von Socke »

TComponente.Components ist eine indizierte Eigenschaft. Die for-in-Schleife kennt aber keine Enumerator-Klasse dafür (die es üblicherweise nur für diverse Listen implementiert sind).

Edit: ich habe gerade einen Enumerator für TComponent geschrieben.

Code: Alles auswählen

// die Enumerator-Klasse
type
  TComponentsEnumerator = class(TObject)
  private
    FParent: TComponent;
    FCurrent: Integer;
  public
    constructor Create(aParent: TComponent);
    function GetCurrent: TComponent;
    function MoveNext: Boolean;
    procedure Reset;
    property Current: TComponent read GetCurrent;
  end;
 
constructor TComponentsEnumerator.Create(aParent: TComponent);
begin
  FParent := aParent;
  Reset;
end;
 
function TComponentsEnumerator.GetCurrent: TComponent;
begin
  Result := FParent.Components[FCurrent];
end;
 
function TComponentsEnumerator.MoveNext: Boolean;
begin
  inc(FCurrent);
  Result := FCurrent < FParent.ComponentCount;
end;
 
procedure TComponentsEnumerator.Reset;
begin
  FCurrent := -1;  // das erste MoveNext() setzt FCurrent = 0
end;
 
// einen Operator, der die richtige Enumerator-Klasse instantiiert
operator Enumerator(aParent: TComponent): TComponentsEnumerator;
begin
  Result := TComponentsEnumerator.Create(aParent);
end;
 
// Aufruf
var
  co: TComponent;
for co in Self do  // Self muss durch die Komponente ersetzt werden, durch dessen Kind-Komponenten man iterieren will
  ShowMessage(co.Name);
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: For-In-Do mit Components-Liste?

Beitrag von MmVisual »

edit:
Ich habe den Code so geändert:

Code: Alles auswählen

For co In Self Do
Dann ging es :D , den Enumerator braucht es nicht extra (oder ist in meinem Lazarus schon drin)

Grüße und frohe Weihnachten Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Socke
Lazarusforum e. V.
Beiträge: 3178
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: For-In-Do mit Components-Liste? [gelöst]

Beitrag von Socke »

MmVisual hat geschrieben:Dann ging es :D , den Enumerator braucht es nicht extra (oder ist in meinem Lazarus schon drin)
Naja, das hätte ich auch selbst überprüfen können :oops:, aber wenn man so wenig ausgelastet ist, schießt man schonmal übers Ziel hinaus.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6773
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: For-In-Do mit Components-Liste?

Beitrag von af0815 »

MmVisual hat geschrieben:Dann ging es :D , den Enumerator braucht es nicht extra (oder ist in meinem Lazarus schon drin)
Ist etwas das nicht Lazarus, sondern der FPC bereistellt, steht auch eindeutig im Referenceguide im Kapitel "The For..in..do Statement drinnen

Code: Alles auswählen

The Classes unit contains a number of classes that are enumerable:
 
TFPList
    Enumerates all pointers in the list. 
TList
    Enumerates all pointers in the list. 
TCollection
    Enumerates all items in the collection. 
TStringList
    Enumerates all strings in the list. 
TComponent
    enumerates all child components owned by the component.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten