Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Daten-Rekord zu TreeView hinzufügen - Problem/AV (https://www.delphipraxis.net/190739-daten-rekord-zu-treeview-hinzufuegen-problem-av.html)

Jim Carrey 2. Nov 2016 09:46


Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Ich bin scheinbar wieder zu doof die Sachen anzuwenden, die ich einst gelernt habe.
Für eine VirtualStringTree die nur sehr wenige Nodes enthalten soll (weniger als 10), benutze ich ein Rekord und folgendes Konstrukt:

Delphi-Quellcode:
type
 PVSTData = ^TVSTData;

 TVSTData = packed record
  sTitle, sInformation: string;
 end;
Delphi-Quellcode:
procedure AddVSTStructure(aVST: TVirtualStringTree; aRecord: TVSTData);
var
 Data: PVSTData;
 Node: PVirtualNode;
begin
 Node := aVST.AddChild(nil);
 Data := aVST.GetNodeData(Node);

 Data^ := aRecord;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 aVSTData: TVSTData;
begin
 aVSTData.sTitle:= 'Title';
 aVSTData.sInformatio := 'Info';
 AddVSTStructure(VirtualStringTree1, aVSTData);
end;

procedure TForm1.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);
 Finalize(Data^);
end;
Den Code AddVSTStructure habe ich vor langer Zeit hier im Forum gefunden und er hat auch immer funktioniert.
Nur bei diesem simplen Beispiel erhalte ich eine AV beim Klicken auf den Button (Zugriffsverletzung). Der node wird hinzugefügt, es gibt aber eine AV.
Das Problem ist: mein Testprojekt enthält nur diesen Button, das VST und sonst nichts.

Daniel 2. Nov 2016 09:58

AW: Ich bin wieder zu doof - TreeView
 
Gibt Deinem Beitrag bitten dennoch einen Aussagekräftigen Titel - das macht es für andere leichter, diesen zu finden, wenn sie ein ähnliches Problem haben.
Danke Dir.

Headbucket 2. Nov 2016 10:11

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
In welcher Zeile tritt denn die access violation auf?
Mir ist aufgefallen, dass bei deiner AddVSTStructure Methode der Aufruf von ValidateNode fehlt. Aber das hat nichts mit der access violation zu tun... .

Das ganze sollte jedoch so aussehen:
Delphi-Quellcode:
function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TTreeData): PVirtualNode;
var
  Data: PTreeData;
begin
  Result:=AVST.AddChild(ANode);
  Data:=AVST.GetNodeData(Result);
  Avst.ValidateNode(Result, False);
  Data^.FCaption:=ARecord.FCaption;
end;
Zitat:

The method ValidateNode will initialise the nodes. This is important at the freeing of the data, because otherwise the data will be released into the memory. The first parameter
must be the node you want to initialise, the second if you also want to initialise its children.
Wie sieht denn deine GetText-Methode des VST aus?

Grüße
Headbucket

Aviator 2. Nov 2016 10:13

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Also am SourceCode selbst kann ich keinen Fehler erkennen. Bist du mal mit dem Debugger durchgegangen und hast dir (ggf. anhand des StackTraces) mal angeschaut wo er die AV bringt?

EDIT: Von der Methode AddChild() sollte man generell Abstand nehmen. Siehe auch den Kommentar über dere AddChild() Methode in der VirtualTrees.pas

Dann brauchst du auch keine ValidateChildren mehr, da du die Daten dann selbst vorhalten musst.

Jim Carrey 2. Nov 2016 10:14

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Wo die AV auftritt weiß ich nicht. Der Code hat wie gesagt bisher immer wunderbar funktioniert.

Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);

 CellText := Data.sTitle;
end;
Ich hasse VirtualStringTree einfach.
Ich dachte ich kann schnell einen Node mit 1 Children erzeugen und delbst das klappt nicht.

Edit:
Zitat:

EDIT: Von der Methode AddChild() sollte man generell Abstand nehmen. Siehe auch den Kommentar über dere AddChild() Methode in der VirtualTrees.pas
Naja, weil ich ja eh weniger als 10 Nodes hinzufüge dieses mal dachte ich, nehme ich die "einfache" Variante ohne TObjectList und all dem Quark.

Aviator 2. Nov 2016 10:16

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352410)
Wo die AV auftritt weiß ich nicht. Der Code hat wie gesagt bisher immer wunderbar funktioniert.

Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);

 CellText := Data.sTitle; // <------------------  HIER FEHLT EIN ZIRKUMFLEX
end;

Das sollte der Fehler sein. Richtig müsste es lauten:
Delphi-Quellcode:
CellText := Data^.sTitle;

Jim Carrey 2. Nov 2016 10:18

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Aviator (Beitrag 1352412)
Das sollte der Fehler sein. Richtig müsste es lauten:
Delphi-Quellcode:
CellText := Data^.sTitle;

AV kommt noch immer beim Beenden des Programms obwohl ich beim beenden Der Demo absolut nichts mache :shock:

Also im Prinzip einfach:
wenn ich die Zeile im Button mit AddVSTStructure() weglasse, kommt keine AV.

Headbucket 2. Nov 2016 10:18

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Data ist ein Zeiger. Du versuchst also in GetText auf die Adresse dieses Zeigers zuzugreifen und dort dann auf den Record...das klappt natürlich nicht. Du solltest auf den INHALT des Zeigers zugreifen:
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);
 CellText := Data^.sTitle;
end;
Hast du ValidateNode hinzugefügt?

Grüße
Headbucket

Jim Carrey 2. Nov 2016 10:20

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich baue euch mal eine Demo.

Aviator 2. Nov 2016 10:24

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Lass mal das FreeNode Event komplett weg. Nimm es aus dem Objektinspektor einfach mal raus. Spielt jetzt erstmal keine Rolle ob ein Memory Leak ensteht oder nicht. Wenn dann keine AV mehr kommt, dann kann ich es mir nur noch so erklären, dass es an dem Finalize() liegt. Obwohl das eigentlich kein Problem machen sollte.

Das Ding ist nur, dass beim Klick auf den Button noch kein FreeNode ausgeführt wird, deshalb dürfte der Fehler auch da nicht drin liegen.

Welche VST Version verwendest du denn?

Zitat:

Zitat von Jim Carrey (Beitrag 1352410)
Ich hasse VirtualStringTree einfach.
Ich dachte ich kann schnell einen Node mit 1 Children erzeugen und delbst das klappt nicht.

Wenn du einmal einen funktionierenden VST hast und dich richtig mit der Komponente beschäftigst/beschäftigen kannst, dann wirst du ihn lieben. :stupid:

Zitat:

Zitat von Jim Carrey (Beitrag 1352415)
Ich baue euch mal eine Demo.

Ja das wäre mal nicht schlecht. :P

Jim Carrey 2. Nov 2016 10:26

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Demo befindet sich im Beitrag oben drüber =)
Da ist nur das Nötigste drin.

Aviator 2. Nov 2016 10:36

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352417)
Demo befindet sich im Beitrag oben drüber =)
Da ist nur das Nötigste drin.

Also beim Start deiner fertigen Exe habe ich keine AV bekommen. :shock:

Nachdem ich sie dann neu compiliert habe (auch im Release Modus), kam sie dann.

Die AV tritt bei mir in der folgenden Zeile auf:
Delphi-Quellcode:
Data^ := aRecord;
Scheinbar gibt es da irgendwie Probleme beim Kopieren der Daten. Auf
Delphi-Quellcode:
sInformation
kann beim Debuggen z.B. nicht zugegriffen werden. Beim Debuggen durch den Disassebly Code bleibt er in der Methode
Delphi-Quellcode:
UStrAsg
hängen die von
Delphi-Quellcode:
CopyRecord
aufgerufen wird. Es ist also wohl keine gute Idee einen Record zu übergeben und den dann weiterzuverarbeiten.

Auch das Umschreiben auf einen normalen record anstatt eines packed record hat bei mir nichts gebracht.

EDIT: Vielleicht kann jaenicke dazu noch was sagen. Er benutzt den VST ja auch häufig und kann dir bei dem Fehler bestimmt noch besser helfen.

Alternativ bleibt wohl, dass du nicht über eine Zwischenprozedur gehst oder zumindest über eine, die die Daten nicht übergeben bekommt. Oder du steigst auf eine Miniklasse um. Ist zwar vielleicht etwas overkill, aber wird den Fehler wohl beheben und du hast mehr Möglichkeiten in der Zukunft.

Jim Carrey 2. Nov 2016 10:38

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Das ist sehr seltsam. Früher habe ich ausschließlich diese "Dirty-Methode" benutzt und hatte nie Probleme :cry:
Ich habe gerade noch rausbekommen, dass die AV nur kommt, wenn man mindestens 2x den Button drückt.

Jim Carrey 2. Nov 2016 10:58

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das Ganze jetzt mal zum Test auf eine TObjectList umgestellt und es funktioniert ohne Fehler.
Dann muss ich wohl doch die TObjectList nehmen :(

Gleich nach dem Essen muss ich dann nur noch rausbekommen, wie man Unterknoten einfügt und betitelt.

rokli 2. Nov 2016 11:29

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Moin!

sag mal, fehlt bei Dir möglicherweise die Größenzuweisung?

Delphi-Quellcode:
   VST.NodeDataSize   := SizeOf(TTreeData);

Gruß

Jim Carrey 2. Nov 2016 11:54

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
- Problem hat sich erledigt, ich benutze letzten Endes das VST doch nicht, da es mich zu sehr nervt :lol:

Aviator 2. Nov 2016 13:27

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352426)
- Problem hat sich erledigt, ich benutze letzten Endes das VST doch nicht, da es mich zu sehr nervt :lol:

Komisch. :roll:
Ihr gebt immer alle so schnell auf wenn mal etwas nicht funktioniert. Und dabei ist der VST eigentlich sehr einfach zu benutzen wenn man ihn mal verstanden hat. :shock:

Jim Carrey 2. Nov 2016 14:07

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Naja. Das VST sieht schöner aus keine Frage. Aber das ListView kann ich viel einfacher speichern und laden.
Das VST speichert mir nur irgendwelche Dateien mit kryptischen Inhalt.
Das ist auch ein Grund.

Jim Carrey 2. Nov 2016 16:01

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Wie würde ich bei diesem Beispiel denn an den String "sInformation" kommen und es im Child eines Nodes anzeigen lassen?

Aviator 2. Nov 2016 17:07

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352461)
Wie würde ich bei diesem Beispiel denn an den String "sInformation" kommen und es im Child eines Nodes anzeigen lassen?

Also generell werden Daten eigentlich der Node zugeordnet, die auch später die Informationen anzeigen soll. Man kann natürlich auch auf die Node Daten des Parents zugreifen und sich dort die Informationen ziehen.

Hier mal ein Beispiel wie das aussehen könnte (nur hier im Editor runtergetippt).

Das wäre jetzt der Fall, wenn die Daten der Node zugeordnet werden, welche diese auch anzeigen soll.
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
  Data := VirtualStringTree1.GetNodeData(Node);

  case Sender.GetNodeLevel(Node) of
    0: CellText := Data^.sTitle;
    1: CellText := Data^.sInformation;
  end;
end;
Das wäre jetzt der Fall, wenn die Daten vom Parent gezogen werden.
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
  case Sender.GetNodeLevel(Node) of
    0:
    begin
      Data := Sender.GetNodeData(Node);
      CellText := Data^.sTitle;
    end;

    1:
    begin
      Data := Sender.GetNodeData(Node^.Parent); // Hier kann man ja sicher sein, dass ein Parent existiert, da der NodeLevel 1 ist
      CellText := Data^.sInformation;
    end;
  end;
end;
Eigentlich nicht so kompliziert. Du musst eben nur die richtige Datenstruktur im Hintergrund haben um ordentlich damit arbeiten zu können. Alternativ zu den Records kannst du auch Klassen verwenden (mache ich lieber). Die lassen sich dann einfacher mit ObjectLists speichern und das FreeNode Event fällt dadurch auch weg. Zusätzlich kann man statt AddChild() die Events OnInitNode() und OnInitChildren() verwenden, was den virtuellen Modus nochmal etwas besser herausstechen lässt.

Wenn du es dann ganz extrem machen willst, dann kannst du den Klassen auch jeweils ein Interface spendieren und pro NodeLevel eine eigene Klasse hinterlegen. Dieses Interface stellt dann bspw. eine GetText() Methode zur Verfügung mit der sich der Tree bequem die anzuzeigenden Daten ziehen kann.

Jim Carrey 2. Nov 2016 17:51

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Danke für die Hilfe!
Ich weiß jetzt woran ich gescheitert bin. An dieser Zeile
Delphi-Quellcode:
//
Sender.GetNodeData(Node^.Parent);
Wenn das Level 1 jetzt 2 Unterknoten hat, wie unterscheide ich denn dann bei case Sender.GetNodeLevel(Node) = 1, ob ich gerade den ersten oder X-ten Eintrag habe und dessen Text "getten" möchte?
Column wird es ja nicht sein, denn das ist ja für die Spalten da.

Aviator 2. Nov 2016 18:03

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352473)
Wenn das Level 1 jetzt 2 Unterknoten hat, wie unterscheide ich denn dann bei case Sender.GetNodeLevel(Node) = 1, ob ich gerade den ersten oder X-ten Eintrag habe und dessen Text "getten" möchte?

Hmm, die Frage verstehe ich jetzt nicht so ganz. Ein Tree ist ja so aufgebaut:

Code:
Root (entspricht nil)
 L Child 1 (Parent ist Root)
    L Child 1.1 (Parent ist Child 1)
       L Child 1.1.1 (Parent ist Child 1.1)
       L Child 1.1.2 (Parent ist Child 1.1)
    L Child 1.2 (Parent ist Child 1)
       L Child 1.2.1 (Parent ist Child 1.2)
       L Child 1.2.2 (Parent ist Child 1.2)
 L Child 2 (Parent ist Root)
 L Child 3 (Parent ist Root)
Jede Node kennt also i.d.R. immer nur den direkten Parent und seine Children. Wenn du jetzt mehrere Ebenen nach oben willst, dann kannst du entweder
Delphi-Quellcode:
Node1^.Parent1^.Parent^
usw. oder aber die VST Funktion
Delphi-Quellcode:
vst.NodeParent[Node]
in einer Schleife verwenden. Wenn die zurückgegebene Node dann
Delphi-Quellcode:
nil
ist, dann bist du bei der Root Node angelangt.

Jim Carrey 2. Nov 2016 18:12

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Code:
 L Child 1 (Parent ist Child 1)
       L Child 1.1 (Parent ist Child 1)
       L Child 1.2 (Parent ist Child 1)
       L Child 1.3 (Parent ist Child 1)
Schlecht erklärt von mir, sorry.
Ich meinte natürlich mit "Level " die Children 1.1, 1.2 und 1.3.

Aviator 2. Nov 2016 18:34

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352476)
Schlecht erklärt von mir, sorry.
Ich meinte natürlich mit "Level " die Children 1.1, 1.2 und 1.3.

Ich glaube du hast den Sinn des VST/eines TreeViews noch nicht so ganz verstanden. :?

Wenn du dir im GetText Event des Trees den Text ziehen möchtest der zur übergebenen Node gehört, dann gehst du folgendermaßen vor:

Delphi-Quellcode:
type
  TVSTData = record
    NodeText: string;
  end;
  PVSTData = ^TVSTData;

implementation

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
  Data := VirtualStringTree1.GetNodeData(Node);
  CellText := Data^.NodeText;
end;
Mehr musst du dort nicht machen. Wenn du dir immer den Text aus dem Parent ziehen wolltest und die jeweiligen Children immer unterschiedliche Texte haben, dann müsste ja dein Record n Properties haben wobei n die Anzahl der ChildNodes ist.

Stattdessen trägst du dir beim Erstellen der Node den richtigen Text ein und rufst diesen immer nur ab. Dann hast du die Differenzierung was in einer Node stehen soll immer nur beim Erstellen der Nodes.

Delphi-Quellcode:
procedure TForm1.ErstelleNodes;
var
  Node: PVirtualNode;
  NodeData: PVSTData;
  i: Integer;
begin
  i := 0;
  while (i < 100) do begin
    if (((i mod 5) = 0)) and Assigned(Node)) then
      Node := vst.AddChild(Node)
    else
      Node := vst.AddChild(nil);

    NodeData := vst.GetNodeData(Node);

    // Hier wird dann abhängig vom NodeLevel ein Text im NodeData hinterlegt
    case (vst.GetNodeLevel(Node)) of
      0: NodeData^NodeText := 'Das ist eine Node auf der obersten Ebene ' + IntToStr(Node^.Index);
      1: NodeData^NodeText := 'Das ist eine Node auf der zweiten Ebene ' + IntToStr(Node^.Index);
    end;

    Inc(i);
  end;
end;
Wenn du das jetzt so machst, dann brauchst du an allen anderen Stellen wo du auf den Text zugreifst immer nur noch
Delphi-Quellcode:
NodeData^.NodeText
abzurufen und schon hast du den richtigen Text. Da ist dann nix mehr mit Parent suchen und daraus den Text auslesen oder bilden oder was weiß ich.

Der Code ist jetzt nur hier im Editor geschrieben und nicht compiliert/getestet. Es könnte also der ein oder andere Fehler drin sein. Ich hoffe das ist jetzt gut und verständlich erklärt. Wenn nicht dann scheu dich nicht, nochmal nachzufragen.


PS: Wenn du das mal verstanden hast, dann ist es wirklich sehr einfach (wie alles im Leben). Und dann kommt der nächste Schritt wo du nur noch die Property RootNodeCount des VST verwendest und dann mit den bereits angesprochenen Events
Delphi-Quellcode:
OnInitNode()
und
Delphi-Quellcode:
OnInitChildren()
arbeitest.

Jim Carrey 2. Nov 2016 18:42

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Ok jetzt bin ich total raus, da ich definitiv nichts mehr verstehe. Genau deswegen hasse ich dieses Control, da die Handhabung völlig unnütz kompliziert ist.

Mein Ziel war es eigentlich Nodes erstellen zu können (ich mache das mit einer TObjectList), die im VST anzeigen zu lassen und dann abspeichern zu können, indem ich durch jedes Node gehe.

Ich glaube ich gebe mich geschlagen. Denn wozu etwas verwenden, wenn ich kein Wort davon verstehe.

So mache ich es übrigens
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 aVSTData: TVSTData;
 i: Integer;
begin
 aVSTDataClasses := TVSTDataClasses.Create;

 for i := 0 to 1 do
  begin
   aVSTData := TVSTData.Create;
   aVSTData.sTitle := 'Title ' + IntToStr(i);
   aVSTData.sInformation := IntToStr(i) + ' #2';
   aVSTData.sInformation2 := IntToStr(i) + ' #3';

   aVSTDataClasses.Add(aVSTData);
  end;

 VirtualStringTree1.RootNodeCount := aVSTDataClasses.Count;
end;

Aviator 2. Nov 2016 19:58

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Sieht doch schonmal ganz gut aus. Ich versuche mal, dir ein entsprechendes Beispiel zu basteln das deinem Vorhaben ähnlich kommt. Kann allerdings etwas dauern.

Jim Carrey 2. Nov 2016 20:11

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Das wäre nett :oops:

Ansonsten könnte ich auch TTreeView nehmen, aber da hat man nicht die Vielfalt, wie sie das VirtualStringTree bietet.

Aviator 2. Nov 2016 23:13

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Jim,

anbei mal ein kleines Demo Projekt. Ich hoffe es wird deutlich, wie der Tree funktioniert. Das Beispiel habe ich jetzt direkt mit den Events
Delphi-Quellcode:
OnInitNode()
und
Delphi-Quellcode:
OnInitChildren()
gemacht, da du das ja in deinem Beispiel auch angedeutet hattest. Das ist sowieso der bessere Weg.

Ich habe jetzt keine Speichern Procedure geschrieben, sondern lediglich eine kleine Procedure, die durch den Tree läuft und alle Nodes in einem Memo zusammenfasst. Das kann teilweise auch etwas dauern. Deshalb solltest du auch später deine Speicher Methode in einen Thread auslagern damit das Programm nicht hängen bleibt. Aber das war mir jetzt zu viel Arbeit und darum ging es ja auch nicht.

Ich wollte nur andeuten, wie man durch den VST iteriert. Beim Speichern der Daten würde ich sowieso nur durch die ObjectList laufen und mir dort entsprechend die Daten zusammensuchen.

Wenn noch etwas unklar sein sollte, dann kannst du dich ja nochmal melden.

Jim Carrey 3. Nov 2016 10:13

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Danke ersteinmal für dieses Beispiel.

Ich finde es super kompliziert muss ich sagen. Was man alles schreiben muss, um das mit dem VirtualStringTree anzeigen zu lassen, ist extrem.

Nur zum Vergleich wie es mit dem TTreeView ist:
Delphi-Quellcode:
// Button
var
 aNode: TTreeNode;
begin
 aNode := TreeView1.Items.Add(nil, 'Test 1');
 TreeView1.Items.AddChild(aNode, 'Test 1.1');
 TreeView1.Items.AddChild(aNode, 'Test 1.2');

 aNode := TreeView1.Items.Add(nil, 'Test 2');
 TreeView1.Items.AddChild(aNode, 'Test 2.1');
 TreeView1.Items.AddChild(aNode, 'Test 2.2');

ConnorMcLeod 3. Nov 2016 10:28

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Der Unterschied ist, daß hier keine Trennung von Daten und Oberfläche passiert, weil die Daten direkt im Control gehalten werden. Im Laufe der Zeit wirst Du merken, daß das nicht optimal ist.

Aviator 3. Nov 2016 10:47

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352505)
Ich finde es super kompliziert muss ich sagen. Was man alles schreiben muss, um das mit dem VirtualStringTree anzeigen zu lassen, ist extrem.

Naja. Kompliziert ist relativ. Das Beispiel habe ich jetzt (ohne angeben zu wollen) gestern abend schnell runtergetippt, compiliert und es hat funktioniert. Irgendwann hat man die Routine sowas zu schreiben und dann geht das recht einfach von der Hand.

Und die Vorteile die man durch das Control hat sind eben enorm. Und dann kommt noch einer der Hauptaspekte hinzu welcher bereits von Connor beschrieben wurde.

Und zur Not kannst du dir ja auch noch eine kleine Wrapper Klasse schreiben, welche dir die verschiedenen Aufgaben etwas erleichtern kann. Aber um die Implementierung der einzelnen Events kommst du nicht rum. Das schöne an dem Control ist ja auch, dass man fast jeden Prozess irgendwie noch unterbinden/manipulieren/prüfen kann bevor er ausgeführt wird.

Ach ja: Wenn es wirklich so viele Daten sind wie in meinem Beispiel, dann wirst du beim Speichern mit einem normalen TreeView nicht glücklich. Da hängt sich deine Anwendung dann regelmäßig auf wenn du nicht mit Application.ProcessMessages um dich wirfst. Wenn die Daten vom Control allerdings getrennt sind (wie das beim VST der Fall ist), dann kannst du die Speicherroutine, wie in meinem vorherigen Post bereits beschrieben, in einem Thread auslagern und die GUI bekommt dann davon nix mit.

Also auch wieder ein Vorteil. :cyclops: :stupid:

PS: Schau dir auch mal die Advanced Demo an die beim VST mitkommt. Die ist zwar nicht in allen Fällen optimal und auch für einen Anfänger bzw. jmd. der noch nicht so viel mit einem VST gearbeitet hat etwas schwierig zu verstehen, aber an manchen Stellen findet man dann doch ein paar schöne Features.

Jim Carrey 3. Nov 2016 11:44

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Dass das VST Daten und Control trennt, weiß ich sehr zu schätzen.
Nur frage ich mich, ob das wirklich Sinn macht bei einem Control, das maximal 10 Nodes hat.

Headbucket 3. Nov 2016 11:49

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Du kannst deine Daten auch sehr schön bei jedem anderen Control von der Oberfläche trennen. Nimm einen normalen TreeView, wenn du weißt, dass es um wenige Daten geht und du damit besser zurecht kommst.

Daten sollten aber prinzipiell nie in den Controls gespeichert werden.

Falls du übrigens in deinem VirtualTreeView nur eine Spalte hast, dann kann man auch sehr schön mit einer normalen TStringList als Datenspeicher arbeiten und umgeht diese ganze Record-Pointer-Geschichte.

Grüße
Headbucket

Jim Carrey 3. Nov 2016 11:51

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Headbucket (Beitrag 1352521)
Falls du übrigens in deinem VirtualTreeView nur eine Spalte hast, dann kann man auch sehr schön mit einer normalen TStringList als Datenspeicher arbeiten und umgeht diese ganze Record-Pointer-Geschichte.

Es wäre gelogen wenn ich jetzt sagen würde, dass ich das schon wusste :lol:
Ich wusste es natürlich nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 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