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

DBGrid和DBNavigator的使用問題?

答題得分者是:channel
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-26 15:23:36 IP:219.145.xxx.xxx 未訂閱
各位先進好!  Q1:   我的程式中有1個DBgrid和1個DBNavigator並連接相同的Datasource ,希望按DBNavigator的Insert按鈕,寫入一條記錄按Post(DBNavigator)按鈕後,DBgrid能夠根據某一Column排序,請問該如何解決?     Q2:   我希望下面的Code使DBNavigator的按鈕可以顯示Hint,但是執行時卻看不到Hint,請問原因並該如何解決? Code如下:  
 
  procedure TForm1.FormCreate(Sender: TObject);
  begin 
  with DBNavigator1 do
    for ix := 0 to ControlCount - 1 do
      if Controls[ix] is TNavButton  then
        with Controls[ix] as TNavButton   do
          case index of
            nbFirst: Hint := 'First';
            nbPrior: Hint := 'Prior';
            nbNext: Hint := 'Next';
            nbLast: Hint := '4567';
          end;
  end; 
 
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-26 15:34:56 IP:202.39.xxx.xxx 未訂閱
1.在 AfterPost 之後設定 IndexName 或 IndexFieldNames 2.DBNavigator1 的 ShowHint 屬性有設為 True 嗎?    --- 歡迎光臨 KTop 研究院
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-26 15:36:31 IP:211.21.xxx.xxx 未訂閱
引言: 各位先進好! Q1: 我的程式中有1個DBgrid和1個DBNavigator並連接相同的Datasource ,希望按DBNavigator的Insert按鈕,寫入一條記錄按Post(DBNavigator)按鈕後,DBgrid能夠根據某一Column排序,請問該如何解決?
若使用ADO,則可利用屬性Sort作排序。 ex:
procedure TForm1.ADOQuery1AfterPost(DataSet: TDataSet);
begin
  ADOQuery1.Sort := 'LastName ASC, DateDue DESC';
end;
引言: Q2: 我希望下面的Code使DBNavigator的按鈕可以顯示Hint,但是執行時卻看不到Hint,請問原因並該如何解決? Code如下:
 
  procedure TForm1.FormCreate(Sender: TObject);
  begin 
  with DBNavigator1 do
    for ix := 0 to ControlCount - 1 do
      if Controls[ix] is TNavButton  then
        with Controls[ix] as TNavButton   do
          case index of
            nbFirst: Hint := 'First';
            nbPrior: Hint := 'Prior';
            nbNext: Hint := 'Next';
            nbLast: Hint := '4567';
          end;
  end; 
 
DBNavigator1的屬性ShowHint必須設為True即可。
------
~小弟淺見,參考看看~
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-26 16:17:23 IP:219.145.xxx.xxx 未訂閱
謝謝兩位前輩!
iva0629
一般會員


發表:28
回覆:14
積分:8
註冊:2003-08-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-29 03:45:10 IP:61.217.xxx.xxx 未訂閱
關於第一題 那如果說我是用Table呢 又該怎麼作排序呢??
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-29 09:37:56 IP:63.84.xxx.xxx 未訂閱
iva0629您好﹗    之前的回复中hagar前輩已經有提到使用Table的排序方法了:  <> > 參考看看﹗ <><>===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-29 10:52:00 IP:219.144.xxx.xxx 未訂閱
cashxin2002前輩一直都是這麼熱心回答大家的問題,真是古道熱腸,欽佩!     另外,iva0629您好,看看這篇文章是否對您有幫助. http://www.ccw.com.cn/htm/app/aprog/01_2_22_2.asp    
在Delphi中輕鬆實現自動排序
陳建兵
在實際資料庫管理系統中,用戶對表中資料的操作,最頻繁的莫過於瀏覽查詢了,而查詢中若能提供為某字段建立的排序功能,則非常有利於用戶對'關鍵資料'的了解. Windows的用戶都知道,在“我的電腦”或“資源管理器”中打開任一文件夾,若以'詳細資料'方式查看,係統會顯示出該文件夾下的子文件夾和文件相關信息,如:名稱、類型 、大小、修改時間,用戶只需要單擊標題欄中的相應項,則系統自動按該項進行'升序'(或'降序')的排列顯示,這樣用戶便能輕鬆查看相應的文件夾或文件對象的內容. 受此啟發,考慮能不能在顯示資料的Grid表格中完成如此功能呢?答案是肯定的.下面以在Delphi中的實現方法為例,通過具體內容,介紹該功能的實現. 步驟如下: 一.先建立一資料表 該表以Delphi 中最常用的Paradox為類型,取名為Student,反映(在職)學生的基本情況.該表各字段定義如下: ─────────────────── 字段名 類型 大小 序號 Short型 / (Key*) 學號 Alpha型 6 出生日期 Date型 / 性別 Alpha型 2 婚否 Logical型 / 英語 Number型 / 高數 Number型 / PASCAL Number型 / 備注 Memo型 20 ──────────────────── 保存後,隨意往表中輸入3至5條記錄內容. 注: (1)表中必須建立關鍵索引(為首字段建立).此處為'序號'字段; (2)該表中使用了Paradox常用的幾種字段類型,但尚未全部包含. 二.建立項目,實現功能 1.新建一項目,並為表單添加相關控件,各控件主要屬性如下表: 2.建立各Click的事件代碼 Button1(打開表)的Click事件代碼如下:
  procedure TForm1.Button1Click(Sender:TObject); 
  begin 
   Table1.Open; // 打開Table1關聯的表Student 
  end; 
發表人 - mathewzhao 於 2003/11/29 11:24:40
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-29 11:13:00 IP:219.144.xxx.xxx 未訂閱
Button2(關閉表單)的Click事件代碼如下:  procedure TForm1.Button2Click(Sender:TObject);   begin    Application.Terminate;   end;     DBGrid1的TitleClick事件代碼如下: //注:本過程參數Column包含的信息量非常多   procedure TForm1.DBGrid1TitleClick(Column:TColumn);    begin    MySort(DBGrid1,Column); //調用字段排序  end;   其中,MySort(DBGrid1,Column)為自定義的排序過程,具體代碼見下述.     3.建立通用處理模塊   為使該功能具有'通用性',將其定義為一過程.   首先,預聲明過程及建立兩個全局私有變量:
 ...
 Type
 ...
procedure MySort(DBGrid0:TDBGrid; Column: TColumn);//預聲明過程
 private
 { Private declarations }
  psIndexName:string; //記錄當前索引名稱 
  plAscend:boolean;   //記錄當前索引名稱的索引狀態
 public
 { Public declarations }
end;  
其次,該過程完整代碼如下:
procedure TForm1.MySort(DBGrid0: TDBGrid; Column: TColumn);
var
//本模塊使用到的psIndexName,plAscend兩個變量見上定義 
  mode: char;       //記錄是'升序',還是'降序' 
  ColName: string; //記錄當前字段名 
  iCol: Integer;   //記錄當前列號 
begin
  with DBGrid0.DataSource.DataSet as TTable do //Table0
  begin
//檢測當前工作表是否已打開 
    if not Active then
    begin
      MessageBeep(0);
      Application.MessageBox('工作表尚未打開!','停止' , MB_OK   MB_ICONSTOP);
      Abort
    end;
//檢測當前字段是否'能排序'.以下字段類型不能排序 
  case Column.Field.DataType of
      ftBoolean,
        ftBytes,
        ftBlob, //Binary
        ftMemo,
        ftGraphic,
        ftFmtMemo, //Formatted memo
        ftParadoxOle: //OLE
        begin
          MessageBeep(0);
          Application.MessageBox(Pchar('項目'' '   Column.FieldName   ' '' '   '不能排序!'), '停止',MB_OK MB_ICONSTOP);
            Abort
        end;
    end; //case
    mode := '0';
    iCol := Column.Field.FieldNo - 1;
    try
      ColName := Column.fieldname;
      if psIndexName = Column.fieldname then
      begin //與原來同列 
        if plAscend then //升序 
        begin
          mode := '2';
          IndexName := ColName   '2'; //應'降序' 
        end
        else
        begin
          mode := '1';
          IndexName := ColName   '1'; //應'升序' 
        end;
        plAscend := not plAscend;
      end
      else
      begin //新列 
        IndexName := ColName   '2';
        plAscend := false;
        psIndexName := ColName;
      end;
    except
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-29 11:20:34 IP:219.144.xxx.xxx 未訂閱
 
on EDatabaseError do //若未有索引,則重新建立 
     begin
        Messagebeep(0);
    //以下新建索引 
        IndexName := '';
        Close;
        Exclusive := true;
        if mode = '1' then
          AddIndex(ColName + '1', ColName, [ixCaseInsensitive], '') 
        else //轉換'0'
          AddIndex(ColName + '2', ColName, [ixDescending, ixCaseInsensitive], '');
        Exclusive := false;
        Open;
        try //try 1
          if mode <> '1' then
          begin
            mode := '2'; //轉換
            plAscend := false;
          end
          else
            plAscend := true;
          IndexName := ColName + mode;
          psIndexName := ColName;
        except
          on EDBEngineError do
            IndexName := '';
        end //try 2
      end
    end;
    First;
  end; //with
  DBGrid0.SelectedIndex := iCol;
end; //End of MySort
如圖所示,當對“日期型”的“出生日期”單擊產生的排序結果。 本過程已對所有可能的錯誤進行了相應的檢測及處理,代碼是比較完整的.因此,把該過程放入你相應的單元中,對每一個DBGrid,只要傳遞不同的DBGrid及Column參數,就能實現對應資料表的自動排序處理,而事先只為某字段建立一關鍵索引即可,其它Secondery Indexes的建立均在程序中自動完成,但會為每一個建立了索引的字段生成了一些附加文件(如*.XG?,*.YG?等)。當然若有必要,可以在表單關閉前將所有的附加文件刪除。 發表人 - mathewzhao 於 2003/11/29 11:26:58
系統時間:2024-05-19 22:01:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!