3

ユーザーが実際にBackSpaceボタンを押すように、BackSpaceコントロール文字をTMemoに送信したいと思います。

私のメモは読み取り専用で、ボタンをクリックすると、メモの最後の文字が削除されます。Memo.Textを使用せずにそれを実行したい:= ...(したがって、再描画やbeginupdateなどはありません)可能であれば、どのように可能ですか?

ご協力ありがとうございました。

編集:私は#8を追加しようとしましたが、運がありません...

4

1 に答える 1

6

キープレスを読み取り専用メモに送信しても機能しません。メモは読み取り専用なので、キーを押しても無視されます。メモの最後の文字を効率的に削除するには、つまり内容全体を置き換えることなく、 と を使用でき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;
于 2012-08-03T14:36:17.560 に答える