Wie die Hauptquelldateinamen von einem IOTAProject bekommen?
Frage
Da mindestens D2007 eine Projektdatei kann eine Hauptquelldatei mit unterschiedlichen Basisnamen hat. Die DevExpress Demos nutzen diese: Z. B. gibt es eine einzige dpr Datei UnboundListDemo.dpr, die für beide UnboundListDemoD11.dproj und UnboundListDemoD12.dproj als Hauptquelle dient.
Wenn ich nun eine Project: IOTAProject
dann haben Project.FileName
die dproj Dateinamen zurückgibt. Ich konnte nicht einen „offiziellen“ Weg finden, die dpr Dateinamen zu erhalten. Gibt es irgendwelche? Man kann es bekommen von Parsen der dproj-Datei (siehe hier ), aber ich habe gerne eine ToolsAPI Methode bevorzugen.
Edit: kam ich mit diesem Code auf, basierend auf Jon Antwort :
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;
, wo die Is ... Routinen sind von GX_GenericUtils .
Edit 2: Wie eine dieser Situationen erstellen:
- Neue VCL-Anwendung.
- Speichern unter MyProject.dproj.
- Schließen Projekt in IDE.
- Sie in Windows Explorer umbenennen MyProject.dproj zu MyProjectD11.dproj.
- Von nun an sicher sein MyProjectD11.dproj zu öffnen, nicht MyProject.dpr!
Lösung
Wenn Sie die Redakteure auf der IOTAProject Instanz durchlaufen, werden Sie wahrscheinlich die dpr finden.
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;