> Unit1とUnit2のフォームを作成して、Unit1に文字列が詰っているリッチエディットコントロールを配置しました。そして、Unit1のコードからUnit2をモードレスで表示しました。このとき、Unit2にフォーカスがあり、Unit1のリッチエディットコントロールをそのまま直接、マウスでクリックすると、Unit1のフォームは、フォーカスを持ってUnit2のフォームはUnit1の下にきますが、リッチエディットコントロールのカーソル位置は、マウスでクリックした位置にはこずに、前回の位置のままになってしまいます。なので、カーソル位置を変えるため、もう一度リッチエディットコントロールをクリックしなくてはならないのですが、このそのまま直接、フォーカスのないリッチエディットコントロールをクリックしても、クリックした位置にカーソルがくるようにするには、どのようなことをすればよいのですか?
という質問で、
> procedure TForm1.FormActivate(Sender: TObject);
> var
> mpos: TPoint;
> begin
> GetCursorPos(mpos);
> mpos := RichEdit1.ScreenToClient(mpos);
> RichEdit1.Perform(WM_LBUTTONDOWN, 1, MakeLParam(mpos.X, mpos.Y));
> end;
> ちなみに、
> RichEdit1.Perform(WM_LBUTTONDOWN, 1, MakeLParam(mpos.X, mpos.Y));
> は、
> RichEdit1.Perform(WM_LBUTTONDOWN, 0, 0);
> でもOKでした。
> たぶん、WM_LBUTTONDOWNメッセージで、マウスの状態を取得しているんだと思います。
というご教授をしていただきました。結果、実現したかったことが大変うまく動作していて、前回はどうもありがとうございました。
少し使いつづけていたところ、同じアプリケーションの間での、フォームのフォーカスの移動の際には、フォーカスのないリッチエディットコントロールをクリックしても、クリックした位置にカーソルがくるようになりましたが、他アプリケーションからのフォーカスの移動の際には、FormActivateイベントが発生しないため、クリックした位置にカーソルがきませんでした。
他アプリケーションからのフォーカスの移動の際に発生するイベントにも、ご教授いただいたチップスを書き込めばよいのですが、他アプリケーションからのフォーカスの移動の際に発生するイベントが見当たらず、埒があきませんでした。このような場合はどのようにしたら良いのですか?
どうかご教授お願いします。
ヘルプをよく読みましたか?
FormのOnActivateの説明を見ればわかるはずです。
ヘルプをよく検索せずにご質問してしまって、申し訳ありませんでした。FormのOnActivateの説明から、よく読み進めていったところ、実装することが出来ました。「ApplicationEvents」コントロールを使用すればよいわけですね。このコントロールの存在すら知らなくて、勉強になりました。ありがとうございました。
ツイート | ![]() |