Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Komisches Problem mit Pointer (https://www.delphipraxis.net/141692-komisches-problem-mit-pointer.html)

blablab 14. Okt 2009 07:39


Komisches Problem mit Pointer
 
Hallo!

Ich hab folgenden Code:

Delphi-Quellcode:
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;
Ich lade die korrekte Adresse in p und möchte nun das TTreeNode an der Adresse p haben.
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

gammatester 14. Okt 2009 08:02

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.

blablab 14. Okt 2009 09:00

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:
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;
Jetzt sollte tmpNode = node sein, ist es aber nicht...

sirius 14. Okt 2009 09:07

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.

Luckie 14. Okt 2009 09:15

Re: Komisches Problem mit Pointer
 
Zitat:

Zitat von sirius
Allerdings erschließt sich mir der Sinn nicht, ein Objektzeiger als String zu speichern.

Vielleicht möchte er sich ihn ausdrucken und an die Wand hängen. ;)

Warum speicherst du den Objektzeiger nicht als das was er ist, nämlich als Zeiger?

hoika 14. Okt 2009 09:16

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

Tyrael Y. 14. Okt 2009 09:17

Re: Komisches Problem mit Pointer
 
Zitat:

Zitat von blablab
Dessen Adresse möchte ich als String speichern und später möchte...

Ich hoffe nicht, daß du mit "speichern" das Speichern in eine Datei meinst.
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.

blablab 14. Okt 2009 09:53

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

Klaus01 14. Okt 2009 09:56

Re: Komisches Problem mit Pointer
 
Zitat:

Zitat von blablab
zwischenspeichern im Rahm :)

den Rahm im flüssigen oder geschlagen/festen Zustand?

Grüße
Klaus

blablab 14. Okt 2009 10:13

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