お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"コントロールパネルの地域設定を無視する"




 
 
 

 コントロールパネルの地域設定がいじられてしまうと、Delphiアプリ中のあらゆる表現形式
が目茶苦茶になってしまいます。例えば、「数値」タブの「小数点の記号」を'#'と
し、「桁区切り記号」を'!'にして

 ShowMessage(Format('%.3n', [123456.789]);

 とすると「123!456#789」と表示されてしまいます(本来は「123,456.789」となって
欲しいにもかかわらず)。

 まっとうな(^^;)人間であれば、小数点をピリオド以外には設定しないはずですが、
もしユーザの気まぐれでこんなことが起こった場合に対応してあげるののは非常に面
倒です。

 SysUtils.DecimalSeparator(やThousandSeparator)を参照すればいいじゃないかと
思うかもしれませんが、これでは駄目です。なぜかというと、例えばアプリが以前に
セーブしたテキストデータはどうなるのでしょうか?以前はピリオドでセーブしてお
いて、今回は#に変更されてしまった場合、セーブデータにもそのときの小数点記号が
なんであったかを記録しておかなければなりません。

 あるいは逆にWindows上の「小数点の記号」がなんであっても、データファイルには
ピリオドでセーブするとした場合、プログラミングの手間が増えすぎてしまいます。

 これを避けるために、Windowsの地域設定を無視して固定的な値を指定します。つま
り、もしユーザが本当に小数点の記号を#に変えたかったとしても、それを不可能に
させます。
 以下の設定は単なる例です。

 注意しなければならないのは「Application.UpdateFormatSettings := False」と
しておかないと、Winの地域設定が変更される度にVCLはその設定を取り込んでしまい
ます(アプリ実行中でも行われてしまいます)。

--------------------------------------------------------------------------
uses Forms, SysUtils;

procedure setMyFormatSettings;
begin
    { アプリ実行中に行われたWinの地域設定の変更を無視する }
    Application.UpdateFormatSettings := false;

    { 以下はあくまでも例です }        { 対応するWin95-OSR2での地域設定表示 }

    CurrencyString    := '\';         { 通貨/通貨記号            = \     }
    CurrencyFormat    := 0;           { 通貨/通貨記号の位置      = ?1.1  }
    NegCurrFormat     := 2;           { 通貨/負の値の表記        = ?-1.1 }

    ThousandSeparator := ',';         { 数値/桁区切り記号        = ,     }
    DecimalSeparator  := '.';         { 数値/小数点の記号        = .     }

    CurrencyDecimals  := 0;           { 通貨/小数点以下の桁数    = 0     }

    DateSeparator     := '/';         { 日付/短い形式/区切り記号 = /     }
    ShortDateFormat   := 'yy/MM/dd';  { 日付/短い形式/短い形式           }
    LongDateFormat    := 'yyyy''年''M''月''d''日''';
                                      { 日付/長い形式/長い形式           }

    TimeSeparator     := ':';         { 時刻/区切り記号          = :     }
    TimeAMString      := '午前';      { 時刻/午前の記号          = 午前  }
    TimePMString      := '午後';      { 時刻/午後の記号          = 午後  }
    ShortTimeFormat   := 'AMPM h:mm'; { 時刻/時間の形式から秒部分を除去
                                        したものらしい                   }
    LongTimeFormat    := 'h:mm:ss';   { 時刻/時間の形式                  }

end;
--------------------------------------------------------------------------

                             98/07/19(日) ytm PAF03212@niftyserve.or.jp
                           

Original document by ytm             氏 ID:(PAF03212)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum