Pergunta

Uma vez que, pelo menos D2007 um arquivo de projeto pode ter um arquivo de origem principal com diferentes nome base. As demos DevExpress fazer uso deste: Por exemplo há um único arquivo UnboundListDemo.dpr DPR, que serve como a principal fonte para ambos UnboundListDemoD11.dproj e UnboundListDemoD12.dproj.

Agora, se eu tenho um Project: IOTAProject seguida, retorna Project.FileName o nome do arquivo dproj. Eu não poderia encontrar uma maneira "oficial" para obter o nome de arquivo do DPR. Existe alguma? Pode-se obtê-lo de analisar o arquivo dproj (ver aqui ), mas eu prefiro um método ToolsAPI.


Editar: eu vim com este código com base em Jon resposta :

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;

onde o Is ... rotinas são de GX_GenericUtils .


Editar 2: Como criar uma destas situações:

  1. Criar nova aplicação VCL.
  2. Salvar como MyProject.dproj.
  3. Fechar projeto no IDE.
  4. No Windows Explorer, renomear MyProject.dproj para MyProjectD11.dproj.
  5. A partir de agora não se esqueça de MyProjectD11.dproj aberto, não MyProject.dpr!
Foi útil?

Solução

Se você iterate os editores na instância IOTAProject, você provavelmente vai encontrar o Norte.

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top