RT。
举个例子,比如我新建了一个模板。模板里面可以添加无数个图层,每个图层都有N多个操作动作。
所有图层的操作都是串行进行的,现在要实现PS里面的撤销重复功能,如下图
步骤 0 1 2 3 4 5
类型 新增layer1 新增layer2 move layer1 删除layer2 新增layer3 move layer3
那撤销时,从第5个步骤往回一步步执行
我的实现方法是,先定义一个动作命令基类,再定义一些动作命令的派生类
type
TCommand = class
private
FLayerData : TData;//对应的图层数据结构体
protected
procedure DrawLayer; virtual; abstract;
public
procedure Execute;//在这个过程中执行 DrawLayer过程
end;
//移动
TCommandMove = class
private
FLayerData : TData;
protected
procedure DrawLayer; override;
public
end;
//重画
TCommandReDraw = class
private
FLayerData : TData;
protected
procedure DrawLayer; override;
public
end;
新建的模板也有一个对应的类
TComBine = class
private
FList : TList ; //用于添加动作类
FCommand : TCommand ; //动作命令类
FCurIndex : integer; //当前执行的操作列表下标
protected
public
property Items[Index : integer] : TCommand read SetItems write GetItem;
end;
每进行一个操作,就添加在TComBine 中添加一个具体的动作命令类对象,然后让动作命令类对象去执行相应的操作
撤销和重复时,只要修改FCurIndex 属性,然后用 TCommand(items[i]).Execute;
当有撤销操作时,再新增操作,直接将当前步骤之后的动作命令类对象全部销毁,类似于PS中的功能(撤销后再操作,当前步骤之后的操作就没了)
现在出来的问题:
比如从第5撤销到第4步时,它的操作应该是将 layer3 移到新建的位置,那我具体要怎么处理?直接执行第四步的话,它会创建一个LAYER,这显然不符合要求
又或者从第4撤销到第3步时,实际操作是删除layer3,直接执行的结果是将layer2删除
可能是我的处理模式本来就有问题,不知道大家有没有什么可行的方案可分享一下?不胜感激!!