我最近开发的一个组件中包含一个ImageList对象,我在该控件的Destory中调用了该对象的Free方法。可是当我使用该控件时,一切正常,可是当程序退出时系统报错,好像是我开发的组件没有parent window. 请大家帮忙。

解决方案 »

  1.   

    在Create重载方法中加上parent并指定给为组件的owner不就OK了?
      

  2.   

    不行啊constructor TListPicture.create(AOwner:TComponent);
    begin
        inherited create(AOwner);
        self.Parent:=AOwner as TWinControl;
        fImageList:=TImageList.Create(self);
        Height:=70;
        Width:=400;
        SelectedImageIndex:=-1;
        canvas.Pen.Width:=2;
        OnResize:=DoReSize;
        fImageSize:=50;    fImageChangeLink:=TChangeLink.Create;
        fImageChangeLink.OnChange:=ImageListChanged;
    end;
      

  3.   

    另外在实际时我用部件编辑器为该组件增加的Image对象,在运行时好像都不存在了。怎样才能保证在实际时的动作在运行时有效呢?
      

  4.   

    问题肯定不是出在FImageList,因为它不需要也没有Parent,对它的无效调用最多报告无效的地址访问。你再找找其他原因,或者把异常信息原文贴出来。
      

  5.   

    cnsuyong(小可) :
        Glad to meet you again!!
        异常信息主要是: project project1.exe raised exception class EInvalidOperation with message 'Control'ListPicture1'has no parent window'....
      

  6.   


        //self.Parent:=AOwner as TWinControl;
        fImageList:=TImageList.Create(nil);
      

  7.   

    VCL对组件的释放是自动的,如果你Create(sss)指定了拥有者,那么当拥有者被释放之前,它会先释放它拥有的组件,所以你的问题可能是因为在你调用Free方法前,该组件已经被自动释放了!!可以用man8888(北京男人) 的方案:fImageList:=TImageList.Create(nil),不指定拥有者,自己来Free,还有就是指定用有这,不进行手动Free.
      

  8.   

    显然,你的ListPicture作为TControl的派生类,必须有Parent,否则在显示时就会报告“没有Parent窗口”的信息。你的源代码俺已经看过了,问题只剩下如何保存你在设计时添加的图象了。
    至于ImageList在创建时是否需要指定Owner,俺以为最好是指定。指定为nil是不安全的,因为这样做将可能导致在应用程序运行期间,如果你没有及时释放对象实例,那么势必造成内存丢失(暂时的),这些丢失直到你的应用程序结束才会被操作系统收回(准确地说是Delphi自动释放所有相关资源,包括开发者在应用程序中忘记释放的对象实例)。为对象实例指定Owner,那么就应该在Owner被销毁之前销毁该对象。俺看过了,你的源代码中没有这些问题。
    祝你好运!
      

  9.   

    destructor TListPicture.Destroy;
    var i:integer;
    begin
        try
            if High(ArrayImage)<>-1 then
            begin
                for i:=low(ArrayImage) to high(ArrayImage) do
                    ArrayImage[i].Free;
                ArrayImage:=nil;
            end;
            fImageChangeLink.Free;
        finally
           fImageList.Free;******************
           inherited;
        end;
    end;
      

  10.   

    那大家的意见是不是不用再析构函数中加入FImageList.Free;了,???
      

  11.   

    你的那个ArrayImage[i]释放的资源是哪里的?
      

  12.   

    <<Delphi高级开发指南》》中说得很清楚了,不要两次释放同一对象,释放后一定要将类引用置为nil