|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
前回終了位置に、メインフォーム、サブフォームを表示するのにレジストリ
ーを使たいのですが。また、レジストリー削除の方法はありますか?
[A]
メインフォーム Form1 に、サブフォーム Form2 表示のためのボタン、サ
ブフォームにメインフォーム表示のためのボタンをつけて、フォームの位置
を変えながら
Hide; Form2.Show;
Hide; Form1.Show;
を繰り返してみると、起動後のそれぞれのフォームは、何もコーディングし
なくても、一度変えた表示位置に、再び表示されることが分かります。しか
し終了して再起動すると、変えた位置は保存されていません。
当たり前のことかも知れませんが、これで、位置情報は、FormClose で保
存し、FormCreate で取り出せばよいことが分かります(FormShow、FormHide
では不必要)。
さて、フォームの位置といえば、Form のプロパティーに Left や Top が
あります。単にこれを保存し、また、これで設定することはできないでしょ
うか?(GetWindowPlacement とか、SetWindowPlacement など使わずに。)
以下の例では、レジストリー、
HKEY_CURRENT_USER\Software\DelphiApp\(アプリケーション名)
に、Form1、Form2 それぞれの Left、Top を保存し、また取り出して、この
ことを実現しています。
また、Form1 にチェックボックス CheckBox1(Caption:='Erase') を置き
これにチェックが入ってクローズした場合、このレジストリー情報を削除す
るようにしています。
[例]
{----Form1------------------------------------------------}
unit FormPosr;
interface
uses
..(略).., Registry;
type
TForm1 = class(TForm)
OkBitBtn1: TOkBitBtn;
CheckBox1: TCheckBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure OkBitBtn1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
FRegIniFile: TFilename;
RegIni: TRegIniFile;
end;
var
Form1: TForm1;
implementation
uses FormPoss;
{$R *.DFM}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if CheckBox1.Checked then begin
if RegDeleteKey(HKEY_CURRENT_USER,'Software\DelphiApp\')=
ERROR_SUCCESS then
ShowMessage('フォーム位置のレジストリー情報が削除されました!')
end else begin
RegIni:=TRegIniFile.Create(FRegIniFile);
try
with RegIni do begin
WriteInteger('Main','Left',Left);
WriteInteger('Main','Top',Top);
end;
finally
RegIni.Free;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FRegIniFile:='Software\DelphiApp\'+
ChangeFileExt(ExtractFilename(Application.Exename),'');
RegIni:=TRegIniFile.Create(FRegIniFile);
try
with RegIni do begin
Left:=ReadInteger('Main','Left',Left);
Top:=ReadInteger('Main','Top',Top);
end;
finally
RegIni.Free;
end;
end;
procedure TForm1.OkBitBtn1Click(Sender: TObject);
begin
Hide;
Form2.Show;
end;
end.
{----Form2------------------------------------------------}
unit FormPoss;
interface
uses
..(略).., Registry;
type
TForm2 = class(TForm)
OkBitBtn1: TOkBitBtn;
procedure OkBitBtn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form2: TForm2;
implementation
uses FormPosr;
{$R *.DFM}
procedure TForm2.OkBitBtn1Click(Sender: TObject);
begin
Close;
Form1.Show;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.RegIni:=TRegIniFile.Create(Form1.FRegIniFile);
try
with Form1.RegIni do begin
WriteInteger('Sub','Left',Left);
WriteInteger('Sub','Top',Top);
end;
finally
Form1.RegIni.Free;
end;
Form1.Show;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Form1.RegIni:=TRegIniFile.Create(Form1.FRegIniFile);
try
with Form1.RegIni do begin
Left:=ReadInteger('Sub','Left',Left);
Top:=ReadInteger('Sub','Top',Top);
end;
finally
Form1.RegIni.Free;
end;
end;
end.
#(1) 最初、これに似た方法でやってみたらうまく行きませんでした。
#(2) Oh!No!さんのWindows APIを使うしか方法がないかと思っていま
した。
#(3) Duke さんが iniファイルを使う方法を書かれており、もう一度やって
みたらうまく行きました。(1)でうまく行かなかった原因の一つは、フォーム
のPositionプロパティーがpoScreenCenterだったことでした。ここでは、
ディフォルトのpoDesignedのままです。
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|