• Status: Solved
• Priority: Medium
• Security: Public
• Views: 207

# Problem with MOD and Integer.

Anyone have a solution to this problem..

Function Tform1.BuildTime(TimeVal: Longint): string;
Var
BuildStr: String;
RunTime: Longint;
RSec,Rhours,Rmins,Rdays: Integer;
Begin
BuildStr:='';
RunTime:=TimeVal;
RDays:=Trunc(RunTime/60/60/24) mod 24 ;
If (Rdays>1) or (Rdays=0) Then
BuildStr:=BuildStr+' '+IntToStr(Rdays)+' days, '
else
BuildStr:=BuildStr+' '+IntToStr(Rdays)+' day, ';
RHours:=Trunc(RunTime/60/60) mod 24;
If (RHours>1) or (RHours=0) Then
BuildStr:=BuildStr+IntToStr(Rhours)+' Hours, '
else
BuildStr:=BuildStr+IntToStr(Rhours)+' Hour, ';
RMins:=Trunc(RunTime/60) mod 60;
If (RMins>1) or (RMins=0) Then
BuildStr:=BuildStr+IntToStr(RMins)+' Minutes, '
else
BuildStr:=BuildStr+IntToStr(RMins)+' Minute, ';
RSec:=Trunc(RunTime) Mod 60;
If (RSec>1) or (RSec=0) Then
BuildStr:=BuildStr+IntToStr(RSec)+' Seconds.'
else
BuildStr:=BuildStr+IntToStr(RSec)+' Second.';
Result:=BuildStr;
End;

//some button
Begin
//this gets how long your machine has been running for from
//get tick count
BuildStr:=BuildTime(Trunc(GetTickCount/1000));
ShowMessage(BuildStr);
End;

Problem is, after 22 days or so, MOD fails and goes back to 0

try  60 * 60 * 24 * 30  //60 seconds * 60 minutes * 24 hours * 30 days

And the result should be 30 day, the routine screws up giving something like 4 days, anyone know how solve this?
0
tobjectpascal
2 Solutions

Commented:
0

Seems like RDays should be the following

RDays:=Trunc(RunTime / 60 / 60 / 24) ;

Where instead, you are dividing by 24 and then mod'ing by 24 (dividing will get the number of days, mod'ing will return the hours)

Regards,
Russell
0

Commented:
as rllibby wrote above:

function  Tform1.BuildTime(TimeVal: Int64): string;
var
BuildStr:      string;
RunTime:       Int64;
RSec,Rhours,
Rmins,Rdays:   Int64;
begin
BuildStr := '';
RunTime := TimeVal;
RDays := Trunc(RunTime/60/60/24);
if (Rdays=1) then
BuildStr := BuildStr+' '+IntToStr(Rdays)+' day, '
else
BuildStr := BuildStr+' '+IntToStr(Rdays)+' days, ';
RHours := Trunc(RunTime/60/60) mod 24;
if (RHours=1) then
BuildStr := BuildStr+IntToStr(Rhours)+' Hour, '
else
BuildStr := BuildStr+IntToStr(Rhours)+' Hours, ';
RMins := Trunc(RunTime/60) mod 60;
if (RMins=1) then
BuildStr := BuildStr+IntToStr(RMins)+' Minute, '
else
BuildStr := BuildStr+IntToStr(RMins)+' Minutes, ';
RSec := Trunc(RunTime/1) mod 60;
if (RSec=1) then
BuildStr := BuildStr+IntToStr(RSec)+' Second.'
else
BuildStr := BuildStr+IntToStr(RSec)+' Seconds.';
Result := BuildStr;
end;

The poits are for rllibby, I just wrote it as code
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.