Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi WorkingDirectory festlegen (https://www.delphipraxis.net/139018-workingdirectory-festlegen.html)

Johannes013 21. Aug 2009 21:40


WorkingDirectory festlegen
 
'n abend!

Ich weiß, dass man keine relativen Pfadangaben machen soll.
Aber: Wie kann ich das Arbeitsverzeichnis festlegen?
Ich habe in der DP-Hilfe nach "Arbeitverzeichnis" und "Arbeitverzeichnis festlegen" gesucht und nichts gefunde.

Gute Nacht, Johannes :o

Wolfgang Mix 21. Aug 2009 21:48

Re: WorkingDirectory festlegen
 
Ich mach das so:

Datei/Alles speichern unter/Pfad eigener Wahl

Dann nochmal F9 für die .exe

und fertig

Für den Schlepptop kopiere ich dann noch den Ordner eigener Wahl

Gruß

Wolfgang

DeddyH 21. Aug 2009 21:49

Re: WorkingDirectory festlegen
 
Erzähl doch mal genauer, was Du vorhast. Willst Du ein anderes Programm starten und dafür das Arbeitsverzeichnis festlegen?

jaenicke 21. Aug 2009 21:59

Re: WorkingDirectory festlegen
 
Es gibt die Delphifunktion SetCurrentDir und die API-Funktion SetCurrentDirectory.

Allerdings muss dir klar sein, dass sich das Verzeichnis jederzeit ändern kann, deshalb sind absolute Pfadangaben in 99,99% aller Fälle die einzige wirklich sinnvolle Möglichkeit...

DeddyH 21. Aug 2009 22:03

Re: WorkingDirectory festlegen
 
Und bei ShellExecute gibt es einen Parameter für das Arbeitsverzeichnis, also Belehrungen für später aufheben ;)

jaenicke 21. Aug 2009 22:09

Re: WorkingDirectory festlegen
 
Zitat:

Zitat von Johannes013
Ich weiß, dass man keine relativen Pfadangaben machen soll.

Deshalb habe ich das geschrieben, denn bei ShellExecute oder so hätte das ja nichts (direkt) mit relativen Pfaden zu tun. ;-)
Aber mal schauen worum es eigentlich nun ging. :mrgreen:

DeddyH 21. Aug 2009 22:20

Re: WorkingDirectory festlegen
 
Zitat:

Zitat von jaenicke
Aber mal schauen worum es eigentlich nun ging.

Ja eben, nicht immer diese Schnellschüsse aus der Hüfte. Meckern kann man später immer noch :).

Johannes013 21. Aug 2009 22:27

Re: WorkingDirectory festlegen
 
Nun, ich möchte gerne zu anfangs meines Programms das vielleicht vom Benutzer geänderte Arbeitsverzeichnis festlegen, damit ich in meinem Programm relative Pfadangaben benutzen kann.

ich habe keine Ahnung wie ich einen String mit PChar verbinden kann. Dafür wollte ich das Arbeitverzeichnis festlegen lassen.

Gruß, :)

DeddyH 21. Aug 2009 22:31

Re: WorkingDirectory festlegen
 
Zitat:

Zitat von Johannes013
... damit ich in meinem Programm relative Pfadangaben benutzen kann.

Wozu? Und was meinst Du mit "String mit PChar verbinden"?

Luckie 21. Aug 2009 22:54

Re: WorkingDirectory festlegen
 
Zitat:

Zitat von Johannes013
Nun, ich möchte gerne zu anfangs meines Programms das vielleicht vom Benutzer geänderte Arbeitsverzeichnis festlegen, damit ich in meinem Programm relative Pfadangaben benutzen kann.

Was hat das eine mit dem anderen zu tun?

invalid_operation 21. Aug 2009 23:01

Re: WorkingDirectory festlegen
 
Zitat:

Zitat von Johannes013
Ich weiß, dass man keine relativen Pfadangaben machen soll.

IMHO sollte man keine absoluten Pfadangaben machen :mrgreen:

Anscheinend sind die Fachleute in diesem Thread seltsamerweise anderer Meinung :mrgreen:

Wird man durch die Schweinegrippe denn wirklich sofort ...

DeddyH 21. Aug 2009 23:05

Re: WorkingDirectory festlegen
 
Vielleicht ist Deine Definition von relativen und absoluten Pfadangaben zu unserer einfach nur inkompatibel ;)

invalid_operation 21. Aug 2009 23:12

Re: WorkingDirectory festlegen
 
Zitat:

Zitat von jaenicke
Es gibt die Delphifunktion SetCurrentDir und die API-Funktion SetCurrentDirectory.

Allerdings muss dir klar sein, dass sich das Verzeichnis jederzeit ändern kann, deshalb sind absolute Pfadangaben in 99,99% aller Fälle die einzige wirklich sinnvolle Möglichkeit...

99,99% sind für absolute Pfadangaben garantiert, oder?

Der Rest von uns programmiert für 100-99,99 :mrgreen:

LG und gute Nacht für's heutige Mitlesen :love:

jaenicke 22. Aug 2009 03:17

Re: WorkingDirectory festlegen
 
Zitat:

Zitat von Johannes013
ich habe keine Ahnung wie ich einen String mit PChar verbinden kann.

Wenn du einen PChar brauchst:
Delphi-Quellcode:
PChar(DeinString + DeinPChar)
Und wenn du einen String brauchst, dann einfach nur mit +, dann brauchst du das PChar() nicht.

alzaimar 22. Aug 2009 05:18

Re: WorkingDirectory festlegen
 
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;
...

jaenicke 22. Aug 2009 06:12

Re: WorkingDirectory festlegen
 
Und wenn es fast ganz ohne eigenen Aufwand sein soll:
http://www.delphipraxis.net/internal....php?p=1042717
Die Klasse verwaltet Einstellungen oder andere Daten automatisch, man kann entweder fest festlegen, dass es z.B. das Anwendungsdatenverzeichnis sein soll oder dem Benutzer die Wahl lassen, usw.

Zitat:

Zitat von alzaimar
Absolute Pfadangaben in einer Anwendung sind irgendwie unflexibel.

Mit absoluten Angaben meinte ich natürlich solche, die aus einem Basisverzeichnis wie dem Anwendungsdatenverzeichnis oder bei portablen Anwendungen oder Datenzugriffen dem der Exe und ggf. einem Unterverzeichnis gebildet werden.
Das meinte ich als Abgrenzung gegen den von dir auch genannten impliziten Bezug auf das aktuelle Arbeitsverzeichnis, das ja schon ein simpler Dateidialog ändert, nicht als festen Pfad wie "c:\...".

Johannes013 24. Aug 2009 17:17

Re: WorkingDirectory festlegen
 
Danke, jetzt gehts......... :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz