DBGridを編集時にデータを移動させなくするには

解決


まこと  2008-04-10 01:41:09  No: 30450

Delphi6です。WindowsXp SP2の環境です。
かなりの初心者です。
DBGridでデータを表示させて、直接DBGridで編集を行っている時
マウスや矢印キー等で上下のレコードをクリックするとPostされますが
編集している間は、他のレコードをクリックしたり、矢印キー等での
レコードの移動を止めたいのですが、ご存知の方是非教えて頂きたいと
思います。よろしくお願いします。


Ru  2008-04-10 20:00:27  No: 30451

ちなみにPostのタイミングはどの時ですか?
ボタン押した時にPostさせるなら,
1.グローバル変数宣言
2.ボタン押した時にPost。同時にフラグをTrue。
3.TDataSet.BeforePostイベントでフラグがTrueの時のみ処理。
  ※TDataSet(TTale, TQuery, TClientDataSet等々)
4.TDataSet.AfterPostイベントでフラグをFalseに設定

綺麗ではないけど簡単にするならこんな感じ?
ホイールマウスでの移動も対処できるはず・・・
まぁやり方次第なんで方法は色々あると思います。


まこと  2008-04-11 16:01:49  No: 30452

Ruさん、ありがとうございました。
思ったとおりの動作をしました。
解決とさせて頂きますが、よろしければ、別な方法も
教えて頂けたら幸いです。


タマには  2008-04-14 09:04:23  No: 30453

真琴:「質問のヒト、アタシと同じ名前だね、やっぱ、女の子かなぁ」
春子:「そうよ、ひらがなで"まこと"だからネ、オトコなら漢字で"誠"や"允"とか書くンじゃない?」
海都:「いや、それだけじゃ、性別は断定できないと思うよ、それが本名とも限らないし…」
真琴:「あっ、そっか…そうよネ」
広海:「皆、そんなコト、どうでもイイと思うけど…、本題を忘れてンじゃないの」
真琴:「…だよネ^^ゞ、それで、別の方法って、マウスやキー操作の制御ってことかなぁ」
春子:「質問の"編集している間"というのは、"InplaceEditにフォーカスがある時"でしょ?」
海都:「そう、その時だけは、レコード移動するようなキーやマウス操作を無効にすればOK」
真琴:「でも、カイトさん、たしか…、DBEdit1.InplaceEditorとか書いても、エラーになっちゃうよね?」
海都:「うん、InplaceEditorプロパティは、Protectされてるからね、だから、こうする…」

type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    OrgWndProc: TWndMethod;
    procedure NewWndProc(var Msg: TMessage);
  public
    constructor Create(AOwner: TComponent); override;
  end;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    .....
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure DBGrid1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint; var Handled: Boolean);
  private
    .....

implementation
{$R *.DFM}

function IpEditFocused: Boolean;
begin
  result := Assigned(Form1.DBGrid1.InplaceEditor) and Form1.DBGrid1.InplaceEditor.Focused;
end;

{TDBGrid}
constructor TDBGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  OrgWndProc := WindowProc;
  WindowProc := NewWndProc;
  OnKeyDown := Form1.DBGrid1KeyDown;
  OnMouseWheel := Form1.DBGrid1MouseWheel;
end;

procedure TDBGrid.NewWndProc(var Msg: TMessage);
begin
  case Msg.Msg of
    WM_LBUTTONDOWN,
    WM_RBUTTONDOWN,
    WM_MBUTTONDOWN: if IpEditFocused then exit;
  end;
  OrgWndProc(Msg);
end;

{TForm1}
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case Key of
   VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT: if IpEditFocused then Key := 0;
  end;
end;

procedure TForm1.DBGrid1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer;
 MousePos: TPoint; var Handled: Boolean);
begin
  if IpEditFocused then Handled := True;
end;
...........

真琴:「あれっ? "DBGrid1.InplaceEditor"がナンでコンパイルエラーにならないの?」
春子:「最初に"TDBGrid = class(DBGrids.TDBGrid)"ってクラス宣言してあるからよネ?カイトさん」
海都:「そういうコト…、他にもイロイロやり方はあるけど、コレがラクな方法だと思う」
真琴:「そぅゆうコトなの…、うン、これで Enterで入力確定したらレコード移動で自動POSTも出来るし、大丈夫みたい」
広海:「あの…、マコトも、皆も、一つ忘れてるンじゃないのかな?」
真琴:「えッ?ナニを?」
広海:「コレ、コレ…、マウスの右ボタンのダブルクリック」
海都:「あっ、そうか…、WM_RBUTTONDBLCLKと、あとWM_MBUTTONDBLCLKのメッセージも無効にしとかなくちゃ」
春子:「ヒロミくんも、タマにはサエルよね」
広海:「タマには?…あぁ…その言葉、オレ傷ついたァ」
春子:「ン?またぁ…、そんなキャラじゃないでしょ?ヒロミくん」
広海:「あぁ、ダメだぁ、しばらく立ち直れない…だ・か・ら…、今夜の食事当番、代わりにヨロシク」


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

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






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