我提前为一个新手问题道歉,但为什么我得到<!>;访问违规<!>下面的代码出错(在<!>“; Create(SelectorForm); <!>”行)?我尝试使用主窗体作为所有者,但它没有任何区别。

var
  SelectorForm: TSelectorForm;
  ArrayOfImages: Array [1..10] of TImage;

implementation

procedure TSelectorForm.FormCreate(Sender: TObject);
var
  Loop: Byte;
begin
  for Loop := 1 to 10 do
  begin
    with ArrayOfImages[Loop] do
    begin
      Create(SelectorForm);
    end;
  end;
end;
有帮助吗?

解决方案

问题是你实际上是这样做的:

var
  imageVariable: TImage;
begin
  imageVariable.Create (ParentForm);
end;

哪个错了,因为<!>“创建<!>”;正在调用尚未分配的变量的方法。

你应该这样做:

var
  imageVariable: TImage;
begin
  imageVariable := TImage.Create (ParentForm);
  try
    //use the object
  finally
    FreeAndNil (imageVariable);
  end;
end;

或者更具体地说,在您的代码中:

for Loop := 1 to 10 do
begin
  ArrayOfImages[Loop] := TImage.Create (Self);
end;

不要忘记释放对象

编辑:接受@ andiw的评论并收回释放对象的提示。 EDIT2:接受@ Gerry的评论并使用Self作为所有者。

其他提示

上述代码存在很多问题。 (不要使用<!>“;使用<!>”这样的开头,不要使用Byte作为循环var)

我的假设是你最终想要一个以窗体作为父窗口创建的TImage实例数组。

所以基于这个假设...你想要(未经测试的)

之类的东西
var
  ArrayOfImages: Array [0..9] of TImage;  
  i : integer;
begin
  for i := 0 to 9 do
  begin
    ArrayOfImages[i] := TImage.Create(theForm);
  end;

end;

现在请注意,当您使用完阵列后,您将负责清理阵列,您需要在每个Image实例上免费拨打电话。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top