AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi wie Localized Pathname auslesen?
Thema durchsuchen
Ansicht
Themen-Optionen

wie Localized Pathname auslesen?

Ein Thema von himitsu · begonnen am 24. Aug 2009 · letzter Beitrag vom 24. Aug 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#11

Re: wie Localized Pathname auslesen?

  Alt 24. Aug 2009, 17:07
erstmal runterladen ... bin schon den ganzen Tag nur mit GPRS unterwegs und selbst das noch nichtmal "schnell"

schlimm wird es nur, da man auch Dateinamen lokalisieren kann und nicht nur Verzeichnisnamen.

alleine für den Verzeichnisnamen ergibt das bei meiner eigenen Implementierung eine etwa 30-zeilige Funktion und das Selbe würde bestimmt nochmal für die lokalisierten Dateinamen entstehen.

[add]
was man so findet
www.theJvDirectory.com
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#12

Re: wie Localized Pathname auslesen?

  Alt 24. Aug 2009, 17:48
so, hier erstmal meine Methode: sie ließt den lokalisierten Namen eines Verzeichnisses aus

und sie scheint auch zu funktionieren
(ich hoffe aber, daß hier jetzt auch immernoch alles geht, nachdem ich mein UTF8 nach String geändert hab
und die Version im SSF zeigt auch "defekte" Namen an, wärend diese hier nach Windowsstandard nur korrekte Angaben liefert)

Delphi-Quellcode:
Function ReadIniString(Const FileName, Section, Ident: String): String;
  Var H: THandle;
    S, S2: String;
    i, i2: Integer;

  Begin
    Result := '';
    SetLength(S, 1016);
    SetLength(S, GetPrivateProfileString(PChar(Section), PChar(Ident),
      nil, PChar(S), Length(S) + 1, PChar(FileName)));
    i := Pos(',', S);
    If (S <> '') Then Begin
      If (S[1] = '@') and (i > 0) and TryStrToInt(Copy(S, i + 1, 99), i2) and (i2 < 0) Then Begin
        S := Copy(S, 2, i - 2);
        SetLength(S2, 1016);
        SetLength(S2, ExpandEnvironmentStrings(PChar(S), PChar(S2), Length(S2) + 1) - 1);
        H := GetModuleHandle(PChar(S2));
        If H = 0 Then Begin
          H := LoadLibraryEx(PChar(S2), 0, LOAD_LIBRARY_AS_DATAFILE);
          i := 0;
        End;
        If H <> 0 Then Begin
          S := '';
          SetLength(Result, 1016);
          SetLength(Result, LoadString(H, -i2, PChar(Result), Length(Result) + 1));
          If i = 0 Then FreeLibrary(H);
        End;
      End;
    End;
  End;



// Achtung Pseudocode-Variablen:
If Directory.Attributes and (FILE_ATTRIBUTE_READONLY or FILE_ATTRIBUTE_SYSTEM) <> 0 Then
  LocalizedName := ReadIniString(Directory + '\Desktop.ini', '.ShellClassInfo', 'LocalizedResourceName');
soooo, jetzt müßte gleich das JVCL geladen sein und dann mal sehn, ob ich da was Schöneres finde
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#13

Re: wie Localized Pathname auslesen?

  Alt 24. Aug 2009, 19:09
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 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