カレンダーを作る
その10 設定を保存する
このシリーズ最終回です。今回は,設定を保存して常に同じ設定で起動できるようにします。
まず,保存する設定ですが,変数「size」とForm1の座標とForm2のCheckBox1のチェックの有無を保存したいと思います。休日については,「春分の日」と「秋分の日」が変動するので保存したいと思いますが,その他のものも一応保存できるようにしたいと思います。
保存する場所はForm1でもよいのですが,Form2で休日の書き込みなどを行っているため,保存もForm2で行いたいと思います。
まず,Form2で独自のプロシージャ「hozon」を作成し,そこにプログラムソースを書き込みます。
procedure TForm2.hozon;
var
fi:textfile; //ファイル宣言
i,j:integer;
begin
assignfile(fi,getcurrentdir + '\calendar.ini'); //fiと「hozon.ini」ファイルを関連づける
rewrite(fi); //fiを開き,書き込めるようにする
writeln(fi,form1.size); //sizeの数値をfiに書き込む
writeln(fi,form1.Left); //フォームのX座標を,fiに書き込む
writeln(fi,form1.Top); //フォームのY座標を,fiに書き込む
writeln(fi,checkbox1.Checked); //チェックボックスの状態をfiに書き込む
for i:=1 to 11 do begin //StringGrid1の内容をfiに書き込む
for j:=0 to 2 do begin
writeln(fi,stringgrid1.Cells[j,i]); //
end;
end;
for i:=1 to 4 do begin //StringGrid2の内容をfiに書き込む
for j:=0 to 2 do begin
writeln(fi,stringgrid2.Cells[j,i]);
end;
end;
closefile(fi); //ファイルを閉じる。これで「hozon,ini」ファイルが作成される
end;
次に,保存したファイルを呼び出します。プログラムを書くのはForm2.Createイベントハンドラです。ここは,今まで書いたものをすべて書きかえます。
procedure TForm2.FormCreate(Sender: TObject);
var
fi:textfile; //ファイル宣言
i:integer;
str:array[1..49] of string;
begin
StringGrid1.ColWidths[2]:=100; //StringGrid1の設定
StringGrid1.Cells[0,0]:='月';
StringGrid1.Cells[1,0]:='日';
StringGrid1.Cells[2,0]:='祝日名';
StringGrid2.ColWidths[2]:=100; //StringGrid2の設定
StringGrid2.Cells[0,0]:='月';
StringGrid2.Cells[1,0]:='週';
StringGrid2.Cells[2,0]:='祝日名';
form1.ye:=formatdatetime('yyyy',date); //「ye」を求める
form1.mo:=formatdatetime('m',date); //「mo」を求める
edit1.Text:=form1.ye; //edit1にyeの値を書き込む
edit2.Text:=form1.mo; //edit2にmoの値を書き込む
if FileExists(getcurrentdir + '\calendar.ini')=true then begin
//もし,「calendar.ini」が存在すれば以下を実行
assignfile(fi,getcurrentdir + '\calendar.ini');
reset(fi);
for i:=1 to 49 do begin //「calendar.ini」の内容をstr[i]に書き込む
readln(fi,str[i]);
end;
closefile(fi);
form1.size:=strtoint(str[1]);
form1.Left:=strtoint(str[2]);
form1.Top:=strtoint(str[3]);
if str[4]='TRUE' then checkbox1.Checked:=true else checkbox1.Checked:=false;
//str[4]='TRUE'の'TRUE'は大文字にしないとうまく作動しません。
for i:=5 to 37 do begin
stringgrid1.Cells[(i-5) mod 3,(i-2) div 3]:=str[i];
end;
for i:=38 to 49 do begin
stringgrid2.Cells[(i-38) mod 3,(i-35) div 3]:=str[i];
end;
end else begin //「calendar.ini」が存在しない場合,以下を実行
StringGrid1.Cells[0,1]:='1';
StringGrid1.Cells[1,1]:='1';
StringGrid1.Cells[2,1]:='元日';
StringGrid1.Cells[0,2]:='2';
StringGrid1.Cells[1,2]:='11';
StringGrid1.Cells[2,2]:='建国記念の日';
StringGrid1.Cells[0,3]:='3';
StringGrid1.Cells[1,3]:='21';
StringGrid1.Cells[2,3]:='春分の日';
StringGrid1.Cells[0,4]:='4';
StringGrid1.Cells[1,4]:='29';
StringGrid1.Cells[2,4]:='昭和の日';
StringGrid1.Cells[0,5]:='5';
StringGrid1.Cells[1,5]:='3';
StringGrid1.Cells[2,5]:='憲法記念日';
StringGrid1.Cells[0,6]:='5';
StringGrid1.Cells[1,6]:='4';
StringGrid1.Cells[2,6]:='みどりの日';
StringGrid1.Cells[0,7]:='5';
StringGrid1.Cells[1,7]:='5';
StringGrid1.Cells[2,7]:='こどもの日';
StringGrid1.Cells[0,8]:='9';
StringGrid1.Cells[1,8]:='23';
StringGrid1.Cells[2,8]:='秋分の日';
StringGrid1.Cells[0,9]:='11';
StringGrid1.Cells[1,9]:='3';
StringGrid1.Cells[2,9]:='文化の日';
StringGrid1.Cells[0,10]:='11';
StringGrid1.Cells[1,10]:='23';
StringGrid1.Cells[2,10]:='勤労感謝の日';
StringGrid1.Cells[0,11]:='12';
StringGrid1.Cells[1,11]:='23';
StringGrid1.Cells[2,11]:='天皇誕生日';
StringGrid2.Cells[0,1]:='1';
StringGrid2.Cells[1,1]:='2';
StringGrid2.Cells[2,1]:='成人の日';
StringGrid2.Cells[0,2]:='7';
StringGrid2.Cells[1,2]:='3';
StringGrid2.Cells[2,2]:='海の日';
StringGrid2.Cells[0,3]:='9';
StringGrid2.Cells[1,3]:='3';
StringGrid2.Cells[2,3]:='敬老の日';
StringGrid2.Cells[0,4]:='10';
StringGrid2.Cells[1,4]:='2';
StringGrid2.Cells[2,4]:='体育の日';
form1.size:=300;
end;
trackbar1.Position:=form1.size; //Trackbar1のPositionをsizeにする
form1.makec; //makecを実行する
end;
最後に,設定を保存するタイミングですが,ポップアップメニューの「終了」を押したときに,保存するようにします。具体的には,Form1の.N5Clickイベントハンドラに一行加えるだけです。
procedure TForm1.N5Click(Sender: TObject);
begin
form2.hozon; //Form2の「hozon」を実行する
form1.Close;
end;
これまでのプログラムソースをサンプルファイルにして掲載しましたので,興味のある方はご覧ください。
このサンプルプログラムは適当に改良して再配布しても構いませんので,ご自由にお使いください。