Autor Beitrag
ts_dev
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 02.10.21 10:24 
Hallo zusammen,

ich bin am Verzweifeln und brauche ein wenig Hilfe.

Ich muss in altes Delphi Programm ein Update vornehmen.

In C# sieht mein Code folgendermaßen aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private void StartInBackground()
{
    _phoneListener = new ScreenPopTelephoneListener();

    _phoneListener.Initialize("6000@XXX");

    _phoneListener.StartListening("000");

    _phoneListener.ScreenPop += new _IScreenPopTelephoneListenerEvents_ScreenPopEventHandler(ScreenPopEvent);

    this.Shutdown += new HiPathScreenPop_ShutdownEventHandler(HiPathScreenPop_Shutdown);
}

private void ScreenPopEvent(ScreenPopTelephoneEvent screenpoptelephoneevent)
{
    Console.WriteLine(screenpoptelephoneevent.From);

    Console.WriteLine(screenpoptelephoneevent.Destination);

    Console.WriteLine(screenpoptelephoneevent.QueueName);
}

Leider habe ich keine Ahnung wie das in Delphi gelöst wird und finde per Google kein passendes Beispiel.

In Delphi 10.4 wurde mir die beigefügte TLB generiert.
 
Delphi:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var Listener : ScreenPopTelephoneListener;

...

Listener := CoScreenPopTelephoneListener.Create;

Listener.Initialize('6000@XXX');

Listener.StartListening('000');

Wie kann ich auf das Event ScreenPop in Delphi reagieren? (Function)

Vielen Dank im voraus.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus Dateizugriff verschoben am Sa 02.10.2021 um 14:28
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 02.10.21 14:21 
Hallo und :welcome:

ein Ereignis zuweisen geht in Delphi fast analog zu C# (oder anderen Sprachen), nur daß hier kein Eventhandler hinzugefügt, sondern nur zugewiesen werden muß (Delphi kennt kein Multicast-Event), s.a. Ereignisse (Delphi).
Bei dir also
ausblenden Delphi-Quelltext
1:
Listener.ScreenPop := ScreenPopEvent;					

Der Eventhandler ScreenPopEvent muß natürlich dann die passende Signatur besitzen.

PS: Auch in C# reicht ein einfaches
ausblenden C#-Quelltext
1:
_phoneListener.ScreenPop += ScreenPopEvent;					
ts_dev Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 02.10.21 15:42 
Hallo Th69,

vielen Dank für die schnelle Antwort.

Ja, so hatte ich es schon probiert und wäre es für mich auch logisch gewesen, jedoch wird mir die Function beim Listener gar nicht angezeigt.

In der Komponente ist ScreenPop nur als dispinterface vorhanden unter _IScreenPopTelephoneListenerEvents. Wie komme ich da ran?

Wenn ich es wie folgt eingebe:
ausblenden Delphi-Quelltext
1:
Listener.ScreenPop := ScreenPopEvent;					

erhalte ich diese Fehlermeldungen:

Zitat:
[dcc32 Fehler] Unit1.pas(70): E2003 Undeklarierter Bezeichner: 'ScreenPop'
[dcc32 Fehler] Unit1.pas(70): E2035 Nicht genügend wirkliche Parameter
[dcc32 Fataler Fehler] ScreenPop.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconTh69: Quote-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 03.10.21 10:35 
Sorry, habe nicht erkannt, daß es sich dabei um eine COM-Library handelt (statt 2 getrennter Implementierungen für .NET und Delphi).

Damit habe ich leider auch keine Erfahrung.
Ich habe aber folgenden umfangreichen Artikel dazu gefunden: Automation in Delphi COM Programming: COM Events and Callbacks (wenn ich das richtig verstanden habe, müßte das letzte Beispiel, ab "Creating the Client" das für dich passende sein).
Trotzdem verstehe ich auch nicht, wie man die beiden Klassen (bzw. Interfaces) ScreenPopTelephoneListener und _IScreenPopTelephoneListener dann verbinden kann (in dem Beispiel wird das entsprechende Event beim Connect an den Server als Parameter übergeben).

Edit: Ich habe noch mal etwas nachgeforscht. Bei .NET funktioniert das anscheinend mittels des Attributs ComSourceInterfaces, s. z.B. Supporting COM Events from a Managed Class.
Für Delphi habe ich noch Supporting automation events in Delphi sowie COM, COM events, .NET and some Delphi (beiden letzten Absätze) gefunden - such mal selber nach TEventSink.

Ansonsten mußt du mal beim Siemens Support nachfragen bzgl. _IScreenPopTelephoneListenerEvents für die Benutzung mit Delphi.