如何让DBGRID的某个栏位负号及小数点只能输入1次? |
答題得分者是:leveon
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
1.不知道你的Delphi版本
2.不知道你的資料表格式 所以只好使用我的版本提供給你參考, 希望對你有幫助 我指的 FieldEditor 就是圖片中間那段 可以透過 Table 把 欄位先抓進到 Editor 中, 每一個欄位都有一佪 EditMask (左邊的Properity) EditMask 就是在指定可輸入的格式, 利用這個方式可以很容易控制使用者要輸入的內容, 但這也不是唯一的方法, 你寫的在 KeyPress 也是可以的, 不過就是一切要自己來判斷, 細節可在本站再搜尋, 也有詳細的說明 |
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
當然的, 因為你只顧到 key input 的動作, 而沒有去檢查 input 累計上來的string 是否已含- 負號,
所以如果你要再做到判斷, 可以使用 pos() 方式來檢查, string 中是否已含- 或 . , 如有則 key=0 ===================引 用 luowy651 文 章=================== 谢谢谢谢P.D大大,又学一招, 但我的code的问题在于,他还是可以同时输入两个负号或者两个小数点,而我希望只能输入一个小数点和一个负号,找了很多地方,就是不知该怎样修改 |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
樓主的意思 應該是堅持在o n k e y press做檢查
你給他的建議他不想用 雖然我也覺得你的建議比較好 樓主的Code沒用的原因 是判斷的條件不對 if DBGrid1.Fields[DBGrid1.SelectedIndex].FieldName ='sl' then 就可以攔到判斷點 ===================引 用 P.D. 文 章=================== 當然的, 因為你只顧到 key input 的動作, 而沒有去檢查 input 累計上來的string 是否已含- 負號, 所以如果你要再做到判斷, 可以使用 pos() 方式來檢查, string 中是否已含- 或 . , 如有則 key=0 ===================引 用 luowy651 文 章=================== 谢谢谢谢P.D大大,又学一招, 但我的code的问题在于,他还是可以同时输入两个负号或者两个小数点,而我希望只能输入一个小数点和一个负号,找了很多地方,就是不知该怎样修改
編輯記錄
leveon 重新編輯於 2012-06-04 19:45:47, 註解 無‧
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
感谢两位大大,我用的是sql2000,我现在的code如下,但还是不能实现只能输入一个小数点和一个负号的问题:
另:P.D.大大的方法,因小弟初学,具体怎么用还不清楚 procedure Tfm_xxhd.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if DBGrid1.Fields[DBGrid1.SelectedIndex].FieldName ='sl' then begin if (Key='.') and (Pos('.',DBGrid1.SelectedField.AsString)>0) then Key:=#0; end; if DBGrid1.Fields[DBGrid1.SelectedIndex].FieldName ='sl' then begin if (Key='-') and (Pos('-',DBGrid1.SelectedField.AsString)>0) then Key:=#0; end; if not (key in ['0'..'9','-','.',#13,#8]) then begin key:=#0; end; end;
編輯記錄
luowy651 重新編輯於 2012-06-04 23:42:18, 註解 無‧
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
//建一個繼承物件 目的為取 正在編輯的值
TdbGrid_temp = class(TDBGrid) private NowEditText:string; protected procedure SetEditText(ACol, ARow: Longint; const Value: string); override; end; procedure TdbGrid_temp.SetEditText(ACol, ARow: Longint; const Value: string); begin inherited; NowEditText := Value; end; //keypress 改這樣 procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); var tempGrid:TdbGrid_temp; tmpEditStr:string; begin tempGrid := TdbGrid_temp(Sender); tmpEditStr := tempGrid.NowEditText; if trim(tmpEditStr)='' then tmpEditStr:= tempGrid.SelectedField.AsString; if tempGrid.Fields[tempGrid.SelectedIndex].FieldName ='sl' then begin if (Key='.') and (Pos('.', tmpEditStr)>0) then begin Key:=#0; end; end; end; //接下來 在Form上放一個按鈕 procedure TForm1.Button1Click(Sender: TObject); var aa:TdbGrid_temp; begin aa:= TdbGrid_temp.Create(Self); aa.Parent := self; aa.DataSource := DBGrid1.DataSource; aa.OnKeyPress := DBGrid1.OnKeyPress; end; //在Form上會產生的Grid 請在裡面測試 我測過了 保證可用 |
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
太感谢leveon大大了,想问一下,在button1中的最后一段code:
aa.forbidden := DBGrid1.forbidden; 中的forbidden是什么?能不能重新贴一下,可能是网站原因,你可以在每个字符之间空一格,这样贴上来就不会错了,再谢! 如果我不用button1的code,直接在dbgrid中录入,会出现以下错误: 或者能否请leveon大大把测试过可用的源档案发到我的Email中? luowy651@sina.com 不胜感激!这个问题困扰我很久了,网路上也一直找不到解决的方法,我一直想解决这个问题 |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |