diff --git a/lcl/forms.pp b/lcl/forms.pp index 1f769a77cc..048ec7399c 100644 --- a/lcl/forms.pp +++ b/lcl/forms.pp @@ -536,6 +536,7 @@ type procedure DoFirstShow; virtual; procedure UpdateWindowState; procedure VisibleChanging; override; + procedure VisibleChanged; override; procedure WndProc(var TheMessage : TLMessage); override; function VisibleIsStored: boolean; procedure DoSendBoundsToInterface; override; @@ -878,8 +879,6 @@ type end; TScreenFormEvent = procedure(Sender: TObject; Form: TCustomForm) of object; - TScreenActiveFormChangedEvent = procedure(Sender: TObject; - LastForm: TCustomForm) of object; TScreenControlEvent = procedure(Sender: TObject; LastControl: TControl) of object; @@ -887,7 +886,8 @@ type snFormAdded, snRemoveForm, snActiveControlChanged, - snActiveFormChanged + snActiveFormChanged, + snFormVisibleChanged ); TMonitorDefaultTo = (mdNearest, mdNull, mdPrimary); @@ -957,6 +957,8 @@ type const Handler: TMethod); procedure DoAddDataModule(DataModule: TDataModule); procedure DoRemoveDataModule(DataModule: TDataModule); + procedure NotifyScreenFormHandler(HandlerType: TScreenNotification; + Form: TCustomForm); protected function GetHintFont: TFont; virtual; function GetIconFont: TFont; virtual; @@ -977,6 +979,7 @@ type function FindDataModule(const DataModuleName: string): TDataModule; procedure UpdateScreen; // handler + procedure RemoveAllHandlersOfObject(AnObject: TObject); override; procedure AddHandlerFormAdded(OnFormAdded: TScreenFormEvent; AsLast: Boolean=true); procedure RemoveHandlerFormAdded(OnFormAdded: TScreenFormEvent); @@ -988,12 +991,12 @@ type AsLast: Boolean=true); procedure RemoveHandlerActiveControlChanged( OnActiveControlChanged: TScreenControlEvent); - procedure AddHandlerActiveFormChanged( - OnActiveFormChanged: TScreenActiveFormChangedEvent; - AsLast: Boolean=true); - procedure RemoveHandlerActiveFormChanged( - OnActiveFormChanged: TScreenActiveFormChangedEvent); - procedure RemoveAllHandlersOfObject(AnObject: TObject); override; + procedure AddHandlerActiveFormChanged(OnActiveFormChanged: TScreenFormEvent; + AsLast: Boolean=true); + procedure RemoveHandlerActiveFormChanged(OnActiveFormChanged: TScreenFormEvent); + procedure AddHandlerFormVisibleChanged(OnFormVisibleChanged: TScreenFormEvent; + AsLast: Boolean=true); + procedure RemoveHandlerFormVisibleChanged(OnFormVisibleChanged: TScreenFormEvent); function DisableForms(SkipForm: TCustomForm; DisabledList: TList = nil): TList; procedure EnableForms(var AFormList: TList); diff --git a/lcl/include/customform.inc b/lcl/include/customform.inc index 424ef8bb3b..1249ae076f 100644 --- a/lcl/include/customform.inc +++ b/lcl/include/customform.inc @@ -1212,6 +1212,13 @@ begin inherited VisibleChanging; end; +procedure TCustomForm.VisibleChanged; +begin + inherited VisibleChanged; + if (Screen<>nil) then + Screen.NotifyScreenFormHandler(snFormVisibleChanged,Self); +end; + {------------------------------------------------------------------------------ TCustomForm WndProc ------------------------------------------------------------------------------} diff --git a/lcl/include/screen.inc b/lcl/include/screen.inc index 5761a64aae..dc4f56b1c6 100644 --- a/lcl/include/screen.inc +++ b/lcl/include/screen.inc @@ -250,6 +250,15 @@ begin ReleaseDC(0, DC); end; +procedure TScreen.RemoveAllHandlersOfObject(AnObject: TObject); +var + HandlerType: TScreenNotification; +begin + for HandlerType:=Low(TScreenNotification) to High(TScreenNotification) do + FScreenHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject); + inherited RemoveAllHandlersOfObject(AnObject); +end; + procedure TScreen.AddHandlerFormAdded(OnFormAdded: TScreenFormEvent; AsLast: Boolean); begin @@ -285,24 +294,27 @@ begin end; procedure TScreen.AddHandlerActiveFormChanged( - OnActiveFormChanged: TScreenActiveFormChangedEvent; AsLast: Boolean); + OnActiveFormChanged: TScreenFormEvent; AsLast: Boolean); begin AddHandler(snActiveFormChanged,TMethod(OnActiveFormChanged),AsLast); end; procedure TScreen.RemoveHandlerActiveFormChanged( - OnActiveFormChanged: TScreenActiveFormChangedEvent); + OnActiveFormChanged: TScreenFormEvent); begin RemoveHandler(snActiveFormChanged,TMethod(OnActiveFormChanged)); end; -procedure TScreen.RemoveAllHandlersOfObject(AnObject: TObject); -var - HandlerType: TScreenNotification; +procedure TScreen.AddHandlerFormVisibleChanged( + OnFormVisibleChanged: TScreenFormEvent; AsLast: Boolean); begin - for HandlerType:=Low(TScreenNotification) to High(TScreenNotification) do - FScreenHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject); - inherited RemoveAllHandlersOfObject(AnObject); + AddHandler(snFormVisibleChanged,TMethod(OnFormVisibleChanged),AsLast); +end; + +procedure TScreen.RemoveHandlerFormVisibleChanged( + OnFormVisibleChanged: TScreenFormEvent); +begin + RemoveHandler(snFormVisibleChanged,TMethod(OnFormVisibleChanged)); end; { @@ -598,8 +610,6 @@ end; Do not use this procedure. This procedure is used by TScreen internally. ------------------------------------------------------------------------------} procedure TScreen.AddForm(AForm: TCustomForm); -var - i: Integer; begin FCustomForms.Add(AForm); FCustomFormsZOrdered.Add(AForm); @@ -608,9 +618,7 @@ begin FFormList.Add(AForm); Application.UpdateVisible; end; - i := FScreenHandlers[snFormAdded].Count; - while FScreenHandlers[snFormAdded].NextDownIndex(i) do - TScreenFormEvent(FScreenHandlers[snFormAdded][i])(Self, AForm); + NotifyScreenFormHandler(snFormAdded,AForm); end; {------------------------------------------------------------------------------ @@ -739,12 +747,8 @@ end; ------------------------------------------------------------------------------} procedure TScreen.RemoveForm(AForm: TCustomForm); -var - i: Integer; begin - i := FScreenHandlers[snRemoveForm].Count; - while FScreenHandlers[snRemoveForm].NextDownIndex(i) do - TScreenFormEvent(FScreenHandlers[snRemoveForm][i])(Self, AForm); + NotifyScreenFormHandler(snRemoveForm,AForm); FCustomForms.Remove(AForm); FCustomFormsZOrdered.Remove(AForm); FFormList.Remove(AForm); @@ -822,17 +826,9 @@ end; procedure TScreen.UpdateLastActive; procedure NotifyOnActiveFormChanged; - var - i: Integer; - Handler: TScreenFormEvent; begin if Assigned(FOnActiveFormChange) then FOnActiveFormChange(Self); - i := FScreenHandlers[snActiveFormChanged].Count; - while FScreenHandlers[snActiveFormChanged].NextDownIndex(i) do - begin - Handler := TScreenFormEvent(FScreenHandlers[snActiveFormChanged][i]); - Handler(Self, FLastActiveCustomForm); - end; + NotifyScreenFormHandler(snActiveFormChanged,FLastActiveCustomForm); end; procedure NotifyOnActiveControlChanged; @@ -915,4 +911,18 @@ begin FDataModuleList.Remove(DataModule); end; +procedure TScreen.NotifyScreenFormHandler(HandlerType: TScreenNotification; + Form: TCustomForm); +var + i: integer; + Handler: TScreenFormEvent; +begin + i := FScreenHandlers[HandlerType].Count; + while FScreenHandlers[HandlerType].NextDownIndex(i) do + begin + Handler := TScreenFormEvent(FScreenHandlers[HandlerType][i]); + Handler(Self, Form); + end; +end; + // included by forms.pp