---- Delphi对DBGrid处理的内部机制,就是在网格上浮动一个组件——DBEdit组件。你输入数据的网格其实是浮动DBEdit组件,其他未获得焦点地方不过是图像罢了。所以,在DBGrid中插入其他可视组件就是在网格上浮动一个可视组件。因此任何组件,包括从简单的DbCheckBox到复杂的对话框,都可以在DBGrid中插入。下面就是一个如何在DBGrid中插入DBComboBox组件的步骤,采用同样的办法可以插入其他组件。 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; 这可是猛料里的正点货
butfly 你在阿 吼 吼
可是我单步运行时, 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; 这段函数根本没执行,为什么? 我的确点击了,还输入了字符,可就是没反应。
DBGrid,它本身自带就有的哦。colmun.piclist
摸索半天,原来是TDBGrid.colums.state的问题,当为csDefault时,可触发OnDrawDataCell事件,可是界面设计时我就已经对DBGrid改动过了,例如把字段名改为中文,这样其属性就变为csCustomized了,难怪那个事件不触发。唉,虽然知道症结所在,但我的功能实现不了。我要在点击某一字段时出现一下拉框,当你输入时,下拉列表内容自动变化。 我用picklist时,搜索的比较内容用的是DBGMark.SelectedField.Text,代码如下 procedure TBasicInfo.DBGMarkKeyPress(Sender: TObject; var Key: Char); begin if (DBGMark.SelectedField.FieldName = 'CourNameC') then begin DBGMark.Columns[0].PickList.text:=SearchByPYIndexStr(Sourcelist.Items, DBGMark.SelectedField.Text); end; end; 结果输入一个字符之后就没反应了,需要转移焦点后再给它焦点才出现下拉框,而不是所期望的一边输入下面的列表框一边相应变化。希望各位继续指教,被问题困扰的滋味真不好受!
有那么复杂吗?Delphi本身就支持! 假设你有一个Table1,一个DataSource1(设置DataSet为Table1),一个DBGrid1(设置DataSource为DataSource1)。 现在在DBGrid1上双击,在弹出的窗口中选择Add All Fields,然后在任何Column设置PickList属性就全OK了
begin
if (gdFocused in State) then
begin
if (Field.FieldName = ..) then
begin
ComboBox1.Left := Rect.Left + DBGrid1.Left;
ComboBox1.Top := Rect.Top + DBGrid1.top;
ComboBox1.Width := Rect.Right - Rect.Left;
ComboBox1.Height := Rect.Bottom - Rect.Top;
ComboBox1.Visible := True;
end;
end;
end;
---- Delphi对DBGrid处理的内部机制,就是在网格上浮动一个组件——DBEdit组件。你输入数据的网格其实是浮动DBEdit组件,其他未获得焦点地方不过是图像罢了。所以,在DBGrid中插入其他可视组件就是在网格上浮动一个可视组件。因此任何组件,包括从简单的DbCheckBox到复杂的对话框,都可以在DBGrid中插入。下面就是一个如何在DBGrid中插入DBComboBox组件的步骤,采用同样的办法可以插入其他组件。
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; 这可是猛料里的正点货
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;
这段函数根本没执行,为什么?
我的确点击了,还输入了字符,可就是没反应。
我用picklist时,搜索的比较内容用的是DBGMark.SelectedField.Text,代码如下
procedure TBasicInfo.DBGMarkKeyPress(Sender: TObject; var Key: Char);
begin
if (DBGMark.SelectedField.FieldName = 'CourNameC') then
begin
DBGMark.Columns[0].PickList.text:=SearchByPYIndexStr(Sourcelist.Items, DBGMark.SelectedField.Text);
end;
end;
结果输入一个字符之后就没反应了,需要转移焦点后再给它焦点才出现下拉框,而不是所期望的一边输入下面的列表框一边相应变化。希望各位继续指教,被问题困扰的滋味真不好受!
假设你有一个Table1,一个DataSource1(设置DataSet为Table1),一个DBGrid1(设置DataSource为DataSource1)。
现在在DBGrid1上双击,在弹出的窗口中选择Add All Fields,然后在任何Column设置PickList属性就全OK了