日期字段加入掩码(EditMask)后,为什么在录入该日期后不能再将其清空?(100分)

  • 主题发起人 主题发起人 zhuwanhai
  • 开始时间 开始时间
Z

zhuwanhai

Unregistered / Unconfirmed
GUEST, unregistred user!
日期字段加入掩码(EditMask)后,为什么在录入该日期后不能再将其清空?
在DELPHI中,有许多到日期的字段,我将日期字段的EditMask:设为Long Date格式,
即在录入窗口中当遇到日期时,则其格式为:****-**-**;例如:2001-01-02,
但是在该日期字段中,如果录入一个日期后,想再把该日期清空,就报错;
只能修改而不能清空;如何解决!
 
不要改editmask屬性,改其disaplay屬性為yyyy-mm-dd,不就可以了。
因為你將editmask設為****-**-**時,清空當前日期字段日期,
其實它不是空,還有' - - '字串,轉換日期失敗。
 
如果设日期字段的DisplayFormat属性为yyyy-mm-dd,那么在录入时并不自动显示
' - - '这种日期的录入格式,以方便用户自动按这种格式录入,
而设editmask,则在录入该日期字段时,就会自动显示这种格式,给用户以提示;
请问disaplay该如何详细设置,在用户录入时有' - - '格式显示;
还有其它方法吗?

 
同感,关注。
 
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (length(edit1.text)=4)or (length(edit1.text)=7) then
begin
edit1.text:=edit1.text+'-';
edit1.SelStart:=length(edit1.text);
end;
if length(edit1.text)=10 then
begin
try
strtodatetime(edit1.text)
except
showmessage('日期格式不正确!');
end;
end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key not in ['0'..'9'] then
begin
key:=#0;
end;
end;
 
我的作法通常是在DateTimePicker上覆盖一个edit,但不覆盖其弹出按钮。然后分别定义
两个控件的相关事件.(edit控件edt_dcsj,DateTimePicker控件Dtp_Dcsj),另有一个
Mp_ReplaceStr函数;

procedure Edt_dcsj1exit(Sender: TObject);
var B_Str:string; //系统日期分隔符。
begin
if B_Boiler=0 then exit;
G_String:=DateToStr(Dtp_Dcsj.Date);
B_Str:=iif(pos('-',G_String)<>0,'-',iif(pos('.',G_String)<>0,'.','/'));
Edt_Dcsj.text:=MP_ReplaceStr(Edt_Dcsj.text,'.',B_Str,true,true);
Edt_Dcsj.text:=MP_ReplaceStr(Edt_Dcsj.text,'/',B_Str,true,true);
Edt_Dcsj.Text:=MP_ReplaceStr(Edt_Dcsj.text,'-',B_Str,true,true);
//以上代码根据系统日期分隔符作调整,以适应不同的设置
if isDate(Edt_Dcsj.text) then
Dtp_Dcsj.Date:=StrToDate(Edt_Dcsj.text)
else Edt_Dcsj.text:=iif(trim(Edt_Dcsj.text)='','',DateToStr(Dtp_Dcsj.date));
end;

procedure Edt_DcsjKeyPress(Sender: TObject; var Key: Char);
begin
if B_Boiler>0 then if key=#13 then SelectNext(ActiveControl,true,true)
if (not (key in ['0'..'9'])) and (key<>#8) and (key<>'.') and (key<>'-') and (key<>'/') then key:=#0;
end;

procedure Dtp_DcsjChange(Sender: TObject);
begin
Edt_Dcsj.text:=DateToStr(Dtp_Dcsj.Date);
end;

function MP_ReplaceStr(ss,SubStr,NewStr:string;RepAll,IgCase:Boolean):string;
//查找ss中是否有Substr替换成Newstr
var
a:TReplaceFlags;
begin
if RepAll=true then
include(a,rfReplaceAll);
if IgCase=true then
include(a,rfIgnoreCase);
Result:=stringReplace(ss,Substr,Newstr,a);
end;
 
到http://202.117.210.31/处下载ehlib控件包,其中的dbdatetimeediteh控件能完美
解决这个问题。
 
字段.clear;//ok!!!
 
///////////////////////////////////
{使用方法: }
{ 在日期字段的 OngetText 事件中 }
{ DateFieldGetText(Sender, Text); }
{ 在OnSetText 事件中 }
{ if not DateFieldSetText(Sender, }
{ Text) then Abort; }
{ }
{ 罗少波 }
///////////////////////////////////

unit DBDateEdit;

interface
uses
Windows, SysUtils, Controls, Forms,Db;
{日期型字段显示过程,在OnGetText事件中调用}
procedure DateFieldGetText(Sender: TField;
var Text: String);

{日期型字段输入判断函数,在OnSetText事件中调用}
function DateFieldSetText(Sender: TField;
const Text: String):Boolean;

implementation

procedure DateFieldGetText(Sender: TField;
var Text: String);
var
dDate:TDate;
wYear,wMonth,wDay:Word;
aryTestYMD:Array [1..2] of Char
;{测试输入掩码用临时数组}
iYMD:Integer;
begin
dDate:=Sender.AsDateTime;
DecodeDate(dDate,wYear,wMonth,wDay);
if wYear=1899 then exit;
{测试输入掩码所包含的格式.}
aryTestYMD:='年';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])<>nil then
iYMD:=1;
aryTestYMD:='月';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])<>nil then
iYMD:=2;
aryTestYMD:='日';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])<>nil then
iYMD:=3;

case iYMD of
1:{输入掩码为:"yyyy年"的格式.}
Text:=IntToStr(wYear)+'年';
2: {输入掩码为:"yyyy年mm月"的格式.}
Text:=IntToStr(wYear)+'年'+IntToStr(wMonth)+'月';
3: {输入掩码为:"yyyy年mm月dd日"的格式.}
Text:=IntToStr(wYear)+'年'+IntToStr(wMonth)+'月'
+IntToStr(wDay)+'日';
else {默认为:"yyyy年mm月dd日"的格式.}
Text:=IntToStr(wYear)+'年'+IntToStr(wMonth)+'月'
+IntToStr(wDay)+'日';
end;

end;

function DateFieldSetText(Sender: TField;
const Text: String):Boolean;
var
dDate:TDate;
sYear,sMonth,sDay:String;
aryTestYMD:Array [1..2] of Char;
iYMD:Integer;
begin
{获得用户输入的日期}
sYear:=Copy(Text,1,4);
sMonth:=Copy(Text,7,2);
SDay:=Copy(Text,11,2);

{测试输入掩码所包含的格式.}
aryTestYMD:='年';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])<>nil then
iYMD:=1;
aryTestYMD:='月';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])<>nil then
iYMD:=2;
aryTestYMD:='日';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])<>nil then
iYMD:=3;

{利用Try…Except进行输入的日期转换}
try
begin
if syear='1899' then
begin
DateFieldSetText:=False;
exit;
end;
case iYMD of
1: {输入掩码为:"yyyy年"的格式.}
begin
dDate:=StrToDate(sYear+'-01-01')
;{中文Windows默认的日期格式为:yyyy-mm-dd.下同}
Sender.AsDateTime:=dDate;
end;
2: {输入掩码为:"yyyy年mm月"的格式.}
begin
dDate:=StrToDate(sYear+'-'+sMonth+'-01');
Sender.AsDateTime:=dDate;
end;
3: {输入掩码为:"yyyy年mm月dd日"的格式.}
begin
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
end;
else {默认为:"yyyy年mm月dd日"的格式.}
begin
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
end;
end;
DateFieldSetText:=True;
end;
except
{日期转换出错}
begin
Application.MessageBox(PChar(Text+'不是有效的日期!'),
'错误',mb_Ok+mb_IconError);
DateFieldSetText:=False;
end;
end;

end;


end.
 
從以前的貼子抄一段,你看看:
假設你的日期字段名為startdate,
設置其editmask屬性為[9999年99月99日],
DISPLAYFORMAT屬性不要設,讓其為空。
在onstartdateSetText事件與onstartdategetText
事件中寫代碼。
procedure TForm1.ADOTable1startdateGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
if sender.asstring<>'' then
text:=formatdatetime('yyyy''年''mm''月''dd''日''',sender.asdatetime);
end;

procedure TForm1.ADOTable1startdateSetText(Sender: TField;
const Text: String);
var str:string;
begin
Try
str:=stringreplace(text,'年','/',[rfIgnoreCase]);
str:=stringreplace(str,'月','/',[rfIgnoreCase]);
str:=stringreplace(str,'日','',[rfIgnoreCase]);
if trim(str)='' then
sender.asstring:=''
else
sender:=str;
Except
showmessage('日期格式錯!');
abort;
end;
end;
 
谢谢大家!!!
 
后退
顶部