首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi DBGrid 嵌入下拉方塊 (DBComboBox) 等可視元件

     編輯:Delphi

原理

TDBGrid 編輯時實際是在儲存格上浮動一個 TDBEdit。同樣可將任何資料感知元件 (如 TDBComboBox, TDBCheckBox) 浮動至獲得焦點的儲存格,實現就地下拉選擇、核取方塊等功能。

實作步驟

  1. 放置 TTable, TDataSource, TDBGrid, TDBComboBox。
  2. DBComboBox1.Visible := False (平時隱藏)。
  3. DBGrid1.OnDrawDataCell:若焦點欄位 = ComboBox 對應欄位,移動 ComboBox 至儲存格矩形並顯示。
  4. DBGrid1.OnColExit:離開該欄位時隱藏 ComboBox。
  5. DBGrid1.OnKeyPress:將按鍵訊息轉發給 ComboBox (SendMessage(Handle, WM_CHAR, ...)) 使其接收輸入。

完整程式碼


procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
  if (gdFocused in State) and (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;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  if DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then
    DBComboBox1.Visible := False;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Key <> #9) and (DBGrid1.SelectedField.FieldName = DBComboBox1.DataField) then
  begin
    DBComboBox1.SetFocus;
    SendMessage(DBComboBox1.Handle, WM_CHAR, Word(Key), 0);
  end;
end;

屬性設定範例

  • Table1.TableName := 'teacher.dbf' (欄位 SEX: '男'/'女')
  • DBComboBox1.DataField := 'SEX'; DataSource := DataSource1; Items := '男|女'; Visible := False

擴充

同樣手法可嵌入 TDBCheckBox (布林欄位)、TDBDateTimePicker (日期欄位)、甚至自訂對話框 (雙擊儲存格彈出)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved