Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

Как в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.035 c
1-1153476997
dimdi
2006-07-21 14:16
2006.09.03
Структура файла сохраненного Delphi приложен?


2-1155543782
AlexKniga
2006-08-14 12:23
2006.09.03
Что такое ^P?


4-1146964023
Владимир
2006-05-07 05:07
2006.09.03
Перевод монитора в режим stand-by: грябли


2-1155276649
Yegorchic
2006-08-11 10:10
2006.09.03
Проблема с удалением папки


2-1155296090
fast2
2006-08-11 15:34
2006.09.03
Как сделать, чтоб можна было двигать дочерней формой...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский