關於圖形編輯軟體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老總賣廣告啊, 歇菜吧。
如果你的操作對象不是很大,可以使用對象複製的方法實現