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:

  1. Neue VCL-Anwendung.
  2. Speichern unter MyProject.dproj.
  3. Schließen Projekt in IDE.
  4. Sie in Windows Explorer umbenennen MyProject.dproj zu MyProjectD11.dproj.
  5. Von nun an sicher sein MyProjectD11.dproj zu öffnen, nicht MyProject.dpr!
War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top