Callback nutzen - Tutorial?

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von jan99.

    Callback nutzen - Tutorial?

    Moin!

    ich muss mich für ein Anwendung mit Callback beschäftigen.

    Bisher bin ich noch nicht so richtig fündig geworden und auch meine anderen vb.net-Kontakte haben damit noch nichts gemacht.

    Kann mir jemand mit einem guten Link (am besten in Deutsch) oder einem Beispiel weiterhelfen?

    Gruß Jan
    Callback ist doch nur eine Form von IoC. Du übergibst einer externen Funktion z.B. die Adresse einer eigenen Funktion und die externe Funktion ruft zu gegebenen Zeitpunkten Deine Funktion auf und übergibt ihr irgendwelche Parameter. Wann bzw. unter welchen Umständen jene externe Funktion Deiner Funktion allerdings Parameter übergibt und was diese Parameter beinhalten, ist aber der Doku der externen Funktion zu entnehmen.
    Ein Beispiel: EnumWindows ist eine WinAPI-Function mit CallBack-Mechanismus. Du gibst ihr die Adresse einer Deiner Funktionen, die den CallBack-Anforderungen der EnumWindows-Function entspricht (guckst Du EnumWindows-Doku). Und immer dann, wenn die EnumWindows-Function ein Fenster gefunden hat, meldet sie die Daten des Fensters an Deine Funktion. Entweder bis es keine Fenster mehr zu finden gibt oder Du innerhalb Deiner Funktion sagst: Jetzt ist Schluß.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Genau wie VaporiZed sagt, nur zählt das nicht nur für externe, sonder auch für interne Methoden und Prozesse. Das ist beispielsweise der Anfang der asynchronen Programmierung. Du Rufst also eine asynchrone Methode auf und gibt ihr als Parameter eine deiner eigenen Methoden als CallBack mit. Wenn die asynchrone Methode fertig ist, dann ruf sie deine CallBack Methode auf und du kannst entsprechend weiter machen.

    Vorgehensweise: Übergeben von Prozeduren an eine andere Prozedur in Visual Basic
    Wie man sieht, kann man unter "Callback" verschiedenes verstehen.
    Ich nenne etwa es etwa "Callback", wenn ich eine Methode habe, die einen Delegaten erwartet.
    Weil in der Methode rufe ich dann diesen Delegaten auf - das nenne ich Callback.
    @TE: Was verstehst du unter "Callback"?
    Wenn du das noch nicht klar definieren kannst, dann beschreib doch dein konkretes Problem.
    Moin!

    also bei mir geht es darum erst nach dem Ende einer Funktion die nächste aufzurufen.

    Bisher sah mein Code wie folgt aus:

    VB.NET-Quellcode

    1. Public Overrides Sub Execute(ByVal parameter As Object)
    2. _fLyStatus.IsAllowMinScaleLevel(_MinZoomLevel_BPlan, ForceScaleLevel:=True)
    3. _fLyStatus.SetLayerBPlanOn()
    4. _clientplugin.Application.Project.Map.GetPointAsync("Bitte wählen Sie eine Punkt für die BPlan-Abfrage", AddressOf Me.GetPointCompleted)
    5. End Sub


    Nun ist es so, dass die Funktion IsAllowMinScaleLevel erst abgearbeitet werden muss, damit SetLayerBPlanOn und GetPointAsync folgen können.

    Dazu sind meine Anpassungen nach einigen Beispielen wie folgt geworden (Excecute muss es geben!):

    VB.NET-Quellcode

    1. Public Overrides Sub Execute(ByVal parameter As Object)
    2. _fLyStatus.IsAllowMinScaleLevel(_MinZoomLevel_BPlan, ForceScaleLevel:=True, Callback:=Me.ActionAfterScaleLevel)
    3. End Sub


    Den zweiten Teil habe ich dann in ActionAfterScaleLevel verschoben:

    VB.NET-Quellcode

    1. Private Sub ActionAfterScaleLevel()
    2. _fLyStatus.SetLayerBPlanOn()
    3. _clientplugin.Application.Project.Map.GetPointAsync("Bitte wählen Sie eine Punkt für die BPlan-Abfrage", AddressOf Me.GetPointCompleted)
    4. End Sub


    IsAllowMinScaleLevel habe ich noch wie folgt angepasst:

    VB.NET-Quellcode

    1. Delegate Function DoAfterScaleLevel()
    2. Public Function IsAllowMinScaleLevel(AllowMinScaleLevel As Integer, Optional MsgFunctCancel As Boolean = False, Optional ForceScaleLevel As Boolean = False, Optional Callback As DoAfterScaleLevel = Nothing)
    3. ' ....
    4. ' Callback aufrufen, wenn dieser definiert
    5. If Not Callback Is Nothing Then Callback.Invoke()
    6. Return True
    7. End Function


    So wäre es nach meinem Verständnis logisch gewesen. Aber es wird der Funktionsaufruf mit dem Begriff des Callbacks angemerkt:



    Hier bin ich nun mit meinem Latein am Ende.

    Kann mir einer weiterhelfen?

    Gruß Jan
    Ich versteh nicht ganz. Der Delegat soll also nur bedingt aufgerufen werden, also nicht immer, richtig?

    "bei mir geht es darum erst nach dem Ende einer Funktion die nächste aufzurufen." Das passiert doch immer, solange man nicht mit Nebenläufigkeit arbeitet.
    Ansonsten zur Umsetzung:

    VB.NET-Quellcode

    1. Private Sub X()
    2. ' ...
    3. End Sub
    4. Private Sub Y(DeinDelegat As Action)
    5. DeinDelegat()
    6. End Sub
    7. ' zum Aufruf eben: Y(AddressOf X)


    Hier hat wohl der Editor gesponnen. Ich hab's mal repariert. ~Thunderbolt
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    @jan99 Da hat die Prozedur offenbar die falsche Signatur, d.h., die Parameter stimmen nicht.
    Was wird an Parametern erwartet?
    Was bietet Deine Prozedur an Parametern?
    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!

    jan99 schrieb:

    VB.NET-Quellcode

    1. Public Function IsAllowMinScaleLevel(AllowMinScaleLevel As Integer,
    2. Optional MsgFunctCancel As Boolean = False,
    3. Optional ForceScaleLevel As Boolean = False,
    4. Optional Callback As DoAfterScaleLevel = Nothing)

    Da ist der Callback als DoAfterScaleLevel deklariert, und dassis offsichtlich eine annere Signatur als deine Sub ActionAfterScaleLevel(), deren AddressOf du in deim Bildle als Parameter zu übergeben versuchst.
    Folgendes sollte funktionieren:

    VB.NET-Quellcode

    1. Public Function IsAllowMinScaleLevel(AllowMinScaleLevel As Integer,
    2. Optional MsgFunctCancel As Boolean = False,
    3. Optional ForceScaleLevel As Boolean = False,
    4. Optional Callback As Action = Nothing)

    Weil deine Sub ActionAfterScaleLevel() hat die Signatur einer Action, und dann kannste deren AddressOf auf wie im Bild gezeigt übergeben.
    Guck im Objectbrowser Action nach - das ist eine Sub ohne Parameter.
    Für Subs mit Parametern gibts da noch Action(Of T), Action(Of T1, T2), Action(Of ...)
    Dasselbe gibts auch für Funktionen (also mit Rückgabewerten). Diese heissen dann Func(Of T), Func(Of T1, TResult), [tt]Func(Of [...], TResult)

    Mit Action und Func, generisch und ungenerisch, sollteste dich vertraut machen, wenn du mit Callbacks hantierst (übrigens in "meinem" Verständnis von post#4).
    Es ist absolut unnötig, eigene Delegatentypen zu definieren, also deinen DoAfterScaleLevel-Typ sollteste löschen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()