内容太长,不让发,见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1792827

解决方案 »

  1.   

    1)应该有个OwnsObjects属性。不过这应该是个浅层释放,Delphi只会释放加入到List的Component,而Component中如果你在Tag中放了对象,那么它不会做的。(研究一下源代码就知道了)
    2)呵呵,好像你从TComponent继承不就OK了,浪费点内存没啥。注意Tag中的东东需要你自己解决。
    3)Delphi编译器在这点上比较烂,就是abstract方法(相当于C++地纯虚函数),如果你没有完成这个方法,编译器好像就产生警告,没有错误。导致如果代码执行到这个没有完成的方法时就出错了。(Pascal编译器一向以严厉著称,居然连这个都不禁止,难道Anders走了,Borland就没有编译天才了吗?)还有代码可以分几次贴。
      

  2.   

    Borland公司打击盗版,俺机器没有装,所以你的代码,如果没有Delphi,我是不愿意读的。
    请见谅。
      

  3.   

    procedure TLeftButtonPro.ArrangePosition;
    var
      I: Integer;
      tmpTop: Integer;
      tmpObj: TMyBmpButton;
    begin
      inherited; //这句可能多余,毕竟基类是个abstract方法
      tmpTop := Height - ButtonHeight;
      for I := 0 to Count - 1 do
      begin
        tmpObj := TMyBmpButton(Items[I]);
        tmpObj.Left := Left;
        tmpObj.Top := Trunc(I * tmpTop / Count) + Top;
      end;                               
    end;
      

  4.   

    从这段代码来说,几乎看不出什么问题。看来就是使用的问题了。
    从代码的总体感觉,觉得有如下问题:
    1)封装不是很好,所有的都是public。
    2)TComponentList默认就是OwnsObjects为True,所以可能会造成双重释放。这一点在调试时需要特别注意。如果两个List中的对象有交叉,就是产生AV错误。
    内存管理可能是Delphi,C++中最头痛的问题,当然也是最灵活的地方。如果有GC,那么上面就不会有这些问题了。
      

  5.   

    感谢 chechy(简简单单的活) 
    我从tcontrol继承竟然就好了,不明白中