Icon View Thread

The following is the text of the current message along with any replies.
Messages 1 to 1 of 1 total
Thread Time Entry Helper
Thu, May 29 2014 8:48 AMPermanent Link

Walter Matte

Tactical Business Corporation


I'm doing another Time Sheet Entry and this client wants people to enter Start, Stop and Break Start, Stop times.

To make things smoother on data entry I present a grid with one row per day and.....

3 things: Grid KeyPress, Dataset SetText (FixTime function) and Combo Box.


Grid KeyPress - I only allow specifc values:

function TfrmTime.grdDetKeyPress(Sender: TObject; Key: Char; ShiftKey, CtrlKey, AltKey: Boolean): Boolean;
begin
 if (CTRLKey) or (ALTKey) then
 begin
   result := false;
 end
 else if ord(key) = 13 then
 begin
   TimeDet.Next;
 end
 else
 begin
   if IsDigit(Key) or (Key = ':') or (Key = ' ') or
                      (Key = 'a') or (Key = 'A') or
                      (Key = 'p') or (Key = 'P') or
                      (Key = 'm') or (Key = 'M') then
     result := true
   else
     result := false;
 end;
end;


On the Dataset Fields I trigger the SetText event to validate and also parse for specific patterns to allow quicker entry.

I allow "a" or "p" not just AM PM and single digits are assume to be hour values.

5 ->  5:00 AM

5a  -> 5:00 AM



function TfrmTime.TimeDetStartTimeSetText(Sender: TObject; const Value: String): String;
begin
 result := FixTime(value);
end;

function FixTime(sTime : string) : string;
var
 i, c  : integer;
 ap, hr, mn : string;
begin
 result := '';

 sTime := Trim(UpperCase(sTime));

 hr := '';
 mn := '';
 ap := '';

 c := Pos(':', stime);

 for i := 1 to length(sTime) do
 begin                   
   if ((sTime[i] >= '0') and (sTime[i] <= '9')) or (sTime[i] = ':') then
   begin
     if (i < c) or (c = 0) then
       hr := hr + sTime[i]
     else if i > c then
       mn := mn + sTime[i];
   end
   else
   begin
     break;
   end;
 end;

 
 if (hr = '') and (mn = '') then
 begin
   exit;
 end;
                 
 if mn = '' then
   mn := '00';

 if strtoint(hr) > 23 then
   exit;

 if strtoint(mn) > 59 then
   exit;

 if Pos('P', sTime) > 1 then
   ap := ' PM';

 if Pos('A', sTime) > 1 then
   ap := ' AM';

 i := StrToInt(mn);
 if i < 15 then
   mn := '00'
 else if i < 30 then
   mn := '15'
 else if i < 45 then
   mn := '30'
 else
   mn := '45';

 if hr = '12' then
 begin       
   result := hr + ':' + mn;
 end
 else
 begin
   result := hr + ':' + mn + ap;
 end;
end;





And in the grid I set I have the start/stop fields set to ComboBox and initialize

They only allow 15 minute intervals.

procedure TfrmTime.frmTimeCreate(Sender: TObject);
var
 i, j : integer;
 s : string;
begin

// Load Combo Time
 for i := 6 to 11 do
 begin      
   s := inttostr(i);
   if length(s) = 1 then s := '0' + s;
   for j := 1 to 4 do
   begin
     grdDet.Columns.Column[j].Items.Add(s+':00 AM');
     grdDet.Columns.Column[j].Items.Add(s+':15 AM');
     grdDet.Columns.Column[j].Items.Add(s+':30 AM');
     grdDet.Columns.Column[j].Items.Add(s+':45 AM');
   end;
 end;

 for i := 12 to 12 do
 begin      
   s := inttostr(i);
   if length(s) = 1 then s := '0' + s;
   for j := 1 to 4 do
   begin
     grdDet.Columns.Column[j].Items.Add(s+':00 PM');
     grdDet.Columns.Column[j].Items.Add(s+':15 PM');
     grdDet.Columns.Column[j].Items.Add(s+':30 PM');
     grdDet.Columns.Column[j].Items.Add(s+':45 PM');
   end;
 end;

 for i := 1 to 11 do
 begin      
   s := inttostr(i);
   if length(s) = 1 then s := '0' + s;
   for j := 1 to 4 do
   begin
     grdDet.Columns.Column[j].Items.Add(s+':00 PM');
     grdDet.Columns.Column[j].Items.Add(s+':15 PM');
     grdDet.Columns.Column[j].Items.Add(s+':30 PM');
     grdDet.Columns.Column[j].Items.Add(s+':45 PM');
   end;
 end;

end;


Walter
Image