mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-17 22:09:28 +02:00
DockedFormEditor: Solve the unrecoverable loop differently. Add a new handler for it. Issue #39288.
This commit is contained in:
parent
ae1c9e4710
commit
5a647cd4e1
@ -22,8 +22,10 @@ uses
|
|||||||
Classes, SysUtils, fgl,
|
Classes, SysUtils, fgl,
|
||||||
// LCL
|
// LCL
|
||||||
LMessages, Forms, LCLType, LCLIntf, Controls,
|
LMessages, Forms, LCLType, LCLIntf, Controls,
|
||||||
|
// LazUtils
|
||||||
|
LazLoggerBase,
|
||||||
// IDEIntf
|
// IDEIntf
|
||||||
SrcEditorIntf, LazIDEIntf, ProjectIntf,
|
SrcEditorIntf,
|
||||||
// DockedFormEditor
|
// DockedFormEditor
|
||||||
DockedFormAccesses, DockedBasicAnchorDesigner;
|
DockedFormAccesses, DockedBasicAnchorDesigner;
|
||||||
|
|
||||||
@ -42,12 +44,14 @@ type
|
|||||||
FHiding: Boolean;
|
FHiding: Boolean;
|
||||||
FOnAdjustPageNeeded: TNotifyEvent;
|
FOnAdjustPageNeeded: TNotifyEvent;
|
||||||
FWndMethod: TWndMethod;
|
FWndMethod: TWndMethod;
|
||||||
|
class var FNewForm: TCustomForm;
|
||||||
procedure FixF12_ActiveEditor;
|
procedure FixF12_ActiveEditor;
|
||||||
procedure FormChangeBounds(Sender: TObject);
|
procedure FormChangeBounds(Sender: TObject);
|
||||||
procedure WndMethod(var Msg: TLMessage);
|
procedure WndMethod(var Msg: TLMessage);
|
||||||
public
|
public
|
||||||
constructor Create(AForm: TCustomForm); override;
|
constructor Create(AForm: TCustomForm); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
class procedure Screen_NewFormCreated(Sender: TObject; AForm: TCustomForm);
|
||||||
public
|
public
|
||||||
property Hiding: Boolean read FHiding write FHiding;
|
property Hiding: Boolean read FHiding write FHiding;
|
||||||
property OnAdjustPageNeeded: TNotifyEvent read FOnAdjustPageNeeded write FOnAdjustPageNeeded;
|
property OnAdjustPageNeeded: TNotifyEvent read FOnAdjustPageNeeded write FOnAdjustPageNeeded;
|
||||||
@ -56,10 +60,7 @@ type
|
|||||||
{ TDesignForms }
|
{ TDesignForms }
|
||||||
|
|
||||||
TDesignForms = class(specialize TFPGList<TDesignForm>)
|
TDesignForms = class(specialize TFPGList<TDesignForm>)
|
||||||
private
|
|
||||||
FProjectOpening: Boolean;
|
|
||||||
public
|
public
|
||||||
constructor Create;
|
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function Add(const Item: TDesignForm): Integer;
|
function Add(const Item: TDesignForm): Integer;
|
||||||
procedure DeleteDesignForm(AIndex: Integer);
|
procedure DeleteDesignForm(AIndex: Integer);
|
||||||
@ -68,9 +69,6 @@ type
|
|||||||
function IndexOf(AForm: TCustomForm): Integer; overload;
|
function IndexOf(AForm: TCustomForm): Integer; overload;
|
||||||
procedure Remove(AForm: TCustomForm); overload;
|
procedure Remove(AForm: TCustomForm); overload;
|
||||||
procedure RemoveAllAnchorDesigner;
|
procedure RemoveAllAnchorDesigner;
|
||||||
// Project state change event handlers.
|
|
||||||
function ProjOpening(Sender: TObject; AProject: TLazProject): TModalResult;
|
|
||||||
function ProjOpened(Sender: TObject; AProject: TLazProject): TModalResult;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -80,20 +78,24 @@ implementation
|
|||||||
|
|
||||||
{ TDesignForm }
|
{ TDesignForm }
|
||||||
|
|
||||||
|
class procedure TDesignForm.Screen_NewFormCreated(Sender: TObject; AForm: TCustomForm);
|
||||||
|
begin
|
||||||
|
FNewForm := AForm;
|
||||||
|
//DebugLn(['TDesignForm.Screen_NewFormCreated! Self=', Self,
|
||||||
|
// ', FNewForm=', FNewForm.Name,':',FNewForm.ClassName]);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TDesignForm.FixF12_ActiveEditor;
|
procedure TDesignForm.FixF12_ActiveEditor;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
// Don't get a form's designer while project opens.
|
//DebugLn(['TDesignForm.FixF12_ActiveEditor: Self=', Self, ', FNewForm=', FNewForm, ', Form=', Form]);
|
||||||
// A read error would lead to an eternal loop.
|
if FNewForm = Nil then exit;
|
||||||
Assert(Assigned(FContainer), 'TDesignForm.FixF12_ActiveEditor: FContainer=Nil');
|
FNewForm := Nil;
|
||||||
if FContainer.FProjectOpening then Exit;
|
//DebugLn([' TDesignForm.FixF12_ActiveEditor: Passed']);
|
||||||
|
|
||||||
// Without this, button F12 don't work. (after creating new for editor is inactive)
|
// Without this, button F12 don't work after creating a new form.
|
||||||
// Just do it for new created forms or the last loaded form becomes the active
|
|
||||||
// source editor after reopening a project.
|
|
||||||
if Designer <> SourceEditorManagerIntf.ActiveEditor.GetDesigner(True) then Exit;
|
if Designer <> SourceEditorManagerIntf.ActiveEditor.GetDesigner(True) then Exit;
|
||||||
|
|
||||||
SourceEditorManagerIntf.ActiveEditor := nil;
|
SourceEditorManagerIntf.ActiveEditor := nil;
|
||||||
for i := 0 to SourceEditorManagerIntf.UniqueSourceEditorCount - 1 do
|
for i := 0 to SourceEditorManagerIntf.UniqueSourceEditorCount - 1 do
|
||||||
if Designer = SourceEditorManagerIntf.UniqueSourceEditors[i].GetDesigner(True) then
|
if Designer = SourceEditorManagerIntf.UniqueSourceEditors[i].GetDesigner(True) then
|
||||||
@ -175,17 +177,8 @@ end;
|
|||||||
|
|
||||||
{ TDesignForms }
|
{ TDesignForms }
|
||||||
|
|
||||||
constructor TDesignForms.Create;
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
LazarusIDE.AddHandlerOnProjectOpening(@ProjOpening);
|
|
||||||
LazarusIDE.AddHandlerOnProjectOpened(@ProjOpened);
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TDesignForms.Destroy;
|
destructor TDesignForms.Destroy;
|
||||||
begin
|
begin
|
||||||
//LazarusIDE.RemoveHandlerOnProjectOpened(@ProjOpened); // Causes a crash.
|
|
||||||
//LazarusIDE.RemoveHandlerOnProjectOpening(@ProjOpening);
|
|
||||||
while Count > 0 do
|
while Count > 0 do
|
||||||
DeleteDesignForm(0);
|
DeleteDesignForm(0);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
@ -264,17 +257,5 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDesignForms.ProjOpening(Sender: TObject; AProject: TLazProject): TModalResult;
|
|
||||||
begin
|
|
||||||
FProjectOpening := True;
|
|
||||||
Result := mrOK;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TDesignForms.ProjOpened(Sender: TObject; AProject: TLazProject): TModalResult;
|
|
||||||
begin
|
|
||||||
FProjectOpening := False;
|
|
||||||
Result := mrOK;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ procedure Register;
|
|||||||
begin
|
begin
|
||||||
Screen.AddHandlerFormAdded(TDockedMainIDE.Screen_FormAdded);
|
Screen.AddHandlerFormAdded(TDockedMainIDE.Screen_FormAdded);
|
||||||
Screen.AddHandlerRemoveForm(TDockedMainIDE.Screen_FormDel);
|
Screen.AddHandlerRemoveForm(TDockedMainIDE.Screen_FormDel);
|
||||||
|
Screen.AddHandlerNewFormCreated(TDesignForm.Screen_NewFormCreated);
|
||||||
SourceEditorManagerIntf.RegisterChangeEvent(semWindowCreate, TDockedMainIDE.WindowCreate);
|
SourceEditorManagerIntf.RegisterChangeEvent(semWindowCreate, TDockedMainIDE.WindowCreate);
|
||||||
SourceEditorManagerIntf.RegisterChangeEvent(semWindowDestroy, TDockedMainIDE.WindowDestroy);
|
SourceEditorManagerIntf.RegisterChangeEvent(semWindowDestroy, TDockedMainIDE.WindowDestroy);
|
||||||
SourceEditorManagerIntf.RegisterChangeEvent(semWindowShow, TDockedMainIDE.WindowShow);
|
SourceEditorManagerIntf.RegisterChangeEvent(semWindowShow, TDockedMainIDE.WindowShow);
|
||||||
@ -65,6 +66,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
finalization
|
finalization
|
||||||
|
Screen.RemoveHandlerNewFormCreated(TDesignForm.Screen_NewFormCreated);
|
||||||
Screen.RemoveHandlerFormAdded(TDockedMainIDE.Screen_FormAdded);
|
Screen.RemoveHandlerFormAdded(TDockedMainIDE.Screen_FormAdded);
|
||||||
Screen.RemoveHandlerRemoveForm(TDockedMainIDE.Screen_FormDel);
|
Screen.RemoveHandlerRemoveForm(TDockedMainIDE.Screen_FormDel);
|
||||||
FreeAndNil(DesignForms);
|
FreeAndNil(DesignForms);
|
||||||
|
@ -4606,6 +4606,7 @@ begin
|
|||||||
Project1.AddCreateFormToProjectFile(NewComponent.ClassName,
|
Project1.AddCreateFormToProjectFile(NewComponent.ClassName,
|
||||||
NewComponent.Name);
|
NewComponent.Name);
|
||||||
end;
|
end;
|
||||||
|
Screen.NewFormWasCreated(TCustomForm(NewComponent));
|
||||||
Result:=mrOk;
|
Result:=mrOk;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -1103,6 +1103,7 @@ type
|
|||||||
LastControl: TControl) of object;
|
LastControl: TControl) of object;
|
||||||
|
|
||||||
TScreenNotification = (
|
TScreenNotification = (
|
||||||
|
snNewFormCreated,
|
||||||
snFormAdded,
|
snFormAdded,
|
||||||
snRemoveForm,
|
snRemoveForm,
|
||||||
snActiveControlChanged,
|
snActiveControlChanged,
|
||||||
@ -1210,6 +1211,7 @@ type
|
|||||||
function CustomFormZIndex(AForm: TCustomForm): Integer;
|
function CustomFormZIndex(AForm: TCustomForm): Integer;
|
||||||
procedure MoveFormToFocusFront(ACustomForm: TCustomForm);
|
procedure MoveFormToFocusFront(ACustomForm: TCustomForm);
|
||||||
procedure MoveFormToZFront(ACustomForm: TCustomForm);
|
procedure MoveFormToZFront(ACustomForm: TCustomForm);
|
||||||
|
procedure NewFormWasCreated(AForm: TCustomForm);
|
||||||
function GetCurrentModalForm: TCustomForm;
|
function GetCurrentModalForm: TCustomForm;
|
||||||
function GetCurrentModalFormZIndex: Integer;
|
function GetCurrentModalFormZIndex: Integer;
|
||||||
function CustomFormBelongsToActiveGroup(AForm: TCustomForm): Boolean;
|
function CustomFormBelongsToActiveGroup(AForm: TCustomForm): Boolean;
|
||||||
@ -1221,6 +1223,9 @@ type
|
|||||||
procedure UpdateScreen;
|
procedure UpdateScreen;
|
||||||
// handler
|
// handler
|
||||||
procedure RemoveAllHandlersOfObject(AnObject: TObject); override;
|
procedure RemoveAllHandlersOfObject(AnObject: TObject); override;
|
||||||
|
procedure AddHandlerNewFormCreated(OnNewFormCreated: TScreenFormEvent;
|
||||||
|
AsFirst: Boolean=false);
|
||||||
|
procedure RemoveHandlerNewFormCreated(OnNewFormCreated: TScreenFormEvent);
|
||||||
procedure AddHandlerFormAdded(OnFormAdded: TScreenFormEvent;
|
procedure AddHandlerFormAdded(OnFormAdded: TScreenFormEvent;
|
||||||
AsFirst: Boolean=false);
|
AsFirst: Boolean=false);
|
||||||
procedure RemoveHandlerFormAdded(OnFormAdded: TScreenFormEvent);
|
procedure RemoveHandlerFormAdded(OnFormAdded: TScreenFormEvent);
|
||||||
|
@ -178,6 +178,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TScreen.NewFormWasCreated(AForm: TCustomForm);
|
||||||
|
begin
|
||||||
|
NotifyScreenFormHandler(snNewFormCreated,AForm);
|
||||||
|
end;
|
||||||
|
|
||||||
function TScreen.GetCurrentModalForm: TCustomForm;
|
function TScreen.GetCurrentModalForm: TCustomForm;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -280,6 +285,17 @@ begin
|
|||||||
inherited RemoveAllHandlersOfObject(AnObject);
|
inherited RemoveAllHandlersOfObject(AnObject);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TScreen.AddHandlerNewFormCreated(OnNewFormCreated: TScreenFormEvent;
|
||||||
|
AsFirst: Boolean);
|
||||||
|
begin
|
||||||
|
AddHandler(snNewFormCreated,TMethod(OnNewFormCreated),AsFirst);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TScreen.RemoveHandlerNewFormCreated(OnNewFormCreated: TScreenFormEvent);
|
||||||
|
begin
|
||||||
|
RemoveHandler(snNewFormCreated,TMethod(OnNewFormCreated));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TScreen.AddHandlerFormAdded(OnFormAdded: TScreenFormEvent;
|
procedure TScreen.AddHandlerFormAdded(OnFormAdded: TScreenFormEvent;
|
||||||
AsFirst: Boolean);
|
AsFirst: Boolean);
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user