ユーザーが実際にBackSpaceボタンを押すように、BackSpaceコントロール文字をTMemoに送信したいと思います。
私のメモは読み取り専用で、ボタンをクリックすると、メモの最後の文字が削除されます。Memo.Textを使用せずにそれを実行したい:= ...(したがって、再描画やbeginupdateなどはありません)可能であれば、どのように可能ですか?
ご協力ありがとうございました。
編集:私は#8を追加しようとしましたが、運がありません...
キープレスを読み取り専用メモに送信しても機能しません。メモは読み取り専用なので、キーを押しても無視されます。メモの最後の文字を効率的に削除するには、つまり内容全体を置き換えることなく、 と を使用できEM_SETSEL
ますEM_REPLACESEL
。
var
Len: Integer;
begin
Len := Memo1.GetTextLen;
SendMessage(Memo1.Handle, EM_SETSEL, Len-1, Len);
SendMessage(Memo1.Handle, EM_REPLACESEL, 0, LPARAM(PChar('')));
end;
または、これらの Windows メッセージをラップする純粋な VCL バージョンを好む場合:
begin
Memo1.SelStart := Memo1.GetTextLen-1;
Memo1.SelLength := 1;
Memo1.SelText := '';
end;
後者は、おそらくさらにいくつかの Windows メッセージを送信しますが、はるかに読みやすくなっています。私は後者のオプションを好むでしょう。
これに関して考えられる問題の 1 つは、改行で意図したとおりに動作しない可能性があることです。Windows の改行は 2 文字 (CR+LF) であるため、メモの最後の文字が LF の場合は 2 文字を削除する必要があります。それを処理するには、おそらく次のようにすることができます:
begin
Memo1.SelStart := Memo1.GetTextLen-1;
Memo1.SelLength := 1;
if Memo1.SelText=#10 then
begin
Memo1.SelStart := Memo1.SelStart-1;
Memo1.SelLength := 2;
end;
Memo1.SelText := '';
end;