Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как задать имя выходного файла


Автор: Coder 1.10.2007, 08:03
Мне нужно гибко изменять имя выходного файла, в зависимости от компилируемой версии (определяется через $ifdef)
Я проглядел раздел справки Delphi compiler directives (list), но нужной директивы не нашел. Как это сделать другими способами?

Автор: fse 1.10.2007, 09:18
Привет! Я думаю, что никак нельзя сделать.
Имя выходного файла задаётся в *.dof файле проекта.

Там вроде того:
[Directories]
OutputDir=

Я могу посоветовать сделать только отдельную утилитку, которая будет каждую ново-откомпилированную программку сохранять под своим именем.
Это можно сделать, если в фоновой утилитке будет искаться твой exe-файл и смотреться на его версию.
Напиши подробнее, по каким кретериям должно изменяться имя?

Автор: MetalFan 1.10.2007, 10:57
с пом.директивы $E разве что расширение для библиотеки можно указать...
а имя файла равно названию проекта... 

Автор: Coder 1.10.2007, 12:00
fse, слишком накладно.

MetalFan, Ну вот и я тоже так думал. Прийдется так же в ручную переименовывать.

Тема закрыта.


Автор: stab 1.10.2007, 12:35
Coder, если у тебя D2007, там есть Post Build Events, тогда нехитрыми манипуляциями c помощью команд знакомыми нам\мне ещё со времён DOS можно сделать то, что тебе требуется.

Автор: Coder 1.10.2007, 15:40
stab, у меня Delphi 7. Когда до D2007 доберусь - обязательно попробую, спасибо.

Автор: Alexeis 1.10.2007, 23:28
Цитата(fse @  1.10.2007,  09:18 Найти цитируемый пост)
Я могу посоветовать сделать только отдельную утилитку, которая будет каждую ново-откомпилированную программку сохранять под своим именем.

  Зачем же утилитку, можно компонентик. Компонент после бросания на форму может по таймеру че нить делать, причем можно сделать так, что это все будет делаться только в Disign Time, или по разному вести себя. Так как это сделано в KOL. Там в Disign time зеркала многое творят, создают файлы записывают текущие настройки в файлы, так что все очень даже реально безо всяких дополнительных программ.

Автор: fse 2.10.2007, 00:18
Хм, что жsmile
Коль уж углубляться, то предложу вообще экстра-вариант: Написание простенькой утилитки для Delphi, некое расширение. Coder, и вариант совсем не накладный;)
Текст программки:

Код

program ExeStore;

uses
  Windows, SysUtils;

var
  ExeFileName: string;
  NewFileName: string;
  FileExt: string;
  Sufix: string;
begin
  ExeFileName := ParamStr(1);
  if not FileExists(ExeFileName) then
  begin
    MessageBox(0, 'Output file not exists', 'storing', MB_OK);
    Exit;
  end;
  Sufix := ' ' + FormatDateTime('dd.mm.yyyy (hh.mm.ss)', Now);
  FileExt := ExtractFileExt(ExeFileName);
  NewFileName := ExeFileName;
  Insert(Sufix, NewFileName, Length(NewFileName) - Length(FileExt) + 1);
  if not RenameFile(ExeFileName, NewFileName) then
  begin
    MessageBox(0, 'Can''t rename file', 'storing', MB_OK);
    Exit;
  end;
end.


Лезим в среде Tools->Configure tools... Там нажимаем Add и в форме указываем:

Title = Exe storing
Program = путь и имя к скомпилированной программе, например C:\Documents and Settings\Sergey\Desktop\ExeStore\ExeStore.exe
Parameters = $EXENAME()

Теперь что получилось.
Когда пишешь проект, то после компиляции в меню Tools жмакаешь наш Exe storing.
Приведённая программа его переименует в тот же файл, но с суфиксом текущего времени.
Это как пример, а вообще, имя исполняемого файла в проекте утилитке передаётся в параметрах, так что сделать с ним можно что угодно;)

p.s. Кстати, меню Tools даёт возможность создания очень полезных вещей!

Автор: Coder 2.10.2007, 01:20
fse, я немного развил твою идею. Сейчас имя для переименования берется из файла ParamFile.txt лежащего рядом с EXE файлом.
А в этот ParamFile.txt программа сама пишет свое желаемое имя в зависимости от режима:
Код

{$ifdef base}
OutName:='_base';
{$endif}
{$ifdef std}
OutName:='_std';
{$endif}
{$ifdef pro}
OutName:='_professional';
{$endif}


Вот:
Код

program ExeStore;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

var
  ExeFileName: string;
  NewFileName: string;
  FileExt: string;
  Sufix: string;
    ParamFile : string;
  F : TextFile;
begin
  ExeFileName := ParamStr(1);
  if not FileExists(ExeFileName) then
  begin
    Writeln('Output file not exists');
    Readln;
    Exit;
  end;
  // из этого файла читаем имя выходного файла
  ParamFile:=ExtractFilePath(ExeFileName)+'ParamFile.txt';
  if not FileExists(ParamFile) then
    begin
      Writeln('File "',ParamFile,'" not exists');
      readln;
      exit;
    end;
  AssignFile(F,ParamFile);
  Reset(F);
  Readln(F,Sufix);
  CloseFile(F);
//  Sufix := ' ' + FormatDateTime('dd.mm.yyyy (hh.mm.ss)', Now);
  FileExt := ExtractFileExt(ExeFileName);
  NewFileName := ExeFileName;
  Insert(Sufix, NewFileName, Length(NewFileName) - Length(FileExt) + 1);
  if not RenameFile(ExeFileName, NewFileName) then
  begin
    Writeln('Can''t rename file');
    Readln;
    Exit;
  end;
end.


fse,  тебе +1 однозначно!

Добавлено через 5 минут и 49 секунд
сейчас тестирую - штука замечательная! и меню Tools с созможностью писать макросами вообще порадовло!

Автор: fse 2.10.2007, 01:56
Coder, тоже не дурно, а ещё, можно сделать, если удобно будет, вот так:

В главном модуле пишешь такую псевдо-дериктиву, вроде
{ХОЧУ ИМЯ ...}

А макросом сообщаешь утилитке имя главного модуля.
Утилитка открывает для чтения этот сорс и ищет нашу псевдо-дерективу, на подобии Pos('{ХОЧУ ИМЯ', SourceText). А потом вычленяет то имя, которое хотелось бы екзешке.

Можно и в эту сторону подумать smile
п.с. Так по-тихоньку дойдём до полноценного интерпретатора дельфийских сорсовsmile

Автор: Coder 2.10.2007, 03:50
Цитата(fse @  2.10.2007,  09:56 Найти цитируемый пост)
В главном модуле пишешь такую псевдо-дериктиву, вроде{ХОЧУ ИМЯ ...}

Да, но тогда прийдется каждый раз это имя заново прописывать.

Я думаю сделать так:

Создать что-то на подобии Alias файлов для имен EXE.
В файле проекта DPR вводим свои директивы для ExeStore:
Код

{EXESTORE
base
std*
pro
}

* - указывает текущую версию. т.е. для изменения выходного имени всего лишь нужно переместить звезду.

У ExeStore есть база соответствия версий и названий (Aliases.ini):
Код

[base]
exename='_base.exe'
[std]
exename='_std.exe'
[pro]
exename='_professional.exe'

Такой файл может быть у каждого проекта свой.

Запускаем ExeStore c именем DPR и $EXENAME()

Автор: fse 2.10.2007, 06:27
Хм, вполне рабоче!

Добавлено через 5 минут
Borland что-то не дадумалась! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)