我想用程序刪除(Memo.Text,指數,計數)(或類似插入)。但是我得到的消息'不能將常量對象作爲var參數傳遞'。我知道我可以選擇文字,並使用Seltext。但這種方式有點不舒服。有什麼更容易嗎?如何在備忘錄中編輯文本?
回答
Text
是屬性而不是變量。而Delete
需要一個變量。所以你需要使用一個臨時變量。例如
var
str: string;
....
str := Memo1.Text;
Delete(str, index, count);
Memo1.Text := str;
對於問題中的案例(要修改備忘錄的文本),問題中提到的替代方案(使用seltext)更好。 api處理更改,而不是框架檢索整個文本,修改,然後重新設置。 –
@Sertac同意... –
您正在試圖調用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')));
- 1. 編輯和備忘錄中的Delphi文本偏移
- 2. 轉換備忘錄文本
- 3. 如何編輯WPF DataGrid中的長文本(如備忘錄編輯和下拉列表)
- 4. 如何在magento中創建備忘錄?
- 5. 如何在eclipse中部署備忘錄
- 6. 在德爾福移動開發如何編輯備忘錄中選定的文本字體
- 7. 將備忘錄轉換爲文本
- 8. Evernote的網頁備忘編輯
- 9. #inject中的備忘錄如何工作?
- 10. 如何在Android中備份備忘錄和任務
- 11. 不能在備忘錄
- 12. Haskell的動態編程備忘錄
- 13. Pimping scalaz備忘錄
- 14. 長度備忘錄
- 15. 在VFP中顯示備忘錄字段
- 16. 在Delphi中搜索一個備忘錄?
- 17. 搜索文本文件的寫作結果備忘錄,lazarus
- 18. 如何將備忘錄或RichEdit保存爲UTF 8文本文件?
- 19. 1個彈出菜單和2個備忘錄,其中備忘錄是從
- 20. 流星 - 從備忘錄列表中顯示單個備忘錄頁
- 21. 如何在jQuery中編輯文本輸入樣式可編輯
- 22. 如何在使用delphi的類中製作動態備忘錄
- 23. Firemonkey:如何在備忘錄中檢測字符的X位置
- 24. 如何編輯java文本文件中的記錄?
- 25. 如何使用java編輯文本文件中的記錄?
- 26. Postgres - Sql - PgSql的備忘錄
- 27. 來自備忘錄的TDirectionsResult
- 28. Python自動備忘錄
- 29. Java函數的備忘錄
- 30. vb.net accdb備忘錄到RichTextBox
都能跟得上。 Memo.Text是一個getter,而不是一個變量。 –