Как получить имя основного исходного файла из IOTAProject?
Вопрос
Начиная по крайней мере с D2007, файл проекта может иметь основной исходный файл с другим базовым именем.Демо-версии DevExpress используют это:Например.существует единственный файл dpr UnboundListDemo.dpr, который служит основным источником как для UnboundListDemoD11.dproj, так и для UnboundListDemoD12.dproj.
Теперь, если у меня есть Project: IOTAProject
тогда Project.FileName
возвращает имя файла dproj.Я не смог найти "официальный" способ получить имя файла dpr.Есть ли они вообще?Это можно получить, проанализировав файл dproj (см. здесь) но я бы предпочел метод ToolsAPI.
Редактировать: Я придумал этот код, основанный на Ответ Джона:
function IsProjectSource(const FileName: string): Boolean;
begin
Result := IsDpr(FileName) or IsBpr(FileName) or IsPackage(FileName);
end;
function GxOtaGetProjectFileName2(Project: IOTAProject; NormalizeBdsProj: Boolean = False): string;
var
i: Integer;
Module: IOTAModule;
Editor: IOTAEditor;
begin
Result := '';
if Assigned(Project) then begin
Result := Project.FileName;
if NormalizeBdsProj and IsBdsprojOrDproj(Result) then begin
Module := Project as IOTAModule;
for i := 0 to Module.ModuleFileCount - 1 do
begin
Editor := Module.ModuleFileEditors[i];
if IsProjectSource(Editor.FileName) then begin
Result := Editor.FileName;
Exit;
end;
end;
end;
end;
end;
где находится...подпрограммы взяты из GX_GenericUtils - Общие файлы.
Правка 2: Как создать одну из этих ситуаций:
- Создайте новое приложение VCL.
- Сохранить как MyProject.dproj.
- Закройте проект в IDE.
- В проводнике Windows переименуйте MyProject.dproj в MyProjectD11.dproj.
- С этого момента обязательно открывайте MyProjectD11.dproj, не Мой проект.днр!
Решение
Если вы выполните итерацию редакторов в экземпляре IOTAProject, вы, вероятно, найдете dpr.
var
Module: IOTAModule;
Project: IOTAProject;
Editor: IOTAEditor;
begin
// Set Project Here....
Module := Project as IOTAModule;
for I := 0 to Module.ModuleFileCount - 1 do
begin
Editor := Module.ModuleFileEditors[I];
end;
end;