mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-17 22:49:31 +02:00
IDE, fix Fields Editor not showing or cause AV, issue #17572
git-svn-id: trunk@27610 -
This commit is contained in:
parent
a156e24276
commit
b1de430498
@ -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 }
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user