Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi FMX TListView mit Seattle (https://www.delphipraxis.net/188840-fmx-tlistview-mit-seattle.html)

Sherlock 12. Apr 2016 09:28

FMX TListView mit Seattle
 
Hallo zusammen. Ich versuche seit ein paar Tagen aus der Delphi-Referenz durchsuchenFMX.ListView in der Version von Seattle schlau zu werden. Es klappt so leidlich, aber ein bis zwei Dinge verstehe ich einfach nicht.
  1. Wie kann ich Multiselect deaktivieren? Papa Google findet leider nur Infos zur alten TListView und mit Seattle wurde ja reichlich refactored. Es gibt schlicht keine Property im Sinne von MultiSelect oder SelectionType
  2. Wenn ich das ListView in den Editmodus schalte, haben alle Items unweigerlich eine Checkbox, lässt sich das unterbinden?

Abgesehen davon, daß manche der Beispiele in Laufzeitfehlern enden, bauen sie zu 99% auf LiveBindings auf, so daß die ListView schon zur Designzeit fix und fertig ist - nicht wirklich didaktisch wertvoll. Hat einer von Euch Erfahrung mit der FMX.TListView von Seattle?

Sherlock

DeddyH 12. Apr 2016 11:23

AW: FMX TListView mit Seattle
 
Ich habe mich auch lange mit der TListView herumgeärgert. Über GetIt habe ich mir nun die ksComponents installiert, darunter ist eine Komponente namens TksTableView, die ist einer TListView ähnlich, allerdings IMO einfacher zu handhaben.

Sherlock 12. Apr 2016 15:04

AW: FMX TListView mit Seattle
 
Danke für den Tipp, ich schau die mir mal an.

Sherlock

Harry Stahl 12. Apr 2016 20:01

AW: FMX TListView mit Seattle
 
Zitat:

Zitat von Sherlock (Beitrag 1335370)
Hallo zusammen. Ich versuche seit ein paar Tagen aus der Delphi-Referenz durchsuchenFMX.ListView in der Version von Seattle schlau zu werden. Es klappt so leidlich, aber ein bis zwei Dinge verstehe ich einfach nicht.
  1. Wie kann ich Multiselect deaktivieren? Papa Google findet leider nur Infos zur alten TListView und mit Seattle wurde ja reichlich refactored. Es gibt schlicht keine Property im Sinne von MultiSelect oder SelectionType
  2. Wenn ich das ListView in den Editmodus schalte, haben alle Items unweigerlich eine Checkbox, lässt sich das unterbinden?

Abgesehen davon, daß manche der Beispiele in Laufzeitfehlern enden, bauen sie zu 99% auf LiveBindings auf, so daß die ListView schon zur Designzeit fix und fertig ist - nicht wirklich didaktisch wertvoll. Hat einer von Euch Erfahrung mit der FMX.TListView von Seattle?

Sherlock

Mit
Delphi-Quellcode:
Listview1.ItemAppearance.ItemEditAppearance := 'Custom';
kannst Du die Checkboxen für den Editmode ausschalten, hast dann aber keine extra Auswahlmöglichkeit mehr.

Wenn nur ein Item auswählbar sein soll, kannst Du auch im OnItemClick-Event reagieren:

Delphi-Quellcode:
procedure TForm33.ListView1ItemClick(const Sender: TObject;
  const AItem: TListViewItem);
var
  L: Integer;
begin
  for L := 0 to Listview1.Items.Count-1 do begin
    Listview1.Items[L].Checked := Listview1.Items[L] = AItem;
  end;
end;

Sherlock 13. Apr 2016 07:00

AW: FMX TListView mit Seattle
 
Zitat:

Zitat von Harry Stahl (Beitrag 1335434)
Mit
Delphi-Quellcode:
Listview1.ItemAppearance.ItemEditAppearance := 'Custom';
kannst Du die Checkboxen für den Editmode ausschalten, hast dann aber keine extra Auswahlmöglichkeit mehr.

Bei mir sind die Checkboxen ohnehin nicht anklickbar...ich dachte das muss so sein.
Zitat:

Zitat von Harry Stahl (Beitrag 1335434)
Wenn nur ein Item auswählbar sein soll, kannst Du auch im OnItemClick-Event reagieren:

Delphi-Quellcode:
procedure TForm33.ListView1ItemClick(const Sender: TObject;
  const AItem: TListViewItem);
var
  L: Integer;
begin
  for L := 0 to Listview1.Items.Count-1 do begin
    Listview1.Items[L].Checked := Listview1.Items[L] = AItem;
  end;
end;

Ah, OK. Bei der Gelegenheit, wo ich das sehe, und Dich grad "dran" hab. Wieso gibt es eigentlich keinen aufzählbaren Container für die einzelnen ListBoxItems bei einer FMX.TListBox? Oder hab ich den bloß übersehen?

Vielen Dank!

Sherlock

Harry Stahl 13. Apr 2016 17:03

AW: FMX TListView mit Seattle
 
Zitat:

Zitat von Sherlock (Beitrag 1335445)
Ah, OK. Bei der Gelegenheit, wo ich das sehe, und Dich grad "dran" hab. Wieso gibt es eigentlich keinen aufzählbaren Container für die einzelnen ListBoxItems bei einer FMX.TListBox? Oder hab ich den bloß übersehen?

Vielen Dank!

Sherlock

Mit "aufzählbaren Container" meinst Du die "Items"? TListbox hat in FMX sowohl die "Items", welches nur Strings sind und die "ListItems", welches die Liste der TListBoxItems repräsentiert.

Sherlock 14. Apr 2016 07:13

AW: FMX TListView mit Seattle
 
Oh. Mein. Gott. Wald...Bäume...ich danke Dir!
Äh, Edith sagt "Nein". Ich muß wohl erklären was ich machen will:
Delphi-Quellcode:
 
var BoxITem: TListBoxItem;
.
.
.
 for BoxItem in SomeListBox.ListItems do
Das geht nicht, weil ListItems nicht wirklich die Liste ist, sondern mit einem Index aufgerufen werden muß und nur ein Item zurück gibt.

Sherlock

Harry Stahl 14. Apr 2016 22:06

AW: FMX TListView mit Seattle
 
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;

Rollo62 15. Apr 2016 06:36

AW: FMX TListView mit Seattle
 
Ich benutze for loop mit Hilfsvariable
Delphi-Quellcode:
  for I := 0 to Count-1 do
oder

Delphi-Quellcode:
  for I := Low(Items) to High(Items) do
ich weiss das es etwas mehr code und etwas weniger Tipparbeit braucht,
aber gibt es ausserdem noch einen wirkichen Grund
Delphi-Quellcode:
for Item in ItemList do
zu benutzen ?

Das obere macht eigentlich nie Probleme, und die Performance ist auch OK.
Vielleicht bei 5 Mio. Items sollte man drüber nachdenken, aber im täglichen Leben reicht doch eine Version.

Rollo


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr.

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