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:

  1. Crear nueva aplicación VCL.
  2. Guardar como MyProject.dproj.
  3. Cerrar proyecto en el IDE.
  4. En el explorador de Windows, cambie el nombre MyProject.dproj a MyProjectD11.dproj.
  5. A partir de ahora, asegúrese de abrir MyProjectD11.dproj, no MyProject.dpr!
¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top