2015-05-17 44 views
0

我正在編寫我的文本編輯器,我已完成,但我仍然有這個問題,我正試圖解決。德爾福7:使用刪除程序後的格式更改

我的問題是,我想刪除行的末尾的特定符號,這是通過按speedbutton(按鈕是關閉)創建的。所以,當我再次點擊按鈕(按鈕是),我想刪除它們,這是可行的,但我有問題的文本格式。

文本通過屬性RichEdit1.SelAttributes進行格式化。

如果我在RichEdit中更改第一個字符的格式,然後使用此函數,則整個文本將更改爲與此字符相同的格式。

你可以在這裏看到:

screenshot

如果我的文字更改字符格式的地方,然後我用這個功能,格式化字符變回以前的格式。

你可以在這裏看到:

screenshot

if (Button.Down=false) and (length(RichEdit1.Text)<>0) then begin     
    for i:=0 to length(RichEdit1.text) do begin 

    if RichEdit1.Text[i] = '¶' then begin            
    txt:=RichEdit1.text; 
    delete(txt, i, 1); 
    RichEdit1.Text:=txt; 
    end; 
    end; 
RichEdit1.SelStart:=length(RichEdit1.Text); 

我想,這個問題可能是可變txt,但如果我拿走刪除程序,格式化工作正常,那麼問題應該在那裏。

這項工作已經完成,所以我不想在代碼中做任何改變,我只想知道爲什麼會發生這種情況以及可能的解決方案。

回答

3

您提取整個文本,使用Text屬性修改該字符串,然後替換整個文本。當你這樣做時,所有新文本都會被賦予選定的格式屬性。

您只需選擇想要刪除的文本,然後將其刪除,全部在豐富的編輯控件中。這避免了丟失任何特定的本地格式。以這種方式這樣做。

RichEdit1.SelStart := i; 
RichEdit1.SelLength := 1; 
RichEdit1.ClearSelection; 

小心RichEdit1.Text[i]是非常昂貴的。該代碼提取豐富的編輯控件的全部內容,然後挑選出單個字符。使用SelStartSelLengthSelText來提取子字符串會更高效。

有效的字符串索引是1Length(s)(含)。您在該範圍之外索引。

還值得注意的是,當您在文本中刪除字符時,您將更改文本的長度。因此很容易在文本的末尾訪問。實際上你現在的代碼確實如此。編譯器範圍檢查選項會在您的代碼中發現錯誤。

+0

關於範圍檢查的問題,發佈的代碼肯定不會按原樣運行,因爲它在i = 0時嘗試訪問RichEdit1.Text [i],遠在代碼到達字符串末尾之前修改或以其他方式.. – Deltics

+0

@Deltics爲什麼不能運行?越界訪問並不總是一個運行時間錯誤 –

+0

現在你已經更新了答案,問題不太明顯。以前有人認爲這個問題有可能超過了字符串的長度,並且範圍檢查會檢測到這個問題。但使用範圍檢查啓用時,第一個問題將是嘗試訪問第[0]個元素。我現在看到你已經澄清了最小索引= 1的問題。所以一切都很好。 – Deltics