Как получить имя основного исходного файла из IOTAProject?

StackOverflow https://stackoverflow.com/questions/2028046

  •  19-09-2019
  •  | 
  •  

Вопрос

Начиная по крайней мере с 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: Как создать одну из этих ситуаций:

  1. Создайте новое приложение VCL.
  2. Сохранить как MyProject.dproj.
  3. Закройте проект в IDE.
  4. В проводнике Windows переименуйте MyProject.dproj в MyProjectD11.dproj.
  5. С этого момента обязательно открывайте 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top