ピンポ〜ン、明けおめ…(MonthCalendarExコンポ)


忘れて…  2009-01-01 18:37:37  No: 32994

≪カイトのマンション≫
桜  :「明けましておめでとう、カイト、ピザ買ってきたけど食べる?」
海都:「あ、サクラ、おめでとう、…ピザ? サンキュ、鍵は開いてるから入って」
桜  :「外はイイお天気よ、ちょっと寒いけど…、お正月なのにパソコンで何してるの?」
海都:「年末までズット仕事忙しくてヒマがなくて…、で、久しぶりに自分のコト」
桜  :「あ…、このグラデーションのカレンダー、アタシの友達も使ってたよ」
海都:「えっ? 前に作ったのをオレのWEBページにUPしておいたんだけど、サクラにも教えてなかったよね? 検索で見つけたのかな?」
桜  :「そうみたい、やっぱりカイトだったのね、サイトのURL見て、もしかしたらって思ったけど」
海都:「でも、それはメモリーリークのバグもあったし、まだ祝日の設定も無くて未完成だったから、手直しをしてたんだ」
桜  :「だけど、祝日って、年ごとに日がズレたりして、ちょっと面倒じゃない?」
海都:「そうなんだ、祝日法が何度も改正されてるから、過去の祝日を正しくするのはかなり大変だったよ」
桜  :「春分の日、秋分の日もズレることあるよね? それは大丈夫?」
海都:「2000年からの百年間はキチンと計算してるけど、それ以外は今のところ3月21日、9月23日に固定、天文には詳しくないんで^^;」
桜  :「それでも、1998年と1999年は大丈夫ね」
海都:「あと、日付けにチェックマークを重ねることも出来るよ、こんなカンジで」

procedure TForm1.FormCreate(Sender: TObject);
begin
  with MonthCalendarEx1 do begin
   Colors.MarkDayColor := clFuchsia; // マーク日(太字)のデフォルト色
   MarkDays.Add(2009,4,29);          // 年を指定すると、その年だけ
   MarkDays.Add(2009,4,30);          // (2009年のゴールデンウィーク連休をマーク)
   MarkDays.Add(2009,5,01);
   MarkDays.Add(2009,5,02);
   MarkDays.Add(2009,5,03);
   MarkDays.Add(2009,5,04);
   MarkDays.Add(2009,5,05);
   MarkDays.Add(2009,5,06);
   MarkDays.Add(3,3);                // 年を指定しないと、毎年恒例
   MarkDays.Add(5,22);

   RegularHolidays.Add(wnSAT);       // 定休曜日 wnSUN(日)〜wnSAT(土)か, 1(日)〜7(土)
  end;
end;

  http://kaito.es.land.to/img/_Demo1.png

桜  :「カワイイ、カラフルなカレンダーね、このチェックマークの色は緑だけ?」
海都:「マークの色は MarkBmpColorプロパティで、青か赤にも変えられる」
桜  :「カレンダーの月を変えると、並んでる別のカレンダーの月も連動して変るのね」
海都:「そう、この3個のカレンダーは GroupIndexを0以外の同じ値にしてあるから」
桜  :「あれ? 2004年の海の日が7月20日になってないよ? 間違いじゃない?」
海都:「2003年からハッピーマンデー法の第2弾が適用されるからソレでいいんだ」
桜  :「2003年に? ずいぶん先の話ね、でも何でそんな先のコトまで知ってるの?」
海都:「あっ、その説明をすると話がややこしくなるから、サラッと聞き流して^^;」
桜  :「そう? ねぇ、日付の右クリックで PoupMenuを出して、その日にマークを付けたり消したり出来たら便利じゃない?」
海都:「うん、オレもそうするつもりだけど、今日はそこまでやる時間ないな」

  http://kaito.es.land.to/img/_Demo2.png

桜  :「そうそう、先にこのピザ食べない? 今日は初詣に行く約束だったでしょ?」
海都:「忘れてないよ、一応仕上がったんで、これをUPLOADしてから食べるよ、その後で初詣に行こう」

   http://kaito.es.land.to/lime/lime.cgi?MonthCalendarEx01

桜  :「ねぇ、カイトは何を神様にお願いするの?」
海都:「う〜ん、"今年は大きなプロジェクトを任されますように"ってお願いしようかな?」
桜  :「アタシのお願いは仕事のことじゃなくて、"今年も健康でありますように"」

≪民宿ダイヤモンド・ヘッド≫
春子:「マコト、明けましてオメデトウさん、すがすがしい元旦だね」
真琴:「明けましておめでとうございます、ハルコさん、今なぜか懐かしい気分なの、アタシ」
春子:「それは当然じゃない? 二年前に戻ったマコトが今年の新年を迎えるのは二回目だもん」
真琴:「え?言ってる意味が分からないけど…"二年前に戻った"ってナンのコト? ハルコさん」
春子:「マコト、マジ? 二年前に戻ったコト忘れちゃったの?」


表裏 未里  URL  2009-01-01 19:50:19  No: 32995

明けましておめでとうございます!
MonthCalendarExコンポには大変お世話になってます!
今後のバージョンアップも期待してます(^^)


TS  2009-01-02 08:25:05  No: 32996

MonthCalendarEx  不覚にも以前に紹介された時見落としてました。

これ良いですね、私も使わせていただきます。

>海都:「えっ? 前に作ったのをオレのWEBページにUP
カイトさんのホームページ見たいです、出来れば教えて下さい。


マークの謎?  2009-01-03 22:58:58  No: 32997

≪ハルコのスナック渚≫
春子:「今日、久しぶりにカイトさんのカレンダーコンポを再DLしてみたらバージョンアップしてたよ」

   http://kaito.es.land.to/lime/lime.cgi?MonthCalendarEx01

真琴:「え? カイトさんってダレ? ハルコさんがズ〜ッと手紙が来るのを待ってる彼氏?」
春子:「あ…それも忘れちゃったの、マコト、まぁ、その方が今年の出会いが新鮮でイイか?」
真琴:「ナニ言ってるンだか分からないけど、ハルコさん、そのコンポってどんなの?」
春子:「それより、そのWEBページのHOME覗いたらね、殺風景なのよコレが^^;、変な猫の絵が一つあるだけでコンテンツなんか何もないの…」
真琴:「そんなのドウでもイイから、コンポの話してよ、ハルコさん」
春子:「そう? …ほら、緑のチェックマークが付くようになってるのよ、右クリックでマークを消したり付けたりも出来ちゃう」
真琴:「コレいいね、でも、右クリックして付けたマークはアプリを再起動すると消えちゃうんじゃない?」
春子:「それは自分でファイルに保存しなきゃダメよ、このコンポ、保存まではやってくれないから」

type
  TKindOfDay = (kdMarkDay, kdHoliday, kdRegularHoliday);
  ..........

type
//PMarkDay = ^TMarkDay;
  TMarkDay = packed record
    Year: WORD;
    Month: WORD;
    Day: WORD;
    Color: WORD;
    WeekNum: TWeekNum;
//  Name: string;
  end;

var
  DaysFile: array[TKindOfDay]of string = ('_MarkDay.dat','_Holiday.dat','_RegularHoliday.dat');

function TForm1.Load_DaysData(kind: TKindOfDay): Boolean;
var
  i, cnt: WORD;
  md: TMarkDay;
  NewItem: THoliday;
begin
  result := False;
  if not FileExists(DaysFile[kind]) then exit;
  with MonthCalendarEx1, TFileStream.Create(DaysFile[kind], fmOpenRead) do try
   case kind of
    kdMarkDay:
     begin
      Read(cnt, Sizeof(cnt)); MarkDays.Clear;
      for i:=0 to Pred(cnt) do begin
       Read(md, Sizeof(TMarkDay));
       NewItem:= THoliday(MarkDays.Add);
       NewItem.Year:= md.Year;
       NewItem.Month:= md.Month;
       NewItem.Day:= md.Day;
       NewItem.WeekNum := md.Color;
      end;
     end;
    kdHoliday:
     begin
      Read(cnt, Sizeof(cnt)); Holidays.Clear;
      for i:=0 to Pred(cnt) do begin
       Read(md, Sizeof(TMarkDay));
       NewItem:= THoliday(Holidays.Add);
       NewItem.Year:= md.Year;
       NewItem.Month:= md.Month;
       NewItem.Day:= md.Day;
      end;
     end;
    kdRegularHoliday:
     begin
      Read(cnt, Sizeof(cnt)); RegularHolidays.Clear;
      for i:=0 to Pred(cnt) do begin
       Read(md, Sizeof(TMarkDay));
       NewItem:= THoliday(RegularHolidays.Add);
       NewItem.Month:= md.Month;
       NewItem.Day:= md.Day;
       NewItem.WeekNum := md.WeekNum;
      end;
     end;
   end;
// Invalidate;
   result := True;
  finally
   Free;
  end;
end;

function TForm1.Save_DaysData(kind: TKindOfDay): Boolean;
var
  i, cnt: WORD;
  item: THoliday;
  md: TMarkDay;
begin
  with MonthCalendarEx1, TFileStream.Create(DaysFile[kind], fmCreate) do try
   case kind of
    kdMarkDay:
     begin
      cnt := MarkDays.Count; Write(cnt, Sizeof(cnt));
      i:=0;
      while i < cnt do begin
       item := MarkDays[i];
       md.Year := item.Year;
       md.Month := item.Month;
       md.Day := item.Day;
       md.Color := item.WeekNum;
       Write(md, Sizeof(TMarkDay));
       inc(i);
      end;
     end;
    kdHoliday:
     begin
      cnt := Holidays.Count; Write(cnt, Sizeof(cnt));
      i:=0;
      while i < cnt do begin
       item := Holidays[i];
       md.Year := item.Year;
       md.Month := item.Month;
       md.Day := item.Day;
       Write(md, Sizeof(TMarkDay));
       inc(i);
      end;
     end;
    kdRegularHoliday:
     begin
      cnt := RegularHolidays.Count; Write(cnt, Sizeof(cnt));
      i:=0;
      while i < cnt do begin
       item := RegularHolidays[i];
       md.Month := item.Month;
       md.Day := item.Day;
       md.WeekNum := item.WeekNum;
       Write(md, Sizeof(TMarkDay));
       inc(i);
      end;
     end;
   end;
   result := True;
  finally
   Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Save_DaysData(kdMarkDay);
  Save_DaysData(kdHoliday);
  Save_DaysData(kdRegularHoliday);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Load_DaysData(kdMarkDay);
  Load_DaysData(kdHoliday);
  Load_DaysData(kdRegularHoliday);
  MonthCalendarEx1.Invalidate;
end;

真琴:「あっ、そっか、そういうことね^^ゞ、これアタシも使ってみようかな?」
春子:「マークの色は、mbcBLUE、mbcRED、mbcGREENの3色あるみたいよ」
真琴:「前後の月の日はマークの色がグレイになるね、それもイイじゃない?」
春子:「同時に3色のマークを使えれば、もっとイイけどね」
真琴:「何のマークだか分かるようにマウスポインタをそこに動かしたら表示するようにも…」
春子:「マコト、そのアイデア良いよ、何のマークだか忘れちゃうコトあるから^^ゞ」
真琴:「あ…そういえば、アタシの部屋のカレンダーの7月と9月に赤いマークが付いてるンだけど…ハルコさんのシワザ?」
春子:「アタシがマコトのカレンダーをイジルわけないでしょ、マサルさんがやったんじゃない?」
真琴:「おじいちゃんもそんなコトしないよ」
春子:「じゃぁ、マコトが自分でマークを付けたんだよ、きっと」
真琴:「でも、アタシ、全然憶えてないよ、7月7日は、多分七夕だと思うけど、9月の方はナゾ」
春子:「自分で付けたマークのナゾかぁ、マコト、そんな小説でも書いたら? 売れるかも^^ゞ」
真琴:「チャカさないでよ、ハルコさん、マークの横に、"ゼッタイ忘れちゃダメ"って書いてあるのに…」
春子:「アタシも去年マコトに何か聞いたような気がするンだけどね」
真琴:「ハルコさんもそれがナンだか憶えてないの?」
春子:「でも、9月が近づけばきっと分かるから、あんまり気にしない方がイイよ、マコト、忘れるようじゃ、たいしたコトでもないって」


どすん!  2009-01-04 06:09:33  No: 32998

コウボウも木から落ちる^^;
真琴:「ハルコさん、大丈夫? ケガは?」
春子:「ナイナイ、でもイタァ〜」
  ........
//for i:=0 to Pred(cnt) do begin   (cntが0だと、forループではマズイ)
  i := 0;
  while i < cnt do begin
  ........


TS  2009-01-04 08:59:12  No: 32999

>春子:「それより、そのWEBページのHOME覗いたらね、殺風景なのよコレが>^^;、変な猫の絵が一つあるだけでコンテンツなんか何もないの…」

やっばりこれですね、見ました。

早速バージョンアップされたんですね。
今BeforeMonthChangeとか追加して必死で自分用に機能を追加してた所です。
大変勉強になります、丁度カレンダーのコンポーネントが欲しかった
所でまさにピンポ〜ンでした、ありがとうございました。


おまかせ  2009-01-10 23:33:57  No: 33000

≪カイトのマンション≫
桜  :「昨日会社で すごいプロジェクトを任されたよね、カイト、おめでとう」
海都:「うん、ありがとう、ミスをしないよう頑張らなくちゃ、元旦の初詣の"ご利益"かな?」
桜  :「それはカイトの努力の成果よ、素晴らしいプレゼンだったし…あれ? 今日もカレンダの手直し?」
海都:「そう、いろいろと…」
桜  :「あ…、3色のマークを同時に使えるようになったのね? どうやって色を指定するの?」
海都:「コードで指定する場合は、こうだよ」

  with MonthCalendarEx1 do begin
   MarkDays.Add(2009, 2, 3, mbcBLUE, '節分、皆で豆まき大会');  // 2/3の節分に青マーク
  end;

桜  :「え? テキスト文字も書き込めるんだぁ…、それはドコに表示されるの?」
海都:「ポインタをマーク位置に移動させると、StatusBarに、クリックするとBaloonTipが…」

  http://kaito.es.land.to/img/_Demo3.png
  (※MonthCalendarExコンポの StatusBarプロパティをセットしておく)

桜  :「右クリックのPopupMenuで入力する場合は どうするの?」
海都:「F1キーを押しながら右クリックすれば赤、F2なら青、F3なら緑、テキスト入力は…」

  http://kaito.es.land.to/img/_Demo4.png

桜  :「右クリックでのマーク付けは、"年指定あり"でその年だけなの? それとも…」
海都:「デフォルトでは"年なし"、ShiftKeyを押しながらの右クリックなら"年あり"になるよ」
桜  :「それも選んで入力できるンだぁ」
海都:「Menu項目にもそれが表示されるから、どちらかスグ分かるし」

  http://kaito.es.land.to/img/_Demo5.png

桜  :「それイイじゃない? でも、このように、三つカレンダーが並んでいたら、全部の同じ日付を右クリックして入力するの? チョット面倒かな?」
海都:「GroupIndexが同じ(0以外)なら、どれか一つだけに入力すればOKだよ」
桜  :「あっ、どれか一つだけでイイの? それならラクよね」
海都:「そうだろ?」
桜  :「だけど、マークのDATAの保存と読み込みは、自分でコードを書かないとダメでしょ?」
海都:「それも、AutoSaveLoadプロパティをTrueにすれば、コンポが自動的にやるようにしたから、ユーザーがSAVE/LOADのコードを書く必要はないよ」
桜  :「SAVE/LOADが自動的に? それもスゴク便利ね、ドコのフォルダに?」
海都:「デフォルトでは、各ユーザーの My Documentフォルダになる」
桜  :「それを変えたい場合は?」
海都:「例えば、DataFolderプロパティに'.\'と指定すればカレントフォルダになるよ」

procedure TForm1.FormCreate(Sender: TObject);
begin
//MonthCalendarEx1.DataFolder := '.\';    // 指定しなければ、デフォルトの My Document
  MonthCalendarEx1.AutoLoadSaveData := True;  // この時点で、ファイルからDATAをLOAD
  MonthCalendarEx1.Date := Now;
  .......
end;

桜  :「ねぇ、この例の場合は、MonthCalendarEx1だけにしか DATAがLOADされないのよね?」
海都:「違うよ、こう書いておくだけで、GroupIndexが同じ他のカレンダーにも自動的にLOAD/SAVEされるから心配無用」
桜  :「ふ〜ん、それも全部オマカセなのぉ〜…」
海都:「そう、オマカセってイイだろ?」
桜  :「でも食事はオマカセじゃなくて、アタシの好きなものがイイなぁ〜」
海都:「あ…、それはそうだけどネ^^;…」
桜  :「ねぇ、これからアタシが見つけた美味しいレストランに行こうよ」
海都:「うん、お腹もすいたし…じゃ、UPLOADしてから…」

   http://kaito.es.land.to/lime/lime.cgi?MonthCalendarEx01


TS  2009-01-11 18:29:54  No: 33001

流石です、ここまで来たらこれを貼り付けるだけでカレンダーの
プログラムが出来ちゃいますね。

ところでTKindOfDay欲しかったところです。
type
  TKindOfDay = (kdMarkDay, kdHoliday, kdRegularHoliday);
これってinteger にして1,2,4,8,16,32とかの数字に割り当てて
種類を12種類位にして

1 kdMarkDay 2 kdHoliday
kdMarkDay + kdHoliday=3
kdHoliday and 2 = ture

休日でしかもマーク日とか休日のデート日とか休日の誕生日の
とか複合でデータを持てる様にできませんか。
表示は今までの様に3種類のマークのみにするか。

表示を広げて他のイメージおよび文字も表示できる様になると
もう完全に普通のカレンダープログラムですね。


テレパシー  2009-01-12 22:59:11  No: 33002

>これってinteger にして1,2,4,8,16,32とかの数字に割り当てて
>種類を12種類位にして

>休日でしかもマーク日とか休日のデート日とか休日の誕生日の
>とか複合でデータを持てる様にできませんか。
>表示は今までの様に3種類のマークのみにするか。

真琴:「ハルコさん、こんなコトするにしても、その値を入力するのが難しいンじゃない?」
春子:「それは、"日"の部分をクリックした時に ComboBox出して選択すればイイと思うけど」
真琴:「でも、それはコンポに組み込まないとダメでしょ?」
春子:「コンポのソースを弄らなくても、一応は出来るよ、マコト、こんなカンジで…」

type
  TMonthCalendarEx = class(MonthCalendarEx.TMonthCalendarEx)
  private
    FStateEx: WORD;
    procedure WmLButtonDown(var msg: TWMMouse); message WM_LBUTTONDOWN;
    procedure ComboCloseUp(Sender: TObject);
  end;
type
  TForm1 = class(TForm)
    MonthCalendarEx1: TMonthCalendarEx;
    ..........

var
  StateExCombo: TComboBox;

procedure TMonthCalendarEx.WmLButtonDown(var msg: TWMMouse);
var
  Offset: Integer;
  p: TPoint;
  function RectOfDays: TRect;
  begin
   if ShowTitle then
    Result.Top := 3 * CellHeight
   else
    Result.Top := CellHeight;
   Result.Bottom := Result.Top + 6 * CellHeight;
   if ShowWeekNumbers then
    Result.Left := CellWidth + 5
   else
    Result.Left := 5;
   Result.Right := Width - 5;
 end;
begin
  if Assigned(StateExCombo) then exit;
  inherited;
  p.X := Msg.XPos;
  p.Y := Msg.YPos;
  if (GetKeyState(VK_SHIFT) < 0)and(PtInRect(RectOfDays, p)) then begin
   StateExCombo := TComboBox.Create(Self);
   with StateExCombo do begin
    Parent := Self;
    Left := Msg.XPos - 40;
    Top :=  Msg.YPos + 8;
    Width := 90;
    if Left < 1 then Left := 1;
    Offset := Left + Width - Self.Width;
    if Left+Width > Self.Width then Left := Left - Offset;
//  Style := csDropDownList;
    OnCloseUp := ComboCloseUp;
    Text := 'StateEx入力';
    Items.Add('誕生日');
    Items.Add('〆切日');
    Items.Add('デート日');
    Items.Add('………');
   end;
  end;
end;

procedure TMonthCalendarEx.ComboCloseUp(Sender: TObject);
begin
  FStateEx := 1 shl (StateExCombo.ItemIndex);
//if IsMarkDay(EncodeDate(Year, Month, SelectDay)) then
// MarkDays[{クリックした日のIndex}].WeekNum := FStateEx;
  Form1.Caption := Format('StateEx= %d', [FStateEx]);  // 確認
  StateExCombo.Free;
  StateExCombo := nil;
end;

真琴:「でも、これだとマーク日でないと、このFStateExの値を保存できないよね?」
春子:「マーク日以外でも保存するには、質問した人がもう少し詳しい仕様とかをハッキリさせてくれないとダメかな…」
真琴:「仕様がハッキリすれば、これをコンポに組み込むようにした方がイイんじゃない?」
春子:「じゃあ、仕様が分かったら、アタシがコンポ作者にテレパシー送ってみようか?」
真琴:「えっ? テレパシーって、ハルコさん、そんなコトできるの?」
春子:「冗談よ^^、マコト、そんな能力あるワケないでしょ?」
真琴:「なぁんだ、でも別の冗談を去年ハルコさんから聞いたような…」
春子:「ン? どんな冗談?」


TS  2009-01-13 00:14:35  No: 33003

元々MonthCalendarExはMonthCalendarの代わりに使わせて
もらうつもりで只日付の選択に使ったのですが、使ったりソースを
見ているとカイトさんの力をもってすればこれって完全に
普通のカレンダーになるじゃんと思えて来ました、
仕様としては
  大きくしても表示が乱れない、
  (タイトル行等の高さの指定、○の大きさを文字の大きさに連動)
  (日付の文字位置の指定(大きくしたとき左上とかにしたい))  

  それそれのCanvas.FillRect(R)は止めて背景に絵を表示できる
  線の表示も選択可能    
  CanvasもFCanvasに変えて印刷とかの他のCanvasも選択使用可能

>真琴:「ハルコさん、こんなコトするにしても、
>その値を入力するのが難しいンじゃない?」
  入力は私の場合自分のプログラムの方でやるつもりです。
  
  描画時に自前でデータ部が描画できる。
  MyPaint(Canvas: TCanvas; aRect: TRect);

勝手な事を書きましたが、お正月の夢です。
たわごとをお許しください。


satot  2009-01-14 20:16:05  No: 33004

SysUtilsの関数DayOfWeekの戻り値がIntegerなので、SysUtilsのDayOfWeekを使っているFormにMonthCalendarExを貼り付けるとエラーになりました。MonthCalendarExに同名のDayOfWeekがあって、戻り値が違う事に気づくのに大分時間がかかりました。初心者向けに関数名が重複しないようにしていただけると大変ありがたいです。
初心者の、たわごとをお許しください。


それはね  2009-01-14 20:58:05  No: 33005

こう区別して書けば、エラーは出ないよ。
var
 dw1: Integer;
 dw2: TDayOfWeek;

procedure TForm1.Button1Click(Sender: TObject);
begin
  dw1 := SysUtils.DayOfWeek(Now);
  dw2 := MonthCalendarEx.DayOfWeek(Now);
end;


囁く声  2009-01-17 23:05:42  No: 33006

桜  :「また? 最近、休みなるとカレンダーコンポの手直しをしてるのね?」
海都:「オレは、そうするつもりはナイんだけど…」
桜  :「じゃぁ、ナンでなの?」
海都:「この前、ドコからか囁くような声が耳に聞こえて…それで」
桜  :「"囁く声"? カイト、大丈夫? このところチョット仕事で頑張り過ぎて疲れてるンじゃない?」
海都:「いや、そんなコトはないよ、大丈夫」
桜  :「でも、自覚症状のない疲れもあるみたいよ、気をつけて?」
海都:「特に無理はしてないけどね」
桜  :「あ、このカレンダーのサイズが大きくなると感じも少し変わるよね、曜日も英語表記で」

  http://kaito.es.land.to/img/_Demo6.png

海都:「うん、今まで気がつかなかったけど、大きくした時のマークの位置に不具合があって…」
桜  :「ねぇ、これだけ大きくすると、カレンダーの背景が絵になるといいよね?」
海都:「そう…、"囁く声"もそう言ってたンだ…、だから…、このボタン押してごらん?」
桜  :「え? 押すとどうなるの? あっ、背景が花の絵に変った、これステキじゃない?」
海都:「サクラの名前と同じ桜の画像を使ってみたよ」

  http://kaito.es.land.to/img/_Demo7.png

桜  :「このカレンダーだけ印刷したいよね、それって出来る?」
海都:「う〜ん、こうすると、ListBoxのCanvasに描画できるから…」

  with MonthCalendarEx1 do
   Bitblt(ListBox1.Canvas.Handle, 10, 20, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);

  http://kaito.es.land.to/img/_Demo8.png

海都:「こう変えれば印刷できるンじゃないかな? オレはプリンタ持ってないから確認できないけど」

  with MonthCalendarEx1 do begin
   Printer.BeginDoc;
   Bitblt(Printer.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);
   Printer.EndDoc;
  end;

桜  :「ねぇ、この背景画像はどうやって指定するの?」
海都:「設計時に WallPaperプロパティで指定できるよ、表示の切り換えは ShowWallPaperプロパティ」
桜  :「画像の種類は? BMPなの?」
海都:「BMPの他に、JPG画像ファイルも使える」
桜  :「画像のサイズは、カレンダーに合わせないとダメ?」
海都:「サイズが違う場合は自動的に伸縮させるから、違っても問題なし」
桜  :「あれ? 新しく貼り付けたコンポの ShowWallPaperをTrueにするだけで背景の絵が表示されるけど? ナンで?」
海都:「あ、それはコンポのリソースにデフォルト画像を入れてるから」
桜  :「ふ〜ん、そうなのぉ…、さすが配慮が行き届いてるよね、仕事以外でも」
海都:「今度のプロジェクトは失敗が許されないから、とにかく細かい配慮をしないと」
桜  :「カイトなら、きっと大丈夫、でも疲れるとミスも出やすいから、それだけは気をつけてね?」
海都:「ありがとう、サクラの優しい気遣いはとても嬉しいよ、今年の秋までには決着させるつもり」
桜  :「 (仕事のスタミナつけるには、美味しいもの食べに行こうヨ…これから…) 」
海都:「分かったよ^^;、後ろで囁く声はサクラだろ?」

   http://kaito.es.land.to/lime/lime.cgi?MonthCalendarEx01


TS  2009-01-18 01:03:28  No: 33007

早速使ってみました、背景画像に・・・な絵を入れてムフフ
と笑ってしまいました、カイトさんカッチョいいです。
印刷例とかまだ試していませんが、応用範囲がぐぐっと
広がりそうですね、重ね重ねありがとうございました。


TS  2009-01-18 05:23:41  No: 33008

使っているとどうしてもやりたくなったので
  DayPosition:byte と 
 OnAfterDrawDay              (Sender:TObject;Canvas,R,AYear,AMonth,ADay,DoMark);
を追加してみました、とりあえず下記の変更で動作してます。

>日付の文字位置の指定(大きくしたとき左上とかにしたい)  
procedure TMonthCalendarEx.DrawDayText(R: TRect; const s: string);
var DT1:Cardinal;
begin
  Canvas.Brush.Style := bsClear;
  //文字を指定の位置にしたい
  case FDayPosition of
    1:DT1:=DT_SINGLELINE + DT_TOP + DT_LEFT;
    2:DT1:=DT_SINGLELINE + DT_TOP + DT_CENTER;
    3:DT1:=DT_SINGLELINE + DT_TOP + DT_RIGHT;
  else
    DT1:=DT_SINGLELINE + DT_VCENTER + DT_CENTER;
  end;
  DrawText(Canvas.Handle, PChar(s), Length(s), R, DT1);
end;

>描画時に自前でデータ部等を描画したい。
  DrawDayText(R, IntToStr(ADay));  
  //使用プログラムでの描画用
  DoOnAfterDrawDay(Canvas,R,AYear,AMonth,ADay,DoMark);

プログラムが読みやすいので私でも追加できました、感謝します。


ばれんたいんでぃ  2009-02-01 20:25:36  No: 33009

桜  :「カイトに言われた通りの大きさと色でマークの絵を描いてきたわヨ」
海都:「そう? こっちの準備もOKだから、さっそく組み込もう」

http://kaito.es.land.to/img/_Demo9.png

桜  :「ねぇ、この画像をどう使うの?」
海都:「この画像を読み込んだImageListを、MarkImagesプロパティにセットすると…こうなるんだ」

http://kaito.es.land.to/img/_Demo10.png

桜  :「あ、マークが変った、こんなふうに使うのぉ…、マークの位置も変えられるのね?」
海都:「うん、もしコードでマークを変えたい場合は、こんなカンジで…」

{$DEFINE AddMASK}
var
  aImageList: TImageList;

procedure TForm1.FormCreate(Sender: TObject);
var
  bmp: TBitmap;
begin
  bmp := TBitmap.Create;
  try
   bmp.LoadFromFile('Mark27x27_1.bmp');
   aImageList := TImageList.Create(Self);
   aImageList.Height := bmp.Height;
   aImageList.Width := bmp.Width div 14;   // bmpは 14個のマーク入り
{$IFDEF AddMASK}
   aImageList.Masked := True;
   aImageList.AddMasked(bmp, clBlack);     // 透過色は黒
{$ELSE}
   aImageList.Masked := False;
   aImageList.Add(bmp, nil);
{$ENDIF}
  finally
   bmp.Free;
  end;

  with MonthCalendarEx1 do begin
   AutoLoadSaveData := True;
   Date := Now;
   MarkImages := aImageList;
   MarkOffset := 0;              // ImageListの0〜3のIndexの画像(4個)を使う
   MarkPos := dpVTopHRight;      // マーク表示位置は右上

   ExtrDays.Add(2, 04, dsBirthday or dsDate, '今日はサクラの誕生日');
   ExtrDays.Add(2, 27, dsBirthday or dsEx10, '今日も誰かの誕生日');
  end;
  .........
end;

桜  :「アタシの誕生日に苺のマークが付いてるけど、ここだけマークが2種類あるよネ」
海都:「これはTSさんが追加してくれたイベントを使って、苺のマークを表示してるんだよ」

procedure TForm1.MonthCalendarEx1BeforeDrawDay(Sender: TObject;
  Canvas: TCanvas; R: TRect; AYear, AMonth, ADay: Word;
  DayState: Cardinal);
var
  X, Y: Integer;
begin
  if (DayState and dsBirthday) <> 0 then begin         // DayStateが誕生日(dsBirthday)の日
   MonthCalendarEx1.CalcMarkPos(dpVHCenter, R, X, Y);  // マーク位置は中央
   aImageList.Draw(Canvas, X, Y, 13);                  // 苺マーク(Index=13)表示
  end;
end;

桜  :「TSさん?」
海都:「そう、TSさんがメールで、改良したMonthCalendarExコンポのソースを送ってくれて」
桜  :「そうなの…、それで、TSさんの改良って、それだけ? 他にもあるの?」
海都:「他には、デザイン時にマウスのドラッグでコンポのサイズを変更出来るようにとかも…」
桜  :「あ、そういえば、今まではマウスでドラッグしてもコンポのサイズが変らなかったよね?」
海都:「うん、やっぱりマウスドラッグでサイズ調整できた方が便利だね」
桜  :「それはそうよ」
海都:「ただ、コンポを貼り付けた直後だけは、DragResizingプロパティをTrueに変更する必要がある」
桜  :「えっ? 最初からTrueにしておけばイイと思うけど、ダメなの?」
海都:「デフォルトではFalseにしておかないと、Delphiバージョンによっては、貼り付け時にコンポのサイズが異常に小さくなってしまうから」
桜  :「ふ〜ん、そんなコトもあるんだ…」
海都:「…このカワイイ赤ちゃんの写真、眺めてるだけでも癒されるよ」
桜  :「先週ね、友達の赤ちゃんの写真を背景にして、このカレンダーを印刷して、その友達にプレゼントしたら、とっても喜んでくれたの」
海都:「そう…、オレもサクラの写真を背景にしたカレンダーを印刷して欲しいな、これくらいの大きさで」
桜  :「じゃぁ、それはバレンタインの日にチョコと一緒にプレゼントするネ」
海都:「あ、そうか、もうすぐバレンタインなのか」
桜  :「女の子にとっては、すごく大切な日だもん」
海都:「だけど、安い義理チョコで、高いお返しを期待する子もいるんじゃないの?」
桜  :「そんなぁ…、いるかもしれないけど、でも、アタシは違うわよ」
海都:「もちろん、それは分かってるよ^^;、あれ? 気分悪くした? ごめん^^;;」

   http://kaito.es.land.to/lime/lime.cgi?MonthCalendarEx01


TS  2009-02-02 06:16:29  No: 33010

使ってみました。

ExtrDaysと使用例、私にとってはこれで完璧です。

話の登場人物になれたのも嬉しいです。
どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加