![]() |
Problem mit VirtualStringTree
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,
vielleicht kann mir jemand kurz helfen. Ich versuche in einem VS in der 2 Unterebene ein Checkbox darzustellen, allerdings taucht diese immer bei mir in der 1 Unterebene auf (da, wo im Screenshot immer Node steht, soll die Checkbox hin). Im Anhang mal ein kleiner Screenshot wie das aussieht. Hier mal die verkürzte Version wie ich die Nodes dem VS hinzufüge
Delphi-Quellcode:
Irgendwie mach ich da was falsch und ich sehe es partout nicht...
// Fahrzeugmodellreihe
Node := FindNodebyModNr(VS_TD, q_td_fahrzeuge.FieldByName('kModnr').AsInteger, q_td_fahrzeuge.FieldByName('hernr').AsInteger); If Node = NIL Then Begin Node := FindNodebyherNr(VS_TD,q_td_fahrzeuge.FieldByName('herNr').AsInteger); ArtikelTecDocRec.level :=1; ArtikelTecDocRec.HerNr := q_td_fahrzeuge.FieldByName('herNr').AsInteger; ArtikelTecDocRec.artikel_id := -1; Node.CheckType := ctNone; Node := AddVSTStructure(VS_TD, Node, ArtikelTecDocRec); End; // Fahrzeugvariation ArtikelTecDocRec.level :=2; Node.checkType := ctCheckBox; AddVSTStructure(VS_TD, Node, ArtikelTecDocRec); q_td_fahrzeuge.Next; |
AW: Problem mit VirtualStringTree
Also deine Angaben zu dem Problem sind doch etwas dürftig. Was macht die Methode
Delphi-Quellcode:
, was ist
FindNodebyModNr
Delphi-Quellcode:
, was macht
ArtikelTecDocRec
Delphi-Quellcode:
, usw.? Poste mal etwas mehr Quellcode in denen auch die Deklarationen der Variablen zu sehen ist und die selbst definierten Methoden die in deinem Auszug verwendet werden.
AddVSTStructure
Generell ist es aber so, dass du immer
Delphi-Quellcode:
setzt und vorher deinen Level gar nicht wirklich prüfst. Scheinbar gibt dir deine
Node.checkType := ctCheckBox;
Delphi-Quellcode:
Methode da ein falsches Ergebnis zurück.
FindNodebyModNr
PS: Welche VirtualTreeView Version verwendest du? Wenn du wirklich noch Delphi 2006 einsetzt, dann kann das nicht die aktuelle Version sein. Die wird nämlich nur noch bis XE3 offiziell unterstützt und beinhaltet auch Generics. Falls Delphi 2006 nicht mehr stimmen sollte, dann korrigier das doch bitte. |
AW: Problem mit VirtualStringTree
Nein, es ist noch 2006 und der VirtualStringTree ist in der Version 5.3.0 und hier die angesprochenen Teile vom code:
Delphi-Quellcode:
// Artikel-TecDoc-Fahrzeug-Baum
type PArtikelTecDocrec = ^TArtikelTecDocrec; TArtikelTecDocrec = record level:Byte; HerNr:Integer; artikel_id: Integer; kTypNr: Integer; kModNr:Integer; hersteller:String; statTyp:String; bjvon:String; bjbis:String; bezeichnung_vehicle:String; bezeichnung_vehicletype:String; kw:Integer; lit:Integer; zylinder:Byte; end; function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TArtikelTecDocrec): PVirtualNode; var Data: PArtikelTecDocrec; level: Integer; begin Result := AVST.AddChild(ANode); Data := AVST.GetNodeData(Result); if Level = 0 then Result.CheckType := ctNone; Avst.ValidateNode(Result, False); If arecord.Level = 2 Then ANode.CheckType := ctCheckBox; Data^.level := Arecord.level; Data^.HerNr := Arecord.HerNr; Data^.artikel_id := Arecord.artikel_id; Data^.kTypNr := Arecord.kTypNr; Data^.kModNr := Arecord.kModNr; Data^.hersteller := Arecord.hersteller; Data^.statTyp := Arecord.statTyp; Data^.bjvon := Arecord.bjvon; Data^.bjbis := Arecord.bjbis; Data^.bezeichnung_vehicle := Arecord.bezeichnung_vehicle; Data^.bezeichnung_vehicletype := Arecord.bezeichnung_vehicletype; Data^.kw := Arecord.kw; Data^.lit := Arecord.lit; Data^.zylinder := Arecord.zylinder; end; function FindNodebyherNr(aTree: TBaseVirtualTree; aherNr: Integer): PVirtualNode; var NodeData: PArtikelTecDocrec; begin Result := aTree.GetFirst; while Assigned(Result) do begin NodeData := (aTree.GetNodeData(Result)); if (NodeData.HerNr = aherNr) then Exit; Result := aTree.GetNext(Result); end; end; function FindNodebyModNr(aTree: TBaseVirtualTree; aModNr, aherNr: Integer): PVirtualNode; var NodeData: PArtikelTecDocrec; begin Result := aTree.GetFirst; while Assigned(Result) do begin NodeData := (aTree.GetNodeData(Result)); if (NodeData.HerNr = aherNr) AND (NodeData.kModNr = aModNr) then Exit; Result := aTree.GetNext(Result); end; end; |
AW: Problem mit VirtualStringTree
Hi,
habe mir deinen SourceCode jetzt mal angeschaut. Ich muss leider sagen, dass diverse Teile doch sehr "schwierig" programmiert sind. Hiermit meine ich den Auszug aus deinem ersten Post und die Methode AddVSTStructure. Aber ok. Das kann man ja verbessern und ausbauen. :-D Hier mal ein Knackpunkt, der aber bestimmt nicht die Lösung deines Problems sein wird:
Delphi-Quellcode:
In diesem Ausschnitt prüfst du auf die lokale Variable
function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
ARecord: TArtikelTecDocrec): PVirtualNode; var Data: PArtikelTecDocrec; level: Integer; begin Result := AVST.AddChild(ANode); Data := AVST.GetNodeData(Result); if Level = 0 then Result.CheckType := ctNone; Avst.ValidateNode(Result, False);
Delphi-Quellcode:
die aber nicht initialisiert ist. Also kannst du Glück haben, dass da eine 0 drin steht oder aber auch nicht. Prüfe besser mit der VST Funktion
Level
Delphi-Quellcode:
. Da bekommst du dann den Level der Node her. Später kannst du dann das alles nur noch anhand deiner Daten ableiten und den Tree nur noch zur Anzeige nutzen.
GetNodeLevel(Node)
Dann hast du in dem ersten Codeabschnitt noch den Fall, dass du folgendes ausführst:
Delphi-Quellcode:
// Fahrzeugvariation
ArtikelTecDocRec.level :=2; // Hier setzt du den Level des neuen Data Records auf 2 Node.checkType := ctCheckBox; // An dieser Stelle wird der CheckType der Node gesetzt. Allerdings ist hier die Node noch die Node auf dem ersten Level. Daher wird auch auf Level 1 eine CheckBox dargestellt AddVSTStructure(VS_TD, Node, ArtikelTecDocRec); // Und erst hier wird die neue Node auf Level 2 erstellt Aus dem Screenshot kommt das nicht so deutlich raus. Aber wäre es möglich, dass die Spalte einfach nicht breit genug ist und daher die CheckBox irgendwie übermalt wird? Es steht ja auch noch "Node" davor. Das sieht für mich so aus, als das du
Delphi-Quellcode:
in den
toAutoSpan
Delphi-Quellcode:
eingeschaltet hättest und im OnGetText die Column 0 und/oder Column 1 der Node auf Level 2 nicht oder nicht richtig behandelst.
TreeOptions
Hast du denn mal Schritt für Schritt gedebuggt oder auch mal Teile des SourceCodes auskommentiert um Schritt für Schritt vorzugehen? |
AW: Problem mit VirtualStringTree
Zitat:
|
AW: Problem mit VirtualStringTree
Jo, das war's tatsächlich. da war ich tatsächlich von einer falschen Reihenfolge ausgegangen, jetzt passt das aber.
Den checkType setze ich jetzt direkt in der Funktion AddVstStructure und bin dann auch "save" das richtige Level erwischt zu haben. Was den Code generell angeht, gebe ich dir Recht, der ist hier so nebenbei mit Copy&Paste aus anderen Teilen zusammengepanscht worden, aber er wird eh nciht überleben, den baue ich jetzt einmal komplett neu auf. Vielen Dank |
AW: Problem mit VirtualStringTree
Wenn du deinen SourceCode sowieso überarbeiten willst, dann solltest du davon ausgehend deine Daten auch nur noch in einer ObjectList oder in Array of Records speichern und diese zur Auswertung nutzen. Der Tree sollte nur zur Anzeige von den in der Liste stehenden Daten verwendet werden.
Zudem würde ich von der
Delphi-Quellcode:
Methode weg zu
AddChild()
Delphi-Quellcode:
und den
RootNodeCount
Delphi-Quellcode:
und
InitNode()
Delphi-Quellcode:
Events hingehen. Das wäre dann der optimalere Fall für die Verwendung des VST.
InitChildren()
Leider wird das in den Advanced Demos des VST nicht oder nur sehr wenig behandelt (Stand vor ca. 2 Jahren). Ich meine aber, dass ich hier irgendwo mal eine Beispielanwendung hochgeladen habe in der das gut erklärt war. Aber es ist auch kein Hexenwerk. Das findest du wahrscheinlich auch selbst raus. Aber schön das ich dir helfen konnte und du den Fehler beseitigt hast. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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