CLOCK.PAS SOURCE CODE

CLOCK.PAS SOURCE CODE



Several XView-PC demonstrations:

  Use of the timer tick interrupt
  Use of the interposer
  Use of buttons, messages and teletypes
  How to enter text mode and return
 
Timer interrupt event generator
Just generates an event if the interface is in the internal polling loop.
The event can be captured by an interposer, or used in regular event handlers.
There are many restrictions on what can be done inside an interrupt
procedure, so keep it simple
 
 CLOCK.PAS SOURCE CODE
 
  1. USES Crt,Dos,Graph,XView; 
  2.  
  3. CONST 
  4.   contmax=18; 
  5.  
  6. VAR 
  7.   cont:INTEGER; 
  8.   Int1CSave:Pointer; 
  9.  
  10. {Declaration of the interface objects} 
  11. VAR 
  12.   frame1,button1,button2,button3,button4,button5,button6, 
  13.   message1,message2:Xv_opaque; 
  14.   frame2,tty1:Xv_opaque; 
  15.  
  16. FUNCTION Si(x:WORD):STRING; {Word to string converter} 
  17. VAR 
  18.   t:STRING; 
  19. BEGIN 
  20.   Str(x,t); 
  21.   Si:=t 
  22. END; 
  23.  
  24. {$F+} 
  25.  
  26.  
  27.  
  28. {$S-} 
  29. PROCEDURE TimerHandler; interrupt; 
  30. BEGIN 
  31.   IF ie_code=-1 THEN ie_code:=5000; 
  32. END; 
  33. {$S+} 
  34.  
  35. PROCEDURE Intersept; 
  36. VAR 
  37.   hora,minuto,segundo,seg100:WORD
  38. BEGIN 
  39.   IF ie_code=5000 THEN BEGIN 
  40.     Inc(cont); 
  41.     IF cont=contmax THEN BEGIN 
  42.       GetTime(hora,minuto,segundo,seg100); 
  43.       xv_set(message1,'Time: '+Si(hora)+':'+Si(minuto)+':'+Si(segundo)+'.'+Si(seg100)); 
  44.       cont:=0 
  45.     END 
  46.   END 
  47. END; 
  48.  
  49. {Callback procedures} 
  50.  
  51. PROCEDURE UpdateMessage(obj:Xv_opaque); 
  52. BEGIN 
  53.   {Notify handler for button4} 
  54.   {Notify handler for button3} 
  55.   {Notify handler for button2} 
  56.   {Notify handler for button1} 
  57.   xv_set(message2,obj^.xv_label+' pressed at '+Copy(message1^.xv_label,7,255)); 
  58.   ttysw_output(tty1,message2^.xv_label+^M^J); 
  59. END; 
  60.  
  61. PROCEDURE Terminate(obj:Xv_opaque); 
  62. BEGIN 
  63.   {Notify handler for button4} 
  64.   xv_end:=TRUE 
  65. END; 
  66.  
  67. PROCEDURE GotoText(obj:Xv_opaque); 
  68. VAR 
  69.   r:CHAR
  70. BEGIN 
  71.   {This is how to enter and exit text mode safely:} 
  72.   {First close all the windows:} 
  73.   close_window(frame2); 
  74.   close_window(frame1); 
  75.   {Go to text mode:} 
  76.   RestoreCrtMode; 
  77.   WriteLn('This is the text mode screen'); 
  78.   WriteLn('Touch any key...'); 
  79.   r:=ReadKey; 
  80.   {To return to the interface, reinitialize it:} 
  81.   xv_init(0,0); 
  82.   xv_end:=FALSE; 
  83.   interposer:=intersept; 
  84.   {Open at least one window. Do not call xv_main_loop again:} 
  85.   open_window(frame2); 
  86.   open_window(frame1) 
  87. END; 
  88.  
  89. {$F-} 
  90.  
  91. BEGIN 
  92.   {Inicialization} 
  93.   xv_init(0,0); 
  94.   {Menu creation} 
  95.   {Interface objects creation} 
  96.   frame1:=xv_create(frame); 
  97.   WITH frame1^ DO BEGIN 
  98.     xv_label:='Message updated by the clock'
  99.     x:=180; 
  100.     y:=176; 
  101.     dx:=294; 
  102.     dy:=99; 
  103.     adjust_exit:=FALSE; 
  104.   END; 
  105.   button1:=xv_create(button); 
  106.   WITH button1^ DO BEGIN 
  107.     xv_label:='button 1'
  108.     y:=15; 
  109.     notify_handler:=UpdateMessage; 
  110.   END; 
  111.   button2:=xv_create(button); 
  112.   WITH button2^ DO BEGIN 
  113.     xv_label:='button 2'
  114.     x:=72; 
  115.     y:=15; 
  116.     notify_handler:=UpdateMessage; 
  117.   END; 
  118.   button3:=xv_create(button); 
  119.   WITH button3^ DO BEGIN 
  120.     xv_label:='button 3'
  121.     x:=144; 
  122.     y:=15; 
  123.     notify_handler:=UpdateMessage; 
  124.   END; 
  125.   button4:=xv_create(button); 
  126.   WITH button4^ DO BEGIN 
  127.     xv_label:='button 4'
  128.     x:=216; 
  129.     y:=15; 
  130.     notify_handler:=UpdateMessage; 
  131.   END; 
  132.   button5:=xv_create(button); 
  133.   WITH button5^ DO BEGIN 
  134.     xv_label:='Exit'
  135.     y:=45; 
  136.     notify_handler:=Terminate; 
  137.   END; 
  138.   button6:=xv_create(button); 
  139.   WITH button6^ DO BEGIN 
  140.     xv_label:='Text mode'
  141.     y:=45; x:=40; 
  142.     notify_handler:=GotoText; 
  143.   END; 
  144.   message1:=xv_create(message); 
  145.   WITH message1^ DO BEGIN 
  146.     fore_color:=yellow; 
  147.   END; 
  148.   message2:=xv_create(message); 
  149.   WITH message2^ DO BEGIN 
  150.     xv_label:='By ACMQ'
  151.     y:=30; 
  152.   END; 
  153.   frame2:=xv_create(frame); 
  154.   WITH frame2^ DO BEGIN 
  155.     xv_label:='Just another frame'
  156.     y:=320; 
  157.     dx:=319; 
  158.     dy:=159; 
  159.   END; 
  160.   tty1:=xv_create(tty); 
  161.   {Installation of the interrupt procedure} 
  162.   GetIntVec($1C,Int1CSave); 
  163.   SetIntVec($1C,Addr(TimerHandler)); 
  164.   {Installation of the Interposer} 
  165.   Interposer:=Intersept; 
  166.   {Opens both frames and starts the event loop} 
  167.   open_window(frame2); 
  168.   xv_main_loop(frame1); 
  169.   {Exit, uninstalling the interrupt procedure} 
  170.   SetIntVec($01C,Int1CSave); 
  171.   RestoreCrtMode 
  172. END. 

Andre artikkelen

  • Earth's magnetic field 98,000 years ago
  • CLOCK.PAS SOURCE CODE
  • How To Fix Blocked Air conditioning drain pipes
  • Blender Sound Enclosure Box can increase Soup Blending Frequency
  • China Mobile Ad source
  • POPSTAR ANDROID SOURCE
  •