内建一个TBitmap,保存原有的Image,如果恢复到原始,就用BitBlt装载一下。这应该是最简单的方法了。
如果要每一步都能undo,就要自己定义数据结构了,比较复杂。

解决方案 »

  1.   

    Var
       AUndoPicture:TPicture;
    .....
      
    Function BeforDraw(..)
    begin
    AUndoPicture.assign(image1.picture.assign);
    end;
    Function Undo(..)
    begin
    image1.picture.assign(AUndoPicture);
    end;或者你在Image上面放一个PaintBox先画到PaintBox上去,如果继续修改图像,就把刚刚的
    那一笔画到Image上,如果Undo就不动Image直接PaintBox刷新,实现多级Undo可以管理一
    个UndoPicture的列表。
      

  2.   

    同意Chechy!还可以使用TMetaFile来完成,处理速度快,而且还可以分层,很好的。
      

  3.   

    保存原图不是个好主意,较好的方法应该是设Tpen.mode,好像是设为pmNotXor,画一次线条上去,再画一次线条擦去。
      

  4.   

    Xor确实有这个功能,不过用了Xor,那么颜色是否能够显示正常呢?
      

  5.   

    zwhhoo(我爱真理) 的方法 好象会影响到原始的图吧。
      

  6.   

    最好还是自己建立历史列表,这样处理才是一个真正的解决办法,作起来不如你想的麻烦,处理好redo和undo的逻辑就可以了!
      

  7.   

    个人认为用原图恢复不是个好主意,如果画线时点下线的一端,另一端鼠标移到哪儿就可看到像筋一样的效果,原图恢复不闪烁才怪,Cad都是我说的方法,现在唯一不同的是我们有背景,但在Delphi中大家可试试一个背景Image放在下面,一个前景image(设为背景透明)放在上面,在前景image上用pmNotXor画线。