dbgrideh日期列求助

ccdbg 2016-05-15 10:04:58
有个字段在mysql里是date类型,dbgrideh里也显示正常,列的按钮样式不论怎么设置都不能下拉出日历,会是什么原因?谢谢各位了
...全文
330 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccdbg 2016-05-18
  • 打赏
  • 举报
回复
引用 5 楼 lyhoo163 的回复:
膜拜一下,能不能提供这段代码,谢谢
ccdbg 2016-05-18
  • 打赏
  • 举报
回复
引用 8 楼 lyhoo163 的回复:
对于DataSnap三层数据库软件,对于日期格式要求比较严格,xxxxxx如日期采用“yyyy-MM-dd”格式,人工输入时,常会出现错误,将“2014-01-01”会错误录入成“2014-1-1”。为了避免用户录入错误。在DBGrid录入时,通过DateTimePicker规范录入格式,起到减少错误的效果。笔者通过参考网上的例子,通过DateTimePicker与DBGrid两控件的结合,将DateTimePicker镶嵌在DBGrid的Cell中,实现日期的录入。 实现如下: 一、编程环境: 1、涉及控件:TDBGird,TDateTimePicker,TClientDataSet(三层客户端必须)。 2、需要通过DateTimePicker录入的 字段名:入院日期,出院日期。 本例中使用中文字段名,一个DBGrid中可以多个字段,使用TDateTimePicker格式化录入。 二、在DBGrid边缘加入一个TDateTimePicker控件,取名DateTimePicker。 设置DateTimePicker.Visible:=False。 三、在启动DBGrid显示事件中,加入以下代码,确保相关字段宽度。 DBGrid2.Columns.Items[7].Width:=DBGrid2.Canvas.TextWidth('1234567890123'); DBGrid2.Columns.Items[8].Width:=DBGrid2.Canvas.TextWidth('1234567890123'); 四、在DBGrid的DBGrid2DrawColumnCell事件加入代码,功能是在选择的字段Cell中显示DateTimePicker,其它字段隐藏TDateTimePicker。 procedure THealthRecordsFrm.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (gdFocused in State) then begin if (Column.Field.FieldName = 入院日期') or (Column.Field.FieldName = '出院日期) then begin sField:=Column.Field.FieldName; with DateTimePicker do begin Left := Rect.Left + DBGrid2.Left + 1; Top := Rect.Top + DBGrid2.Top + 1; Width := Rect.Right - Rect.Left + 2; Width := Rect.Right - Rect.Left + 2; Height := Rect.Bottom - Rect.Top + 2; if length(DataModule1.ClientDataSet2.FieldByName(sField).asString)=10 then Date:=StrToDate(DataModule1.ClientDataSet2.FieldByName(sField).asString) else Date:=Now; Visible := True; end; end else DateTimePicker.Visible := False; end end; 五、在DateTimePickerChange事件中,加入以下代码,功能是确定日期后,录入DBGrid的Cell中。 procedure THealthRecordsFrm.DateTimePickerChange(Sender: TObject); begin DataModule1.ClientDataSet2.Edit; DataModule1.ClientDataSet2.FieldByName(sField).asString :=FormatdateTime('yyyy-MM-dd',DateTimePicker.Date); DataModule1.ClientDataSet2.Post; end; 六、在DBGrid2KeyPress事件中,加入以下代码,功能中当录入“回格”字符时,删除Cell值,取消DateTimePicker录入,可以通过手工录入。 procedure THealthRecordsFrm.DBGrid2KeyPress(Sender: TObject; var Key: Char); begin if (key = Chr(8)) then begin DataModule1.ClientDataSet2.Edit; DataModule1.ClientDataSet2.FieldByName(sField).asString:=''; DataModule1.ClientDataSet2.Post; DateTimePicker.Visible:=False; end; end; 通过上述代码,完成将DateTimePicker镶嵌在DBGrid的Cell中,实现日期的录入。
感谢牛人的热心回复!!!
lyhoo163 2016-05-18
  • 打赏
  • 举报
回复
对于DataSnap三层数据库软件,对于日期格式要求比较严格,xxxxxx如日期采用“yyyy-MM-dd”格式,人工输入时,常会出现错误,将“2014-01-01”会错误录入成“2014-1-1”。为了避免用户录入错误。在DBGrid录入时,通过DateTimePicker规范录入格式,起到减少错误的效果。笔者通过参考网上的例子,通过DateTimePicker与DBGrid两控件的结合,将DateTimePicker镶嵌在DBGrid的Cell中,实现日期的录入。 实现如下: 一、编程环境: 1、涉及控件:TDBGird,TDateTimePicker,TClientDataSet(三层客户端必须)。 2、需要通过DateTimePicker录入的 字段名:入院日期,出院日期。 本例中使用中文字段名,一个DBGrid中可以多个字段,使用TDateTimePicker格式化录入。 二、在DBGrid边缘加入一个TDateTimePicker控件,取名DateTimePicker。 设置DateTimePicker.Visible:=False。 三、在启动DBGrid显示事件中,加入以下代码,确保相关字段宽度。 DBGrid2.Columns.Items[7].Width:=DBGrid2.Canvas.TextWidth('1234567890123'); DBGrid2.Columns.Items[8].Width:=DBGrid2.Canvas.TextWidth('1234567890123'); 四、在DBGrid的DBGrid2DrawColumnCell事件加入代码,功能是在选择的字段Cell中显示DateTimePicker,其它字段隐藏TDateTimePicker。 procedure THealthRecordsFrm.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (gdFocused in State) then begin if (Column.Field.FieldName = 入院日期') or (Column.Field.FieldName = '出院日期) then begin sField:=Column.Field.FieldName; with DateTimePicker do begin Left := Rect.Left + DBGrid2.Left + 1; Top := Rect.Top + DBGrid2.Top + 1; Width := Rect.Right - Rect.Left + 2; Width := Rect.Right - Rect.Left + 2; Height := Rect.Bottom - Rect.Top + 2; if length(DataModule1.ClientDataSet2.FieldByName(sField).asString)=10 then Date:=StrToDate(DataModule1.ClientDataSet2.FieldByName(sField).asString) else Date:=Now; Visible := True; end; end else DateTimePicker.Visible := False; end end; 五、在DateTimePickerChange事件中,加入以下代码,功能是确定日期后,录入DBGrid的Cell中。 procedure THealthRecordsFrm.DateTimePickerChange(Sender: TObject); begin DataModule1.ClientDataSet2.Edit; DataModule1.ClientDataSet2.FieldByName(sField).asString :=FormatdateTime('yyyy-MM-dd',DateTimePicker.Date); DataModule1.ClientDataSet2.Post; end; 六、在DBGrid2KeyPress事件中,加入以下代码,功能中当录入“回格”字符时,删除Cell值,取消DateTimePicker录入,可以通过手工录入。 procedure THealthRecordsFrm.DBGrid2KeyPress(Sender: TObject; var Key: Char); begin if (key = Chr(8)) then begin DataModule1.ClientDataSet2.Edit; DataModule1.ClientDataSet2.FieldByName(sField).asString:=''; DataModule1.ClientDataSet2.Post; DateTimePicker.Visible:=False; end; end; 通过上述代码,完成将DateTimePicker镶嵌在DBGrid的Cell中,实现日期的录入。
lyhoo163 2016-05-18
  • 打赏
  • 举报
回复
http://http://blog.csdn.net/lyhoo163/article/details/28098935 有关如何使用,请看我的博客。
lyhoo163 2016-05-16
  • 打赏
  • 举报
回复
回答你的第二个问题: 1、在插入事件中: (1)读取DBGridEh最后一行的Date值 (2)将该值+1 (3)对于直接连接硬盘文件的:在DBGridEh中,直接加入一行数据。 sDate:=FieldByName('日期').asString; DateTimetoString(sDate,'yyyy-mm-dd',StrToDate(sData)+1); with DBGruideEh1.Datasource.DataSet do begin Append; FieldByName('日期').asString:=sDate; FieldByName('ID').asString:=ID; Post; end; Field (4)对于三层,首先SQL插入语句中,将该值加入,再在DBGridEh中,加入一行数据。 sDate:=FieldByName('日期').asString; DateTimetoString(sDate,'yyyy-mm-dd',StrToDate(sData)+1); SQL:='INSERT INTO 活动记录 (日期,ID) VALUES('+ #39+sDate+#39+','+ #39+ID+#39+')'; if DataModule1.SocketConnection1.AppServer.MyQuery(SQL,err) then begin with DataModule1.ClientDataSet1 do begin Append; FieldByName('日期').asString:=sDate; FieldByName('ID').asString:=ID; Post; end; end;
lyhoo163 2016-05-16
  • 打赏
  • 举报
回复
lyhoo163 2016-05-16
  • 打赏
  • 举报
回复
第一个问题,我的处理办法,将DateTimePicker动态欠入DBGrid的Cell中,鼠标点击Cell,打开DateTimePicker,指定日期指定日期后,退出DateTimePicker,日期读入Cell中。
ccdbg 2016-05-16
  • 打赏
  • 举报
回复
引用 2 楼 lyhoo163 的回复:
回答你的第二个问题: 1、在插入事件中: (1)读取DBGridEh最后一行的Date值 (2)将该值+1 (3)对于直接连接硬盘文件的:在DBGridEh中,直接加入一行数据。 sDate:=FieldByName('日期').asString; DateTimetoString(sDate,'yyyy-mm-dd',StrToDate(sData)+1); with DBGruideEh1.Datasource.DataSet do begin Append; FieldByName('日期').asString:=sDate; FieldByName('ID').asString:=ID; Post; end; Field (4)对于三层,首先SQL插入语句中,将该值加入,再在DBGridEh中,加入一行数据。 sDate:=FieldByName('日期').asString; DateTimetoString(sDate,'yyyy-mm-dd',StrToDate(sData)+1); SQL:='INSERT INTO 活动记录 (日期,ID) VALUES('+ #39+sDate+#39+','+ #39+ID+#39+')'; if DataModule1.SocketConnection1.AppServer.MyQuery(SQL,err) then begin with DataModule1.ClientDataSet1 do begin Append; FieldByName('日期').asString:=sDate; FieldByName('ID').asString:=ID; Post; end; end;
谢谢啦,基本就是这样实现的 第一个问题日历不能下拉出,试了好久发现只要窗口设置为最前端显示就会出现这个问题,不知是不是bug?
ccdbg 2016-05-15
  • 打赏
  • 举报
回复
第二个问题,dbgrideh第一列是2016-01-01日期,如何实现append记录时第一列自动填充为2016-01-02 ? 谢谢!

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧