Autor Beitrag
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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:
ausblenden 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 user profile iconChristian 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TmyTreeNode = class(TTreeNode)
  public
    mystring: string;
  end;

einen normalen TreeNode einfügen kann man ja so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  node:TTreeNode;
begin
  node :=  treeview1.Items.Add(nil,'hallo');
  node.Text := 'test'; // Irgend eine Änderung der Node
end;

und das geht nicht:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 20.06.05 15:01 
@matze:
Versuch's mal so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Di 21.06.05 17:58 
Hi,


user profile iconmatze 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Di 21.06.05 19:26 
user profile iconalzaimar 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 :oops: und natürlich funktioniert es so nicht :oops:

Ich habe jetzt aber die richtige Funktion gefunden.


Aus der Delphi-Hilfe:

AddNode (Methode von TTreeNodes)

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 21.06.05 19:29 
Cool! Wusste nicht, das es doch gehen könnte...