Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Typ für for each Schleife (https://www.delphipraxis.net/155203-typ-fuer-each-schleife.html)

Björn Ole 13. Okt 2010 01:38

Delphi-Version: 2010

Typ für for each Schleife
 
Huhu,

kurze Frage. Wie muss der Typ des Parameters AIn lauten, damit ich TList, TObjectList, Arrays etc. übergeben kann? Sollte später nicht nur mit Integers funktionieren. Würde mir gerne das overloading sparen. :oops:
Delphi-Quellcode:
function IsNumberIn(ANumber: integer; AIn: {TList, TObjectList, Array}): boolean;
var
  n: integer;
begin
  result := false;
  for n in AIn do
  begin
    if n = ANumber then
    begin
      result := true;
      Break;
    end;
  end;
end;
TEnumerator<integer> hab ich schon versucht, da kommt folgende Meldung:
Zitat:

E2431 for-in statement cannot operate on collection type 'Generics.Collections.TEnumerator<System.Integer>' because 'Generics.Collections.TEnumerator<System.Integer>' does not contain a member for 'GetEnumerator', or it is inaccessible

Gibts da ne Möglichkeit?
Gruß, Björn

xZise 13. Okt 2010 09:45

AW: Typ für for each Schleife
 
Muss das a nicht ein n sein?

MfG
Fabian

mirage228 13. Okt 2010 09:51

AW: Typ für for each Schleife
 
IEnumerable<T> bzw. TEnumerable<T> dürfte sein, was du suchst ;)

himitsu 13. Okt 2010 10:15

AW: Typ für for each Schleife
 
Zitat:

Zitat von mirage228 (Beitrag 1055464)
IEnumerable<T> bzw. TEnumerable<T> dürfte sein, was du suchst ;)

Muß nicht unbedingt sein ... kann man auch selber machen.
Sooo große Hexerei steckt da nicht dahinter.

Die Klasse oder der Record, welche für For-In genutzt werden soll muß nur eine Public-Funktion Namens "GetEnumerator" besitzen, welche dann von Delphi aufgerufen wird.
Delphi-Quellcode:
TMeinListenTyp = class/record
  ...
  Function GetEnumerator: TMeinEnumerator;
end;
TMeinListenTyp ist quasi eine Liste/Array mit vielen TMeinTyp drinnen.

Und die Klasse TMeinEnumerator muß diese Funktionen und Property beinhalten:
Delphi-Quellcode:
TMeinEnumerator = Class
  Constructor Create(Const List: TMeinListenTyp);
  Function GetCurrent: TMeinTyp;
  Function MoveNext:  Boolean;
  Property Current:   TMeinTyp Read GetCurrent;
End;
Delphi-Quellcode:
var
  x: TMeinTyp;
  List: TMeinListenTyp;

for x in List do ...
Ach ja, TMeinEnumerator und TMeinListenTyp können auch ein und die selbe Klasse sein, mit überladenen Konstructoren für die normale Erstellung und die Erstellung des Enumerators.



Delphi-Quellcode:
TMeinListenTyp = Pecord
Private
  FList: array of TMeinTyp;
  FEnumIndex: Integer;
Public
  Constructor Create; overload;
  ...
  Function GetEnumerator: TMeinListenTyp;
  Constructor Create(List: TMeinListenTyp); overload;
  Function GetCurrent: TMeinTyp;
  Function MoveNext:  Boolean;
  Property Current:   TMeinTyp Read GetCurrent;
End;

Constructor TMeinListenTyp.Create(List: TMeinListenTyp);
  Begin
    FList := List.FList; // Werte speichern oder einfach nur eine Referenz auf List merken und dann darüber auf die Liste zugreifen
    FEnumIndex := -1;
  End;

Function TMeinListenTyp.GetCurrent: TMeinTyp;
  Begin
    Result := FList[FEnumIndex];
  End;

Function TMeinListenTyp.MoveNext: Boolean;
  Begin
    Result := FEnumIndex < Length(FList);
    If Result Then Inc(FEnumIndex);
  End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf