Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows Standard Button-Bezeichner ermitteln (https://www.delphipraxis.net/94021-windows-standard-button-bezeichner-ermitteln.html)

Assertor 14. Jun 2007 21:02


Windows Standard Button-Bezeichner ermitteln
 
Hallo,

gibt es einen Weg die lokalen Windows Button Texte, z.B. für den MessageDlg zu ermitteln?

Ich denke da in Richtung LOCALE_... bzw LC_TYPE.

Es gibt ja auch die LOCALE_SABBREVMONTHNAME usw.

Gruß + Danke im Voraus!
winkel79

Jürgen Thomas 15. Jun 2007 05:55

Re: Windows Standard Button-Bezeichner ermitteln
 
Hallo,

Delphi hat es in eigene Consts-Dateien verpackt: sowohl bei D5 als auch bei D2005 finde ich die Angaben in Source\Vcl\consts.pas bzw. Lib\consts.dcu:
Delphi-Quellcode:
  ButtonNames: array[TMsgDlgBtn] of string = (
    'Yes', 'No', 'OK', 'Cancel', 'Abort', 'Retry', 'Ignore', 'All', 'NoToAll',
    'YesToAll', 'Help');
  ButtonCaptions: array[TMsgDlgBtn] of Pointer = (
    @SMsgDlgYes, @SMsgDlgNo, @SMsgDlgOK, @SMsgDlgCancel, @SMsgDlgAbort,
    @SMsgDlgRetry, @SMsgDlgIgnore, @SMsgDlgAll, @SMsgDlgNoToAll, @SMsgDlgYesToAll,
    @SMsgDlgHelp);
  ModalResults: array[TMsgDlgBtn] of Integer = (
    mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll,
    mrYesToAll, 0);
Windows müsste das natürlich auch irgendwo registriert haben, aber soweit kenne ich mich in "Win-Eingeweiden" nicht aus.

Wenn man "Übersetzungsproblemen" aus dem Weg gehen möchte, sollte man ausschließlich mit ModalResult (bzw. unter NET DialogResult) arbeiten.

Gruß Jürgen

Matze 15. Jun 2007 06:05

Re: Windows Standard Button-Bezeichner ermitteln
 
Eine Alternative zum MessageDlg wäre die Application.MessageBox, denn diese bedient sich der Windows-Funktion MSDN-Library durchsuchenMessageBox und ist somit von der Windows-Sprache abhängig.

Assertor 15. Jun 2007 07:07

Re: Windows Standard Button-Bezeichner ermitteln
 
Hallo Matze und Thomas!

Danke für Eure Antworten. Ich brauche aber wirklich die Windows-Werte, denn ich verwende weder MessageDlg noch MessageBox o.ä.

Es geht um den TaskDialog von TMS. Der liest einfach per Pointer die Werte aus der Consts.pas.

Nun habe ich ein deutsches Delphi, ein Programm mit Übersetzungen per dxGettext und sagen wir mal eine MUI für Vista in Englisch. Was nun passiert:

- Programm mit französischer Sprache gestartet (die Sprache kann jeder User automatisch einstellen = vom System ermitteln, oder aber auch selbst festlegen)
- Im selben Programm zeigt der WinAPI Aufruf der MessageBox zeigt nun englische Buttons mit "OK, Cancel", da das System ja derzeit auf Englisch läuft
- Der TMS TaskDialog zeigt deutsche "Abbrechen, Ja, Nein" Buttons, da TMS ja die Consts.pas auswertet

Das gibt dann diese typischen "Halbübersetzungen"...

Nur, was macht mann da?

Gruß winkel79

Assertor 15. Jun 2007 08:20

Re: Windows Standard Button-Bezeichner ermitteln
 
Hat sich inzwischen erledigt, habe selber einen Buttontranslator geschrieben...

Trotzdem Danke!

Gruß winkel79

Luckie 15. Jun 2007 08:40

Re: Windows Standard Button-Bezeichner ermitteln
 
Wenn du schon hier im Forum fragst, wäre es auch schön, wenn du auch hier deine Lösung veröffentlichst.

Assertor 15. Jun 2007 09:30

Re: Windows Standard Button-Bezeichner ermitteln
 
Hi Luckie,

Zitat:

Zitat von Luckie
Wenn du schon hier im Forum fragst, wäre es auch schön, wenn du auch hier deine Lösung veröffentlichst.

1. Die Antwort:
Wie ich schrieb, geht es ja um den TaskDialog von TMS. Nun habe ich statt der "CommonButtons", die einen Pointer auf die Consts.pas Werte enthalten, einfach alle Buttons per "CustomButtons" zugeweisen. Das ist einfach eine WideStringList.

Bei dieser Zuweisung verwende ich Lars Lösung aus gnugettext mit _('Mein String').

Das läuft, nur leider stelle ich gerade fest, daß der TMS TaskDialog neben vielen anderen Fehlern nicht Thread Safe ist...

[Offtopic]
2. Ob es immer so Sinn macht mit dem Antworten? Ich habe hier etliche Threads, wo an der Frage vorbei oder triviale Lösungen geantwortet werden. Hier z.B. fragte ich, ob jemand weiß, wie ich die Windows Locale für die Button Captions ermittele. Geantwortet wird mit dem WinAPI Aufruf MessageBox oder das die Werte ja in der Consts.pas enthalten sind. :wall:

Das geht doch irgendwie dann drann vorbei... Ich kann das zwar alles hooken, aber dann bekomme ich wieder Probleme mit Unicode Strings.

Und wenn ich mir meine anderen Threads so anschaue: Bei vielen kommt garnichts oder Antworten in obiger Richtung. Es scheint mir auch, daß Threads mit bekannten Namen statistisch schneller und genauer beantwortet werden. Honi soit qui mal y pense. Jetzt könnte man meinen, daß die Fragen vielleicht zu ungenau sind, aber tatsächlich sind die schon ziemlich gezielt. Manchmal reicht doch als Antwort auch "geht nicht bzw. kann man nicht".

Ich bin natürlich trotzdem dankbar für Antworten. Selbst gebe ich ja auch viele (denk mal an gestern, Deine XML Dokumentationsdateien - das war doch auch von mir). Aber z.B. mein OpenSSL Fix für Indy (und OpenSSL und Indy verwenden doch bestimmt einige) wurde bisher 1x runtergeladen. Und das war 1/2 Tag Arbeit...
[/Offtopic]

Gruß winkel79


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