![]() |
TTreeNode um eine weitere Variable erweitern
Hallo Community,
Ich möchte gern die class TTreeNode so um eine Variable erweitern, dass ich den erweiterten Typ immer noch der Standard-TreeView hinzufügen kann. Bisherige Versuche haben immer nur einen "Inkompatibelitätsfehler" verursacht ;_;
Delphi-Quellcode:
type
TTreeNode = class(ComCtrls.TTreeNode) private { Private declarations } ShouldExpand : Boolean; end; |
Re: TTreeNode um eine weitere Wariable erweitern
nicht umsonst hat TTreeNode ein .Data Feld :)
|
Re: TTreeNode um eine weitere Wariable erweitern
Diese Variable habe ich bereits in Benutzung (Hätte ich vllt schon vorher sagen sollen^^)
|
Re: TTreeNode um eine weitere Wariable erweitern
dann kann man dem TReeView vllt verkliggern aus welcher klasse seine Nodes bestehen .SetNodeClass oder so - keine ahnung
ich bin VirtualTreeView nutzer :) |
Re: TTreeNode um eine weitere Wariable erweitern
Wieso schreibste ne "Antwort", wenn du keine Ahnung hast?^^
|
Re: TTreeNode um eine weitere Wariable erweitern
Du musst TTreeView.OnCreateNodeClass setzen und darin deine TTreeNodeSubclass als Klasse zurückgeben.
Noch was:
Delphi-Quellcode:
So solltest du es nicht machen, denke dir einen neuen Namen aus.
TTreeNode = class(ComCtrls.TTreeNode)
private { Private declarations } ShouldExpand : Boolean; end; |
Re: TTreeNode um eine weitere Wariable erweitern
weil unter umständen vllt DOCH was dabei iss - oder dich zum denken anregt
|
Re: TTreeNode um eine weitere Variable erweitern
Könntest du mir deine Antwort als Source Code liefern, Flocke? Ich kann viel besser Code als Worte verstehen^^
|
Re: TTreeNode um eine weitere Variable erweitern
Aus dem Kopf ...
Delphi-Quellcode:
dann im OI für das TTreeView-Control die Ereignisse ansehen und auf OnCreateNodeClass doppelt klicken und dann ergänzen:
type
TMeinTreeNode = class(TTreeNode) // was immer du ändern willst end;
Delphi-Quellcode:
procedure TForm.TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass); begin NodeClass = TMeinTreeNode; end; |
Re: TTreeNode um eine weitere Variable erweitern
(Habe gerade gemerkt, dass ich für dieses Thema schon mal einen Thread erstellt hatte o_O)
Trotzdem viele Dank, Flocke! [edit] Ich muss nur noch zusätzlich vor jedem Ausgabewert einer Function dies schreiben:
Delphi-Quellcode:
[/edit]
Root:=TTreeNodeEx(TreeView1.Items.Add(nil,'Root1'));
|
Re: TTreeNode um eine weitere Wariable erweitern
Hi.
Zitat:
|
Re: TTreeNode um eine weitere Variable erweitern
Genial !! Das ist natürlich die perfekte Lösung. Viele Dank, Waldteufel.
|
Re: TTreeNode um eine weitere Variable erweitern
"Diese Variable habe ich bereits in Benutzung (Hätte ich vllt schon vorher sagen sollen^^)"
hatten wir das nich gestern schon, sachma? :gruebel: |
Re: TTreeNode um eine weitere Variable erweitern
Zitat:
...:cat:... |
Re: TTreeNode um eine weitere Variable erweitern
mmh, ich glaube, ich habe denn einen echten Speicherfresser^^ Wie gebe ich den Pointer Node.Data wieder frei?
|
Re: TTreeNode um eine weitere Variable erweitern
in der regel referenziert man mit Data nur irgendwas anderes ...
also reicht ein Data := nil; IN DER REGEL - was also auch bei dir der fall sein wird |
Re: TTreeNode um eine weitere Variable erweitern
Ich benötige kein zusätzliches
Delphi-Quellcode:
?
Dispose(Node.Data)
|
Re: TTreeNode um eine weitere Variable erweitern
kommt drauf an WIE du .Data verwendest...
wenn dus nur mit xNode.Data := xObj; benützt, dann free'e das xObj und nil'e .Data ... |
Re: TTreeNode um eine weitere Variable erweitern
Zitat:
...:cat:... |
Re: TTreeNode um eine weitere Variable erweitern
Ich benutze Node.Data so:
Delphi-Quellcode:
type
TGroupData = record GroupID : Word; ShouldExpand : Boolean; end; PGroupData = ^TGroupData; {...} New(GroupData); try GroupData.GroupID:=GroupID; GroupData.ShouldExpand:=StrToBool(Copy(s,Index+1,Length(s)-Index)); GroupNode.Data:=GroupData; finally Dispose(GroupData); end; |
Re: TTreeNode um eine weitere Variable erweitern
Zitat:
Anschließend im OnDeletion wieder auslesen und freigeben ;) ...:cat:... |
Re: TTreeNode um eine weitere Variable erweitern
wenners so benutzt, dann reicht nen .Data := nil;
nur sein GroupData blah musser gescheit freigeben |
Re: TTreeNode um eine weitere Variable erweitern
Gut, danke euch allen.
Habe durch diesen Thread jetzt erst richtig verstanden, wie es sich mit Node.Data und Pointer verhält^^ |
Re: TTreeNode um eine weitere Variable erweitern
Zitat:
Deshalb muss er später Dispose nutzen. Dahingegen kann er sich das Data := nil; sparen, da das keine Auswirkungen hat :roll: Win32 referenziert Pointer nun mal nicht. ...:cat:... |
Re: TTreeNode um eine weitere Variable erweitern
freilich kann er -
|
Re: TTreeNode um eine weitere Variable erweitern
Zitat:
...:cat:... |
Re: TTreeNode um eine weitere Variable erweitern
Ja, Leute...ist ja jut..ER konnte (!) es nicht machen, da er den Code bisher nur theoretisch (ja ich weiß, fehlerhaft), d.h. ohne zu kompilieren, durchgegangen ist. Ja, ich habe Fehler gemacht, zufrieden? Danke.
|
Re: TTreeNode um eine weitere Variable erweitern
Zitat:
...:cat:... |
Re: TTreeNode um eine weitere Variable erweitern
Ich habe früher eine weitere Methode benutzt, um eine Variable in Data zu speichern. Damals bin ich mit Data so umgegangen:
Delphi-Quellcode:
Die Variante hat IMMER funktioniert, jedoch kann ich damit nicht mehr als einen Wert speichern. Dazu eine Frage: Wie wird hier mit dem Speicher umgegangen, d.h. wieso funktioniert das ohne New (und Dispose)?
// speichern
Node.Data:=Pointer(Variable); // laden Variable:=VariablenTyp(Node.Data); |
Re: TTreeNode um eine weitere Variable erweitern
Weils wahrscheinlich entweder ein integer war - wie der Pointer auch, oder ei String bzw. ein Objekt, die sowiso schon Poniter sind ;)
|
Re: TTreeNode um eine weitere Variable erweitern
Es war ein Integer-Wert, ja. Dann ist das natürlich logisch^^
Ich konnte allerdings auch negative Werte einsetzen und auslesen, dabei dachte ich, dass ein Pointer auf eine Speicheradresse zeigt, die bei 0 startet *verwirrt*. So würde der Zeiger ja ins nichts bzw. negativen nicht vorhandenen Bereich zeigen. Wird dabei kein Fehler ausgelöst? |
Re: TTreeNode um eine weitere Variable erweitern
Moin, moin,
ja auch wenn es schon etwas her ist: Der Pointer hat ein anders Datenformat und das negaiv Bit wird als normales Zahlenbit genommen, was den höchsten positiv darstellbaren Wert erhöht. Also kein negaitver Speicher oder Paralleluniversum :-) Grüße // Martin |
Re: TTreeNode um eine weitere Variable erweitern
Ah, ok...Danke dir!
|
Re: TTreeNode um eine weitere Variable erweitern
So ich habe das hier einmal per Suche gefunden und es ist ja sogar noch fast Aktuell.
Ich möchte auch die Property Data benutzen und das sogar nur zum Speichern eines Integer Wertes. Nun habe ich das mit den Pointern bei Delphi alles noch nicht so hunertpro verstanden, dazu kommt das dauernde hin und her zwischen mehreren Sprachen. Nun gut, momentan habe ich es so:
Delphi-Quellcode:
Soll einmal nur ein kleiner Auszug sein.
var
test: integer; ShellTreeView1.Items.Item[3].Data:= Pointer(test); ShellTreeView1.Items.Item[3].Data:= nil; Ohne das am Ende auf nil zu setzen, scheint das nicht zu funktionieren, denn dann bekomme ich Fehler beim Beenden des Programms. jemand Ideen, wie ich es noch anders machen kann/ wie es ist, wenn test einen anderen Wert annehmen/ gelöscht werden würde. Gesagt sei noch, das ich in dem Treeview Dateien mit evntl einer Ordnerstruktur darstellen möchte. Diese werden dann durch eine id festgelegt, wodurch ich sie in einer Datei finden kann. Mir ist sehr wohl klar, das ich durch eine Ordnerstruktur die Dateien anders finden könnte, aber stellt euch Delphi oder irgendeinen Editor vor, der Listet auch nur alle Dateien auf. Ich wäre dennoch für alles andere offen *gg* |
Re: TTreeNode um eine weitere Variable erweitern
Es gibt eine aufwendige, dafür aber perfekte Lösung, um allgemein Werte in Data zu speichern:
Delphi-Quellcode:
Was ist denn so schlimm daran, beim Beenden des Programms Data auf nil zu setzen?
PIntRec = ^TIntRec;
TIntRec = record Value : Integer; end; [...] var DataPointer:PIntRec; [...] { -- Data mit Daten füllen -- } Node:=TV.Items.AddChild(Parent,String); New(DataPointer); DataPointer^.Value := Value; // z.B. dein Integer-Wert Node.Data := DataPointer; [...] { -- TreeNodes freigeben (z.B. bei OnClose -- } for i:=TV.Items.Count-1 downto 0 do begin Dispose(PIntRec(TV.Items.Item[i].Data)); TV.Items.Item[i].Data:=nil; // wird nicht benötigt (nach sakura) end; end; |
Re: TTreeNode um eine weitere Variable erweitern
Naja das ist ein sehr spezialler Fall und ein Record erstellen wird wohl nicht nötig sein.
generell hast du recht, das auf nil zu setzen ist wohl kein Problem, ich muss dies halt bei 20 werten oder so machen. Es geht mir auch mehr um eine gute und sichere Art dies zu machen. Also die zuweisung, bzw dann das lesen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 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