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這個Windows 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;
程式在中文Windows 98,Delphi 4.015 下除錯通過。希望本文能讓你更方便快速的開發資料庫應用程式。