毎度の事ながらご教授願います。。
現在キーボードを使用しないでデータを編集するプログラムを作成しています。
DBGridをダブルクリックしたときに、現在選択されているセルのタイプをSelectedField.DataTypeを使用して判別し、ftStringのときは文字入力キーボードを、ftIntegerのときは、数値入力キーボードを表示するようにしています。
ここで、DBGridのセルを確実にダブルクリックしたときは問題ないのですが、セル以外の部分(DBGridに対してレコード数が少なかったときなどGridの下部は空白になっている所)をダブルクリックしてしまったときにもイベントは発生してしまいます。
このときイベントを発生しないようにする、もしくはセル以外の部分をダブルクリックしたと認識するにはどのようにしたらよいでしょうか。
よろしくお願いいたします。
こんな感じ?
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;
KHE00221さん早速のレスありがとうございます。
上記の方法で試してみたのですが、ダブルクリックする前にカーソルが当たっていたセルのPositionをもってきてしまうようです。
こんな方法でどうでしょう。
まず、プライベート変数を用意します。prvClick・・・GridのClickチェック
OnCellClickイベント
prvClick=False;
if Column.FieldName <> '' Then prvClick=True; //データカラムをクリック
OnDblClickイベント
if prvClick Then ShowMessage('ABC'); //データカラムのクリックありの場合
先程の例に間違いがありましたので再送信しました。
まず、プライベート変数を用意します。
prvClick : Boolean; //GridのClickチェック
OnCellClickイベント
prvClick := False;
if Column.FieldName <> '' Then prvClick := True; //データカラムをクリック
OnDblClickイベント
if prvClick Then ShowMessage('ABC'); //データカラムのクリックありの場合
セルのない場所をクリックして Caption に 1 が表示される?
Fixed の場所も当然セル扱いですよ?
Caption := Caption + '1'
を
Caption := IntToStr(Grid.Coord.X) + ' ' + IntToStr(Grid.Coord.Y);
みたくすればわかりますが
変な動作あるかもしれないけどこんなのどうでしょうか。
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;
・・・面倒かな。。。
書き忘れ。
type句に「TMyGrid = class(TDBGrid)」が必要です。
KHE00221さん、GTRさん、めじなさん、アドバイスありがとうございます。
最終的にKHE00221さんがご提示していただいたコードでうまくいきました。
GTRさん、以前にStringGridの件ですでに同じような記事がありましたね。
うまく記事を探し出せませんでした・・。
めじなさん、今の私の力ではちょっとむずかしいです・・。
なんにしても、やりたいことができました。皆様には感謝いたします。
わたしも皆さんにアドバイスできるように精進します。
ツイート | ![]() |