Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TTreeNode soll auf ein anderes Objekt zeigen (https://www.delphipraxis.net/90774-ttreenode-soll-auf-ein-anderes-objekt-zeigen.html)

xZise 23. Apr 2007 16:17


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:
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.
Wie man sieht nicht viel Code, wenn man von Parent und Create absieht.
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:
procedure TfrmMain.tvMemolistChange(Sender: TObject; Node: TTreeNode);
var
  pParent : TTreeNodeEx;
begin
  pParent := TTreeNodeEx(Node);
  Showmessage(pParent.AssociatedWith.Name);
end;
Aber es hat nicht sein sollen => AV

Khabarakh 23. Apr 2007 16:30

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.

xZise 23. Apr 2007 16:39

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

Khabarakh 23. Apr 2007 16:40

Re: TTreeNode soll auf ein anderes Objekt zeigen
 
Man sollte CodeGear raten, die Onlinehilfe aus Kostengründen in den weiteren Versionen komplett zu entfernen...

xZise 23. Apr 2007 16:56

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:
if Node.Data^ is TM2MFile then
  Showmessage('TM2MFile!');
So auf jedenfall nicht...

Wegen der Hilfe... Auf was sollte das eine Anspielung sein?

DGL-luke 23. Apr 2007 17:02

Re: TTreeNode soll auf ein anderes Objekt zeigen
 
Delphi-Quellcode:
if TObject(Data) is TM2MFile then
  Showmessage('TM2MFile!');

xZise 23. Apr 2007 17:13

Re: TTreeNode soll auf ein anderes Objekt zeigen
 
Danke... Aber jetzt gibt es da eine AV...
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Memonizer.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00403CFC in Modul 'Memonizer.exe'. Lesen von Adresse 5DE58B37' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Allerdings weiß ich nicht, ob die von deinem Konstrukt kommt, da etwas weiter unten im Code auch eine AV kommt (aber diese AV von oben, passiert, laut debuger in der Zeile wo überprüft wird) und die ggf. die gleiche Quelle haben... Mal funktionierts mal nicht :/

[edit]Ich verstehe die Welt nicht mehr ....

Also hier ist alles i.O.:
Delphi-Quellcode:
child.Data := @b;
Showmessage(TM2MFile(child.Data^).Name);
Aber dann (es folgenen jetzt nur die Initialisierung der anderen Fenster) gibts ne AV im OnChange Ereignis (Hinweis: Dazwischen ist ansonsten nichts):

Delphi-Quellcode:
mMemo.Lines.Text := TM2MFile(Node.Data^).Memo;
PS: "Name" würde auch anstelle von "Memo" gehen ^^[/edit]

DGL-luke 23. Apr 2007 21:05

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

xZise 23. Apr 2007 21:23

Re: TTreeNode soll auf ein anderes Objekt zeigen
 
Zitat:

Zitat von DGL-luke
warum dereferenzieren?

Das ist dieses "^" am ende des Pointers?
Ist es nicht so, dass ich die Variable, und nicht den Zeiger der Variable, casten muss?


Zitat:

Zitat von DGL-luke
- auf <> nil prüfen

Habe ich schon "indirekt", indem er mir eine msg anzeigen sollte, wenn es "nil" ist, aber das war es nicht :(
Zitat:

Zitat von DGL-luke
- as-operator verwenden, dann kriegst du ne Excweption, wenn mit dem typ was nicht stimmt.

Ja könnte man machen, aber es würde ja nicht helfen.
Abgesehen davon, dass der Node in der Changemethode eigentlich richtig sein müsste...

Zitat:

Zitat von DGL-luke
machs doch einfach so wie ich dir sag ;-)

Darum gehts doch nicht mehr ^^ Das überprüfen würde nichts bringen, weil dann nüscht passieren würde ^^

[edit]Wegen as =>
Zitat:

[Pascal Fehler] uMain.pas(331): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
[/edit]

DGL-luke 23. Apr 2007 21:27

Re: TTreeNode soll auf ein anderes Objekt zeigen
 
wie oft denn noch. machs so, wie ich dir sag: ;-)

Delphi-Quellcode:
if TObject(Node.Data) is TM2MFile then
  Showmessage('TM2MFile!');
Meinetwegen auch gerne mit Dereferenzierung, kann man ja beides mal ausprobiern.

PS: Zuweisen so:

Delphi-Quellcode:
Node.Date := Pointer(TM2MInstance);


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz