![]() |
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);
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
Ich bin jetzt leicht verwirrt ...
Es geht nicht mehr darum zu überprüfen ob Data vom Typ TM2MFile! Ich weiß es jetzt in dem Speziellen Fall! Aber später, wenn es läuft, dann werde ich darauf zurückgreifen, und das anders überprüfen! Und das zuweisen geht richtig in die Hose: Es gibt eine wunderschöne AV! :( Ich bin verwirrt, warum jetzt an dieser unmöglichen Stelle genau das auftritt... obwohl es ja vorher funktioniert. |
Re: TTreeNode soll auf ein anderes Objekt zeigen
av beim zuweisen :shock:
ja was machst du denn da?! das objekt nicht erzeugt oder was? zeig mal mehr code! Ich arbeite mit Node.Data seit AD 1328... |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Zitat:
Aber back to Topic: Ihc habe jetzt das Problem behoben indem ich statt einen Pointer die Variable zuweise... Hier mal ein Beispiel:
Delphi-Quellcode:
// so mach ichs nun
Node.Data := TObject; // so wars Node.Data := @TObject // oder (+AV) Node.Data := Pointer(Tobject); |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Ähm....
zwischen
Delphi-Quellcode:
und
var
p: Pointer; obj: TObject; p := obj;
Delphi-Quellcode:
darf doch kein unterschied sein?!
var
p: Pointer; obj: TObject; p := Pointer(obj); |
Re: TTreeNode soll auf ein anderes Objekt zeigen
Richtig.
Seien p ein Pointer und obj ein TObject.
Delphi-Quellcode:
Weißt p den Instanzenpointer von obj zu.
p:=obj;
Delphi-Quellcode:
Das gleiche.
p:=Pointer(obj);
Delphi-Quellcode:
Weißt p einen Pointer auf den Instanzenpointer von obj zu. Also wenn der Instanzenpointer von obj auf dem Stack liegt, wird p der Wert von esp zugewiesen, z.B.
p:=@obj;
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
Aber warum sollte ich denn, wenn es beide die gleichen Vorgänge sind, mit Pointer() zuweisen? Abgesehen davon das es jetzt so geht und ich nur ungerne wieder zurückgehe, wo es ja nicht funktioniert hat!
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
Sollst du nicht. Ich habe nur gesagt, dass es so auch gegangen wäre und habe genau gesagt, was die einzelnen Anweisungen machen.
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
Ich meinte auch luke...
Zitat:
|
Re: TTreeNode soll auf ein anderes Objekt zeigen
hast du dich da verzitiert? das ist nämlich alt ^^
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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