作者yauhh (哟)
看板Visual_Basic
标题Re: [VB6 ] 关於记事本里的"复原"
时间Fri Jan 13 23:55:42 2012
※ 引述《rikarika (rika N )》之铭言:
: 我想做一个记事本
: 可是不知道"复原"的部分要怎麽做耶@@
: 直接接收^Z 好像不成功
: 可以麻烦大家帮帮忙吗?:)
我来回一下这个好老的post. 因为恰好最近工作有做类似的内容.
(而且我觉得学了并使用了VB的人做起系统似乎就是跟着IDE那一套,
比较少自己设计真正符合需要的系统规模. 大家是不是也觉得如此?)
我要做个编辑软体,其中有个功能是Ctrl+Z要退回上一步.
基本上要储存操作步骤,就要先定义何谓使用者操作步骤,通常会是一个结构,
但是若用VB6做个使用者自订type有点麻烦,尤其是想把这个UDT当作某个函数的
返回类型. 所以定义成class也不错. 定义了使用者操作步骤之後,接着就要理解
一组能帮你纪录操作动作,并且接受你退回上一步的那个东西,不是stack就是queue.
所以我的系统中有个历史纪录的结构是HistElement.cls
'Histelement.cls
Option Explicit
private my_action as MyAction
private page_applied as Integer
Public Sub Make(Action as MyAction, Page as Integer)
my_action = Action
page_applied = Page
End Sub
然後历史纪录是History.cls
'History.cls
Option Explicit
private my_list as Collection
private my_step as Long
Public Sub Add(History as HistElement)
Dim i as Long
For i = my_step + 1 To my_list.Count
my_list.Remove my_step + 1
Next i
my_list.Add History
my_step = my_step + 1
End Sub
Public Sub Remove(N as Long)
...
my_step = my_step - 1
Public Sub Clear()
Dim i as Long
For i = 1 To my_list
my_list.Remove 1
Next i
my_step = 0
...
Public Function Count() As Long
Count = my_step
End Function
Public Sub RollBack()
...
Public Sub GoForward()
...
Public Sub Apply(Step as Long, TargetControl as Control)
Dim history As HistElement
Set history = my_list(Step)
TargetControl.Flip history.Page
TargetControl.Do history.Action
...
这样应该很好理解,历史纪录有可能是回溯到前几个状态,此时如果再Add一些
HistElement,就会把回溯位置之後的一些纪录洗掉.
然後,系统要根据有效的历史纪录表达出目前所看得到的编辑状态,
基本上就是在呈现的技巧上. 首先系统要显示所处理的资料或档案的最原始状态,
譬如一套影像编辑软体,最开始是载入原本指定修改的那张图. 接着,是套上历史纪录.
从历史纪录的起头开始,依序让每一个HistElement所代表的指令生效.
所以,系统的主要内容区的呈现,如果写成一个Show函数,就是这样:
Public Sub Show(ContentPath as String)
Dim i as Long
ContentPanel.Src = ContentPath
ContentPanel.Show
For i = 1 to UserActionHistory.Count
UserActionHistory.Apply i, ContentPanel
Next i
...
因此History.cls会有个Apply函数,如上所述.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.160.114.218
1F:→ yauhh:至於Ctrl+Z按键,在功能表中设定即可. 01/14 00:00
2F:推 a60301:推用心 10/21 01:24