Delphi-PRAXiS

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

DeddyH 26. Mai 2009 16:04

Re: Relativer Pfad & co.
 
Was sollen die Slashes denn da?

Super_Chemiker 26. Mai 2009 16:07

Re: Relativer Pfad & co.
 
Damit ein neuer Ordner/eine neue Datei erzeugt wird und nicht sowas:
dokumentesaves

EDIT: sind die etwa falsch?

Matze 26. Mai 2009 16:08

Re: Relativer Pfad & co.
 
Eine Ordnerstruktur kannst du mit Delphi-Referenz durchsuchenForceDirectories vor dem Speichern der Datei anlegen.

Edit: Aber das hast du je bereits oben geschrieben, sehe ich gerade. :stupid:
In Windows solltest du jedoch Backslashes "\" nutzen.

Phoenix 26. Mai 2009 16:11

Re: Relativer Pfad & co.
 
Zitat:

Zitat von Super_Chemiker
EDIT: sind die etwa falsch?

Ja. Ein Pfad in Windows sieht so aus: Laufwerk:\Folder\Folder und nicht Laufwerk:/Folder/Folder

Super_Chemiker 27. Mai 2009 13:39

Re: Relativer Pfad & co.
 
Wenn ich jetzt alle falschen / durch \ austausche ändert das aber gar nichts... !?

Prototypjack 27. Mai 2009 13:43

Re: Relativer Pfad & co.
 
Moin,

Überprüfe mal den zusammengesetzten Pfad (lade ihn in einen String und schau dann im Debugger, oder lass ihn dir per ShowMessage(); etc. ausgeben). Wenn der richtig ist, muss der Fehler woanders liegen, soweit ich das hier sehe. Bist du dir sicher, dass die (wahrscheinlich selbst implementierten) Load/Save Funktionen richtig arbeiten und prüfen?

Grüße,
Max

Edit: Blödsinn, Game ist ja eine Stringlist. Der Pfad ist vermutlich falsch, beziehungsweise einfach nicht vorhanden.

Super_Chemiker 27. Mai 2009 13:48

Re: Relativer Pfad & co.
 
Ach gott!
Danke für eure Hilfe... den Fehler konntet ihr nicht sehen... Das ForceDirectories war in einem else Abteil und wurde deswegen bei meinen Testläufen nicht aktiviert..
Bitte entschuldigt meine Dummheit. :dp:

BUG 27. Mai 2009 14:00

Re: Relativer Pfad & co.
 
// leicht OT

Zitat:

Zitat von Matze
Edit: Aber das hast du je bereits oben geschrieben, sehe ich gerade. :stupid:
In Windows solltest du jedoch Backslashes "\" nutzen.

Ein Slash ist aber auch erlaubt:
Zitat:

whereas Win32 operating systems support both the backslash (\) and the forward slash (/)

In dem Zusammenhang interessant: Why is the DOS path character "\"?


MfG,
Bug


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 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