Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Hallo!
Ich schreibe gerade meinen Basecode neu auf Basis einer ebsseren Objekt-Orientierten Struktur. Dabei benutze ich weiterhin nicht die VCL, sondern die reine WinAPI bzw. Xlib unter Linux. Nun habe ich das "Problem", dass ich für ein Fenster ja eine Function zur Message-Behandlung brauche:
Diese würde ich aber gerne in meine Klasse integrieren, also etwa TFensterklasse.WndProc... Dabei stellt sich das Problem, dass diese dann zwar aufgerufen wird, aber nur 3x mit dem Wert 0 für Msg und das Fenster nicht erstellt werden kann. Ich musste das ganze so lösen, damit er überhaupt erstmal compilierte:
Code:
type
TWndProc = function (hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT of object; stdcall;
Gibt es eine Möglichkeit, das innerhalb einer Klasse zu lösen, oder muss ich den etwas uneleganteren Weg gehen, die Function außerhalb der Klasse zu definieren und aus ihr eine Funktion innerhalb der Klasse aufzurufen?
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Methoden haben noch den impliziten Self Parameter und deshalb besteht ein Zeiger auf eine Methode (procedure of object) auch aus der Objektreferenz und dem Zeiger auf die Methode. Daher kann diese Methode nicht direkt wie eine normale Funktion aufgerufen werden.
Die Funktion MakeObjectInstance aus der Unit Forms erzeugt für eine Methode einen kurzen Code Block, der zusätzlich noch den Self Parameter auf den Stack legt:
function MakeObjectInstance(Method: TWndMethod): Pointer;
Man muß hierbei VirtualAlloc benutzen weil bei Speicher, der mit GetMem belegt wird, das Execute Bit nicht gesetzt wird und das sonst bei neueren Prozessoren Probleme bereiten würde.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.