home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 January / Chip_1999-01_cd.bin / zkuste / delphi / QDB / ARCHIVE.ZIP / arc_main.pas < prev    next >
Pascal/Delphi Source File  |  1998-06-28  |  9KB  |  288 lines

  1. // This will not compile under Delphi 1
  2. {*****************************************************************************}
  3. {                                                                             }
  4. {                             Archive Demo                                    }
  5. {                                                                             }
  6. {                     illustrating the use of the                             }
  7. {                                                                             }
  8. {               QDB v2.10 Visual Components for Delphi 1, 2, & 3              }
  9. {                                                                             }
  10. {       Copyright (c) 1995, 1996, 1997, 1998 Robert R. Marsh, S.J.            }
  11. {             & the British Province of the Society of Jesus                  }
  12. {                                                                             }
  13. {                                                                             }
  14. {       You may use this demonstration application and modify it in           }
  15. {       whatever way you choose. You may not, however, sell it for            }
  16. {       profit unless the changes you have made are substantial (i.e.,        }
  17. {       more than 50% new code), in which case I'd appreciate                 }
  18. {       receiving a copy of your new work.                                    }
  19. {                                                                             }
  20. {       If you like QDBDemo3 and find yourself using it please                }
  21. {       consider making a donation to your favorite charity.                  }
  22. {                                                                             }
  23. {    Users of Archive must accept the following disclaimer of warranty:       }
  24. {                                                                             }
  25. {       Archive is supplied as is. The author disclaims all warranties,       }
  26. {       expressed or implied, including, without limitation, the              }
  27. {       warranties of merchantability and of fitness for any purpose.         }
  28. {       The author assumes no liability for damages, direct or                }
  29. {       consequential, which may result from the use of Archive.              }
  30. {                                                                             }
  31. {*****************************************************************************}
  32.  
  33. unit arc_main;
  34.  
  35. interface
  36.  
  37. uses
  38.   SysUtils, Windows, Messages, Classes, Graphics, Controls,
  39.   Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus, QDB, ComCtrls;
  40.  
  41. type
  42.   TArc_Form = class(TForm)
  43.     MainMenu: TMainMenu;
  44.     FileNewItem: TMenuItem;
  45.     FileOpenItem: TMenuItem;
  46.     FileSaveItem: TMenuItem;
  47.     FileExitItem: TMenuItem;
  48.     EditCopyItem: TMenuItem;
  49.     OpenDialog: TOpenDialog;
  50.     SpeedBar: TPanel;
  51.     SpeedButton1: TSpeedButton; { &New }
  52.     SpeedButton2: TSpeedButton; { &Open... }
  53.     SpeedButton3: TSpeedButton; { &Save }
  54.     SpeedButton4: TSpeedButton; { E&xit }
  55.     SpeedButton5: TSpeedButton;
  56.     FindDialog: TFindDialog;
  57.     QDB: TQDB;
  58.     Contents: TRichEdit;
  59.     Panel1: TPanel;
  60.     QDBNavigator: TQDBNavigator;
  61.     Add: TButton;
  62.     Find: TButton;
  63.     PlainText: TCheckBox;
  64.     FileSep1: TMenuItem;
  65.     SpeedButton7: TSpeedButton;
  66.     FileCloseItem: TMenuItem; { &Contents }
  67.     procedure FileNew(Sender: TObject);
  68.     procedure FileOpen(Sender: TObject);
  69.     procedure FileSave(Sender: TObject);
  70.     procedure FileClose(Sender: TObject);
  71.     procedure FileExit(Sender: TObject);
  72.     procedure EditCopy(Sender: TObject);
  73.     procedure MyEnable;
  74.     procedure MyDisable;
  75.     procedure AddClick(Sender: TObject);
  76.     procedure PlainTextClick(Sender: TObject);
  77.     procedure FindClick(Sender: TObject);
  78.     procedure QDBNavigate(Sender: TObject);
  79.     procedure FindDialogFind(Sender: TObject);
  80.     procedure FormCreate(Sender: TObject);
  81.     procedure QDBWarnNoData(Sender: TObject);
  82.   end;
  83.  
  84. var
  85.   Arc_Form: TArc_Form;
  86.  
  87. implementation
  88.  
  89.  
  90. {$R *.DFM}
  91.  
  92. procedure TArc_Form.MyEnable;
  93. begin
  94.   Add.enabled := true;
  95.   PlainText.enabled := true;
  96.   Find.enabled := true;
  97.   QDBNavigator.enabled := true;
  98. end;
  99.  
  100. procedure TArc_Form.MyDisable;
  101. begin
  102.   Add.enabled := false;
  103.   PlainText.enabled := false;
  104.   Find.enabled := false;
  105.   QDBNavigator.enabled := false;
  106. end;
  107.  
  108. procedure TArc_Form.FileNew(Sender: TObject);
  109. begin
  110.   OpenDialog.Options := [ofOverwritePrompt];
  111.   OpenDialog.DefaultExt := '.QDB';
  112.   OpenDialog.Title := 'Create a new knowledge-base';
  113.   if OpenDialog.Execute then
  114.   begin
  115.     QDB.FileName := '';
  116.     Contents.Clear;
  117.     QDB.FileName := OpenDialog.Files[0];
  118.     QDB.FirstItem;
  119.     MyEnable;
  120.   end;
  121. end;
  122.  
  123. procedure TArc_Form.FileOpen(Sender: TObject);
  124. begin
  125.   OpenDialog.Options := [ofExtensionDifferent, ofPathMustExist, ofFileMustExist];
  126.   OpenDialog.Filter := 'QDB Files|*.QDB|All Files|*.*';
  127.   OpenDialog.DefaultExt := '.QDB';
  128.   OpenDialog.Title := 'Open an existing database';
  129.   if OpenDialog.Execute then
  130.   begin
  131.     Screen.Cursor := crHourGlass;
  132.     QDB.FileName := '';
  133.     Contents.Clear;
  134.     QDB.FileName := OpenDialog.Files[0];
  135.     QDB.FirstItem;
  136.     MyEnable;
  137.     Screen.Cursor := crDefault;
  138.   end;
  139. end;
  140.  
  141. procedure TArc_Form.FileSave(Sender: TObject);
  142. begin
  143.   Screen.Cursor := crHourGlass;
  144.   QDB.Save;
  145.   Screen.Cursor := crDefault;
  146. end;
  147.  
  148. procedure TArc_Form.FileClose(Sender: TObject);
  149. begin
  150.   Screen.Cursor := crHourGlass;
  151.   QDB.FileName := '';
  152.   Contents.Clear;
  153.   MyDisable;
  154.   Screen.Cursor := crDefault;
  155. end;
  156.  
  157. procedure TArc_Form.FileExit(Sender: TObject);
  158. begin
  159.   Screen.Cursor := crHourGlass;
  160.   QDB.FileName := '';
  161.   Close;
  162. end;
  163.  
  164. procedure TArc_Form.EditCopy(Sender: TObject);
  165. begin
  166.   if Contents.SelLength = 0 then Contents.SelectAll;
  167.   Contents.CopyToClipBoard;
  168. end;
  169.  
  170. procedure TArc_Form.AddClick(Sender: TObject);
  171. var
  172.   f: TFileStream;
  173.   n: integer;
  174.   s: string;
  175. begin
  176.   OpenDialog.Options := [ofAllowMultiSelect, ofPathMustExist, ofFileMustExist];
  177.   OpenDialog.Filter := 'TextFiles|*.txt|Rich Text Files|*.rtf|All Files|*.*';
  178.   OpenDialog.Title := 'Select file(s) to add to the knowledge-base';
  179.   OpenDialog.Execute;
  180.   Screen.Cursor := crHourGlass;
  181.   QDB.BeginUpdate;
  182.   for n := 1 to OpenDialog.Files.Count do
  183.   begin
  184.     s := OpenDialog.Files[n - 1];
  185.     if QDB.ExactMatch(s) then
  186.     begin
  187.       ShowMessage(s + ' is already in the knowledge-base')
  188.     end
  189.     else
  190.     begin
  191.     // notice how easy it is to store a file!
  192.       f := TFileStream.Create(s, 0);
  193.       try
  194.         QDB.Add(f, s);
  195.       finally
  196.         f.Free;
  197.       end;
  198.     end;
  199.   end;
  200.   QDB.EndUpdate;
  201.   Screen.Cursor := crDefault;
  202. end;
  203.  
  204. procedure TArc_Form.PlainTextClick(Sender: TObject);
  205. begin
  206.   Contents.PlainText := PlainText.Checked;
  207.   if PlainText.Checked then
  208.     Contents.Font.Name := 'Courier New'
  209.   else
  210.     Contents.Font.Name := 'Arial';
  211.   QDBNavigate(self);
  212. end;
  213.  
  214. procedure TArc_Form.FindClick(Sender: TObject);
  215. begin
  216.   FindDialog.Execute;
  217. end;
  218.  
  219. procedure TArc_Form.QDBNavigate(Sender: TObject);
  220. var
  221.   m: TMemoryStream;
  222. begin
  223.   Screen.Cursor := crHourGlass;
  224.   m := TMemoryStream.Create;
  225.   try
  226.     QDB.Get(m);
  227.     Contents.Lines.LoadFromStream(m);
  228.   finally
  229.     m.Free;
  230.     Screen.Cursor := crDefault;
  231.   end;
  232. end;
  233.  
  234. // this is the hardest task to code ...
  235.  
  236. procedure TArc_Form.FindDialogFind(Sender: TObject);
  237. var
  238.   lastpos: integer;
  239.   wordpos: integer;
  240.   mytext: string;
  241. begin
  242.   lastpos := Contents.SelStart + Contents.SelLength;
  243.   mytext := AnsiUpperCase(Copy(Contents.Text, lastpos + 1, Length(Contents.Text)));
  244.   wordpos := Pos(AnsiUpperCase(FindDialog.FindText), mytext);
  245.   if wordpos > 0 then
  246.   begin
  247.     Arc_Form.BringToFront;
  248.     Arc_Form.ActiveControl := Contents;
  249.     Contents.SelStart := lastpos + wordpos - 1;
  250.     Contents.SelLength := Length(FindDialog.FindText);
  251.   end
  252.   else
  253.   begin
  254.     repeat
  255.       QDB.NextItem;
  256.     until QDB.EoF or (Pos(AnsiUpperCase(FindDialog.FindText), AnsiUpperCase(Contents.Text)) <> 0);
  257.     lastpos := Contents.SelStart + Contents.SelLength;
  258.     mytext := AnsiUpperCase(Copy(Contents.Text, lastpos + 1, Length(Contents.Text)));
  259.     wordpos := Pos(AnsiUpperCase(FindDialog.FindText), mytext);
  260.     if wordpos > 0 then
  261.     begin
  262.     // the selection will only show if Contents has the focus
  263.       Arc_Form.BringToFront;
  264.       Arc_Form.ActiveControl := Contents;
  265.       Contents.SelStart := lastpos + wordpos - 1;
  266.       Contents.SelLength := Length(FindDialog.FindText);
  267.     end
  268.     else
  269.     begin
  270.       ShowMessage('No more occurrences found');
  271.     end;
  272.   end;
  273. end;
  274.  
  275. procedure TArc_Form.FormCreate(Sender: TObject);
  276. begin
  277.   MyDisable;
  278.   Contents.Clear;
  279. end;
  280.  
  281. procedure TArc_Form.QDBWarnNoData(Sender: TObject);
  282. begin
  283. // dummy
  284. end;
  285.  
  286. end.
  287.  
  288.