代替showmodal其他两种方法和showmodal各有什么优缺点?

Henry.6 2013-02-16 04:47:14
代替showmodal其他两种方法

procedure TForm1.Button1Click(Sender: TObject);
begin
enablewindow(handle,false);//窗口一不可用
form2.show;

end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
enablewindow(form1.handle,true);//可用
end;



var
Form1: TForm1;
WindowList: Pointer;


implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
WindowList:= DisableTaskWindows(self.handle);
form2.show;

end;

uses Unit1;

{$R *.DFM}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
EnableTaskWindows(unit1.WindowList);
end;

...全文
764 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Henry.6 2013-02-27
  • 打赏
  • 举报
回复
引用 10 楼 sololie 的回复:
引用 6 楼 6rl 的回复:引用 5 楼 yct0605 的回复:showmodal窗体时,主窗体里面创建的线程是可以继续进行的 在什么场景下会考虑用enablewindow那两种方法代替showModal? 答好给多分 没必要用enablewindow,这个是api函数,showmodal是vcl函数,里面就是调用了eanablewindow。 你只需要考虑……
原来EnableTaskWindow里就包装了EnableWindow。
sololie 2013-02-26
  • 打赏
  • 举报
回复
引用 6 楼 6rl 的回复:
引用 5 楼 yct0605 的回复:showmodal窗体时,主窗体里面创建的线程是可以继续进行的 在什么场景下会考虑用enablewindow那两种方法代替showModal? 答好给多分
没必要用enablewindow,这个是api函数,showmodal是vcl函数,里面就是调用了eanablewindow。 你只需要考虑什么场景用show或showmodal,后者模态窗口,占据在该进程中所有窗口的顶层,模态窗口提示用户介入,当返回后自动销毁窗口。

// ShowModal 源码
function TCustomForm.ShowModal: Integer;
var
  WindowList: TTaskWindowList;
  LSaveFocusState: TFocusState;
  SaveCursor: TCursor;
  SaveCount: Integer;
  ActiveWindow: HWnd;
begin
  CancelDrag;
  if Visible or not Enabled or (fsModal in FFormState) or
    (FormStyle = fsMDIChild) then
    raise EInvalidOperation.Create(SCannotShowModal);
  if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
  ReleaseCapture;
  Application.ModalStarted;
  try
    { RecreateWnd could change the active window }
    ActiveWindow := GetActiveWindow;
    Include(FFormState, fsModal);
    if (PopupMode = pmNone) and (Application.ModalPopupMode <> pmNone) then
    begin
      RecreateWnd;
      HandleNeeded;
      { The active window might have become invalid, refresh it }
      if (ActiveWindow = 0) or not IsWindow(ActiveWindow) then
        ActiveWindow := GetActiveWindow;
    end;
    LSaveFocusState := SaveFocusState;
    Screen.SaveFocusedList.Insert(0, Screen.FocusedForm);
    Screen.FocusedForm := Self;
    SaveCursor := Screen.Cursor;
    Screen.Cursor := crDefault;
    SaveCount := Screen.CursorCount;
    WindowList := DisableTaskWindows(0);
    try
      Show;
      try
        SendMessage(Handle, CM_ACTIVATE, 0, 0);
        ModalResult := 0;
        repeat
          Application.HandleMessage;
          if Application.Terminated then ModalResult := mrCancel else
            if ModalResult <> 0 then CloseModal;
        until ModalResult <> 0;
        Result := ModalResult;
        SendMessage(Handle, CM_DEACTIVATE, 0, 0);
        if GetActiveWindow <> Handle then ActiveWindow := 0;
      finally
        Hide;
      end;
    finally
      if Screen.CursorCount = SaveCount then
        Screen.Cursor := SaveCursor
      else Screen.Cursor := crDefault;
      EnableTaskWindows(WindowList);
      if Screen.SaveFocusedList.Count > 0 then
      begin
        Screen.FocusedForm := TCustomForm(Screen.SaveFocusedList.First);
        Screen.SaveFocusedList.Remove(Screen.FocusedForm);
      end else Screen.FocusedForm := nil;
      { ActiveWindow might have been destroyed and using it as active window will
        force Windows to activate another application }
      if (ActiveWindow <> 0) and not IsWindow(ActiveWindow) then
        ActiveWindow := FindTopMostWindow(0);
      if ActiveWindow <> 0 then
        SetActiveWindow(ActiveWindow);
      RestoreFocusState(LSaveFocusState);
      Exclude(FFormState, fsModal);
    end;
  finally
    Application.ModalFinished;
  end;
end;
hongss 2013-02-26
  • 打赏
  • 举报
回复
有机会试试这两种方法。 思路不错
Henry.6 2013-02-26
  • 打赏
  • 举报
回复
还有没有人响应一下?
饮冰E士 2013-02-24
  • 打赏
  • 举报
回复
好思想,好方法。
Henry.6 2013-02-18
  • 打赏
  • 举报
回复
引用 5 楼 yct0605 的回复:
showmodal窗体时,主窗体里面创建的线程是可以继续进行的
在什么场景下会考虑用enablewindow那两种方法代替showModal? 答好给多分
yct0605 2013-02-18
  • 打赏
  • 举报
回复
showmodal窗体时,主窗体里面创建的线程是可以继续进行的
ok1411 2013-02-17
  • 打赏
  • 举报
回复
showmodal是模式窗口, 弹出来了就必须关闭才能切换界面 show只是显示,可以切换界面 只是试下就知道了
Henry.6 2013-02-17
  • 打赏
  • 举报
回复
引用 2 楼 doll_paul 的回复:
showmodal卡住后面的操作。其它“模拟”的,不会~
你的意思说整个主线程都卡住?
dollavon 2013-02-16
  • 打赏
  • 举报
回复
showmodal卡住后面的操作。其它“模拟”的,不会~
simonhehe 2013-02-16
  • 打赏
  • 举报
回复

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧