Re: [VB6 ] 關於記事本裡的"復原"
※ 引述《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
→
01/14 00:00, , 1F
01/14 00:00, 1F
推
10/21 01:24, , 2F
10/21 01:24, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Visual_Basic 近期熱門文章
PTT數位生活區 即時熱門文章