触摸动态表单时访问冲突?

时间:2011-02-10 21:00:13

标签: delphi dynamic

我正在动态创建一个表单,但是关闭它的例程位于我的主表单单元中,因为它与我的主表单(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。

如果您需要更多信息,我会添加它。 :)

非常感谢! :)

3 个答案:

答案 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;

在您的代码中:

  1. 由于您正在确定表单的生命周期,因此无需将所有者传递给构造函数。
  2. 函数的返回变量毫无意义,因为您总是返回True。唯一的失败模式是通过异常,但函数没有返回值。
  3. 不要在{1}}打电话给你,原来Release就是你想要的。您在处理邮件时调用Free,并且一旦处理了当前队列中的任何邮件,您希望表单消失。