![]() |
TTreeNode soll auf ein anderes Objekt zeigen
Hi... Ich bins wieder mit einem ziemlich dummen Problem ^^
Und zwar habe ich verschiedene TTreeNodes auf meiner TTreeView (oh wunder) und ein System wo die Dateien gespeichert sind. (Sozusagen sind die TreeNodes Repräsentanten) Also möchte ich das Objekt, welches ich anlege, irgendwie in TTreeNodes speichern, ohne viel umzukrempeln. Also dachte ich: Ich erstelle ein neues "TTreeNode" Objekt und füge diese Fehlende Eigenschaft hinzu:
Delphi-Quellcode:
Wie man sieht nicht viel Code, wenn man von Parent und Create absieht.
unit uTTreeNodeEx;
interface uses ComCtrls, uCode; type TTreeNodeEx = class(TTreeNode) private FAssociatedWith: TMemoInformation; procedure SetAssociatedWith(const Value: TMemoInformation); function GetParent: TTreeNodeEx; published property AssociatedWith : TMemoInformation read FAssociatedWith write SetAssociatedWith; public property Parent: TTreeNodeEx read GetParent; constructor Create(AOwner : TTreeNodes); end; implementation { TTreeNodeEx } constructor TTreeNodeEx.Create(AOwner: TTreeNodes); begin inherited; FAssociatedWith := nil; end; function TTreeNodeEx.GetParent: TTreeNodeEx; begin Result := TTreeNodeEx(inherited Parent); end; procedure TTreeNodeEx.SetAssociatedWith(const Value: TMemoInformation); begin FAssociatedWith := Value; end; end. Das Problem ist jetzt nur, wie kriege ich das im TreeView gespeichert... Meine "Lösung":
Delphi-Quellcode:
var
child : TTreeNodeEx; begin child := TTreeNodeEx(tvMemolist.Items.AddChild(pParent, eTitle.Text)); child.AssociatedWith := ...; end;
Delphi-Quellcode:
Aber es hat nicht sein sollen => AV
procedure TfrmMain.tvMemolistChange(Sender: TObject; Node: TTreeNode);
var pParent : TTreeNodeEx; begin pParent := TTreeNodeEx(Node); Showmessage(pParent.AssociatedWith.Name); end; |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Siehst du irgendwo eine Instanzierung deiner neuen Klasse? Nein? Wie soll sie dann bitte in die Nodes-Collection kommen? Bisher ruft diese einfach TTreeView.CreateNode auf und erstellt damit natürlich einen TTreeNode.
Aber wäre TTreeNode.Data nicht die einfachere Lösung? Beide Lösungen benötigen jeweils einen Cast. |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Okay... danke wegen Data... aber ich hatte schon nach Tag gesucht... Deshalb habe ich diesen Umweg gemacht... Aber mit Data ist das natürlich richtig easy ^^
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
Man sollte CodeGear raten, die Onlinehilfe aus Kostengründen in den weiteren Versionen komplett zu entfernen...
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
So... Jetzt mache ich das über .Data und es scheint zu funktionieren... Aber wie kann ich jetzt überprüfen, ob der Pointer auf ein Object "TM2MFile" oder "TMemoInformation" zeigt?
Delphi-Quellcode:
So auf jedenfall nicht...
if Node.Data^ is TM2MFile then
Showmessage('TM2MFile!'); Wegen der Hilfe... Auf was sollte das eine Anspielung sein? |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Delphi-Quellcode:
if TObject(Data) is TM2MFile then
Showmessage('TM2MFile!'); |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Danke... Aber jetzt gibt es da eine AV...
Zitat:
[edit]Ich verstehe die Welt nicht mehr .... Also hier ist alles i.O.:
Delphi-Quellcode:
Aber dann (es folgenen jetzt nur die Initialisierung der anderen Fenster) gibts ne AV im OnChange Ereignis (Hinweis: Dazwischen ist ansonsten nichts):
child.Data := @b;
Showmessage(TM2MFile(child.Data^).Name);
Delphi-Quellcode:
PS: "Name" würde auch anstelle von "Memo" gehen ^^[/edit]
mMemo.Lines.Text := TM2MFile(Node.Data^).Memo;
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
warum dereferenzieren? glaube das ist nicht nötig.
außerdem: - auf <> nil prüfen - as-operator verwenden, dann kriegst du ne Excweption, wenn mit dem typ was nicht stimmt. machs doch einfach so wie ich dir sag ;-) |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Zitat:
Ist es nicht so, dass ich die Variable, und nicht den Zeiger der Variable, casten muss? Zitat:
Zitat:
Abgesehen davon, dass der Node in der Changemethode eigentlich richtig sein müsste... Zitat:
[edit]Wegen as => Zitat:
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
wie oft denn noch. machs so, wie ich dir sag: ;-)
Delphi-Quellcode:
Meinetwegen auch gerne mit Dereferenzierung, kann man ja beides mal ausprobiern.
if TObject(Node.Data) is TM2MFile then
Showmessage('TM2MFile!'); PS: Zuweisen so:
Delphi-Quellcode:
Node.Date := Pointer(TM2MInstance);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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