Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer auf Objekt setzen und verwenden (https://www.delphipraxis.net/87294-pointer-auf-objekt-setzen-und-verwenden.html)

maximus Caesar 26. Feb 2007 15:46


Pointer auf Objekt setzen und verwenden
 
Hallo!
Ich fange gerade mit Pointern an...
Also, ich habe mehrer zur Laufzeit erzeugte TTreeview.
Wird auf eines geklickt, so soll sich die Farbe verändern und ein Pointer darauf gesetzt werden, während das, auf das der Pointer davor gesetzt war, wieder die ursprüngliche Farbe annehmen soll.
Das ganze habe ich jetzt so versucht:
Delphi-Quellcode:
procedure TMainForm.TreeMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (g_Objekt<>nil) then
  begin
    TTreeView(g_Objekt^).Color:=clWindow;
  end;
  g_Objekt:=@Sender;
  TTreeview(g_Objekt^).Color:=clAqua;
end;
Leider funktioniert das ganze nicht...
g_Objekt ist eine globale Variable (g_Objekt:Pointer).

Das jeweils angeklickte ändert die Farbe, aber das vorherige bleibt wie es ist.
Was mache ich Falsch?

mkinzler 26. Feb 2007 16:26

Re: Pointer auf Objekt setzen und verwenden
 
Beim Parameter Semder handelt es sich schon um eine Referenz(Zeiger)!
Delphi-Quellcode:
(Sender as TTreeView).Color:=clWindow;

maximus Caesar 26. Feb 2007 16:38

Re: Pointer auf Objekt setzen und verwenden
 
D.h. wenn ich g_Objekt statt als Pointer als TTreeview verwende, dann ist das auch ein Zeiger, oder?

Damit funktionierts...

mkinzler 26. Feb 2007 16:51

Re: Pointer auf Objekt setzen und verwenden
 
Was ist g_Objekt?

mojo777 28. Feb 2007 22:01

Re: Pointer auf Objekt setzen und verwenden
 
nicht so ganz. also pointer an sich sind zeiger auf einen speicherplatz(!)
wenn du ein objekt übergibt, dann übergibst du eine instanz von diesem.
so kannst du z.b. aus einer procedure ein objekt irgendwohin übergeben und dann irgendwo speichern.
nicht aber bei pointern.

bsp:

Delphi-Quellcode:
procedure saveObjPointer(obj:Pointer);
  begin
  self.addToList(obj);
  end;

und

procedure saveObj(obj:Tobj);
  begin
  self.objArr[2]:=obj;
  end;

so. jetzt liegt der trick im aufruf:


procedure aufruf();
  var obj:Tobj;
  begin
  obj:=TobjCreate(...);
   saveObjPointer(@obj); //1. funktiniert nicht, weil das eigentliche obj. nur solange lebt, wie die procedur, die ihn erstellt hat.
  saveObj(obj);
  end;

procedure test();
  var obj:^Tobj;
  begin
  obj:=self.list[i];
  obj^.GibName; //BOOM! Fehler! Das Ding ist nicht mehr da, weil die proc "aufruf" schon längst tot ist.

  self.objArr[2].gibName; //klappt
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 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