[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / Pascal - Delphi /

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

Очень часто в окне “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




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / Pascal - Delphi /

Работа со шрифтами на Win API
06-06-2010   

Сегодня поговорим о шрифтах, и о том, каким образом работать с ними на Win API. Нам потребуется переменная типа HFONT. Изменить стиль шрифта можно у любого компонента, я покажу это на примере кнопки... подробнее

Кол. просмотров: общее - 3777 сегодня - 0

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

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

Кол. просмотров: общее - 3762 сегодня - 1

Работа с мультимедийным таймером на Win API
06-06-2010   

Мы уже знакомы с системным таймером, сегодня познакомимся с мультимедийным, основное отличие которого, более высокая скорость (точность) работы... подробнее

Кол. просмотров: общее - 3881 сегодня - 0

Создание CheckBoxов средствами Win API
06-06-2010   

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

Кол. просмотров: общее - 4018 сегодня - 0

Создание группы RadioButton средствами Win API
06-06-2010   

В прошлый раз мы сделали несколько радио-кнопок, которые автоматически объединялись в одну группу. Сейчас рассмотрим, как создавать несколько независимых групп радио-кнопок... подробнее

Кол. просмотров: общее - 3809 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects