AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeview sortieren (FMX) klappt nicht...

Ein Thema von idontknow · begonnen am 13. Sep 2017 · letzter Beitrag vom 14. Sep 2017
 
idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TTreeview sortieren (FMX) klappt nicht...

  Alt 14. Sep 2017, 12:40
Okay, habe mittlerweile selber rausgefunden, das für die oberste Ebene des TTreeView die onCompare-Methode verwendet werden muss. Das funktioniert auch.

In meinem Programm, wo ich während der Realisierung über die Schwierigkeiten mit dem Sortieren des Treeviews gestolpert bin, habe ich jedoch Items, die wiederum SubItems haben. Habe jetzt folgenden Weg ausprobiert, der die Items der obersten Ebene einwandfrei sortiert. Die SubItems behalten jedoch ihre Sortierung bei, erst bei nochmaligem Aufruf meiner Methode "SortItems" werden dann auch die SubItems in der gewünschten Weise sortiert.

Und wieder stellt sich die Frage: Was mache ich falsch?

Hat jemand eine Idee?

Zur Erläuterung:
Nach Druck auf BtFillTreeView:
0
0
1
2
usw.
1
0
1
2
usw.
usw.

Nach dem ersten Aufruf von SortItems:
9
0
1
2
usw.
8
0
1
2
usw.
Nach einem weiteren Aufruf von SortItems:
9
9
8
7
usw.
8
9
8
7
usw.

Hier mein Testprogramm:
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts,
  FMX.TreeView;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    BtFillTreeView: TButton;
    BtSortDesc: TButton;
    BtSortAsc: TButton;
    procedure BtFillTreeViewClick(Sender: TObject);
    procedure BtSortDescClick(Sender: TObject);
    procedure BtSortAscClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FlagSortDescending: Boolean;
    function TreeView1Compare(Item1, Item2: TTreeViewItem): Integer;
    function CompareItems(Item1, Item2: TFmxObject): Integer;
    procedure SortItems;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.BtFillTreeViewClick(Sender: TObject);
var
  TreeViewItem, TreeViewSubItem: TTreeViewItem;
  i, j: Integer;
begin
  for i := 0 to 9 do
  begin
    TreeViewItem := TTreeViewItem.Create(TreeView1);
    TreeViewItem.Parent := TreeView1;
    TreeViewItem.Text := i.ToString;
    TreeViewItem.Tag := i;
    for j := 0 to 9 do
    begin
      TreeViewSubItem := TTreeViewItem.Create(TreeView1);
      TreeViewSubItem.Parent := TreeViewItem;
      TreeViewSubItem.Text := j.ToString;
      TreeViewSubItem.Tag := j;
    end;
  end;
end;

procedure TForm1.BtSortDescClick(Sender: TObject);
begin
  FlagSortDescending := TRUE;
  SortItems; // das sortiert nur die "Ebene 0"...
  SortItems; // das sortiert dann auch die SubItems...
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TreeView1.OnCompare := TreeView1Compare;
end;

procedure TForm1.BtSortAscClick(Sender: TObject);
begin
  FlagSortDescending := FALSE;
  SortItems; // das sortiert nur die "Ebene 0"...
  SortItems; // das sortiert dann auch die SubItems...
end;

procedure TForm1.SortItems;
var
  i: Integer;
  TreeViewItem: TTreeViewItem;
begin
  TreeView1.Sorted := FALSE;
  TreeView1.Sorted := TRUE;

  for i := 0 to TreeView1.Count-1 do
  begin
    TreeViewItem := TreeView1.Items[i];
    TreeViewItem.Sort(CompareItems);
  end;

  TreeView1.Repaint;
end;

function TForm1.TreeView1Compare(Item1, Item2: TTreeViewItem): Integer;
begin
  Result := Item1.Tag - Item2.Tag;
  if FlagSortDescending then
    Result := -Result;
end;

function TForm1.CompareItems(Item1, Item2: TFmxObject): Integer;
begin
  Result := Item1.Tag - Item2.Tag;
  if FlagSortDescending then
    Result := -Result;
end;

end.
Oliver

Geändert von idontknow (14. Sep 2017 um 12:52 Uhr)
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 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