我用dbgrid作输入界面,请问DateTimePicker控件怎么嵌入dbgrid中,我有一个日期型字段date,它的数据通过DateTimePicker输入,注不用第三 我用dbgrid作输入界面,请问DateTimePicker控件怎么嵌入dbgrid中,我有一个日期型字段date,它的数据通过DateTimePicker输入,注不用第三方控作如EBLIB和dxdbgrid等! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在DBGrid 的DBGridDrawDataCell(...)过程中设置DateTimePicker.left:=rect.left+DBGrid.left;DateTimePicker.top:=rect.left+DBGrid.top;DateTimePicker.width:=rect.left+DBGrid.rect-DBGrid.left; 这其实就是我们常说的在grid上做浮动控件,道理上很简单,正确放置控件位置,并能正确反映当前字段的内容,与数据表自然交互;关键在于如何适时的控制它.//这段程序示范了如何在dbgrid的单元格使用Tdatetimepicker控件事编辑日期.//同样这可是别的可视控件,对于不同类型的字段需改变//if column.Field.DataType in [ftDate, ftTime, ftDateTime] 的条件//并改变保存类型;有一点不爽的是单击日期型栏时有闪烁感//哪位大大帮我改改,解决这个问题后email:[email protected] Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Grids, DBGrids, DB, DBTables;type Tfakegrid=class(Tdbgrid); TForm1 = class(TForm) Table1: TTable; DataSource1: TDataSource; DBGrid1: TDBGrid; dp1: TDateTimePicker; //设计属性visible=false procedure DBGrid1CellClick(Column: TColumn); procedure editdatetime(dbgrid:Tdbgrid;fieldname:string;datetime:Tdatetime); private { Private declarations } public { Public declarations } end;var Form1: TForm1; tempcol:Tcolumn;//记录上次单的日期栏 temprecno:integer;//记录上次单的记录号implementation{$R *.dfm}procedure TForm1.DBGrid1CellClick(Column: TColumn);var rect:Trect; //当前单元格区域 book:Tbook;begin if (dp1.Visible) then //表示上次单击是日期栏 if (table1.RecNo=temprecno) then //单击同一记录的别的栏 editdatetime(dbgrid1,tempcol.FieldName,dp1.DateTime)//修改tempcol对应的值 else begin //单击另一记录 book:=table1.GetBook; //当前记录 table1.recno:=temprecno; //回到上次点了日期栏的那条记录 editdatetime(dbgrid1,tempcol.FieldName,dp1.DateTime);//改tempcol对应的值 table1.GotoBook(book);//回到当前记录 end; if column.Field.DataType in [ftDate, ftTime, ftDateTime] then //点了日期栏 begin //点击的单元格区域rect rect:=Tfakegrid(dbgrid1).CellRect(Tfakegrid(dbgrid1).col,Tfakegrid(dbgrid1).Row); dp1.Visible:=true;//显示dp1 //设dp1的属性 dp1.DateTime:=Column.Field.AsDateTime; dp1.Left:=rect.Left+dbgrid1.Left; dp1.Top:=rect.top+dbgrid1.top; dp1.Width:=rect.Right-rect.Left; dp1.Height:=rect.Bottom-rect.Top; tempcol:=column; //记住这个栏 temprecno:=table1.RecNo; //记住这个记录号 end else begin //没有单击日期型栏 tempcol:=nil; dp1.Visible:=false; //隐去dp1 end;end;//修改日期值procedure TForm1.editdatetime(dbgrid:Tdbgrid;fieldname:string;datetime:Tdatetime);var dataset:Tdataset;begin dataset:=dbgrid.DataSource.DataSet; if not(dataset.State in [dsedit,dsinsert]) then dataset.Edit; dataset.FieldByName(fieldname).AsDateTime:=datetime;end;end. 问您一个问题! DBGrid中数据无法更新到数据库 对比度与亮度? 用什么函数可以实现取出一个浮点型数据的小数部分?谢谢。. 困扰的问题,cxGrid中的列如何动态地设置为只读或编辑? QRMemo中字体大小问题 问一个很菜很菜的问题 idftp怎么设置代理下载文件呢? 各位兄弟,你们有EdLib这个For Delphi6的控件在那里下载 表格控件的使用 Delphi中实现foxpro数据库中的&替换功能? 請問怎樣在EDIT框裡實現左靠齊?
DateTimePicker.left:=rect.left+DBGrid.left;
DateTimePicker.top:=rect.left+DBGrid.top;
DateTimePicker.width:=rect.left+DBGrid.rect-DBGrid.left;
//同样这可是别的可视控件,对于不同类型的字段需改变
//if column.Field.DataType in [ftDate, ftTime, ftDateTime] 的条件
//并改变保存类型;有一点不爽的是单击日期型栏时有闪烁感
//哪位大大帮我改改,解决这个问题后email:[email protected] Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Grids, DBGrids, DB, DBTables;type
Tfakegrid=class(Tdbgrid);
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
dp1: TDateTimePicker; //设计属性visible=false
procedure DBGrid1CellClick(Column: TColumn);
procedure editdatetime(dbgrid:Tdbgrid;fieldname:string;datetime:Tdatetime); private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
tempcol:Tcolumn;//记录上次单的日期栏
temprecno:integer;//记录上次单的记录号
implementation{$R *.dfm}procedure TForm1.DBGrid1CellClick(Column: TColumn);
var rect:Trect; //当前单元格区域
book:Tbook;
begin
if (dp1.Visible) then //表示上次单击是日期栏
if (table1.RecNo=temprecno) then //单击同一记录的别的栏
editdatetime(dbgrid1,tempcol.FieldName,dp1.DateTime)//修改tempcol对应的值
else begin //单击另一记录
book:=table1.GetBook; //当前记录
table1.recno:=temprecno; //回到上次点了日期栏的那条记录
editdatetime(dbgrid1,tempcol.FieldName,dp1.DateTime);//改tempcol对应的值
table1.GotoBook(book);//回到当前记录
end;
if column.Field.DataType in [ftDate, ftTime, ftDateTime] then //点了日期栏
begin
//点击的单元格区域rect
rect:=Tfakegrid(dbgrid1).CellRect(Tfakegrid(dbgrid1).col,Tfakegrid(dbgrid1).Row);
dp1.Visible:=true;//显示dp1
//设dp1的属性
dp1.DateTime:=Column.Field.AsDateTime;
dp1.Left:=rect.Left+dbgrid1.Left;
dp1.Top:=rect.top+dbgrid1.top;
dp1.Width:=rect.Right-rect.Left;
dp1.Height:=rect.Bottom-rect.Top;
tempcol:=column; //记住这个栏
temprecno:=table1.RecNo; //记住这个记录号
end
else begin //没有单击日期型栏
tempcol:=nil;
dp1.Visible:=false; //隐去dp1
end;
end;//修改日期值
procedure TForm1.editdatetime(dbgrid:Tdbgrid;fieldname:string;datetime:Tdatetime);
var dataset:Tdataset;
begin
dataset:=dbgrid.DataSource.DataSet;
if not(dataset.State in [dsedit,dsinsert]) then
dataset.Edit;
dataset.FieldByName(fieldname).AsDateTime:=datetime;
end;
end.