StringGrid上のセルをダブルクリックして、画面を出す方法


あおあお  2006-11-23 17:41:45  No: 24028  IP: 192.*.*.*

度々すみません。すぐ下の質問をした者ですが、もう一つ質問がありまして
今度はStringGridのセル上でダブルクリックを行い、ある画面を出したいのですが、それも制限事項がありまして・・・・

①一番最初の行の固定行(fixedrowやfixedcol)以外をダブルクリックして
  画面を出現させる。

②RowCount=2、ColCount=2のStringGridで列や行が存在しない
  StringGrid上の余白の部分をダブルクリックしても画面は出現させない。
  (要はフォーカスのあたっているセルのみをダブルクリックして、
    画面を出現させたい)

質問だらけですみません。こちらもよい方法があれば教えてください。

編集 削除
ヘイヨウ  2006-11-24 00:30:21  No: 24029  IP: 192.*.*.*

ダブルクリックのイベントハンドラの引数にはマウス座標がないので、
OnMouseMoveイベントのマウス座標を利用すればいいんじゃないかな。

編集 削除
うんと  2006-11-24 02:28:04  No: 24030  IP: 192.*.*.*

Col と Row  プロパティーを見ればいつでも選択しているセルが分かります。

編集 削除
orz  2006-11-24 08:23:37  No: 24031  IP: 192.*.*.*

(1)GetCursorPos(Windows API)
(2)TStringGrid.ScreenToClient
(3)TStringGrid.MouseToCell
(4)固定セルの判定
(5)ダイアログの表示

編集 削除
Syake  2006-11-24 08:29:24  No: 24032  IP: 192.*.*.*

間違いなければ・・・
OnDblClickでもOnMouseDownが事前に発生!?します。
OnMouseDownでXとY値を取得しておいて、OnDblClickでその値を元に
すれば②の処理は可能と思います。
如何でしょうか?
OnMouseMoveも使えますが、場合によっては値が取得できない場合も
あるかもしれません。(アプリの構成上)

編集 削除
GTR  2006-11-24 13:07:20  No: 24033  IP: 192.*.*.*

StringGridでクリック、ダブルクリックされた行、カラムは、
うんとさんが書いてあるように
StringGrid1.Col、StringGrid1.Rowで値が取れます。
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]で値を確認し
画面を表示するようにプログラムされてはいはがでしょうか。

編集 削除
Syake  2006-11-24 13:36:27  No: 24034  IP: 192.*.*.*

>StringGrid1.Col、StringGrid1.Rowで値が取れます。
>StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]で値を確認し
>画面を表示するようにプログラムされてはいはがでしょうか。
駄目です。
問題は「余白部分をダブルクリックした時は表示したくない」です。
やってみればわかると思いますが、ダブルクリックまたはクリックで、
Row、Col値を取得したのでは上記の要望の動作はしません。

編集 削除
Syake  2006-11-24 13:43:17  No: 24035  IP: 192.*.*.*

失礼・・・
>Row、Col値を取得したのでは上記の要望の動作はしません。
Row、Col値を取得しただけでは上記の要望の動作はしません。

編集 削除
うんと  2006-11-24 13:58:30  No: 24036  IP: 192.*.*.*

> Row、Col値を取得しただけでは上記の要望の動作はしません。

そうですね。

> OnMouseDownでXとY値を取得しておいて、OnDblClickでその値を元に
> すれば②の処理は可能と思います。

うーむ。これは

> (要はフォーカスのあたっているセルのみをダブルクリックして、
>  画面を出現させたい)

これをどうやって検出するんでしょうか。つまり、ダブルクリックする前に
フォーカスが当たってるセルをどうやって知る事ができるか、ってことですが。

質問自体があいまいなような気がしますね。

編集 削除
Syake  2006-11-24 14:49:42  No: 24037  IP: 192.*.*.*

>(要はフォーカスのあたっているセルのみをダブルクリックして、
>画面を出現させたい)
・・・確かに。
都合の良いように目を瞑ってましたm(__)m

編集 削除
Basser  2006-11-24 15:00:01  No: 24038  IP: 192.*.*.*

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;

編集 削除
Syake  2006-11-24 15:41:28  No: 24039  IP: 192.*.*.*

>OnDblClick内で orzさんの方法がスマートだと思います。
そうですね。
いやいや、ヒントくださってたのに、なんともはや  m(__)m  です。

編集 削除
GTR  2006-11-24 15:55:15  No: 24040  IP: 192.*.*.*

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となると思います。

編集 削除