home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TPASCAL3.ZIP / TVDEMOS.ZIP / FORMS.PAS < prev    next >
Pascal/Delphi Source File  |  1991-06-11  |  5KB  |  190 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Pascal 6.0                             }
  4. {   Turbo Vision Forms Demo                      }
  5. {   Copyright (c) 1990 by Borland International  }
  6. {                                                }
  7. {************************************************}
  8.  
  9. unit Forms;
  10.  
  11. {$F+,O+,X+,S-,D-}
  12.  
  13. interface
  14.  
  15. uses Objects, Drivers, Views, Dialogs;
  16.  
  17. type
  18.   PForm = ^TForm;
  19.   TForm = object(TDialog)
  20.     ListDialog: PView;
  21.     PrevData: Pointer;
  22.     KeyWidth: Word;
  23.     constructor Load(var S: TStream);
  24.     function Changed: Boolean; virtual;
  25.     procedure HandleEvent(var Event: TEvent); virtual;
  26.     procedure Store(var S: TStream);
  27.     function Valid(Command: Word): Boolean; virtual;
  28.   end;
  29.  
  30. const
  31.   RForm: TStreamRec = (
  32.     ObjType: 10070;
  33.     VmtLink: Ofs(TypeOf(TForm)^);
  34.     Load: @TForm.Load;
  35.     Store: @TForm.Store);
  36.  
  37. procedure RegisterForms;
  38.  
  39. implementation
  40.  
  41. uses FormCmds, Stddlg, MsgBox, ListDlg;
  42.  
  43. function CompBlocks(Buf1, Buf2 : Pointer;
  44.   BufSize : Word): Boolean; far; assembler;
  45. { Compares two buffers and returns True if contents are equal }
  46. asm
  47.     PUSH    DS
  48.     MOV    AX, 1            { Init error return: True }
  49.     LDS    SI, Buf1
  50.     LES    DI, Buf2
  51.     MOV    CX, BufSize
  52.     JCXZ    @@Done
  53.  
  54. { Loop until different or end of buffer }
  55.     CLD                     { Flag to bump SI,DI }
  56.     REP    CMPSB
  57.     JE    @@Done
  58.  
  59. { Compare error }
  60.     XOR    AX, AX            { Return False }
  61.  
  62. @@Done:
  63.     POP    DS            { Restore }
  64. end;
  65.  
  66. procedure RegisterForms;
  67. begin
  68.   RegisterType(RForm);
  69. end;
  70.  
  71. constructor TForm.Load(var S: TStream);
  72. begin
  73.   TDialog.Load(S);
  74.   S.Read(KeyWidth, SizeOf(KeyWidth));
  75. end;
  76.  
  77. function TForm.Changed: Boolean;
  78. var
  79.   CurData: Pointer;
  80.   CompSize: Word;
  81.   NewForm: Boolean;
  82. begin
  83.   CompSize := DataSize;
  84.   GetMem(CurData, CompSize);
  85.   GetData(CurData^);
  86.   NewForm := PrevData = nil;
  87.   if NewForm then
  88.   begin
  89.     { Dummy up empty record for comparison }
  90.     GetMem(PrevData, CompSize);
  91.     FillChar(PrevData^, CompSize, 0);
  92.   end;
  93.   Changed := not CompBlocks(PrevData, CurData, CompSize);
  94.   FreeMem(CurData, CompSize);
  95.   if NewForm then
  96.   begin
  97.     FreeMem(PrevData, CompSize);
  98.     PrevData := nil;
  99.   end;
  100. end;
  101.  
  102. procedure TForm.HandleEvent(var Event: TEvent);
  103. begin
  104.   { Respond to CANCEL button and ESC }
  105.   if ((Event.What = evKeyDown) and (Event.KeyCode = kbEsc)) or
  106.      ((Event.What = evCommand) and (Event.Command = cmCancel)) then
  107.   begin
  108.     ClearEvent(Event);
  109.     Free;
  110.     Exit;
  111.   end;
  112.  
  113.   { Respond to SAVE button }
  114.   if ((Event.What = evCommand) and (Event.Command = cmFormSave)) then
  115.   begin
  116.     ClearEvent(Event);
  117.     if Changed then
  118.     begin
  119.       if PListDialog(ListDialog)^.SaveForm(@Self) then
  120.       begin
  121.         Free;
  122.         Exit;
  123.       end;
  124.     end
  125.     else
  126.     begin
  127.       Free;                        { not changed }
  128.       Exit;
  129.     end;
  130.   end;
  131.  
  132.   TDialog.HandleEvent(Event);
  133.  
  134.   { Respond to TopForm and RegisterForm messages }
  135.   if Event.What = evBroadcast then
  136.   begin
  137.     if (Event.Command = cmEditingForm) then
  138.     begin
  139.       { Already editing broadcast form? }
  140.       if (PrevData <> nil) and (Event.InfoPtr = PrevData) then
  141.         ClearEvent(Event);
  142.     end
  143.     else
  144.       { Belong to sending ListDialog? }
  145.       if ListDialog = Event.InfoPtr then
  146.       begin
  147.         if Event.Command = cmTopForm then ClearEvent(Event)
  148.         else if Event.Command = cmCanCloseForm then
  149.         begin
  150.           if not Valid(cmClose) then ClearEvent(Event)
  151.         end
  152.         else if Event.Command = cmCloseForm then Free;
  153.       end;
  154.   end;
  155. end;
  156.  
  157. procedure TForm.Store(var S: TStream);
  158. begin
  159.   TDialog.Store(S);
  160.   S.Write(KeyWidth, SizeOf(KeyWidth));
  161. end;
  162.  
  163. function TForm.Valid(Command: Word): Boolean;
  164. var
  165.   Action: Word;
  166. begin
  167.   Action := cmYes;                    { assume calling inherited }
  168.   if Command = cmClose then
  169.     if Changed then
  170.     begin
  171.       Select;
  172.       Action := MessageBox(#3'Form data has been modified. Save? ', nil,
  173.         mfYesNoCancel);
  174.       case Action of
  175.         cmYes:
  176.           { Try to save changes. Cancel if save fails }
  177.           if not PListDialog(ListDialog)^.SaveForm(@Self) then
  178.             Action := cmCancel;
  179.         cmNo: ;                                     { abandon changes }
  180.       else
  181.         Action := cmCancel;                          { cancel close request }
  182.       end;
  183.     end
  184.     else Action := cmNo;                             { no changes }
  185.   if Action = cmYes then Valid := TDialog.Valid(Command)
  186.   else Valid := Action <> cmCancel;
  187. end;
  188.  
  189. end.
  190.