在DBGrid修改資料時 , 如何避免因上下移動(Move Mouse or 按到上下鍵)而自動存檔 |
答題得分者是:eaglewolf
|
b120836106
一般會員 發表:2 回覆:7 積分:1 註冊:2007-08-20 發送簡訊給我 |
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
在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 發送簡訊給我 |
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
改成在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 發送簡訊給我 |
|
esp_pzj
初階會員 發表:32 回覆:70 積分:40 註冊:2007-02-09 發送簡訊給我 |
請參考此方式:
在連結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 發送簡訊給我 |
|
b120836106
一般會員 發表:2 回覆:7 積分:1 註冊:2007-08-20 發送簡訊給我 |
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
你沒有看懂 我 或 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 發送簡訊給我 |
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
若是這樣
在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 發送簡訊給我 |
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 發送簡訊給我 |
|
b120836106
一般會員 發表:2 回覆:7 積分:1 註冊:2007-08-20 發送簡訊給我 |
感謝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 發送簡訊給我 |
如果在 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |