|
前章で、フォームをリサイズ可能にしましたが、プログラムを実行すると、プログラム作成時のデザインのサイズ・位置で固定化されて、いつも同じ場所・同じ大きさで表示されます。これを、ユーザー側で以前に指定した場所・大きさで表示したくなります。それを実現するには、プログラム終了時にフォームの大きさと位置を記憶しておき、プログラム開始時にはそれを読み込む、という手法を取る必要があります。
勿論、[設定記憶]等のボタンを配置して、それを押せば設定を記憶させる、というようなプログラムでも構いません。
設定値を記憶して、それを呼び出す、という手法には、主に3つのパターンがあります。
@レジストリを利用
Aプロファイルファイル(〜.iniのファイル)を利用
B独自形式のデータファイルを利用
プログラム終了時に保存する場合には、メインフォームの OnCloseイベントにそのコードを記述すれば良いと思います。また、プログラム開始時に設定値を読み出す場合には、メインフォームの OnShowイベント(フォームの画面が表示された時の処理)で記述すればいいでしょう。OnCreate時には、まだフォーム画面は表示されていませんので、その時にフォーム画面位置や大きさを変更するコードを書く、という事は出来ません。
@レジストリを利用
Windows95〜のシステムでは、Microsoftにより、レジストリの使用が推奨されています。レジストリを利用するには、まず、uses節に「Registry」を追記します。
レジストリに設定を記録する場合には、
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Reg: TRegistry ;
begin
F_F1Top := Form1.Top;
F_F1Left := Form1.Left;
F_F1Width := Form1.Width;
F_F1Height := Form1.Height;
{ レジストリ書き込み }
Reg := TRegistry.Create ;
Reg.RootKey := HKEY_CURRENT_USER ;
Reg.OpenKey('\Software\作成者名\プログラム名',True);
try
Reg.WriteInteger('Form1Top' ,F_F1Top );
Reg.WriteInteger('Form1Left' ,F_F1Left );
Reg.WriteInteger('Form1Width' ,F_F1Width );
Reg.WriteInteger('Form1Height' ,F_F1Height);
except
;
end;
Reg.CloseKey ;
Reg.Free ;
end; |
のようにします。レジストリから設定値を読み込む場合には、
procedure TForm1.FormShow(Sender: TObject);
var
Reg: TRegistry ;
begin
{ レジストリ読み込み }
Reg := TRegistry.Create ;
Reg.RootKey := HKEY_CURRENT_USER ;
Reg.OpenKey('\Software\作成者名\プログラム名',True);
if (Reg.ValueExists('Form1Top')) then
F_F1Top := Reg.ReadInteger('Form1Top')
else
F_F1Top := 0 ;
if (Reg.ValueExists('Form1Left')) then
F_F1Left := Reg.ReadInteger('Form1Left')
else
F_F1Left := 100 ;
if (Reg.ValueExists('Form1Width')) then
F_F1Width := Reg.ReadInteger('Form1Width')
else
F_F1Width := 600 ;
if (Reg.ValueExists('Form1Height')) then
F_F1Height := Reg.ReadInteger('Form1Height')
else
F_F1Height := 400 ;
Reg.CloseKey ;
Reg.Free ;
//
Form1.Top := F_F1Top ;
Form1.Left := F_F1Left;
Form1.Width := F_F1Width;
Form1.Height := F_F1Height;
end; |
のようにします。
Aプロファイルファイル(〜.iniのファイル)を利用
プロファイルファイルの読み書きは Windows3.1時代からある機能です。TIniFileオブジェクトを利用する方法とWindowsAPIを利用する方法がありますが、私は後者を利用するユニットを作っておいて、それを利用しています。
プロファイルファイルは、Windowsフォルダ等に入れるスタイルが多かったのですが、アプリケーションをインストールするフォルダ内に入れておく方が管理しやすいので、アプリケーションプログラムの存在するパスを取得して利用します(Application.ExeName 又は ParamStr(0)で実行プログラムのファイル名がフルパス名で取得出来ますので、それを ExtractFilePath関数でパスを取り出したり、ChangeFileExt関数で拡張子を.iniに変更したりします)。
書き込みの場合には、
WritePrivateProfileString('Form','Left','0','〜.ini'); |
読み込みの場合には、
var
R: PChar ;
begin
R := StrAlloc(9);
GetPrivateProfileString('Form','Left','',R,9,'〜.ini');
(R値を処理)
StrDispose(R);
end; |
のようにします。WindowsAPIのため、各引数に変数を入れる場合には、PCHAR型である必要があります。
これよりも、TIniFileオブジェクトを使う方が簡単かもしれませんので興味のある方は書籍やヘルプ等を参考にしてみて下さい。
B独自形式のデータファイルを利用
これは、既に「ファイル」の章で述べたように、Memoコンポーネント、RichEditコンポーネント等を使ったり、ファイル変数を使って直接ファイル操作を行う等をして、アプリケーションプログラムと同じフォルダに設定用ファイルを作成し、読み込む手法です。自分の好きなように、やりやすいように作ってしまって構いませんが、後で自分が混乱しないように注意して下さい。(何行目に何の項目の値を入れたのか等を忘れてしまう、という事は結構よくありますので要注意です)
さて、今時の Windowsプログラミングでは、レジストリを利用してそこに各種設定値を読み書きするのがごく一般的のようです。しかし、レジストリに値を保存する量が多ければ多い程、レジストリの量はどんどん大きくなり、Windowsが遅くなってしまったり、不安定になってくるかもしれません。また、各種設定値を手動で変更したい場合等は、Windowsのレジストリエディタを使う必要があり、もし仮に変な箇所を触ってしまうと、Windowsが起動しなくなってしまう可能性がありますので注意が必要です。
そういった事が理由で、私自身、レジストリを操作するプログラミングは知識として知ってはいますが、そういったプログラムはほとんど作っておらず、未だに、.iniファイルを使っています。それが「古い」と言われるのは承知の上で、今後も、.iniファイルを使って行く事でしょう。この「CADつくろ!」コーナーでもそういう理由で、.iniファイルを使う事にします。勿論、「俺はレジストリでやる」という方は、どんどん自分なりのプログラミングを行って下さい。
ここまでのプログラムです。
【サンプルプログラムのソース】
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
▲PREV
▼NEXT
|