Delphi深度探索_編輯器增強功能(精)_第1頁
Delphi深度探索_編輯器增強功能(精)_第2頁
免費預(yù)覽已結(jié)束,剩余13頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.word 可編輯.專業(yè).專注Delphi 深度探索-編輯器增強功能在 Delphi5 中的 Open Tools API 相對于 Delphi4 中添加了許多新特性,最大 的改變就是公開了編輯器的接口 ,這給我們提供了一個機會來增強編輯器的功能 , 下面提供了一個例子演示如何增強編輯器的功能,例子擴展了剪切刪除鍵的功能使 之能夠選擇并刪除當前光標所在處的單詞。要想實現(xiàn)上面提到的功能,我們需要實現(xiàn) lOTAKeyboardBinding 接口,類的 聲明如下:TCutCopyEnhancer = class(TNotifierObject, lOTAKeyboardBindingprivate

2、procedure BuildSelection (Con text: IOTAKeyCo ntext;publicprocedure Proc (co nst Con text: IOTAKeyCo ntext; KeyCode: TShortCut;var Bindin gResult: TKeyB indin gResult;function GetB indin gType: TBindin gType;fun ctio n GetDisplayName: stri ng;fun ctio n GetName: stri ng;procedure Bin dKeyboard(c ons

3、t Bindin gServices: IOTAKeyBi ndi ngServices;end;IOTAKeyboardBinding 接口使得用戶可以把特定功能同某些按鍵相關(guān)聯(lián),當 用戶按下對應(yīng)的按鍵時 IDE 會通知專家來提供相應(yīng)的增強功能。我們將要作的向 導可以響應(yīng)Ctrl-X 和 Ctrl-C 按鍵,使得用戶可以選擇光標所在文本,同時如果當 前沒有文本供選擇,則原有的復(fù)制粘貼功能依然有效。.word 可編輯.專業(yè).專注我們需要做的只是初始化專家從 Delphi的IDE中獲得lOTAKeyBoardServices 接口,并添加按鍵綁定。IDE 調(diào)用 BindKeyboard 方法,并

4、傳遞一個IOTAKeyBindingServices 對象,然后我們可以調(diào)用 AddKeyBinding 方法來添加按 鍵綁定。當用戶按下(Ctrl-X 和 Ctrl-C 時,Delphi 會調(diào)用 Proc 方法在這里我們可 以來重新解釋按鍵。代碼如下:procedure TCutCopyE nhan cer.Bi ndKeyboard(const Bindin gServices: IOTAKeyBi ndin gServices;begi n/快捷鍵分別是 Ctrl+X,Ctrl+CBi ndi ngServices.AddKeyB in di ng(ShortCut(Ord(C,ssCt

5、rl, Proc, nil;Bi ndi ngServices.AddKeyB in di ng(ShortCut(Ord(X,ssCtrl, Proc, nil;end;procedure TCutCopyE nhan cer.Proc(const Con text: IOTAKeyCo ntext; KeyCode: TShortCut;var Bindin gResult: TKeyB indin gResult;begi n/建立選區(qū)BuildSelection (Co ntext;.word 可編輯.專業(yè).專注/根據(jù)快捷鍵判斷相應(yīng)的操作if KeyCode = FCon trolC_

6、ShortCut the nCo ntext.EditBuffer.EditBlock.Copy(falseelseif KeyCode = FCon trolX_ShortCut the nCo ntext.EditBuffer.EditBlock.Cut(false;end;由于專家的主要功能是提供文本選擇功能,就要注意一點小問題,因為我們需 要移動編輯位置以便能夠選擇編輯器中的文本,移動時要注意不能移出一行去,如果這樣做了的話,Delphi 不會給出任何錯誤提示,我們必須要在 BuileSelection 函數(shù)中加以判斷。下面是代碼清單:程序清單-編輯器增強專家源代碼typeTCutCo

7、pyE nhancer = class(TNotifierObject, lOTAKeyboardBi ndi ngprivateprocedure BuildSelection (Con text: IOTAKeyCo ntext;publicprocedure Proc(c onst Con text:IOTAKeyC on text;KeyCode:TShortCut;var Bin di ngResult: TKeyBi ndin gResult;function GetB indin gType: TBindin gType;.word 可編輯.專業(yè).專注fun ctio n Get

8、DisplayName: stri ng;fun ctio n GetName: stri ng;procedure Bin dKeyboard(c onst Bindin gServices: lOTAKeyBi ndi ngServices;end;procedure Register;varBinding : TCutCopyE nhan cer;begi nBi nding := TCutCopyE nhan cer.Create;Borla ndlDEServices.Queryl nterface (IOTAKeyBoardServices,OTAKeyBoardServices;

9、OTAKeyBoardServices .A ddKeyboardBi ndi ng(Bi nding;end;procedure TCutCopyE nhan cer.Bi ndKeyboard(const Bindin gServices: IOTAKeyBi ndin gServices;begi nBi ndin gServices.AddKeyB in di ng(ShortCut(Ord(C, ssCtrl, Proc, nil;Bi ndin gServices.AddKeyB in di ng(ShortCut(Ord(C, ssCtrl, Proc, nil;end;proc

10、edure TCutCopyE nhan cer.Proc(.word 可編輯.專業(yè).專注const Con text: lOTAKeyCo ntext; KeyCode: TShortCut;var Bindin gResult: TKeyB indin gResult;begi nBuildSelection (Co ntext;if KeyCode = FCon trolC_ShortCut the nCo ntext.EditBuffer.EditBlock.Copy(falseelseif KeyCode = FCon trolX_ShortCut the nCo ntext.Edi

11、tBuffer.EditBlock.Cut(false;end;procedure TCutCopyE nhan cer.BuildSelectio n(Con text: IOTAKeyC on text; varEditBlock : IOTAEditBlock;EditBuffer : IOTAEditBuffer;EditPosition: IOTAEditPosition;Origin alColu mn : in teger;StartPos, En dPos : in teger;ThisRow : in teger;LastColu mn : in teger;begi n.w

12、ord 可編輯.專業(yè).專注EditBuffer := Con text.EditBuffer;EditBlock := EditBuffer.EditBlock;EditPosition := EditBuffer.EditPositio n;OriginalColumn := EditPosition.Column;ThisRow := EditPositio n.Row;/如果現(xiàn)在還沒有任何選區(qū),并且光標處于文本中if (EditBlock.Size = 0 and (not EditPosition.lsWhiteSpace then begi n/記錄最后一列的列號EditPositi

13、o n.MoveEOL;LastColumn := EditPosition.Column;EditPositio n.Move (ThisRow, Origi nalColu mn;StartPos := Origi nalColu mn;/找到要復(fù)制的文本的開頭while n ot EditPositio n.lsWhiteSpace dobegi ndec (StartPos;.word 可編輯.專業(yè).專注if StartPos = 0 the nbreak;EditPositio n.Move (ThisRow,StartPos;end;Inc (StartPos, 1;EditPos

14、itio n.Move (ThisRow,StartPos;/找到要復(fù)制的文本的末尾/可能會越過最后一列,所以要檢查我們已經(jīng)獲得的最后一列值StartPos + 1;EditPositio n.Move (ThisRow, En dPos;while EditPositio n.Character dobegi ninc (En dPos;EditPositio n.Move (ThisRow, En dPos;if En dPos = LastColu mn the nbreak;end;/選擇位于 StartPos 和 EndPos 之間的文本EditBlock.Begi nBlock;E

15、n dPos :=.word 可編輯.專業(yè).專注EditPositio n.Move (ThisRow,StartPos;EditBlock.Exte nd (ThisRow, En dPos;end;end;下面的例子則可以排序編輯器中選定的部分內(nèi)容。代碼如下:排序當前源碼編輯器中的被選源碼in terface/排序當前文件中被選的部分procedure SortSelect ion;impleme ntati onuses Win dows, Classes, SysUtils, ToolsAPI;resourcestri ngsCloseViews =關(guān)閉全部視圖,只留一個;type/記

16、錄每一行文本在緩沖區(qū)的位置/ 一個 Edit writer 的位置是相對于原始文件的/在修改被排序的文本前,記錄原始的位置是很重要的TPos = classprivateunit NewSort;.word 可編輯.專業(yè).專注fLeft, fRight: Longlnt;publiccon structor Create(Left, Right: Longlnt;property Left: Longlnt read fLeft;property Right: Longlnt read fRight;end;TPosList = class(TListpublicprocedure AddPo

17、s(Left, Right: Longlnt;destructor Destroy; override;end;TPoscon structor TPos.Create(Left, Right: In teger;begi nin herited Create;fLeft := Left;fRight := Right;end; TPosList .word 可編輯.專業(yè).專注procedure TPosList.AddPos(Left, Right: Longlnt; begi ninherited Add(TPos.Create(Left, Right;end;destructor TPo

18、sList.Destroy;varI: In teger;Obj: TObject;begi nfor I := 0 to Cou nt-1 dobegi nObj := Selfl;Selfl := n il;Obj.Free;end;in herited;end;/排序是通過提取每行中的被選文本,/對其排序然后替換原來的文本procedure SortColu mn s(c onst Editor: lOTASourceEditor; const View:.word 可編輯.專業(yè).專注lOTAEditView; varTopLeft: TOTAEditPos;BottomRight: T

19、OTAEditPos;Left, Right: TOTAEditPos;LeftChar, RightChar: TOTACharPos;LeftPos, RightPos: Lon gI nt;Reader: IOTAEditReader;Writer: IOTAEditWriter;Text: stri ng;Strin gs: TStri ngList;PosList: TPosList;Line: Longlnt;I: In teger;begi n/獲得被選區(qū)域的頂角TopLeft := TOTAEditPos(Editor.BlockStart;BottomRight := TOT

20、AEditPos(Editor.BlockAfter;Strings := TStri ngList.Create;try.word 可編輯.專業(yè).專注PosList := TPosList.Create;try/獲得被選的文本Reader := Editor.CreateReader;Left.Col := TopLeft.Col;Right.Col := BottomRight.Col;for Line := TopLeft.Line to BottomRight.Line do begi n/轉(zhuǎn)換當前行的編輯位置為緩沖區(qū)位置Left. Li ne := Li ne;Right. Li n

21、e := Li ne;View.Co nvertPos(True, Left, LeftChar;View.Co nvertPos(True, Right, RightChar;/包括位于 Rightchar 上的字符In c(RightChar.Charl ndex;LeftPos := View.CharPosToPos(LeftChar;RightPos := View.CharPosToPos(RightChar;SetLe ngth(Text, RightPos - LeftPos;Reader.GetText(LeftPos, PChar(Text, Le ngth(Text;/如

22、果文本包括了換行符,刪除換行符.word 可編輯.專業(yè).專注while (Length(Text 0 and (TextLength(Text in #13, #10 do beginDelete(Text, Le ngth(Text, 1;Dec(RightPos;end;Stri ngs.Add(Text;PosList.AddPos(LeftPos, RightPos;end;Reader := n il;/現(xiàn)在開始排序Stri ngs.Sort;/然后一行行的寫排序好的文本W(wǎng)riter := Editor.CreateU ndoableWriter;I := 0;for Line :=

23、 TopLeft.Line to BottomRight.Line dobegi nwith TPos(PosListI dobegin Writer.CopyTo(Left; Writer.DeleteTo(Right; end;Writer.I nsert(PChar(Stri ngsl; I nc(I; end; Writer := n il; fin ally PosList.Free; end; fin allyStri ngs.Free; end; / 設(shè)定光標到排好序的文本開頭 View.CursorPos := TopLeft; /確保排好序的第一行文本是可見的/若不可見,可以

24、滾動編輯窗口 if (TopLeft.L ine = View.TopPos.L ine + View.ViewSize.CYthen View.TopPos := TopLeft; /選擇新的被插入的排好序的文本 Editor.BlockVisible := False; Editor.BlockType := btColum n;Editor.BlockStart := TOTACharPos(TopLeft; Editor.BlockAfter :=TOTACharPos(BottomRight; Editor.BlockVisible := True; end; / 按行排序 proc

25、edureSortLi nes(c onst Editor: IOTASourceEditor; const View: IOTAEditView;var BlockStart: TOTACharPos; BlockAfter: TOTACharPos; StartPos, En dPos: Longlnt;Reader: IOTAEditReader; Writer: IOTAEditWriter; TopPos, CursorPos: TOTAEditPos;Text: stri ng; Stri ngs: TStri ngList; begi n /獲得被選文本范圍BlockStart

26、:= Editor.BlockStart; BlockAfter := Editor.BlockAfter; / 排序全部行 修 改對應(yīng)的位置 BlockStart.CharIndex := 0; if BlockAfter.CharIndex 0 then begin / 通過設(shè)定BlockAfter 位置來選擇整行 BlockAfter.CharIndex := 0;In c(BlockAfter.L ine; end; / 轉(zhuǎn)換字符位置為緩沖區(qū)位置StartPos := View.CharPosToPos(BlockStart; En dPos :=View.CharPosToPos(B

27、lockAfter; / 獲得被選擇的文本 Reader := Editor.CreateReader;SetLe ngth(Text, En dPos - StartPos - 1; Reader.GetText(StartPos, PChar(Text, Length(Text; Reader := n il; / 使用 TstringList 來排序文本,主要是因為比較簡單 Strings :=TStringList.Create; try Stri ngs.Text := Text; Stri ngs.Sort; Text := Stri ngs.Text; fin allyStrin

28、 gs.Free; end; / 替換文本為排好序的文本 Writer := Editor.CreateU ndoableWriter;Writer.CopyTo(StartPos; Writer.DeleteTo(E ndPos; Writer.I nsert(PChar(Text; Writer :=n il; /設(shè)定光標到排序后文本的開頭 View.Co nvertPos(False, CursorPos,BlockStart; View.CursorPos := CursorPos; /確保排好序的第一行文本是可見的/ 若不可見,可以滾動編輯窗口 if (BlockStart.Line = View.TopPos.L ine + View.ViewSize.CY then beginView.Co nv ertPos(False, TopPos, BlockStart; View.TopPos := TopPos; end; / 選擇 新.word 可編輯.專業(yè).專注插入的排好序的文本 Editor.BlockVisible := False; Editor.BlockType := btNo nln clusi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論