本帖最后由 cowbo 于 2013-09-21 10:30:09 编辑

解决方案 »

  1.   

    我猜应该是这句的问题。一般来说 Assign 会是个虚方法,由具体派生类 override
    这个函数一般的实现方式不是简单的赋值,也就是说内部另创建一个新对象。
    此处你只是释放了 bit,而内部新创建的对象你并没有释放。
      

  2.   

    Assign 就是相当于c#\java中的“深拷贝”,也类似c++中的“拷贝构造函数”的工作原理。
    所有从TPersistent继承的子类才拥有此方法,用于拷贝一个对象,而非拷贝对象的引用。
    你这里只要image2释放后,它的picture也就会释放了。不过这个应该跟你的问题无关,你的问题应该还是出在你绘图的过程中的
    “........(太长,略)” 不知干了啥 下面代码测试就没啥问题var
        bit:TBitmap;
        r:TRect;
    begin
       DoubleBuffered:=True;
         try
            //建立图像
            bit:=TBitmap.Create;
            bit.Width:=Image2.Width;
            bit.Height:=Image2.Height;
            //绘图
            Randomize;
            with bit.Canvas do
            begin
             // 用随机颜色在随机位置填充一个矩形
              Brush.Color:= RGB(Random(255),Random(255),Random(255));
              r:= Rect(Random(bit.Width),Random(bit.Height),bit.Width, bit.Height);
              FillRect(r);
            end;
             Image2.Picture.Assign(bit);
          finally
            FreeAndNil(bit);
          end;
    end;