Delphi提供了功能強大的DBGrid組件,以方便進行數據庫應用程序設計。但是如果我們僅僅利用DBGrid組件,每一個獲得焦點(Grid)只是一個簡單的文本編輯框,不方便用戶輸入數據。Delphi也提供了一些其他數據組件來方便用戶輸入,比如DBComboBox,DBCheckBox等組件,但這些組件卻沒有DBGrid功能強大。
Delphi能不能象Visual Foxpro那樣讓DBGrid中獲得焦點網格可以是其它可視數據組件以方便用戶呢?其實我們可以通過在DBGrid中插入其他可視組件來實現這一點。
Delphi對DBGrid處理的內部機制,就是在網格上浮動一個組件——DBEdit組件。你輸入數據的網格其實是浮動DBEdit組件,其他未獲得焦點地方不過是圖像罷了。所以,在DBGrid中插入其他可視組件就是在網格上浮動一個可視組件。因此任何組件,包括從簡單的DbCheckBox到複雜的對話框,都可以在DBGrid中插入。下面就是一個如何在DBGrid中插入DBComboBox組件的步驟,採用同樣的辦法可以插入其他組件。
二、在DBGrid網格上浮動DBComboBox組件的實例
1、在Delphi中新建一個項目。
2、分別拖動的Data Access組件板上DataSource、Table,Data Controls組件板上DBGrid,DBComboBox四個組件到Form1上。
3、設置各個組件的屬性如下:
對象 |
屬性 |
設定植 |
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 |
|
Items |
'男'| '女' |
注意:我在這裏用了Teacher.dbf,那是反映教職工的性別,只能是“男”或者是“女”。 |
4、DrawDataCell事件是繪製單元格,當獲得焦點網格所對應的字段與組合框所對應的字段一致時,移動組合框到獲得焦點的網格上,並且使組合框可視,從而達到在DBGrid指定
列上顯示DBComboBox的功能。設置DBGrid1的OnDrawDataCell事件如下:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
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;
三、在DBGridEh的方法;
DBGridEh實現這些功能只是需要設置設置屬性就可以了,爲了提高效率,我還是喜歡使用DBGrideh。
DataSet1(版本)包括的字段有(VersionID, VersionName, ProjectID);
DataSet2(項目)包括的字段有(ProjectID,ProjectName)
需要使用靜態字段,在DataSet1中新增加一個你需要下拉的字段(ProjectName(String)),設定它的字段FieldKind 設爲 fkLookup , keyfield設爲ProjectID,並設定dataset1中的需要下拉靜態字段的lookupdateset爲dataset2, 再設定Dataset1中靜態字段的lookupkeyField(ProjectID) , loopupresultfield(ProjectName) 等屬性你需要的。