home *** CD-ROM | disk | FTP | other *** search
- unit PropertySheet;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls;
- type
- TfrmPropertySheet = class(TForm)
- pgcDetails: TPageControl;
- tabDetails: TTabSheet;
- btnApply: TButton;
- btnCancel: TButton;
- btnOK: TButton;
- imgDetails: TImage;
- lblDetails: TLabel;
- procedure pgcDetailsChange(Sender: TObject);
- procedure FormShow(Sender: TObject);
- procedure btnOKClick(Sender: TObject);
- procedure btnApplyClick(Sender: TObject);
- private
- LoadedTabs: Integer;
- EditObject: TObject;
- function GetIsLoaded (TabSheet: TTabSheet): Boolean;
- procedure SetIsLoaded (TabSheet: TTabSheet; Value: Boolean);
- procedure SaveDetails;
- protected
- // Allow control over page loading
- property IsLoaded [TabSheet: TTabSheet]: Boolean read GetIsLoaded write SetIsLoaded default False;
- // Override these methods to populate pages
- procedure LoadTab (TabSheet: TTabSheet; ObjectToLoad: TObject); virtual; abstract;
- procedure SaveTab (TabSheet: TTabSheet; ObjectToSave: TObject); virtual; abstract;
- public
- class function Edit (ObjectToEdit: TObject): TModalResult;
- end;
-
- implementation
-
- {$R *.DFM}
- // TfrmPropertySheet
- function TfrmPropertySheet.GetIsLoaded (TabSheet: TTabSheet): Boolean;
- begin
- // Use bitwise operator for speed and compactness
- Result := (LoadedTabs and (1 shl TabSheet.PageIndex) <> 0);
- end;
-
- procedure TfrmPropertySheet.SetIsLoaded (TabSheet: TTabSheet; Value: Boolean);
- begin
- if Value <> IsLoaded[TabSheet] then LoadedTabs := LoadedTabs xor (1 shl TabSheet.PageIndex);
- end;
-
- class function TfrmPropertySheet.Edit (ObjectToEdit: TObject): TModalResult;
- var
- dlgPropertySheet: TfrmPropertySheet;
- begin
- dlgPropertySheet := Self.Create (nil);
- try
- dlgPropertySheet.Icon.Assign (dlgPropertySheet.imgDetails.Picture.Icon);
- dlgPropertySheet.EditObject := ObjectToEdit;
- Result := dlgPropertySheet.ShowModal;
- finally
- dlgPropertySheet.Free;
- end;
- end;
-
- procedure TfrmPropertySheet.SaveDetails;
- var
- ThisPage: Integer;
- begin
- for ThisPage := 0 to pgcDetails.PageCount - 1 do begin
- if IsLoaded [pgcDetails.Pages[ThisPage]] then begin
- SaveTab (pgcDetails.Pages[ThisPage], EditObject);
- end;
- end;
- end;
-
- // Events
- procedure TfrmPropertySheet.pgcDetailsChange (Sender: TObject);
- begin
- if not IsLoaded [pgcDetails.ActivePage] then begin
- // Populate controls
- LoadTab (pgcDetails.ActivePage, EditObject);
- IsLoaded[pgcDetails.ActivePage] := True;
- // Reset focus to first control on tab
- pgcDetails.ActivePage.SetFocus;
- SendMessage (Handle, WM_NEXTDLGCTL, 0, 0);
- end;
- end;
-
- procedure TfrmPropertySheet.FormShow (Sender: TObject);
- begin
- pgcDetailsChange (Sender);
- end;
-
- procedure TfrmPropertySheet.btnOKClick(Sender: TObject);
- begin
- SaveDetails;
- ModalResult := mrOK;
- end;
-
- procedure TfrmPropertySheet.btnApplyClick(Sender: TObject);
- begin
- SaveDetails;
- btnApply.Enabled := False;
- btnOK.Enabled := True;
- btnCancel.Enabled := False;
- btnCancel.Cancel := False;
- btnOK.Caption := 'Close';
- end;
-
- end.
-