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

請教 DBGrid 如何實現一個自動換欄功能..

答題得分者是:pgdennis
iann
一般會員


發表:17
回覆:31
積分:14
註冊:2003-08-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-14 18:19:16 IP:61.30.xxx.xxx 未訂閱
各位先進,您好 小弟最近碰到客戶反應一個操作上的問題,想請各位先進們幫幫忙,看有沒有法子解決,我想好久了....Orz。 在DBGrid 中,如果要結束一個欄位的編輯,需要按下ENTER,而要移往下一個欄位,則需要使用鍵盤來移動游標再按下ENTER進入編輯。這種操作模式,讓我公司一些DOS 時代客戶在更換軟體之後,在輸入資料上的極度不習慣,這樣的操作方式,讓他們在輸入資料的效率上,低落了不少。因為在DOS 時代,當輸入資料到設定的長度時,便會跳往下一個輸入欄位,所以,客戶只要一直輸入資料就是。 我嘗試使用過一些keydown事件、DataSource 的 onDataChang 事件,但是都無法達成希望的效果。麻煩各位先進們幫忙了.....感謝。 努力學習中....
------
努力學習中....
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-15 01:24:18 IP:211.74.xxx.xxx 未訂閱
個人的作法: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-15 10:24:54 IP:61.58.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-16 11:44:28 IP:61.71.xxx.xxx 未訂閱
引言: 各位先進,您好 小弟最近碰到客戶反應一個操作上的問題,想請各位先進們幫幫忙,看有沒有法子解決,我想好久了....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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-17 09:04:03 IP:61.30.xxx.xxx 未訂閱
感謝 pgdennis、yaoyao01tw、P.D. 三位大大.. 三位的回應,對我的幫助都很大,P.D 大大說的,真是與我心有戚戚焉..   那些是我公司的客戶,我很難強制他們更換,我也好盡量做到無痛升級。 我公司主管也是要求我盡量不要造成客戶使用上的抱怨,所以,我也只好努力完成他們的要求了。我也想他們換,因為以前的 > > 努力學習中.... 發表人 -
------
努力學習中....
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-17 09:46:09 IP:218.163.xxx.xxx 未訂閱
r 透過 >..難道...這樣不行.... 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
iann
一般會員


發表:17
回覆:31
積分:14
註冊:2003-08-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-17 12:16:26 IP:61.30.xxx.xxx 未訂閱
引言: r 透過 >..難道...這樣不行.... 星期一,星期二...星期日..星期一..無窮迴圈@@ < face="Verdana, Arial, Helvetica"> 剛又注意看了一下.. 錯誤訊息變成 DataSet 不是在 intsert 或者 edit 狀態.... Orz 如果我先打後邊的欄位,就不會有這問題 但是如果我從第一格key 資料,就會有這問題... >"< 努力學習中....
------
努力學習中....
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-17 12:21:20 IP:218.163.xxx.xxx 未訂閱
那在NextCol或者KeyDown中判斷DataSet.State是否為DsInsert,DsEdit阿...    < >< >< >< >< >< >< >< >< >< >< >< > 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
iann
一般會員


發表:17
回覆:31
積分:14
註冊:2003-08-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-17 16:32:27 IP:61.30.xxx.xxx 未訂閱
引言: 那在NextCol或者KeyDown中判斷DataSet.State是否為DsInsert,DsEdit阿... < >< >< >< >< >< >< >< >< >< >< >< > 星期一,星期二...星期日..星期一..無窮迴圈@@
嗯,後面的,我想我能處理嚕。 感謝您! pgdennis 大大!! 努力學習中....
------
努力學習中....
系統時間:2024-05-12 4:27:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!