Cómo obtener el nombre de archivo fuente principal de un IOTAProject?
Pregunta
Desde por lo menos D2007 un archivo de proyecto puede tener un archivo fuente principal con el nombre de base diferentes. Las demostraciones DevExpress hacen uso de este: P. ej hay una sola UnboundListDemo.dpr archivo DPR que sirve como la fuente principal para ambos UnboundListDemoD11.dproj y UnboundListDemoD12.dproj.
Ahora si tengo un Project: IOTAProject
continuación Project.FileName
devuelve el nombre del archivo dproj. No pude encontrar una manera "oficial" para obtener el nombre de archivo del DPR. ¿Hay alguna? Uno puede obtener de analizar el archivo dproj (ver aquí ) pero preferiría un método ToolsAPI.
Editar Se me ocurrió con este código basado en Jon respuesta :
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;
donde las rutinas ES ... son de GX_GenericUtils .
Editar 2: Cómo crear una de estas situaciones:
- Crear nueva aplicación VCL.
- Guardar como MyProject.dproj.
- Cerrar proyecto en el IDE.
- En el explorador de Windows, cambie el nombre MyProject.dproj a MyProjectD11.dproj.
- A partir de ahora, asegúrese de abrir MyProjectD11.dproj, no MyProject.dpr!
Solución
Si iterar los editores en la instancia IOTAProject, probablemente se encontrará la 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;