お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
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編纂委員会