如何编辑备忘录中的文本?

How to edit Text in Memo?

我想使用过程 Delete(Memo.Text, index, count)(或类似的 插入)。但我收到消息 'Constant object can not be passed as var parameter'。我知道我可以 select 文本并将此程序与 Seltext 一起使用。但是这种方式有点不舒服。有没有更简单的?

Text 是一个 属性 而不是一个变量。 Delete 需要一个变量。所以你需要使用一个临时变量。例如

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

您正在尝试调用 System.Delete(),它将 string 变量的引用 作为输入。但是 TMemo.Text属性 (使用 getter 方法),它不是 变量 .这就是您收到 "can not be passed as var parameter" 错误的原因。

可以使用临时变量,例如:

var 
  s: string;

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

但一般来说效率很低,因为它必须在内存中完整复制Memo的当前内容,然后modify/reallocate它,然后重新分配回Memo,完全擦除当前内容并解析新内容。对于小的更改,这是很多工作。

更快更有效的选择是使用备忘录的 SelStart/SelLengthSelText 属性,例如:

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

插入新文本时也可以这样做,只需将 SelLength 设置为 0 即可,例如:

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

使用这些属性可能"uncomfortable",但从内存和性能的角度来看,它确实是一个不错的选择。在内部,他们只是将 Win32 EM_(GET|SET|REPLACE)SEL 消息直接发送到 Memo 的 window,让 OS 处理实际的文本管理。

如果你真的想要最高效的方式,直接使用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')));