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



我想使用过程Delete(Memo.Text,index,count)(或类似的Insert)。但是我收到消息"常量对象不能作为var参数传递"。我知道我可以选择文本并将此过程与Seltext一起使用。但这种方式有点不舒服。还有什么比这更简单的吗?

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

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

您正在尝试调用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';

使用这些属性可能会"不舒服",但从内存和性能的角度来看,这确实是一个不错的选择。 在内部,他们只是将 Win32EM_(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')));

相关内容

  • 没有找到相关文章

最新更新