如何在备忘录中编辑文字?

时间:2017-03-19 20:48:31

标签: delphi text lines tmemo

我想使用程序删除 Memo.Text ,索引,计数)(或类似的插入)。但我收到消息'常量对象不能作为var参数传递'。我知道我可以选择文本并将此程序与 Seltext 一起使用。但这种方式有点不舒服。还有什么比较容易了吗?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

您正在尝试拨打System.Delete(),其中引用string变量作为输入。但TMemo.Text属性(使用getter方法),它不是变量。这就是为什么你得到“不能作为var参数传递”的错误。

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

var 
  s: string;

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

但这通常效率很低,因为它必须在内存中制作Memo当前内容的完整副本,然后修改/重新分配它,然后将其重新分配给Memo,完全擦除当前内容并解析新内容。对于小的变化,这是很多工作。

更快更有效的选择是使用备忘录的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消息直接发送到Memo的窗口,让操作系统处理实际的文本管理。

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