您正在試圖調用System.Delete(),這需要一個參照string變量作為輸入。但TMemo.Text是屬性(使用getter方法),它不是變量。這就是為什麼你得到“不能作為var參數傳遞”的錯誤。
您可以使用一個臨時變量,例如:
var
s: string;
s := Memo.Text;
Delete(s, index, count);
Memo.Text := s;
但是,這是一般的效率非常低,因為它使記憶體中的備注的目前内容的完整拷貝,然後修改/重新配置設定然後将其重新配置設定給備忘錄,完全清除目前内容并解析新内容。對于小的變化,這是很多工作。
更快,更高效的選擇是使用備忘錄的SelStart/SelLength和SelText屬性,而不是,如:
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')));