Последнее по теме Long running command and Dialog.ShowStatus
MODULE DosKeyboard; IMPORT Dialog, StdLog, Strings, WinApi;
VAR trigger: BOOLEAN;
(* Josef Tempel's solution about long running commands *)
PROCEDURE ProcessMessages* (VAR interrupted: BOOLEAN); CONST WM_MOUSEWHEEL = 522; (* only in BB1.6 *) VAR msg: WinApi.MSG; res: INTEGER; BEGIN WHILE WinApi.PeekMessageW(msg, 0, 0, 0, WinApi.PM_REMOVE) # 0 DO CASE msg.message OF WinApi.WM_KEYDOWN, WinApi.WM_KEYLAST, WinApi.WM_KEYUP, WinApi.WM_CHAR: interrupted := TRUE | WinApi.WM_LBUTTONDOWN, WinApi.WM_LBUTTONUP, WinApi.WM_LBUTTONDBLCLK, WinApi.WM_MBUTTONDOWN, WinApi.WM_MBUTTONUP, WinApi.WM_MBUTTONDBLCLK, WinApi.WM_RBUTTONDOWN, WinApi.WM_RBUTTONUP, WinApi.WM_RBUTTONDBLCLK, WM_MOUSEWHEEL: (* skip *) ELSE res := WinApi.DispatchMessageA(msg) END END END ProcessMessages;
(* The Envelope for using his solution into my programs *)
PROCEDURE Break* (): BOOLEAN; VAR res: INTEGER; interrupted: BOOLEAN; BEGIN interrupted := FALSE; ProcessMessages(interrupted); IF ~trigger & interrupted THEN Dialog.GetOK('Stop the running command ?', '', '', '', {Dialog.yes, Dialog.no}, res); trigger := res = Dialog.yes; IF trigger THEN StdLog.String('Command aborted: Break requested by the user.'); StdLog.Ln; END; END; RETURN trigger; END Break;
PROCEDURE ResetBreak*; BEGIN IF trigger THEN StdLog.String('Command aborted: Acknowledged by the program.'); StdLog.Ln; END; trigger := FALSE; END ResetBreak;
(* Test of the Envolope *)
PROCEDURE Test*; VAR i, j: INTEGER; s: ARRAY 20 OF CHAR; BEGIN StdLog.String('Running...'); StdLog.Ln; FOR i := 0 TO 300 DO IF Break() THEN ResetBreak; RETURN END; FOR j := 0 TO 10000000 DO (* increase if your machine is faster *) END; Strings.IntToString(i, s); Dialog.ShowStatus("msg = " + s) END; StdLog.String('End of Run'); StdLog.Ln; END Test;
BEGIN ResetBreak; END DosKeyboard.
DosKeyboard.Test
|