2

Win7-64 で C++ Builder 10 Seattle を使用しています。

ボタン クリック イベントから書き込める TRichEdit コントロールがあります。

MyRichEdit->SelText = t_string;

その変更を元に戻したいので、これを行うショートカット Ctrl+Z のメニュー項目があります。

SendMessage(MyRichEdit->Handle, EM_UNDO, 0, 0);

リッチエディットに入力した場合、元に戻すは期待どおりに機能しますが、プログラムで割り当てられた「貼り付け」を元に戻すことはできません。

Borland C++ Builder v6 で構築された古いアプリケーションに同様のコードがあり、そこで動作します。

私の質問は次のとおりです。上記のコードはSelTextへの書き込みを元に戻す必要がありますか? または、他に何かする必要がありますか?

4

1 に答える 1

3

セッターの実装は次のSelTextようになります。

procedure TCustomEdit.SetSelText(const Value: string);
begin
  SendTextMessage(Handle, EM_REPLACESEL, 0, Value);
end;

のドキュメントにEM_REPLACESELは次のように書かれています:

パラメーター

wParam

置換操作を元に戻すことができるかどうかを指定します。これが TRUE の場合、操作を元に戻すことができます。これが FALSE の場合、操作を元に戻すことはできません。

lParam

置換テキストを含む null で終わる文字列へのポインター。

VCL はどちらが送信0されているかを送信しているFALSEため、操作を元に戻すことはできません。SelTextの使用を避け、代わりにとしてEM_REPLACESEL渡して直接送信する必要があります。TRUEwParam

私は Delphi 6 VCL のソース コードを調べましたが、このメッセージを送信するときも常にパスする0ためwParam、古いバージョンの VCL も同じように動作すると予想していました。それでも、問題を解決する方法がわかりました。

余談ですが、の送信を、まったく同じことを行うEM_UNDOへの呼び出しに置き換えることができます。MyRichEdit->Undo()

于 2016-02-12T16:52:07.323 に答える