2015-02-08 6 views
2

Я меняю FormatSettings внутри своего приложения. Предположим, что местная валюта компьютера установлена ​​в $, и я бы хотел использовать € в своем приложении. Я могу изменить его, используя следующий код.Delphi XE5 и FormatSettings

FormatSettings.CurrencyString := '€'; 

Однако, если я перейду в региональные настройки и изменил его там, мои FormatSettings вернутся назад. Я считаю, что должен быть способ сохранить безопасность. Вы знаете какое-либо решение этого?

ответ

6

Вы можете справиться с этим, избегая изменения параметров глобального общего формата, FormatSettings, который устарел уже много лет.

Вместо этого создайте и заполните локальную переменную типа TFormatSettings. Передайте это всем функциям, которые зависят от настроек формата. Изменяется только переменная параметров глобального формата, когда пользователь вносит изменения.

var 
    fs: TFormatSettings; 
.... 
fs := TFormatSettings.Create; 
fs.CurrencyString := '€'; 

Вы можете предпочесть, чтобы сделать эту глобальную переменную, задаваемого при запуске, а затем никогда не изменять, если это действительно не должно измениться.

+0

Мне нужно только сохранить настройки CurrencyString и CurrencyFormat. Остальное должно измениться. Вот почему я не могу убедиться. Я даже могу ждать WM_WININICHANGE, но что, если мне нужно изменить десятичный формат? – blacksun

+0

Вам просто нужно сделать то, что я сказал в ответ –

+0

Когда я создаю fs, он не меняет CurrencyString в моем приложении – blacksun

1

FormatSettings - глобальная переменная. Чтобы иметь конкретную интерпретацию CurrencyString, используйте свою собственную переменную FormatSettings и перегрузки, которые принимают эту переменную во время преобразования.

См. Здесь пример, TFormatSettings.

Чтобы преобразовать валюту в строку, используя вашу специальную переменную FormatSetting и перегруженный CurrToStr функции:

currStr := CurrToStr(Value,MyFormatSettings); // <-- Note the overload 
2

Хорошо здесь является то, что я сделал, чтобы решить мою собственную проблему. То, что я хотел сделать, - просто изменить приложение FormatSettings.CurrencyString и FormatSettings.CurrencyFormat и сохранить их в безопасности. Я могу сделать это легко, но когда я перейду в «Региональные настройки» и «Валюта», мое приложение вернет его обратно. Я нашел 2 решения:

1.Set Application.UpdateFormatSettings := False; Однако вы не получите никаких других изменений. Я имею в виду, что ничего не будет обновлено.

2.Это один решил мою проблему. Просто слушайте WM_WININICHANGE и используйте PostMessage, чтобы поставить собственное собственное обновление. Вы можете найти полный код ниже:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs; 

const 
    CM_CHANGEFORMAT = WM_USER + 101; 

type 
    TForm1 = class(TForm) 
    private 
    { Private declarations } 
    procedure ChangeFormatSettings(var Msg: TMessage); message CM_CHANGEFORMAT; 
    procedure WinIniChange(var Msg: TMessage); message WM_WININICHANGE; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    MyCurrencyString: string = '€'; 
    MyCurrencyFormat: byte = 3; 

implementation 

{$R *.dfm} 

procedure TForm1.ChangeFormatSettings(var Msg: TMessage); 
begin 
    FormatSettings.CurrencyString := MyCurrencyString; 
    FormatSettings.CurrencyFormat := MyCurrencyFormat; 
end; 

procedure TForm1.WinIniChange(var Msg: TMessage); 
begin 
    { 
    You will receive WM_WININICHANGE when you change regional settings. 
    Just use PostMessage to update your own settings because your 
    formatsettings will change after this message. 
    } 
    PostMessage(Self.Handle, CM_CHANGEFORMAT, 0, 0); 
end; 

end. 

Спасибо всем, кто пытался мне помочь. Я ценю это.