IDE, fix Fields Editor not showing or cause AV, issue

git-svn-id: trunk@27610 -
This commit is contained in:
jesus 2010-10-07 20:38:03 +00:00
parent a156e24276
commit b1de430498
2 changed files with 73 additions and 47 deletions

View File

@ -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 }

View File

@ -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.