none
Functionsaufruf bei OnMouseMove mit Übergabe des auslösenden Controls

    Frage

  • Hallo

    ich möchte eine Function aufrufen bei OnMouseMove dabei möchte ich gerne den Namen des auslösenden Controls(Bezeichnungsfeld) mit übergeben

    der Aufruf der Function erfolgt direkt also im Ereignís Bei Mausbewegung =Functionsaufruf(Wert,Wert,Controlname)

    weil ich das ganze bei sehr vielen Controls benötige würde ich das gerne so in der Art machen  =Functionsaufruf(Wert,Wert,Me!Control)

    aber ich weiss nicht wie also wie bekomme ich den Namen des auslösenden Controls übergeben

    Michael

    Dienstag, 5. Juni 2012 08:39

Antworten

Alle Antworten

  • Hallo!

    Gib dich nicht mit Kleinigkeiten wie Steuerelementnamen als Parameter zufrieden, wenn du auch die Referenz haben kannst. ;-)

    Private Function Functionsaufruf(ByVal Wert1 As Variant, ByVal Wert2 As Variant, _
                                                               ByVal Ctl As Control)
       Dim ControlName As String
       Dim ControlValue As Variant
    
       ControlName = Ctl.Name
       ControlValue = Ctl.Value
    
       Call MachEtwasMitDemControl(Ctl)
    
    End Function

    Alternativ könntest du auch eine "ControlHandler"-Klasse erstellen, die auf Mousemove reagiert und die notwendigen Aktionen durchführt.
    Ein Beispiel (da die Erklärung zu lange dauern würde ;-)): Ereignisbehandlung

    mfg
    Josef

    PS: ich bin schon gespannt, wann der läste Leerzeichen-Verschlucker-Bug im Forums-Code-Editor behoben wird. ... vermutlich nie. :-(


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Dienstag, 5. Juni 2012 10:21
  • Hallo Josef

    also fast - nur nicht ganz - ich bin ja fauel - also das ist jetzt meine function

    Public Function TextFarbeUndMaussymbolAendern(ByVal WelcheFarbeOver As Long, ByVal WelchesControl As Control)
    If GBFeldNameFuerMausover Is Nothing = False Then
        If GBFeldNameFuerMausover.Name <> WelchesControl.Name Then
            GBFeldNameFuerMausover.ForeColor = 0
        End If
    End If
    Set GBFeldNameFuerMausover = WelchesControl
        WelchesControl.ForeColor = WelcheFarbeOver
        MouseCursor (32649)
    End Function

    das ganze soll einen hover effekt erzeugen - funktioniert so auch sehr gut ABER

    der aufruf erfolgt bei mir jetzt mit

    Bei Mausbewegung = TextFarbeUndMaussymbolAendern(13995605;[HierStehtDerNameDesBezeichnungsfeldes])

    da ich aber auf [HierStehtDerNameDesBezeichnungsfeldes] verzichten möchte würde ich gerne herausfinden welches Control den OnMouseMove auslöst

    so könnte ich einfach nur die gewünschte farbe übergeben und den aufruf nur in die ereigniss eigenschaft Bei Mausbewegung kopieren

    ZUR INFO die Variable GBFeldNameFuerMausover nutze ich um zu wissen welches feld ich beim nächsten OnMouseMove event farblich zurück setzen muss

    Dienstag, 5. Juni 2012 18:29
  • Hallo!

    Da es sich nicht um das aktive Steuerelement handeln wird, müsstest du die Position des Mauszeigers verwenden und errechnen, welches Steuerelement den Fokus hat.

    ... Ich finde die Variante vom genannten Beispiel mit der Hilfsklasse einfacher. ;)
    Dazu lädst du beim Laden des Formulars die Instanzen für jedes Control und den Rest erledigt dann der von dir erstellte Code in der Klasse.

    mfg
    Josef




    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    • Als Antwort markiert MCDPone Mittwoch, 6. Juni 2012 05:52
    Dienstag, 5. Juni 2012 18:59
  • MCDPone wrote:

    weil ich das ganze bei sehr vielen Controls benötige würde ich das gerne
    so in der Art machen =Functionsaufruf(Wert,Wert,Me!Control)

    Es gibt AFAIK keine Möglichkeit, das direkt auszulesen.
    Die einzige Möglichkeit, die ich kenne, wäre den MouseMove Event des Formulars zu verwenden (den gibt's ja dann nur einmal) und dann dort über die X und Y Koordinate das Control zu ermitteln, über dem sich der Mouse Cursor zur Zeit gerade befindet.

    Dazu müsstest Du mit einem Loop durch alle Controls, welche im Formular drin sind, sichtbar sind und den MouseMove Event kennen gehen und dann ermitteln, ob das Kontrol unter dem Cursor liegt. Bei sich überlagernden Controls würde das dann u.U. noch schwieriger werden.
    Alternative könntest Du z.B. die Controls, welche dann eben speziell reagieren müssten, mit einem Tag versehen (das kannst Du mittels einer Mehrfachauswahl gleich bei allen Controls machen).
    Dann kannst Du den Loop so reduzieren, dass Du die Controls, in der Controls Collection des Formulars sofort ausscheidest, die nicht diesen Tag haben und nur die bezüglich Geometrie untersuchst, die in Frage kommen.
    Mit Top, Left, Width und Height ist es dann möglich herauszufinden, ob die X und Y Koordinate innerhalb eines der Controls ist.

    Warnung: Mit dieser Aktion wirst Du extrem viele Events auslösen und viel Rechenleistung benötigen, weil Du mit jedem Deut, den Du die Maus verschiebst den Code erneut ausführen und erneut durch alle Steuerelemente auf dem Formular durchloopen musst.

    Gruss
    Henry

    Donnerstag, 7. Juni 2012 02:51
  • Nachtrag:

    Eine Variante geht schon: mit accHitTest das Control ermitteln.

    Beispiel-Code:

    Private Type POINTAPI
        x As Long
        y As Long
    End Type
    
    Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
    
    Private Function CheckControlFocus()
    
       Dim pt As POINTAPI
       Dim CurrentObject As Object
       
       GetCursorPos pt
    
       Call SetAllLabelsBackStyle(0)
       
       If IsObject(Me.accHitTest(pt.x, pt.y)) Then
          Set CurrentObject = Me.accHitTest(pt.x, pt.y)
          Me.Controls(CurrentObject.Name).BackStyle = 1
          Me.Caption = "Coursor ist über '" & CurrentObject.Name & "'"
       End If
    
    End Function
    
    Private Sub SetAllLabelsBackStyle(ByVal NewBackstyle As Byte)
    
       Dim ctl As Control
       Dim lb As Label
    
       For Each ctl In Me.Controls
          If ctl.ControlType = AcControlType.acLabel Then
          If ctl.OnMouseMove = "=CheckControlFocus()" Then
             ctl.BackStyle = NewBackstyle
          End If
          End If
       Next
    
    End Sub
    In den jeweiligen Labels stellst du in der Eigenschaft "OnMouseMove"  den Funktionsaufruf ein: =CheckControlFocus()

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Donnerstag, 7. Juni 2012 09:06
  • accHitTest, noch nie gehört. Aber tatsächlich. Es ist eine der hidden Mehtods in Access. Musste zuerst im Objekt Katalog die Hidden Members anzeigen lassen, bevor ich herausfand woher das geholt wird.

    Wusste gar nicht, dass die Accessibility Library in Access verfügbar ist. Interessant.

    Gruss
    Henry

    Freitag, 8. Juni 2012 07:06
  • Henry Habermacher wrote:

    Wusste gar nicht, dass die Accessibility Library in Access verfügbar ist.
    Interessant.

    Aha, gefunden. Es stammt aus der Office Objectlibrar und ist in der Klasse IAccessible verborgen...

    Gruss
    Henry

    Freitag, 8. Juni 2012 07:09