VBTapi und dessen Stati

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Don_Batisto.

    VBTapi und dessen Stati

    Es soll via Tapi die Verbindung zum angeschlossenen Telefon erstellt werden.
    Das Verbinden funktioniert, eben so das Raustelefonieren oder das Erkennen eines eingehenden Anrufs.

    Eine Sache bereitet mir aber noch Kopfschmerzen:

    Je nach Tapi-Status soll einem Label auf der Form ein bestimmter Text übergeben werden.

    Nun habe ich mir dann folgendes gedacht:
    Wenn ich die Verbindung zur Tapi aufbaue, übergebe ich ihm die Form.
    Diese geht dann an eine globale Variable und damit greife ich dann auf das Label zu.

    Das sieht dann so aus:

    VB.NET-Quellcode

    1. Dim g_frmMain As Form1
    2. Sub New(ByVal frmMain As Form1)
    3. Try
    4. g_frmMain = frmMain
    5. g_frmMain.lblAktion_Value.Text = "wartend"
    6. Catch ex As Exception
    7. End Try
    8. End Sub


    Wenn nun die Verbindung steht, sehe ich, dass das Label den Text auch erhalten hat.

    Wenn ich jetzt aber ein Gespräch beginne oder ein Gespräch von außen reinkommt, soll sich der Status dementsprechend ändern.

    Die Stati erhalte ich über das folgende Tapi-Event:

    VB.NET-Quellcode

    1. Private Sub oTAPI_Event(ByVal TapiEvent As TAPI3Lib.TAPI_EVENT, ByVal pEvent As Object) Handles oTAPI.Event
    2. Dim thAsyncCall As System.Threading.Thread
    3. Select Case TapiEvent
    4. Case TAPI_EVENT.TE_CALLSTATE 'Call State Changes
    5. ' assigning our sub's delegate to the thread
    6. thAsyncCall = New Threading.Thread(AddressOf CallStateEvent)
    7. ' passing the variable for the thread
    8. CallStateObject = CType(pEvent, ITCallStateEvent)
    9. ' starting the thread
    10. thAsyncCall.Start()
    11. End Select
    12. End Sub


    Dies ist die Funktion, die erkennt ob sich bei der Tapi etwas tut.

    Dort löst er dann das folgende aus:

    VB.NET-Quellcode

    1. Private Sub CallStateEvent()
    2. ' here we should check to see call state and handle connects and disconnects
    3. Select Case CallStateObject.State
    4. Case CALL_STATE.CS_INPROGRESS
    5. g_frmMain.lblAktion_Value.Text = "laufendes Gespräch"
    6. Case CALL_STATE.CS_OFFERING
    7. Try
    8. g_frmMain.lblAktion_Value.Text = "eingehender Anruf"
    9. Catch ex As Exception
    10. End Try
    11. Case CALL_STATE.CS_DISCONNECTED
    12. g_frmMain.lblAktion_Value.Text = "wartend"
    13. End Select
    14. End Sub


    Dieses Sub enthält die verschiedenen erlaubten Event-Kennungen und setzt dementsprechend den Text des Labels.

    Was mir nun totale Kopfschmerzen bereitet, ist, dass ich sowohl im Sub New als auch im Sub CallStateEvent den Label-Text mit g_frmMain.lblAktion_Value.Text setze, dieses "Ändern" aber nur im Sub New auch erkennbar ist...

    Wieso ist das so, dass er das nicht überall ändet?
    Wie kann ich noch den Label-Text ändern?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Don_Batisto“ ()

    Trenne GUI und Daten!
    Ist es möglich, von dort ein Event zu senden?
    Das könntest Du im Hauptfenster auffangen und das Label anpassen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe es gestern abend mal getestet ob die Tapi-Events in der Hauptform erkennbar sind.
    Da hat es aber auch nicht geklappt.

    Ich werde heute nun noch mal etwas testen, aber wenn jemand einen Vorschlag hat, wie ich die Stati noch setzen kann, dann wär ich sehr dankbar!

    Don_Batisto schrieb:

    ob die Tapi-Events in der Hauptform erkennbar sind.
    Die fängst Du in Deiner Tapi-Klasse ab und reichst sie per RaiseEvent weiter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also das ist mein Tapi-Event, in dem die Stati erkannt werden:

    VB.NET-Quellcode

    1. Public Sub oTAPI_Event(ByVal TapiEvent As TAPI3Lib.TAPI_EVENT, ByVal pEvent As Object) Handles oTAPI.Event
    2. Dim thAsyncCall As System.Threading.Thread
    3. Select Case TapiEvent
    4. Case TAPI_EVENT.TE_CALLSTATE
    5. thAsyncCall = New Threading.Thread(AddressOf CallStateEvent)
    6. CallStateObject = CType(pEvent, ITCallStateEvent)
    7. Select Case CallStateObject.State
    8. Case CALL_STATE.CS_CONNECTED
    9. changeAktion(1)
    10. Case CALL_STATE.CS_INPROGRESS
    11. changeAktion(1)
    12. Case CALL_STATE.CS_OFFERING
    13. Try
    14. changeAktion(2)
    15. Dim m_Numb As String = CallStateObject.Call.CallInfoString(CALLINFO_STRING.CIS_CALLERIDNUMBER)
    16. GetAnsprechpartnerByNumber(m_Numb)
    17. Catch ex As Exception
    18. changeAktion(5)
    19. End Try
    20. Case CALL_STATE.CS_DISCONNECTED
    21. changeAktion(3)
    22. End Select
    23. thAsyncCall.Start()
    24. End Select
    25. End Sub


    Mit der folgenden Funktion soll der Status auch im Label ankommen:

    VB.NET-Quellcode

    1. Public Function changeAktion(ByVal CaseNumber As Integer)
    2. Select Case CaseNumber
    3. Case 1 'laufendes gespräch
    4. Form1.lblAktion_Value.Text = "laufendes Gespräch"
    5. 'NotifyIcon1.ShowBalloonTip(5000, "Info", "laufendes Gespräch", ToolTipIcon.Info)
    6. Case 2 'eingehendes gespräch
    7. Form1.lblAktion_Value.Text = "eingehendes Gespräch"
    8. 'NotifyIcon1.ShowBalloonTip(5000, "Info", "eingehendes Gespräch", ToolTipIcon.Info)
    9. Case 3 'wartend
    10. Form1.lblAktion_Value.Text = "wartend"
    11. 'NotifyIcon1.ShowBalloonTip(5000, "Info", "wartend", ToolTipIcon.Info)
    12. Case 5 'keine Kontaktdaten verfügbar
    13. Form1.NotifyIcon1.ShowBalloonTip(5000, "Info", "Keine Kontaktdaten verfügbar", ToolTipIcon.Info)
    14. End Select
    15. 'lblAktion_Value.Update()
    16. Form1.lblAktion_Value.Refresh()
    17. changeAktion = ""
    18. End Function




    Nun habe ich eben mal geschaut was du mit RaiseEvent meinst und bin auf msdn.microsoft.com/en-us/library/fwd3bwed(v=vs.71).aspx gestossen...
    Aber welche Funktion muss ich jetzt so aufrufen? MMn. "oTAPI_Event"
    Nun die 2. Frage ist, WO müsste ich das RaiseEvent platzieren?
    Nimm mal deine ganzen Try...Catch... Blöcke raus. Entweder der Code wirft eine Exception, dann funktioniert er nie, oder eben nicht, dann läuft er immer.

    Don_Batisto schrieb:

    Aber welche Funktion muss ich jetzt so aufrufen?
    allgemeines Event

    VB.NET-Quellcode

    1. Public Event MyTapiEvent(sender As System.Object, e As System.EventArgs)
    2. Private Sub xxx()
    3. RaiseEvent MyTapiEvent(Me, EventArgs.Empty)
    4. End Sub
    Du kannst natürlich weiterführende Funktionen mit durchreichen, wenn Du eine von EventArgs abgeleitete Klasse benutzt:
    spezielles Event
    [vb]Public Class Form1
    Public Event MyTapiEvent(sender As System.Object, e As MyTapiEventArgs)
    Private Sub xxx()
    RaiseEvent MyTapiEvent(Me, New MyTapiEventArgs(17))
    End Sub
    End Class

    Public Class MyTapiEventArgs
    Inherits EventArgs
    Public Property myProperty As Integer
    Public Sub New(prop As Integer)
    myProperty = prop
    End Sub
    End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    An der Stelle Case CALL_STATE.CS_OFFERING ist das TryCatch aber sehr praktisch und ob da nun ein TryCatch drin ist oder nix.
    Es trägt nix zum Thema bei!

    Habe eben das Beispiel von dieser Seite ausprobiert: msdn.microsoft.com/en-us/library/ms973905.aspx

    Also in der Form ein

    VB.NET-Quellcode

    1. Dim WithEvents EventsDerTapi As New VBTAPI
    zu meiner Tapi-Klasse.
    Dann in der Klasse oben ein

    VB.NET-Quellcode

    1. public event neuerstatus()

    und im form_load

    VB.NET-Quellcode

    1. AddHandler EventsDerTapi.neuerstatus, AddressOf statusändern
    .

    Und wenn nun in der Klasse die Events ermittelt werden mache ich anschließend

    VB.NET-Quellcode

    1. raiseevent neuerstatus
    und er geht auch schön in die statusämdern-funktion.

    Wenn ich in dieser aber den Text des Labels ändern möchte kommt diese Fehlermeldung: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lblAktion_Value erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Was heißt denn das jetzt? Mal bitte auf Deutsch ^^

    Don_Batisto schrieb:

    Was heißt denn das jetzt?
    Dass Du leider die Suchfunktion nicht bemüht hast: Ungültiger threadübergreifender Vorgang:
    Suchergebnisse
    Suchergebnisse 1-30 von insgesamt 135 für »Ungültiger threadübergreifender Vorgang«.
    Diese Suchbegriffe wurden hervorgehoben: Ungültiger threadübergreifender Vorgang
    Das Zauberwort heißt Invoke.
    Das Event sollte von der aufrufenden (die Tapi-Klasse haltenden) Klasse aboniert werden, also z.B. der Form selbst.
    Und in der Form schreibst Du dann rein

    VB.NET-Quellcode

    1. Me.Invoke(Sub() Label1.Text = "Bla")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    I love it!

    Kann man dich hier iwo wählen oder dir sonst iwie nen "Daumen hoch" geben außer den Post als hilfreich zu markieren?

    Mit dem RaiseEvent und dem Me.Invoke klappt nun alles!
    Er erkennt dass Tapi-Event und ändert endlich auch den Text!