Como obter o nome do arquivo fonte principal de uma IOTAProject?
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:
- Criar nova aplicação VCL.
- Salvar como MyProject.dproj.
- Fechar projeto no IDE.
- No Windows Explorer, renomear MyProject.dproj para MyProjectD11.dproj.
- A partir de agora não se esqueça de MyProjectD11.dproj aberto, não MyProject.dpr!
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;