Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Программирование -> Delphi / Pascal -> Определение даты и времени компиляции


Определение даты и времени компиляции

Очень часто в окне “About” различных программ можно наблюдать не только сведения о версии программы, но и дате и времени компиляции. Насколько мне известно, Delphi не дает стандартных способов определения данной величины, но получить ее все же можно.

Воспользуемся тем фактом, что независимо от того были ли сохранены изменения, сделанные в свойствах компонентов формы или нет, в конечный exe-файл все равно попадут измененные. То есть для проекта с несохраненными свойствами можно приравнять момент компиляции с моментом записи измененных свойств в поток (ситуацию с полностью сохраненным проектом рассмотрим позднее). Как же отловить момент записи? К счастью, Delphi позволяет нам создавать свои компоненты и создавать и сохранять в файл формы не стандартные свойства путем перекрытия метода DefineProperties.

Создадим новый компонент

interface

type
  TdecCompileTime = class(TComponent)
  private
    procedure SaveCompTime(Writer: TWriter);
    procedure LoadCompTime(Reader: TReader);
  protected
    procedure DefineProperties(Filer: TFiler); override;
  private
    FCompilationTime: TDateTime;
  public
    property CompilationTime: TDateTime read FCompilationTime;
  end;

implementation

procedure TdecCompileTime.SaveCompTime(Writer: TWriter);
begin
// Получаем время “компиляции” и сохраняем его
  Writer.WriteDate(Now);
end;

procedure TdecCompileTime.LoadCompTime(Reader: TReader);
begin
// Получаем сохраненное время
  FCompilationTime := Reader.ReadDate;
end;

procedure TdecCompileTime.DefineProperties(Filer: TFiler);
begin
  inherited;
  Filer.DefineProperty('CompilTime', LoadCompTime, SaveCompTime,
true);
end;

Регистрируем его, ложем на форму, пишем простенький обработчик OnCreate

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := DateTimeToStr(decCompileTime1.CompilationTime);
end;

и получаем в заголовке наше время. Но вот беда, если мы сохраним форму и перекомпилируем, то после запуска увидим, что время, отображенное в заголовке, не совпадает со временем компиляции. Дело в том, что Delphi в целях оптимизации времени компиляции (наверное) не сохраняет форму заново, и помещает в ресурсы выходного exe-файла имеющийся dfm-файл нашей формы, в котором записано старое время. Как же нам заставить сохранять форму при каждой компиляции?

TForm, владелица нашего компонента имеет свойство Designer, имеющее метод Modified. “When any change is made to a component the property and component editors call this method, allowing the designer to respond to the change” гласит нам все знающий Help. То есть нам достаточно вызвать его после сохранения, и IDE будет считать, что наша форма изменилась, и при следующей компиляции запишет форму заново.

Просто вставить TCustomForm(Owner).Designer.Modified в процедуру SaveCompTime, к сожалению, не удастся. Что бы сие действо возымело эффект, необходимо вызывать этот метод через некоторое время после сохранения. Воспользуемся обыкновенным TTimer.

interface

type
  TdecCompileTime = class(TComponent)
  public
    constructor Create(AOwner: TComponent); override;
  private
    procedure LoadCompTime(Reader: TReader);
    procedure SaveCompTime(Writer: TWriter);
  protected
    procedure DefineProperties(Filer: TFiler); override;
  private
    FTimer: TTimer;
    procedure OnTimer(Sender: TObject);
  private
    FCompilationTime: TDateTime;
  public
    property CompilationTime: TDateTime read FCompilationTime;
  end;

implementation

constructor TdecCompileTime.Create(AOwner: TComponent);
begin
  inherited;
  FTimer := nil;
  if csDesigning in ComponentState then
    begin
      FTimer := TTimer.Create(Self);
      FTimer.OnTimer := Self.OnTimer;
    end;
end;

procedure TdecCompileTime.SaveCompTime(Writer: TWriter);
begin
  Writer.WriteDate(Date + Time);
  if FTimer <> nil then FTimer.Enabled := true;
end;

procedure TdecCompileTime.OnTimer(Sender: TObject);
begin
  if (Owner <> nil) and (Owner is TCustomForm) and
(TCustomForm(Owner).Designer <> nil) then
    TCustomForm(Owner).Designer.Modified;
  FTimer.Enabled := false;
end;

Теперь форма всегда будет записываться в exe-файл с правильным временем компиляции, но лишь при условии, что открыт не только модуль формы, но и сама форма загружена.

Возможно, приведенный способ определения даты и времени компиляции слегка грубоват, но другого способа я не нашел. В приложении вы можете найти сам компонент, а также компонент TdecVersionInfo, слегка расширяющий возможности TdecCompileTime.



К материалу прилагаются файлы:

Автор: Dec
Источник: www.delphikingdom.com

Ссылки по теме
Введение в Delphi 8
Работа с реестром в Delphi
Delphi и ресурсы компьютера
Советы начинающим программировать на Delphi
Структуры и базы данных, методы сортировки
 

Компьютерная документация от А до Я - Главная

 
Популярные книги

Технология программирования на C++. Начальный курс

Подробнее

Photoshop CS2. Настоящий самоучитель

Подробнее

SQL для "чайников", 5-е издание

Подробнее

 

 
Новости ИТ
01.12.2008  Buffalo выпустил миниатюрные USB-накопители
01.12.2008  VENTO TA-U1 - стильный корпус представлен Asus
01.12.2008  Fujitsu-Siemens выпускает в продажу внешний ускоритель для ноутбуков
01.12.2008  Оригинальные чехлы для ноутбуков от Choiix
01.12.2008  Опубликован код драйвера для беспроводных карт Atheros
01.12.2008  Лучший блог 2008
01.12.2008  Linux запустили на Apple iPhone
01.12.2008  LG KC780
01.12.2008  MSI дополнит линейку Wind-нетбуков двумя моделями
01.12.2008  Nikon D3X - 24,5 млн пикселей для профессионалов
01.12.2008  Киловаттник HIPER M1000 с КПД выше 85%
01.12.2008  AMD впервые снизила цены линейки Radeon HD 4800
01.12.2008  Чистильщики: Wise Registry Cleaner v.3.8.2
01.12.2008  Антивирусы: RemoveIT Pro v4 SE (30.11.2008)
01.12.2008  Корпус ASUS Vento TA-U1 можно поставить вместо новогодней ёлки
01.12.2008  Диагностика: PC Wizard 2008 v.1.871
01.12.2008  Диагностика: NextSensor v.2.7.6.0 Build 1130
01.12.2008  Тестовые приложения: PassMark BurnInTest v.6.0 Build 1000 Beta 15
01.12.2008  Неофициальные драйверы для модемов Motorola
01.12.2008  Драйверы и утилиты для сетевых хранилищ D-Link
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100