Code: Alles auswählen
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent(@mp1, @mp2, @oXbp)
oXbp:handleEvent(nEvent, mp1, mp2)
ENDDO
Jan
Moderator: Moderatoren
Code: Alles auswählen
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent(@mp1, @mp2, @oXbp)
oXbp:handleEvent(nEvent, mp1, mp2)
ENDDO
Ich habe gelesen, dass man sich viel Ärger einhandeln kann, wenn das Programm in mehreren Eventloops hängt. Allerdings nutze ich z.B. die About-Box von Alaskas Beispielen oder andere MODALE Eingabe Hilfsbildschirme. Bei Modalen Hilfsbildschirmen kann man - nach meiner Erfahrung - eine eigene Eventloop genau auf die Bedürfnisse dieses Fenster einbauen und somit auch das restliche Programm automatisch blockieren (was bei MODALEN Fenstern ja gewünscht ist).Jan hat geschrieben:Was heißt "normalerweise"? Bzw. wo liegen die Ausnahmen?
Genau so ist es, aber natürlich muss man alle Controlls des Programms blockieren (:disable() ), die nicht gleichzeitig laufen dürfen, bevor man diese Verarbeitung aufruft !Jan hat geschrieben:Nicht wirklich verstehe ich Deine Ausage, man sollte in langen Such- oder Druckroutinen ab und an die Eventverarbeitung aufrufen. Wenn ich Dich richtig verstanden habe unterbreche ich damit kurz den Vorgang und gebe einem anderen Ereignis mal Luft zum Laufen.
Ich mache das so...Jan hat geschrieben:Aber wie rufe ich die Eventverarbeitung mal eben so zwischendurch auf?
Code: Alles auswählen
im Hauptprogramm statt der do while Schleife die Funktion ohne Parameter starten ...
DoEventLoop() // Endlose Ausführung ...
in langen Schleifen, z.B.
Do while ! eof()
DoEventLoop(0.01) // 1/100 Sekunde reicht für viele Aktionen...
Wenn ich in einem Programm einfach nur etwas stoppen will, aber die Oberfläche arbeiten soll
DoEventLoop(1) // z.B. geänderte Captions anzeigen ...
*-----------------------------------------------------------------------------
FUNCTION DoEventLoop(nSeconds) // For Next Schleifen unterbrechen und Events verarbeiten !
local nBisSeconds, nEvent, mp1, mp2, oXbp
DEFAULT nSeconds to 0 // Standard ist endlose Ausführung
nBisSeconds := seconds() + nSeconds
DO WHILE .T.
nEvent := AppEvent( @mp1, @mp2, @oXbp, nSeconds)
do case
case nEvent = xbe_None
* nichts tun ist hier Standard
case nEvent = xbeP_Keyboard .and. mp1 == xbeK_F1
* xbeP_HelpRequest erscheinen für jede Xbp Instanz, also zu oft !
MsgBox("Die Hilfe ist für dieses Programm noch nicht erstellt.")
otherwise
oXbp:handleEvent( nEvent, mp1, mp2 )
endcase
if nSeconds > 0 .and. nBisSeconds < seconds() // nur wenn keine endlose Ausführung
exit
endif
ENDDO
return nil
In meinem Beispiel oben habe ich der Taste F1 meine eigene Hilfsfunktion zugeordnet (anders als es Windows normalerweise macht). Auch könnte man spezielle Hotkeys belegen.Jan hat geschrieben:Und in welchen Fällen erweitert man die Schleife durch eigene Ergänzungen? Oder ist das prinzipiell schlechter Stil und man sollte das anders lösen?