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

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
Asked:
tobjectpascal
2 Solutions
 
Russell LibbySoftware Engineer, Advisory Commented:

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
 
esoftbgCommented:
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.

Join & Write a Comment

Featured Post

Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

Tackle projects and never again get stuck behind a technical roadblock.
Join Now