Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Einstellungen für TOpenDialog und TSaveDialog (VCL)


UweK - Fr 05.01.24 11:10
Titel: Einstellungen für TOpenDialog und TSaveDialog (VCL)
Guten Tag,

Gibt es eine Möglichkeit, bei TOpenDialog und TSaveDialog die folgenden Funktionen zu realisieren? Falls nicht, müsste ich mir selbst äußerlich und funktionell gleiche Versionen davon schreiben, die das zusätzlich können. Das macht natürlich Arbeit.

- Für jedes Anzeigen soll die Sprache einstellbar sein. Mein Programm ist zur Laufzeit zwischen deutsch und englisch umschaltbar. TOpenDialog und TSaveDialog sind in meiner deutschen Installation von Delphi XE6 immer deutsch.
- Der Benutzer soll nur ein voreingestelltes Verzeichnis "T***Dialog.InitialDir" und Unterverzeichnisse davon erreichen können, aber soll nicht weiter hoch in die Verzeichnisstruktur gehen können.

Für Tipps bin ich dankbar.
Gruß Uwe


jaenicke - Fr 05.01.24 15:05

Es gibt mittlerweile (seit Delphi 2009) den TFileOpenDialog, der auch ein Event OnFolderChanging hat. Dort kannst du mit CanChange steuern, ob der Wechsel erlaubt sein soll. Mehr dazu findest du hier: TFileOpenDialog [https://en.delphipraxis.net/topic/10399-open-dialog]

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconTh69: URL-Titel hinzugefügt


UweK - Do 22.02.24 15:37

Hallo jaenicke,

Vielen Dank. Für das Sperren des Verzeichnisses ist das die Lösung.

Bleibt noch das Problem mit dem Umschalten der Sprache zur Laufzeit. Nach ergiebigem Googeln sieht es für mich so aus, dass da gar kein direkter Weg vorgesehen ist. Diese Notlösung habe ich gefunden, wo alle Komponenten der Reihe nach angeschaut und gezielt verändert werden: Sprache umstellen (zB auf Englisch) [https://www.tutorials.de/threads/sprache-umstellen-zb-auf-englisch.308678]

So etwas habe ich jetzt auch probiert. Mit einem meiner eigenen Programme funktioniert das auch:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
MyForm: TForm

...

with MyForm do
  for I:= 0 to ComponentCount - 1 do
    if Components[I] is TBitBtn then
      (Components[I] as TBitBtn).Caption:= 'Test';


Probiere ich dasselbe aber mit dem Dialog:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
MyDialog: TFileOpenDialog

...

with MyDialog do
  for I:= 0 to ComponentCount - 1 do
...

scheitert die Sache schon daran, dass "ComponentCount = 0" geliefert wird. Was ist hier anders?

Gruß Uwe

Moderiert von user profile iconTh69: URL-Titel hinzugefügt


Th69 - Do 22.02.24 16:13

Dies sind Windows-Dialoge, und daher werden diese in der aktuellen Sprache angezeigt. Es gibt daher auch keine VCL-Unterkomponenten.

Probiere aber mal SetThreadUILanguage [https://learn.microsoft.com/de-de/windows/win32/api/winnls/nf-winnls-setthreaduilanguage] (dies habe ich von Localization for Common Dialogs in Winform [https://www.codeproject.com/Tips/1180093/Localization-for-Common-Dialogs-in-Winform]).
Laut [MS-LCID]: Windows Language Code Identifier (LCID) Reference [https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-LCID/%5bMS-LCID%5d.pdf] (Kapitel 2.2 LCID Structure) sollte man für die LangId folgende Werte benutzen:

Der Anwender deines Programms muß aber wohl beide Windows-Sprachpakete installiert haben.