forms - 当表单在屏幕上可见时触发的事件

标签 forms delphi events

我有一个需要一些时间来创建的表单,我想向用户展示正在发生的事情,并且在我调用显示该表单的函数时制作了一个沙漏光标。但我的问题是我无法获得

Screen.Cursor := crDefault;

当表单实际显示在屏幕上时首先执行。 我已经尝试了所有尝试但没有运气的有意义的事件。在表格可见之前沙漏消失了。

接下来我可以尝试什么来让它工作。

如果您需要更多信息,请说出来,我会找到的。

在调用创建表单的函数之前,我在主表单中设置了沙漏,然后我的表单显示如下。

procedure TfrmJsCv.FormShow(Sender: TObject);
begin
  fReportFile := Folders.DirDatabase + 'jobsearch_print.mdb';
  btnPrint.Visible := FileExists(fReportFile);
  try
    SetupMain;
    SetupCertificates;
    SetupContacts;
    SetupCourse;
    SetupJobs;
    SetupLanguage;
    SetupLanguageLevels;
    SetupItKnowledge;
    SetupKnowledgeLevels;
    SetupKnowledgeTypes;
    SetupOther;
    SetupReferences;
    SetupSchool;
    SetupYears;
  except
    on E: exception do
      Logfile.Error('F_JsCv.FormShow: ' + E.Message);
  end;
  PagCurriculumVitae.ActivePageIndex := 0;
end;

我试着把 Screen.Cursor := crDefault;在 OnActivate、OnCreate、OnShow、OnResize、OnPaint 事件上,但沙漏在表单准备好/在屏幕上可见之前重置

所有 Setupxxxxx 过程都是为相当复杂的表单准备数据的过程 - 它从 12 个不同的表中收集数据。

最佳答案

您是否以模态方式显示表单?在这种情况下,crHourGlass 设置被调用 ShowModal 取消,其中调用 Screen.Cursor := crDefault; 。参见 Vcl.Forms 单元,function TCustomForm.ShowModal: Integer; 第 7139 行(XE7 源代码)。

解决方法是在所有这些 SetupXXX 调用和 Screen.Cursor := crDefault; 之后。

既然 OP 确认了表单是模态显示的,我认为更多的解释可能对 future 的读者有益。

OP 说:

"The hourglass is gone before the form is visible."
"I set the hourglass in my mainform before calling the function that creates the form ..."

因此他在主要形式中有这样的东西:

  Screen.Cursor := crHourGlass;
  frmJsCv.ShowModal

在 Vcl.Forms.TCustomForm.ShowModal 中结束

...
SaveCursor := Screen.Cursor;
Screen.Cursor := crDefault;
SaveCount := Screen.CursorCount;
...
try
  Show;  // 
  try
    // message loop
  finally
    Hide;
  end;
finally
  if Screen.CursorCount = SaveCount then
    Screen.Cursor := SaveCursor
  else Screen.Cursor := crDefault;
  ...
end;

目的显然是让模式窗体根据需要操作光标,然后将光标恢复到调用ShowModal 之前的状态。至少从 Delphi 7 开始就是这样。

请注意,普通的 Show 不会进行上述练习。

在调用 ShowModal 之前设置 crHourGlass 并且之后不设置 crDefault 的另一个效果是光标仍然不会显示为沙漏,而表单显示,但紧随其后。这可能和这个解释一样令人困惑:)

关于forms - 当表单在屏幕上可见时触发的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30138004/

相关文章:

delphi - 为什么编译器会跳过分配变量

delphi - 如何确定 Windows 主题 TColors

algorithm - 从事件中选择项目,尽可能均匀分布

JQuery - 为每个实例化的新 DOM 对象执行代码

javascript - 从不希望我拥有它的组件获取鼠标移动事件

jquery - 带有自定义图像的复选框在 IE 上不起作用

javascript - 在 jquery 中使用 Slide Down 显示隐藏的表单域

angularjs - Symfony 忽略额外字段的验证

jquery - 选择具有特定属性的元素

delphi - 创建进程: escape spaces in the application path