diff --git a/ideintf/componenteditors.pas b/ideintf/componenteditors.pas index 8ee45b3778..6587aa9733 100644 --- a/ideintf/componenteditors.pas +++ b/ideintf/componenteditors.pas @@ -25,7 +25,7 @@ unit ComponentEditors; interface uses - Classes, SysUtils, LResources, TypInfo, LCLProc, Forms, Controls, Menus, + Classes, SysUtils, LResources, TypInfo, Maps, LCLProc, Forms, Controls, Menus, ExtCtrls, CustomTimer, StdCtrls, Graphics, Grids, CheckLst, Buttons, ComCtrls, Dialogs, LazStringGridEdit, CheckListboxEditorDlg, CheckGroupEditorDlg, GraphType, PropEdits, PropEditUtils, @@ -386,7 +386,6 @@ type constructor Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner); override; end; - { Register a component editor } type @@ -408,8 +407,51 @@ type function(const ATestEditor: TPropertyEditor): Boolean of object; +procedure RegisterEditorForm(const AEditorForm: TObject; const AComponent: TComponent); +procedure UnregisterEditorForm(const AEditorForm: TObject); +function FindEditorForm(const AComponent: TComponent): TObject; + implementation +var + EditorForms: TMap = nil; + +procedure RegisterEditorForm(const AEditorForm: TObject; const AComponent: TComponent); +begin + if (AComponent<>nil) then begin + if EditorForms=nil then + EditorForms := TMap.Create(itsPtrSize, SizeOf(Pointer)); + if not EditorForms.HasId(AEditorForm) then + EditorForms.Add(AEditorForm, AComponent); + end; +end; + +procedure UnregisterEditorForm(const AEditorForm: TObject); +begin + if EditorForms<>nil then + EditorForms.Delete(AEditorForm); +end; + +function FindEditorForm(const AComponent: TComponent): TObject; +var + Iterator: TMapIterator; + Comp: TComponent; +begin + result := nil; + if EditorForms<>nil then begin + Iterator := TMapIterator.Create(EditorForms); + while not Iterator.EOM do begin + Iterator.GetData(Comp); + if Comp=AComponent then begin + Iterator.GetID(Result); + break; + end; + Iterator.Next; + end; + Iterator.Free; + end; +end; + { RegisterComponentEditor } type PComponentClassRec = ^TComponentClassRec; @@ -1227,6 +1269,8 @@ begin end; ComponentClassList.Free; end; + + EditorForms.Free; end; { TTabControlComponentEditor } diff --git a/ideintf/fieldseditor.pas b/ideintf/fieldseditor.pas index c1c7a99abf..3e70ebd708 100644 --- a/ideintf/fieldseditor.pas +++ b/ideintf/fieldseditor.pas @@ -82,6 +82,7 @@ type { public declarations } constructor Create(AOwner: TComponent; ADataset: TDataset; ADesigner: TComponentEditorDesigner); reintroduce; + destructor Destroy; override; property Designer: TComponentEditorDesigner read FDesigner write FDesigner; property ComponentEditor: TFieldsComponentEditor write FComponentEditor; end; @@ -89,20 +90,10 @@ type { TActionListComponentEditor } TFieldsComponentEditor = class(TComponentEditor) - private - FDataSet: TDataset; - FFieldsEditorForm: TDSFieldsEditorFrm; - fWindowClosed: Boolean; - protected public - constructor Create(AComponent: TComponent; - ADesigner: TComponentEditorDesigner); override; - destructor Destroy; override; function GetVerbCount: Integer; override; function GetVerb(Index: Integer): string; override; procedure ExecuteVerb(Index: Integer); override; - procedure EditorWindowClose; - property LinkDataset: TDataset read FDataSet write FDataSet; end; implementation @@ -161,6 +152,12 @@ begin SelectionChanged; end; +destructor TDSFieldsEditorFrm.Destroy; +begin + UnregisterEditorForm(Self); + inherited Destroy; +end; + procedure TDSFieldsEditorFrm.DeleteFieldsActnExecute(Sender: TObject); var i: integer; PreActive: boolean; @@ -196,7 +193,6 @@ begin if Assigned(FComponentEditor) then begin if Assigned(LinkDataset) And (Not (csDestroying in LinkDataset.ComponentState)) And (FieldsListBox.SelCount > 0) then GlobalDesignHook.SelectOnlyThis(LinkDataset); - FComponentEditor.EditorWindowClose; end; if Assigned(GlobalDesignHook) then GlobalDesignHook.RemoveAllHandlersForObject(Self); @@ -433,20 +429,6 @@ end; { TFieldsComponentEditor } -constructor TFieldsComponentEditor.Create(AComponent: TComponent; - ADesigner: TComponentEditorDesigner); -begin - inherited Create(AComponent, ADesigner); - fWindowClosed := True; -end; - -destructor TFieldsComponentEditor.Destroy; -begin - if not fWindowClosed - then FreeThenNil(FFieldsEditorForm); - inherited Destroy; -end; - function TFieldsComponentEditor.GetVerbCount: Integer; begin Result := 1; @@ -460,32 +442,32 @@ begin end; procedure TFieldsComponentEditor.ExecuteVerb(Index: Integer); -var ADataset: TDataset; +var + ADataset: TDataset; + AEditor: TObject; begin case index of - 0: begin - ADataset := GetComponent as TDataset; - if ADataset = nil - then raise Exception.Create('TFieldsComponentEditor.Edit LinkDataset=nil'); - if fWindowClosed then begin - FFieldsEditorForm := TDSFieldsEditorFrm.Create(Application, ADataset, Designer); - fWindowClosed := False; + 0: + begin + ADataset := GetComponent as TDataset; + if ADataset=nil then + raise Exception.Create('TFieldsComponentEditor.Edit LinkDataset=nil'); + + AEditor := FindEditorForm(ADataset); + if AEditor=nil then begin + AEditor := TDSFieldsEditorFrm.Create(Application, ADataset, Designer); + RegisterEditorForm(AEditor, ADataset); + end; + + if AEditor<>nil then + with TDsFieldsEditorFrm(AEditor) do begin + ComponentEditor := Self; + ShowOnTop; + end; end; - with FFieldsEditorForm do begin - ComponentEditor := Self; - ShowOnTop; - end; - end; end; end; -procedure TFieldsComponentEditor.EditorWindowClose; -begin - fWindowClosed := True; - FFieldsEditorForm:=nil; -end; - - initialization RegisterComponentEditor(TDataset, TFieldsComponentEditor); end.