Date format

 

From: Martin Brooks <martin@image-data.com>

 

I have a very urgent problem i am currently working on a college project

 where i have to check the validity of dates entered into a maskedit in

 this format - __/__/____ e.g. 12/12/1997.

 

Ages ago, I did a very silly date encoder/decoder that did check that a date was valid. See code below.

 


function CheckDateFormat(SDate:string):string;

var

  IDateChar:string;

  x,y:integer;

begin

  IDateChar:='.,\/';

  for y:=1 to length(IDateChar) do

  begin

    x:=pos(IDateChar[y],SDate);

    while x>0 do

    begin

      Delete(SDate,x,1);

      Insert('-',SDate,x);

      x:=pos(IDateChar[y],SDate);

    end;

  end;

  CheckDateFormat:=SDate;

end;

 

 

function DateEncode(SDate:string):longint;

var

  year,month,day:longint;

  wy,wm,wd:longint;

  Dummy:TDateTime;

  Check:integer;

begin

  DateEncode:=-1;

  SDate:=CheckDateFormat(SDate);

  Val(Copy(SDate,1,pos('-',SDate)-1),day,check);

  Delete(Sdate,1,pos('-',SDate));

  Val(Copy(SDate,1,pos('-',SDate)-1),month,check);

  Delete(SDate,1,pos('-',SDate));

  Val(SDate,year,check);

  wy:=year;

  wm:=month;

  wd:=day;

  try

    Dummy:=EncodeDate(wy,wm,wd);

  except

    year:=0;

    month:=0;

    day:=0;

  end;

  DateEncode:=(year*10000)+(month*100)+day;

end;

 


DateSer Function

 

From: "Damir Bulic - Ramayana" <damir.bulic@zg.tel.hr>

Hi, this is a source of a function DateSer I wrote, because I worked in VB before, and this was a very useful function. Delphi unfortunately doesn't have it. Use it in a form of

    DecodeDate(Date,y,m,d);

    NewDate:=DateSer(y-4,m+254,d+1234);

or something like that....

 


 function DateSer(y,m,d: Integer): TDateTime;

const

   mj: array[1..12] of Integer=(31,28,31,30,31,30,31,31,30,31,30,31);

var

 add: Integer;

begin

 while(true) do begin

  y:=y+(m-1) div 12;

  m:= (m-1) mod 12 +1;

  if m<=0 then begin

     Inc(m,12);

         Dec(y);

  end;

  if  ((y mod 4 = 0) and

      ((y mod 100<>0) or (y mod 400=0)))

          and (m=2) then

     add:=1 //add one day in February

  else

    add:=0;

  if (d>0) and (d<=(mj[m]+add)) then break;

  if d>0 then begin Dec(d,mj[m]+add); Inc(m); end

  else begin Inc(d,mj[m]+add); Dec(m); end;

 end;

 Result:=EncodeDate(y,m,d);

end;

 


Automatic Year in a date edit

 

"Henk Schreij" <schreij@daxis.nl>

Als je een Datumveld intypt in een Database, dan kun je het jaartal weglaten, omdat de computer die voor je invult met het huidige jaar. Kan zoiets ook in een gewoon Edit-veld?

Het antwoord is ja, dat kan met:

 


PROCEDURE TForm1.Edit1Exit(Sender: TObject);

BEGIN

  IF Edit1.Text<>'' THEN BEGIN

    TRY

      StrToDate(Edit1.Text);

    EXCEPT

      Edit1.SetFocus;

      MessageBeep(0);

      raise Exception.Create('"'+Edit1.Text

      +'" is no valid Date');

    END{try};

    Edit1.Text:=DateToStr(StrToDate(Edit1.Text));

  END{if};

END;