在Delphi中发布表单时获取列表索引超出界限

时间:2015-05-11 13:10:46

标签: multithreading delphi

我正在开发一个带有安全设备的应用程序,该安全设备在一个单独的线程上进行一些繁重的检查。返回代码不同于几种情况,它只是做或死,并且存在用户具有旧许可并且有机会即时升级其许可的特定情况。如果他选择这样做,升级许可证的过程需要一些时间,所以我创建一个只有一个标签的简单表单,并在运行时使用返回a的函数展示带有此标签的简单消息TForm的。这是这种功能的代码:

function TAuth.FrmWait: TForm;
var
  lbl : TLabel;
  frm : TForm;
  regn : HRGN;
begin
  frm := TForm.Create(Application);
  with frm do
  begin
    Parent := F_MainForm;
    ClientWidth  := 479;
    ClientHeight := 97;
    Position := poMainFormCenter;
    BorderStyle := bsNone;
    Visible := true;
    Color   := clWebFloralWhite;
    regn := CreateRoundRectRgn(0, 0,ClientWidth,ClientHeight,40,40);
    SetWindowRgn(Handle, regn, True);
    with Font do
    begin
      Size := 12;
      Color := clNavy;
      Style := [fsBold];
    end;
  end;
  lbl := TLabel.Create(frm);
  with lbl do
  begin
    Parent := frm;
    Width  := 400;
    Height := 18;
    Top    := (frm.ClientHeight - Height) div 2;
    Left   := (frm.ClientWidth - Width) div 2;
    Caption := 'Please Wait...';
    ParentFont := true;
  end;
  result := frm;
  Application.ProcessMessages; //without this the label won't appear
end;

到目前为止一切都很好,但真正的问题是当我实际使用FrmWait时。消息显示得很好但是当我处理它时,我不断得到一个Index out of bounds错误,这真的很奇怪,因为我没有使用任何列表。代码在这里完成:

if _signal = 0 then
begin
  frm := FrmAguardar;
  frm.Show;
end;
{
    processing gets done here
}    
if _signal = 0 then
begin
  frm.Close();
  FreeAndNil(frm);
end;

问题几乎每次都发生在FreeAndNil,让事情变得更加混乱,并不总是会发生。它发生在大约8次左右(有时更少,其他更多)。我试着寻找每一个地方,我设法找到的是一些内存覆盖可能正在发生,仍然无法解决这个问题。请记住,这一切都是在工作线程中完成的,而不是主线程。除了这个特例,所有其他验证都可以正常工作。

我完全迷失在这里。这可能是我糟糕的设计,这可能是一个delphi Bug吗?我在Windows 8.1中使用Delphi XE2

感谢您的一切!

0 个答案:

没有答案