• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            在一個具體項目中想實現(xiàn)UNDO/REDO的功能, 操作的次數(shù)沒有限制, 而且數(shù)據(jù)的類型比較復(fù)雜.  如有這方面有經(jīng)驗的高手, 可否談?wù)勀闶侨绾螌崿F(xiàn)的.

            posted on 2005-09-23 08:56 moonriver 閱讀(584) 評論(5)  編輯 收藏 引用
            評論
            • # re: 有沒有在具體項目中作過UNDO/REDO的高手, 給提點建議.
              深圳夜歸人
              Posted @ 2005-09-23 10:21
              這是個很好的話題,相信很多人都考慮過,而且想過各種復(fù)雜的做法。

              實際上有個最簡單的解決辦法。有幾點要先注意到的:

              1、每個基本操作都是可以分解為添加/刪除動作的。
              2、每個UNDO/REDO動作是由一組基本的添加/刪除動作組成的,這個基本的動作本身也是一個UNDO/REDO動作。
              3、如果一個基本的UNDO動作做的工作是添加,對應(yīng)的REDO動作就是刪除。
              4、UNDO/REDO動作必須以一個順序來執(zhí)行。
              5、當(dāng)前位置處于UNDO歷史中時,一個DO動作要刪除當(dāng)前位置后面的所有UNDO動作。

              比如在文字編輯器中,輸入一段話,構(gòu)成一個“添加字符串”動作。刪除一段話,構(gòu)成一個“刪除字符串”動作。它們在動作歷史中,只需要保存發(fā)生這個動作時的一些基本環(huán)境信息。

              另一些復(fù)雜的動作,比如選擇一段文字,拖到另一個位置,可以分解為一個刪除+一個添加動作,并把這2個動作組成一個給用戶使用的UNDO/REDO動作。當(dāng)用戶UNDO時,執(zhí)行后一個添加動作的反動作即刪除動作,接著執(zhí)行前一個刪除動作的反動作即添加動作。

              設(shè)計UNDO/REDO功能,實際上就是把那些高級功能拆為最基本的添加/刪除動作。



              以上是個人看法??梢哉乙恍╅_源的編輯器程序來看它們的源碼,實際上UNDO/REDO功能大部分時候都是用在編輯器中。。。  回復(fù)  更多評論   
            • # re: 有沒有在具體項目中作過UNDO/REDO的高手, 給提點建議.
              moonriver
              Posted @ 2005-09-23 11:07
              謝謝!

              COMMAND模式似乎也是提供這樣的解決方案. 我在以前也考慮過, 但這種方法也是有些不足:

              1. 通常COMMAND模式已經(jīng)應(yīng)用到接近APPLICATION/GUI層, 在這個層面的DEVELOPER通常還是稍微差些,要求去理解底層的邏輯通常是不容易的.

              2. 考慮到COMMAND眾多, 在COMMAND中實現(xiàn)UNDO/REDO也是很麻煩的事.

              還有一點是, 個人認(rèn)為UNDO/REDO應(yīng)該是一種架構(gòu)層面的問題, 應(yīng)該從架構(gòu)角度找到解決問題的方法. 這樣一來, 至少在另一個項目中可以復(fù)用. 如依賴COMMAND, 沒辦法做到這一點.  回復(fù)  更多評論   
            • # re: 有沒有在具體項目中作過UNDO/REDO的高手, 給提點建議.
              深圳夜歸人
              Posted @ 2005-09-23 11:40
              那些東西應(yīng)該全部封裝在底層,而且你不該把這么底層的部分暴露給GUI開發(fā)人員。

              比如你提供了幾個底層的函數(shù):addChar(ch), addString(text), insertString(pos, text),moveCursor(pos)它的實現(xiàn)中都向Undo History中插入Action。

              GUI開發(fā)人員可能要定義一個功能functionA,這個功能中要調(diào)用這幾個函數(shù),并組成一個Undo動作。他們根本不需要知道你底層如何動作的,只需要簡單做這個過程:

              document->BeginAction ("插入日期和開發(fā)人員名字");
              document->addChar(...);
              docuemnt->insertString(...);
              document->...;
              document->EndAction();
              注意中間有一項失敗時,應(yīng)該調(diào)用回滾。

              EndAction()激發(fā)一個事件,通知GUI在UNDO列表中加入一項“插入日期和開發(fā)人員名字”。

              這不是我的方案,實際上我至少看到過3個編輯器源碼這么干,好像成了一個定式了。。。呵呵  回復(fù)  更多評論   
            • # re: 有沒有在具體項目中作過UNDO/REDO的高手, 給提點建議.
              moonriver
              Posted @ 2005-09-23 12:16
              謝謝, 很清楚! 我考慮試試看!  回復(fù)  更多評論   
            • # re: 有沒有在具體項目中作過UNDO/REDO的高手, 給提點建議.
              pandaxcl
              Posted @ 2006-04-21 10:54
              我是采用C++實現(xiàn)的,在我得博客里面有比較詳細(xì)的介紹,可以參考。
              我得博客:http://blog.csdn.net/pandaxcl/  回復(fù)  更多評論   

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            統(tǒng)計

            久久精品中文騷妇女内射| 久久不见久久见免费视频7| 色综合合久久天天给综看| 一级做a爰片久久毛片人呢| 97超级碰碰碰碰久久久久| 国产视频久久| 国内精品伊人久久久久av一坑| 99久久综合国产精品免费| 狠狠久久综合伊人不卡| 久久国产欧美日韩精品| 国产午夜免费高清久久影院| 日韩精品久久久久久| 国产精品无码久久综合| 一级a性色生活片久久无| 青青青伊人色综合久久| 久久精品一本到99热免费| 久久免费99精品国产自在现线| 久久午夜免费视频| 久久成人18免费网站| 精品久久久久久国产三级| 欧美噜噜久久久XXX| 久久久久亚洲AV无码永不| 久久久久久久亚洲Av无码| 久久九九兔免费精品6| 香蕉久久av一区二区三区 | 少妇被又大又粗又爽毛片久久黑人| 久久精品国产精品亚洲人人 | 国内精品人妻无码久久久影院 | 一本久道久久综合狠狠爱| 超级碰碰碰碰97久久久久| 亚洲精品乱码久久久久久中文字幕| 免费精品久久久久久中文字幕| 久久电影网| 亚洲AV无码一区东京热久久| 久久精品国产亚洲麻豆| 久久91精品国产91| 熟妇人妻久久中文字幕| 久久久久久久综合综合狠狠| 欧洲精品久久久av无码电影| 狠狠色伊人久久精品综合网| 国产人久久人人人人爽|