Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: WorkingDirectory festlegen

  Alt 22. Aug 2009, 05:18
Ich verwende ausschließlich relative Pfadangaben in Stringkonstanten, und zwar relativ zu einem benutzerdefinierten Stammverzeichnis. Absolute Pfadangaben in einer Anwendung sind irgendwie unflexibel. Allerdings ist jede Pfadangabe letztendlich ja eine Absolute, auch wenn sie implizit auf einem per SetCurrentDir gesetzten Standardverzeichnis aufbaut.

Auf jeden Fall steht dieses Stammverzeichnis in der Registry oder in einer INI-Datei im Benutzerpfad für Applikationsdaten. Wenn das Zielsystem es erfordert, schmeisse ich die INI-Datei in das Verzeichnis der EXE oder definiere einfach, das das Stammverzeichnis identisch mit dem Verzeichnis der EXE ist. Dann hat der Anwender eben keine Wahl. Ja ja, letzteres soll man ja angeblich nie machen, aber bei embedded Maschinenanwendungen fällt man auf die Schnautze, wenn der Techniker eine neue Flashcard einbaut und nur das Programmvezeichnis gesichtert hat, nicht jedoch die Applikationsdaten bzw. die Registry.

Das Stammverzeichnis und alle anderen Verzeichnisse widerum sind öffentliche Eigenschaften eines Applikationsdatenmoduls. Jede meiner Anwendungen hat mindestens so ein Ding. Dort sind alle Einstellungen und daraus ableitbare Daten enthalten, die das Verhalten und Aussehen meiner Anwendung steuern. Dazu gehören neben den Verzeichnissen auch Optionen, Farben usw. usw.

Ich würde niemals auf die Idee kommen, mit SetCurrentDir zu arbeiten, dafür ist mir mein AppDataModule einfach zu übersichtlich. Ich weiss immer genau, wo meine Daten stehen.

Ein Applikationsdatenmodul könnte so aussehen:
Delphi-Quellcode:
Type
  TAppData = Class
  private
    fStammverzeichnis : String;
  Public
    Procedure Load;
    Constructor Create;
    Function Stammverzeichnis : String;
    Function Datenverzeichnis : String;
  End;

Implementation
Const
  DATENUNTERVERZEICHNIS = 'Daten';

Procedure TAppData.Load;
Begin
  fStammverzeichnis := ExtractFilePath(ParamStr(0));
// Und falls das Stammverzeichnis in einer INI-Datei oder der Registry liegt, lese ich es eben von da aus.
// Und falls das Stammverzeichnis doch knallhart auf 'D:\Programmdaten' gesetzt werden soll (Himmel hilf!), setze ich das eben hier
End;

Constructor TAppData.Create;
Begin
  Load;
End;

Function TAppData.Stammverzeichnis : String;;
Begin
  Result := IncludeTrailingPathDelimiter (fStammverzeichnis);
End;

Function TAppData.Datenverzeichnis : String;
Begin
  Result := IncludeTrailingPathDelimiter (Stammverzeichnis+DATENUNTERVERZEICHNIS);
End;
...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat