Other Data Types
This page (a late addition to the tutorial) covers some less common inbuilt data types that you may encounter or use yourself. You might skim this page at your first run through the tutorials then return to it when you have studied a few more topics.
This little program outputs the highest and lowest (most negative) numbers of various types as shown below the code.
program NumberTypes; begin writeln('low(int64): ', low(int64)); writeln('high(int64): ', high(int64)); writeln('low(cardinal): ', low(cardinal)); writeln('high(cardinal): ', high(cardinal)); writeln('low(integer): ', low(integer)); writeln('high(integer): ', high(integer)); writeln('low(smallint): ', low(smallint)); writeln('high(smallint): ', high(smallint)); writeln('low(byte): ', low(byte)); writeln('high(byte): ', high(byte)); readln; end.
low(int64): -9223372036854775808 high(int64): 9223372036854775807 low(cardinal): 0 high(cardinal): 4294967295 low(integer): -2147483648 high(integer): 2147483647 low(smallint): -32768 high(smallint): 32767 low(byte): 0 high(byte): 255
You can use the int64 type for variables that might take values greater then 2147483647 and/or less than -2147483648. Factorials are frequently huge numbers so we use the int64 type in our example. Our elapsed time demonstration below requires the use of variables of type int64.
You can use the 32-bit unsigned cardinal type for variables that might take values greater then 2147483647 but that will not exceed 4294967295. Fibonacci numbers may be large so we use the cardinal type in these examples. Jason McMillen uses the cardinal data type extensively in his Artillery tutorial.
This 16-bit signed number type is little used nowadays, but is required for initiating a graph. See the student programs that use WinGraph.
TDateTime is a real variable, giving the number of days since 30/12/1899. The decimal part of the real number gives the fraction of a day, so .25 represents 6:00 am.
Many routines manipulate a TDateTime variable (and also real variables without the need to cast them to TDateTime). Add DateUtils to the uses section and see the Lazarus file dateutil.inc for DateOf (to remove the time of day), TimeOf (to remove the number of days), DayOf, MonthOf and YearOf. See also datih.inc for useful functions such as DateToStr, StrToDate, EncodeDate, EncodeTime, Now (for current date and time), Time (for current time without the number of days), Date (for number of days without the time of day) and TryStrToDate. There are also less obvious functions such as MilliSecondOfTheWeek for those that can find a use for them.
DelphiBasics gives DateTimeToString procedure for outputting dates and times in the format that you want.
- formatting a date;
- formatting a time;
- the DayOf, MonthOf, YearOf, Now, EncodeDate, Date and TryStrToDate functions;
- subtraction of TDateTime values;
- date validation.
program DateDemo; uses SysUtils, DateUtils; var strDateTime: string; WholeDaysToChristmas: real; Date1: string = '28/02/2015'; Date2: string = '29/02/2015'; dt1, dt2: TDateTime; begin DateTimeToString(strDateTime, 'dddd d mmmm, yyyy', Now); writeln('Today''s date: ', strDateTime); DateTimeToString(strDateTime, 'hh:mm:ss', Now); writeln('Current time: ', strDateTime); writeln('Start Date (dd/mm/yyyy): ', DayOf(0), '/', MonthOf(0), '/', YearOf(0)); WholeDaysToChristmas := EncodeDate(2015, 12, 25) - Date; writeln('Whole days to Christmas: ', trunc(WholeDaysToChristmas)); if TryStrToDate(Date1, dt1) then writeln(DateToStr(dt1), ' accepted') else writeln(Date1, ' invalid'); if TryStrToDate(Date2, dt2) then writeln(DateToStr(dt2)) else writeln(Date2, ' invalid'); readln; end.
Today's date: Friday 26 December, 2014 Current time: 16:34:33 Start Date (dd/mm/yyyy): 30/12/1899 Whole days to Christmas: 364 28/02/2015 accepted 29/02/2015 invalid
Measuring Elapsed Time
The next example shows how you can subtract TDateTime values to obtain a measure of elapsed time that is sufficiently accurate for most purposes. Here we compare it with the Windows recommended QueryPerformanceCounter, which records the count via a var parameter of type int64.
A copy of a typical output follows the code.
program DurationDemo; uses SysUtils, Windows; var StartTime: TDateTime; Duration, Period: real; i: integer; Frequency, StartTicks, EndTicks: int64; begin QueryPerformanceFrequency(Frequency); for i := 1 to 5 do begin StartTime := Now; QueryPerformanceCounter(StartTicks); Sleep(1000); Duration := Now - StartTime; Duration := Duration * 24 * 60 * 60; QueryPerformanceCounter(EndTicks); Period := (EndTicks - StartTicks) / frequency; writeln('Delay measured by subtracting Now values: ', Duration : 8 : 4, ' seconds'); writeln('Delay measured using QueryPerformanceCounter: ', Period : 8 : 4, ' seconds'); writeln; end; readln; end.
Delay measured by subtracting Now values: 1.0150 seconds Delay measured using QueryPerformanceCounter: 1.0149 seconds Delay measured by subtracting Now values: 1.0160 seconds Delay measured using QueryPerformanceCounter: 1.0150 seconds Delay measured by subtracting Now values: 1.0160 seconds Delay measured using QueryPerformanceCounter: 1.0151 seconds Delay measured by subtracting Now values: 1.0150 seconds Delay measured using QueryPerformanceCounter: 1.0151 seconds Delay measured by subtracting Now values: 1.0160 seconds Delay measured using QueryPerformanceCounter: 1.0150 seconds