Hallo,
ich hatte früher einiges mit C und unter Windows gemacht. Da gab es Funktionen, die ich unter VBA vermisse. Die MsgBox zB geht immer in die Mitte des Bildschirms. Bei einem 4k Monitor muss man die Maus viel bewegen. Im Internet habe ich nicihts passendes gefunden.
Hier habe ich ein Beispiel wie ich es gelöst habe. Aber Vorsicht. Die Timer unter VBA haben es in sich. Dazu muss ich etwas ausholen. Ab 32 Bit ist Windows ein Nachrichten basierendes Betriebssystem. Die Programme bekommen und verschicken Nachrichten. So kann man jedes Fenster in Windows ansprechen. Wenn zB ein Formular offen ist, wartet nicht mehr das Programm auf eine Eingabe, sondern Windows. Das Programm "schläft" im Speicher, bis eine Nachricht für diesen aufgelaufen ist.
Ein Timer sendet in regelmäsigen Abständen eine Nachricht. Das empfängt SolidWorks und nicht das Makro. Stürzt das Makro ab, kommen die Nachrichten weiter an. Es ist nicht wie bei einem normalen Programm, wo Windows aufräumt. Im schlimmsten Fall hilft nur SW zu schließen, um alle Timer zu killen.
Und noch was. Das Sub im Beispiel "WM_Ereignis" wird vom Makro selbst nicht angesprungen. Das springt SW an, wenn das die WindowsMessage-Ereignis kommt. So ist man im Prinzip an zwei Stellen gleichzeitig im Code. Der Debugger kommt niicht damit klar. das Sub WM_Ereignis kann man nicht debuggen.
Und im oberen Absatz liegt der Haken. Stürzt das Makro ab, kommen trotzdem noch Nachrichten an. SW, springt weiter auf das Sub und führt dieses aus. In meinem Fall habe ich gleich am Anfang einen Kill-Befehl. Da passiert nichts. Man kann aber auch Timer verwenden, um regelmäsig was in ein Userform zu schreiben. Zum Beispiel eine Uhr. Da muss der Timer ständig laufen. Und was ist wenn der Timer nicht sauber beendet wird und das Userform gibt es nicht mehr? Genau. SW frisst sich.
Aber Timer sind eine mächtige Waffe in der Programmierung. In meinem neuen Nummerngenerator laufen genau vier Stück.
Gut viel Text. Ich wollte damit nur eine Warnung aussprechen. Und falls ihr sehen wollt wie das Ganze funktioniert, setzt mal die Konstante cZeit von 100 ms auf 1000 (1 Sekunde). Man sieht wie die Box zur Maus springt. Wenn man ganz böse ist, könnte die MsgBox die Maus verfolgen.
Der Code ist dokumentiert was was macht.
Viele Grüße
Andreas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP