Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Tapi Callback Funktion darf nicht in Klasse sein (https://www.delphipraxis.net/171806-tapi-callback-funktion-darf-nicht-klasse-sein.html)

Jumpy 26. Nov 2012 12:01

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?

DeddyH 26. Nov 2012 12:13

AW: Tapi Callback Funktion darf nicht in Klasse sein
 
Wie sieht der Callback denn aus? Evtl. kann man da ein wenig tricksen.

Nersgatt 26. Nov 2012 12:14

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.

Sir Rufo 26. Nov 2012 12:15

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.

Zacherl 26. Nov 2012 12:20

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.

himitsu 26. Nov 2012 12:52

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:
type
  TIrgendwas = class
    class function MyCallback(P: PAnsiChar): Integer; stdcall; static;
  end;

// entspricht

function MyCallback(P: PAnsiChar): Integer; stdcall;
static lässt bei Klassenmethoden das Self weg.

Sir Rufo 26. Nov 2012 12:58

AW: Tapi Callback Funktion darf nicht in Klasse sein
 
@himitsu

Kann Delphi 6 schon class procedures?

himitsu 26. Nov 2012 13:04

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:)

Uwe Raabe 26. Nov 2012 13:30

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.

sh17 26. Nov 2012 13:41

AW: Tapi Callback Funktion darf nicht in Klasse sein
 
Zitat:

Zitat von Sir Rufo (Beitrag 1193008)
Kann Delphi 6 schon class procedures?

ja, funktioniert bereits in Delphi 6


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 Uhr.
Seite 1 von 4  1 23     Letzte »    

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