home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue57 / DataAwar / Listing2.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2000-04-04  |  3.1 KB  |  109 lines

  1. unit PropertySheet;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls;
  5. type
  6.   TfrmPropertySheet = class(TForm)
  7.     pgcDetails: TPageControl;
  8.     tabDetails: TTabSheet;
  9.     btnApply: TButton;
  10.     btnCancel: TButton;
  11.     btnOK: TButton;
  12.     imgDetails: TImage;
  13.     lblDetails: TLabel;
  14.     procedure pgcDetailsChange(Sender: TObject);
  15.     procedure FormShow(Sender: TObject);
  16.     procedure btnOKClick(Sender: TObject);
  17.     procedure btnApplyClick(Sender: TObject);
  18.   private
  19.     LoadedTabs: Integer;
  20.     EditObject: TObject;
  21.     function GetIsLoaded (TabSheet: TTabSheet): Boolean;
  22.     procedure SetIsLoaded (TabSheet: TTabSheet; Value: Boolean);
  23.     procedure SaveDetails;
  24.   protected
  25.     // Allow control over page loading
  26.     property IsLoaded [TabSheet: TTabSheet]: Boolean read GetIsLoaded write SetIsLoaded default False;
  27.     // Override these methods to populate pages
  28.     procedure LoadTab (TabSheet: TTabSheet; ObjectToLoad: TObject); virtual; abstract;
  29.     procedure SaveTab (TabSheet: TTabSheet; ObjectToSave: TObject); virtual; abstract;
  30.   public
  31.     class function Edit (ObjectToEdit: TObject): TModalResult;
  32.   end;
  33.  
  34. implementation
  35.  
  36. {$R *.DFM}
  37. // TfrmPropertySheet
  38. function TfrmPropertySheet.GetIsLoaded (TabSheet: TTabSheet): Boolean;
  39. begin
  40.   // Use bitwise operator for speed and compactness
  41.   Result := (LoadedTabs and (1 shl TabSheet.PageIndex) <> 0);
  42. end;
  43.  
  44. procedure TfrmPropertySheet.SetIsLoaded (TabSheet: TTabSheet; Value: Boolean);
  45. begin
  46.   if Value <> IsLoaded[TabSheet] then LoadedTabs := LoadedTabs xor (1 shl TabSheet.PageIndex);
  47. end;
  48.  
  49. class function TfrmPropertySheet.Edit (ObjectToEdit: TObject): TModalResult;
  50. var
  51.   dlgPropertySheet: TfrmPropertySheet;
  52. begin
  53.   dlgPropertySheet := Self.Create (nil);
  54.   try
  55.     dlgPropertySheet.Icon.Assign (dlgPropertySheet.imgDetails.Picture.Icon);
  56.     dlgPropertySheet.EditObject := ObjectToEdit;
  57.     Result := dlgPropertySheet.ShowModal;
  58.   finally
  59.     dlgPropertySheet.Free;
  60.   end;
  61. end;
  62.  
  63. procedure TfrmPropertySheet.SaveDetails;
  64. var
  65.   ThisPage: Integer;
  66. begin
  67.   for ThisPage := 0 to pgcDetails.PageCount - 1 do begin
  68.     if IsLoaded [pgcDetails.Pages[ThisPage]] then begin
  69.       SaveTab (pgcDetails.Pages[ThisPage], EditObject);
  70.     end;
  71.   end;
  72. end;
  73.  
  74. // Events
  75. procedure TfrmPropertySheet.pgcDetailsChange (Sender: TObject);
  76. begin
  77.   if not IsLoaded [pgcDetails.ActivePage] then begin
  78.     // Populate controls
  79.     LoadTab (pgcDetails.ActivePage, EditObject);
  80.     IsLoaded[pgcDetails.ActivePage] := True;
  81.     // Reset focus to first control on tab
  82.     pgcDetails.ActivePage.SetFocus;
  83.     SendMessage (Handle, WM_NEXTDLGCTL, 0, 0);
  84.   end;
  85. end;
  86.  
  87. procedure TfrmPropertySheet.FormShow (Sender: TObject);
  88. begin
  89.   pgcDetailsChange (Sender);
  90. end;
  91.  
  92. procedure TfrmPropertySheet.btnOKClick(Sender: TObject);
  93. begin
  94.   SaveDetails;
  95.   ModalResult := mrOK;
  96. end;
  97.  
  98. procedure TfrmPropertySheet.btnApplyClick(Sender: TObject);
  99. begin
  100.   SaveDetails;
  101.   btnApply.Enabled := False;
  102.   btnOK.Enabled := True;
  103.   btnCancel.Enabled := False;
  104.   btnCancel.Cancel := False;
  105.   btnOK.Caption := 'Close';
  106. end;
  107.  
  108. end.
  109.