請教 DBGrid 如何實現一個自動換欄功能.. |
答題得分者是:pgdennis
|
iann
一般會員 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
各位先進,您好
小弟最近碰到客戶反應一個操作上的問題,想請各位先進們幫幫忙,看有沒有法子解決,我想好久了....Orz。
在DBGrid 中,如果要結束一個欄位的編輯,需要按下ENTER,而要移往下一個欄位,則需要使用鍵盤來移動游標再按下ENTER進入編輯。這種操作模式,讓我公司一些DOS 時代客戶在更換軟體之後,在輸入資料上的極度不習慣,這樣的操作方式,讓他們在輸入資料的效率上,低落了不少。因為在DOS 時代,當輸入資料到設定的長度時,便會跳往下一個輸入欄位,所以,客戶只要一直輸入資料就是。
我嘗試使用過一些keydown事件、DataSource 的 onDataChang 事件,但是都無法達成希望的效果。麻煩各位先進們幫忙了.....感謝。 努力學習中....
------
努力學習中.... |
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
個人的作法:
1.覆寫Dbgrid(偷吃步),新增一Procedure,處理跳欄位的動作.
2.在Dbgrid.OnKeyDown Event中呼叫此Procedure
code如下
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids; type TDBGrid=class(DBGrids.TDBGrid) public procedure NextCol(); end; TForm1 = class(TForm) ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; ADOTable1DSDesigner: TAutoIncField; ADOTable1DATE1: TDateTimeField; ADOTable1MONTH: TIntegerField; ADOTable1IN1: TIntegerField; ADOTable1OUT1: TIntegerField; ADOTable1Descript: TWideStringField; ADOTable1YEAR: TIntegerField; procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin DBGrid1.NextCol; end; { TDBGrid } procedure TDBGrid.NextCol; var Idx:integer; begin If Length(InplaceEditor.text) = SelectedField.Size then begin Idx:= Self.Col 1; if Idx > Self.Columns.Count then Idx:= Self.Columns.Count; {如果沒做這個動作,則資料並不會進入SelectedField中} self.SelectedField.AsString:= InplaceEditor.text; {如果沒做這個動作,當移到下一個欄位時,會把原先輸入的值帶到下個欄位} InplaceEditor.Clear; Self.FocusCell(Idx,Row,True); end; end; end.星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@ |
yaoyao01tw
一般會員 發表:28 回覆:17 積分:9 註冊:2003-01-28 發送簡訊給我 |
procedure TFRM_BASEFORM.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #13) // 按下 Enter
then begin
if (not (ActiveControl is TDBGrid)) and
(not (ActiveControl is TCustomMemo)) then
begin
Key := #0; // eat enter key
Perform(WM_NEXTDLGCTL, 0, 0); // move to next control
end
else if (ActiveControl is TcustomDBGrid) then
begin
with TDBGrid(ActiveControl) do
if SelectedIndex < (FieldCount - 1) then
begin
TDBGrid(ActiveControl).selectedindex := TDBGrid(ActiveControl).SelectedIndex 1;
TDBGrid(ActiveControl).SetFocus;
end
else
begin
SelectedIndex := 0;
TDBGrid(ActiveControl).SetFocus;
end;
end;
end;
end;
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 各位先進,您好 小弟最近碰到客戶反應一個操作上的問題,想請各位先進們幫幫忙,看有沒有法子解決,我想好久了....Orz。 在DBGrid 中,如果要結束一個欄位的編輯,需要按下ENTER,而要移往下一個欄位,則需要使用鍵盤來移動游標再按下ENTER進入編輯。這種操作模式,讓我公司一些DOS 時代客戶在更換軟體之後,在輸入資料上的極度不習慣,這樣的操作方式,讓他們在輸入資料的效率上,低落了不少。因為在DOS 時代,當輸入資料到設定的長度時,便會跳往下一個輸入欄位,所以,客戶只要一直輸入資料就是。 我嘗試使用過一些keydown事件、DataSource 的 onDataChang 事件,但是都無法達成希望的效果。麻煩各位先進們幫忙了.....感謝。 努力學習中....給你一個良心的建議, 其實這也是我經歷以來的痛, DOS與WINDOW原本就完全不同的作業模式, 當然我們可以儘量模擬DOS方式來滿足客戶的需求, 可是這樣的事情是層出不窮的, 就算你解決了ENTER問題, 還是會有下一個DOS與WINDOW不合的要解決, 如果你一直深陷這樣的包袱, 程式寫下來不但維護成本增高, 到頭來寫的不淪不類, 相信我, 我也是如此走來的! 所以重點是在於你必須教育你的客戶如何來看待WINDOW的介面, 務必使他們能勇於面對這道鴻溝, 尤其WINDOW的介面已不再有幾年的好光景, 未來走向WEB, Internet是對於DOS更是南轅北轍, 如果你的客戶無法由DOS適應到WINDOW, 未來更是難了!因此面對舊有的DOS習性的客戶, 設計者除了要有好的設計外, 其實你還要兼具心理輔導的角色, 協助他們調適走向新的介面, 而這項工作事實上比程式撰寫還重要, 當然有些可以做到DOS的我們還是開發出來, 讓操作者可以沿續舊有方式, 同時接受新的操作就得靠你完成了, 加油! PS:我舊有DOS的客戶已全部都轉型上WINDOW, 今年11月最後一位也要上了, 我一共有近50家舊DOS客戶, 你就可以知道這幾年我是如何渡過, 剛開始大家反彈都很大, 但我運用資方力量來壓制勞方不得不的做法, 再加上一些適時的調整, 現在我再回頭問這些操作者使用狀況, 其實多數都說不若當時想像的那麼恐怖, 認為現在這樣的操作方式也是蠻好的, 甚至有些比在DOS上輸入更加快了! 所以建議你擅用WINDOWS介面的長處來彌補DOS的瑕處~~~~~ |
iann
一般會員 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
|
iann
一般會員 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
|
iann
一般會員 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |