DBGridのダブルクリック

解決


KK  2007-12-09 01:50:51  No: 28883

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

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

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

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


KHE00221  URL  2007-12-09 02:33:06  No: 28884

こんな感じ?

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 19:28:22  No: 28885

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


GTR  2007-12-10 21:42:10  No: 28886

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

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

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


GTR  2007-12-10 21:44:44  No: 28887

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

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

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


KHE00221  URL  2007-12-10 22:27:24  No: 28888

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

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

Caption := Caption + '1'

を 

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

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


めじな  2007-12-10 23:33:35  No: 28889

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

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 23:57:53  No: 28890

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


KK  2007-12-12 19:48:54  No: 28891

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加