![]() |
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:
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 ?
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; |
Re: Problem mit Sortierung in VirtualStringTree (VST)
Hallo zusammen,
hat denn keiner eine Idee ? |
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:
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.
daten1 := TOCatHeader(VST_1.GetNodeData(Node1)^);
daten2 := TOCatHeader(VST_1.GetNodeData(Node2)^); 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. |
Re: Problem mit Sortierung in VirtualStringTree (VST)
Hallo,
stand das wirklich so in den Beispielen ?
Delphi-Quellcode:
Das SortTree macht der VST beim Header-Click selber.
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; 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 18:57 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