喫茶XRAYトップページ

[スレッド全体
]

[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