### Bookstore

 Computer Math and Games in Pascal (preview) Lazarus Handbook

### Author Topic: Bug in fuction ParseDate in EditBtn.pas  (Read 245 times)

#### kolevs

• Newbie
• Posts: 2
##### Bug in fuction ParseDate in EditBtn.pas
« on: August 13, 2020, 09:57:17 am »
Hi,

While looking at the code in EditBtn.pas, I noticed some strange statement(may be bug):

Function ParseDate(S : String; Order : TDateOrder; Def: TDateTime) : TDateTime;

Var
P,N1,N2,N3 : Integer;
B : Boolean;

begin
Result:=Def;
P:=Pos(DefaultFormatSettings.DateSeparator,S);
If (P=0) then
Exit;
N1:=StrToIntDef(Copy(S,1,P-1),-1);
If (N1=-1) then Exit;
Delete(S,1,P);
P:=Pos(DefaultFormatSettings.DateSeparator,S);
If (P=0) then
Exit;
N2:=StrToIntDef(Copy(S,1,P-1),-1);
If (N1=0) then Exit;
Delete(S,1,P);
N3:=StrToIntDef(S,-1);
If (N3=-1) then
exit;
Case Order of
doYMD : B:=TryEncodeDate(N1,N2,N3,Result);
doMDY : B:=TryEncodeDate(N3,N1,N2,Result);
doDMY : B:=TryEncodeDate(N3,N2,N1,Result);
else B:=false;
end;
If not B then // Not sure if TryEncodeDate touches Result.
Result:=Def;
end;

This:
N2:=StrToIntDef(Copy(S,1,P-1),-1);
If (N1=0) then Exit;

shouldn't it be:
If(N2=-1) then Exit;

Regards

#### wp

• Hero Member
• Posts: 7525
##### Re: Bug in fuction ParseDate in EditBtn.pas
« Reply #1 on: August 13, 2020, 10:23:08 am »
Yes, looks wrong. But I think it is not relevant because the edit mask of TDateEdit is designed such that only numeric characters can be entered, and thus the center part of the date string will always be a valid number, i.e. StrToIntdef will never return the default value.

Even without the edit mask (when the code snipped is copied to another file) the parsing result is still correct because the invalid center part makes the final TryStrToDate fail.

Nevertheless, for the sake of code clarity, I fixed it in r63728.
Mainly Lazarus trunk / fpc 3.2.0 / all 32-bit on Win-10, but many more...

#### kolevs

• Newbie
• Posts: 2
##### Re: Bug in fuction ParseDate in EditBtn.pas
« Reply #2 on: August 14, 2020, 10:26:39 am »
Thanks, you are very fast

Sorry for the inconvenience, but I found another not very logical part in same file.
function ParseDateNoPredefinedOrder
internal procedure Split

for i :=  1 to Length(Fmt) do
if not (Fmt in Digits) then Sep := Sep + [Fmt];

Isn't that supposed Fmt to be 'dd.mm.yy' or something like this, but not Digits.
May be SDate should be used?

Regards