afiget Form2.Free -
действует конечно, но слишком репрессивно... Будем убеждать...
Прав
RomanTim. Корень ошибки в том, что не сбрасывается FShowAction в SetVisible формы, что в дальнейшем приводит к отображению окно (через обработчик WM_SHOWWINDOW), которое не должно быть видно. Решил перекрытием Visible, Hide и копированием WM_ShowWindow. Почти как у
RomanTim...
[more]
Код: type
TForm2 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
FShowAction: TShowAction;
procedure SetVisible(Value: Boolean);
procedure WM_ShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
public
{ Public declarations }
procedure Hide;
property Visible write SetVisible default False;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.SetVisible(Value: Boolean);
begin
FShowAction := saIgnore;
inherited Visible := Value;
end;
procedure TForm2.Hide;
begin
Visible:= False;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
if Visible then
Caption:= 'Visible = True'
else
Caption:= 'Visible = False';
end;
procedure TForm2.WM_ShowWindow(var Message: TWMShowWindow);
const
ShowCommands: array[saRestore..saMaximize] of Integer =
(SW_SHOWNOACTIVATE, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED);
begin
with Message do
case Status of
SW_PARENTCLOSING:
begin
if IsIconic(Handle) then
FShowAction := saMinimize
else if IsZoomed(Handle) then
FShowAction := saMaximize
else
FShowAction := saRestore;
inherited;
end;
SW_PARENTOPENING:
if FShowAction <> saIgnore then
begin
ShowWindow(Handle, ShowCommands[FShowAction]);
FShowAction := saIgnore;
end;
else
inherited;
end;
end;