喫茶XRAYトップページ

[スレッド全体
]

[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


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