帮我看下这段代码,一行代码在后就出现cannot change visible in onshow or onhide

时间:2022-05-07 17:09:45
procedure TRobMainForm.TrayIconDblClick(Sender: TObject);
begin
  case WindowState of
    wsMinimized:
    begin
      Self.WindowState := wsNormal;
      Self.Visible := True;
    end;
    wsNormal:
    begin
      Self.Visible := False;
      Self.WindowState := wsMinimized;
    end;
  end;
end;

功能:双击窗体的托盘图标,如果窗体是正常的则窗体最小化并从任务栏隐藏,反之窗体还原并显示。
但是如果改成下面
    wsMinimized:
    begin
      Self.Visible := True;
      Self.WindowState := wsNormal;
    end;

把Self.Visible := True放到前面,结果窗体可以正常最小化并隐藏,但从最小化还原时却出现cannot change visible in onshow or onhide错误。

7 个解决方案

#1


最小化了就行, 还设置Visible干啥

#2


你設置窗體visible你設置窗體visible為true觸發onshow事件,visible為false觸發onhide事件

#3


你们都没有讲到点子上

#4


换一组API试试呢:
显示:
        showwindow(h,sw_show);//隐藏
        showwindow(h,sw_restore);//恢复
隐藏:
        closewindow(h);//最小化
        showwindow(w, sw_hide);//隐藏

#5


Visable为TRUE会触发OnShow;FALSE则触发OnHide。

所以你的设置值,需要在事件触发之前设置好。

试试以下代码:
    wsMinimized:
    begin
      Self.Visible := True;
      Self.WindowState := wsNormal;
    end;

修改为:
    wsMinimized:
    begin
      Self.WindowState := wsNormal;
      Self.Visible := True;
    end;

#6


引用 5 楼 doloopcn 的回复:
Visable为TRUE会触发OnShow;FALSE则触发OnHide。

所以你的设置值,需要在事件触发之前设置好。

试试以下代码:
    wsMinimized:
    begin
      Self.Visible := True;
      Self.WindowState := wsNormal;
    end;

修改为:
    wsMinimized:
    begin
      Self.WindowState := wsNormal;
      Self.Visible := True;
    end;


我试验后确实如此,我只是不知道为何如此。

#7


建议使用delphi的托盘控件TrayBarIcon;
它实用性很强,使用方便。

#1


最小化了就行, 还设置Visible干啥

#2


你設置窗體visible你設置窗體visible為true觸發onshow事件,visible為false觸發onhide事件

#3


你们都没有讲到点子上

#4


换一组API试试呢:
显示:
        showwindow(h,sw_show);//隐藏
        showwindow(h,sw_restore);//恢复
隐藏:
        closewindow(h);//最小化
        showwindow(w, sw_hide);//隐藏

#5


Visable为TRUE会触发OnShow;FALSE则触发OnHide。

所以你的设置值,需要在事件触发之前设置好。

试试以下代码:
    wsMinimized:
    begin
      Self.Visible := True;
      Self.WindowState := wsNormal;
    end;

修改为:
    wsMinimized:
    begin
      Self.WindowState := wsNormal;
      Self.Visible := True;
    end;

#6


引用 5 楼 doloopcn 的回复:
Visable为TRUE会触发OnShow;FALSE则触发OnHide。

所以你的设置值,需要在事件触发之前设置好。

试试以下代码:
    wsMinimized:
    begin
      Self.Visible := True;
      Self.WindowState := wsNormal;
    end;

修改为:
    wsMinimized:
    begin
      Self.WindowState := wsNormal;
      Self.Visible := True;
    end;


我试验后确实如此,我只是不知道为何如此。

#7


建议使用delphi的托盘控件TrayBarIcon;
它实用性很强,使用方便。