我正在动态创建一个表单,但是关闭它的例程位于我的主表单单元中,因为它与我的主表单(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。
如果您需要更多信息,我会添加它。 :)
非常感谢! :)
答案 0 :(得分:9)
由于您手动创建 TfrmSearcher 表单,请删除IDE生成的变量 frmSearcher ,修复您将获得的编译错误,您将没事。
你得到了AV,因为 frmSearcher 是NIL。
答案 1 :(得分:6)
您正在将新的TfrmSearcher
对象实例分配给其他方法无法访问的本地dlg
变量。您的其他例程正在尝试使用您未分配任何值的frmSearcher
变量来访问该对话框。
答案 2 :(得分:2)
我将此作为答案添加,因为我想格式化代码。这不是试图回答这个问题,我可能会在适当的时候删除,特别是如果我得到很多下注(同伴压力)。
我想要展示的是如何创建,展示和销毁表单。你这样做:
procedure ShowMyForm;
var
Form: TMyForm;
begin
Form := TMyForm.Create(nil);
try
Form.ShowModal;
finally
Form.Free;
end;
end;
在您的代码中:
True
。唯一的失败模式是通过异常,但函数没有返回值。Release
就是你想要的。您在处理邮件时调用Free
,并且一旦处理了当前队列中的任何邮件,您希望表单消失。