Memoのコンポーネントからキーボードの入力カーソルの位置を得るには
どうすればよいでしょうか?
Formからfunction GetCaretPos(var lpPoint: TPoint):LongBool;と
ClientToScreenを使えばできるのですが
TCustomMemoからでは上手く受け取れず function GetCaretPos: TPoint;
では(0,0)以外の時では、ずれてしまうのです。
よろしくお願いします。
質問が良くなかったようです。
procedure TkkHintMemo.Click;
var P: TPoint;
begin
p := GetCaretPos();
ShowMessage('('+IntToStr(P.X)+','+IntToStr(P.Y)+')');
end;
procedure TForm1.FormClick(Sender: TObject);
var P: TPoint;
begin
GetCaretPos(P);
ShowMessage('('+IntToStr(P.X)+','+IntToStr(P.Y)+')');
end;
この二つを比べてみると"ずれ"が生じているのがわかります。
TMemo::CaretPosの記述の誤り
http://www2.justnet.ne.jp/~tyche/bcbbugs/reports/help003.html
ではないかと思われます。
デフォルトでは
MemoCaret := GetCaretPos; // (カーソルでなく)キャレット位置を取得
MemoCaret.X:= MemoCaret.X *4+8;//この8は見やすくするため
MemoCaret.Y:= MemoCaret.Y * (-Font.Height) ;
でなんとかうまく行きましたがFontに依存するのであれば
他に対策を練る必要があります。
これに悩んでおられる方々も多いのではないでしょうか?
ちょっと違うのでは?
記述されたコードで呼び出しているのは
メモコンポーネントのGetCaretPosではなく
APIのGetCaretPosでは?
そうですね失礼しました。
procedure TForm1.FormClick(Sender: TObject);
var P: TPoint;
begin
P := kkHintMemo.CaretPos;// GetCaretPos(P);
ShowMessage('('+IntToStr(P.X)+','+IntToStr(P.Y)+')');
end;
であれば上の方と同じようになります。
>GetCaretPos();
で引数不要が出ていたのはそのためですね。
普通にGetCaretPos;で返り値がTPoint型になります。
ツイート | ![]() |