diff --git a/Lib/D11/GUISDK_D11.bpl b/Lib/D11/GUISDK_D11.bpl new file mode 100644 index 0000000..5dad507 Binary files /dev/null and b/Lib/D11/GUISDK_D11.bpl differ diff --git a/Lib/D11/GUISDK_D11.dcp b/Lib/D11/GUISDK_D11.dcp new file mode 100644 index 0000000..2d9508c Binary files /dev/null and b/Lib/D11/GUISDK_D11.dcp differ diff --git a/Lib/D11/GUISDK_D11.dcu b/Lib/D11/GUISDK_D11.dcu new file mode 100644 index 0000000..eedcdde Binary files /dev/null and b/Lib/D11/GUISDK_D11.dcu differ diff --git a/Lib/D11/uCustomEditor.dcu b/Lib/D11/uCustomEditor.dcu new file mode 100644 index 0000000..4f11358 Binary files /dev/null and b/Lib/D11/uCustomEditor.dcu differ diff --git a/Lib/D11/uCustomView.dcu b/Lib/D11/uCustomView.dcu new file mode 100644 index 0000000..84f3567 Binary files /dev/null and b/Lib/D11/uCustomView.dcu differ diff --git a/Lib/D11/uGUIBase.dcu b/Lib/D11/uGUIBase.dcu new file mode 100644 index 0000000..767050b Binary files /dev/null and b/Lib/D11/uGUIBase.dcu differ diff --git a/Lib/D11/uGUIUtils.dcu b/Lib/D11/uGUIUtils.dcu new file mode 100644 index 0000000..44ebbf7 Binary files /dev/null and b/Lib/D11/uGUIUtils.dcu differ diff --git a/Packages/GUISDK_D11.dpk b/Packages/GUISDK_D11.dpk new file mode 100644 index 0000000..3570d13 --- /dev/null +++ b/Packages/GUISDK_D11.dpk @@ -0,0 +1,45 @@ +package GUISDK_D11; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'GUI SDK para Delphi 2007'} +{$IMPLICITBUILD OFF} +{$DEFINE RELEASE} + +requires + vcl, + rtl, + designide, + vclactnband, + vclx, + ccpackD11, + cfpack_D11, + xmlrtl; + +contains + uCustomView in '..\Source\uCustomView.pas', + uCustomEditor in '..\Source\uCustomEditor.pas', + uGUIBase in '..\Source\uGUIBase.pas', + uGUIUtils in '..\Source\uGUIUtils.pas'; + +end. diff --git a/Packages/GUISDK_D11.dproj b/Packages/GUISDK_D11.dproj new file mode 100644 index 0000000..2a6150b --- /dev/null +++ b/Packages/GUISDK_D11.dproj @@ -0,0 +1,670 @@ + + + + {53bef2d1-a6c9-410c-9888-9c249cea28a3} + GUISDK_D11.dpk + Release + AnyCPU + DCC32 + ..\Lib\D11\GUISDK_D11.bpl + + + 7.0 + False + False + 0 + RELEASE + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Source + ..\Source + ..\Source + ..\Source + + + 7.0 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + Delphi.Personality + Package + + + False + True + False + + + GUI SDK para Delphi 2007 + False + False + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 3082 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Microsoft Office XP Sample Automation Server Wrapper Components + CodeGear WebSnap Components + CodeGear SOAP Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + + + GUISDK_D11.dpk + + + + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Packages/GUISDK_D11.res b/Packages/GUISDK_D11.res new file mode 100644 index 0000000..86c94e6 Binary files /dev/null and b/Packages/GUISDK_D11.res differ diff --git a/Packages/GUISDK_D2007.dproj b/Packages/GUISDK_D2007.dproj index 804715c..34e3c09 100644 --- a/Packages/GUISDK_D2007.dproj +++ b/Packages/GUISDK_D2007.dproj @@ -1,12 +1,11 @@ - - + - {0e5b9f0d-99ce-4dbd-9ec4-3c0e377e9009} + {53bef2d1-a6c9-410c-9888-9c249cea28a3} GUISDK_D2007.dpk Debug AnyCPU DCC32 - ..\Lib\D2007\GUISDK_D2007.bpl + C:\Documents and Settings\All Users\Documentos\RAD Studio\5.0\Bpl\GUISDK_D2007.bpl 7.0 @@ -17,18 +16,51 @@ 7.0 - DEBUG - ..\Lib\D2007 - ..\Lib\D2007 - ..\Lib\D2007 - ..\Lib\D2007 - ..\Lib\D2007 + DEBUG;DEBUG Delphi.Personality Package -FalseTrueFalseGUI SDK para Delphi 2007FalseFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0 + + False + True + False + + + GUI SDK para Delphi 2007 + False + False + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 3082 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + @@ -41,64 +73,519 @@ - - - - - - - - - - - - - - - - - - - Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components - GUISDK_D2007.dpk + CodeGear WebSnap Components + CodeGear SOAP Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + + + GUISDK_D2007.dpk + + - + MainSource - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + - \ No newline at end of file + + + + diff --git a/Packages/GUISDK_D2007.res b/Packages/GUISDK_D2007.res index 86c94e6..4f90713 100644 Binary files a/Packages/GUISDK_D2007.res and b/Packages/GUISDK_D2007.res differ diff --git a/Source/uCustomEditor.dfm b/Source/uCustomEditor.dfm new file mode 100644 index 0000000..46975d9 --- /dev/null +++ b/Source/uCustomEditor.dfm @@ -0,0 +1,18 @@ +object CustomEditor: TCustomEditor + Left = 486 + Top = 435 + Width = 518 + Height = 324 + Caption = 'CustomEditor' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnActivate = FormActivate + OnClose = FormClose + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/Source/uCustomEditor.pas b/Source/uCustomEditor.pas new file mode 100644 index 0000000..19b793c --- /dev/null +++ b/Source/uCustomEditor.pas @@ -0,0 +1,319 @@ +unit uCustomEditor; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, uGUIBase, uCustomView; + +type + TCustomEditor = class(TForm, ICustomEditor) + private + FInstanceID: Integer; + FOnGetModified: TOnGetModifiedEvent; + FOnViewModified: TOnViewModifiedEvent; + FReadOnly: Boolean; + function FindHostForm : IHostForm; + procedure ShowEmbedded(const AParent : TWinControl); overload; + protected + FViews: TInterfaceList; + procedure UpdateActions; override; + function GetInstanceID: Integer; + function GetModified: Boolean; virtual; + procedure SetModified(const Value : Boolean); virtual; + function GetOnViewModified: TOnViewModifiedEvent; + procedure SetOnViewModified(const Value : TOnViewModifiedEvent); + function GetReadOnly: Boolean; virtual; + function GetValid: Boolean; virtual; + procedure SetInstanceID(Value: Integer); + procedure SetReadOnly(Value: Boolean); virtual; + function GetOnGetModified: TOnGetModifiedEvent; + procedure SetOnGetModified(const Value: TOnGetModifiedEvent); + public + constructor Create(AOwner: TComponent); overload; override; + destructor Destroy; override; + function CreateView(const AViewClass : TCustomViewClass): IInterface; + function FindView(const IID: TGUID): IInterface; + function GetInstance: TObject; + procedure ShowEmbedded; overload; + function CloseQuery: Boolean; override; + property Modified: Boolean read GetModified write SetModified; + published + property InstanceID: Integer read GetInstanceID write SetInstanceID; + property ReadOnly: Boolean read GetReadOnly write SetReadOnly; + property Valid: Boolean read GetValid; + property OnGetModified: TOnGetModifiedEvent read GetOnGetModified write + SetOnGetModified; + end; + + TCustomEditorClass = class of TCustomEditor; + +procedure Register; + +implementation + +uses + CustFrms, uGUIUtils; + +procedure Register; +begin + RegisterCustomFormClass(TCustomEditor); +end; + +{ +******************************** TCustomEditor ********************************* +} + +constructor TCustomEditor.Create(AOwner: TComponent); +begin +// inherited CreateNew(AOwner); + // initialize custom fields, etc., here + FViews := TInterfaceList.Create; + + GlobalNameSpace.BeginWrite; + try + CreateNew(AOwner); + if (ClassType <> TCustomEditor) and not (csDesigning in ComponentState) then + begin + Include(FFormState, fsCreating); + try + if not InitInheritedComponent(Self, TCustomEditor) then + raise EResNotFound.CreateFmt('Error %s', [ClassName]); + finally + Exclude(FFormState, fsCreating); + end; + if OldCreateOrder then DoCreate; + end; + finally + GlobalNameSpace.EndWrite; + end; + + + +{ GlobalNameSpace.BeginWrite; + try + if (ClassType <> TCustomEditor) and + not (csDesigning in ComponentState) then + begin + if not InitInheritedComponent(Self, TCustomEditor) then + raise Exception.Create('Error'); + if OldCreateOrder and Assigned(OnCreate) then + OnCreate(Self); + end; + finally + GlobalNameSpace.EndWrite; + end;} +end; + +destructor TCustomEditor.Destroy; +var + i: Integer; +begin + for i := FViews.Count - 1 downto 0 do + FViews.Delete(i); + + FreeAndNIL(FViews); + + inherited Destroy; +end; + +function TCustomEditor.CreateView(const AViewClass : TCustomViewClass): + IInterface; +begin + Result := FViews[FViews.Add(AViewClass.Create(Self))]; +end; + +function TCustomEditor.FindView(const IID: TGUID): IInterface; +var + i: Integer; + aObj: ICustomView; +begin + aObj := NIL; + Result := NIL; + for i := 0 to (FViews.Count - 1) do + begin + FViews.Items[i].QueryInterface(IID, aObj); + if Assigned(aObj) then + begin + Result := aObj; + Break; + end; + end; +end; + +function TCustomEditor.GetInstance: TObject; +begin + Result := Self; +end; + +function TCustomEditor.GetInstanceID: Integer; +begin + Result := FInstanceID; +end; + +function TCustomEditor.GetModified: Boolean; +begin + Result := ControlIsModified(Self); + if Assigned(FOnGetModified) then + FOnGetModified(Self, Result); +end; + +function TCustomEditor.GetReadOnly: Boolean; +begin + Result := FReadOnly; +end; + +function TCustomEditor.GetValid: Boolean; +var + i: Integer; + aObj: ICustomView; +begin + aObj := NIL; + Result := True; + for i := 0 to (FViews.Count - 1) do + begin + FViews.Items[i].QueryInterface(IValidable, aObj); + if Assigned(aObj) then + Result := Result AND aObj.Valid; + if not Result then + Break; + end; +end; + +procedure TCustomEditor.SetInstanceID(Value: Integer); +begin + FInstanceID := Value; +end; + +procedure TCustomEditor.SetReadOnly(Value: Boolean); +begin + FReadOnly := Value; +end; + +procedure TCustomEditor.ShowEmbedded; +var + AMainForm: IHostForm; +begin + AMainForm := NIL; + if not Supports(Application.MainForm, IHostForm, AMainForm) then + AMainForm := FindHostForm; + + if not Assigned(AMainForm) then + raise Exception.Create('No se ha encontrado el formulario principal (ShowEmbedded)') + else + AMainForm.ShowEmbedded(Self) +end; + +procedure TCustomEditor.ShowEmbedded(const AParent : TWinControl); +begin + Parent := AParent; + Align := alClient; + BorderIcons := []; + BorderStyle := bsNone; + Show; + SetFocus; +end; + +function TCustomEditor.GetOnGetModified: TOnGetModifiedEvent; +begin + Result := FOnGetModified; +end; + +function TCustomEditor.GetOnViewModified: TOnViewModifiedEvent; +begin + Result := FOnViewModified; +end; + +procedure TCustomEditor.SetOnGetModified(const Value: TOnGetModifiedEvent); +begin + FOnGetModified := Value; +end; + +procedure TCustomEditor.SetOnViewModified(const Value: TOnViewModifiedEvent); +begin + FOnViewModified := Value; +end; + +function TCustomEditor.CloseQuery: Boolean; +var + i: Integer; + aIntf: IValidable; +begin + Result := inherited CloseQuery; + if Result then + for i := 0 to FViews.Count - 1 do + begin + FViews.Items[i].QueryInterface(IValidable, aIntf); + if Assigned(aIntf) then + begin + Result := (Result and aIntf.Valid); + if not Result then + break; + end; + end; +end; + +procedure TCustomEditor.SetModified(const Value: Boolean); +begin + if Value = False then + ResetModifiedControl(Self); + + if Assigned(FOnViewModified) then + FOnViewModified(Self); +end; + +function TCustomEditor.FindHostForm: IHostForm; +var + i : integer; + AMainForm : IHostForm; +begin + Result := NIL; + for i := 0 to Application.ComponentCount do + if Supports(Application.Components[i], IHostForm, AMainForm) then + begin + Result := AMainForm; + Break; + end; +end; + +{------------------------------------------------------------------------------- + Sobreescribo 'UpdateActions' por un fallo en Delphi que hace + consumir mucha CPU cuando se usan acciones con formularios metidos + uno dentro de otro. +-------------------------------------------------------------------------------} +procedure TCustomEditor.UpdateActions; +var + I: Integer; + + procedure TraverseClients(Container: TWinControl); + var + I: Integer; + Control: TControl; + begin + Application.ProcessMessages; // <--- Modificación + if Container.Showing then + for I := 0 to Container.ControlCount - 1 do + begin + Control := Container.Controls[I]; + if (csActionClient in Control.ControlStyle) and Control.Visible then + Control.InitiateAction; + + if Control is TWinControl then + TraverseClients(TWinControl(Control)); + end; + end; + +begin + if (csDesigning in ComponentState) or not Showing then Exit; + { Update form } + InitiateAction; + { Update main menu's top-most items } + if Menu <> nil then + for I := 0 to Menu.Items.Count - 1 do + with Menu.Items[I] do + if Visible then InitiateAction; + { Update any controls } + TraverseClients(Self); +end; + +end. diff --git a/Source/uCustomView.dfm b/Source/uCustomView.dfm new file mode 100644 index 0000000..98f9074 --- /dev/null +++ b/Source/uCustomView.dfm @@ -0,0 +1,7 @@ +object CustomView: TCustomView + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 +end diff --git a/Source/uCustomView.pas b/Source/uCustomView.pas new file mode 100644 index 0000000..5db151e --- /dev/null +++ b/Source/uCustomView.pas @@ -0,0 +1,244 @@ +unit uCustomView; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, uGUIBase, DesignEditors; + +type + TCustomView = class(TFrame, ICustomView) + private + FOnGetModified: TOnGetModifiedEvent; + FOnViewModified: TOnViewModifiedEvent; + FReadOnly: Boolean; + FOnCreate: TNotifyEvent; + FOnDestroy: TNotifyEvent; + FOnHide: TNotifyEvent; + FOnShow: TNotifyEvent; + procedure ShowEmbedded; overload; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + protected + FObserver: IObserver; + function GetOnGetModified: TOnGetModifiedEvent; + procedure SetOnGetModified(const Value : TOnGetModifiedEvent); + function GetOnViewModified: TOnViewModifiedEvent; + procedure SetOnViewModified(const Value : TOnViewModifiedEvent); + procedure SetModified(const Value : Boolean); virtual; + function GetModified: Boolean; virtual; + function GetReadOnly: Boolean; virtual; + function GetValid: Boolean; virtual; + procedure Release; + procedure SetReadOnly(Value: Boolean); virtual; + procedure DoCreate; virtual; + procedure DoDestroy; virtual; + procedure DoHide; dynamic; + procedure DoShow; dynamic; + public + constructor Create(AOwner: TComponent); override; + constructor CreateEmbedded(AOwner: TComponent; AParent: TWinControl); + destructor Destroy; override; + procedure ShowEmbedded(const AParent : TWinControl); overload; virtual; + property Modified: Boolean read GetModified write SetModified; + published + property OnGetModified: TOnGetModifiedEvent read GetOnGetModified write + SetOnGetModified; + property OnViewModified: TOnViewModifiedEvent read GetOnViewModified write + SetOnViewModified; + property ReadOnly: Boolean read GetReadOnly write SetReadOnly; + property Valid: Boolean read GetValid; + property OnCreate: TNotifyEvent read FOnCreate write FOnCreate; + property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy; + property OnHide: TNotifyEvent read FOnHide write FOnHide; + property OnShow: TNotifyEvent read FOnShow write FOnShow; + end; + + TCustomViewClass = class of TCustomView; + + TCustomViewModule = class(TCustomModule) + public + function Nestable: Boolean; override; + end; + +procedure Register; + +implementation + +{$R *.dfm} + +{ TCustomView } + +uses + DesignIntf, uGUIUtils, RTLConsts; + +procedure Register; +begin + RegisterCustomModule(TCustomView, TCustomViewModule); +end; + +{ +********************************* TCustomView ********************************** +} +procedure TCustomView.CMShowingChanged(var Message: TMessage); +begin + inherited; + + if Showing then + begin + // Put your OnShow logic here. + // When this is called, the frame's window handle has already + // been created, as have the handles for the controls on the + // frame - so you can do most anything you need to do. + if Assigned(FOnShow) then + FOnShow(Self); + end + else + begin + // Put your OnHide logic here, but see the caveats below. + if Assigned(FOnHide) then + FOnHide(Self); + end; +end; + +constructor TCustomView.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FObserver := NIL; + DoCreate; +end; + +constructor TCustomView.CreateEmbedded(AOwner: TComponent; AParent: + TWinControl); +begin + Create(AOwner); + Parent := AParent; + Align := alClient; +end; + +destructor TCustomView.Destroy; +begin + DoDestroy; + inherited Destroy; +end; + +procedure TCustomView.DoCreate; +begin + if Assigned(FOnCreate) then + begin + try + FOnCreate(Self); + except + Application.HandleException(Self); + end; + end; +end; + +procedure TCustomView.DoDestroy; +begin + if Assigned(FOnDestroy) then + begin + try + FOnDestroy(Self); + except + Application.HandleException(Self); + end; + end; +end; + +procedure TCustomView.DoHide; +begin + if Assigned(FOnHide) then + begin + try + FOnHide(Self); + except + Application.HandleException(Self); + end; + end; +end; + +procedure TCustomView.DoShow; +begin + if Assigned(FOnShow) then + begin + try + FOnShow(Self); + except + Application.HandleException(Self); + end; + end; +end; + +function TCustomView.GetModified: Boolean; +begin + Result := ControlIsModified(Self); + if Assigned(FOnGetModified) then + FOnGetModified(Self, Result); +end; + +function TCustomView.GetOnGetModified: TOnGetModifiedEvent; +begin + Result := FOnGetModified; +end; + +function TCustomView.GetOnViewModified: TOnViewModifiedEvent; +begin + Result := FOnViewModified; +end; + +function TCustomView.GetReadOnly: Boolean; +begin + Result := FReadOnly; +end; + +function TCustomView.GetValid: Boolean; +begin + Result := True; +end; + +procedure TCustomView.Release; +begin + Free; +end; + +procedure TCustomView.SetModified(const Value: Boolean); +begin + if Assigned(FOnViewModified) then + FOnViewModified(Self); +end; + +procedure TCustomView.SetOnGetModified(const Value: TOnGetModifiedEvent); +begin + FOnGetModified := Value; +end; + +procedure TCustomView.SetOnViewModified(const Value: TOnViewModifiedEvent); +begin + FOnViewModified := Value; +end; + +procedure TCustomView.SetReadOnly(Value: Boolean); +begin + FReadOnly := Value; +end; + +procedure TCustomView.ShowEmbedded; +begin + Align := alClient; + Show; +end; + +procedure TCustomView.ShowEmbedded(const AParent : TWinControl); +begin + Parent := AParent; + ShowEmbedded; +end; + +{ TCustomViewModule } + +function TCustomViewModule.Nestable: Boolean; +begin + Result := True; +end; + +end. diff --git a/Source/uGUIBase.pas b/Source/uGUIBase.pas new file mode 100644 index 0000000..eb742d9 --- /dev/null +++ b/Source/uGUIBase.pas @@ -0,0 +1,128 @@ +unit uGUIBase; + +interface + +uses + Forms, Controls, Contnrs, Classes; + +type + TOnGetModifiedEvent = procedure (Sender: TObject; var Modified: Boolean) of object; + TOnViewModifiedEvent = procedure (Sender: TObject) of object; + + IEmbeddedable = interface(IInterface) + ['{A1668B17-B355-4688-A78A-B30AE3C8C81E}'] + procedure Release; + procedure ShowEmbedded; overload; + procedure ShowEmbedded(const AParent : TWinControl); overload; + end; + + IModificable = interface(IEmbeddedable) + ['{7F75A327-4ACC-4E4A-8B3D-21C1241DAFBF}'] + function GetModified: Boolean; + procedure SetModified(const Value : Boolean); + property Modified: Boolean read GetModified write SetModified; + + function GetOnGetModified: TOnGetModifiedEvent; + procedure SetOnGetModified(const Value : TOnGetModifiedEvent); + property OnGetModified: TOnGetModifiedEvent read GetOnGetModified write + SetOnGetModified; + + function GetOnViewModified: TOnViewModifiedEvent; + procedure SetOnViewModified(const Value : TOnViewModifiedEvent); + property OnViewModified: TOnViewModifiedEvent read GetOnViewModified write + SetOnViewModified; + end; + + IReadOnly = interface(IModificable) + ['{2549ECF9-270F-4F3C-9852-E488C518F590}'] + function GetReadOnly: Boolean; + procedure SetReadOnly(Value: Boolean); + property ReadOnly: Boolean read GetReadOnly write SetReadOnly; + end; + + IValidable = interface(IReadOnly) + ['{A2562A5E-E3B2-4C1B-B8FE-13A410D8B3DB}'] + function GetValid: Boolean; + property Valid: Boolean read GetValid; + end; + + IInstanceAware = interface(IValidable) + ['{B6B2676A-1D8E-4597-ADDB-43734508E6F5}'] + function GetInstance: TObject; + function GetInstanceID: Integer; + procedure SetInstanceID(Value: Integer); + property InstanceID: Integer read GetInstanceID write SetInstanceID; + end; + + ICustomEditor = interface(IInstanceAware) + ['{07A3AB52-B2B0-4DE3-B470-379834BBE7DB}'] + end; + + ICustomView = interface(IValidable) + ['{98192DE2-19C5-4DA5-B4F4-F2B3782DB6E2}'] + function CanFocus: Boolean; + function Focused: Boolean; + procedure SetFocus; + procedure Update; + end; + + + IHostForm = interface(IInterface) + ['{2091401E-1F9C-4F05-8574-E9E0532780D1}'] + function GetWorkPanel: TWinControl; + property WorkPanel: TWinControl read GetWorkPanel; + procedure OnWorkPanelChanged(AEditor : ICustomEditor); + procedure ShowEmbedded(AEditor : ICustomEditor); + end; + + + IGUIManager = interface(IInterface) + ['{D0A5D2CC-36E1-4C61-8D3B-B6D00EBA3278}'] + function FindInstance(const IID: TGUID): ICustomEditor; + function GetActiveInstance: ICustomEditor; + function GetActiveInstanceIndex: Integer; + function GetInstance(Index : Integer): ICustomEditor; + function GetWorkPanel: TWinControl; + function RegisterInstance(AInstance : ICustomEditor): Boolean; + procedure ReleaseInstance(AnInstance : ICustomEditor); + procedure SetActiveInstance(Value: ICustomEditor); + procedure SetActiveInstanceIndex(Value: Integer); + procedure SetWorkPanel(const Value: TWinControl); + property ActiveInstance: ICustomEditor read GetActiveInstance write + SetActiveInstance; + property ActiveInstanceIndex: Integer read GetActiveInstanceIndex write + SetActiveInstanceIndex; + property Instances[Index : Integer]: ICustomEditor read GetInstance; + property WorkPanel: TWinControl read GetWorkPanel write SetWorkPanel; + end; + + IObservable = interface; + TObserverEvent = procedure (AObject : IObservable) of object; + IObserver = interface(IInterface) + ['{79175C66-8435-4F2F-A3E0-A53A24554A0E}'] + function GetOnNotifyObserver: TObserverEvent; + function GetOnObserverAttached: TObserverEvent; + function GetOnObserverDettached: TObserverEvent; + procedure NotifyObserver(const AObject: IObservable); + procedure ObserverAttached(AObject : IObservable); + procedure ObserverDettached(AObject : IObservable); + procedure SetOnNotifyObserver(AValue: TObserverEvent); + procedure SetOnObserverAttached(AValue: TObserverEvent); + procedure SetOnObserverDettached(AValue: TObserverEvent); + property OnNotifyObserver: TObserverEvent read GetOnNotifyObserver write + SetOnNotifyObserver; + property OnObserverAttached: TObserverEvent read GetOnObserverAttached + write SetOnObserverAttached; + property OnObserverDettached: TObserverEvent read GetOnObserverDettached + write SetOnObserverDettached; + end; + + IObservable = interface(IInterface) + ['{1FF0F081-CBBA-4728-8689-D6F506652E80}'] + procedure AddObserver(const AObserver: IObserver); + procedure RemoveObserver(const AObserver: IObserver); + end; + +implementation + +end. diff --git a/Source/uGUIUtils.pas b/Source/uGUIUtils.pas new file mode 100644 index 0000000..c952c9b --- /dev/null +++ b/Source/uGUIUtils.pas @@ -0,0 +1,51 @@ +unit uGUIUtils; + +interface + +uses + Controls; + +function ControlIsModified(AControl : TWinControl) : Boolean; +procedure ResetModifiedControl(AControl : TWinControl); + +implementation + +uses + StdCtrls, uGUIBase, uCustomView; + +function ControlIsModified(AControl : TWinControl) : Boolean; +var + i : integer; +begin + Result := False; + + if AControl is TCustomEdit then + Result := Result OR (AControl as TCustomEdit).Modified + else + if not Result then + for i := 0 to AControl.ControlCount - 1 do + begin + if AControl.Controls[i] is TWinControl then + Result := ControlIsModified((AControl.Controls[i] as TWinControl)); + + if Result then + Exit; + end; +end; + + +procedure ResetModifiedControl(AControl : TWinControl); +var + i : integer; +begin + if AControl is TCustomEdit then + (AControl as TCustomEdit).Modified := False + else + for i := 0 to AControl.ControlCount - 1 do + begin + if AControl.Controls[i] is TWinControl then + ResetModifiedControl((AControl.Controls[i] as TWinControl)); + end; +end; + +end.