| Autor |
Beitrag |
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Sa 18.06.05 10:09
Hallo !
Ich benötige zur Speicherung von verschiedenen Daten in einem TTreeNode Objekt mehrer Felder. Und da es mir zu umständlich war immer an die Data Eigenschaft etwas anzuhängen, habe ich mir gedacht, ich leite einfach ein neues Objekt von TTreeNode ab:
Delphi-Quelltext 1: 2: 3: 4: 5:
| type TmyTreeNode = class(TTreeNode) public mystring: string; end; |
so das neue Feld das ich brauche ist der mystring string.
muss ich dann eigendlich irgendwie noch den destruktor meines ojektes anpassen, damit beim löschen des objektes mystring aus dem speicher entfernt wird, oder passiert das automatisch ? Moderiert von Christian S.: Topic aus VCL (Visual Component Library) verschoben am Sa 18.06.2005 um 11:53
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Sa 18.06.05 14:35
Sofern du nicht selber an der Speicherbelegung des Strings (z.B. mit GetMem) rumfummelst, passiert das automatisch.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: So 19.06.05 10:10
ah danke !
aber trotzdem hab ich da bei meinem neuen Objekt irgendwas falsch gemacht.
immer wenn ich dann so ein neues Objekt in meinen Treeview einfühgen will und der neuen eigenschaft einen wert zuweisen will, kommt an der stelle an der ich den sting zuweise eine zgriffsverletzung !
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 19.06.05 10:27
Meine Kristallkugel funktioniert nicht so gut, wenn's warm ist, daher musst Du uns ausnahmsweise den Sourcecode zeigen. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: So 19.06.05 11:29
das mit der Zugriffsverletzung war ein doofer fehler meinerseits.
aber ich habe ein anders Problem. mein abgeleitetes objekt lässt sich gar nicht einfügen !
also meine type daklaration:
Delphi-Quelltext 1: 2: 3: 4: 5:
| type TmyTreeNode = class(TTreeNode) public mystring: string; end; |
einen normalen TreeNode einfügen kann man ja so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var node:TTreeNode; begin node := treeview1.Items.Add(nil,'hallo'); node.Text := 'test'; end; |
und das geht nicht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var node:TmyTreeNode; begin node := treeview1.Items.Add(nil,'hallo'); node.mystring := 'text'; end; |
da meldet der compiler: [Fehler] Unit1.pas(47): Inkompatible Typen: 'TmyTreeNode' und 'TTreeNode'
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
nelle
      
Beiträge: 22
|
Verfasst: Mo 20.06.05 15:01
@matze:
Versuch's mal so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var node:TmyTreeNode; begin node := TmyTreeNode(treeview1.Items.Add(nil,'hallo')); node.mystring := 'text'; end; |
Damit hast Du schon mal den Compiler beruhigt...
Aber Du wirst wahrscheinlich danach einen Laufzeitfehler bekommen...
Denn "treeview1" wird durch seine Methode Add wahrscheinlich nur Objekte vom
Typ TTreeNode generieren. Somit kannst du nicht auf die Eigenschaft "myString"
zugreifen, weil ja TTreeNode-Objekte diese Eigenschaft gar nicht haben.
Nelle
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Di 21.06.05 16:44
nee so geht es leider auch nicht !
aber das muss doch gehen oder ?
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 21.06.05 17:02
Nein, es geht nicht. AddNode liefert nun mal einen TreeNode zurück, da kannst Du Casten was Du willst. Per Typecasting ist ja auch noch niemand Millionär geworden (wenn das so einfach ginge).
Dir bleibt einfach nichts anderes übrig, als die Nutzdaten in die Dataproperty zu schreiben. Die TreeView unterstützt dich da ganz gut, indem Dir jedes Löschen und Einfügen über Events mitgeteilt wird. Es ist eigentlich gar nicht komplizierter, als eine eigene Klasse zu schreiben.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Di 21.06.05 17:19
und ich kann auch mein abgeleitetes onjekt nicht selber erzeugen und dann anders in den reeview einfügen ?
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Di 21.06.05 17:58
Hi,
matze hat folgendes geschrieben: | | und ich kann auch mein abgeleitetes onjekt nicht selber erzeugen und dann anders in den reeview einfügen ? |
doch das geht, z.B. so.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); var myTreenode : TmyTreeNode; begin myTreenode:=TmyTreeNode.Create(TreeView1.Items); myTreenode.mystring:='Test'; TreeView1.Items.Add(myTreenode,myTreenode.mystring); end; |
es gibt noch einige Funktionen mehr, mit denen du bestimmen kannst wo du das Objekt in den Baum einfügst,
schau mal in die Delphi-Hilfe unter TTreeNodes.
Aber beachte, beim Auslesen der Knoten bekommst du immer ein TTreenode das du erst zu TmyTreeNode casten mußt.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 21.06.05 18:31
Hast Du das ausprobiert? Denn Add fügt einen Knoten in den Baum ein. Der Vater des Knotens ist der Übergebene. Du würdest also einen TMeinKnoten erzeugen (wo wird der im Baum eingefügt?) und über Add erzeugst Du einen TTreeNode, der den TMeinKnoten als Vater hat.
Wieso willst Du denn eigene Knoten erzeugen? Nimm doch Data, das geht doch und ist einfach. Ob Du nun TMyNode deklarierst, oder nur TMyData ist doch wirklich schnurz, nicht?
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Di 21.06.05 19:26
alzaimar hat folgendes geschrieben: | Hast Du das ausprobiert? Denn Add fügt einen Knoten in den Baum ein. Der Vater des Knotens ist der Übergebene. Du würdest also einen TMeinKnoten erzeugen (wo wird der im Baum eingefügt?) und über Add erzeugst Du einen TTreeNode, der den TMeinKnoten als Vater hat.
|
Nein, hatte es nicht wirklich getestet  und natürlich funktioniert es so nicht
Ich habe jetzt aber die richtige Funktion gefunden.
Aus der Delphi-Hilfe:
AddNode (Methode von TTreeNodes)
Delphi-Quelltext 1:
| function AddNode(Node, Relative: TTreeNode; const S: string; Ptr: Pointer; Method: TNodeAttachMode): TTreeNode; |
Beschreibung
AddNode fügt ein Knotenobjekt in die Kollektion ein. AddNode gibt den neu hinzugefügten Knoten zurück und nimmt die folgenden Parameter entgegen:
Node bezeichnet das Knotenobjekt, das hinzugefügt werden soll. Wenn Node den Wert nil hat, wird die Methode CreateNode das Baumdiagramms aufgerufen, damit ein Wert verfügbar ist.
Die Parameter Relative und Method definieren zusammen die Position des neuen Knotens. Relative steht für einen vorhandenen Knoten, der dem neuen Knoten entweder übergeordnet oder gleichgeordnet ist. Method bestimmt die eigentliche Beziehung zwischen dem neuen Knoten und seinem Bezugsknoten. Maßgebend ist der Wert der Konstante TNodeAttachMode.
Der Parameter S legt den Wert der Eigenschaft Text des neuen Knotens fest.
Der Parameter Ptr legt den Wert der Eigenschaft Data des neuen Knotens fest.
Hinweis: Der von Ptr referenzierte Speicher wird nicht freigegeben, wenn das TreeNodes-Objekt freigegeben wird.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 21.06.05 19:29
Cool! Wusste nicht, das es doch gehen könnte...
|
|