Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Как в runtime показать время компиляции программы?   Найти похожие ветки 

 
novill ©   (2006-08-15 22:53) [0]

сабж


 
Virgo_Style ©   (2006-08-15 22:55) [1]

и главное, зачем?


 
Германн ©   (2006-08-16 00:41) [2]

Не. Ещё главнее - что есть "время компилляции"? Дата/время или длительность? :-)


 
Джо ©   (2006-08-16 02:58) [3]

У меня в ряде старых проектов нужно было вместо номера версии (а она, в силу некоторых причин, обновлялась очень часто) выводить дату и время компиляции проекта.
Проблему решил написанием нехитрого AddIn"а , подключаемого к IDE.

Вот текст модуля CompileTimeExpert.pas.


{
 AddInNotifier, срабатывающий при компиляции проекта.
 Помещает в каталог с главным файлом проекта файл CompileDateTime.inc
 с объявлением констант, содержащих актуальную дату и время компиляции проекта.
 
 Автор: Каминский С.А.
}

unit CompileTimeExpert;

interface
uses Windows, ExptIntf, ToolIntf;

type

 TCompileTimeNotifier = class(TIAddInNotifier)
 public
   procedure FileNotification(NotifyCode: TFileNotification;
     const FileName: string; var Cancel: Boolean); override;
   procedure EventNotification(NotifyCode: TEventNotification;
     var Cancel: Boolean); override;
 end;

procedure Register;

implementation
uses SysUtils;

var
 Notifier: TCompileTimeNotifier;

procedure Register;
begin
 //
end;

procedure TCompileTimeNotifier.EventNotification(
 NotifyCode: TEventNotification; var Cancel: Boolean);
var
 Fv: TextFile;
 Fn: string;
begin
 if (NotifyCode = enBeforeCompile) and (ToolServices.GetProjectName <> "") then
 begin
   Fn := ExtractFilePath (ToolServices.GetProjectName) +
     "CompileDateTime.inc";
   AssignFile (Fv,Fn);
   try
     Rewrite (Fv);
     WriteLn (Fv, "//");
     WriteLn (Fv, "// Auto-generated compile datetime file for " +
       ExtractFileName (ToolServices.GetProjectName) + " project");
     WriteLn (Fv, "// Include it in your project with {$include CompileDateTime.inc} directive");
     WriteLn (Fv, "//");

     WriteLn (Fv, "const");
     WriteLn (Fv, "  _CompileDateTime = ", FloatToStr(Now));
     WriteLn (Fv, "  _CompileTimeStr = ", TimeToStr(Now));
     WriteLn (Fv, "  _CompileDateStr = ",DateToStr(Now));
     WriteLn (Fv, "  _CompileDateTimeStr = ",DateTimeToStr(Now));
   finally
     CloseFile (Fv);
     ToolServices.ReloadFile(Fn);
   end;
 end;
end;

procedure TCompileTimeNotifier.FileNotification(
 NotifyCode: TFileNotification; const FileName: string;
 var Cancel: Boolean);
begin
end;

initialization
 Notifier := TCompileTimeNotifier.Create;
 ToolServices.AddNotifierEx(Notifier);

finalization
 ToolServices.RemoveNotifier(Notifier);
 Notifier.Free;

end.


AddIn устанавливается в среду стандартно, т.е, через меню Component/Install component...

После установки, при каждой компиляции любого проекта в каталоге с проектом будет автоматически генерироваться файл CompileDateTime.inc. В нем будут находиться следующие константы с указанием даты/времени последней компиляции проекта:
//
// Auto-generated compile datetime file for Project1.dpr project
// Include it in your project with {$include CompileDateTime.inc} directive
//
const
 _CompileDateTime = 38945.0731506713
 _CompileTimeStr = 1:45:20
 _CompileDateStr = 16.08.2006
 _CompileDateTimeStr = 16.08.2006 1:45:20


Для их использования достаточно включить этот файл в нужное место программы при помощи директивы компилятора {$include} и использовать эти константы по назначению.

В общем, всё просто :)


 
Джо ©   (2006-08-16 03:32) [4]

> [2] Германн ©   (16.08.06 00:41)
> Дата/время или длительность? :-)

Длительность компиляции определить тоже несложно :) Вносим следующие исправления:

...
implementation
uses SysUtils, DateUtils;

var
 Notifier: TCompileTimeNotifier;
 LastCompileDt: TDateTime = 0;

procedure TCompileTimeNotifier.EventNotification(
 NotifyCode: TEventNotification; var Cancel: Boolean);
var
 Fv: TextFile;
 Fn: string;
begin
 if ToolServices.GetProjectName = "" then
   Exit;

 Fn := ExtractFilePath (ToolServices.GetProjectName) +
   "CompileDateTime.inc";

 try
   case NotifyCode of
     enBeforeCompile:
       begin
         AssignFile (Fv,Fn);
         try
           Rewrite (Fv);
           LastCompileDt := Now();
           WriteLn (Fv, "//");
           WriteLn (Fv, "// Auto-generated compile datetime file for " +
             ExtractFileName (ToolServices.GetProjectName) + " project");
           WriteLn (Fv, "// Include it in your project with {$include CompileDateTime.inc} directive");
           WriteLn (Fv, "//");

           WriteLn (Fv, "const");
           WriteLn (Fv, "  _CompileDateTime = ", FloatToStr(Now));
           WriteLn (Fv, "  _CompileTimeStr = ", TimeToStr(Now));
           WriteLn (Fv, "  _CompileDateStr = ",DateToStr(Now));
           WriteLn (Fv, "  _CompileDateTimeStr = ",DateTimeToStr(Now));
         finally
           CloseFile (Fv);
         end;
       end;
     enAfterCompile:
       begin
         AssignFile (Fv,Fn);
         try
           Append (Fv);
           WriteLn (Fv, "  _CompileDurationInSec = ",
           FloatToStr(SecondSpan(Now(),LastCompileDt)));
         finally
           CloseFile (Fv);
         end;
       end;
   end;

 finally
   ToolServices.ReloadFile(Fn);
 end;
end;


Вуаля — имеем еще одну константу, _CompileDurationInSec. Правда, придумать этому практическое применение сложнее, чем написать этот AddIn :)


 
evvcom ©   (2006-08-16 08:46) [5]

А в PE заголовке есть DWORD, который используется для хранения даты и времени создания/модификации линкером. Или его дельфовый линкер не прописывает? Сам я не смотрел, что реально там находится.


 
novill ©   (2006-08-16 11:33) [6]

Джо, большое спасибо.


 
Ketmar ©   (2006-08-16 11:37) [7]

> [5] evvcom ©   (16.08.06 08:46)
бред всякий там.


 
DrPass ©   (2006-08-16 12:19) [8]


> Вуаля — имеем еще одну константу, _CompileDurationInSec.
>  Правда, придумать этому практическое применение сложнее

Легко - складывать это значение от каждой компиляции, полученную сумму в конце дня вычитать делить на 3600 и умножать на стоимость рабочего часа программиста. А результат вычитать из его зарплаты. Ведь когда программа компилируется, программист обычно нифига не делает...


 
Джо ©   (2006-08-16 12:27) [9]

Исходник копировал с чернового варианта, там строковые константы еще заквотить нужно.


> [8] DrPass ©

Не дай бог работодателям прочитать этот пост :)


 
KilkennyCat ©   (2006-08-16 12:45) [10]

> Ведь когда программа компилируется, программист обычно нифига
> не делает...


Ничего подобного. Если программист производит впечатление неработающего, это вовсе не означает, что он - не работает....

Помню, лет восемь назад, работало у меня одно чудо: даю вечером задание, к утру надо сделать. Сижу, работаю, периодически посматриваю, что делает чудо. Чудо играет.
Проходит час - чудо играет. Я не выдерживаю, спрашиваю о программе. отвечает, что помнит, к утру сделает. Проходит час. Чудо играет...
Чудо играло всю ночь.
А утром программа была готова, и близко к идеалу. Клиент был счастлив.
Когда она была сделана я так и непонял, ибо у меня ушло бы часа четыре на нее...


 
novill ©   (2006-08-16 14:39) [11]

> [9] Джо ©   (16.08.06 12:27)
> Исходник копировал с чернового варианта, там строковые константы
> еще заквотить нужно.

угу, еще и сточки с запятой поставить :)


 
Джо ©   (2006-08-16 14:49) [12]

> [11] novill ©   (16.08.06 14:39)
> угу, еще и сточки с запятой поставить :)

Истинно так :)



Страницы: 1 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.076 c
2-1155462921
Triton
2006-08-13 13:55
2006.09.03
Модератор - чудак на букву "М"


15-1155239556
TGX
2006-08-10 23:52
2006.09.03
Проблемы с монитором!


15-1155394031
serko
2006-08-12 18:47
2006.09.03
QReport в Delphi 7!


2-1155290985
GeLLeR
2006-08-11 14:09
2006.09.03
Label


15-1154700286
AntiUser
2006-08-04 18:04
2006.09.03
Тест скорости интернет соединения.