Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: FMX TListView mit Seattle

  Alt 14. Apr 2016, 23:06
Ach so, Du meinst die For in Enumeration.

Hier geht das standardmäßig nur mit den einfachen Strings:

Delphi-Quellcode:
var
  s: string;
begin
  for s in ListBox1.Items do begin
    ShowMessage (s);
  end;
end;
Warum das mit den ListItems nicht geht, hat Chris Rolliston vor einiger Zeit schon mal hier beschrieben und per ClassHelper auch eine Art Ersatzlösung dafür geboten:

https://delphihaven.wordpress.com/20...-anti-pattern/

In Anlehnung daran könnte man es (hier ein wenig vereinfacht und mit einer etwas anderen Namensgebung, die ich passender finde) für das for in mit den ListboxItems dann so machen:

Delphi-Quellcode:

type
  TFmxObjHelper = class helper for TFMXObject

  strict private
    procedure AddTypeOfObjects <T: class>(Parent: TFmxObject;
      var Arr: TArray<T>; var Count: Integer);
  public
    function ItemsOf<T: class>: TArray<T>;
  end;

procedure TFmxObjHelper.AddTypeOfObjects<T>(Parent: TFmxObject;
  var Arr: TArray<T>; var Count: Integer);
var
  Child: TFmxObject;
  I, z: Integer;
begin
  for I := 0 to Parent.childrenCount - 1 do
  begin
    Child := Parent.Children[I];

    if Child is T then
    begin
      if Length(Arr) = Count then SetLength(Arr, Count + 64);
      Arr[Count] := T(Child);
      Inc(Count);
    end;
    AddTypeOfObjects<T>(Child, Arr, Count);
  end;
end;

function TFmxObjHelper.ItemsOf<T>: TArray<T>;
var
  Count: Integer;
begin
  Count := 0;
  AddTypeOfObjects<T>(Self, Result, Count);
  SetLength(Result, Count);
end;


procedure TForm18.FormCreate(Sender: TObject);
var
  lbi: TListboxItem;
begin
  for lbi in ListBox1.ItemsOf<TListboxItem> do begin
    ShowMessage (lbi.text);
  end;
end;
  Mit Zitat antworten Zitat