BUTTONクリックで、DBCELL CLICKの内容を実行

解決


どうすれば  2010-01-24 20:22:04  No: 37225

TBUTTONをクリックしたら、DBGRID  CELLクリックをしたときに実行される方法を探しています。ただし、DBGRIDのCELLをクリックしてもその処理は実行されないようにしたいと思ってます。SENDERを使用する方法ですと、DBGRID CELL CLICK処理が発生しないように制御できないので、なにかいいアイデアは・方法はありますか(DELPHI5です)?


Mr.XRAY  2010-01-25 02:50:32  No: 37226

>DELPHI5です
>SENDERを使用する方法ですと、DBGRID CELL CLICK処理が発生しないように制御できないので

私の持っているDelphi5のDBGridのOnCellClickイベントにはSenderがありません.
また,

>DBGRID  CELLクリックをしたときに実行される方法を探しています。
>ただし、DBGRIDのCELLをクリックしてもその処理は実行されないようにしたいと思ってます。
(改行位置変更しました)

というのはよく意味が理解できませんので,
当方で勝手にこんな動作が希望なのではないかと推測してテストしてみました.
動作確認環境は,
Windows XP(SP3) + Delphi5(UP1) Pro + BDE paradox 

つまり

(1) ボタンをクリックした時に,DBGridのOnCellClickを実行したい
(2) この時,マウスでDBGridをクリックした時とは別の動作を実行したい
(3) 開発環境は,Window XP(SP3) + Delphi5(UP1) Pro
      データベーはDelphi付属のParadoxで,BDEを使用.
      
どんな方法があるでしょうか.

という質問に対する方法のひとつです.

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if Column = nil then begin
    ShowMessage('セルはクリックされないけど呼ばれたよ');
  end else begin
    ShowMessage('セルがクリックされたよ');
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGrid1CellClick(nil);
end;


どうすれば  2010-01-25 03:23:25  No: 37227

Mr.XRAYさんありがとうございます。  

私が言いたかったことは、BUTTON1をクリックしたときに,DBGridCellClickのプロシージャーに書いた内容を実行することです。なので、まずDBGRIDに自分のしたい実行内容のコードを書き、それをBUTTON1をクリックしたに発生させます。しかしながら、単純にDBGRIDに書くだけだと、DBGRIDのCELLをクリックしたときにも、同様の処理が実行されてしまうので、その処理の実行を回避する方法をさがしていました。

このnilというのは、どのようなことを指しているのですか?調べたのですが、はっきりと理解できませんでした。


Mr.XRAY  2010-01-25 04:00:32  No: 37228

>私が言いたかったことは、(以下略)

ということは,私の推測は違っていたということですね.
残念でした.

>このnilというのは、どのようなことを指しているのですか?

さて,困りました.それこそ「どうすれば」理解していただけるか説明を考えておきます.


どうすれば  2010-01-25 05:14:43  No: 37229

Mr.XRAYさん、すみません。Mr.XRAYの私の質問への解釈はあっています。私の表現の仕方がわるかったので、改めてあのように書きました。ただ、正確に伝わっていたかどうかは、nilの部分を理解しないとわからない状態です。


どうしたいの  2010-01-25 07:30:58  No: 37230

BUTTON1をクリックしたときに実行したい処理を具体的に書いた方が分かりやすいと思うよ。
その処理にはColumnの値が必要なの?


Mr.XRAY  2010-01-25 08:07:52  No: 37231

>このnilというのは、どのようなことを指しているのですか?

と言われても困ってしまうんです.実は.

OnCellClickイベントには引数が1つあります.
ですから,これを呼び出す時には,引数を与える必要があります.

これはどんな関数,メソッドも原則的にはそうです.
ただし,関数やメソッドの作成方法によっては,引数の全てまたは一部を省略するようにもできます.
この場合省略はできません.

それで,nilと言う定数を与えているだけです.
イベントもメソッドの一種です.
もちろん, TColumnと認識可能な引数であれば何でもいいわけですが,
オブジェクト型(Tが付いている型)の場合これが区別するには一番簡単でしょう.

と,こんな説明で理解していただけるかは不安ですが.
DBGrid何とかの質問文同様,nilのどの部分,どのようなことが分からないのか
私には理解できなかったので,これで勘弁してください.


Mr.XRAY  2010-01-25 08:14:32  No: 37232

>イベントもメソッドの一種です.

これが役に立つかどうかも不安ですが.参考までに
イベントは特殊なメソッドということですね.

http://mrxray.on.coocan.jp/Others/A_UltraIntro01.htm#07


KHE00221  2010-01-25 08:39:20  No: 37233

こんなこと?

var
  SaveColumn: TColumn;

procedure TForm3.Button1Click(Sender: TObject);
begin
    if Assigned(SaveColumn) = True then
    begin

    end;
end;

procedure TForm3.DBGrid1CellClick(Column: TColumn);
begin
    SaveColumn := Column;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
    SaveColumn := nil;
end;


Mr.XRAY  2010-01-25 08:59:24  No: 37234

KHE00221さん,こんにちは.

>こんなこと?

な〜るほど.さすがですね.
参考になります.これは使えます.


Mr.XRAY  2010-01-25 09:12:00  No: 37235

>参考になります.これは使えます.

今,質問の文章とコードを見比べてみたら,間違いないでしょう.
これなら,処理を1つにまとめることができます.


ぽむぽむ  2010-01-25 17:44:29  No: 37236

まったくついていけないけど、
セルクリックのイベントでコードを書くけど、実はイベントで実行したくないんだよね〜
って話にしか読めないのは、読解力不足かしら?

> BGRIDのCELLをクリックしたときにも、同様の処理が実行されてしまうので、その処理の実行を回避

procedure TForm3.FormCreate(Sender: TObject);
begin
  DBGrid1.OnCellClick := nil;
end;

セルクリック時とボタンクリック時を分けたいのであれば、
procedure MyCellClick(ButtonClock: Boolean; Column: TColumn);
begin
  if ButtonClock then
  //ボタンクリックでの処理
  else
  //DBGridのセルクリックでの処理
end;
のような関数を作ってしまえばいいだけのような気もする。


どうすれば  2010-01-29 06:33:28  No: 37237

助かりました。ありがとうございます。


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

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






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