喫茶XRAYトップページ

[スレッド全体
]

[8193] Re2:TDateTimePicker で元号表示返信 削除
2014/11/7 (金) 13:42:21 Mr.XRAY
> 注意 1 : [カレンダーの種類]を和暦にしないと,gg 等の書式を設定しても
>        有効になりません.


[ロケールを和暦に変更するには?]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201411/14110007.txt

>通りすがり 2014/11/07(金) 12:47:01
>カレンダーの種類、というのはありません。
>カレンダーがどの形式で日付を扱うのか、は、システムの設定に依存します。


何故,こういうことを書かかれてしまうかというと,
質問された方が[カレンダの種類]のことを説明していないからですね.
こういう操作で現れるダイアログの XXXX をプログラムで設定するとか
書けば,レスする人が確認できます.
掲示板を見る人が,全ての用語を知っているわけではありません.

科学技術は「再現性」が重要です.
読む人が,同じことを再現できる操作手順を書くべきたと思っています.
ちなみに,「ロケールを和暦に変更」というのは,意味不明です.
ロケールの何かを変更したいのか,和暦が問題の対象なのか...

# ロケール情報の[カレンダの種類]ですね.


[8194] カレンダの種類の取得と設定返信 削除
2014/11/7 (金) 19:37:03 Mr.XRAY
GetLocaleInfo と SetLocaleInfo で出来るんですね.
知りませんでした.

//=============================================================================
//  カレンダーの種類の取得と設定
//  設定を変更すると日付の表示形式も変わってしまう場合がある
//  実際に使用する時は,元の表示形式を退避して,元に戻す方がいいかも知れない
//-----------------------------------------------------------------------------
//
//  カレンダーの種類を取得
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrText : string;
  Size    : Integer;
begin
  Size := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, nil, 0);
  SetLength(StrText, Size);

  GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, PChar(StrText), Size);

  if StrToInt(StrText) = CAL_JAPAN then begin
    ShowMessage('和暦');
  end else
  if StrToInt(StrText) = CAL_GREGORIAN then begin
    ShowMessage('西暦 (日本語)');
  end else
  if StrToInt(StrText) = CAL_GREGORIAN_US then begin
    ShowMessage('西暦 (英語)');
  end else begin
    ShowMessage('その他の設定');
  end;
end;

//=============================================================================
//  カレンダーの種類を和暦に設定
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  StrText : String;
begin
  StrText := IntToStr(CAL_JAPAN);
  SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, PChar(StrText));
end;

//=============================================================================
//  カレンダーの種類を西暦に設定
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  StrText : String;
begin
  StrText := IntToStr(CAL_GREGORIAN);
  SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, PChar(StrText));
end;



[8195] Re:カレンダの種類の取得と設定返信 削除
2014/11/8 (土) 19:38:46 Mr.XRAY
> GetLocaleInfo と SetLocaleInfo で出来るんですね.

結果の文字列をシステムから取得するには,EnumXXX という列挙用の関数を使用します.
この場合,列挙と言っても 1 つだけですが.


var
  StrKind : String;

//-----------------------------------------------------------------------------
//  EnumCalendarInfo関数のコールバック関数
//  EnumCalendarInfo関数を実行すると自動的に呼び出されて実行される関数
//  このような関数をコールバック関数という
//  目的の情報の取得が終了するまで何回も呼び出される
//  取得するべき情報がなくなるか,Result := 0 にするとEnumCalendarInfo関数の
//  次のコードに実行が移る
//----------------------------------------------------------------------------
function EnumCalendarInfoProc(lpLocaleString: PChar): Integer;
begin
  StrKind := lpLocaleString;
  Result  := 1;
end;

//=============================================================================
//  カレンダーの種類を取得
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrText : string;
  Size    : Integer;
  CAL_ID  : Cardinal;
begin
  StrKind := '';
  Size := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, nil, 0);
  SetLength(StrText, Size);

  GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, PChar(StrText), Size);
  CAL_ID := StrToInt(StrText);

  EnumCalendarInfo(@EnumCalendarInfoProc, LOCALE_USER_DEFAULT, CAL_ID, CAL_SCALNAME);
  MessageBox(Handle, PChar(StrKind), 'カレンダの種類', 0);
end;

[参考]  -- 関数類の MSDN の記事へのリンクあり
[02-01_EnumSystemLocales 関数を使用した入力ロケール一覧]
http://mrxray.on.coocan.jp/Delphi/plSamples/S04_SystemParametersInfo_Interface.htm#02-01



[8196] Re2:カレンダの種類の取得と設定返信 削除
2014/11/9 (日) 01:01:43 Mr.XRAY
上のコードでは,取得する文字列が長い場合を想定しています.
そこで,一度,必要なサイズの計算をしていますが,
実際にはそんなに長い文字列はあまりありません.
その場合は,Char 型の array (長さを限定する方法)でも十分です.

procedure TForm1.Button1Click(Sender: TObject);
var
  Buff   : array[0..MAX_PATH-1] of Char; //(MAX_PATH-1)にする必然性はない
  CAL_ID : Cardinal;
begin
  //初期化
  FillChar(Buff, SizeOf(Buff), #0);

  //非ユニコード版のDelphiでは,最後の引数の値をSizeOf(Buff)にする
  GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, @Buff, Length(Buff));
  CAL_ID := StrToInt(Buff);

  StrKind := '';
  EnumCalendarInfo(@EnumCalendarInfoProc, LOCALE_USER_DEFAULT, CAL_ID, CAL_SCALNAME);
  MessageBox(Handle, PChar(StrKind), 'カレンダの種類', 0);
end;


[8636] Re3:カレンダの種類の取得と設定返信 削除
2015/3/31 (火) 20:39:56 igy
そして、新たに問題が・・・(謎)

win8.1でSetLocaleInfoでエラーを解除するには?
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201503/15030021.txt


[8637] Re4:カレンダの種類の取得と設定返信 削除
2015/3/31 (火) 21:29:06 Mr.XRAY
▼ igyさん

> win8.1でSetLocaleInfoでエラーを解除するには?
> http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201503/15030021.txt


なるほど.確かに謎ですね.
システムの起動時と言っても,どんなタイミングかわかませんが,
元の書き込みのことを考慮すると,そういうことはやらない方がいいような
気がします.
自アプリで必要なことは,自アプリ内で処理し,他のアプリに影響を与える
ような変更はしない方がいいと思うんですけどね.


[8638] Re5:カレンダの種類の取得と設定返信 削除
2015/4/1 (水) 00:12:07 Mr.XRAY
> 自アプリで必要なことは,自アプリ内で処理し,他のアプリに影響を与える
> ような変更はしない方がいいと思うんですけどね.


ただ,今回は,目的を達成するにはそれしかないのでしたっけ?
詳しく読んでないので...


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82