Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1228491
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2008-08-31 09:52:09



各位高手:   大家好!  
   
        几乎所有的图形编辑软件都有undo与redo操作,   用c++builder或delphi如何  
  高效地编程实现   ??     高效地全程操作如何编程   ??   听说与command   模式和堆栈  
  有关.   具体如何编程呢   ??    
         
        请教具体编程思路,   请给出代码,   最好提供针对性的c++builder或delphi  
  完整例子.   谢谢   !!  
 

注:   如果大家引用别人的帖子太长,   请只给出URL,   不要把帖子内容直接帖上,  
  以免影响大家阅读,   谢谢合作   !!  
   
 

搞搞命令模式先。

一般都是将更改历史保存在虚拟内存中,以为很多过程都是不可逆的。

模式归模式,   实现UNDO   和   REDO   就是自己建立一个STACK就OK了.算法自己根据实际情况考虑吧,不同的应用有不同的算法.   我的网络布线辅助设计系统就是这样设计的.

各位:  
      能否给出代码   ??   谢谢!!

可以.   全心全意为社员服务,   是我们的宗旨.

to   sanmaotuo(老冯)  
  我升星了,你快加油啊!

我的图形编辑功能是这样的:能在画布上画上线条,圆,椭圆及各种图元等,这些图形加上后都能  
  用鼠标选定,   移动,   旋转,   改变形状等,   还有,   整个图形(包括原画布及后来各种画上去的)  
  能进行模糊,锐化等操作.   这样的软件实现UNDO   和   REDO如何编程啊??   高效地全程操作如何编程啊   ??   请把代码给我   happymanfreeman@sohu.com     谢谢!!  
 

我升星了,你快加油啊!  
   
  ---------------------  
   
  恭喜大哥,   我一定加倍努力.  
   
  interface  
   
  uses  
      Classes;  
   
  type  
      TUnDoItem   =   class(TCollectionItem)  
      private  
          FActionName:   string;  
          FState:   TStream;   //Used   to   Save   Your   Graphics   At   Each   Undo&Redo  
      public  
          constructor   Create(Collection:   TCollection);   override;  
          destructor   Destroy;   override;  
          property   ActionName:   string   read   FActionName   write   FActionName;  
          property   State:   TStream   read   FState;  
      end;  
   
      TUnDoStack   =   class(TCollection)  
      private  
          FCurrent:   Integer;  
          //FNetGraphics:   TNetGraphics;  
          procedure   ClearUndoStack;  
          procedure   PushState(const   AActionName:   string);  
          procedure   Undo;  
          procedure   Redo;  
          function   NextUndoAction:   string;  
          function   NextRedoAction:   string;  
      protected  
      public  
          constructor   Create(const   ANetGraphics:   TNetGraphics);  
      end;  
   
  implementation  
   
  {   TUnDoItem   }  
   
  constructor   TUnDoItem.Create(Collection:   TCollection);  
  begin  
      inherited   Create(Collection);  
      FState   :=   TMemoryStream.Create;  
  end;  
   
  destructor   TUnDoItem.Destroy;  
  begin  
      FState.Free;  
      inherited;  
  end;  
   
  {   TUnDoStack   }  
   
  procedure   TUnDoStack.ClearUndoStack;  
  begin  
      Clear;  
      FCurrent   :=   -1;  
      PushState('');  
  end;  
   
  constructor   TUnDoStack.Create(ANetGraphics:   TNetGraphics);  
  begin  
      inherited   Create(TUnDoItem);  
      Assert(ANetGraphics   <>   nil,   'ANetGraphics   Is   Nil');  
      FNetGraphics   :=   ANetGraphics;  
      FCurrent   :=   -1;  
  end;  
   
  function   TUnDoStack.NextRedoAction:   string;  
  begin  
      Result   :=   '';  
      //Change   Condition   From   On   Line   to   MutilLines   Which   Is   From   Martin   Fowler's   Refactor  
      if   FCurrent   >=   -1   then  
          if   FCurrent   <   Pred(Count)   then  
              Result   :=   TUndoItem(Items[Succ(FCurrent)]).ActionName;  
  end;  
   
  function   TUnDoStack.NextUndoAction:   string;  
  begin  
      Result   :=   '';  
      //Change   Condition   From   On   Line   to   MutilLines   Which   Is   From   Martin   Fowler's   Refactor  
      if   FCurrent   >   -1   then  
          if   FCurrent   <   Count   then  
              Result   :=   TUndoItem(Items[FCurrent]).ActionName;  
  end;  
   
  procedure   TUnDoStack.PushState(const   AActionName:   string);  
  begin  
      while   FCurrent   <   Pred(Count)   do  
          Items[Pred(Count)].Free;  
   
      with   TUndoItem(Add)   do  
      begin  
          ActionName   :=   AActionName;  
          //......  
          {Save   Your   Graphics   Here}  
          FNetGraphics.SaveToStream(FState);//Here   is   My   Application's   Coding;  
          //......  
          Inc(FCurrent);  
      end;  
   
      if   Count   >   20   then     //Set   Max   Count   of   UNDO&REDO  
      begin  
          Items[0].Free;  
          Dec(FCurrent);  
      end;  
  end;  
   
  procedure   TUnDoStack.Redo;  
  begin  
      //Change   Condition   From   On   Line   to   MutilLines   Which   Is   From   Martin   Fowler's   Refactor  
      if   FCurrent   >=   -1   then  
          if   FCurrent   <   Pred(Count)   then  
      begin  
          //......  
          {Initial   Your   Graphics   Here}  
          FNetGraphics.Clear;     //Here   is   My   Application's   Coding;  
          //......  
          With   TUndoItem(Items[Succ(FCurrent)])   do  
          begin  
              FState.Position   :=   0;  
              //......  
              {Load   Your   Graphics   Here}  
              FNetGraphics.LoadFromStream(FState);   //Here   is   My   Application's   Coding;  
              //......  
          end;  
          Inc(FCurrent);  
      end;  
  end;  
   
  procedure   TUnDoStack.Undo;  
  begin  
      //Change   Condition   From   On   Line   to   MutilLines   Which   Is   From   Martin   Fowler's   Refactor  
      if   FCurrent   >   0   then  
          if   FCurrent   <=   Count   then  
      begin  
          //......  
          {Initial   Your   Graphics   Here}  
          FNetGraphics.Clear;     //Here   is   My   Application's   Coding;  
          //......  
          With   TUndoItem(Items[Pred(FCurrent)])   do  
          begin  
              FState.Position   :=   0;  
              //......  
              {Load   Your   Graphics   Here}  
              FNetGraphics.LoadFromStream(FState);   //Here   is   My   Application's   Coding;  
              //......  
          end;  
          Dec(FCurrent);  
      end;  
  end;  
   
  ...........................版权所有   版权人:   老冯

学习冯老弟专业的undo和redo功能!我以前就用一个List加个Index变量解决的,汗...

请介绍针对性的c++builder或delphi  
  完整例子.   谢谢   !!  
 

不可能给你完整例子。

 
      我说的是"介绍"网上的针对性c++builder或delphi  
   
  完整例子   !!   谁介绍200分全部给谁.

分给谁是你的权利和义务。   但CSDN不是培养懒虫的摇篮。

分给谁是你的权利和义务。   但CSDN不是培养懒虫的摇篮。  
  =================================================================================  
  老弟说的好!你就是给了他完整的例子,也不知道那天给你分。我在楼主另一帖给了较完整的例子,也没见说正确与否,更不见楼主有接帖的意思,没意思。所以我现在回帖前总是搜索一下发帖人是否有老帖未接的,如果问题基本解决楼主不接帖的,我就是知道也不回帖的。  
   
  见楼主另一帖:  
   
 

不好意思,   由于事物繁忙,   一些帖子忘看,   大家不要见怪!   现在我看看上述贴子,   如问题解决,  
  马上给分,   结帖.

蹭分!!:)

什么人都有的

结帖是美得

矢量图形引擎TCAD   xp   (CAD   组件)    
  详细信息请看:  
   
 

使用堆栈的原理.  
   
  /cn/  
 

都成一烂尾贴啦,   湖州的朋友还在给你们HONGBIN老总卖广告啊,   歇菜吧。

如果你的操作对象不是很大,可以使用对象克隆的方法实现



[新闻]Google推出Android Market挑战App Store
阅读(1046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~