全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4749
推到 Plurk!
推到 Facebook!

在DBGrid修改資料時 , 如何避免因上下移動(Move Mouse or 按到上下鍵)而自動存檔

答題得分者是:eaglewolf
b120836106
一般會員


發表:2
回覆:7
積分:1
註冊:2007-08-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-22 21:07:25 IP:203.69.xxx.xxx 訂閱
在DBGrid修改資料時 , 如何避免因上下移動(Mouse點到其他Record or 按到上下鍵)而自動存檔 ?
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-22 23:15:26 IP:220.132.xxx.xxx 訂閱
在TTable, TQuery, TADOTable , TADOQuery等物件的
BeforeScroll Event 執行Abort;
<textarea class="delphi" rows="10" cols="60" name="code">procedure TForm1.ADOQuery1BeforeScroll(DataSet: TDataSet); begin if DataSet.State in [dsEdit,dsInsert] then Abort; end; </textarea>
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2007-08-22 23:29:51, 註解 直接在DBGrid上編輯時,不適用DisableControls,故刪除‧
b120836106
一般會員


發表:2
回覆:7
積分:1
註冊:2007-08-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-22 23:51:27 IP:203.69.xxx.xxx 訂閱
if DataSet.State in [dsEdit,dsInsert] then Abort; 還是不行 DataSet在BeforeScroll時已經是dsBorwse了?!
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-23 00:12:12 IP:220.132.xxx.xxx 訂閱
改成在BeforePost做檢查
確認資料都沒有問題
如果有則ShowMessage然後執行Abort
<textarea class="delphi" rows="10" cols="60" name="code"> procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet); begin if Trim(DataSet.FieldByName('Emp_Name').AsString) = '' then begin ShowMessage('員工姓名不可為空白'); Abort; end; end; </textarea>
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
b120836106
一般會員


發表:2
回覆:7
積分:1
註冊:2007-08-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-23 00:37:31 IP:203.69.xxx.xxx 訂閱
如果移動到那行也是存在的Record就無法判斷了?!
esp_pzj
初階會員


發表:32
回覆:70
積分:40
註冊:2007-02-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-23 08:50:43 IP:59.120.xxx.xxx 訂閱
請參考此方式:


在連結dbgrid的DataSet中的BeforePost Event判斷那些欄位該輸入

procedure TForm1.Query1BeforePost(DataSet: TDataSet);
begin
if DataSet.FieldByName('FieldA').AsString = '' then //FieldA欄位有輸入資料 才可以離開 此列
raise Exception.Create('請輸入FieldA');
end;



http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=87957
------
學藝不精 謝多多指教
編輯記錄
esp_pzj 重新編輯於 2007-08-23 08:54:14, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-23 09:39:22 IP:61.222.xxx.xxx 訂閱
重點是!你想要怎麼做。
b120836106
一般會員


發表:2
回覆:7
積分:1
註冊:2007-08-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-23 18:04:45 IP:61.64.xxx.xxx 訂閱
希望在DBGrid修改資料時 , 不能按上下鍵或用Mouse點到其他Record . 因為這樣修改中的資料會自動存檔 , USER在修正大量資料時常會弄錯 .
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-23 22:35:37 IP:220.132.xxx.xxx 訂閱
你沒有看懂 我 或 esp_pzj 大大的文章
那只是一個範例
你必須要檢查所有應該輸入且符合你的資料限制
只要應該輸入的資料都有輸入
且所有輸入的資料都符合你的資料限制
就應該允許讓user移動record

亦或者 你可能需要大改你的程式
直接不讓user在dbgrid上作新增/修改資料

而是利用以下作法:
當user按下新增/修改鈕時
執行DBGrid.DataSource.DataSet.DisableControls;
將相關資料所屬的控制項的Enabled屬性設為True(或Edit等控制項的ReadOnly屬性設為False)

當user 按下確認鈕時
檢查資料的正確性後 將資料insert或update回DB
執行DBGrid.DataSource.DataSet.EnableControls;
將相關資料所屬的控制項的Enabled屬性設為False(或Edit等控制項的ReadOnly屬性設為True)

或是當user 按下取消鈕時
執行DBGrid.DataSource.DataSet.EnableControls;
將相關資料所屬的控制項的Enabled屬性設為False(或Edit等元件的ReadOnly屬性設為True)
注意:以上說的相關資料所屬的控制項 非是DB-AWARE的控制項而是一般的控制項

===================引 用 b120836106 文 章===================
希望在DBGrid修改資料時 , 不能按上下鍵或用Mouse點到其他Record . 因為這樣修改中的資料會自動存檔 , USER在修正大量資料時常會弄錯 .
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
b120836106
一般會員


發表:2
回覆:7
積分:1
註冊:2007-08-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-23 23:22:20 IP:203.69.xxx.xxx 訂閱

感謝二位大大的費心指導

1. USER只是在DBGrid修改資料,如售價12000改成12500,或效期 幾天,並沒有資料限制的問題( 非新增資料 )

2. USER認為在DBGrid上修改資料最快,他們不要改成DBGrid(ReadOnly) DBEdit(s)的方式( 程式又改了回來,唉 ! )

在下很想幫那些每天加班Key in 的小職員, 但已經絞盡腦汁,實在無計可施了,

eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-08-24 09:51:11 IP:211.75.xxx.xxx 訂閱
若是這樣
在dbGrid的OnKeyDown Event加上這段

<textarea class="delphi" rows="10" cols="60" name="code">procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if dbgrid1.DataSource.DataSet.State in [dsEdit,dsInsert] then begin if (Key = VK_UP) or (Key = VK_DOWN) then Key := VK_CLEAR; if Key = VK_Return then dbgrid1.DataSource.DataSet.Post; if Key = VK_Escape then dbGrid1.DataSource.DataSet.Cancel; end; end; </textarea>
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2007-08-24 09:58:52, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-08-24 11:36:08 IP:219.68.xxx.xxx 未訂閱
windows不是萬能的, 一般我的設計不會直接用 dbgrid 來提供給user做編修,因為很難掌控, 你不能只鎖定某些鍵, 太多漏洞, 不過我曾有做過一種欺騙的dbgrid+dbedit 旳功能, 就是直接在dbgrid 金額的欄位置入一個edit ( dbgrid是readonly), 當滑鼠點到某一個欄位, 先取得該欄的起始xy座標, 然後動態建立一個edit給user輸入, 事後再edit的 onexit 做回存動作, 但程式年代久遠, 一時間我找不到在那裡, 你先自己研究看看
這是做一個假象的動作, 讓客戶覺得還是在 grid中作業, 但如果是數個欄位都要的話, 就不適用, 此舉只適用於1-2個欄位

===================引 用 b120836106 文 章===================

感謝二位大大的費心指導

1. USER只是在DBGrid修改資料,如售價12000改成12500,或效期 幾天,並沒有資料限制的問題( 非新增資料 )

2. USER認為在DBGrid上修改資料最快,他們不要改成DBGrid(ReadOnly) DBEdit(s)的方式( 程式又改了回來,唉 ! )

在下很想幫那些每天加班Key in 的小職員, 但已經絞盡腦汁,實在無計可施了,

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-08-24 13:06:49 IP:61.222.xxx.xxx 訂閱
以/DBGrid RecordChange 架構,是頗難滿足你的要求。
何況當位置改變後,也搞不清楚哪些資料需要寫入(暫時是這樣想)。

如果資料不多,乾脆就用 TStringGrid 可控制允許寫入欄位。
以及加入標記有編修過該筆,再事後一次性寫入。
省事多了。

僅參考。
b120836106
一般會員


發表:2
回覆:7
積分:1
註冊:2007-08-20

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-08-24 21:43:54 IP:203.69.xxx.xxx 訂閱
感謝EagleWolf兄及二位版主的寶貴意見 !


照EagleWolf兄的做法 , 已經可以控制DBGrid修改中不會因為誤按上下鍵而自動存檔的問題 !

但滑鼠左鍵( VK_RBUTTON )在DBGridKeyDown時卻捕捉不到 ?

procedure TFmTcPrice.DBGridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_UP) or (Key = VK_DOWN) or (Key = VK_LBUTTON) then
if dbgrid.DataSource.DataSet.State in [dsEdit,dsInsert] then
Key := VK_CLEAR;
end;




danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-08-26 08:35:01 IP:211.76.xxx.xxx 訂閱
如果在 KeyDown 中能抓到 VK_RBUTTON(這個應該是滑鼠右鍵吧! 左鍵是 VK_LBUTTON) 那也是蠻神奇的 ... (開個玩笑別介意!)
滑鼠的按鍵必須要在 DBGridMouseDown Event 中才能抓到 Button: TMouseButton
if (Button = VK_LBUTTON) then
// real work
===================引 用 b120836106 文 章===================
感謝EagleWolf兄及二位版主的寶貴意見 !


照EagleWolf兄的做法 , 已經可以控制DBGrid修改中不會因為誤按上下鍵而自動存檔的問題 !

但滑鼠左鍵( VK_RBUTTON )在DBGridKeyDown時卻捕捉不到 ??

?procedure TFmTcPrice.DBGridKeyDown(Sender: TObject; var Key: Word;
? Shift: TShiftState);
begin
? if (Key = VK_UP) or (Key = VK_DOWN) or (Key = VK_LBUTTON) then
??? if dbgrid.DataSource.DataSet.State in [dsEdit,dsInsert] then
?????? Key := VK_CLEAR;
end;




------
將問題盡快結案也是一種禮貌!
b120836106
一般會員


發表:2
回覆:7
積分:1
註冊:2007-08-20

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-08-26 23:44:24 IP:203.69.xxx.xxx 訂閱
功德圓滿 , 已可完整控制了 , 

謝謝 danny 版主 及所有熱心回答問題的先進 !
系統時間:2024-03-28 21:13:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!