Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SetProp und Self (https://www.delphipraxis.net/101462-setprop-und-self.html)

Neutral General 13. Okt 2007 20:32


SetProp und Self
 
Hi,

Beim erstellen einer Klasse versuche ich Self an das Fenster zu heften.

Delphi-Quellcode:
var hg: HGLOBAL;
    dat: Pointer;
begin
  hg := GlobalAlloc(GPTR,SizeOf(Self));
  dat := GlobalLock(hg);
  CopyMemory(dat,Self,SizeOf(Self));
  GlobalUnlock(hg);
  SetProp(FHandle,MakeIntAtom(SelfAtom),hg);
end;
So ungefähr sieht das ganze aus. In einer Procedure (keine Methode dieser Klasse) versuch ich auf Self so zuzugreifen:

Delphi-Quellcode:
function WndProcDispatch(wnd: HWND; Msg: UINT; lp: LPARAM; wp: WPARAM): LResult; stdcall;
var Self: TNVCLForm;
begin
  Integer(Self) := GetProp(wnd,MakeIntAtom(SelfAtom));
  // Weitere Operationen mit Self
  // ..
end;
Also GetProp liefert mir was zurück.. Damit kann ich auch mehr oder weniger arbeiten. Aber eher weniger. Ich kann Methoden von Self aufrufen aber innerhalb dieser Methoden ist Self dann totaler Unsinn. Wahrscheinlich schon vorher... Aber Methoden aufrufen geht irgendwie...

Ich schätze ich mache irgendwas falsch beim Setzen der Property.
Wäre froh wenn sich das jemand mal angucken könnte ;)

Gruß
Neutral General

Apollonius 13. Okt 2007 20:52

Re: SetProp und Self
 
Erstmal sagt es gar nichts aus, dass du (statische) Mathoden aufrufen kannst, da diese eh wie normale Routinen aufgerufen werden.
Zweitens: Warum verwendest du überhaupt GlobalLock? Mit GPTR erhältst du doch schon einen Pointer als Rückgabewert von GlobalAlloc.
3. Wenn du weißt, dass du Self speichern musst, würde ich persönlich lieber die zusätzlichen Bytes verwenden, die du in der WndClassEx-Struktur im Feld cbWndExtra angeben kannst. Das ist jedoch nur meine private Meinung.

So jetzt habe ich viel geschrieben, ohne dein Problem zu lösen. Hast du mal die Rückgabetypen der ganzen Funktionen geprüft? GetLastError?

Neutral General 13. Okt 2007 20:59

Re: SetProp und Self
 
Hi,

Die Funtkionen sind alle ok. Du hast ja diese Möglichkeit mit cbWndExtra angesprochen. Wie würde ich denn diese Daten abrufen können?

Gruß
Neutral General

Apollonius 13. Okt 2007 21:17

Re: SetProp und Self
 
In TWndClassEx gibst du nur die Größe an, also wie viel Speicher pro Fenster reserviert wird. Zum Zugriff wird Get- und SetWindowLong verwendet.

sirius 14. Okt 2007 09:29

Re: SetProp und Self
 
Das MakeProcInstance dürfte aber auch sehr gut als WndProcDispatcher funktionieren :zwinker:


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