Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TTreeNode um eine weitere Variable erweitern (https://www.delphipraxis.net/50166-ttreenode-um-eine-weitere-variable-erweitern.html)

Nogge 21. Jul 2005 12:06


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;

barf00s 21. Jul 2005 12:10

Re: TTreeNode um eine weitere Wariable erweitern
 
nicht umsonst hat TTreeNode ein .Data Feld :)

Nogge 21. Jul 2005 12:16

Re: TTreeNode um eine weitere Wariable erweitern
 
Diese Variable habe ich bereits in Benutzung (Hätte ich vllt schon vorher sagen sollen^^)

barf00s 21. Jul 2005 12:19

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 :)

Nogge 21. Jul 2005 12:25

Re: TTreeNode um eine weitere Wariable erweitern
 
Wieso schreibste ne "Antwort", wenn du keine Ahnung hast?^^

Flocke 21. Jul 2005 12:25

Re: TTreeNode um eine weitere Wariable erweitern
 
Du musst TTreeView.OnCreateNodeClass setzen und darin deine TTreeNodeSubclass als Klasse zurückgeben.

Noch was:
Delphi-Quellcode:
TTreeNode = class(ComCtrls.TTreeNode)
  private
    { Private declarations }
    ShouldExpand : Boolean;
  end;
So solltest du es nicht machen, denke dir einen neuen Namen aus.

barf00s 21. Jul 2005 12:26

Re: TTreeNode um eine weitere Wariable erweitern
 
weil unter umständen vllt DOCH was dabei iss - oder dich zum denken anregt

Nogge 21. Jul 2005 12:29

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^^

Flocke 21. Jul 2005 12:50

Re: TTreeNode um eine weitere Variable erweitern
 
Aus dem Kopf ...
Delphi-Quellcode:
type
  TMeinTreeNode = class(TTreeNode)
  // was immer du ändern willst
  end;
dann im OI für das TTreeView-Control die Ereignisse ansehen und auf OnCreateNodeClass doppelt klicken und dann ergänzen:
Delphi-Quellcode:
procedure TForm.TreeView1CreateNodeClass(Sender: TCustomTreeView;
  var NodeClass: TTreeNodeClass);
begin
  NodeClass = TMeinTreeNode;
end;

Nogge 21. Jul 2005 15:03

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:
Root:=TTreeNodeEx(TreeView1.Items.Add(nil,'Root1'));
[/edit]

Waldteufel 22. Jul 2005 10:55

Re: TTreeNode um eine weitere Wariable erweitern
 
Hi.

Zitat:

Zitat von Nogge
Diese Variable habe ich bereits in Benutzung (Hätte ich vllt schon vorher sagen sollen^^)

Da TTreeNode.Data ein Pointer ist, würde ich empfehlen, dort einfach einen Pointer auf einen Record abzulegen.

Nogge 22. Jul 2005 11:03

Re: TTreeNode um eine weitere Variable erweitern
 
Genial !! Das ist natürlich die perfekte Lösung. Viele Dank, Waldteufel.

barf00s 22. Jul 2005 11:19

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:

sakura 22. Jul 2005 11:35

Re: TTreeNode um eine weitere Variable erweitern
 
Zitat:

Zitat von Nogge
Genial !! Das ist natürlich die perfekte Lösung. Viele Dank, Waldteufel.

Vergiss aber nicht die Pointer wieder freizugeben, wenn die Node gelöscht wird, ansonsten hast Du einen echten Speicherfressen. Das Event müsste OnDeletion oder ähnlich heißen ;)

...:cat:...

Nogge 22. Jul 2005 11:48

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?

barf00s 22. Jul 2005 11:59

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

Nogge 22. Jul 2005 12:06

Re: TTreeNode um eine weitere Variable erweitern
 
Ich benötige kein zusätzliches
Delphi-Quellcode:
Dispose(Node.Data)
?

barf00s 22. Jul 2005 12:08

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

...

sakura 22. Jul 2005 12:12

Re: TTreeNode um eine weitere Variable erweitern
 
Zitat:

Zitat von Nogge
Ich benötige kein zusätzliches
Delphi-Quellcode:
Dispose(Node.Data)
?

Hast Du noch an anderer Stelle eine Referenz auf die Daten? Dann eher nicht, wenn Node.Data aber die einzige ist, dann musst Du es im OnDeletion Event auch wieder freigeben :zwinker:

...:cat:...

Nogge 22. Jul 2005 12:13

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;

sakura 22. Jul 2005 12:18

Re: TTreeNode um eine weitere Variable erweitern
 
Zitat:

Zitat von Nogge
Ich benutze Node.Data so:

:shock: Du kannst das Object doch nicht sofort wieder disposen ;) Anlegen und in Data eintragen, fertig.

Anschließend im OnDeletion wieder auslesen und freigeben ;)

...:cat:...

barf00s 22. Jul 2005 12:38

Re: TTreeNode um eine weitere Variable erweitern
 
wenners so benutzt, dann reicht nen .Data := nil;
nur sein GroupData blah musser gescheit freigeben

Nogge 22. Jul 2005 12:44

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^^

sakura 22. Jul 2005 13:17

Re: TTreeNode um eine weitere Variable erweitern
 
Zitat:

Zitat von barf00s
wenners so benutzt, dann reicht nen .Data := nil;
nur sein GroupData blah musser gescheit freigeben

So kann er es aber nicht nutzen :roll: Das Problem ist, dass er das Dispose sofort aufruft und somit der Datenbereich auch wieder freigegeben wird. Nachdenken!

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:...

barf00s 22. Jul 2005 13:25

Re: TTreeNode um eine weitere Variable erweitern
 
freilich kann er -

sakura 22. Jul 2005 13:31

Re: TTreeNode um eine weitere Variable erweitern
 
Zitat:

Zitat von barf00s
freilich kann er -

Wieso? Die Daten können jederzeit mit anderen überschrieben werden. Es stimmt, er kann es tun, aber er kann sich nicht darauf verlassen, dass er diese Daten jemals wieder sieht.

...:cat:...

Nogge 22. Jul 2005 13:32

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.

sakura 22. Jul 2005 14:27

Re: TTreeNode um eine weitere Variable erweitern
 
Zitat:

Zitat von Nogge
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.

Keine Sorge, mir ging es nicht um Dich, sondern nur um eine der unfundierten Aussagen welche Dir helfen sollte :zwinker:

...:cat:...

Nogge 22. Jul 2005 19:53

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:
  // speichern
  Node.Data:=Pointer(Variable);
  // laden
  Variable:=VariablenTyp(Node.Data);
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)?

jfheins 22. Jul 2005 20:26

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 ;)

Nogge 28. Jul 2005 17:28

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?

mschaefer 10. Sep 2005 15:20

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

Nogge 10. Sep 2005 15:40

Re: TTreeNode um eine weitere Variable erweitern
 
Ah, ok...Danke dir!

CLRS530 31. Okt 2005 20:28

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:
  var
    test: integer;
  ShellTreeView1.Items.Item[3].Data:= Pointer(test);
  ShellTreeView1.Items.Item[3].Data:= nil;
Soll einmal nur ein kleiner Auszug sein.
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*

Nogge 31. Okt 2005 20:47

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:
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;
Was ist denn so schlimm daran, beim Beenden des Programms Data auf nil zu setzen?

CLRS530 31. Okt 2005 21:06

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