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/)
-   -   Problem mit VirtualStringTree (https://www.delphipraxis.net/194317-problem-mit-virtualstringtree.html)

stifflersmom 8. Nov 2017 13:19

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:
       // 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;
Irgendwie mach ich da was falsch und ich sehe es partout nicht...

Aviator 8. Nov 2017 13:50

AW: Problem mit VirtualStringTree
 
Also deine Angaben zu dem Problem sind doch etwas dürftig. Was macht die Methode
Delphi-Quellcode:
FindNodebyModNr
, was ist
Delphi-Quellcode:
ArtikelTecDocRec
, was macht
Delphi-Quellcode:
AddVSTStructure
, 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.

Generell ist es aber so, dass du immer
Delphi-Quellcode:
Node.checkType := ctCheckBox;
setzt und vorher deinen Level gar nicht wirklich prüfst. Scheinbar gibt dir deine
Delphi-Quellcode:
FindNodebyModNr
Methode da ein falsches Ergebnis zurück.

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.

stifflersmom 8. Nov 2017 14:10

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;

Aviator 8. Nov 2017 16:39

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:
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);
In diesem Ausschnitt prüfst du auf die lokale Variable
Delphi-Quellcode:
Level
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
Delphi-Quellcode:
GetNodeLevel(Node)
. 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.

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:
toAutoSpan
in den
Delphi-Quellcode:
TreeOptions
eingeschaltet hättest und im OnGetText die Column 0 und/oder Column 1 der Node auf Level 2 nicht oder nicht richtig behandelst.


Hast du denn mal Schritt für Schritt gedebuggt oder auch mal Teile des SourceCodes auskommentiert um Schritt für Schritt vorzugehen?

stifflersmom 8. Nov 2017 17:29

AW: Problem mit VirtualStringTree
 
Zitat:

Zitat von Aviator (Beitrag 1385704)
Hi,

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

Uupps, ja, das könnte es sein. Da bin ich gedanklich auch ganz falsch davor, das werde ich mir morgen früh noch mal genau ansehen.

stifflersmom 9. Nov 2017 07:19

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

Aviator 9. Nov 2017 08:37

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:
AddChild()
Methode weg zu
Delphi-Quellcode:
RootNodeCount
und den
Delphi-Quellcode:
InitNode()
und
Delphi-Quellcode:
InitChildren()
Events hingehen. Das wäre dann der optimalere Fall für die Verwendung des VST.

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