在delphi的dbgrid中插入其他可視組件_delphi教程

來源:互聯網
上載者:User
Delphi提供了功能強大的 DBGrid組件,以方便進行資料庫應用程式設計。不過如果我們僅僅利用DBGrid組件,每一個獲得焦點(Grid)只是個簡單的文本編輯框,不方便使用者輸入資料。Delphi也提供了一些其他資料群組件來方便使用者輸入,比如DBComboBox,DBCheckBox等組件,但這些組件卻沒有DBGrid功能強大。Delphi能不能象Visual Foxpro那樣讓DBGrid中獲得焦點網格能是其他可視資料群組件以方便使用者呢?其實我們能通過在DBGrid中插入其他可視組件來實現這一點。

Delphi對DBGrid處理的內部機制,就是在網格上浮動一個組件——DBEdit組件。你輸入資料的網格其實是浮動DBEdit組件,其他未獲得焦點地方不過是映像罷了。所以,在DBGrid中插入其他可視組件就是在網格上浮動一個可視組件。因此所有組件,包括從簡單的DbCheckBox到複雜的對話方塊,都能在DBGrid中插入。下面就是個怎麼在DBGrid中插入DBComboBox組件的步驟,採用同樣的辦法能插入其他組件。

1、 在Delphi 4.0中建立一個項目。

2、 分別拖動的Data Access組件板上DataSource、Table,Data Controls組件板上DBGrid,DBComboBox四個組件到Form1上。

3、 設定各個組件的屬性如下:

rcf1對象 屬性 設定植
Form1 Caption  在DBGrid中插入SpinEdit組件樣本
DataSource1 DataSet Table1
Table1 DatabaseName DBDEMOS
  TableName teacher.DBF
  Active True
DBGrid1 DataSource DataSource1
DBComboBox1 DataField SEX
  DataSource DataSource1
  Visible False
  Strings Items.    男| 女

意:我在這裡用了Teacher.dbf,那是反映教職工的性別,只能是“男”或是“女”。

4、 DrawDataCell事件是繪製儲存格,當獲得焦點網格所對應的欄位和組合框所對應的欄位一致時,移動組合框到獲得焦點的網格上,並且
使組合框可視,從而達到在DBGrid指定列上顯示DBComboBox的功能。設定DBGrid1的OnDrawDataCell事件如下:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
  if (gdFocused in State) then
  begin
    if (Field.FieldName = DBComboBox1.DataField ) then
    begin
      DBComboBox1.Left := Rect.Left + DBGrid1.Left;
      DBComboBox1.Top := Rect.Top + DBGrid1.top;
      DBComboBox1.Width := Rect.Right - Rect.Left;
      DBComboBox1.Height := Rect.Bottom - Rect.Top;
      DBComboBox1.Visible := True;
   end;
 end;
end;

5、 DBGrid指定儲存格未獲得焦點時不顯示DBComboBox,設定DBGrid1的OnColExit事件如下:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then
  begin
    DBComboBox1.Visible := false;
  end;
end;

6、 當DBGrid指定列獲得焦點時DrawDataCell事件只是繪製儲存格,並顯示DBComboBox,不過DBComboBox並沒有獲得焦點,資料的輸入還是在儲存格上進行。在DBGrid1的KeyPress事件中調用SendMessage這個 視窗系統 API函數將資料輸入傳輸到DBComboBox上,從而達到在DBComboBox上進行資料輸入。因此還要設定KeyPress事件如下:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (key < > chr(9)) then
  begin
    if (DBGrid1.SelectedField.FieldName  =DBComboBox1.DataField) then
    begin
       DBComboBox1.SetFocus;
       SendMessage(DBComboBox1.Handle, WM_Char, word(Key), 0);
    end;
  end;
end;

程式在中文視窗系統 98,Delphi 4.015 下調試通過。希望本文能使你能更加方便快捷的研發資料庫應用程式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.