Как выяснить дату последнего изменения файла?

Для выяснения даты последнего изменения файла можно воспользоваться следующей функцией:


function GetFileDate(FileName: string): string;  
var  
  FHandle: Integer;  
begin  
  FHandle := FileOpen(FileName, 0);  
  try  
    Result := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));  
  finally  
    FileClose(FHandle);  
  end;  
end;  

Добавлено: 31 Июля 2018 21:19:41 Добавил: Андрей Ковальчук

Функции работы с датами и временем

function Now: TDateTime; 

Возвращает текущую датау и время на вашем компьютере. TDateTime в KOL ни чем не отличается от VCL аналога. TDateTime представляет из себя число с плавающей запятой (т.е. Double), целая часть которого содержит число дней, отсчитанное от некоторого начала календаря, а дробная часть равна части 24-часового дня, т.е. характеризует время и не относится к дате.

function CompareSystemTime( const D1, D2: TSystemTime ): Integer; 

Функция сравнивает 2-е записи типа TSystemTime. На выходе:
-1 если D1 < D2
0 если D1 = D2
1 если D1 > D2.
TSystemTime - структура используемая в Winddows API для хранения данных о датах и времени. IMHO зачастую она даже удобней в использование обычной TDateTime.
Подробней конечно можно посмотреть и в Win32.hlp, но всетаки...
Для получения системного времени : GetSystemTime
Для установки системено времени на вашем компьютере: SetSystemTime


type  
PSystemTime = ^TSystemTime;  
   TSystemTime = record  
   wYear: Word; // год  
   wMonth: Word; // месец  
   wDayOfWeek: Word; // день недели  
   wDay: Word; // день  
   wHour: Word; // часы  
   wMinute: Word; // минуты  
   wSecond: Word; // секунды  
   wMilliseconds: Word; // миллисекунды  
end;   

procedure IncDays( var SystemTime: TSystemTime; DaysNum: Integer ); 

Увеличивает или уменьщает количество дней в записи типа TSystemTime. DaysNum может быть отрицательным.

procedure IncMonths( var SystemTime: TSystemTime; MonthsNum: Integer ); 

Увеличивает или уменьщает количество дней в записи типа TSystemTime. DaysNum может быть отрицательным. Правильный результат не гарантирован если число дней превышено для нового месяца

function IsLeapYear( Year: Word ): Boolean;
.
Возвращает true если указанные год Year является высокосным (то есть имеет 29 дней в Феврале).

function DayOfWeek( Date: TDateTime ): Integer;

Возвращает день недели (от 0 до 6) для текушей даты.

function SystemTime2DateTime( const SystemTime: TSystemTime; var DateTime: TDateTime ): Boolean; 

Преобразует дату из типа TSystemTime в TDateTime

function DateTime2SystemTime( const DateTime: TDateTime; var SystemTime: TSystemTime ): Boolean;

Преобразует дату из типа TDateTime в TSystemTime.

function CatholicEaster( nYear: Integer ): TDateTime; 

Возвращает дату католического рождества в указаном году

Добавлено: 27 Июля 2018 08:37:50 Добавил: Андрей Ковальчук

Работа с таймером на Win API

Таймер - вещь в хозяйстве очень полезная. Если некое действие нужно повторять с определенной периодичностью, то таймер, это как раз то, что нужно. Если вдруг мы захотим приколоться над другом, то с помощью таймера можно сделать кучу прикольных вещей. Например: перемещать по рабочему столу иконки (или курсор мыши), выдвигать лоток сидюка, запускать программы (или вырубать их) и многое другое.

Но сегодня мы никому вредить не будем, а просто посмотрим, как же работать с таймером. По традиции начнем с переменных.


const  
idtimer1 = 1;  
idtimer2 = 2;  
idlabeltime = 3;  
idlabeldate = 4;  
idlabeldayofweek = 5;  
labelwidth = 70;  
  
var  
wc: twndclassex;  
wnd: hwnd;  
msg: tmsg;  
labeltime: hwnd;  
labeldate: hwnd;  
labeldayofweek: hwnd;  
  
t: tsystemtime;  
  
syear: string;  
smonth: string;  
sdayofweek: string;  
sday: string;  
shour: string;  
sminute: string;  
ssecond: string;  
smilliseconds: string;  
  
formwidth: word = 300;  
labelleft: word = 10;  
direction: boolean = true; 

В этот раз переменных много, мы рассмотрим их все по мере того, как будем разбираться в программе. Из констант видно, что у нас будет два таймера и три метки. Что мы будем с ними делать? Первый таймер будет получать информацию о дате и времени на компьютере, и выводить ее на три метки в следующем виде: первая метка - день недели, вторая метка - дата, третья метка - время. Второй таймер будет перемещать метки по форме в горизонтальном направлении, (метки будут как бы отскакивать от краев формы).

Чтобы создать таймер, нужно воспользоваться функцией settimer.


settimer( wnd, idtimer1, 10, nil );  
settimer( wnd, idtimer2, 1, nil ); 

Рассмотрим параметры этой функции. Первый - идентификатор окна, которому будет принадлежать таймер. Второй - идентификатор самого таймера. Третий - интервал, через который таймер будет посылать окну, которому он принадлежит, сообщение wm_timer. Интервал задается в миллисекундах, из расчета, что в одной секунде тысяча миллисекунд. Четвертый - указатель на процедуру timerproc (подробности смотри в хелпе).

При выходе из программы таймеры нужно уничтожить. Для этого надо воспользоваться функцией killtimer. Ее два параметра аналогичны первым двум параметрам функции settimer.


while getmessage( msg, 0, 0, 0 ) do  
begin  
translatemessage( msg );  
dispatchmessage( msg );  
end;  
killtimer( wnd, idtimer1 );  
killtimer( wnd, idtimer2 );  
halt( msg.wparam );  

Для "взаимодействия" с таймером нужно обрабатывать сообщение wm_timer.


function windowproc( wnd: hwnd; msg: uint; wparam: wparam; lparam: lparam ): lresult; stdcall;  
begin  
case msg of  
wm_destroy: begin  
postquitmessage( 0 );  
result := 0;  
exit;  
end;  
wm_timer: begin  
case ( wparam ) of  
idtimer1: begin  
if ( labelleft < 10 ) or ( labelleft + labelwidth > formwidth - 10 ) then  
direction := not direction;  
if direction then  
inc( labelleft )  
else  
dec( labelleft );  
setwindowpos( labeldayofweek, 0, labelleft, 10, labelwidth, 20, 0 );  
setwindowpos( labeldate, 0, labelleft, 30, labelwidth, 20, 0 );  
setwindowpos( labeltime, 0, labelleft, 50, labelwidth, 20, 0 );  
end;  
idtimer2: begin  
getlocaltime( t );  
str( t.wday, sday );  
if length( sday ) = 1 then  
sday := '0' + sday;  
str( t.wmonth, smonth );  
if length( smonth ) = 1 then  
smonth := '0' + smonth;  
str( t.wyear, syear );  
setwindowtext( labeltime, pchar( shour + ':' +  
sminute + ':' + ssecond + ':' + smilliseconds ) );  
  
str( t.whour, shour );  
if length( shour ) = 1 then  
shour := '0' + shour;  
str( t.wminute, sminute );  
if length( sminute ) = 1 then  
sminute := '0' + sminute;  
str( t.wsecond, ssecond );  
if length( ssecond ) = 1 then  
ssecond := '0' + ssecond;  
str( t.wmilliseconds, smilliseconds );  
setwindowtext( labeldate, pchar( sday + '.' +  
smonth + '.' + syear ) );  
  
case t.wdayofweek of  
0: sdayofweek := 'Воскресенье';  
1: sdayofweek := 'Понедельник';  
2: sdayofweek := 'Вторник';  
3: sdayofweek := 'Среда';  
4: sdayofweek := 'Четверг';  
5: sdayofweek := 'Пятница';  
6: sdayofweek := 'Суббота';  
end;  
setwindowtext( labeldayofweek, pchar( sdayofweek ) );  
end;  
end;  
end;  
else  
result := defwindowproc( wnd, msg, wparam, lparam );  
end;  
end; 

Идентификатор таймера находится в параметре wparam сообщения wm_timer, здесь все просто. Посмотрим, что делает каждый таймер. Первый таймер отвечает за перемещение меток по форме. Направление перемещения зависит от значения переменной direction и осуществляется функцией setwindowpos. Второй таймер занимается тем, что получает текущую дату и время. Для этого нужно воспользоваться процедурой getlocaltime, в качестве параметра ей нужно передать переменную типа tsystemtime, в которую будет помещен результат. Для того чтобы вывести полученные значения в метки, их (значения) нужно перевести из чисел в строки. В этом нам поможет процедура str. У нее два параметра: что переводим и куда будет помещен результат. Чтобы изменить текст метки (или любого другого элемента или окна), используем процедуру setwindowtext. У нее два параметра: идентификатор окна (элемента окна), текст которого следует изменить, и сам текст.

И напоследок посмотрим, как создается форма в этом примере.


wnd := createwindowex( 0, wndclass, wndcaption, ws_overlapped or  
ws_caption or ws_sysmenu or ws_minimizebox,  
10, 10, formwidth, 100, 0, 0, hinstance, nil ); 

Раньше, в качестве флага мы указывали ws_overlappedwindow, который включает в себя следующие флаги - ws_overlapped, ws_caption, ws_sysmenu, ws_thickframe, ws_minimizebox, ws_maximizebox. В этом примере мы выкинули два флага: ws_maximizebox (делает неактивной кнопку максимизации окна) и ws_thickframe (или ws_sizebox, что одно и то же. Без него мы не сможем изменять размеры формы мышкой). Это упрощение сделано для того, чтобы не производить дополнительные вычисления при изменении ширины формы, что необходимо для правильной работы первого таймера.

На сегодня это все, удачи в программировании.

Автор: Евгений

Добавлено: 26 Июля 2018 20:56:59 Добавил: Андрей Ковальчук