home *** CD-ROM | disk | FTP | other *** search
/ Delphi 4 Bible / Delphi_4_Bible_Tom_Swan_IDG_Books_1998.iso / source / COMPSTRM / MAIN.PAS < prev    next >
Pascal/Delphi Source File  |  1998-04-13  |  4KB  |  132 lines

  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, Windows, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, Buttons, StdCtrls;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11.     CreateButton: TButton;
  12.     WriteButton: TButton;
  13.     ReadButton: TButton;
  14.     CloseBitBtn: TBitBtn;
  15.     procedure FormCreate(Sender: TObject);
  16.     procedure CreateButtonClick(Sender: TObject);
  17.     procedure WriteButtonClick(Sender: TObject);
  18.     procedure ReadButtonClick(Sender: TObject);
  19.     procedure FormDestroy(Sender: TObject);
  20.   private
  21.     { Private declarations }
  22.     procedure EnableButtons;
  23.     procedure BOnClick1(Sender: TObject);
  24.     procedure BOnClick2(Sender: TObject);
  25.   public
  26.     { Public declarations }
  27.   end;
  28.  
  29. var
  30.   MainForm: TMainForm;
  31.  
  32. implementation
  33.  
  34. {$R *.DFM}
  35.  
  36. const
  37.   fileName = 'Test.stm';  { The stream's file name }
  38.  
  39. var
  40.   B: TButton;  { Object to be streamed to and from disk }
  41.  
  42. {- OnClick event handler before writing Button to stream }
  43. procedure TMainForm.BOnClick1(Sender: TObject);
  44. begin
  45.   ShowMessage('Thanks. I needed that!');
  46. end;
  47.  
  48. {- OnClick event handler after reading Button from stream }
  49. procedure TMainForm.BOnClick2(Sender: TObject);
  50. begin
  51.   ShowMessage('Hello. It''s nice to be back!');
  52. end;
  53.  
  54. {- Enable and disable buttons depending on whether the Button
  55. object and Test.Strm file exist }
  56. procedure TMainForm.EnableButtons;
  57. begin
  58.   CreateButton.Enabled := False;  { Disable all buttons }
  59.   WriteButton.Enabled := False;
  60.   ReadButton.Enabled := False;
  61.   if B <> nil then
  62.     WriteButton.Enabled := True   { Allow write if B exists }
  63.   else begin
  64.     CreateButton.Enabled := True; { Allow create if B doesn't exist}
  65.     if FileExists(fileName) then
  66.       ReadButton.Enabled := True  { Allow read if file exists }
  67.   end;
  68. end;
  69.  
  70. {- Initialize other buttons to control clicking order }
  71. procedure TMainForm.FormCreate(Sender: TObject);
  72. begin
  73.   EnableButtons;
  74. end;
  75.  
  76. {- Create Button object entirely under program control }
  77. procedure TMainForm.CreateButtonClick(Sender: TObject);
  78. begin
  79.   B := TButton.Create(Self);      { Create the Button object }
  80.   B.Parent := Self;               { Assign parent object }
  81.   B.Left := 240;                  { Assign left position }
  82.   B.Top := 72;                    { Assign top position }
  83.   B.Caption := 'Click me!';       { Assign label }
  84.   B.OnClick := BOnClick1;         { Assign first event handler }
  85.   EnableButtons;                  { Update operation order }
  86. end;
  87.  
  88. {- Write Button object to file stream, and then destroy it }
  89. procedure TMainForm.WriteButtonClick(Sender: TObject);
  90. var
  91.   Stream: TStream;
  92. begin
  93. {- Create a new disk file stream }
  94.   Stream := TFileStream.Create(fileName, fmCreate);
  95.   try
  96.     Stream.WriteComponent(B);      { Write Button object }
  97.     B.Free;                        { Destroy Button object }
  98.     B := nil;  { Prevent form's OnDestroy from Freeing again }
  99.     EnableButtons;                 { Update operation order }
  100.   finally
  101.     Stream.Free;  { Destroy the file stream object }
  102.   end;
  103. end;
  104.  
  105. {- Read Button object from stream }
  106. procedure TMainForm.ReadButtonClick(Sender: TObject);
  107. var
  108.   Stream: TStream;
  109. begin
  110. {- Create stream object in read-only mode }
  111.   Stream := TFileStream.Create(fileName, fmOpenRead);
  112.   try
  113.     B := TButton(Stream.ReadComponent(nil));  { Read & Create B }
  114.     B.Parent := Self;              { Always assign parent! }
  115.     B.OnClick := BOnClick2;        { Assign second event handler }
  116.     EnableButtons;                 { Update operation order }
  117.   finally
  118.     Stream.Free;  { Destroy the file stream object }
  119.   end;
  120. end;
  121.  
  122. {- Destroy button if user closes app before completing test }
  123. procedure TMainForm.FormDestroy(Sender: TObject);
  124. begin
  125.   if B <> nil then B.Free;
  126. end;
  127.  
  128. {- Register the TButton class with Delphi stream system }
  129. begin
  130.   RegisterClass(TButton);
  131. end.
  132.