LCL: added TScreen handler for form Visible changed

git-svn-id: trunk@25097 -
This commit is contained in:
mattias 2010-05-01 13:48:24 +00:00
parent e307883ee0
commit 2abe1b3ff4
3 changed files with 56 additions and 36 deletions

View File

@ -536,6 +536,7 @@ type
procedure DoFirstShow; virtual; procedure DoFirstShow; virtual;
procedure UpdateWindowState; procedure UpdateWindowState;
procedure VisibleChanging; override; procedure VisibleChanging; override;
procedure VisibleChanged; override;
procedure WndProc(var TheMessage : TLMessage); override; procedure WndProc(var TheMessage : TLMessage); override;
function VisibleIsStored: boolean; function VisibleIsStored: boolean;
procedure DoSendBoundsToInterface; override; procedure DoSendBoundsToInterface; override;
@ -878,8 +879,6 @@ type
end; end;
TScreenFormEvent = procedure(Sender: TObject; Form: TCustomForm) of object; TScreenFormEvent = procedure(Sender: TObject; Form: TCustomForm) of object;
TScreenActiveFormChangedEvent = procedure(Sender: TObject;
LastForm: TCustomForm) of object;
TScreenControlEvent = procedure(Sender: TObject; TScreenControlEvent = procedure(Sender: TObject;
LastControl: TControl) of object; LastControl: TControl) of object;
@ -887,7 +886,8 @@ type
snFormAdded, snFormAdded,
snRemoveForm, snRemoveForm,
snActiveControlChanged, snActiveControlChanged,
snActiveFormChanged snActiveFormChanged,
snFormVisibleChanged
); );
TMonitorDefaultTo = (mdNearest, mdNull, mdPrimary); TMonitorDefaultTo = (mdNearest, mdNull, mdPrimary);
@ -957,6 +957,8 @@ type
const Handler: TMethod); const Handler: TMethod);
procedure DoAddDataModule(DataModule: TDataModule); procedure DoAddDataModule(DataModule: TDataModule);
procedure DoRemoveDataModule(DataModule: TDataModule); procedure DoRemoveDataModule(DataModule: TDataModule);
procedure NotifyScreenFormHandler(HandlerType: TScreenNotification;
Form: TCustomForm);
protected protected
function GetHintFont: TFont; virtual; function GetHintFont: TFont; virtual;
function GetIconFont: TFont; virtual; function GetIconFont: TFont; virtual;
@ -977,6 +979,7 @@ type
function FindDataModule(const DataModuleName: string): TDataModule; function FindDataModule(const DataModuleName: string): TDataModule;
procedure UpdateScreen; procedure UpdateScreen;
// handler // handler
procedure RemoveAllHandlersOfObject(AnObject: TObject); override;
procedure AddHandlerFormAdded(OnFormAdded: TScreenFormEvent; procedure AddHandlerFormAdded(OnFormAdded: TScreenFormEvent;
AsLast: Boolean=true); AsLast: Boolean=true);
procedure RemoveHandlerFormAdded(OnFormAdded: TScreenFormEvent); procedure RemoveHandlerFormAdded(OnFormAdded: TScreenFormEvent);
@ -988,12 +991,12 @@ type
AsLast: Boolean=true); AsLast: Boolean=true);
procedure RemoveHandlerActiveControlChanged( procedure RemoveHandlerActiveControlChanged(
OnActiveControlChanged: TScreenControlEvent); OnActiveControlChanged: TScreenControlEvent);
procedure AddHandlerActiveFormChanged( procedure AddHandlerActiveFormChanged(OnActiveFormChanged: TScreenFormEvent;
OnActiveFormChanged: TScreenActiveFormChangedEvent; AsLast: Boolean=true);
AsLast: Boolean=true); procedure RemoveHandlerActiveFormChanged(OnActiveFormChanged: TScreenFormEvent);
procedure RemoveHandlerActiveFormChanged( procedure AddHandlerFormVisibleChanged(OnFormVisibleChanged: TScreenFormEvent;
OnActiveFormChanged: TScreenActiveFormChangedEvent); AsLast: Boolean=true);
procedure RemoveAllHandlersOfObject(AnObject: TObject); override; procedure RemoveHandlerFormVisibleChanged(OnFormVisibleChanged: TScreenFormEvent);
function DisableForms(SkipForm: TCustomForm; DisabledList: TList = nil): TList; function DisableForms(SkipForm: TCustomForm; DisabledList: TList = nil): TList;
procedure EnableForms(var AFormList: TList); procedure EnableForms(var AFormList: TList);

View File

@ -1212,6 +1212,13 @@ begin
inherited VisibleChanging; inherited VisibleChanging;
end; end;
procedure TCustomForm.VisibleChanged;
begin
inherited VisibleChanged;
if (Screen<>nil) then
Screen.NotifyScreenFormHandler(snFormVisibleChanged,Self);
end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
TCustomForm WndProc TCustomForm WndProc
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}

View File

@ -250,6 +250,15 @@ begin
ReleaseDC(0, DC); ReleaseDC(0, DC);
end; 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; procedure TScreen.AddHandlerFormAdded(OnFormAdded: TScreenFormEvent;
AsLast: Boolean); AsLast: Boolean);
begin begin
@ -285,24 +294,27 @@ begin
end; end;
procedure TScreen.AddHandlerActiveFormChanged( procedure TScreen.AddHandlerActiveFormChanged(
OnActiveFormChanged: TScreenActiveFormChangedEvent; AsLast: Boolean); OnActiveFormChanged: TScreenFormEvent; AsLast: Boolean);
begin begin
AddHandler(snActiveFormChanged,TMethod(OnActiveFormChanged),AsLast); AddHandler(snActiveFormChanged,TMethod(OnActiveFormChanged),AsLast);
end; end;
procedure TScreen.RemoveHandlerActiveFormChanged( procedure TScreen.RemoveHandlerActiveFormChanged(
OnActiveFormChanged: TScreenActiveFormChangedEvent); OnActiveFormChanged: TScreenFormEvent);
begin begin
RemoveHandler(snActiveFormChanged,TMethod(OnActiveFormChanged)); RemoveHandler(snActiveFormChanged,TMethod(OnActiveFormChanged));
end; end;
procedure TScreen.RemoveAllHandlersOfObject(AnObject: TObject); procedure TScreen.AddHandlerFormVisibleChanged(
var OnFormVisibleChanged: TScreenFormEvent; AsLast: Boolean);
HandlerType: TScreenNotification;
begin begin
for HandlerType:=Low(TScreenNotification) to High(TScreenNotification) do AddHandler(snFormVisibleChanged,TMethod(OnFormVisibleChanged),AsLast);
FScreenHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject); end;
inherited RemoveAllHandlersOfObject(AnObject);
procedure TScreen.RemoveHandlerFormVisibleChanged(
OnFormVisibleChanged: TScreenFormEvent);
begin
RemoveHandler(snFormVisibleChanged,TMethod(OnFormVisibleChanged));
end; end;
{ {
@ -598,8 +610,6 @@ end;
Do not use this procedure. This procedure is used by TScreen internally. Do not use this procedure. This procedure is used by TScreen internally.
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
procedure TScreen.AddForm(AForm: TCustomForm); procedure TScreen.AddForm(AForm: TCustomForm);
var
i: Integer;
begin begin
FCustomForms.Add(AForm); FCustomForms.Add(AForm);
FCustomFormsZOrdered.Add(AForm); FCustomFormsZOrdered.Add(AForm);
@ -608,9 +618,7 @@ begin
FFormList.Add(AForm); FFormList.Add(AForm);
Application.UpdateVisible; Application.UpdateVisible;
end; end;
i := FScreenHandlers[snFormAdded].Count; NotifyScreenFormHandler(snFormAdded,AForm);
while FScreenHandlers[snFormAdded].NextDownIndex(i) do
TScreenFormEvent(FScreenHandlers[snFormAdded][i])(Self, AForm);
end; end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
@ -739,12 +747,8 @@ end;
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
procedure TScreen.RemoveForm(AForm: TCustomForm); procedure TScreen.RemoveForm(AForm: TCustomForm);
var
i: Integer;
begin begin
i := FScreenHandlers[snRemoveForm].Count; NotifyScreenFormHandler(snRemoveForm,AForm);
while FScreenHandlers[snRemoveForm].NextDownIndex(i) do
TScreenFormEvent(FScreenHandlers[snRemoveForm][i])(Self, AForm);
FCustomForms.Remove(AForm); FCustomForms.Remove(AForm);
FCustomFormsZOrdered.Remove(AForm); FCustomFormsZOrdered.Remove(AForm);
FFormList.Remove(AForm); FFormList.Remove(AForm);
@ -822,17 +826,9 @@ end;
procedure TScreen.UpdateLastActive; procedure TScreen.UpdateLastActive;
procedure NotifyOnActiveFormChanged; procedure NotifyOnActiveFormChanged;
var
i: Integer;
Handler: TScreenFormEvent;
begin begin
if Assigned(FOnActiveFormChange) then FOnActiveFormChange(Self); if Assigned(FOnActiveFormChange) then FOnActiveFormChange(Self);
i := FScreenHandlers[snActiveFormChanged].Count; NotifyScreenFormHandler(snActiveFormChanged,FLastActiveCustomForm);
while FScreenHandlers[snActiveFormChanged].NextDownIndex(i) do
begin
Handler := TScreenFormEvent(FScreenHandlers[snActiveFormChanged][i]);
Handler(Self, FLastActiveCustomForm);
end;
end; end;
procedure NotifyOnActiveControlChanged; procedure NotifyOnActiveControlChanged;
@ -915,4 +911,18 @@ begin
FDataModuleList.Remove(DataModule); FDataModuleList.Remove(DataModule);
end; 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 // included by forms.pp