Delphi在加载时禁用表单

And*_*rey 6 delphi tform

在我的应用程序中,我有一个主窗体,能够在数据库中加载一些图像.在加载图像时,我想显示一个带有进度指示器的表单(带有bsNone边框样式).

但是,如果我使用ShowModal显示表单,主表单的执行会停止,所以我不能这样做.

如果我调用Show,则用户可以访问所有其他表单组件,这可能很危险,而照片未完全加载.

我需要得到方法,禁用主窗体上的所有内容,而加载没有完成.

请告诉我,这是怎么可能的.

Rem*_*eau 12

设置MainFormPopupParent对进度的形式,以便MainForm能永远在进步的形式出现顶部.然后只需MainForm.Enabled := False在进度表单打开MainForm.Enabled := True时进行设置,并在进度表单关闭时进行设置.

procedure TMainForm.ShowProgressForm;
begin
  with TProgressForm.Create(nil) do
  begin
    PopupParent := Self;
    OnClose := ProgressFormClose;
    Show;
  end;
  Enabled := False;
end;

procedure TMainForm.ProgressFormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Enabled := True;
end;
Run Code Online (Sandbox Code Playgroud)

这模拟ShowModal()了用户的行为(在MainForm进度表单打开时不是用户交互的),但没有阻止代码.


Dav*_*nan 6

首先,直接回答您的问题。

我需要设法禁用主窗体上的所有内容。

设置MainForm.EnabledFalse禁用与主窗体关联的窗口。并重新启用将其设置为True


但是,您的根本问题是您正在GUI线程中执行长时间运行的任务。这总是一个坏主意,解决方法是在一个单独的线程中执行那些长时间运行的任务。

将长时间运行的任务移至单独的线程后,您将发现ShowModal显示进度表正是您所需要的。