C++ Forever
my feeling and C++'s
posts - 5, comments - 12, trackbacks - 0, articles - 0
导航
C++博客
首页
新随笔
联系
聚合
管理
<
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: 有关一个Redo和Undo的一个框架
微软有个Undo接口,按照这个接口实现应该好一些,毕竟经过实践了的。
--万连文
2. re: 有关一个Redo和Undo的一个框架
@梦在天涯
前一个我是用模板做的,不是很好,逻辑上有问题
--HYin
3. re: 有关一个Redo和Undo的一个框架
好东东!超有用啊!
如果更模块化下会更好啊,以后让大家都可以用哦!
--梦在天涯
4. re: 有关一个Redo和Undo的一个框架[未登录]
评论内容较长,点击标题查看
--NAME
5. re: 有关一个Redo和Undo的一个框架
不错,学习了!
--cexer
阅读排行榜
1. 使用QTcpSocket实现FTP客户端的一个beta1.0版本(Qt4.3)(5994)
2. C语言中strtok与strpbrk的区别(转)(5492)
3. 有关一个Redo和Undo的一个框架(2514)
4. 为什么在QRubberBand出现问题(1614)
5. 原来最好的就是最简单的(637)
评论排行榜
1. 有关一个Redo和Undo的一个框架(5)
2. C语言中strtok与strpbrk的区别(转)(4)
3. 使用QTcpSocket实现FTP客户端的一个beta1.0版本(Qt4.3)(2)
4. 原来最好的就是最简单的(1)
5. 为什么在QRubberBand出现问题(0)
有关一个Redo和Undo的一个框架
Posted on 2008-07-08 15:00
HYin
阅读(2514)
评论(5)
编辑
收藏
引用
前不久看了 敏捷软件开发 原则、模式与实践,有点想法,所以就把我以前写得一个RedoUndo的框架改了一下,成了下面的情况。
我将操作RedoUndo的模块的接口独立了出来,这样在将来的扩展上就不会有太大的困难,并且将他独立与显示模块很大程度上避免了耦合。
在使用的时候可以有选择的使用RedoUndo的功能,如果某个工具需要RedoUndo的功能则直接继承与TransactionCommand即可。这样避免了冗余,在一些工具中不用承担一些不需要的永远不会用到的方法。
RedoUndo模块是使用标准的C++写的,为了测试这个模块我使用了Qt库,用于图形显示,这样产生了一个新的模块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: 有关一个Redo和Undo的一个框架
回复
更多评论
2008-07-09 09:22 by
cexer
不错,学习了!
#
re: 有关一个Redo和Undo的一个框架[未登录]
回复
更多评论
2008-07-09 16:46 by
NAME
http://topic.csdn.net/u/20080709/16/7e145829-588c-4962-9a95-bd784becb120.html
#
re: 有关一个Redo和Undo的一个框架
回复
更多评论
2008-07-10 23:02 by
梦在天涯
好东东!超有用啊!
如果更模块化下会更好啊,以后让大家都可以用哦!
#
re: 有关一个Redo和Undo的一个框架
回复
更多评论
2008-07-12 22:11 by
HYin
@梦在天涯
前一个我是用模板做的,不是很好,逻辑上有问题
#
re: 有关一个Redo和Undo的一个框架
回复
更多评论
2008-07-12 23:37 by
万连文
微软有个Undo接口,按照这个接口实现应该好一些,毕竟经过实践了的。
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © HYin