AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TTreeNode soll auf ein anderes Objekt zeigen
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeNode soll auf ein anderes Objekt zeigen

Ein Thema von xZise · begonnen am 23. Apr 2007 · letzter Beitrag vom 24. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 17:17
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 17:30
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 17:39
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 ^^
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 17:40
Man sollte CodeGear raten, die Onlinehilfe aus Kostengründen in den weiteren Versionen komplett zu entfernen...
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 17:56
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?
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#6

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 18:02
Delphi-Quellcode:
if TObject(Data) is TM2MFile then
  Showmessage('TM2MFile!');
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 18:13
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):

mMemo.Lines.Text := TM2MFile(Node.Data^).Memo; PS: "Name" würde auch anstelle von "Memo" gehen ^^[/edit]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 22:05
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
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 22:23
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 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 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 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]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: TTreeNode soll auf ein anderes Objekt zeigen

  Alt 23. Apr 2007, 22:27
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:

Node.Date := Pointer(TM2MInstance);
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 Uhr.
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