カーソル位置がどこにあっても、文字列を切り出したい

解決


サスケ  2003-02-23 21:28:29  No: 3007

memoやricheditで、ある任意の行でカーソル位置がどこにあっても、文字列を切り出したいのですが
どのようにすれば良いのか教えてください。
つまり、マウスをダブルクリックした時に文字列が選択されて反転されますが、それと同じような
動作の意味合いでの取得方法です。

    Str := Copy( Str, aPos + 1, StrMax);
           ↑↑
           a  b

この例だと、マウスカーソルがaの位置でも、bの位置でも 'Copy' が取得できるといったものです。よろしくお願い致します。


にしの  2003-02-23 21:53:51  No: 3008

カーソルだと、「マウスカーソル」なのか、「編集ボックスの入力位置」なのかわかりづらくありませんか?
通常、「カーソル」とは、マウスカーソルを指す場合が多いです。
# 編集ボックスに出ているのは「キャレット(=caret)」です

本題ですが、現在のキャレット位置がわかるので、そこから前に単語の境目を探し、次に、現在のキャレット位置から後ろに単語の境目を探します。
単語の境目に何を使うかによって、切り分けられる文字列が変わります。
今回の場合は、アルファベット以外がきたら境目、と判断すればいいと思います。


にしの  2003-02-23 21:56:32  No: 3009

いや、すみません。見間違いですね、カーソル=マウスカーソルですね。
マウスカーソルの位置を、キャレット位置に変換する必要があります。
単一行のエディットでもできるかわかりませんが、EM_系のメッセージに、EM_CHARFROMPOSメッセージがあります。
これでとれるかもしれません。


サスケ  2003-02-24 02:14:45  No: 3010

にしのさん>
早々の回答、大変ありがとうございます。
ちょっと、キャレットとマウスカーソルの意味での質問が混同して申し訳ありませんでした。
現在のキャレット位置に強制的にマウスカーソルを移動させて、擬似的にダブルクリックさせ、
文字列を選択状態(反転)したいという意味に訂正させていただきます。
しかし、下記のようにするのが、本来の方法かもしれませんね。

>本題ですが、現在のキャレット位置がわかるので、そこから前に単語の境目を探し、
>次に、現在のキャレット位置から後ろに単語の境目を探します。
>単語の境目に何を使うかによって、切り分けられる文字列が変わります。
>今回の場合は、アルファベット以外がきたら境目、と判断すればいいと思います。

ただ、途中までやって見て、あきらめきれないので、アドバイスして頂けたら幸いです。
下記のようなルーチンで実験していますが、マウスカーソールがその位置にあわせている状態
でalMojiSelectを実行させるとダブルクリックして選択されますが、マウスを移動させると
選択できません。つまり、常に任意のキャレット位置にマウスを強制的に移動させて実行
させたいというものです。

procedure TForm1.alMojiSelectExecute(Sender: TObject);
var
    nPosx,nPosy: Integer;
    FindPos:TPoint;
begin
    nPosx := RichEdit1.CaretPos.x; //現在のキャレット位置 x (行)
    nPosy := RichEdit1.CaretPos.y; //現在のキャレット位置 y (桁)
    FindPos.x :=nPosx;
    FindPos.y :=nPosy;
    GetCursorPos(FindPos);
    SetCursorPos(FindPos.x,FindPos.y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

    //省略

end;


にしの  2003-02-24 09:55:12  No: 3011

GetCursorPos(FindPos);
SetCursorPos(FindPos.x,FindPos.y);
だと無意味です。現在のマウスカーソル位置を、新しいマウスカーソル位置に設定しています。

GetCaretPos(FindPos); // (カーソルでなく)キャレット位置を取得
FindPos := RichEdit1.ClientToScreen(FindPos); // クライアント座標からスクリーン座標に変換
SetCursorPos(FindPos.x,FindPos.y); // (マウス)カーソル位置を設定

にしてみてください。


サスケ  2003-02-25 07:23:04  No: 3012

にしのさん>

>GetCaretPos(FindPos); // (カーソルでなく)キャレット位置を取得
>FindPos := RichEdit1.ClientToScreen(FindPos); // クライアント座標からスクリーン座標に変換
>SetCursorPos(FindPos.x,FindPos.y); // (マウス)カーソル位置を設定
どうも、ありがとうございました。
アドバイス通りにやったら、'うまく' いきました。
ただ、擬似的にダブルクリックさせるやり方は、やはり、トリッキーで
スマートではないので、対象行を取得して、その行の文字列内で、
カーソル位置の前後を読んで、事前に設定してある半角英数字とを比較させて
一致したらその文字列を加算してひとつの単語として取得するようにします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加