Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


novill ©   (2006-08-15 22:53:00) 

сабж


Джо   (2006-08-16 14:49:00) [1]

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

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


novill   (2006-08-16 14:39:00) [2]

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

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


KilkennyCat   (2006-08-16 12:45:00) [3]

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


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

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


Джо   (2006-08-16 12:27:00) [4]

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


> [8] DrPass ©

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


DrPass   (2006-08-16 12:19:00) [5]


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

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


Ketmar   (2006-08-16 11:37:00) [6]

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


novill   (2006-08-16 11:33:00) [7]

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


evvcom   (2006-08-16 08:46:00) [8]

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


Джо   (2006-08-16 03:32:00) [9]

> [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 :)


Джо   (2006-08-16 02:58:00) [10]

У меня в ряде старых проектов нужно было вместо номера версии (а она, в силу некоторых причин, обновлялась очень часто) выводить дату и время компиляции проекта.
Проблему решил написанием нехитрого 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 00:41:00) [11]

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


Virgo_Style   (2006-08-15 22:55:00) [12]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо