關於圖形編輯軟體undo與redo的編程實現(用c++builder或delphi如何編程 ??)

來源:互聯網
上載者:User
關於圖形編輯軟體undo與redo的編程實現(用c++builder或delphi如何編程 ??) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiMultimedia/html/delphi_2006120713533775.html
各位高手:   大家好!  
   
        幾乎所有的圖形編輯軟體都有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不是培養懶蟲的搖籃。  
  =================================================================================  
  老弟說的好!你就是給了他完整的例子,也不知道那天給你分。我在樓主另一帖給了較完整的例子,也沒見說正確與否,更不見樓主有接帖的意思,沒意思。所以我現在回帖前總是搜尋一下發帖人是否有老帖未接的,如果問題基本解決樓主不接帖的,我就是知道也不回帖的。  
   
  見樓主另一帖:  
   
  http://community.csdn.net/Expert/topic/5185/5185934.xml?temp=.7544062

不好意思,   由於事物繁忙,   一些文章忘看,   大家不要見怪!   現在我看看上述貼子,   如問題解決,  
  馬上給分,   結帖.

蹭分!!:)

什麼人都有的

結帖是美得

向量圖形引擎TCAD   xp   (CAD   組件)    
  詳細資料請看:  
  http://www.codeidea.com  
 

使用堆棧的原理.  
   
  http://www.codeidea.com/cn/  
 

都成一爛尾貼啦,   湖州的朋友還在給你們HONGBIN老總賣廣告啊,   歇菜吧。

如果你的操作對象不是很大,可以使用對象複製的方法實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.