線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1980
推到 Plurk!
推到 Facebook!

dbgrid readonly的問題

答題得分者是:cancer
shandau
一般會員


發表:5
回覆:6
積分:2
註冊:2011-03-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-04-21 22:44:59 IP:118.231.xxx.xxx 訂閱
請問一下各位大大,dbgrid的readonly設為false,是否表示DataSource1.DataSet.State in ( dsEdit)? 那還需要設個修改功能的sb嗎 ?
(我是用simpledataset~如果按修改 再用存檔 simpledataset.applyupdates 第一次ok ,再按修改鍵 修改後存檔就死給我看了>_<) 請指教 Tks
if (DataSource1.DataSet.State = dsBrowse) and
((not DataSource1.DataSet.Bof) or
(not DataSource1.DataSet.Eof)) then
DataSource1.DataSet.edit;

cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-04-22 14:53:14 IP:220.128.xxx.xxx 未訂閱
Hello,
DBGrid 設 ReadOnly 不等於不讓使用編輯 DataSet,因為您仍然可以提供 TDBEdit 給人使用,或者以程式碼來修改 DataSet 內容。

===================引 用 shandau 文 章===================
請問一下各位大大,dbgrid的readonly設為false,是否表示DataSource1.DataSet.State in ( dsEdit)? 那還需要設個修改功能的sb嗎 ?
(我是用simpledataset~如果按修改 再用存檔 simpledataset.applyupdates 第一次ok ,再按修改鍵 修改後存檔就死給我看了>_<) 請指教 Tks
if (DataSource1.DataSet.State = dsBrowse) and
((not DataSource1.DataSet.Bof) or
? (not DataSource1.DataSet.Eof)) then
??? DataSource1.DataSet.edit;

shandau
一般會員


發表:5
回覆:6
積分:2
註冊:2011-03-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-04-22 15:34:34 IP:114.140.xxx.xxx 訂閱
感謝大大的回覆,不過我的問題在於sbedi,sbpost修改和存檔功能會出錯,想說是不是dbgrid設定的問題??
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-04-22 20:15:31 IP:220.128.xxx.xxx 未訂閱
您好
看一下
if (DataSource1.DataSet.State = dsBrowse) and
((not DataSource1.DataSet.Bof) or
(not DataSource1.DataSet.Eof)) then
DataSource1.DataSet.edit;

(not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof) // 用 and 才對

當 DataSet 在 EOF 時,前半段判斷出不在 BOF 時,結果是 true,中間用 or,所以右方不用判斷,就傳回 true。
我覺得奇怪,使用者無法利用 TDBGrid 把 DataSet 置於 BOF 或 EOF,進入編輯模式前,為什麼要判斷 BOF 和 EOF?
如果 DataSet 在 BOF 或 EOF,一定是程式弄出來的,使用者辦不到的,例如
DataSet.First;
while not DataSet.EOF do
begin
//----
DataSet.Next;
end;
// 這裡記得要加 DataSet.First; 即使下面用了 Close,原因是程式碼有時候會整段搬移或加碼,
DataSet.Close;

使用者按下編輯,就要給他編輯,不能因為 DataSet 在 Bof 或 Eof,就禁止修改。如果是項次,存檔前先呼叫 DataSet.First; 下次就不用判斷 BOF 和 EOF,順便自動刪除最後一筆空白資料。
shandau
一般會員


發表:5
回覆:6
積分:2
註冊:2011-03-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-04-22 22:56:03 IP:110.24.xxx.xxx 訂閱
謝謝大大回覆:
轉貼原程式文
利用Tdataset:的bof和eof屬性當這兩個接為True代表Tdataset這個資料集是空的,如果有任一個屬性是false
就代表里面是有資料,所以才能對有資料的資料集進行修改或刪除的動作.
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-04-22 23:52:01 IP:210.202.xxx.xxx 未訂閱
Hello,您想清楚
(not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof)
如果 DataSet 是空的,它有可能在 EOF,也可能在 BOF。
如果 DataSet 不是空的,它既不在 EOF,也不在 BOF。
如果一開始 DataSet 在 EOF,那麼 not DataSource1.DataSet.Bof 就會是 true,既然是 true,or 右邊的判斷式就不會判斷下去,而您已經允許 DataSet 在 EOF 時進入編輯狀態了,不是嗎?這並非您要的。


用 (not DataSource1.DataSet.Bof) and (not DataSource1.DataSet.Eof) // 既不在 BOF 也不在 EOF
或 not (DataSource1.DataSet.Bof or DataSource1.DataSet.Eof)

用 if DataSet.Recordcont > 0 不是比較合理嗎?RecordCount 本來就是筆數的意思,何必用迂迴的方法?寫程式應力求簡潔。

===================引 用 shandau 文 章===================
謝謝大大回覆:
轉貼原程式文
利用Tdataset:的bof和eof屬性當這兩個接為True代表Tdataset這個資料集是空的,如果有任一個屬性是false
就代表裡面是有資料,所以才能對有資料的資料集進行修改或刪除的動作.
shandau
一般會員


發表:5
回覆:6
積分:2
註冊:2011-03-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-04-23 22:22:47 IP:114.140.xxx.xxx 訂閱
謝謝樓上大大回覆,說的的確是有道理
我個人是覺得假設gridonly設成false,如果是代表將DataSource1.DataSet.State in ( dsEdit) 那這個edit按鈕似忽就看不出存在的必要,而沒有修改權限的使用者就在進入form時將grid設成唯讀?而有修改權限的使用者則直接使用存檔功能儲存異動資料?
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-04-27 14:24:57 IP:220.128.xxx.xxx 未訂閱
您好,畫面一打開,馬上設定所有東西是唯讀,當使用者按新增或修改時,才去判斷權限,尤其是修改,常常是針對人而言,而不是針對畫面,您打的單,就只有您能修改和刪除。
權限有,把 dataset 進入編輯狀態,並開放介面元件供編輯。
但注意 TDBGrid 在 Delphi 7 和 2006 有臭蟲,ReadOnly 的 true 和 false 多切換幾次之後,在 DBGrid 上面按 Tab 鍵,游標不會往右跑,而是會往下跑,所以,我都用 Options.dgEditing 來控制。
===================引 用 shandau 文 章===================
謝謝樓上大大回覆,說的的確是有道理
我個人是覺得假設gridonly設成false,如果是代表將DataSource1.DataSet.State in ( dsEdit) 那這個edit按鈕似忽就看不出存在的必要,而沒有修改權限的使用者就在進入form時將grid設成唯讀?而有修改權限的使用者則直接使用存檔功能儲存異動資料?
系統時間:2024-07-02 16:29:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!