• <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>

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

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

              實(shí)際上有個(gè)最簡(jiǎn)單的解決辦法。有幾點(diǎn)要先注意到的:

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

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

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

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



              以上是個(gè)人看法。可以找一些開(kāi)源的編輯器程序來(lái)看它們的源碼,實(shí)際上UNDO/REDO功能大部分時(shí)候都是用在編輯器中。。。  回復(fù)  更多評(píng)論   
            • # re: 有沒(méi)有在具體項(xiàng)目中作過(guò)UNDO/REDO的高手, 給提點(diǎn)建議.
              moonriver
              Posted @ 2005-09-23 11:07
              謝謝!

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

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

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

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

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

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

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

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

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

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


            統(tǒng)計(jì)

            国产精品99久久久久久www| 久久国产三级无码一区二区| 日本WV一本一道久久香蕉| 久久久久久久免费视频| 久久毛片一区二区| 久久99国产综合精品免费| 久久久免费观成人影院| 亚洲AV日韩AV天堂久久| 久久精品国产亚洲精品| 亚洲精品tv久久久久久久久| 国产精品欧美久久久天天影视| 久久精品国产亚洲AV不卡| 少妇精品久久久一区二区三区| 国产亚洲欧美成人久久片| 久久99这里只有精品国产| 国产V综合V亚洲欧美久久| 亚洲国产香蕉人人爽成AV片久久| 日韩精品久久无码中文字幕 | 久久天天躁狠狠躁夜夜2020老熟妇 | 精品久久久久久无码免费| 久久亚洲日韩精品一区二区三区| 国产精品九九久久免费视频 | 久久电影网| 久久超碰97人人做人人爱| 伊人久久大香线蕉综合热线| 99国产精品久久久久久久成人热| 九九精品久久久久久噜噜| 国产毛片久久久久久国产毛片 | 国产成人久久精品一区二区三区| 7国产欧美日韩综合天堂中文久久久久 | 亚洲AV无码成人网站久久精品大| 天堂无码久久综合东京热| 久久99精品国产99久久6| 91久久成人免费| 99久久免费只有精品国产| 波多野结衣中文字幕久久 | 一级做a爰片久久毛片16| 久久久精品免费国产四虎| 99精品久久精品| 久久青青草原综合伊人| 色综合合久久天天综合绕视看 |