Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Sicherheitshinweis ---> für registrierte Mitglieder <-
Timer Message
zurück: Auswahl von Datensätzen mit Checkbox per Listbox weiter: InputBox Ersatz Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
09. Aug 2012, 14:47
Rufname:

Timer Message - Timer Message

Nach oben
       Version: (keine Angabe möglich)

Hallo zusammen,

hier mal wieder ein kleines Gimmick, um Benutzeroberflächen benutzerfreundlicher zu machen.

In allen Anwendungen müssen Benutzer über irgendetwas informiert werden, z.B. bei einer fehlerhaften Eingabe oder weil ein Programmfehler aufgetreten ist oder was auch immer.

Meistens greift der Programmierer der Einfachheit halber zur Messagebox, manche pflastern den Weg zur vollendeten Eingabe mit einem ganzen Haufen davon und der Klick auf "OK" wird für manchen genervten User zur Daueraufgabe.

Messageboxen sind sinnvoll, besonders wenn es um Entscheidungen wie "Ja"/"Nein" usw. geht, aber einfache Hinweise können auch so angezeigt werden, daß der User sie wahrnimmt, ohne dabei etwas klicken zu müssen (oder den OK-Button mit der Tastatur bestätigen, was zum einen viele nicht wissen und doch zur Maus greifen und zum anderen den Eingabefluß trotzdem unterbricht).

Am einfachsten kann man das mit einer zeitgesteuerten Textbox realisieren, die einen Text anzeigt, der nach einer Weile automatisch verschwindet (die Textbox kann auch formatierte Texte anzeigen und unterstützt Conditional Formatting, daher ist sie besser geeignet als ein Label).

Die angehängte Klasse automatisiert diese Idee für ein beliebiges Formular und eine beliebige Textbox. Zur Implementierung in eine eigene Datenbank muß man nur die Klasse importieren (per VBA-Editor) und im Formular eine Textbox definieren, in der die Nachricht(en) angezeigt werden soll(en).

Die Textbox kann dabei mit transparentem Hintergrund und transparentem Rahmen permanent unsichtbar sein, so daß sie nur dann zu sehen ist, wenn ein Text angezeigt wird (dessen Schriftfarbe, -art und -größe man im Formulardesign festlegt), oder man erzeugt eine unsichtbare Textbox, dafür mit Hintergrundfarbe, Rahmen, SpecialEffect, was auch immer und läßt die Klasse die Textbox bei Bedarf sichtbar und wieder unsichtbar schalten (in diesem Fall kann die Textbox auch andere Controls überlappen).

Zur Verwendung der Klasse im eigenen Formular benötigt man nur folgenden Code:
Code:
Private objMsg As clsCCTimerMessage

Private Sub Form_Load()
    Set Me.objMsg = New clsCCTimerMessage
    objMsg.InitMessage Me, Me.txtMessage
End Sub
"txtMessage" ist dabei der Name der Textbox auf dem Formular.

Wenn eine Nachricht angezeigt werden soll, dann geht das nun so:
Code:
    objMsg.DisplayMsg "Dieser Text wird angezeigt"
Mit diesen Defaults wird der Text für 4 Sekunden angezeigt und verschwindet dann wieder. Die Default-Zeit in Millisekunden kann bei "InitMessage" als dritter Parameter definiert werden.
Bei dem hier gezeigten Code muß die erste Variante der Textbox verwendet werden (also sichtbar mit transparentem Hintergrund/Rahmen). Möchte man die zweite Variante verwenden, also mit Hintergrund, muß die Textbox als unsichtbar designt werden und bei "InitMessage" der vierte Parameter auf "True" gesetzt werden (Default=False). Die Klasse macht die Textbox dann sichtbar, wenn der Text angezeigt werden soll und im Anschluß wieder unsichtbar.

Da die Zeitsteuerung über den Timer-Event des Formulars läuft, der bei der Initialisierung mitgegeben wird, sollte das Formular den Timer-Event natürlich nicht anderweitig verwenden, da sonst eventuell andere TimerInterval-Einstellungen die Anzeige durcheinanderbringen würden. Trotzdem kann man die TimerMessage auch dann verwenden, da das bei der Initialisierung angegebene Formular nicht das gleiche sein muß wie das Formular, das die Textbox enthält. Man kann beispielsweise einfach ein unsichtbares Formular öffnen und dieses bei der Initialisierung angeben, der Timer-Event wird von überall her gestartet, auch wenn das betreffende Formular gerade nicht zu sehen ist oder nicht den Fokus hat. Man kann auch ein beliebiges anderes gerade geöffnetes Formular angeben, solange dort kein TimerEvent benötigt wird.

Da man aus einer Klasse beliebig viele Objekte erstellen kann, kann man natürlich auch mehr als eine Textbox für die Nachrichtenanzeige verwenden und die Ausgabe entsprechend steuern. Diese können auch alle das gleiche Formular für den TimerEvent verwenden, denn jedes "DisplayMsg" stellt das TimerInterval neu und damit wird nach Ablauf der letzten gesetzten Zeit der TimerEvent ausgelöst, der dann alle Nachrichten aus allen Textboxen wieder entfernt (+ ggf. die Textbox(en) wieder unsichtbar macht).

Bei "DisplayMsg" kann als zweiter Parameter auch eine Zeitangabe in Millisekunden hinzugefügt werden, wenn z.B. bei besonders langen Texten die Default-Zeit von 4 Sekunden nicht ausreicht.

Die Methode eignet sich z.B. besonders gut für Validierungsnachrichten. Wenn der User in einem Feld etwas eingegeben hat, was nicht der Validierung entspricht, kann man über so eine zeitgesteuerte Nachricht einen Hinweis geben, was fehlt oder falsch ist, ohne den User mit einer Messagebox zu nerven. So kann man selbst den "Change"-Event verwenden, um jedes eingetippte Zeichen zu validieren, was mit einer Messagebox natürlich unsinnig wäre.

Viel Spaß beim Ausprobieren

Christian



clsCCTimerMessage.zip
 Beschreibung:
TimerMessage Klasse V1.0 zur zeitgesteuerten Anzeige von Nachrichten im Formular.

Datei enthält nur die Klasse zum Import per VBA-Editor und kann daher in jede Access-Version importiert werden. Entwickelt und getestet mit A2007.

Download
 Dateiname:  clsCCTimerMessage.zip
 Dateigröße:  1.39 KB
 Heruntergeladen:  82 mal

JMalberg
Es wird so langsam sinnig ...


Verfasst am:
09. Aug 2012, 15:10
Rufname:
Wohnort: Saarbrücken


AW: Timer Message - AW: Timer Message

Nach oben
       Version: (keine Angabe möglich)

Schau mal hier API Timer als Klasse

Mit dem API-Timer bist du unabhängig vom Formular-Timer.

_________________
Gruß
Jürgen

Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie!
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
09. Aug 2012, 16:56
Rufname:

AW: Timer Message - AW: Timer Message

Nach oben
       Version: (keine Angabe möglich)

Hallo Jürgen,

interessanter Link, aber auch zu beachten:
Zitat:
' Die Timer müssen ordentlich entladen werden,
' sonst kann es zu unerklärlichen Abstürzen
' oder anderem seltsamen Verhalten während
' der Entwicklungszeit kommen!
API-Methoden versuche ich, wenn möglich, immer zu vermeiden, denn hier muß man eine Menge mehr aufpassen, daß keine Fehler entstehen, ansonsten kann man leicht Abstürze produzieren. Access hat ja einen Timer und da die Klasse nur mit einem Formular Sinn macht (wo sonst sollte die Textbox stehen), muß man ja mindestens ein Formular zur Verfügung haben, das so den Timer-Event zur Verfügung stellen kann (und da man diesen i.d.R. eher selten benutzt, ist er meistens auch frei).

Es ist aber sicherlich kein Problem, den API-Timer zu implementieren, wer es lieber so haben möchte. Die TimerMessage-Klasse enthält ja nicht viel Code und kann sicherlich leicht von jedem angepaßt werden. Ich würde es allerdings schon als kritisch betrachten, daß die vorgestellte Methode per VBA ein kleines Maschinenspracheprogramm in einen vorher reservierten Speicher schreiben muß, um den Callback nach VBA zu realisieren. Ob das etwa mit jedem Prozessor und jedem Windows so funktioniert, ist nicht sicher.

Gruß

Christian
JMalberg
Es wird so langsam sinnig ...


Verfasst am:
09. Aug 2012, 17:27
Rufname:
Wohnort: Saarbrücken

AW: Timer Message - AW: Timer Message

Nach oben
       Version: (keine Angabe möglich)

Der Maschinen-Code fiel mir auch auf und ich verstehe nicht warum der Callback nötig ist.

MS selbst beschreibt den API-Timer so: Gewusst wie: Erstellen Sie ein Timer-Ereignis, das mithilfe der Windows-API-Funktionen

Dann könnte das ganze in eine Klasse ohne Callback?

_________________
Gruß
Jürgen

Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie!
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
09. Aug 2012, 18:26
Rufname:


AW: Timer Message - AW: Timer Message

Nach oben
       Version: (keine Angabe möglich)

Hallo Jürgen,

das sieht schon sehr viel besser aus, geht aber trotzdem nicht ohne weiteres. Mit "AdressOf" ersetzt man das Maschinencode-Gedrumsel, man kann so die Adresse einer Callback-Sub, die in VBA definiert wurde, an die API übergeben und diese kann so tatsächlich die VBA-Sub aufrufen.

Notwendig ist die Callback-Sub natürlich, weil das sozusagen der Timer-Event ist. Also nach Ablauf der eingestellten Zeit wird jeweils wieder die Callback-Sub aufgerufen, bis man den Timer mit "KillTimer" wieder abschaltet.

Probleme sind hier:
  • "AdressOf" funktioniert leider nicht mit Subs, die in einem Klassenmodul definiert wurden, es muß eine Public Sub in einem Standardmodul sein.
  • Neben der Klasse müßte man also zusätzlich ein Standardmodul verwenden, um den API-Timer verwenden zu können, was die Verwendung wieder unhandlich macht.
  • Die Adresse, die man bei "SetTimer" verwendet, muß bei "KillTimer" zum Beenden des Timers wieder angegeben werden, damit der Timer stoppt. Hat man den Code gestoppt oder ist er auf einen Fehler gelaufen, ist diese Adresse u.U. weg und man kann den Timer nicht mehr stoppen. Access beenden geht zwar, aber vermutlich läuft der Timer im Hintergrund auf ewig weiter, bis man den Rechner neu gestartet hat.
  • beim Entladen von Klassenmodulen wird manchmal die "Class_Terminate" Sub von Access nicht aufgerufen, das kann dann ebenfalls dazu führen, daß der KillTimer nie aufgerufen wird. U.U. hat man am Ende seinen Rechner nach längerer Benutzung der Anwendung mit Timer-Events beschäftigt, ohne es zu wissen und der Taskmanager zeigt solche Tasks nicht an. Es ist mehr als fraglich, ob Access beim Beenden solche Tasks selbst beendet, es ist sehr wahrscheinlich, daß das nicht passiert, was man auch bei z.B. Excel-Automation beobachten kann, wo Excel Tasks noch im Speicher hängen, wenn Access beendet wird und die Excel-Objekte nicht ordentlich entfernt wurden.
Ich würde also davon abraten, die API-Timer zu verwenden, zumal, wie gesagt, ein komfortabler, einfacher und sicherer Timer-Event in Access in den Formularen enthalten ist.

Gruß

Christian
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Formulare: Timer bei offenem Formular pausieren 4 HJW 112 20. Nov 2013, 19:47
derArb Timer bei offenem Formular pausieren
Keine neuen Beiträge Access Programmierung / VBA: "Timer"-Function funktioniert nicht 10 Xilyte 233 05. Jul 2013, 17:49
Gast "Timer"-Function funktioniert nicht
Keine neuen Beiträge Access Programmierung / VBA: Timer oder ähnliches 6 Nicht-Geek 315 25. Nov 2011, 10:54
Sonneschein Timer oder ähnliches
Keine neuen Beiträge Access Programmierung / VBA: Message Box mit 5 Button 4 dbuser_essen 513 11. Mai 2011, 16:54
astern Message Box mit 5 Button
Keine neuen Beiträge Access Programmierung / VBA: Infobox über Timer steuern 2 schelle789 1836 25. Aug 2009, 19:01
schelle789 Infobox über Timer steuern
Keine neuen Beiträge Access Programmierung / VBA: Timer in Formular hängt sich auf 4 mfreye 803 18. Aug 2009, 09:09
mfreye Timer in Formular hängt sich auf
Keine neuen Beiträge Access Programmierung / VBA: Speichern eines Dokumentes mit Form Timer 1 Gasteve 396 16. Jun 2009, 20:05
jens05 Speichern eines Dokumentes mit Form Timer
Keine neuen Beiträge Access Programmierung / VBA: access timer UND task scheduler 1 schultzzz 1945 08. Apr 2009, 08:17
Gast access timer UND task scheduler
Keine neuen Beiträge Access Programmierung / VBA: Access Timer 1 BSheep 2246 16. Dez 2008, 12:48
Gast Access Timer
Keine neuen Beiträge Access Programmierung / VBA: Message ausgeben wenn Datensatz nicht vorhanden 6 mactoni 2232 31. Okt 2008, 16:56
mactoni Message ausgeben wenn Datensatz nicht vorhanden
Keine neuen Beiträge Access Formulare: Keine Message Box wenn Ausgangsdatum = date() 2 ohsieli 606 28. Mai 2007, 20:15
ohsieli Keine Message Box wenn Ausgangsdatum = date()
Keine neuen Beiträge Access Programmierung / VBA: Tabelle neu verknuepfen - error message 1 goepf 599 02. März 2007, 03:51
Gschaftlhuaba Tabelle neu verknuepfen - error message
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Excel Tricks