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

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

что-то вроде ExtractFilePath(Application.ExeName) [D6, WinXP]


01 ©   (2005-06-07 00:10:00) 

Как узнать путь запущенного проекта в Delphi?
Если его output в другое место нацелен (не туда где сам проект находится)

что-то вроде ExtractFilePath(Application.ExeName)
???


Abessalom   (2005-06-07 01:48:00) [1]

Таким образом:


   for I := 0 to ModSrv.ModuleCount - 1 do
   begin
     Module := ModSrv.Modules[I];
     if Module.QueryInterface(IOTAProjectGroup, PrjGrp) = S_OK then begin
       Project := PrjGrp.GetActiveProject;
        Project.ProjectBuilder.BuildProject(cmOTABuild,False)
       end
     else
       AppendString(Module.FileName, '');
   end;


Abessalom   (2005-06-07 01:46:00) [2]

Да, похоже, необязательно ShellExecute. У Project: IOTAProject есть метод Project.ProjectBuilder.BuildProject() и еще Project.ProjectBuilder.ShouldBuild - наверное, можно разрулить и так.


Abessalom   (2005-06-07 01:40:00) [3]


> Просто Джо ©   (07.06.05 01:23) [13]

Прекрасно. Не знаю, зачем тогде такая постановка вопроса.

Я уже в OTA ушел, в принципе, нетрудно развить:

unit uModEnum;

interface

uses Windows, Forms, Classes, ToolsAPI;

type
 TModWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
   function GetIDString: string;
   function GetName: string;
   function GetState: TWizardState;
   procedure Execute;
   function GetMenuText: string;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterPackageWizard(TModWizard.Create);
end;

procedure TModWizard.Execute;
var
 Project: IOTAProject;
 PrjGrp: IOTAProjectGroup;
 ModSrv: IOTAModuleServices;
 Module: IOTAModule;
 I: Integer;
 S: string;

 procedure AppendString(FileName, FormName: string);
 begin
   if FileName <> '' then
   begin
     S := S + FileName;
     if FormName <> '' then
       S := S + #9'{' + FormName + '}';
     S := S + #13#10;
   end;
 end;

begin
 ModSrv := BorlandIDEServices as IOTAModuleServices;
 if ModSrv.ModuleCount <> 0 then
 begin
 
   for I := 0 to ModSrv.ModuleCount - 1 do
   begin
     Module := ModSrv.Modules[I];
     if Module.QueryInterface(IOTAProjectGroup, PrjGrp) = S_OK then
       Project := PrjGrp.GetActiveProject
     else
       AppendString(Module.FileName, '');
   end;

   Application.MessageBox(PChar(S), 'Открытые модули ', MB_ICONINFORMATION);

   if Assigned(Project) then
   begin
     S := '';
     for I := 0 to Project.GetModuleCount - 1 do
       with Project.GetModule(I) do
         AppendString(FileName, FormName);
     Application.MessageBox(PChar(S), 'Модули активного проекта', MB_ICONINFORMATION);
   end

 end
 else
   Application.MessageBox('Нет открытых файлов', 'Недоразумение!', MB_ICONERROR);
end;

function TModWizard.GetIDString: string;
begin
 Result := 'Modules Sample';
end;

function TModWizard.GetMenuText: string;
begin
 Result := 'Show Me Modules';
end;

function TModWizard.GetName: string;
begin
 Result := 'Modules Sample';
end;

function TModWizard.GetState: TWizardState;
begin
 Result := [wsEnabled]
end;

end.


Модуль нужно включить в состав нового пакета, пакет откомпилировать и установить. В меню хелп клик на 'Show Me Modules'. Дорабатотать по желанию, единственный выход я пока вижу - это вызов ShellExecute для компилятора в заданной очередности. Но, имея стд. средства))) -> это через ж.))

Всем спокойной ночи


Просто Джо   (2005-06-07 01:23:00) [4]


>  Правда я уже забыл есть ли в Д6 такое

Есть.


Abessalom   (2005-06-07 01:21:00) [5]

А правой кнопкой на файле проекта в ProjectManager->BuildSooner не подходит? Правда я уже забыл есть ли в Д6 такое. Вообще, устанавливает порядок компиляции проектов в группе. В Д2005 реализовано более красиво - там есть Dependencies, т.е. проекты можно делать зависимыми от сборки других.


01   (2005-06-07 01:03:00) [6]

Допустим, сборка (output) идет в "C:\111\final\"
проектов ~10. Каждый из них при компиляции бросает в "C:\111\final\config.exe".
А лежит (каждый из проектов) в
C:\111\_projects\01\config.dpr
C:\111\_projects\02\config.dpr
C:\111\_projects\03\config.dpr

библиотек "скинов" тоже ~10.
Лежат они в
C:\111\_faces\01\face.dpr
C:\111\_faces\02\face.dpr
C:\111\_faces\03\face.dpr
И бросают в "C:\111\final\face.dll".

и еще куча всего подобного..

Так вот, мне нужно, чтобы при компиляции "C:\111\_projects\02\config.dpr", например он еще  скомпилил и "C:\111\_faces\02\face.dpr"
то есть, как бы собрался при запуске, в режиме отладки..

поэтому и нужны пути проектов а не exename


Abessalom   (2005-06-07 00:41:00) [7]

Ну, например, путь к фалу проекта и путь к модулям. Будет что-то вроде ..\Modules\ если проект в папке D:\Project, а модули в папке D:\Modules. Если я тебя неправильно понимаю, постарайся объяснить подробнее, что за идея


01   (2005-06-07 00:34:00) [8]

function ExtractRelativePath(const BaseName, DestName: string): string;

Да? а что передавать?

Description

Call ExtractRelativePath to convert a fully qualified path name into a relative path name.  The DestName parameter specifies file name (including path) to be converted.  BaseName is the fully qualified name of the base directory to which the returned path name should be relative. BaseName may or may not include a file name, but it must include the final path delimiter.


Abessalom   (2005-06-07 00:30:00) [9]

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


01   (2005-06-07 00:30:00) [10]


> Из приложения что-ли узнать?)))
> Зачем? Во время разработки, наверное, еще можно


Ну естественно, во время разработки..
И реакция программы будет только если приложение под отладкой..


Abessalom   (2005-06-07 00:28:00) [11]

))) так и есть)))
Из приложения что-ли узнать?)))
Зачем? Во время разработки, наверное, еще можно, но тут подумать надо, как это сделать.


01   (2005-06-07 00:28:00) [12]

А нужно это, поскольку путь к другим модулям зависит от пути к этому проекту. От имени его последней папки.


Abessalom   (2005-06-07 00:26:00) [13]


> alex-drob   (07.06.05 00:22) [2]

А... ну тогда клавиша Win+F или просто F3


01   (2005-06-07 00:23:00) [14]

Нет. Нужно не полный путь exe знать, а полный путь проекта.
например: c:\111\Project1.dpr

поскольку если output другой, то у EXE будет путь, например:
c:\Project1.exe

как узнать путь запущеного проекта?


alex-drob   (2005-06-07 00:22:00) [15]

Ему наверно надо путь к папке в которой project.dpr лежит.


Abessalom   (2005-06-07 00:20:00) [16]

Зачем вопрос задал? Причем тут аутпут, если у тебя есть конкретное имя файла Application.ExeName и независимая от аутпута функция ExtractFilePath? Какие там проблемы? Как написал так и делай.


Наверх

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