Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Relativer Pfad & co. (https://www.delphipraxis.net/134658-relativer-pfad-co.html)

Super_Chemiker 26. Mai 2009 15:10


Relativer Pfad & co.
 
Hallo, ich habe schon wieder eine Frage:

Wenn ich das Programm etwas abspeichern lassen will, dann stehe ich vor dem Rätsel, wie ich das mache.
Mein Ordnerbaum sieht ungefähr so aus:
Projektordner(der ist ja dann verschieden, daher das Problem)
--->Saves(hier will ich es abspeichern)

Meine Fragen also:
:?: Gibt es eine Variable, für den Anwendungspfad?
:?: Gibt es eine einfache Möglichkeit, etwas in den Documents Ordner zu speichern. (Wäre meine 2. Wahl, weil man es von dort nicht wegbekommt, wenn man den Anwendungsordner löscht...)

Warum das alles? Ich will eben, dass dieses Programm auf jedem PC läuft(zumindest auf denen mit vista oder XP )

:!: Ich habe bereits gegooglet und co, aber nichts für mich gefunden...

Danke schonmal für eure Hilfe.

mkinzler 26. Mai 2009 15:15

Re: Relativer Pfad & co.
 
Zitat:

Question Gibt es eine Variable, für den Anwendungspfad?
Was verstehst du unter dem Anwendungspfad
Hier im Forum suchenSpecial Folders
Special FoldersSpecial Folders

DeddyH 26. Mai 2009 15:15

Re: Relativer Pfad & co.
 
Den Anwendungspfad bekommst Du mit
Delphi-Quellcode:
ExtractFilePath(ParamStr(0))
, aber es ist u.U. keine gute Idee, dorthin zu speichern. Um den Anwendungsdatenpfad zu ermitteln, kannst Du mal die DP-Suche nach CSIDL_APPDATA bemühen, da sollten sich einige Lösungen finden lassen.

Super_Chemiker 26. Mai 2009 15:20

Re: Relativer Pfad & co.
 
Unter einem Anwendungspfad verstehe ich folgendes:
Der Ort, wo die Anwendung liegt(z.B.: C:\Programme\hier noch ein paar ordner\Codegear\ und so weiter bis \bds.exe)

Phoenix 26. Mai 2009 15:39

Re: Relativer Pfad & co.
 
Genau. Unter ordentlichen Betriebssystemen (Unix, Linuxen, Windows ab Vista, XP eingeschränkt - nur bei Usern ohne Adminrechten) hat eine Anwendung in ihrem Anwendungsverzeichnis keine Rechte um dort irgendwas abzulegen. Das heisst Du solltest Dir lieber nochmal überlegen, für welchen Anwenderkreis diese Daten les- bzw. sogar schreibbar sein sollen und dann das richtige Verzeichnis dafür auswählen, dass Dir das Betriebssystem mit den SpecialFolders auch für die jeweilge Installation korrekt zurückliefert.

Edit: Documents (CSIDL_PERSONAL) wäre im übrigen nur dann richtig, wenn diese Daten nur für den aktuellen Benutzer zugänglich sein sollen. Ein anderer User hat dann seine eigenen Daten. Für alle Benutzer wäre dann CSIDL_COMMON_DOCUMENTS der richtige Ort.

Was das Entfernen angeht: Einfach in das Setup eine Uninstall-Routine einbauen die genau diese Orte auch aufräumt und gut ist.

DeddyH 26. Mai 2009 15:40

Re: Relativer Pfad & co.
 
IIRC heißt die zugehörige Funktion SHGetFolder aus der Unit SHFolders. Schau Dir die mal an.

Fridolin Walther 26. Mai 2009 15:40

Re: Relativer Pfad & co.
 
Ganz ganz dumme Idee dort was abspeichern zu wollen. Nur Administratoren können schreibend auf den Ordner zugreifen. Bedeutet Windowsuser ohne Administrator Rechte (= alle Vistabenutzer mit aktivierter UAC) können Deine Anwendung dann wahrscheinlich gar nicht oder nur sehr eingeschränkt nutzen. Entsprechend benutz lieber einen der dafür vorgesehenen Ordner (Public wenn für alle Nutzer sichtbar, Benutzerordner für die benutzerspezifischen Einstellungen).

Super_Chemiker 26. Mai 2009 15:48

Re: Relativer Pfad & co.
 
Ich habe jetzt den Special Folders Link von mkinzler genutzt und die Sachen eingebaut, bekomme aber dann folgende Exception: (Nachdem ich mit ForceDirectories den Pfad ersetllt habe)
Im Projekt -Hier der Projektname- ist eine Exception der Klasse EFCreateError mit der Meldung 'Datei "C:\Users\-Hier mein Benutzername am PC-\Documents\Saves\EineDatei.txt" kann nicht erstellt werden. Das System kann den angegebenen PFad nich finden' aufgetreten.

DeddyH 26. Mai 2009 15:51

Re: Relativer Pfad & co.
 
Zeig mal Deinen Code.

Super_Chemiker 26. Mai 2009 16:00

Re: Relativer Pfad & co.
 
Delphi-Quellcode:
function TForm1.GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;
Der Teil für die GetSpecialFolder funktion

Delphi-Quellcode:
...
    Game := TStringlist.Create;
    try
      ForceDirectories(GetSpecialFolder(Handle, CSIDL_PERSONAL )+'/Saves');
      Game.LoadFromFile(GetSpecialFolder(Handle, CSIDL_PERSONAL )+'/Saves/'+NameF+'.txt');
...
Hier wird eine Datei geladen, falls sie vorhanden ist und der Pfad wird davor erstellt(wenn ich ForceDirectories vor das try schiebe änderts auch nichts)

Delphi-Quellcode:
...
Game.SaveToFile(GetSpecialFolder(Handle, CSIDL_PERSONAL )+'/Saves/'+NameF+'.txt');
...
Hier kommt dann der Fehler


Und natürlich setze ich Game nachher immer auf .Free


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.
Seite 1 von 2  1 2      

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