Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Sortierung in VirtualStringTree (VST) (https://www.delphipraxis.net/139827-problem-mit-sortierung-virtualstringtree-vst.html)

RWarnecke 6. Sep 2009 12:49


Problem mit Sortierung in VirtualStringTree (VST)
 
Hallo zusammen,

ich glaube ich Suche mir noch einen Wolf nach Beispielen, wie ich in einem VST die Einträge sortiere mit Objekten. Alles was ich finde sind Beispiele mit Records. Ich habe folgendes Problem. Ich habe mehrere RootNodes, die jeweils mehrere Subnodes enthalten. Die Subnodes gehen aber nicht weiter als bis Level 1. Wenn alle Nodes noch zugeklappt sind, funktioniert meine Sortierung wunderbar. Wenn jetzt eine RootNode aufgeklappt ist, kann ich noch einmal von aufsteigend nach absteigend oder umgekehrt sorteiren lassen. Wenn ich dann nochmals auf den Header klicke, kommt eine EAccessViolation. Das passiert bei jeder Spalte.

Das ist jetzt mein jetziger Sourcecode :
Delphi-Quellcode:
type
  TOParentPos = class
  public
    Position : string;
    Textsnip : string;
  end;

  TOCatHeader = class(TOParentPos)
  public
    ID : Integer;
    Kategorie : string;
    Ueberschrift : string;
  end;

{...}

procedure TForm5.VST_1CompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  daten1: TOCatHeader;
  daten2: TOCatHeader;
begin
  daten1 := TOCatHeader(VST_1.GetNodeData(Node1)^);
  daten2 := TOCatHeader(VST_1.GetNodeData(Node2)^);
  case Column of
    0: Result := CompareValue(daten1.ID, daten2.ID);
    1: Result := CompareStr(daten1.Kategorie, daten2.Kategorie);
    2: Result := CompareStr(daten1.Ueberschrift, daten2.Ueberschrift);
  end;
end;

{...}

procedure TForm5.VST_1HeaderClick(Sender: TVTHeader; Column: TColumnIndex;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
      VST_1.SortTree(Column, Sender.SortDirection, True);
      if Sender.SortDirection = sdAscending then
        Sender.SortDirection := sdDescending
      else
        Sender.SortDirection := sdAscending;
  end;
end;
Ich möchte lediglich nur die RootNodes sortiert haben nach Kategorie oder Überschrift. Wo steckt der Fehler, dass er bei aufgeklappten rootnodes nur noch einmal die Sortierung wechselt ?

RWarnecke 7. Sep 2009 20:35

Re: Problem mit Sortierung in VirtualStringTree (VST)
 
Hallo zusammen,

hat denn keiner eine Idee ?

anse 7. Sep 2009 22:50

Re: Problem mit Sortierung in VirtualStringTree (VST)
 
OnHeaderClick sieht gut aus. Aber OnCompareNodes - das hier sieht verdächtig nach einem Cast Fehler aus:
Delphi-Quellcode:
daten1 := TOCatHeader(VST_1.GetNodeData(Node1)^);
daten2 := TOCatHeader(VST_1.GetNodeData(Node2)^);
Du sagst die AV kommt nur wenn Nodes ausgeklappt sind, also vermute ich daß es in OnCompareNodes zum Vergleich von Nodes 2. Ebene kommt die kein TOCatHeader sondern ein TOParentPos besitzen.

Das ist aber blanke Spekulation. Beim Debug-Start (Starten mit F9 aus Delphi heraus) bekommst du die exakte Code-Zeile vor die Füße geworfen in die Access Violation verursacht wird. Wenn du die hast wird dir bestimmt klar wo der Fehler steckt.

hoika 8. Sep 2009 08:06

Re: Problem mit Sortierung in VirtualStringTree (VST)
 
Hallo,

stand das wirklich so in den Beispielen ?

Delphi-Quellcode:
procedure TFormX.OnHeaderClick();
begin
  if Button<>mbLeft then Exit;

  with Sender do
  begin
    if Column=SortColumn then
    begin
      SortDirection:= TSortDirection(1-ord(SortDirection));
    end
    else
    begin
      SortColumn:= Column;
    end;
  end;
end;
Das SortTree macht der VST beim Header-Click selber.
Es wird nur verwendet, wenn man im Code sortieren will.

Das OnCompareNodes ist korrekt, abgesehen davon, dass Sender statt
der direkten Variable benutzen solltest.


#Update#
Ich habe den VST allerdings bisher nur als ListView-Erasatz benutzt (nur Root-Nodes).


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 Uhr.

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