Денис дата публикации 20-07-2005 04:46 Очень часто в окне “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.
К материалу прилагаются файлы:
Обсуждение материала [ 22-04-2014 02:02 ] 6 сообщений |