So, in der JCL befindet sich eine Funktion Namens JclFileUtils.PathGetLocalizedPath
und ihre Umkehrfunktion JclFileUtils.PathGetPhysicalPath.
Diese können gleich einen ganzen relativen (glaub sich zumindestens) oder absoluten Pfad übersetzen können,
also in/von
- Anzeigepfad, so wie er z.B. im Explorer angezeigt wird
- physischen Pfad, so wie er für den ganzen Dateifunktionen benötigt wird
TOpenDialog zeigt auch den Anzeigepfad an, liefert aber als Ergebnis den physischen Pfad.
Da diese Funktionen aber 1. den Pfad parsen, versuchen in einzelne Dateien/Verzeichnisse zu zerlegen
und dann 2. jeden Ordner einzeln umwandeln und dann auch noch 3. recht "umständlich" über z.B. mit folgenen Funktionen arbeiten:
IShellFolder.ParseDisplayName
IShellFolder.BindToObject
IShellFolder.EnumObjects
IShellFolder.GetDisplayNameOf
Belasse ich es in meinem Fall bei meiner Variante, welche allerdings nur einen Pfadnamen (ohne direkt Pfadangabe, also mit getrenntem Elternverzeichnis) umwandeln kann, da dieses für meinen Fall optimaler scheint.
Ich könnte zwar auch den einzelnen Pfadnamen über diese oben genannten Funktionen oder auch direkt über die Funktionalitäten von IShellFolder umwandeln, aber ich glaub optimaler wird es so nicht unbedingt.
PS: um eure User nicht mit "komischen" Pfadnamen zu verwirren, empfehle ich, wenn ihr vor Anzeige eines Pfades (z.B. in einem Label oder Edit) diesen in den Lokalisierten Namen umwandelt.
Nicht daß er sich Wundert, daß euer Programm C:\Users\... anzeigt, aber er nur C:\Benutzer\... bei sich findet.
Dabei sollten diese Funktionen bis zu
Win9x hinunter funktionieren, auch wenn sie da recht selten einen lokalisierten Namen vorfinden, was ja aber egal ist.
und sorry für den Mehrfachpost, aber es sind ja auch getrennte Dinge