![]() |
AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz
Delphi-Quellcode:
P.S.: Da war Deep-Sea schneller - aber auch kürzer... :wink:
type
TMyClass = class(...) public procedure CallbackProc(pAddr: PAmsAddr; pNotification: PAdsNotificationHeader); procedure InitCallback; end; procedure Callback(pAddr: PAmsAddr; pNotification: PAdsNotificationHeader; hUser: Longword); stdcall; begin TMyClass(hUser).CallbackProc(pAddr,pNotification); end; procedure TMyClass.CallbackProc(pAddr: PAmsAddr; pNotification: PAdsNotificationHeader); begin end; procedure TMyClass.InitCallback; var Result: ...; begin Result:=AdsSyncAddDeviceNotificationReq(@serverAddr,ADSIGRP_DEVICE_DATA, ADSIOFFS_DEVDATA_ADSSTATE, @adsNotificationAttrib, @Callback, //hier steht die Adresse der Callback-Routine Longword(self), //an dieser Stelle will ich den Zeiger der Klasseninstanz übergeben @hDevNotification); end; |
AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz
Man könnte zwar auch eine externe Prozedur nehmen, aber so isses bestimmt schöner aufgeräumt.
PS: Das "static" nicht vergessen.
Delphi-Quellcode:
[edit]
type
TMeinObjekt = class(...) class procedure Callback(Addr: PAmsAddr; Notification: PAdsNotificationHeader; User: LongWord); stdcall; static; procedure InnerCallback(Addr: PAmsAddr; Notification: PAdsNotificationHeader); end; procedure TMeinObjekt.Callback(Addr: PAmsAddr; Notification: PAdsNotificationHeader; User:Longword); begin TMeinObjekt(hUser).InnerCallback(Addr, Notification); end; var MeinObjekt: TMeinObjekt; AdsSyncAddDeviceNotificationReq(..., @MeinObjekt.Callback, LongWord(MeinObjekt), ...); da war ja nochwer fast genauso schnell :lol: |
AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz
Ich bin ja begeistert, was ihr da so hinzaubert... :o
Aber könnt ihr mir mal erklären, warum ihr das so macht? Bitte :? |
AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz
Wir übergeben als User-Parameter die Objektinstanz und als Zeiger eine Prozedur, statische Klassenmethode (welche quasi auch nur eine Prozedur darstellt)
Davor haben wir uns eine Prozedur gebastelt, deren Signazur derer entspricht, welchge von als Callback verlangt wird und darin wird dann einfach nur über den übergebenen Methodenzeiger auf eine Methode dieses Objektes zugeriffen/umgeleitet. Als Ergebnis wird somit also eine Methode eines Objekts aufgerufen. PS: Ein "Zeiger" auf eine Methode enthält intern auch zwei Zeiger > einmal auf das Objekt und dann noch auf die Methode. "Zeiger" ... ach, schau dir einfach mal an, was die .OnIrgendwas Events deiner VCL haben, also nahezu alles was du im IO deinen VCL-Komponenten als Ereignisse zuweisen kannst, bzw. der Typ der zugehörigen Event-Property. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 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