−トップへ−

カレンダーを作る
その7 form2でカレンダーのサイズを変える

 今回は,form2からカレンダーの設定をいろいろ変えてみたいと思います。
 
 とりあえず行うことは,
 ・ カレンダーの大きさを変える。
 ・ 指定した年月のカレンダーを表示させる。
 ・ カレンダーをマウスで動かないようにする。
の3点です。

 実はカレンダーの大きさを変えることについては,不具合が発生するのですがそれについての対処も述べていきます。

form2の設定

 まず,form2に下図のようにコンポーネントを配置します。

 まず,コンポーネントを配置するためにPageControlコンポーネントを配置します。これはツールパレットのWin32の2番目にあります。これを「閉じる」ボタンが隠れないようにフォーム全体に広げてください。その後PageControlコンポーネントの上で右クリックするとメニューが開きますので,そこで「ページの新規作成」を選択してください。
 そうすると「TabSheet1」が作成されますので,その上に各コンポーネントを設置します。

 「サイズの変更」はTrackBarコンポーネントです。これはWinの5番目にあります。これをTabSheet1の上に配置したら、プロパティを下のように設定します。これらの数値は変更可能ですのでいろいろ試して見てください。

Frequency10 ←つまみを動かす間隔を10刻みにする
Max400 ←つまみの最大値を400にする(これを大きくするとカレンダーもより大きくすることができます。)
Min100 ←つまみの最小値を100にする(これを小さくするとカレンダーをより小さくすることができます。)
Position250 ←つまみの最初の位置を250にする

 プロパティの他の部分を変更すると見た目がいろいろ変わるので,試してみると面白いと思います。
 「カレンダーを固定する」はCheckBoxコンポーネントです。これはStandardの8番目にあります。
 「指定した年月を表示する」は2つのEditコンポーネントと「表示」ボタンです。
 文字はLabelコンポーネントを使って表示してあります。

プログラムを書く前に

 これから,form2にプログラムを記述していきますが,このままではform1の変数を使うことができません。そこでform1で宣言した変数を少し変更します。
 現在,変数「ye」と「mo」,「size」は「private」の場所で宣言していますが,これらを「public」に移します。
 privateで宣言した変数はそのformの中でしか使えませんが,publicで宣言した変数は他のformからでも使うことができます。

 private
  { Private 宣言 }
   //ye,mo:string;←これらを削除して…
   //size:integer;←
  mx,my:integer;
 public
  { Public 宣言 }
  ye,mo:string; ←ここに改めて記述します。
  size:integer; 
 end;
  :
  :
  :

サイズの変更

 まず,TrackBar1をダブルクリックすると,TrackBar1Changeイベントハンドラが作成されますので,そこに次のように記述します。

 procedure TForm2.TrackBar1Change(Sender: TObject);
 begin
  form1.size:=trackbar1.Position; //form1の変数「size」を,TrackBar1のPositionにする
  form1.makec; //form1の「makec」を実行する
 end;

 記述後に実行すると,メッセージが出ますので「はい」を押してください。するとエラーが表示され,「未定義の識別子:form1」と出ますので,これを無視してもう一度実行を押すとカレンダーが表示されます。
 そこでform2を開き,トラックバーのつまみを動かすとカレンダーの大きさが変わることがわかると思います。

サイズ変更時の不具合について

 カレンダーのサイズは,トラックバーコンポーネントの設定で100〜400ピクセルまで変化させることができます。ここでもしTForm1.FormCreateイベントハンドラで変数「size」の値を300にしておき,トラックバーでサイズを400にすると下のような現象が起きます。

 これは,起動時のimageのサイズより大きくすると起きる現象です。これを回避するには,image1の幅と高さを変更するときに
  image1.Picture.Bitmap.Widthとimage1.Picture.Bitmap.Heightも一緒に変更します。
 
 具体的には,TForm1.makecイベントハンドラで,以下のようにします。

 procedure TForm1.makec;
  var
   i,week:integer;
   str:string;
 begin
  form1.ClientWidth:=size;
  form1.ClientHeight:=size;
 
  image1.Left:=0;
  image1.Top:=0;
  image1.Width:=size;
  image1.Height:=size;
  image1.Picture.Bitmap.Width:=size; //←これを付け加えます
  image1.Picture.Bitmap.Height:=size; //←
 
  week:=dayofweek(strtodate(ye+'/'+mo+'/1'));
  with image1.Canvas do begin
   brush.Color:=$ffffff;
   fillrect(image1.ClientRect);
   brush.Style:=bsclear;
   //月の書き込み
   font.Size:=size div 14;
   font.Color:=clblue;
   textout(size div 2 -textwidth(mo+'月') div 2,
       size*3 div 20-textheight(mo+'月') div 2,
       mo+'月');
    :
    :
    :

 このようにすることで,imageの大きさをいろいろ変えても正常に表示できるようになります。
 
 次回は,カレンダーをマウスで動かなくさせることと,指定した年月のカレンダーを表示させることを行います。

−トップへ−