DBGridのダブルクリック

解決


KK  2007-12-08 16:50:51  No: 28883  IP: 192.*.*.*

毎度の事ながらご教授願います。。

現在キーボードを使用しないでデータを編集するプログラムを作成しています。
DBGridをダブルクリックしたときに、現在選択されているセルのタイプをSelectedField.DataTypeを使用して判別し、ftStringのときは文字入力キーボードを、ftIntegerのときは、数値入力キーボードを表示するようにしています。

ここで、DBGridのセルを確実にダブルクリックしたときは問題ないのですが、セル以外の部分(DBGridに対してレコード数が少なかったときなどGridの下部は空白になっている所)をダブルクリックしてしまったときにもイベントは発生してしまいます。
このときイベントを発生しないようにする、もしくはセル以外の部分をダブルクリックしたと認識するにはどのようにしたらよいでしょうか。

よろしくお願いいたします。

編集 削除
KHE00221  URL  2007-12-08 17:33:06  No: 28884  IP: 192.*.*.*

こんな感じ?

procedure TForm3.DBGridEx1DblClick(Sender: TObject);
var
    GridCoord : TGridCoord;
    MousePos : TPoint;
begin
    GetCursorPos(MousePos);
    MousePos := DBGridEx1.ScreenToClient(MousePos);
    GridCoord := DBGridEx1.MouseCoord(MousePos.X,MousePos.Y);
    if (GridCoord.X <> -1) and (GridCoord.Y <> -1) then
    begin
      Caption := Caption + '1';
    end;
end;

編集 削除
KK  2007-12-10 10:28:22  No: 28885  IP: 192.*.*.*

KHE00221さん早速のレスありがとうございます。
上記の方法で試してみたのですが、ダブルクリックする前にカーソルが当たっていたセルのPositionをもってきてしまうようです。

編集 削除
GTR  2007-12-10 12:42:10  No: 28886  IP: 192.*.*.*

こんな方法でどうでしょう。
まず、プライベート変数を用意します。prvClick・・・GridのClickチェック

OnCellClickイベント
  prvClick=False;
  if Column.FieldName <> '' Then prvClick=True;  //データカラムをクリック

OnDblClickイベント
  if prvClick Then ShowMessage('ABC');  //データカラムのクリックありの場合

編集 削除
GTR  2007-12-10 12:44:44  No: 28887  IP: 192.*.*.*

先程の例に間違いがありましたので再送信しました。
まず、プライベート変数を用意します。
  prvClick : Boolean; //GridのClickチェック

OnCellClickイベント
  prvClick := False;
  if Column.FieldName <> '' Then prvClick := True;  //データカラムをクリック

OnDblClickイベント
  if prvClick Then ShowMessage('ABC');  //データカラムのクリックありの場合

編集 削除
KHE00221  URL  2007-12-10 13:27:24  No: 28888  IP: 192.*.*.*

セルのない場所をクリックして Caption に 1 が表示される?

Fixed の場所も当然セル扱いですよ?


Caption := Caption + '1'

を 

Caption := IntToStr(Grid.Coord.X) + ' ' + IntToStr(Grid.Coord.Y);

みたくすればわかりますが

編集 削除
めじな  2007-12-10 14:33:35  No: 28889  IP: 192.*.*.*

変な動作あるかもしれないけどこんなのどうでしょうか。

private
  { Private 宣言 }
  FOrgProc: TWndMethod;
  procedure SubProc(var Msg: TMessage);

省略

procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
  Msg: TMessage;
begin
  //InplaceEditorメッセージフック準備
  if not Assigned(FOrgProc) then
  begin
    FOrgProc := TMyGrid(DBGrid1).InplaceEditor.WindowProc;
    TMyGrid(DBGrid1).InplaceEditor.WindowProc := SubProc;
    //初回ダブルクリック
    Msg.Msg := WM_LBUTTONDBLCLK;
    SubProc(Msg);
  end;
end;

procedure TForm1.SubProc(var Msg: TMessage);
begin
  FOrgProc(Msg);
  if Msg.Msg = WM_LBUTTONDBLCLK then
  begin
    ShowMessage('DblClick');
  end;
end;

・・・面倒かな。。。

編集 削除
めじな  2007-12-10 14:57:53  No: 28890  IP: 192.*.*.*

書き忘れ。
type句に「TMyGrid = class(TDBGrid)」が必要です。

編集 削除
KK  2007-12-12 10:48:54  No: 28891  IP: 192.*.*.*

KHE00221さん、GTRさん、めじなさん、アドバイスありがとうございます。
最終的にKHE00221さんがご提示していただいたコードでうまくいきました。
GTRさん、以前にStringGridの件ですでに同じような記事がありましたね。
うまく記事を探し出せませんでした・・。
めじなさん、今の私の力ではちょっとむずかしいです・・。
なんにしても、やりたいことができました。皆様には感謝いたします。
わたしも皆さんにアドバイスできるように精進します。

編集 削除