Come ottenere il nome del file sorgente principale da un IOTAProject?
Domanda
Dal momento che almeno D2007 un file di progetto può avere un file di origine principale con nome di base differenti. Le demo DevExpress fanno uso di questo: Ad es v'è un singolo file UnboundListDemo.dpr dpr che serve come la fonte principale per entrambi UnboundListDemoD11.dproj e UnboundListDemoD12.dproj.
Ora, se ho un Project: IOTAProject
poi Project.FileName
restituisce il nome del file dproj. Non riuscivo a trovare un modo "ufficiale" per ottenere il nome del file del dpr. C'è qualche? Si può ottenere da analisi del file dproj (vedi qui ), ma io preferirei un metodo ToolsAPI.
Modifica Mi si avvicinò con questo codice sulla base di di Jon risposta :
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;
dove il ... routine sono da GX_GenericUtils .
Modifica 2: Come creare una di queste situazioni:
- Crea nuova applicazione VCL.
- Salva con nome MyProject.dproj.
- Chiudi progetto in IDE.
- In Esplora risorse, rinominare MyProject.dproj a MyProjectD11.dproj.
- Da ora in poi essere sicuri di aprire MyProjectD11.dproj, non MyProject.dpr!
Soluzione
Se si scorre i redattori nell'istanza IOTAProject, probabilmente troverete il 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;