我提前为新手问题道歉,但为什么我的代码出现“访问冲突”错误(在“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;
答案 0 :(得分:17)
问题是你实际上是这样做的:
var
imageVariable: TImage;
begin
imageVariable.Create (ParentForm);
end;
这是错误的,因为正在对尚未分配的变量调用“Create”方法。
你应该这样做:
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作为所有者。
答案 1 :(得分:0)
上述代码存在很多问题。 (不要像开头一样使用“With”,不要使用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实例上免费拨打电话。