在窗体上显示窗体时触发的事件

时间:2015-05-09 08:55:24

标签: forms delphi events

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

Screen.Cursor := crDefault;

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

我可以尝试下一步来实现这一目标。

我需要更多信息请说出来我会找到它。

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

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个不同的表中收集数据。

1 个答案:

答案 0 :(得分:7)

您是否以模态方式显示表单?在这种情况下,crHourGlass设置会在调用ShowModal时取消Screen.Cursor := crDefault;。查看Vcl.Forms单位,function TCustomForm.ShowModal: Integer; 第7139行(XE7来源)。

解决方法是在所有SetupXXX调用之前调用Screen.Cursor := crHourGlass;中的TfrmJsCv.FormShow(),然后调用Screen.Cursor := crDefault;

现在OP确认表格是以模态显示的,我认为更多的解释可能对未来的读者有益。

OP说:

  

“在表格可见之前,沙漏消失了。”
  “在调用创建的函数之前,我在我的mainform中设置了沙漏   表格......“

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

  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的另一个影响是,在显示表单时光标仍然不会显示为沙漏,但之后会立即显示。这可能与此解释一样令人困惑:)