AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Liste der Anhänge anzeigen (Anzahl: 1)
Ich mache gerade ein Beispiel. 10 Minuten noch.
So ganz klappt es noch nicht. Speziell wenn man erst den Button Node mit Idx 2 löschen drückt und dann Node Peter Wurst löschen. Mein Ziel wäre es, die Referenz auf Node wegzubekommen und die Möglichkeit zu haben, das wenn ich eine Klasseninstanz lösche, auch gleich der Node mit weg ist. Aktuell ist es ja so, dass ich den Node löschen muss. Und das geht nur mit einer Referenz da drauf. Aber ihr seht, mein Code ist wie Pasta ... nix funktioniert. |
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Das nächste Mal bitte als Projekt ;)
Mach mal folgendes, aber bedenke, dass das jetzt nur eine Lösung für deine Vorgehensweise hier ist. Und bitte alles beachten. Ich hänge bewusst die Datei nicht an, damit du die Änderungen auch selbst einbauen musst und hoffentlich auch verstehst:
Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
begin VST.Clear; DeleteNode(2); // Daten anhand des Index löschen. 2 ist nicht der absolute Index sondern der, der in Button1Click gesetzt wird VST.RootNodeCount := aVSTDataClasses.Count; end; procedure TForm2.Button3Click(Sender: TObject); begin VST.Clear; DeleteNode('Peter Wurst'); // Daten anhand eines Nutzernamens löschen VST.RootNodeCount := aVSTDataClasses.Count; end;
Delphi-Quellcode:
procedure DeleteNode(iIndex: Integer); overload;
//var // Node: PVirtualNode; begin aVSTDataClasses.Delete(iIndex); // Node := FindUserNodeByIndex(iIndex); // if Assigned(Node) then // Form2.VST.DeleteNode(Node); end;
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var Column: TVirtualTreeColumn; i: Byte; begin ReportMemoryLeaksOnShutdown := True; ... VST.OnInitNode := VSTInitNode; // VST.OnFreeNode := VSTFreeNode; // <--- WICHTIG! ENTFERNEN! VST.OnGetText := VSTGetText; end; |
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Ok Moment ganz langsam für meinen alten Kopf.
Heißt das jetzt, dass du mit 2, 3 Zeilen Umstellung das so gemacht hast, dass man jetzt eine Klasseninstanz löscht, das Node verschwindet (man löscht ja alle mit Clear) und alles neugezeichnet wird? Wird das Neuzeichnen durch das Setzen von RootNodeCount ausgelöst? Das ist dann ja genau das was TiGü meinte, nur habe ich es leider nicht ganz verstanden. |
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Ja das ist genau das was TiGü meinte. :thumb:
Dein größter Fehler war eben (wie ich in meinem vorletzten Post schrieb), dass du das OnFreeNode Event implementiert hast. OnFreeNode gibt die Daten die an die Node gebunden sind frei. Zumindest, wenn du das in dem Event so festgelegt hast. Und da du im OnFreeNode() die Instanz per Remove() aus der ObjectList gelöscht hast, wurde die natürlich auch beim leeren des Trees mit VST.Clear() ebenfalls gelöscht. Das Neuzeichnen des Trees wird durch das setzen von RootNodeCount, aber auch durch das vorhergehende löschen der Nodes mit VST.Clear() ausgeführt. |
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
TiGü schriebe, dass es schlechtes Design wäre sich eine Referenz auf Node zu halten.
Ich habe eine Funktion die sieht so aus
Delphi-Quellcode:
Ist von sowas dann abzuraten?
function FindUserNodeByIndex(iIndex: Integer): PVirtualNode;
var i: Integer; begin Result := nil; for i := 0 to aVSTDataClasses.Count - 1 do if aVSTDataClasses[i].Index = iIndex then begin Result := aVSTDataClasses[i].aNode; Break; end; end; Die markierte Zeile unten kann dann vermutlich auch weg
Delphi-Quellcode:
So würde ich dann beispielsweise den Text eines Properties ändern ohne die Node-Referenz
procedure TForm2.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin Node.SetData<TVSTData>(aVSTDataClasses[Node.Index]); aVSTDataClasses[Node.Index].aNode := Node; // ---------------------------------------------- end;
Delphi-Quellcode:
aVSTDataClasses[5].sUserName := 'XXXXXXXXXXXXXX';
VST.Invalidate; // InvalidateNode(aVSTDataClasses[5].aNode); |
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Habe dein Edit leider erst nach meinem Post gesehen.
Zitat:
Genau so ist das auch umgekehrt. Wenn du die Daten aktualisiert, dann reicht ein VST.Invalidate(). Wenn Daten hinzugefügt oder gelöscht werden, dann solltest du die Daten auch im VST aktualisieren - sprich löschen und neu erstellen. Das ist das, was TiGü mit konsistentem Zustand meinte. Deine Daten im VST passen immer 100% zu den Daten in deiner ObjectList. EDIT: Oh je. Jetzt ist es kein Edit mehr :D |
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Zitat:
Ich frage nur in die Runde. Zitat:
Mit erstellen meinst du ja RootNodeCount setzen denke ich doch? Zitat:
|
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Wie ich sehe, nimmt das langsam vernünftige Formen an.
Höre auf das, was Aviator sagt. Er ist sehr erfahren mit dem VST. Alternativ zum RootNodeCount und OnInitNode-Eventhandler kannst du natürlich auch versuchen mit AddChild zu arbeiten.
Delphi-Quellcode:
Kommt auf das gleiche hinaus, aber vielleicht verstehst du das in zwei Monaten noch, wenn du dir den Code nochmal anguckst.// PseudoCode for deinTyp in deinerListe do begin vst.AddChild(nil, deinTyp); end; |
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Zitat:
Zitat:
Zitat:
Zitat:
Er ist mit RootNodeCount schon auf dem richtigen Weg. AddChild() ist zwar anfängerfreundlicher, aber wenn er sowieso schon richtig angefangen hat, dann sollten wir ihn auf keinen Fall auf die falsche Spur locken. Anbei mal noch ein Auszug aus dem Source der VirtualTreeView Komponente (Hervorhebung von mir): Zitat:
|
AW: VirtualStringTree und Klasseninstanzen - Node Data finden
Delphi-Quellcode:
Ich höre auf euch beide :thumb:
Höre auf das, was Aviator sagt. Er ist sehr erfahren mit dem VST.
Eine Sache habe ich eben noch hinzugefügt aus
Delphi-Quellcode:
wird
procedure TForm2.Button2Click(Sender: TObject);
begin VST.Clear; DeleteNode(2); // Daten anhand des Index löschen. 2 ist nicht der absolute Index sondern der, der in Button1Click gesetzt wird VST.RootNodeCount := aVSTDataClasses.Count; end;
Delphi-Quellcode:
procedure DeleteUserNode(iIndex: Integer);
begin if iIndex > aVSTDataClasses.Count - 1 then // ---------------- neu Exit; VST.Clear; aVSTDataClasses.Delete(iIndex); VST.RootNodeCount := aVSTDataClasses.Count; // re-draws alle nodes of VST end; procedure TForm2.Button2Click(Sender: TObject); begin DeleteNode(2); end; Zitat:
Zitat:
Mein erstes Erlebnis waren Nodes die nicht richtig gezeichnet wurden, wenn man das AfterItemPaint-Event nutzt. Aber das war nur minimal und nicht weiter schlimm und auch sofort wieder weg, sobald man mit der Maus über den Node gefahren ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 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