![]() |
AW: Application Path
Zitat:
Auch die "Art" des Aufrufs/Starts des Programms ist entscheidend. Im Prinzip kann einem das bei vielen (Fremd)Komponenten/-Codes passieren, welche mit Zugriffen auf die Festplatte arbeiten. Grundsätzlich muß sollte man so sowieso immer davon ausgehen, daß "externe" Einstellung/Daten nicht als gegeben/konstant angesehen werden können. |
AW: Application Path
hmm, irgendwie beisst sich die Katze doch in den eigenen Schwanz. Entweder verzichtet man auf die Verwendung des "hardkodierten Pfades" und kann das Programm ueberhaupt nicht mehr Verschieben nach der Installation, oder man verwendet Sie mit der Gefahr dass sich der Wert der Variablen aendert. Letzteres impliziert dass man jedes Mal oben angesprochene Sicherheitsabfragen durchfuehren muss und gegebenenfalls darauf angewiesen ist den gesammten Verzeichnisbaum des Laufwerks zu durchsuchen.
Es ist Aufgabe von Embacedero sicherzustellen dass diese Funktion macht was Sie machen soll. Ehrlichgesagt sollte es simpel sein das Verzeichnis bei Ausfuehren des Programms so zu speichern dass der Wert durch andere Operationen nicht veraendert wird. Klingt eher wie ein Major Bug in Delphi. |
AW: Application Path
Nein.
relative Pfade sind böse und hardcodierte Pfade genauso (vorwie aus dem Grund, weil es bescheuerte Programmierer gab, welche Pfade hardcodierten, spricht das Verzeichnissystem nun englisch und der Benutzer sieht aber was Anderes) Man fragt Windows nach den benötigten Verzeichnissen und verwendet diese für die Zugriffe mit den resulierenden absoluten Pfaden. Es ist nicht die aufgabe von Embarcadero. Ganz im Gegenteil. Das ist ein normales Verhalten seitens des Betriebssystems. Vorallem das Verhalten, daß bei Programmstart das Arbeitsverzeichnis nicht dem Programmverzeichnis entsprechen muß. |
AW: Application Path
Zitat:
Aber: Zitat:
Im Endeffekt bin ich nur faul und würde gerne wissen, ob ich weiterhin ruhig schlafen kann oder die Sache doch möglichst bald angehen sollte: Bislang habe hole mir oft dynamisch das Arbeitsverzeichnis (ohne es je selbst zu ändern) und bastele mir damit dann eine absolute Pfadangabe zusammen. Wenn mir nun irgendetwas ohne mein Wissen das Arbeitsverzeichnis ändert ist das natürlich nicht nett :pale: |
AW: Application Path
Zitat:
Der Fehler liegt nicht in Delphi oder bei Embarcadero, wenn diese Funktionen falsch benutzt werden... // EDIT: Zitat:
Da gibt es einige Möglichkeiten. Zitat:
|
Zusammenfassung
Da bei einigen offenbar rege Begriffsverwirrung herrscht, möchte ich das bisher Gesagte noch einmal zusammenfassen:
Das Anwendungsverzeichnis ändert sich nicht, während das Programm läuft:
Delphi-Quellcode:
Das Arbeitsverzeichnis kann sich während des Programmlaufs jedoch ändern, z.B. durch einen Aufruf von OpenDialg oder SaveDialog:
Anwendungsverzeichnis := SysUtils.ExtractFilePath(System.ParamStr(0));
Anwendungsverzeichnis := SysUtils.ExtractFilePath(Forms.Application.ExeName);
Delphi-Quellcode:
Wenn ich im Programm ein festes Verzeichnis benötige, das sich nicht ändern soll, dann lege ich dieses Verzeichnsi beim Programmstart fest, z.B. den Ort, an dem die benötigte Firebird-Datenbank zu finden ist:Arbeitsverzeichnis := SysUtils.GetCurrentDir;
Delphi-Quellcode:
Diesen Speicherort ermittle ich entweder durch einen OpenDialog oder lege ihn in einer Ini-Datei fest (das kann auch ein einfaches Ascii-File mit nur einer Zeile sein). Diese Ini-Datei speichere ich nur dann im Anwendungsverzeichnis, wenn
Const
DB_Datei = 'MeineDatenbank.FDB'; Var DB_DateiName, DB_DateiPfad : String; 1. sie nicht vom Programm verändert zurückgeschrieben werden soll und/oder 2. es sich um eine portable Anwendung handelt, die sich nicht in einem der Windows-Systemordner befindet. Ansonsten speichert man Ini-Dateien (und andere, die man benötigt) im Benutzer-Verzeichns, und zwar bei: WinXP entweder unter \AllUsers\Anwendungsdaten oder \[CurrentUser]\Anwendungsdaten Win7 entweder unter \Users\Public\Documents\MeineAnwendungsDaten\ oder entsprechend unter \Users\[CurrentUser]\ Win 8 weiß ich nicht, hab ich nicht ... Oder man setzt entsprechende Registry-Einträge und erfährt dann aus der Registry alle notwendigen festen Verzeichnisse. |
AW: Application Path
WIN 8:
Delphi-Quellcode:
Hinweis:
uses
ActiveX, ShlObj; function SpecialDirectory(const iID: Integer): string; var aPath : array[0..MAX_PATH] of Char; pilTemp: PItemIDList; begin try if SHGetSpecialFolderLocation(0, iID, pilTemp)=S_OK then begin if SHGetPathFromIDList(pilTemp, aPath) then begin Result := string(aPath); end else Result := ''; CoTaskMemFree(pilTemp); end else Result := ''; except Result := ''; end; end; function GetConfigPath: String; var AppDir: String; begin AppDir := SpecialDirectory(CSIDL_APPDATA)+'\ProgName'; if DirectoryExists(AppDir) = false then mkdir(AppDir); result := AppDir+'\'; end; //ergibt: C:\Users\HATHOR\AppData\Roaming\ProgName\ Über den WIN8-Explorer kommt man nur hin, wenn man C:\Users\HATHOR\AppData\Roaming\ProgName\ direkt in die Adresszeile eingibt. Alternativ: Im Explorer - Ansicht - Häkchen bei Ausgeblendete Elemente |
AW: Application Path
Und davor (rausgeschnibbelt aus einer größeren Unit)
Delphi-Quellcode:
So, und wer jetzt seine INI ins Programmverzeichnis schmeißt, wird geteert und gefeedert (mit Doppel-E!). :mrgreen:
unit SettingsPaths;
interface Function LocalUserFilesPath: String; Function LocalAppDataPath(AppName: String): String; Function AppDataPath(AppName: String): String; implementation Uses sysutils,windows,ShlObj, ActiveX; Function GetSpecialFolderLocation(csidl: integer): String; Var pMalloc: IMalloc; pidl: PItemIDList; path: Array[0..MAX_PATH] Of Char; Begin Result := '?'; If SHGetMalloc(pMalloc) = S_OK Then Begin SHGetSpecialFolderLocation(0, csidl, pidl); SHGetPathFromIDList(pidl, path); Result := IncludeTrailingPathDelimiter(Path); pMalloc.Free(pidl); End; End; Function LocalUserFilesPath: String; Begin Result := IncludeTrailingPathDelimiter(GetSpecialFolderLocation(CSIDL_PERSONAL)); End; Function LocalAppDataPath(AppName: String): String; Begin Result := IncludeTrailingPathDelimiter(GetSpecialFolderLocation(CSIDL_LOCAL_APPDATA)); Result := IncludeTrailingPathDelimiter(Result + AppName); ForceDirectories(Result) End; Function AppDataPath(AppName: String): String; Begin Result := IncludeTrailingPathDelimiter(GetSpecialFolderLocation(CSIDL_APPDATA)); Result := IncludeTrailingPathDelimiter(Result + AppName); ForceDirectories(Result) End; end. |
AW: Application Path
![]() Zitat:
![]() Zitat:
![]() Zitat:
![]() Einziger Haken: Zitat:
|
AW: Application Path
Oh, nie drauf geachtet.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz