6

EM_AUTOURLDETECT メッセージを使用して TRichEdit コンポーネントの URL 検出を実装しようとしています。
次のコードに問題があります

procedure TForm1.Button1Click(Sender: TObject);
var Mask: Word;
begin
  Mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(Handle, EM_SETEVENTMASK, 0, Mask or ENM_LINK);
  SendMessage(Handle, EM_AUTOURLDETECT, Integer(True), 0);
end;

それは機能しますが、これらの設定の後に TRichEdit のテキストを変更して、既に記述されたテキストの URL を検出できるようにする必要があります。この機能を適用すると TRichEdit が読み取り専用モードになるため、これが問題です。

このコードを実行して TRichEdit に既に記述されたテキスト内の URL を強制的に検出させた後、どうすればよいですか?
私はドキュメントを見ていましたが、このようなことについての言及はありません。

ありがとうございました

4

1 に答える 1

5

私はしばらく前に同じ問題を抱えていて、それに対して(かなり)汚い回避策を使用しました。メッセージを送信した後EM_AUTOURLDETECT、現在の選択を取得して保存し、リッチ編集のテキストを (再) 設定して、以前に保存した選択を元に戻します。

procedure TForm1.Button1Click(Sender: TObject);
var
  EventMask: Word;
  CharRange: TCharRange;
begin
  EventMask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, EventMask or ENM_LINK);
  SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, WPARAM(True), 0);
  SendMessage(RichEdit1.Handle, EM_EXGETSEL, 0, LPARAM(@CharRange));
  SendMessage(RichEdit1.Handle, WM_SETTEXT, 0, LPARAM(RichEdit1.Text));
  SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, LPARAM(@CharRange));
end;
于 2012-01-17T16:14:53.077 に答える