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 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);

View File

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

View File

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