青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
C++ Forever
my feeling and C++'s
posts - 5, comments - 12, trackbacks - 0, articles - 0
導(dǎo)航
C++博客
首頁
新隨筆
聯(lián)系
聚合
管理
<
2008年7月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(1)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2008年7月 (1)
2008年6月 (2)
2008年5月 (1)
2008年4月 (1)
friends
楊鵬
搜索
最新評論
1.?re: 有關(guān)一個Redo和Undo的一個框架
微軟有個Undo接口,按照這個接口實現(xiàn)應(yīng)該好一些,畢竟經(jīng)過實踐了的。
--萬連文
2.?re: 有關(guān)一個Redo和Undo的一個框架
@夢在天涯
前一個我是用模板做的,不是很好,邏輯上有問題
--HYin
3.?re: 有關(guān)一個Redo和Undo的一個框架
好東東!超有用啊!
如果更模塊化下會更好啊,以后讓大家都可以用哦!
--夢在天涯
4.?re: 有關(guān)一個Redo和Undo的一個框架[未登錄]
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--NAME
5.?re: 有關(guān)一個Redo和Undo的一個框架
不錯,學(xué)習(xí)了!
--cexer
閱讀排行榜
1.?使用QTcpSocket實現(xiàn)FTP客戶端的一個beta1.0版本(Qt4.3)(6065)
2.?C語言中strtok與strpbrk的區(qū)別(轉(zhuǎn))(5548)
3.?有關(guān)一個Redo和Undo的一個框架(2571)
4.?為什么在QRubberBand出現(xiàn)問題(1652)
5.?原來最好的就是最簡單的(669)
評論排行榜
1.?有關(guān)一個Redo和Undo的一個框架(5)
2.?C語言中strtok與strpbrk的區(qū)別(轉(zhuǎn))(4)
3.?使用QTcpSocket實現(xiàn)FTP客戶端的一個beta1.0版本(Qt4.3)(2)
4.?原來最好的就是最簡單的(1)
5.?為什么在QRubberBand出現(xiàn)問題(0)
有關(guān)一個Redo和Undo的一個框架
Posted on 2008-07-08 15:00
HYin
閱讀(2571)
評論(5)
編輯
收藏
引用
前不久看了 敏捷軟件開發(fā) 原則、模式與實踐,有點(diǎn)想法,所以就把我以前寫得一個RedoUndo的框架改了一下,成了下面的情況。
我將操作RedoUndo的模塊的接口獨(dú)立了出來,這樣在將來的擴(kuò)展上就不會有太大的困難,并且將他獨(dú)立與顯示模塊很大程度上避免了耦合。
在使用的時候可以有選擇的使用RedoUndo的功能,如果某個工具需要RedoUndo的功能則直接繼承與TransactionCommand即可。這樣避免了冗余,在一些工具中不用承擔(dān)一些不需要的永遠(yuǎn)不會用到的方法。
RedoUndo模塊是使用標(biāo)準(zhǔn)的C++寫的,為了測試這個模塊我使用了Qt庫,用于圖形顯示,這樣產(chǎn)生了一個新的模塊DrawTransaction。
1
/**/
/*
**********************************************************************
2
* \file TransactionCommand.h
3
* \date 2008-07-06
4
* \author HYin
5
*********************************************************************
*/
6
7
#ifndef TRANSACTIONCOMMAND_H
8
#define
TRANSACTIONCOMMAND_H
9
10
namespace
hy
11
{
12
class
TransactionCommand
13
{
14
public
:
15
TransactionCommand();
16
virtual
~
TransactionCommand();
17
18
virtual
bool
redo()
=
0
;
19
virtual
bool
undo()
=
0
;
20
21
}
;
22
}
23
24
#endif
25
1
/**/
/*
**********************************************************************
2
* \file RedoUndo.h
3
* \date 2008-07-06
4
* \author HYin
5
*********************************************************************
*/
6
7
#ifndef REDOUNDOTOOL_H
8
#define
REDOUNDOTOOL_H
9
10
//
---------------------------------------------------------------------------------------------------------------
11
#include
"
TransactionCommand.h
"
12
#include
<
vector
>
13
//
---------------------------------------------------------------------------------------------------------------
14
15
namespace
hy
16
{
17
class
TransactionCommand;
18
19
class
RedoUndoTool :
public
TransactionCommand
20
{
21
typedef TransactionCommand Command;
22
public
:
23
explicit
RedoUndoTool(
int
depth
=
10
);
24
25
void
setDepth(
int
depth )
26
{ m_iRedoUndoDepth
=
depth; }
27
28
void
add( Command
*
command );
29
30
void
clear()
31
{ m_aCommandStack.clear(); }
32
33
virtual
bool
redo();
34
virtual
bool
undo();
35
36
private
:
37
//
depth for undo transaction
38
int
m_iRedoUndoDepth;
39
40
//
current step
41
int
m_iCurrentStep;
42
43
//
Command stack to store
44
std::vector
<
Command
*
>
m_aCommandStack;
45
46
}
;
47
48
}
49
50
#endif
51
1
/**/
/*
**********************************************************************
2
* \file RedoUndo.cpp
3
* \date 2008-07-06
4
* \author HYin
5
*********************************************************************
*/
6
7
//
---------------------------------------------------------------------------------------------------------------
8
#include
"
RedoUndoTool.h
"
9
#include
<
iostream
>
10
#include
<
assert.h
>
11
using
namespace
std;
12
//
---------------------------------------------------------------------------------------------------------------
13
14
//
---------------------------------------------------------------------------------------------------------------
15
#define
hy_assert_error(str) { std::cerr << str << endl; assert(false); }
16
#define
hy_assert_warning(str) { std::cout << str << endl; }
17
//
---------------------------------------------------------------------------------------------------------------
18
19
namespace
hy
20
{
21
RedoUndoTool::RedoUndoTool(
int
depth )
22
: m_iRedoUndoDepth(depth), m_iCurrentStep(
-
1
)
23
{
24
m_aCommandStack.clear();
25
}
26
27
void
RedoUndoTool::add( RedoUndoTool::Command
*
command )
28
{
29
int
num
=
m_aCommandStack.size();
30
31
if
( m_iCurrentStep
==
num
-
1
||
m_iCurrentStep
==
-
1
)
32
{
33
m_aCommandStack.push_back(command);
34
m_iCurrentStep
++
;
35
}
36
else
if
( m_iCurrentStep
<
num
-
1
)
37
{
38
m_aCommandStack.erase(
39
m_aCommandStack.begin()
+
m_iCurrentStep
+
1
, m_aCommandStack.end()
40
);
41
m_aCommandStack.push_back(command);
42
m_iCurrentStep
++
;
43
}
44
else
45
{
46
hy_assert_error(
"
error : RedoUndoTool::add( const RedoUndoTool::Command & command ) :
"
47
<<
"
invalid m_iCurrentStep
"
);
48
}
49
50
//
keep the depth
51
num
=
m_aCommandStack.size();
52
if
( num
>
m_iRedoUndoDepth )
53
{
54
m_aCommandStack.erase( m_aCommandStack.begin(),
55
m_aCommandStack.begin()
+
num
-
m_iRedoUndoDepth );
56
m_iCurrentStep
=
m_iRedoUndoDepth
-
1
;
57
}
58
}
59
60
bool
RedoUndoTool::redo()
61
{
62
int
num
=
m_aCommandStack.size();
63
if
( m_iCurrentStep
==
num
-
1
)
64
{
65
hy_assert_warning(
"
warning : RedoUndoTool::redo() :
"
66
<<
"
out of range: default to return directively!!
"
);
67
}
68
else
if
( m_iCurrentStep
<
num
-
1
&&
m_iCurrentStep
>=
-
1
)
69
{
70
return
m_aCommandStack[
++
m_iCurrentStep]
->
redo();
71
}
72
else
73
{
74
hy_assert_error(
"
error : RedoUndoTool::redo() :
"
75
<<
"
invalid m_iCurrentStep
"
);
76
}
77
return
false
;
78
}
79
80
bool
RedoUndoTool::undo()
81
{
82
int
num
=
m_aCommandStack.size();
83
if
( m_iCurrentStep
==
-
1
)
84
{
85
hy_assert_warning(
"
warning : RedoUndoTool::undo() :
"
86
<<
"
out of range: default to return directively!!
"
);
87
}
88
else
if
( m_iCurrentStep
<=
num
-
1
&&
m_iCurrentStep
>
-
1
)
89
{
90
return
m_aCommandStack[m_iCurrentStep
--
]
->
undo();
91
}
92
else
93
{
94
hy_assert_error(
"
error : RedoUndoTool::undo() :
"
95
<<
"
invalid m_iCurrentStep
"
);
96
}
97
return
false
;
98
}
99
100
}
101
這是顯示模塊,在這里只顯示接口
1
/**/
/*
**********************************************************************
2
* \file DrawTransaction.h
3
* \date 2008-07-07
4
* \author HYin
5
*********************************************************************
*/
6
7
#ifndef DRAWTRANSACTION_H
8
#define
DRAWTRANSACTION_H
9
10
//
---------------------------------------------------------------------------------------------------------------
11
//
---------------------------------------------------------------------------------------------------------------
12
13
namespace
hy
14
{
15
class
DrawTransaction
16
{
17
public
:
18
DrawTransaction();
19
virtual
~
DrawTransaction();
20
21
virtual
void
draw()
=
0
;
22
}
;
23
}
24
25
#endif
26
Feedback
#
re: 有關(guān)一個Redo和Undo的一個框架
回復(fù)
更多評論
2008-07-09 09:22 by
cexer
不錯,學(xué)習(xí)了!
#
re: 有關(guān)一個Redo和Undo的一個框架[未登錄]
回復(fù)
更多評論
2008-07-09 16:46 by
NAME
http://topic.csdn.net/u/20080709/16/7e145829-588c-4962-9a95-bd784becb120.html
#
re: 有關(guān)一個Redo和Undo的一個框架
回復(fù)
更多評論
2008-07-10 23:02 by
夢在天涯
好東東!超有用啊!
如果更模塊化下會更好啊,以后讓大家都可以用哦!
#
re: 有關(guān)一個Redo和Undo的一個框架
回復(fù)
更多評論
2008-07-12 22:11 by
HYin
@夢在天涯
前一個我是用模板做的,不是很好,邏輯上有問題
#
re: 有關(guān)一個Redo和Undo的一個框架
回復(fù)
更多評論
2008-07-12 23:37 by
萬連文
微軟有個Undo接口,按照這個接口實現(xiàn)應(yīng)該好一些,畢竟經(jīng)過實踐了的。
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
【推薦】100%開源!大型工業(yè)跨平臺軟件C++源碼提供,建模,組態(tài)!
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © HYin
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产一级揄自揄精品视频
|
久久亚洲精品网站
|
欧美日韩一区自拍
|
亚洲一区二区三区中文字幕在线
|
亚洲狼人综合
|
国产精品极品美女粉嫩高清在线
|
一区二区三区四区国产
|
国产精品久久999
|
久久九九国产精品
|
蜜臀av国产精品久久久久
|
日韩手机在线导航
|
午夜精品久久久久久久久久久久久
|
欧美在线精品免播放器视频
|
欧美一区亚洲
|
亚洲日本成人女熟在线观看
|
一本色道久久
|
黄色精品一区二区
|
亚洲日本一区二区
|
国产麻豆综合
|
欧美黑人一区二区三区
|
国产精品剧情在线亚洲
|
久久久精品久久久久
|
欧美精品一区二区三区在线看午夜
|
国产色产综合色产在线视频
|
欧美+日本+国产+在线a∨观看
|
欧美精品久久久久a
|
欧美va亚洲va国产综合
|
亚洲午夜小视频
|
久久精品在线播放
|
亚洲自拍都市欧美小说
|
久久亚洲精品伦理
|
欧美一区亚洲二区
|
欧美精品1区
|
久久久爽爽爽美女图片
|
欧美日韩国产综合视频在线
|
久久婷婷色综合
|
欧美丝袜第一区
|
欧美激情精品久久久
|
国产欧美一区二区三区另类精品
|
亚洲国产美女久久久久
|
国产一区深夜福利
|
一区二区三区四区五区精品视频
|
亚洲国产精品免费
|
久久精彩免费视频
|
欧美一区二区成人
|
欧美三级午夜理伦三级中文幕
|
免费欧美电影
|
国内精品久久久久影院色
|
亚洲综合二区
|
亚洲欧美不卡
|
欧美日韩在线观看一区二区三区
|
欧美11—12娇小xxxx
|
好吊视频一区二区三区四区
|
亚洲与欧洲av电影
|
亚洲欧美国产精品桃花
|
欧美日韩在线免费观看
|
亚洲美女精品久久
|
99精品国产在热久久婷婷
|
欧美aⅴ一区二区三区视频
|
久久蜜桃精品
|
黑丝一区二区三区
|
久久精品国产精品亚洲
|
久久久久欧美精品
|
国产主播喷水一区二区
|
久久超碰97人人做人人爱
|
久久久精品国产免大香伊
|
久久午夜精品一区二区
|
毛片一区二区三区
|
在线免费精品视频
|
蜜臀av一级做a爰片久久
|
欧美激情女人20p
|
亚洲乱码国产乱码精品精98午夜
|
欧美国产综合
|
99在线精品视频
|
午夜在线电影亚洲一区
|
国产日韩欧美在线播放不卡
|
久久都是精品
|
欧美凹凸一区二区三区视频
|
亚洲精品一区中文
|
欧美午夜在线一二页
|
亚洲免费一区二区
|
巨乳诱惑日韩免费av
|
亚洲精品日产精品乱码不卡
|
欧美精品系列
|
午夜国产精品视频免费体验区
|
久久久最新网址
|
亚洲人成人一区二区在线观看
|
欧美日韩ab
|
午夜欧美电影在线观看
|
免费在线观看一区二区
|
99精品视频免费在线观看
|
国产精品扒开腿爽爽爽视频
|
伊人久久久大香线蕉综合直播
|
久久久久久久91
|
亚洲国产日韩欧美综合久久
|
亚洲免费人成在线视频观看
|
国内视频精品
|
欧美日韩免费观看一区三区
|
羞羞色国产精品
|
亚洲国产高清一区二区三区
|
亚洲综合视频网
|
在线日韩av片
|
国产精品日韩一区
|
你懂的一区二区
|
在线一区欧美
|
亚洲国产精品va在看黑人
|
欧美一区二区三区视频免费播放
|
亚洲国产成人久久综合一区
|
国产精品久久国产精品99gif
|
欧美日韩国产成人高清视频
|
欧美在现视频
|
99综合视频
|
欧美成人久久
|
久久久激情视频
|
亚洲主播在线播放
|
亚洲国产另类久久精品
|
国产日韩欧美日韩
|
国产精品海角社区在线观看
|
欧美成人精品
|
久久久久久亚洲精品杨幂换脸
|
亚洲视频一区二区
|
亚洲国产婷婷香蕉久久久久久99
|
久久九九免费视频
|
午夜精品久久久久久99热
|
亚洲精品日产精品乱码不卡
|
怡红院精品视频在线观看极品
|
国产精品一区免费在线观看
|
欧美日韩一区二区在线观看视频
|
噜噜噜久久亚洲精品国产品小说
|
欧美一区免费
|
亚洲女同精品视频
|
一区二区三区日韩精品
|
亚洲另类在线一区
|
亚洲精品国精品久久99热
|
亚洲大片在线
|
亚洲国产精品va
|
最新高清无码专区
|
亚洲成人在线网
|
欧美大片免费看
|
欧美成人伊人久久综合网
|
久久综合九色综合久99
|
久久久久久网站
|
麻豆成人91精品二区三区
|
久久午夜av
|
欧美 日韩 国产精品免费观看
|
久久影视三级福利片
|
老司机精品视频网站
|
狂野欧美激情性xxxx欧美
|
噜噜噜噜噜久久久久久91
|
免费观看在线综合色
|
亚洲成色777777在线观看影院
|
欧美成人精品福利
|
亚洲国产精品毛片
|
一区二区三区久久网
|
亚洲砖区区免费
|
久久黄色小说
|
男女av一区三区二区色多
|
欧美激情免费在线
|
国产精品多人
|
国产一区二区三区黄
|
亚洲高清成人
|
亚洲午夜久久久久久久久电影院
|
一本一本久久
|
亚洲欧美在线看
|
久久超碰97人人做人人爱
|
欧美在线www
|
美乳少妇欧美精品
|
亚洲精品视频一区
|
亚洲综合日韩
|
蜜桃av综合
|
欧美日韩国产美
|
国产一区二区三区久久久久久久久
|
在线成人中文字幕
|
亚洲一区二区三区免费在线观看
|
欧美一区二区在线免费播放
|
欧美成人自拍
|
亚洲午夜久久久久久久久电影网
|
久久se精品一区精品二区
|
欧美黄色一区
|
国产一区二区三区四区五区美女
|
亚洲精品日韩在线
|
久久久久久网址
|
99pao成人国产永久免费视频
|
欧美在线看片a免费观看
|
欧美激情视频一区二区三区在线播放
|
欧美午夜精品理论片a级按摩
|
国产精品久久久久av
|
在线观看av不卡
|
午夜精品999
|
亚洲日本在线观看
|
久久久女女女女999久久
|
国产精品毛片一区二区三区
|
亚洲精品激情
|
久久视频一区二区
|
亚洲女性裸体视频
|
欧美日韩亚洲天堂
|
亚洲三级影院
|
男女av一区三区二区色多
|
午夜精品久久久久影视
|
欧美日韩一卡二卡
|