2017-03-19 35 views
2

我想用程序刪除Memo.Text,指數,計數)(或類似插入)。但是我得到的消息'不能將常量對象作爲var參數傳遞'。我知道我可以選擇文字,並使用Seltext。但這種方式有點不舒服。有什麼更容易嗎?如何在備忘錄中編輯文本?

+0

都能跟得上。 Memo.Text是一個getter,而不是一個變量。 –

回答

5

Text是屬性而不是變量。而Delete需要一個變量。所以你需要使用一個臨時變量。例如

var 
    str: string; 
.... 
str := Memo1.Text; 
Delete(str, index, count); 
Memo1.Text := str; 
+1

對於問題中的案例(要修改備忘錄的文本),問題中提到的替代方案(使用seltext)更好。 api處理更改,而不是框架檢索整個文本,修改,然後重新設置。 –

+0

@Sertac同意... –

2

您正在試圖調用System.Delete(),這需要一個參照string變量作爲輸入。但TMemo.Text屬性(使用getter方法),它不是變量。這就是爲什麼你得到「不能作爲var參數傳遞」的錯誤。

可以使用一個臨時變量,例如:

var 
    s: string; 

s := Memo.Text; 
Delete(s, index, count); 
Memo.Text := s; 

但是,這是一般的效率非常低,因爲它使內存中的備註的當前內容的完整拷貝,然後修改/重新分配然後將其重新分配給備忘錄,完全清除當前內容並解析新內容。對於小的變化,這是很多工作。

更快,更高效的選擇是使用備忘錄的SelStart/SelLengthSelText屬性,而不是,如:

Memo.SelStart := index; 
Memo.SelLength := count; 
Memo.SelText := ''; 

插入新的文本時,你可以這樣做,只是設置SelLength以0代替,如:

Memo.SelStart := index; 
Memo.SelLength := 0; 
Memo.SelText := 'text to insert'; 

使用這些屬性可能會「不舒服」,但從內存和性能角度來看,它確實是一個不錯的選擇。在內部,他們只需將Win32 EM_(GET|SET|REPLACE)SEL消息直接發送到備忘錄窗口,讓操作系統處理實際的文本管理。

如果你真的想最有效的方式,直接使用Win32消息,例如:

//delete 
Memo.Perform(EM_SETSEL, index, index+count); 
Memo.Perform(EM_REPLACESEL, 0, LPARAM(PChar(''))); 

//insert 
Memo.Perform(EM_SETSEL, index, index); 
Memo.Perform(EM_REPLACESEL, 0, LPARAM(PChar('text to insert')));