我正在开发一个带有安全设备的应用程序,该安全设备在一个单独的线程上进行一些繁重的检查。返回代码不同于几种情况,它只是做或死,并且存在用户具有旧许可并且有机会即时升级其许可的特定情况。如果他选择这样做,升级许可证的过程需要一些时间,所以我创建一个只有一个标签的简单表单,并在运行时使用返回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
感谢您的一切!