高分求教,如何在dbgrid中加一列按钮 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最简单的就是把那一列的ButtonStyle设置为cbsEllipsis;然后在OnEditButtonClick事件中写程序要不你就在OnDrawColumnCell事件中自己画 最简单的方法,就是用第三方控件。Ehlib或cxgrid 我需要的是这个列都是一个button,不是三个小点的那种。如果有知道的可否告之详细代码。分不够可以另外加。 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);var btn:tbutton;begin if datacol<> 5 then exit;//在第6列加按钮 btn:=TButton.Create(nil); btn.Caption:='查看'; btn.Left:=TDBGrid(Sender).Left+Rect.Left+5; btn.top:=TDBGrid(Sender).top +Rect.top +3; btn.Width:=Rect.Right-Rect.Left+3; btn.Height:=Rect.Bottom-Rect.top +3; btn.Parent:=self;end; 楼上的方法实现是没问题,但是当拖动grid的滚动条的时候,会出来很多按钮列。不知道有没有方法解决。 用这个试试,要直接运行可执行文件试 if ACol<> 5 then exit;//在第6列加按钮 try self.FindComponent('but'+inttostr(acol)+'_'+inttostr(arow)).Free; except end; btn:=TButton.Create(Self); btn.Caption:='查看'; btn.Left:=Self.StringGrid1.Left+Rect.Left+5; btn.top:=self.StringGrid1.Top+Rect.top +3; btn.Width:=Rect.Right-Rect.Left; btn.Height:=Rect.Bottom-Rect.top ; btn.Name:='but'+inttostr(acol)+'_'+inttostr(arow); btn.Parent:=self; 在DBGird上创建button类,自己写方法就行了吧~~ 首先添加一列将 Properties 设置为 ButtonEdit将 ButtonEdit的属性ViewStyle 设置为 vsButtonsOnly最重要的一步: 找到该列的属性 Options->ShowEditButtons 为 isebAlways结束 至于你说的 你不要三个点 这个很简单 ButtonEdit 的Buttons 的Kind属性 有四个:bkDown bkEllipsis bkGlyph bkText 。如果你要想普通按钮的话 选择bkText 然后Caption为Button1 哈哈 又结束拉 我怎么没找到上面老兄说的Properties在哪里呢你用的哪个第三方控件吧? 转一篇帖子供你参考:Delphi中向TDBGrid添加组件是一件十分麻烦的事情。笔者在这里向大家介绍一种利用WIN32 API函数在TDBGRID中嵌入CHECKBOX组件的方法。 TDBGrid部件是用于显示和编辑数据库表中记录信息的重要部件,它是我们在程序设计过程中要经常使用的一个强有力的工具。TDBGrid具有很多重要的属性,我们可以在程序设计阶段和程序运行过程中进行设置。TDBGrid部件中有很多重要的属性,我们在这里重点介绍Option属性和DefaultDrawing属性,其他属性及其设置方法请参看联机帮助文件。 Options属性:它是TDBGrid部件的一个扩展属性,在程序设计阶段设置Options属性可以控制TDBGrid部件的显示特性和对事件的响应特性。 DefalultDrawing属性:该属性是布尔型属性,它用于控制网格中各网格单元的绘制方式。在缺省情况下,该属性的值为True,也就是说Delphi使用网格本身缺省的方法绘制网格中各网格单元,并填充各网格单元中的内容,各网格单元中的数据根据其对应的字段部件的DisplayFormat属性和EidtFormat属性进行显示和绘制。如果DefaulDrawing属性被设置为False,Delphi不会自动地绘制网格中各网格单元和网格单元中的数据,用户必须自己为TDBGrid部件的OnDrawDataCell事件编写相应的程序以用于绘制各网格单元和其中的数据。 需要注意的是,当一个布尔字段得到焦点时,TDBGrid.Options中的 gdEditing属性不能被设置成为可编辑模式。另外,TDBGrid.DefaultDrawing属性不要设置为FALSE,否则,就不能得到网格中画布属性的句柄。 程序设计开始时就应考虑:需要设定一变量来存储原始的 TDBGrid.Options的所有属性值。这样,当一boolean字段所在栏得到焦点时将要关闭TDBGrid.Options中gdEditing的可编辑模式。与此相对应,若该栏失去焦点时,就要重新恢复原始的 TDBGrid.Options的所有属性值。 在实例中可以通过鼠标点击或敲打空格键改变布尔值,这样就需要触发TDBGrid.OnCellClick事件和TDBGrid.OnKeyDown事件。因为这两个事件都是改变单元格中逻辑字段的布尔值,所以为了减少代码的重复最好创建一个私有过程(SaveBoolean;)来完成逻辑值的输入,以后,在不同的事件中调用此过程即可。 对 TDBGrid.OnDrawColumnCell事件的处理是整个程序的关键。处理嵌入组件的显示的传统方法是:在表单上实际添加组件对象,然后对组件的位置属性与网格中单元格的位置属性进行调整,以达到嵌入的视觉效果。这种方法虽然可行但代码量大,实际运行时控制性很差。笔者采用的方法是充分利用WIN32 API函数:DrawFrameControl(),由于此函数可以直接画出Checkbox组件,所以就无须在表单中实际添加组件。如何使用API函数:DrawFrameControl()是本程序技巧所在。 在TDBGrid.OnDrawColumnCell事件中,我想大家会注意到:设定一个整型数组常数,而这个返回的整数值是与布尔值相一致的,如果字段是逻辑字段,则只将其布尔值放入数组中,提供给DrawFrameControl()函数中的状态参数进行调用,从而实现了Checkbox组件在网格中的嵌入效果。 源代码如下: type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; DBGrid1: TDBGrid; procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); procedure DBGrid1ColEnter(Sender: TObject); procedure DBGrid1ColExit(Sender: TObject); procedure DBGrid1CellClick(Column: TColumn); procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } OriginalOptions : TDBGridOptions; procedure SaveBoolean; public { Public declarations } end; {...} procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const // 这个整数值将按照布尔值返回,并送入数组 CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK or DFCS_CHECKED); begin //确保只有在逻辑字段才能插入组件 if Column.Field.DataType = ftBoolean then begin DBGrid1.Canvas.FillRect(Rect); DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); end; end; procedure TForm1.DBGrid1ColEnter(Sender: TObject); begin // 确保该栏是逻辑字段 if DBGrid1.SelectedField.DataType = ftBoolean then begin OriginalOptions := DBGrid1.Options; DBGrid1.Options := DBGrid1.Options - [dgEditing]; end; end; procedure TForm1.DBGrid1ColExit(Sender: TObject); begin //确保该栏是逻辑字段 if DBGrid1.SelectedField.DataType = ftBoolean then DBGrid1.Options := OriginalOptions; end; procedure TForm1.DBGrid1CellClick(Column: TColumn); begin //确保该栏是逻辑字段 if DBGrid1.SelectedField.DataType = ftBoolean then SaveBoolean(); end; procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //确保该栏是逻辑字段和空格键在键盘中被敲击 if ( Key = VK_SPACE ) and ( DBGrid1.SelectedField.DataType = ftBoolean ) then SaveBoolean(); end; procedure TForm1.SaveBoolean; begin DBGrid1.SelectedField.Dataset.Edit; DBGrid1.SelectedField.AsBoolean :=not DBGrid1.SelectedField.AsBoolean; DBGrid1.SelectedField.Dataset.Post; end; 以上源程序在PWIN+DELPHI5.0环境调试通过,可以直接引用。 时间的转换问题 如何将Excel数据导入Access数据库? 给一段代码 如何使用QuikReport中的QRCompositeReport来做一个复合报表? 怎样记录键盘的按键操作,只为学习不是做嘿软!! 软件的注册 如何从DLL中返回一个TDataSet的变量? SMTP下的监视程序如何做,还有就是SMTP和POP3的区别?各位高手请指教 各位刚才我提的问题又遇到点困难,过来帮忙一下? 关于调用IE的问题 D7 下生成二维码的问题 WebBrowser使用的一点小问题,或者说是Assigned 用什么才能做到像windows文件管理器那样的功能
如果有知道的可否告之详细代码。分不够可以另外加。
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
btn:tbutton;
begin
if datacol<> 5 then exit;//在第6列加按钮
btn:=TButton.Create(nil);
btn.Caption:='查看';
btn.Left:=TDBGrid(Sender).Left+Rect.Left+5;
btn.top:=TDBGrid(Sender).top +Rect.top +3;
btn.Width:=Rect.Right-Rect.Left+3;
btn.Height:=Rect.Bottom-Rect.top +3;
btn.Parent:=self;
end;
try
self.FindComponent('but'+inttostr(acol)+'_'+inttostr(arow)).Free;
except
end;
btn:=TButton.Create(Self);
btn.Caption:='查看';
btn.Left:=Self.StringGrid1.Left+Rect.Left+5;
btn.top:=self.StringGrid1.Top+Rect.top +3;
btn.Width:=Rect.Right-Rect.Left;
btn.Height:=Rect.Bottom-Rect.top ;
btn.Name:='but'+inttostr(acol)+'_'+inttostr(arow);
btn.Parent:=self;
将 Properties 设置为 ButtonEdit
将 ButtonEdit的属性ViewStyle 设置为 vsButtonsOnly
最重要的一步: 找到该列的属性 Options->ShowEditButtons 为 isebAlways
结束
哈哈 又结束拉
你用的哪个第三方控件吧?