Delphi6です。WindowsXp SP2の環境です。
かなりの初心者です。
DBGridでデータを表示させて、直接DBGridで編集を行っている時
マウスや矢印キー等で上下のレコードをクリックするとPostされますが
編集している間は、他のレコードをクリックしたり、矢印キー等での
レコードの移動を止めたいのですが、ご存知の方是非教えて頂きたいと
思います。よろしくお願いします。
ちなみにPostのタイミングはどの時ですか?
ボタン押した時にPostさせるなら,
1.グローバル変数宣言
2.ボタン押した時にPost。同時にフラグをTrue。
3.TDataSet.BeforePostイベントでフラグがTrueの時のみ処理。
※TDataSet(TTale, TQuery, TClientDataSet等々)
4.TDataSet.AfterPostイベントでフラグをFalseに設定
綺麗ではないけど簡単にするならこんな感じ?
ホイールマウスでの移動も対処できるはず・・・
まぁやり方次第なんで方法は色々あると思います。
Ruさん、ありがとうございました。
思ったとおりの動作をしました。
解決とさせて頂きますが、よろしければ、別な方法も
教えて頂けたら幸いです。
真琴:「質問のヒト、アタシと同じ名前だね、やっぱ、女の子かなぁ」
春子:「そうよ、ひらがなで"まこと"だからネ、オトコなら漢字で"誠"や"允"とか書くンじゃない?」
海都:「いや、それだけじゃ、性別は断定できないと思うよ、それが本名とも限らないし…」
真琴:「あっ、そっか…そうよネ」
広海:「皆、そんなコト、どうでもイイと思うけど…、本題を忘れてンじゃないの」
真琴:「…だよネ^^ゞ、それで、別の方法って、マウスやキー操作の制御ってことかなぁ」
春子:「質問の"編集している間"というのは、"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のメッセージも無効にしとかなくちゃ」
春子:「ヒロミくんも、タマにはサエルよね」
広海:「タマには?…あぁ…その言葉、オレ傷ついたァ」
春子:「ン?またぁ…、そんなキャラじゃないでしょ?ヒロミくん」
広海:「あぁ、ダメだぁ、しばらく立ち直れない…だ・か・ら…、今夜の食事当番、代わりにヨロシク」
ツイート | ![]() |