home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / tvision / tvpas / xgadgets.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-11-10  |  6.0 KB  |  251 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      XGADGETS.PAS                      *)
  3. (*                                                        *)
  4. (*                 Ein Turbo Vision Wecker                *)
  5. (*         (C) 1992 by Christian Ohr & DMV-Verlag         *)
  6. (* ------------------------------------------------------ *)
  7. {$R-,S-,I-,B-,D-,L-,V-,A+,F+,O+,X+}
  8.  
  9. UNIT XGadgets;
  10.  
  11.  
  12. INTERFACE
  13.  
  14.  
  15. USES Dos, Objects, Drivers, Views, Dialogs, Gadgets, App;
  16.  
  17.  
  18. TYPE
  19.   tTimeStr = STRING[8];
  20.   tMsgStr  = STRING[45];
  21.  
  22.   tTimeDlgRec = RECORD
  23.     _LastTime: tTimeStr;
  24.     _BuzzTime: tTimeStr;
  25.     _AlarmMsg: tMsgStr;
  26.     _BuzzMode: WORD;
  27.   END;
  28.  
  29.  
  30. (* tBuzzer stellt einen Wecker zur Verfügung, der auf das *)
  31. (* tClockView-Objekt aufbaut. Zeitangaben sollten immer   *)
  32. (* im Format hh:mm:ss eingegeben werden. Fehlende Minuten *)
  33. (* oder Sekunden entsprechen der Eingabe ':00'            *)
  34.  
  35.   pBuzzer = ^tBuzzer;
  36.   tBuzzer = OBJECT(tClockView)
  37.     BuzzTime: DateTime;
  38.     AlarmMsg: tMsgStr;
  39.     BuzzMode: BOOLEAN;
  40.     Buzzing : BOOLEAN;
  41.  
  42.     CONSTRUCTOR Init (VAR Bounds: tRect);
  43.     PROCEDURE AddSnoozeTime;
  44.     PROCEDURE Buzz; VIRTUAL;
  45.     PROCEDURE Draw; VIRTUAL;
  46.     PROCEDURE FormatDateTime (S: tTimeStr; VAR D: DateTime);
  47.                               VIRTUAL;
  48.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  49.     PROCEDURE Update; VIRTUAL;
  50.   END;
  51.  
  52.  
  53. IMPLEMENTATION
  54.  
  55.  
  56. USES CRT, XDialogs;
  57.  
  58.  
  59. FUNCTION CreateBuzzDlg (VAR Msg: tMsgStr): pDialog;
  60. VAR
  61.   R: tRect;
  62.   C: pView;
  63.   D: pDialog;
  64.   M: tTitleStr;
  65. BEGIN
  66.   R.Assign(0, 0, 50, 8);
  67.   D := New(pDialog, Init(R, 'Alarm!'));
  68.   WITH D^ DO BEGIN
  69.     Options := Options OR ofCentered;
  70.     R.Assign(2, 2, 48, 3);
  71.     Insert(New(pStaticText, Init(R, #3 + Msg)));
  72.  
  73.     R.Assign(20, 5, 34, 7);
  74.     Insert(New(pButton, Init(R, '~S~chlummer', cmYes,
  75.                              bfDefault)));
  76.     R.Assign(36, 5, 46, 7);
  77.     Insert(New(pButton, Init(R, '~A~us!', cmNo,
  78.                              bfNormal)));
  79.  
  80.     SelectNext(FALSE);
  81.   END;
  82.   CreateBuzzDlg := D;
  83. END;
  84.  
  85.  
  86. FUNCTION CreateTimeDlg: pDialog;
  87. VAR
  88.   R: tRect;
  89.   C: pView;
  90.   D: pDialog;
  91. BEGIN
  92.   R.Assign(0, 0, 31, 14);
  93.   D := New(pDialog, Init(R, 'Zeit einstellen'));
  94.   IF D <> NIL THEN
  95.     WITH D^ DO BEGIN
  96.       Options := Options OR ofCentered;
  97.  
  98.       R.Assign(18, 2, 28, 3);
  99.       C := New(pInputLine, Init(R, 8));
  100.       Insert(C);
  101.             R.Assign(2, 2, 17, 3);
  102.       Insert(New(pLabel, Init(R, '~S~ystem-Zeit', C)));
  103.  
  104.       R.Assign(18, 4, 28, 5);
  105.       C := New(pInputLine, Init(R, 8));
  106.       Insert(C);
  107.       R.Assign(2, 4, 17, 5);
  108.       Insert(New(pLabel, Init(R, '~A~larm-Zeit', C)));
  109.  
  110.       R.Assign(3, 7, 28, 8);
  111.       C := New(pInputLine, Init(R, 45));
  112.       Insert(C);
  113.       R.Assign(2, 6, 18, 7);
  114.       Insert(New(pLabel, Init(R, 'Alarm-~N~achricht', C)));
  115.  
  116.       R.Assign(9, 9, 28, 10);
  117.       C := New(pRadioButtons, Init(R,
  118.         NewSItem('A~n~',
  119.         NewSItem('A~u~s', NIL))));
  120.       Insert(C);
  121.  
  122.       R.Assign(6, 11, 16, 13);
  123.       Insert(New(pButton, Init(R, 'O~k~', cmOk,
  124.                                bfDefault)));
  125.       R.Move(12, 0); Inc(R.B.X);
  126.       Insert(New(pButton, Init(R, 'Abbruch', cmCancel,
  127.                                bfNormal)));
  128.       SelectNext(FALSE);
  129.   END;
  130.   CreateTimeDlg := D;
  131. END;
  132.  
  133.  
  134.  
  135. (* ------------------------------------------------------ *)
  136. (*                       tBuzzer                          *)
  137. (* ------------------------------------------------------ *)
  138.  
  139.  
  140. CONSTRUCTOR tBuzzer.Init (VAR Bounds: tRect);
  141. BEGIN
  142.   tClockView.Init(Bounds);
  143.   FillChar(BuzzTime, SizeOf(BuzzTime), $00);
  144.   BuzzMode := FALSE;
  145.   AlarmMsg := '';
  146. END;
  147.  
  148.  
  149. PROCEDURE tBuzzer.AddSnoozeTime;
  150. BEGIN
  151.   BuzzTime := LastTime;
  152.   WITH BuzzTime DO BEGIN
  153.     Inc(Min, 5);
  154.     IF Min > 59 THEN BEGIN
  155.       Dec(Min, 60);
  156.       Inc(Hour);
  157.       IF Hour > 23 THEN Hour := 0;
  158.     END;
  159.   END;
  160. END;
  161.  
  162.  
  163. PROCEDURE tBuzzer.Buzz;
  164. BEGIN
  165.   Sound(1650); Delay(10); NoSound; Delay(30);
  166. END;
  167. PROCEDURE tBuzzer.Draw;
  168. BEGIN
  169.   tClockView.Draw;
  170.   IF BuzzMode THEN
  171.     WriteChar(8, 0, #14, 4, 1) ELSE
  172.     WriteChar(8, 0, #32, 4, 1);
  173. END;
  174.  
  175.  
  176. PROCEDURE tBuzzer.FormatDateTime (S: tTimeStr;
  177.                                   VAR D: DateTime);
  178. VAR
  179.   I: INTEGER;
  180. BEGIN
  181.   Val(Copy(S, 1, 2), D.Hour, I);
  182.   Val(Copy(S, 4, 2), D.Min, I);
  183.   Val(Copy(S, 7, 2), D.Sec, I);
  184. END;
  185.  
  186.  
  187. PROCEDURE tBuzzer.HandleEvent (VAR Event: tEvent);
  188.  
  189.   PROCEDURE HandleDialog;
  190.   VAR
  191.     Rec: tTimeDlgRec;
  192.     _Time: tTimeStr;
  193.   BEGIN
  194.     WITH Rec DO BEGIN
  195.       WITH LastTime DO
  196.         _LastTime := FormatTimeStr(Hour, Min, Sec);
  197.       WITH BuzzTime DO
  198.         _BuzzTime := FormatTimeStr(Hour, Min, Sec);
  199.       _AlarmMsg := AlarmMsg;
  200.       _BuzzMode := 1 - Ord(BuzzMode);
  201.       _Time := _LastTime;
  202.       IF ExecDialog(CreateTimeDlg, @Rec) <> cmCancel THEN
  203.       BEGIN
  204.         AlarmMsg := _AlarmMsg;
  205.         BuzzMode := (_BuzzMode = 0);
  206.         FormatDateTime(_BuzzTime, BuzzTime);
  207.         IF _LastTime <> _Time THEN BEGIN
  208.           FormatDateTime(_LastTime, LastTime);
  209.           WITH LastTime DO SetTime(Hour, Min, Sec, 0);
  210.         END;
  211.       END;
  212.     END;
  213.   END;
  214.  
  215. BEGIN
  216.   IF Event.What = evMouseDown THEN BEGIN
  217.     IF Event.Buttons = mbRightButton THEN
  218.       BuzzMode := NOT BuzzMode ELSE HandleDialog;
  219.     ClearEvent(Event);
  220.   END;
  221.   tClockView.HandleEvent(Event);
  222. END;
  223.  
  224.  
  225. PROCEDURE tBuzzer.Update;
  226. VAR
  227.   P: pDialog;
  228. BEGIN
  229.   tClockView.Update;
  230.   IF BuzzMode THEN
  231.     IF LastTime.Hour * 3600 + LastTime.Min * 60 +
  232.        LastTime.Sec >= BuzzTime.Hour * 3600 + BuzzTime.Min *
  233.        60 + BuzzTime.Sec THEN BEGIN
  234.       Buzz;
  235.       IF NOT Buzzing THEN BEGIN
  236.         Buzzing := TRUE;
  237.         CASE ExecDialog(CreateBuzzDlg(AlarmMsg), NIL) OF
  238.           cmYes : AddSnoozeTime;
  239.           cmNo  : BuzzMode := FALSE;
  240.         END;
  241.         Buzzing := FALSE;
  242.       END;
  243.     END;
  244. END;
  245.  
  246. END.
  247.  
  248.  
  249. (* ------------------------------------------------------ *)
  250. (*                Ende von XGADGETS.PAS                   *)
  251.