![]() |
Komisches Problem mit Pointer
Hallo!
Ich hab folgenden Code:
Delphi-Quellcode:
Ich lade die korrekte Adresse in p und möchte nun das TTreeNode an der Adresse p haben.
procedure TForm1.StrGridSuchenDblClick(Sender: TObject);
var p: ^TTreeNode; node: TTreeNode; begin aktKontakt.Node := nil; node := nil; p := Pointer(StrToInt('$' + Copy(FilteredContArr[Pred(RowClicked)]^[0], 9, 8))); ShowMessage(inttostr(integer(p))); node := p^; ShowMessage(inttostr(integer(@node))); aktKontakt.Node := node; KontaktOeffnen; end; komischerweise zeigen mir die beiden ShowMessages zwei verschiedene Zahlen an (1244508 und 1144060). Das kapier ich nicht, was mach ich falsch? Vielen Dank schonmal! Grüße blablab |
Re: Komisches Problem mit Pointer
Was erwartestet Du denn?
Du zeigst den Inhalt von p an (also ein Adresse, die Du etwas undurchsichtig zusammenbastelst, aber wahrscheinleich irgendwo im Heap liegt). Dann zeigst Du die Adresse von node an, und die liegt mit Sicherheit auf dem Stack. Wäre schon arg ungewöhnlich, wenn diese beiden Adresse gleich wären. |
Re: Komisches Problem mit Pointer
Ok, der Test mit den ShowMessages war wohl falsch... :oops:
Deshalb hier nochmal mein Problem: Was ich will: Ich habe ein TTreeNode mit dem namen node. Dessen Adresse möchte ich als String speichern und später möchte ich wieder auf node zugreifen. Was ich mache:
Delphi-Quellcode:
Jetzt sollte tmpNode = node sein, ist es aber nicht...
var str: string;
procedure Nr1; var int: integer; node: TTreeNode begin node := Tree.Items.AddChildFirst(Tree.Selected, 'Neu'); int := Integer(@Node); str := inttostr(int); end; procedure Nr2; var p: ^TTreeNode; tmpNode: TTreeNode; begin tmpNode := nil; p := Pointer(StrToInt(str)); tmpNode := p^; end; |
Re: Komisches Problem mit Pointer
Und was passiert, wenn du das "@" vor dem Node weglässt?
Allerdings erschließt sich mir der Sinn nicht, ein Objektzeiger als String zu speichern. |
Re: Komisches Problem mit Pointer
Zitat:
Warum speicherst du den Objektzeiger nicht als das was er ist, nämlich als Zeiger? |
Re: Komisches Problem mit Pointer
Hallo,
gaaaanz schlecht. Warum zum Teufel ;) machst du sowas ??? Merke dir doch den Node selbst. MS hat dem TTreeNode dazu die Data Variable (einfacher Pointer) verpasst. Ich packe da immer eine eigene Klasse rein, die die Node-Infos enthält. in TTreeView.OnDeleting wird auch die Klasse wieder gelöscht.
Delphi-Quellcode:
type
TTreeNodeInfo = class Tag: Integer; end; var TreeNodeInfo: TTreeNodeInfo TreeNode:= TV.Items.Add; TreeNodeInfo:= TTreeNodeInfo.Create; TreeNodeInfo,Tag:= 1; TreeNode.Data:= TreeNodeInfo; Heiko |
Re: Komisches Problem mit Pointer
Zitat:
Das nächste mal, wenn du dein Programm öffnest, ist die Adresse dieses Nodes mit Garantie nicht dieselbe. Wenn du mit "speichern" meinst, daß du die Adresse des Nodes irgendwo während der Laufzeit halten möchtest meinst, dann ist es völlig unnötig den merkwürdigen Weg über Strings zu gehen. Nimm einfach einen Zahlentypen in dem die Adresse passt oder nimm gleich einen Pointertypen, am Besten genau den Pointertypen den die Node benutzt. |
Re: Komisches Problem mit Pointer
@sirius:
Vielen Dank, Das ist es! :-D Ich stand da etwas auf dem Schlauch, denn komischerweise ging das mit @ bis jetzt immer. Erst zuletzt gings unter bestimmten umständen nicht mehr... @Tyrael Y.: Nein, keine Angst, ich meinte nur zwischenspeichern im Rahm :) @hoika: Danke für den Tipp! @all: ja ich weiß, nen pointer als (Hexadezimal)String zu speichern ist nicht wirklich schön... Am anfang gings noch nicht anders (bzw nur sehr umständlich). Aber inzwischen hab ich die Datenstrukturen nochmal geändert, ich werds wohl demnächst ändern... |
Re: Komisches Problem mit Pointer
Zitat:
Grüße Klaus |
Re: Komisches Problem mit Pointer
@Klaus01: Ich mag ihn lieber im festen zustand.
Habs jetzt geändert, war netmal so schwer. Spart immerhin zusätzlichen Rechenaufwand und 4 Byte. Da freut sich der Rahm, und ich will ja nicht dass er sauer wird. Wer will schon 2GB Sauerrahm...? :P |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 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