AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Problem mit Sortierung in VirtualStringTree (VST)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Sortierung in VirtualStringTree (VST)

Ein Thema von RWarnecke · begonnen am 6. Sep 2009 · letzter Beitrag vom 8. Sep 2009
Antwort Antwort
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Problem mit Sortierung in VirtualStringTree (VST)

  Alt 6. Sep 2009, 13:49
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#2

Re: Problem mit Sortierung in VirtualStringTree (VST)

  Alt 7. Sep 2009, 21:35
Hallo zusammen,

hat denn keiner eine Idee ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Problem mit Sortierung in VirtualStringTree (VST)

  Alt 7. Sep 2009, 23:50
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.
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Problem mit Sortierung in VirtualStringTree (VST)

  Alt 8. Sep 2009, 09:06
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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:05 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