喫茶XRAYトップページ


[8156] TDateTimePicker で元号表示返信 削除
2014/10/31 (金) 06:50:13 Mr.XRAY
[DateTimePickerの表示を和暦にするには?]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201410/14100021.txt

tor さんがレスの中で書いているリンクのコードを
そのままコピペしてやってみました.

動作確認環境は以下です.
対象フレームワーク .NET Framework 4.0
Windows 7 U64(SP1) + VS Express 2013 Desktop C#

この仕様だったら Delphi でも実現可能ですね.

Delphi の TDateTimePicker は Windows の DateTimpPicker を使用しています.
Windows に DTM_SETFORMAT メッセージで送った書式で日付時刻を表示します.
DTM_SETFORMAT は CommCtrl.pas に定義があります.
表示するコードが Delphi 製だったら簡単だったと思うんですが.

興味がありましたら試してみてください.
EXE を UP しておきます.
図は EXE 起動時の画面です.

http://mrxray.on.coocan.jp/Delphi/zip/DateTimePickerEra_CShape.zip


[8159] Re:TDateTimePicker で元号表示返信 削除
2014/10/31 (金) 19:40:40 igy
DateTimePickerもどきを作成するには?
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201410/14100022.txt

のほうでは、

元号選択式日付時刻入力コンポーネント
http://mrxray.on.coocan.jp/Delphi/plDateEdit/index.htm

を紹介しておきました(笑)。


[8160] Re2:TDateTimePicker で元号表示返信 削除
2014/10/31 (金) 19:58:10 Mr.XRAY
▼ igyさん

> 元号選択式日付時刻入力コンポーネント
> http://mrxray.on.coocan.jp/Delphi/plDateEdit/index.htm
>
> を紹介しておきました(笑)。


ハハハッ.本人は自分で作りたいようですし,
ご希望にかなうかは自信ありません.
昔,カレンダーコンポーネントがあったのですが,今はどうなでしょう.
たしか,TStringGrid から派生して開発されたコンポーネントでした.
私も使っていました.

> カレンダーつけるかもしれませんね・・)

全く予定はありません(キッパリ) !! (^^;


[8161] Re3:TDateTimePicker で元号表示返信 削除
2014/10/31 (金) 21:02:13 igy
▼ Mr.XRAYさん
> 昔,カレンダーコンポーネントがあったのですが,今はどうなでしょう.
> たしか,TStringGrid から派生して開発されたコンポーネントでした.


ツールパレットの[Samples]に TCalendar があるようです。

これを日曜日・祝祭日を赤、土曜日を青で表示するようにして、ボタンつけたりして、
使っています。

> > カレンダーつけるかもしれませんね・・)
>
> 全く予定はありません(キッパリ) !! (^^;


まあ、必要だったら、ユーザーが各々、好みのカレンダーコンポーネントと
組み合わせて使えば、よいですしね(笑)。


[8162] Re4:TDateTimePicker で元号表示返信 削除
2014/10/31 (金) 21:50:20 Mr.XRAY
▼ igyさん

> まあ、必要だったら、ユーザーが各々、好みのカレンダーコンポーネントと

御意!!
この図のやつ,いいじゃないですか.
祝祭日の処理が面倒なんでしたっけ?

それにしてもあの質問の文章,考えさせられました.
参考書はもちろん,ネットの記事,あまり読まないのかなぁ.
OCX だって,検索しても,そんなこと書いてないんだけど...
どこで仕入れた知識なんだろう?

えっ? 私のサイトの記事? そんなぁー


[8163] Re5:TDateTimePicker で元号表示返信 削除
2014/10/31 (金) 22:45:22 igy
▼ Mr.XRAYさん
> 祝祭日の処理が面倒なんでしたっけ?

祝祭日の情報は、DEKOさんのところの

指定した日が祝日かどうかを調べる
http://ht-deko.minim.ne.jp/tech004.html

を使わせてもらえば、あとは、TCalendarを継承し、
DrawCellメソッドをoverrideして、フォントの色を変えればよいだけ
なので、コンポーネント作ったことがある人なら簡単かと。



[8164] Re6:TDateTimePicker で元号表示返信 削除
2014/10/31 (金) 23:10:38 Mr.XRAY
▼ igyさん

> 指定した日が祝日かどうかを調べる
> http://ht-deko.minim.ne.jp/tech004.html
>
> を使わせてもらえば、あとは、TCalendarを継承し、


なるほど,またしても dekoさんの...
う〜む.恐るべし.


[8166] Re7:TDateTimePicker で元号表示返信 削除
2014/11/1 (土) 09:15:43 taki
▼ Mr.XRAYさん
> ▼ igyさん
>
> > 指定した日が祝日かどうかを調べる
> > http://ht-deko.minim.ne.jp/tech004.html
> >
> > を使わせてもらえば、あとは、TCalendarを継承し、
>
> なるほど,またしても dekoさんの...
> う〜む.恐るべし.


国民の祝日についてネットで調べていたら、「山の日」というのが
平成28年から施行されるそうですね。

8月11日 山に親しむ機会を得て、山の恩恵に感謝する。

と、定めてあります。

http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

喫茶XRAYは臨時休業か?


[8167] Re8:TDateTimePicker で元号表示返信 削除
2014/11/1 (土) 23:06:35 Mr.XRAY
> 国民の祝日についてネットで調べていたら、「山の日」というのが
> 平成28年から施行されるそうですね。


そうでしたね.
また,山が混雑するかも.... (^^;
臨時休業にしますか.その日は.ハハハッ


[10316] Re7:TDateTimePicker で元号表示返信 削除
2016/8/19 (金) 00:08:15 igy
▼ Mr.XRAYさん
> ▼ igyさん
>
> > 指定した日が祝日かどうかを調べる
> > http://ht-deko.minim.ne.jp/tech004.html
> >
> > を使わせてもらえば、あとは、TCalendarを継承し、
>
> なるほど,またしても dekoさんの...
> う〜む.恐るべし.


Delphi Tips (Delphi VCL Tips)
http://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1024

に、「山の日」のことを書き込んだら

Nov さん から、「元旦」について書き込みが!

あちらにも書きましたが、
「元旦」としている個所を「元日」に変えたほうがよさそうですね!


[10317] Re8:TDateTimePicker で元号表示返信 削除
2016/8/19 (金) 12:48:41 Mr.XRAY
▼ igyさん

> Nov さん から、「元旦」について書き込みが!
>
> あちらにも書きましたが、
> 「元旦」としている個所を「元日」に変えたほうがよさそうですね!


あら〜,そうだったんですね.
元旦って,元日の別の言い方だっと思っていました.ハハハッ.
情報ありがとうごさいます.
DEKO さんはもう修正しちゃったんですね.早い !!


[8176] Re4:TDateTimePicker で元号表示返信 削除
2014/11/4 (火) 20:42:00 Mr.XRAY
> まあ、必要だったら、ユーザーが各々、好みのカレンダーコンポーネントと
> 組み合わせて使えば、よいですしね(笑)。


igy さんのデザインを利用して作成してみました.
祝祭日の設定はまだやっていません.
後は適当に...

TplDateEdit コンポの継承クラスです.
実行時に生成するテストしかしていません.

http://mrxray.on.coocan.jp/Delphi/zip/plDateEditPicker.zip
(689 KB テストプログラムの EXE 同梱.ソースコード同梱)
(2014年11月10日削除)


[8177] Re5:TDateTimePicker で元号表示返信 削除
2014/11/4 (火) 21:31:47 Mr.XRAY
あうっ,今見たら,元号の文字の右側が少し欠けていますね.
plDateEdit.pas の中を検索して,以下の部分を直してください.
この部分が 元号のコンボボックスの幅を設定しているところです.
本当は,もっと真面目に幅の計算をすればいいんですが...

スミマセンね m(_ _)m

      {$IF CompilerVersion > 14.99}
      if ThemeServices.ThemesEnabled then begin
        TComboBox(Sender).Width := Canvas.TextWidth('0000') + 30; //24
      end else begin
        TComboBox(Sender).Width := Canvas.TextWidth('0000') + 27;
      end;
      {$ELSE}
      TComboBox(Sender).Width := Canvas.TextWidth('0000') + 27;
      {$IFEND}
    end;


[8178] Re5:TDateTimePicker で元号表示返信 削除
2014/11/4 (火) 23:15:09 igy
▼ Mr.XRAYさん
> > まあ、必要だったら、ユーザーが各々、好みのカレンダーコンポーネントと
> > 組み合わせて使えば、よいですしね(笑)。
>
> igy さんのデザインを利用して作成してみました.
> 祝祭日の設定はまだやっていません.
> 後は適当に...


おおっ!さすが!!!
やはりカレンダーがあれば、便利ですからね〜

一方、このスレッドのきっかけを作ったあの方は・・・

MonthCalendarで日付が選択されたかどうかを知るには?
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201411/14110006.txt

日付選択時のイベントを探しているようですね。


私もTMonthCalendar使おうとしたとき、日付選択のイベントとか、わからなかった記憶が・・・

で、TCalendarで、OnChangeイベントでの日付取得や文字の色変更とかカンタンだったので、こちらのほうを
使ってたんですよね。


[8179] Re6:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 06:28:21 Mr.XRAY
皆さんスミマセン.UP したファイルですが,
よく考えてみたら,カレンダーじゃないんですよね.
どちらかと言えば,ピッカーです.
ですので,名前を変更しました.

▼ igyさん

> で、TCalendarで、OnChangeイベントでの日付取得や文字の色変更とかカンタンだったので、こちらのほうを
> 使ってたんですよね。


TCalendar は 純粋の VCL ですから,カスタマイズには向いていると思います.
単独のユニットにもなっていますし.

> 日付選択時のイベントを探しているようですね。

Windows のコモンコントロール類は難しいです.ハイ.
後でレスする予定です.下書きはできていますので...


[8180] Re7:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 07:04:45 Mr.XRAY
> 後でレスする予定です.下書きはできていますので...

質問の内容だけのレスをしましたが,問題はこれだけでは終わらないと思います.
指定の日に対する操作,例えば祝祭日の色を変えたりとか,
結構大変だと思います.
まっ,質問に対するレスなので... (^^;


[8181] Re8:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 15:28:02 Mr.XRAY
毎度のことで,またまたスミマセン.
ボケやってしまいました.

http://mrxray.on.coocan.jp/Delphi/zip/plDateEditPicker.zip
(690 KB テストプログラムの EXE 同梱.ソースコード同梱)
(2014年11月10日削除)

これ,祝祭日の描画等を実装するためには,DrawCell メソッド等が必要です.
修正しました.TCalendar の部分を別クラスにしました.

interface 部です.

  TplDateEditCalendar = class(TCalendar)
  private
    FDateEditPicker : TpldateEditPicker;
  protected
    procedure DrawCell(ACol: Integer; ARow: Integer; ARect: TRect;
      AState: TGridDrawState); override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure Click; override;
    procedure Change; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

実装部は以下です.
このぐらいあればなんとか,いろいろ実装できると思います.
でも,まだボケがあるかも (^^;

{ TplDateEditCalendar }

//-----------------------------------------------------------------------------
//  フォームに表示するTCalenderクラスのcontructor
//-----------------------------------------------------------------------------
constructor TplDateEditCalendar.Create(AOwner: TComponent);
begin
  inherited;
  FDateEditPicker := TplDateEditPicker(AOwner);
end;

//-----------------------------------------------------------------------------
//  フォームに表示するTCalenderクラスのChangeメソッド
//-----------------------------------------------------------------------------
procedure TplDateEditCalendar.Change;
var
  ADate : TDate;
begin
  FDateEditPicker.FlagCanClose := True;
  ADate                := CalendarDate;
  FDateEditPicker.Date := ADate;
  FDateEditPicker.lblDate.Caption := FormatDateTime('YYYY年MM月', ADate);

  inherited;
end;

//-----------------------------------------------------------------------------
//  フォームに表示するTCalenderクラスのClickメソッド
//-----------------------------------------------------------------------------
procedure TplDateEditCalendar.Click;
begin
  inherited;
end;

//-----------------------------------------------------------------------------
//  フォームに表示するTCalenderクラスのKeyDownメソッド
//  矢印キーではKeyPressは発生しない
//  KeyDownの後にClickが発生する
//
//  VK_ESCAPEの時は,元に値に戻すような仕様の方がいいのか?
//-----------------------------------------------------------------------------
procedure TplDateEditCalendar.KeyDown(var Key: Word; Shift: TShiftState);
begin
  if Key = VK_RETURN then begin
    FDateEditPicker.CalendarForm.Close;
  end else
  if Key = VK_ESCAPE then begin
    FDateEditPicker.CalendarForm.Close;
  end else begin
    if Key in [VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN] then begin
      FDateEditPicker.FlagCanClose := False;
    end else begin
      FDateEditPicker.FlagCanClose := True;
    end;
  end;
  inherited;
end;

//-----------------------------------------------------------------------------
//  フォームに表示するTCalenderクラスのDrawCellメソッド
//  ここで日付の文字をTCalendarに描画している
//  このコードがないと,カレンダーのグリッドには何も表示しない
//-----------------------------------------------------------------------------
procedure TplDateEditCalendar.DrawCell(ACol, ARow: Integer; ARect: TRect;
  AState: TGridDrawState);
var
  TheText: string;
begin
  if ACol = 0 then Canvas.Font.Color := clRed;
  if ACol = 6 then Canvas.Font.Color := clBlue;

  TheText := CellText[ACol, ARow];
  with ARect, Canvas do
    TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2,
      Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText);
end;




[8182] Re9:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 18:25:22 igy
▼ Mr.XRAYさん
DrawCellの

>  TheText := CellText[ACol, ARow];
>  with ARect, Canvas do
>    TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2,
>      Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText);


の部分は、

   inherited DrawCell(ACol, ARow, ARect, AState)

としても、OKかもですね。
 

[8183] Re10:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 18:31:28 Mr.XRAY
▼ igyさん

>    inherited DrawCell(ACol, ARow, ARect, AState)
>
> としても、OKかもですね。


あっ,こっちの方がいいですね.余計なコードを見せなくていいし.
というわけで,またまた修正しました.
DEKO さんとこのコードを利用して,
国民の祝日の日を赤い文字で描画するようにもしました.
「山の日」も追加しています.


[8184] Re11:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 19:20:53 taki
▼ Mr.XRAYさん

> DEKO さんとこのコードを利用して,
> 国民の祝日の日を赤い文字で描画するようにもしました.
> 「山の日」も追加しています.


おお!
平成28年の8月から「山の日」ができている。


[8185] Re12:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 20:45:47 Mr.XRAY
▼ takiさん

> おお!
> 平成28年の8月から「山の日」ができている。


ハハハッ.taki さんの書き込みがなかったら,入れてなかったですね.
igy さんのデザインの画像も,なかったら,こんなの作らなかったです.きっと.
何かきっかけになるか分かりませんね.

あっ,そうか.某掲示板のが大元か?
でも,なんか暴走しとるな〜.


[8188] 日付ピッカー付きコンポ,ほぼ完成か?返信 削除
2014/11/6 (木) 20:45:30 Mr.XRAY
細かい修正をしました.
これでだいたい仕様も,こんなもんでしょう?

和暦の時は 99 年までしか入力できないように,
つまり,カレンダーが移動できないようにしました.
過去の歴史から,同じ元号が 100 年以上続いたことはないので,
これでよろしいかと.

http://mrxray.on.coocan.jp/Delphi/zip/plDateEditPicker.zip
(695 KB テストプログラムの EXE 同梱.ソースコード同梱)
(2014年11月10日削除)


[8190] Re:日付ピッカー付きコンポ,ほぼ完成か?返信 削除
2014/11/6 (木) 22:51:56 igy
▼ Mr.XRAYさん

DrawCellの

>  if ACol = 0 then Canvas.Font.Color := clRed;
>  if ACol = 6 then Canvas.Font.Color := clBlue;


は、私も、まったく同じコード、書いているのですが、
TCalendarのStartOfWeekプロパティ変更したら、別の曜日になっちゃうのに気が付きました。
直さなければ・・・・


[8191] Re2:日付ピッカー付きコンポ,ほぼ完成か?返信 削除
2014/11/7 (金) 00:31:52 igy
>  if ACol = 0 then Canvas.Font.Color := clRed;
>  if ACol = 6 then Canvas.Font.Color := clBlue;


ACol を (StartOfWeek + ACol) mod 7
に置き換えればよさそうですね。


[8192] Re3:日付ピッカー付きコンポ,ほぼ完成か?返信 削除
2014/11/7 (金) 13:29:13 Mr.XRAY
>TCalendarのStartOfWeekプロパティ変更したら、別の曜日になっちゃうのに気が付きました。

これ,私も気づきました.
というより,日本でも月曜日から始まるカレンダがあったな.
と,それで追加修正しました.

> ACol を (StartOfWeek + ACol) mod 7
> に置き換えればよさそうですね。


ムムムッ.さすがに igy さん.
私は以下のようにしました (^^;

  if StartOfWeek = 0 then begin
    SundayCol := 0;
  end else begin
    SundayCol := 7 - StartOfWeek;
  end;
  if (ACol = SundayCol) then Canvas.Font.Color := clRed;
  if (ACol = (6 - StartOfWeek)) then Canvas.Font.Color := $00C86615;


[8197] サンプルプログラム集に UP しました返信 削除
2014/11/10 (月) 17:54:56 Mr.XRAY
せっかく作成したので,サンプルプログラム集の方に移動しました.
少しはコンポーネント開発の参考になるかも知れません.
きっと,いや,もしかししたら...

[164_TCalendar を使用した日付ピッカーコンポーネント]
http://mrxray.on.coocan.jp/Delphi/plSamples/164_DatePickerComponent.htm


[8186] Re:TDateTimePicker で元号表示返信 削除
2014/11/5 (水) 23:44:18 Mr.XRAY
さて,日付ピッカーのようなコンポーネントもできたので,
元の TDateTimePicker の話に戻すと,

[日付と時刻の設定] ダイアログ]で [カレンダーの設定の変更] をクリックします.
そのダイアログで,カレンダーの種類を [和暦] にすると,
元号,つまり和暦で表示するようになります.
この設定を Delphi で実行する方法は知りません !!

[日付と時刻の設定] ダイアログは,[日付と時刻] のダイアログで,
[日付と時刻の変更] ボタンをクリックすると現れます
%SystemRoot%\System32\control.exe /name Microsoft.DateAndTime

11月7日 追記
注意 1 : [カレンダーの種類]を和暦にしないと,gg 等の書式を設定しても
       有効になりません.
       和暦に設定しても,YYYY の書式も使用できます.
注意 2 : 上記,全て Windows 7 U64(SP1) + Delphi XE(UP1) Pro で確認済みです.



[8187] Re2:TDateTimePicker で元号表示返信 削除
2014/11/6 (木) 00:12:59 Mr.XRAY
> [日付と時刻の設定] ダイアログは,[日付と時刻] のダイアログで,
> [日付と時刻の変更] ボタンをクリックすると現れます


タスクバーの日付の部分をクリックして現れるダイアログからも表示できます.


[8189] Re3:TDateTimePicker で元号表示返信 削除
2014/11/6 (木) 21:12:34 Mr.XRAY
FormatSettings.ShortDateFormat あるいは LongDateFormat というのがあります.
これは,上の書き込みの,システムの設定は変更できません.
これを設定したアプリ内だけで有効です.
したがって,システムの設定とは関係なく,アプリ側での設定に使用できます.
StrToDate 関数等で,日付を文字列から取得する際に,この設定をしないと,
システムの設定が使用されて,正常に変換できないことがあります.

欧米の多くは,'MM/DD/YYYY が多いのですが,まれに,この設定になって
しまっているコンピュータがあるようです.


procedure TForm1.Button1Click(Sender: TObject);
begin
  FormatSettings.ShortDateFormat := 'YYYY/MM/DD';
  Panel1.Caption := DateToStr(Trunc(Now));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FormatSettings.ShortDateFormat := 'gg ee年 MM月 DD日';
  Panel2.Caption := DateToStr(Trunc(Now));
end;


[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