【发布时间】:2011-02-10 21:00:13
【问题描述】:
我正在动态创建一个窗体,但是关闭它的例程位于我的主窗体的单元中,因为它与我的主窗体 (TSkype) 上的控件相关联。该事件是 SkypeAsyncSearchUsersFinished。当 SkypeAsyncSearchUsersFinished 例程完成时,我尝试将 ModalResult 设置为动态表单的 mrOk。但是,这会产生访问冲突。
这是搜索完成时触发的代码:
if SIDList.Count = 0 then
begin
frmSearcher.tmrFadeOut.Enabled := True;
end;
我尝试调试它,并在 frmSearcher.tmrFadeOut 处设置了一个断点...然后我进入下一行(例程 End;),这就是 AV 出现的时候。
tmrFadeOutTimer 事件执行 ModalResult := mrOk;
这就是我创建动态表单的方式:
Function ShowSearcher():Boolean;
Var
dlg : TfrmSearcher;
Begin
Result := False;
dlg := TfrmSearcher.Create(Forms.Application);
dlg.tmrFadeIn.Enabled := True;
if dlg.ShowModal = mrOk then
Begin
// Do nothing here
End;
Result := True;
dlg.Release;
End;
是的,我确信计时器只会启用一次。 :)
是的,我确定表单是“活动的”。 :)
实际上,如果我删除 tmrFadeOut.Enabled 代码,一切正常,但表单不会关闭。执行 frmSearcher.ModalResult := mrOk; 也会产生 AV。
如果您需要更多信息,我会添加。 :)
非常感谢! :)
【问题讨论】:
-
您能发布错误消息的确切文本吗?这会有所帮助。
-
frmSearcher.tmrFadeOut.Enabled := True;和dlg.tmrFadeIn.Enabled := True;之类的代码意味着在TfrmSearcher之外,您了解该表单的内部结构。你不应该:在TfrmSearcher上创建一个属性或一组方法来封装TfrmSearcher的内部工作。 -
@Mason - 这是访问冲突。错误代码取决于我是启用计时器还是设置 ModalResult。 :)
-
@Jeroen 是的,现在当你提到它时.. :)