AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit VirtualStringTree

Ein Thema von stifflersmom · begonnen am 8. Nov 2017 · letzter Beitrag vom 9. Nov 2017
Antwort Antwort
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
379 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Problem mit VirtualStringTree

  Alt 8. Nov 2017, 14:19
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...
Miniaturansicht angehängter Grafiken
vstd.jpg  

Geändert von stifflersmom ( 8. Nov 2017 um 14:23 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Problem mit VirtualStringTree

  Alt 8. Nov 2017, 14:50
Also deine Angaben zu dem Problem sind doch etwas dürftig. Was macht die Methode FindNodebyModNr , was ist ArtikelTecDocRec , was macht 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 Node.checkType := ctCheckBox; setzt und vorher deinen Level gar nicht wirklich prüfst. Scheinbar gibt dir deine 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.
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
379 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Problem mit VirtualStringTree

  Alt 8. Nov 2017, 15:10
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;

Geändert von stifflersmom ( 8. Nov 2017 um 15:13 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Problem mit VirtualStringTree

  Alt 8. Nov 2017, 17:39
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.

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 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 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 toAutoSpan in den 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?
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
379 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Problem mit VirtualStringTree

  Alt 8. Nov 2017, 18:29
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.
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
379 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Problem mit VirtualStringTree

  Alt 9. Nov 2017, 08:19
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
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Problem mit VirtualStringTree

  Alt 9. Nov 2017, 09:37
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 AddChild() Methode weg zu RootNodeCount und den InitNode() und 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.
  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 00:02 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