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

請問要如何動態設定DBGrid的輸入長度?

尚未結案
Lily
一般會員


發表:4
回覆:6
積分:2
註冊:2002-08-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-17 23:48:10 IP:203.203.xxx.xxx 未訂閱
有個問題想請教各位前輩,就是如何動態去限定DBGrid, 某個欄位在不同筆數時輸入的長度呢? 我用Delphi7 TClientDataSet元件動態產生兩個欄位:FID,FVALUE。 需求是在DBGRID編輯時: 第一筆=> FVALUE只允許使用者輸入小於七個Byte長度的整數 第二筆=> FVALUE只允許使用者輸入小於六個Byte長度的整數 第三筆=> FVALUE只允許使用者輸入小於三個Byte長度的整數 下面是我試過的方法: =================================== A) 設定TFloatField的EditFormat、Display Format或設定TField的、Display Width 這種作法在程式執行的時候會有錯誤訊息產生。不知道是不是因為用TClientDataSet動態產生的表格的緣故。 B) 在DBGrid的OnCelEnter或者cdsData的AfterScroll事件動態去設定TField的MaskEdit屬性。 不過這種作法可是只有第一筆的設定值有效,動態修改MaskEdit屬性似乎都沒有用,程式跑起來永遠只認得第一個設定,其他的動態設定他都不認得。 C) 在DBGrid的OnKeyDown、OnKeyPress、OnKeyup事件去 動態攔截InPlaceEdit.GetTextLen,(或者用Length(InPlaceEdit.Text) 當InPlaceEdit.GetTextLen > 7(或6時) 設定Key =0 (或#0) 可是方法,出來的位數都怪怪的,當設定為7時, 第一次新增都可以打到8位,可是新增完post回來再修改的時候,又是可以正常限制七位 =============================================== 因為我是用TClientDataSet去動態產生MemoryTable。(老闆規定不能用Third Party的元件,只能用Delphi內部提供的元件。) 所以也不知道要如何控制OnGetText/OnSetText的事件:~~ 請教各位前輩什麼更好的方式可以建議嗎? 非常感謝
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-18 18:44:51 IP:211.20.xxx.xxx 未訂閱
Lily 你好    對於這個問題,應該在TClientDataSet的OnAfterScroll事件中處理才是
Procedure TForm1.ClientDataSet1AfterScroll(Sender:TObject);
Begin
  Case ClientDataSet1.Recno Of
    1:Begin  // 第一筆
       ClientDataSet1.Fieldbyname('FVALUE').EditFoemat := .... ;
    End;
    2:Begin  // 第二筆
    End;
    3:Begin
    End;
  End;    End;
參考看看,祝好運!
Lily
一般會員


發表:4
回覆:6
積分:2
註冊:2002-08-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-19 08:54:24 IP:211.21.xxx.xxx 未訂閱
引言: Lily 你好 對於這個問題,應該在TClientDataSet的OnAfterScroll事件中處理才是
Procedure TForm1.ClientDataSet1AfterScroll(Sender:TObject);
Begin
  Case ClientDataSet1.Recno Of
    1:Begin  // 第一筆
       ClientDataSet1.Fieldbyname('FVALUE').EditFoemat := .... ;
    End;
    2:Begin  // 第二筆
    End;
    3:Begin
    End;
  End;    End;
參考看看,祝好運!
感謝Chance36君的回應。 不過這個做法我先前就已經試過了,並沒有辦法達到需求。 我的SourceCode如下: 1. Form Create時執行 procedure CreateTempData; //產生顯示所需的暫存資料集 ============================= procedure TFrmA01.CreateTempData; Const StrArr : Array[0..2] of String =('FG_GRP1','FID','FVALUE'); sFIDArr : Array[0..4] of String=('A01','A02','A04','A04','LF'); Var i : Integer; S :String; begin // 建立顯示所需之暫存資料集 with cdsData do begin for i := 0 to 2 do begin with FieldDefs.AddFieldDef do begin { if i <> 2 then DataType := ftString else if i = 2 then DataType := ftInteger; } DataType := ftString; Name := StrArr[i]; end; end; with IndexDefs.AddIndexDef do begin Fields := 'FG_GRP1'; Name := 'idxFG_GRP1' end; CreateDataSet; IndexDefs.Update; IndexName := 'idxFG_GRP1'; end; // 設定DBGRID DbGdMain.Columns[0].FieldName := 'FID'; DbGdMain.Columns[1].FieldName := 'FVALUE'; cdsData.FieldByName('FVALUE').Alignment := taRightJustify; end; ============================= 2.照您前面所說的在TClientDataSet的OnAfterScroll事件中控制 ============================= procedure TFrmA01.cdsDataAfterScroll(DataSet: TDataSet); begin inherited; if not bInit then begin case cdsData.RecNo of 0 : (cdsData.Fieldbyname('FVALUE') as TFloatField).EditFormat := '######0'; 1 : (cdsData.Fieldbyname('FVALUE') as TFloatField).EditFormat := '######0'; 2 : (cdsData.Fieldbyname('FVALUE') as TFloatField).EditFormat := '#####0'; 3 : (cdsData.Fieldbyname('FVALUE') as TFloatField).EditFormat := '##0'; end; end; end ============================= 執行後測試無效,使用者仍然可在DBGrid的對欄位[FVALUE]上輸入任意長度的數字。 存檔或者跳下一個欄位的時候會引發錯誤(Invalid Class Typecast) 這個錯誤在Source上攔截不到....
Lily
一般會員


發表:4
回覆:6
積分:2
註冊:2002-08-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-16 15:26:21 IP:211.21.xxx.xxx 未訂閱
最後這個問題我是採取 1.設定該TField的EditMask長度為7(!9999999;1; ) 1. 在DBGrid的OnKeyDown、OnKeyPress、OnKeyup事件去 動態攔截InPlaceEdit.GetTextLen,(或者用Length(InPlaceEdit.Text) 當InPlaceEdit.GetTextLen > 7(或6時) 設定Key =0 (或#0) 不過要在KeyDown、KeyPress同時攔截結果看起來才會比較正常。
系統時間:2024-06-27 22:30:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!