查詢替換RTF格式的文字時對鎖定文字的處理問題

2021-03-31 08:56:31 字數 3553 閱讀 3875

我想,做過文書處理的網友們一定不會對richtextbox控制項感到陌生。這是個封裝了幾乎所有的rtf文件的編輯顯示功能,我們可以完全基於此控制項來編寫乙個強大的文字編輯器。也許你會想,richtextbox控制項的所有功能早就在m$ word下實現了,而且人家的東東做的那麼酷,何必自己再去費神開發乙個文字編輯器呢?其實,我們寫程式並不都是為了實用性,通過做乙個程式,哪怕只是個簡單的計算器,也能學到不少知識的。何況,你居然可以用richtextbox控制項實現乙個word沒有的功能——把乙個特定的文字鎖定使在解鎖前無法對其進行任何更改~呵呵,你試過了嗎?

你一定會很滿意這個功能的,因為richtextbox可以自行阻止使用者對已鎖定的文字進行任何更改,而你不需要再新增任何多餘的**(至少大多數情況下是如此的)。但是無論控制項的功能封裝得多好,它的智商還是有限,比如當你試圖在你的軟體裡實現查詢替換文字功能時,richtextbox呆頭呆腦的特性就暴露無遺了——一旦試圖對已鎖定的文字進行替換,檔案的指標就會被強行退回到該被鎖定的文字的前乙個未鎖定的字元上,然後繼續下一步,繼續再次被退回……於是你的程式就這樣陷入了死迴圈中~呵呵,急得人一頭汗哪……

沒關係,其實我們只不過必須親自教導一下richtextbox罷了,讓它知道怎樣聰明地處理鎖定文字的替換問題。我們的目標是,能夠讓richtextbox的被保護文字不被替換並保證指標順利前進,並在替換完成後通知使用者被替換的文字有多少處以及被保護而無法替換的文字有多少處。

下面是我提供的解決方案,你可以參考一下,效率並不是很高,但是很直觀。

if myreplaceform.showdialog = dialogresult.ok then

'這兩個變數記錄要被替換的文字和替換成的文字

dim findtext as

string = myreplaceform.textboxfind.text

dim replacetext as

string = myreplaceform.textboxreplace.text

'此變數用於標記是否找到了被鎖定的文字

dim protectedthistimefound as

boolean

'此變數用於標記被替換的數量

dim replacecount as

integer

'此變數用於標記被保護的文字的數量

dim protectedcount as

integer

'以下是替換時在文件內移動的指標

dim nextpos as

integer

dim probepos as

integer

dim i as

integer

with richtextbox

if .find(findtext, findstyle) = -1 then

messagebox.show("未找到要被替換的內容!", "替換失敗", _

messageboxbuttons.ok, messageboxicon.exclamation)

myreplaceform.textboxfind.focus()

else

if findtext = replacetext then

messagebox.show("做這樣的替換是沒有意義的!", "拒絕替換",  _

messageboxbuttons.ok, messageboxicon.exclamation)

myreplaceform.textboxreplace.focus()

else

'把指標指向開頭

nextpos = 0

do'定位至第乙個待替換點

'findstyle是乙個richtextboxfinds的全域性變數,記錄的是查詢方式

'例如嚴格區分大小寫、全字查詢等等。

nextpos = .find(findtext, nextpos, findstyle)

'開始使用探測指標,一一判斷每個字元是否被鎖定

probepos = nextpos

protectedthistimefound = false

for i = 0 to findtext.length - 1

probepos = .find(findtext.substring(i, 1),  _

probepos, richtextboxfinds.none)

if .selectionprotected = true then

'看當前查詢字元是否被鎖定

'如果發現的話

protectedthistimefound = true

'發現!

protectedcount += 1             '計數

if probepos + findtext.length - i > _

richtextbox.textlength - 1 then

'如果此字串是文件末尾

exit

doelse

'不是的話

nextpos += (findtext.length - i)

exit

forend

ifend if

next i

if protectedthistimefound = false

then

'如果迴圈探測下來發現該字串未被鎖定

nextpos = .find(findtext, nextpos, findstyle)

.selectedtext = replacetext

replacecount += 1   '計數

endif

loop until .find(findtext, nextpos, findstyle) = -1

if protectedcount = 0 then

messagebox.show("統統替換完畢。總共替換了" _

& cstr(replacecount) & "處。", "替換成功", _

messageboxbuttons.ok, messageboxicon.information)

else

if replacecount <> 0 then

messagebox.show("統統替換完畢。總共替換了" _

& cstr(replacecount) & "處。" & vbcrlf & vbcrlf & _

"仍存在" & cstr(protectedcount) & _

"處文字因被鎖定而無法替換。", "替換完畢", _

messageboxbuttons.ok, messageboxicon.information)

else

messagebox.show("文中搜尋到符合替換條件的文字共" & _

protectedcount & "處,但因被鎖定而無法替換。", _

"統統替換無果", messageboxbuttons.ok,  _

messageboxicon.exclamation)

end if

end if

end if

end if

end with

end if

文字查詢替換的好幫手 文字查詢替換專家

在平時日常工作與生活中是不是需要從大量檔案中查詢或替換文字內容?如果是的話,那麼 文字查詢替換專家 軟體就能幫上你的忙。此軟體的功能特色 1 支援多目標 目錄或檔案 查詢與替換!可新增多個目標目錄或檔案,並可設定需要查詢或替換的檔案型別格式,支援萬用字元。2 支援自動識別檔案編碼!此模組採用的是li...

XCode4中的文字查詢和文字替換功能

1.如果是在開啟的文件範圍內 查詢 command f 替換 option command f replace all 是全部替換本文件範圍內的字串 replace 是替換當前字串 replace find是邊查詢邊替換 2.如果是全域性查詢和替換 查詢 點選左邊工具欄裡面的 放大鏡 按鈕 或者 s...

在設定文字的字型時,為什麼建議設定替換字型?

可以使用 font family 屬性來指定文字的字型,如下所示 font family name inherit 此時,name為首選字型的名稱。如果字型名稱有多個單詞,即中間有空格,則需要將字型名稱用一對單引號或者雙引號包圍起來。但是,如果使用者機器上並沒有安裝 name 所指定的字型,則會顯示...