Как получить имя основного исходного файла из IOTAProject? - PullRequest
1 голос
/ 08 января 2010

Поскольку по крайней мере 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;

где подпрограммы Is ... взяты из GX_GenericUtils .


Редактировать 2: Как создать одну из следующих ситуаций:

  1. Создание нового приложения VCL.
  2. Сохранить как MyProject.dproj.
  3. Закрыть проект в IDE.
  4. В проводнике Windows переименуйте MyProject.dproj в MyProjectD11.dproj.
  5. Отныне обязательно открывайте MyProjectD11.dproj, не MyProject.dpr!

1 Ответ

3 голосов
/ 08 января 2010

Если вы перебираете редакторы в экземпляре 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;
...