OZ8*_*8HP 1 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个不同的表中收集数据.
你是否以模态方式显示表单?在这种情况下,crHourGlass通过呼叫进行ShowModal呼叫取消设置Screen.Cursor := crDefault;.见Vcl.Forms单元,function TCustomForm.ShowModal: Integer;
第7139行(XE7源).
固化会打电话给Screen.Cursor := crHourGlass;在TfrmJsCv.FormShow()所有这些SetupXXX电话前,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不做上述的例外.
crHourGlass在调用ShowModal之前设置的另一个效果crDefault是,在显示表单时,光标仍然不会显示为沙漏,但之后会立即显示.这可能像这个解释一样令人困惑:)