![]() |
Tapi Callback Funktion darf nicht in Klasse sein
Hallo,
ich versuche eine vorhandene Anwendung objektorientiert neu zu erstellen, die sich über die Tapi mit unserer Telefonanlage beschäftigt. Ich habe als Objekte Lines, Devices und Calls erstellt und möchte nun als letztes ein Objekt erstellen, dass diese anderen Objekte verwalten kann, wenn man so will das TapiApp-Objekt. Dieses soll auch die Tapi initialisieren und und die Zugriffe darauf steuern. Das Problem ist, das beim initialisieren der Tapi, dieser eine Callback-Funktion übergeben werden muss, die aber nicht in einer Klasse liegen darf!!! Eine entsprechende nun nackt im Implememntation-Teil erstellte Funktion ist natürlich kein Problem und wird auch aufgerufen. Nur soll die Funktion ja auch alles gemeldete an das TapiApp Objekt weitergeben, aber wie kann ich das (ausser mit einer globalen Variable für das TapiApp Objekt) machen? |
AW: Tapi Callback Funktion darf nicht in Klasse sein
Wie sieht der Callback denn aus? Evtl. kann man da ein wenig tricksen.
|
AW: Tapi Callback Funktion darf nicht in Klasse sein
Ich würde das Tapi-Object vermutlich als Singleton implementieren. Der Unterschied zur globalen Variable ist natürlich nicht so wirklich groß, aber es ist doch etwas objektorientierter. Wenn mehrere Instanzen von Klassen informiert werden müssen, dann musst Du noch einen Observer implementieren. Die melden sich an der Singletonklasse an und werden von ihr über die Statusänderungen informiert.
|
AW: Tapi Callback Funktion darf nicht in Klasse sein
Delphi-Quellcode:
unit MyTapiObj;
interface type TMyTapiObj = class protected procedure CalledFromCallBack; public constructor Create; destructor Destroy; override; end; implementation var _TapiInitialized : Boolean; _MyTapiObjList : TObjectList; procedure TapiCallBack; var LIdx : Integer; begin for LIdx := 0 to Pred( _MyTapiObjList ) do ( _MyTapiObjList[LIdx] as TMyTapiObj ).CalledFromCallBack; end; procedure TapiInitialize; begin if not _TapiInitialized then begin // Initialization code goes here _TapiInitialized := True; end; end; constructor TMyTapiObj.Create; begin inherited; TapiInitialize; _MyTapiObjList.Add( Self ); end; destructor TMyTapiObj.Destroy; begin _MyTapiObjList.Remove( Self ); inherited; end; initialization _MyTapiObjList := TObjectList.Create( False ); finalization _MyTapiObjList.Free; end. |
AW: Tapi Callback Funktion darf nicht in Klasse sein
Alternativ mal hier in der DP nach MakeProcInstance suchen. Diese Funktion generiert dir einen klassischen Funktionspointer, der aber dafür sorgt, dass dein Callback im Kontext der Objektinstanz ausgeführt wird.
|
AW: Tapi Callback Funktion darf nicht in Klasse sein
Wenn es keine Methode sein darf, dann kann man das dennoch als statische Klassenmethode deklarieren, welche die selbe Signaur besitzt, wie eine normale Funktion/Prozedur.
Delphi-Quellcode:
static lässt bei Klassenmethoden das Self weg.
type
TIrgendwas = class class function MyCallback(P: PAnsiChar): Integer; stdcall; static; end; // entspricht function MyCallback(P: PAnsiChar): Integer; stdcall; |
AW: Tapi Callback Funktion darf nicht in Klasse sein
@himitsu
Kann Delphi 6 schon class procedures? |
AW: Tapi Callback Funktion darf nicht in Klasse sein
Hmmmmm, müßte man ausprobieren.
D7 kannte das (glaub ich) zumindestens schon. (wäre ja zu toll, wenn sowas in der OH stünde ... so wie beim MSDN :angle:) |
AW: Tapi Callback Funktion darf nicht in Klasse sein
Eigentlich ist das nicht unbedingt verkehrt, wenn hier Lösungen zu der Frage gepostet werden, die mit der Delphi-Version des Fragenden gar nicht umgesetzt werden können. Wenn jemand nach einem ähnlichen Problem sucht, mag der ja durchaus eine neuere Delphi-Version haben. Man muss sich ja nicht unnötigerweise die Sourcen verrenken.
|
AW: Tapi Callback Funktion darf nicht in Klasse sein
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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