如何用微调控件和文本框完成日期录入功能?

tdkj6236 2004-10-18 03:15:11
想用一个微调控件和文本框完成日期录入功能,其功能是光标点到年,微调可上下年数;点到月可调动月数;点到日可调动日数,如何做?
...全文
409 17 打赏 收藏 举报
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tdkj6236 2004-10-22
  • 打赏
  • 举报
回复
我也绕上走了。用三个SPINNER,一个TEXT的解决起来更容易了。
dfwxj 2004-10-21
  • 打赏
  • 举报
回复
有办法的,

不用给SPINNER赋当前值,直接在SPINNER的DOMNCLICKEVENT和UPCLICKEVENT事件中改变文本框的相应部份的值,年度麻烦点,月份可以用GOMONTH,天数可以直接加减

具体解决方案等我有空再写
tdkj6236 2004-10-21
  • 打赏
  • 举报
回复
to dfwxj(清风):
点到问题的关键了,无论调年、月、日的任何一项不能从最小数调起。问题就发生在这里,当在TEXT中选年、月、日时要给SPINNER一个当前值,现在用我的方法给的当前值(就是现在的年月日)不灵,尤其是在从年到月或日转换时,就乱套了,看看有没有办法。
dfwxj 2004-10-20
  • 打赏
  • 举报
回复
用三个文本框是针对你所说的"其功能是光标点到年,微调可上下年数;点到月可调动月数;点到日可调动日数"而设计的,用一个也行,将VALUE预置为DATE(),检测文本框的光标位置,进行相应的调整

不过我还是认为:这样设计花哨,没有实际意义,试想一下:要将当前日期1980.06.15调整到目标日期2010.12.31,需要点多少次鼠标?数一下,共55次!
LAIYANGPJ 2004-10-19
  • 打赏
  • 举报
回复
看一下这段代码:
1.表单的INIT事件代码:
THISFORM.SPINNER1.VALUE=VAL(ALLTRIM(STR(YEAR(DATE()))))
THISFORM.SPINNER2.VALUE=VAL(ALLTRIM(STR(MONTH(DATE()))))
THISFORM.SPINNER3.VALUE=VAL(ALLTRIM(STR(DAY(DATE()))))
2.设定SPRINNER1的INCREMENT=1.00
3.设定SPINNER1的KEYBOARDHIGHVALUE=你的上限值
SPINNER1的KEYBOARDLOWVALUE=你的下限值
SPINNER1的SPINNERHIGHVALUE=你的上限值
SPINNER1的SPINNRLOWVALUE=你的下限值
SPINNER2.SPINNER3与这个类同.文本框就不用了吧!调用的话直接用:年份=THISFORM.SPINNER1.VALUE就好了.
tdkj6236 2004-10-19
  • 打赏
  • 举报
回复
其实用鼠标和键盘录入哪个方便,看是在什么情况,有时在表单上连续用鼠标能完成的录入工作,最好不要设计成一阵鼠标,一阵键盘。在这种想法下,用微调录入日期的功能可能就实际了。
tdkj6236 2004-10-19
  • 打赏
  • 举报
回复
to (清风):谢了。见到(小丑)的贴,我就准备说‘如果用三个文本框就什么也不用了,直接录年月日就行了’。想想是不是这样?用微调录入日期不是花哨,但弄上三个文本框就有点变味了。见有的系统就是用微调赤录入日期的,真的好用。但不知用VF能不能行,大家看看能成吗?
dfwxj 2004-10-19
  • 打赏
  • 举报
回复
修正如下:

三个文本框,txty、txtm、txtd,分别用于输入和显示年月日,一个微调控件,spymd,用于微调相应的调节项,使用时几须先点击到某一个文本框内,方可用微调按钮调节相应的值,(如:点一下年度的文本框,微调按钮就调节年份,点一下月份的文本框,微调按钮就调节月份)

设置两个全局变量:MDATE,记录日期;SPMODE,记录所要调节的对象标号(0-无,1-年度,2-月份,3-天数)

表单的INT事件:
mdate=date()
spmode=0
thisform.spymd.KEYBOARDHIGHVALUE=0
thisform.spymd.KEYBOARDLOWVALUE=0
thisform.spymd.SPINNERHIGHVALUE=0
thisform.spymd.SPINNERLOWVALUE=0
thisform.spymd.VALUE=0

txty的lostfocus事件:
if betw(this.value,1800,9999)
my=this.value
mm=this.parent.txtm.value
md=this.parent.txtd.value
mdate=date(my,mm,md)
do while empt(mdate)
md=md-1
this.parent.txtd.value=md
mdate=date(my,mm,md)
endd
else
this.value=year(mdate)
endi
spmode=1
thisform.spymd.KEYBOARDHIGHVALUE=9999
thisform.spymd.KEYBOARDLOWVALUE=1800
thisform.spymd.SPINNERHIGHVALUE=9999
thisform.spymd.SPINNERLOWVALUE=1800
thisform.spymd.VALUE=year(mdate)

txtm的lostfocus事件:
if betw(this.value,1,12)
my=this.parent.txty.value
mm=this.value
md=this.parent.txtd.value
mdate=date(my,mm,md)
do while empt(mdate)
md=md-1
this.parent.txtd.value=md
mdate=date(my,mm,md)
endd
else
this.value=month(mdate)
endi
spmode=2
thisform.spymd.KEYBOARDHIGHVALUE=12
thisform.spymd.KEYBOARDLOWVALUE=1
thisform.spymd.SPINNERHIGHVALUE=12
thisform.spymd.SPINNERLOWVALUE=1
thisform.spymd.VALUE=month(mdate)


txtd的lostfocus事件:
if betw(this.value,1,31)
my=this.parent.txty.value
mm=this.parent.txtm.value
md=this.value
mdate=date(my,mm,md)
do while empt(mdate)
md=md-1
this.value=md
mdate=date(my,mm,md)
endd
else
this.value=day(mdate)
endi
i=31
do while empt(date(my,mm,i))
i=i-1
endd
spmode=3
thisform.spymd.KEYBOARDHIGHVALUE=i
thisform.spymd.KEYBOARDLOWVALUE=1
thisform.spymd.SPINNERHIGHVALUE=i
thisform.spymd.SPINNERLOWVALUE=1
thisform.spymd.VALUE=day(mdate)

spymd的interactivechange事件:
do case
case spmode=1
this.parent.txty.value=this.value
this.parent.txty.setfocus
case spmode=2
this.parent.txtm.value=this.value
this.parent.txtm.setfocus
case spmode=3
this.parent.txtd.value=this.value
this.parent.txtd.setfocus
endc
my=this.parent.txty.value
mm=this.parent.txtm.value
md=this.parent.txtd.value
do while empt(date(my,mm,md))
md=md-1
this.parent.txtd.value=md
endd
spmode=0

这段代码改进了一下,我没有测试,请楼主自己试试
LAIYANGPJ 2004-10-19
  • 打赏
  • 举报
回复
to:dfwxj(清风):的确给弄错了谢谢!
dfwxj 2004-10-19
  • 打赏
  • 举报
回复
SORRY~~~~上面的代码有问题,应该搞一个检测日期有效性的函数才对
dfwxj 2004-10-19
  • 打赏
  • 举报
回复
先说一下楼上这位朋友的代码:

THISFORM.SPINNER1.VALUE=VAL(ALLTRIM(STR(YEAR(DATE()))))
THISFORM.SPINNER2.VALUE=VAL(ALLTRIM(STR(MONTH(DATE()))))
THISFORM.SPINNER3.VALUE=VAL(ALLTRIM(STR(DAY(DATE()))))

YEAR、MONTH、DAY这几个函数本来就是数值型的,你为什么要先把它们转换成字符型紧接着又转换面数值型呢?难道是为了缩短值的长度吗?不可能,数值型变量用不着考虑长度,看不懂!

*************************************************

其实用微调控件设置日期,根本就没有一点点现实意义,用户用鼠标点那调节钮的时间,应该用键盘早就轻松地完成了日期的输入。

如果你一定要做得如此花梢,根据你的要求,设计如下:

三个文本框,txty、txtm、txtd,分别用于输入和显示年月日,一个微调控件,spymd,用于微调相应的调节项,使用时几须先点击到某一个文本框内,方可用微调按钮调节相应的值,(如:点一下年度的文本框,微调按钮就调节年份,点一下月份的文本框,微调按钮就调节月份)

设置两个全局变量:MDATE,记录日期;SPMODE,记录所要调节的对象标号(0-无,1-年度,2-月份,3-天数)

表单的INT事件:
mdate=date()
spmode=0
thisform.spymd.KEYBOARDHIGHVALUE=0
thisform.spymd.KEYBOARDLOWVALUE=0
thisform.spymd.SPINNERHIGHVALUE=0
thisform.spymd.SPINNERLOWVALUE=0
thisform.spymd.VALUE=0

txty的gotfocus事件:
spmode=1
thisform.spymd.KEYBOARDHIGHVALUE=9999
thisform.spymd.KEYBOARDLOWVALUE=1800
thisform.spymd.SPINNERHIGHVALUE=9999
thisform.spymd.SPINNERLOWVALUE=1800
thisform.spymd.VALUE=year(mdate)

txty的lostfocus事件:
if betw(this.value,1800,9999)
my=this.value
mm=this.parent.txtm.value
md=this.parent.txtd.value
mdate=date(my,mm,md)
do while empt(mdate)
md=md-1
this.parent.txtd.value=md
mdate=date(my,mm,md)
endd
else
this.value=year(mdate)
endi

txtm的gotfocus事件:
spmode=2
thisform.spymd.KEYBOARDHIGHVALUE=12
thisform.spymd.KEYBOARDLOWVALUE=1
thisform.spymd.SPINNERHIGHVALUE=12
thisform.spymd.SPINNERLOWVALUE=1
thisform.spymd.VALUE=month(mdate)

txtm的lostfocus事件:
if betw(this.value,1,12)
my=this.parent.txty.value
mm=this.value
md=this.parent.txtd.value
mdate=date(my,mm,md)
do while empt(mdate)
md=md-1
this.parent.txtd.value=md
mdate=date(my,mm,md)
endd
else
this.value=month(mdate)
endi

txtd的gotfocus事件:
spmode=3
for i=28 to 31
my=year(mdate)
mm=month(date)
if month(date(my,mm,i+1))#mm
exit
endi
endf
thisform.spymd.KEYBOARDHIGHVALUE=i
thisform.spymd.KEYBOARDLOWVALUE=1
thisform.spymd.SPINNERHIGHVALUE=i
thisform.spymd.SPINNERLOWVALUE=1
thisform.spymd.VALUE=day(mdate)

txtd的lostfocus事件:
if betw(this.value,1,31)
my=this.parent.txty.value
mm=this.parent.txtm.value
md=this.value
mdate=date(my,mm,md)
do while empt(mdate)
md=md-1
this.value=md
mdate=date(my,mm,md)
endd
else
this.value=day(mdate)
endi

spymd的interactivechange事件:
do case
case spmode=1
this.parent.txty.value=this.value
this.parent.txty.setfocus
case spmode=2
this.parent.txtm.value=this.value
this.parent.txtm.setfocus
case spmode=3
this.parent.txtd.value=this.value
this.parent.txtd.setfocus
endc
spmode=0


这段代码好象太罗嗦了点,但不写这么多就会出错,还是直接用一个文本框用于输入日期好,只要设置VALUE的值为date()就行了
tdkj6236 2004-10-18
  • 打赏
  • 举报
回复
我在text1的click中的代码是:
do case
case this.selstart=>1.and.this.selstart<=4
thisform.spinner1.value=year(date())
case this.selstart=>5.and.this.selstart<=6
thisform.spinner1.value=month(date())
case this.selstart=>9.and.this.selstart<=10
thisform.spinner1.value=day(date())
endcase
在text1的init中的代码是:this.value=allt(str(year(date())))+'.'+allt(str(month(date())))+'.'+allt(str(day(date())))
在spinner1的downclick的代码是:
do case
case thisform.text1.selstart=>0..and.thisform.text1.selstart<=4
this.spinnerlowvalue=1990
thisform.text1.value=allt(str(this.value))+allt(subs((thisform.text1.value),5,6))
thisform.text1.selstart=0
case thisform.text1.selstart=>6..and.thisform.text1.selstart<=7
this.spinnerlowvalue=1
if this.value<10
thisform.text1.value=allt(subs((thisform.text1.value),1,5))+'0'+allt(str (this.value)+subs((thisform.text1.value),8,3))
else
thisform.text1.value=allt(subs((thisform.text1.value),1,5))+allt(str(this.value)+subs((thisform.text1.value),8,3))
endif
thisform.text1.selstart=6
case thisform.text1.selstart=>9..and.thisform.text1.selstart<=10
this.spinnerlowvalue=1
if this.value<10
thisform.text1.value=allt(subs((thisform.text1.value),1,8))+'0'+allt(str(this.value))
else
thisform.text1.value=allt(subs((thisform.text1.value),1,8))+allt(str(this.value))
endif
thisform.text1.selstart=9
endcase
在spinner1的upclick中的代码是:

do case
case thisform.text1.selstart=>0..and.thisform.text1.selstart<=4
this.spinnerhighvalue=2050
this.spinnerlowvalue=2000
thisform.text1.value=allt(str(this.value))+allt(subs((thisform.text1.value),5,6))
thisform.text1.selstart=0

case thisform.text1.selstart=>6..and.thisform.text1.selstart<=7
this.spinnerhighvalue=12
if this.value<10
thisform.text1.value=allt(subs((thisform.text1.value),1,5))+'0'+allt(str(this.value)+subs((thisform.text1.value),8,3))
else
thisform.text1.value=allt(subs((thisform.text1.value),1,5))+allt(str(this.value)+subs((thisform.text1.value),8,3))
endif
thisform.text1.selstart=6

case thisform.text1.selstart=>9..and.thisform.text1.selstart<=10
this.spinnerhighvalue=31
if this.value<10
thisform.text1.value=allt(subs((thisform.text1.value),1,8))+'0'+allt(str(this.value))
else
thisform.text1.value=allt(subs((thisform.text1.value),1,8))+allt(str(this.value))
endif
thisform.text1.selstart=9

endcase
各位高手看看问题在什么地方?

tdkj6236 2004-10-18
  • 打赏
  • 举报
回复
三个文本框是简单了,但不能总想简单呀!
coolyylu 2004-10-18
  • 打赏
  • 举报
回复
使用三个文本框 ,三个spinner ,做成一个基于control的子类(控件) .

使用gotfocus ,lostfocus时间 ,显示和隐藏spinner:)

应该是很简单的事情
tdkj6236 2004-10-18
  • 打赏
  • 举报
回复
我现用的就是一个日历控件挺好用,但装在朋友机上后提示控件损坏,朋友不愿意重装系统,只好另想办法。见有的系统用微调控件实现日期录入也很方便。但调年、月、日比单调星期几复杂些,早晨做了一半有点问题,想请大家帮忙了。
十豆三 2004-10-18
  • 打赏
  • 举报
回复
建议使用系统自带的Microsoft的日期控件:
MSCOMCT2.OCX
可以省很多事。不用自已写代码了。
十豆三 2004-10-18
  • 打赏
  • 举报
回复
请参考:

转贴:

使用微调按钮控件实现字符串的变化   

一个应用系统要求使用微调按钮控件实现星期内容的输入,即实现从星期一至星期天的输入,要求使用微调按钮来实现。即当我们点击微调按钮的向上箭头时,编辑框中的内容可以由星期一变为星期二,再次点击到星期三等等;当点击向下箭头时,编辑框中的内容变化同点击向上箭头时相反。   为了解决这个问题,可以采取微调按钮与编辑框结合的方式来实现,具体实现方法如下:   在表单中利用表单控件拉出一个微调按钮对象spinner1和一个编辑框对象text1,调整微调按钮的宽度,将数值输入区变小,只保留向上、向下箭头的宽度,将编辑框与微调按钮并列到一起,使得编辑框如同微调按钮控制值的输入区一样,这时设置微调按钮spinner1的相关属性:   Keyboardhighvalue=7   Keyboardlowvalue=1   Spinnerhighvalue=7   Spinnerlowvalue=1   Value=1   其它属性保持不变。在spinner1.InteractiveChange事件中写入如下代码:   Thisform.Text1.Value=Subs(′星期一星期二星期三星期四星期五星期六星期天′,this.value*6-5,6)   Thisform.Refresh   设置编辑框的相关属性:   Thisform.Value=′星期一′   其它如编辑框中的数据源、字体、字号和颜色等属性,用户可自行设置。   全部内容设置完毕后,运行这个表单,即可以看到当使用鼠标点击微调按钮的箭头时,编辑框中的内容将发生变化,实现了用户提出的使用微调按钮输入星期值的要求。
相关推荐
发帖
VFP

2574

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
帖子事件
创建了帖子
2004-10-18 03:15
社区公告
暂无公告