Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Timerereignis bei MouseOver

Begonnen von Xoar, April 04, 2017, 11:39:11

⏪ vorheriges - nächstes ⏩

Xoar

Mahlzeit,

hab ne Frage, zur Zeit ist es in meinem Bericht so, dass wenn ich mit der Maus über einen Datensatz gehe (nicht klicke) ein Übersichtsformular an der Mausposition eingeblendet wird.

Kann man sowas einbauen wie, wenn die Maus 2sek in dem Feld ist, das Formular erst eingeblendet wird?

Meine Idee wäre, es müsste nen Timer erstellt werden und und bei Start und Ende der aktuelle DS verglichen werden und wenn es der gleiche ist, wird das Formular eingeblendet?

Habt ihr ne andere/bessere/einfachere Idee?

Grüße

markusxy

Zitat von: Xoar am April 04, 2017, 11:39:11
Habt ihr ne andere/bessere/einfachere Idee?

Ist ja eh simpel.
Ich würds einfach testen.

LG Markus

Xoar

habs leider nicht hinbekommen.

Habe ne API Funktion gefunden wo man Access sozusagen unterbrechen kann. Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As
Long)

wird dann mit sleep(1000) '1sek aufgerufen.

Das Problem ansich dabei ist, dass er ja die Sub danach fortführt, aber nicht den neuen ID Wert erkennt, wo die Maus sich zur Zeit befindet.

Hab im MouseOverEreignis des Steuerelementes im Bericht (wie ein Endlosformular dargestellt) die MitarbeiterID in einer globalen Variable IDvorher gespeichert. Dann kommt sleep(1000), sprich Access macht erstmal garnichts, im Anschluss kommt dann die Speicherung der MitarbeiterID in die globale Variable IDnachher.
Das eigentlich Problem ist jetzt, dass Access nicht erkennt das mein Mauszeiger sich inzwischen weiterbewegt hat und es sich um eine andere MitarbeiterID handelt.

Luftcode sieht ca. so aus.

public Sub txtMitarbeiterID_MouseOver..
IDvorher = me!MitarbeiterID
sleep(1000) '1sek Pause
IDnachher = me!MitarbeiterID
  if IDvorher = IDnachher then
   'öffne Formular
  end if
end sub


wie könnte ich das Problem lösen, bin ich gar auf den falschen Weg und es liegt an dem sleep(1000)?

PS: Der Bericht ist in der Berichtsansicht, so erkennt Access im MouseOver_Ereignis eigentlich immer den korrekten DS über den meine Maus sich gerade befindet.

Grüße

Grüße

markusxy

Deine Logik passt nicht.
Vorschlag:
Das MousMove über einem Sektor (Bereich oder Steuerelement) initialisiert deine Überwachung:
Das wären aus meiner Sicht folgende Punkte (habs aber nicht durchdacht - es ist ja dein Projekt)
Deaktivierung des MouseMove Events.
Festlegen des zu überwachenden Bereichs.
Startet eines Timers - keine zu langen Intervalle vielleicht 100 - 200 ms

Beim Timer Event wird folgendes geprüft:
Befindet sich die Maus noch im zu überwachenden Sektor?
Bei Ja:
   Sollte die gewünschte gesamte Delay-Zeit abgelaufen sein:
      Ja:
        dann Fenster einblenden. Timer stoppen.Anfangszustand wieder herstellen.
      Nein: nichts tun.
Bei Nein:
   Timer stoppen, Anfangszustand wieder herstellen.

Das mit dem simpel war natürlich etwas untertrieben.
Wenn man das aber halbwegs beherrscht lassen sich viele interessante Dinge umsetzen.
Als Grundvoraussetzung sollte man VBA aber relativ gut verstehen.

Aber vielleicht hat noch jemand einen anderen Vorschlag.

LG Markus



dedidado

also ich bin mit zuviel Automatismus regelmäßig auf die Nase gefallen.
Die Rückmeldungen von den Usern waren zu 99% negativ.
wie z.B.:
"Warum macht er das jetzt?"
"Das stört ..."
"Das ist nervig..."
"Das braucht kein Mensch..."

Meine User fühlten sich offenbar bevormundet.
Aber wie auch immer, es kam nicht gut an.

Daher mein Tipp: stell die Möglichkeiten zur Verfügung und lass sie selbst entscheiden,
wie z.B. per Doppelklick - dann kann sich jeder das Formular selber öffnen, aber erst bei Bedarf und nicht dauernd (auch nicht nach 2sec), was ganz nebenbei noch ein ständiges schließen mit sich bringen würde. Wenn das auf Dauer nicht nervt, das würde mich schon sehr wundern.  ;)

Gruß Dieter

Xoar

#5
@Markus
Ok neuer Denkansatz, werd ich mal durchspielen.

@Dieter
In diesem speziellem Fall ist diese automatische Einblendung als sehr vorteilhaft empfunden worden, lediglich sollte eine Einblendung erst passieren wenn der Mauszeiger eine gewisse Zeit im Steuerelementbereich bleibt. Damit nicht sofort dieses Formular geöffnet wird, wenn man nur auf dem Weg zum anderen Steuerelement ist und diesen MouseOverBereich kurz berührt.

Schließen tut es sich nur aktiv über das X oder wenn ich mit der Maus einen anderen DS anfahre.

So wie ein Tooltip der bei einem Steuerelement aufpoppt, nur als Formular.

markusxy

Zitat von: dedidado am April 07, 2017, 12:14:15was ganz nebenbei noch ein ständiges schließen mit sich bringen würde.

Ich vor ewiger Zeit mal ein fast durchsichtiges Popup gemacht, was mir in einem Endlosform Infos zum Datensatz angezeigt hat. Ist allerdings minimal aufwändiger, da man aufgrund der Bildlaufleiste mehr tun muss um an die Daten des aktuellen DS zu kommen. Im Prinzip so wie hier, nach entsprechendem Delay wird die Info angezeigt und beim Verlassen des Steuerelements wird das Popup wieder ausgeblendet. Das es in Access aufgrund der fehlenden Hwnd für das Steuerelement diverse Events nicht gibt - und Access sie auch nicht liefert - , muss man halt improvisieren.

Allerdings sind solche Implementierungen nicht trivial.
LG Markus

Lachtaube

Ich schließe mich Dieters Meinung an. Selbst eine Navigation über eine Berichtsansicht empfände ich schon merkwürdig bis sehr gewöhnungsbedürftig. Mit einem quasi vergrößerten Tooltip, wie es Markus schilderte, könnte ich mich schon eher anfreunden.
Grüße von der (⌒▽⌒)

Xoar

@Lachtaube
Das es ne Berichtsansicht merkst Du ja garnicht, sieht ja exakt so aus wie ein Endlosform.

Ich teste dann mal weiter. Es wird schon klappen ;)