度々すみません。すぐ下の質問をした者ですが、もう一つ質問がありまして
今度はStringGridのセル上でダブルクリックを行い、ある画面を出したいのですが、それも制限事項がありまして・・・・
①一番最初の行の固定行(fixedrowやfixedcol)以外をダブルクリックして
画面を出現させる。
②RowCount=2、ColCount=2のStringGridで列や行が存在しない
StringGrid上の余白の部分をダブルクリックしても画面は出現させない。
(要はフォーカスのあたっているセルのみをダブルクリックして、
画面を出現させたい)
質問だらけですみません。こちらもよい方法があれば教えてください。
ダブルクリックのイベントハンドラの引数にはマウス座標がないので、
OnMouseMoveイベントのマウス座標を利用すればいいんじゃないかな。
Col と Row プロパティーを見ればいつでも選択しているセルが分かります。
(1)GetCursorPos(Windows API)
(2)TStringGrid.ScreenToClient
(3)TStringGrid.MouseToCell
(4)固定セルの判定
(5)ダイアログの表示
間違いなければ・・・
OnDblClickでもOnMouseDownが事前に発生!?します。
OnMouseDownでXとY値を取得しておいて、OnDblClickでその値を元に
すれば②の処理は可能と思います。
如何でしょうか?
OnMouseMoveも使えますが、場合によっては値が取得できない場合も
あるかもしれません。(アプリの構成上)
StringGridでクリック、ダブルクリックされた行、カラムは、
うんとさんが書いてあるように
StringGrid1.Col、StringGrid1.Rowで値が取れます。
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]で値を確認し
画面を表示するようにプログラムされてはいはがでしょうか。
>StringGrid1.Col、StringGrid1.Rowで値が取れます。
>StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]で値を確認し
>画面を表示するようにプログラムされてはいはがでしょうか。
駄目です。
問題は「余白部分をダブルクリックした時は表示したくない」です。
やってみればわかると思いますが、ダブルクリックまたはクリックで、
Row、Col値を取得したのでは上記の要望の動作はしません。
失礼・・・
>Row、Col値を取得したのでは上記の要望の動作はしません。
Row、Col値を取得しただけでは上記の要望の動作はしません。
> Row、Col値を取得しただけでは上記の要望の動作はしません。
そうですね。
> OnMouseDownでXとY値を取得しておいて、OnDblClickでその値を元に
> すれば②の処理は可能と思います。
うーむ。これは
> (要はフォーカスのあたっているセルのみをダブルクリックして、
> 画面を出現させたい)
これをどうやって検出するんでしょうか。つまり、ダブルクリックする前に
フォーカスが当たってるセルをどうやって知る事ができるか、ってことですが。
質問自体があいまいなような気がしますね。
>(要はフォーカスのあたっているセルのみをダブルクリックして、
>画面を出現させたい)
・・・確かに。
都合の良いように目を瞑ってましたm(__)m
OnDblClick内で orzさんの方法がスマートだと思います。
下記が例です。
procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
sp, cp: TPoint;
C, R: Integer;
begin
// マウスカーソルのスクリーン座標を取得
GetCursorPos(sp);
// スクリーン座標をクライアント座標に変換
cp:= StringGrid1.ScreenToClient(sp);
// セルの番地を取得
StringGrid1.MouseToCell(cp.x, cp.y, C, R);
// 固定セル・余白以外の場所でダブルクリックが発生した場合は画面呼出
if (C >= StringGrid1.FixedCols) and (R >= StringGrid1.FixedRows) then
MessageDlgPos('DblClick', mtInformation, [mbOk], 0, sp.x, sp.y);
end;
>OnDblClick内で orzさんの方法がスマートだと思います。
そうですね。
いやいや、ヒントくださってたのに、なんともはや m(__)m です。
StringGridは余白部分でクリックしてもClickイベントは発生しませんので
これを利用して次のようにしてみてはどうですか?
1.OnClickイベント発生管理用のprivate変数を作成・・・prvClick : Boolean;
2.OnClickイベントでprvClick := True;
3.OnDblClickイベントで
if prvCLICK Then ShowMessage(formatCurr('#0',StringGrid1.Col)+formatCurr(' #0',StringGrid1.Row));
prvCLICK := False;
こうするとCell内のみのDblClickとなると思います。
ツイート | ![]() |