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

如何让DBGRID的某个栏位负号及小数点只能输入1次?

答題得分者是:leveon
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-06-03 17:55:31 IP:58.101.xxx.xxx 訂閱

各位大大好,我的DBGRID中某个栏位,因为要输入数字,所以不允许输入两个小数点,同时负号只能输入在第一位,而且不能输入两个负号,请教各位大大,该怎么做?小弟初学,这个问题困扰我很久
編輯記錄
luowy651 重新編輯於 2012-06-03 04:21:53, 註解 無‧
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-06-04 14:06:29 IP:59.120.xxx.xxx 未訂閱
不要執著在 GRID 上要控制物件, 請直接就 DBGRID 連結的 Table FieldEditor 上來設定及控制
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-06-04 14:16:54 IP:122.234.xxx.xxx 訂閱
谢谢P.D大大,小弟不知怎么做,我现在的code如下:


procedure Tfm_xxhd.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin

if DBGrid1.SelectedField = adoTable1.FieldByName('sl') then
begin
if not (key in ['0'..'9','-','.',#13,#8])then
begin
key:=#0;
end;
end;

end;
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-06-04 18:02:16 IP:118.169.xxx.xxx 未訂閱
1.不知道你的Delphi版本
2.不知道你的資料表格式

所以只好使用我的版本提供給你參考, 希望對你有幫助
我指的 FieldEditor 就是圖片中間那段
可以透過 Table 把 欄位先抓進到 Editor 中, 每一個欄位都有一佪 EditMask (左邊的Properity)
EditMask 就是在指定可輸入的格式, 利用這個方式可以很容易控制使用者要輸入的內容,
但這也不是唯一的方法, 你寫的在 KeyPress 也是可以的, 不過就是一切要自己來判斷,
細節可在本站再搜尋, 也有詳細的說明

編輯記錄
P.D. 重新編輯於 2012-06-04 04:08:51, 註解 無‧
P.D. 重新編輯於 2012-06-04 04:10:57, 註解 無‧
P.D. 重新編輯於 2012-06-04 04:13:04, 註解 無‧
P.D. 重新編輯於 2012-06-04 04:13:55, 註解 無‧
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-06-04 21:57:56 IP:58.101.xxx.xxx 訂閱
谢谢谢谢P.D大大,又学一招,
但我的code的问题在于,他还是可以同时输入两个负号或者两个小数点,而我希望只能输入一个小数点和一个负号,找了很多地方,就是不知该怎样修改
編輯記錄
luowy651 重新編輯於 2012-06-04 07:59:07, 註解 無‧
P.D.
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-06-04 22:17:23 IP:118.169.xxx.xxx 未訂閱
當然的, 因為你只顧到 key input 的動作, 而沒有去檢查 input 累計上來的string 是否已含- 負號, 
所以如果你要再做到判斷, 可以使用 pos() 方式來檢查, string 中是否已含- 或 . , 如有則 key=0
===================引 用 luowy651 文 章===================
谢谢谢谢P.D大大,又学一招,
但我的code的问题在于,他还是可以同时输入两个负号或者两个小数点,而我希望只能输入一个小数点和一个负号,找了很多地方,就是不知该怎样修改
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-06-05 09:44:22 IP:118.165.xxx.xxx 訂閱
樓主的意思 應該是堅持在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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-06-05 13:37:11 IP:122.234.xxx.xxx 訂閱
感谢两位大大,我用的是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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-06-05 21:02:00 IP:118.165.xxx.xxx 訂閱
//建一個繼承物件 目的為取 正在編輯的值
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-06-06 09:18:33 IP:125.122.xxx.xxx 訂閱
太感谢leveon大大了,想问一下,在button1中的最后一段code:
aa.forbidden := DBGrid1.forbidden; 中的forbidden是什么?能不能重新贴一下,可能是网站原因,你可以在每个字符之间空一格,这样贴上来就不会错了,再谢!

如果我不用button1的code,直接在dbgrid中录入,会出现以下错误:
或者能否请leveon大大把测试过可用的源档案发到我的Email中? luowy651@sina.com 不胜感激!这个问题困扰我很久了,网路上也一直找不到解决的方法,我一直想解决这个问题


編輯記錄
luowy651 重新編輯於 2012-06-05 19:27:23, 註解 無‧
luowy651 重新編輯於 2012-06-05 19:32:25, 註解 無‧
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-06-06 09:35:18 IP:118.165.xxx.xxx 訂閱
 這個站真是怪呢 不知道在   aa.on keypress := DBGrid1.




luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#12 引用回覆 回覆 發表時間:2012-06-06 09:40:07 IP:125.122.xxx.xxx 訂閱
再谢leveon大大,果然成了呢!

只是如果不用button1,就还是会出现上面图中所示的错误,小弟初学,不知该怎样修改?
因为这样一来,会出现不能在原来的dbgrid中录入数字,而只能在一个新的dbgrid中录入数字了

真是不好意思,一次次地麻烦leveon大大
編輯記錄
luowy651 重新編輯於 2012-06-05 19:41:27, 註解 無‧
luowy651 重新編輯於 2012-06-05 19:49:11, 註解 無‧
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2012-06-06 09:52:12 IP:118.165.xxx.xxx 訂閱
因為你用的是TDBGrid 阿 ,直接修改DBGrids.pas  VCL的源碼 
改完 記得要重編VCL的Source




luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#14 引用回覆 回覆 發表時間:2012-06-06 10:08:16 IP:125.122.xxx.xxx 訂閱
再谢!
小弟初学,见笑了!
不胜感激之至!
系統時間:2024-04-26 21:55:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!