2009-06-24 111 views
4

我为新手问题提前道歉,但为什么我得到“访问冲突”错误与下面的代码(在“创建(SelectorForm);”行)?我尝试使用主窗体作为所有者,但它没有任何区别。德尔福︰TImage.Create导致访问冲突

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; 

回答

17

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

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的评论并收回释放物体的提示。 编辑2:接受@ Gerry的评论并使用Self作为所有者。

+0

在我的理解中,当SelectorForm被作为其所有者传递时被自动释放 - 或者我出错了? – 2009-06-24 07:15:02

+0

@andiw:你说得对。如果您将表单指定为其所有者,则无需释放这些对象。 – Hemant 2009-06-24 08:15:24

0

上面的代码有很多问题。 (不要使用“With”作为开始,不要使用循环变量的Byte)

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

因此基于该assumtion ......你想要的东西像(未经测试)

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实例上都是免费的。

相关问题