請問要如何動態設定DBGrid的輸入長度? |
尚未結案
|
Lily
一般會員 發表:4 回覆:6 積分:2 註冊:2002-08-02 發送簡訊給我 |
有個問題想請教各位前輩,就是如何動態去限定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 發送簡訊給我 |
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 發送簡訊給我 |
引言: Lily 你好 對於這個問題,應該在TClientDataSet的OnAfterScroll事件中處理才是感謝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上攔截不到....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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |