Delphi はじめの一歩

タブブラウザを作る

<Lesson22> アクティブなウインドウが変わった時の処理

子ウインドウの[戻る]と[進む]の押せるかどうかの状態を、それぞれの子ウインドウに記憶させといて、アクティブな子ウインドウが切り替わったときに、それに合わせて、BackButtonとForwardButtonの状態も変化させます。

まず、エディタのCHILDWINタブを選びます。
そしたら、下図のように、usesにMAINを追加してください。
こうしないと、IEWindow側から、MainFormのコンポーネントを操作出来ません。
左図のように、typeに
  TEnabled = record
    FBack:Boolean;
    FForward:Boolean;
  end;
と追加し、privateに
  E:TEnabled;
と追加してください。
recordは複数の変数を一緒に扱いたい時に使います。
FBackに戻れるかどうかを、FForwardに進めるかどうかを格納します。
上記のソースはTEnabledという、Boolean型の変数を2つ持つレコード型をつくり、EというTEnabled型の変数を作っています。
Boolean型の変数には、TrueかFalseかを格納できます。
TEnabled、FBack、FForwardは自分で勝手に付けた名前で、違う名前を付けてもOKです。
戻れるかどうか、または進めるかどうかの状態は、アクティブな子ウインドウ以外は変化しないはずなので、変化したと云う事は自身がアクティブなので、状態をEに格納すると同時に、ボタンの状態も変化させます。
レコード型が持つ変数(例えばTEnabledに対するFForward)を扱うときは、例えばこの場合だと、下記のようにE.FForwardという風にします。

[IEWindow WebBrowser1 OnCommandStateChangeイベント]
procedure TIEWindow.WebBrowser1CommandStateChange(Sender: TObject;
  Command: Integer; Enable: WordBool);
begin
  case Command of
    CSC_NAVIGATEFORWARD:
    begin
      E.FForward := Enable;
      MainForm.Forward1.Enabled := Enable;
    end;
    CSC_NAVIGATEBACK:
    begin
      E.FBack := Enable;
      MainForm.Back1.Enabled := Enable;
    end;
  end;
end;
もし、子ウインドウを閉じたときに、それが最後の1つで、子ウインドウが1つも開いていない状態になるのなら、[戻る]も[進む]も押せないように変化させます。

[IEWindow OnCloseイベント]
procedure TIEWindow.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if MDIChildCount = 1 then
  begin
    MainForm.Back1.Enabled := False;
    MainForm.Forward1.Enabled := False;
  end;
  Action := caFree;
end;
自身がアクティブになった時に、自身の[戻る]と[進む]の状態をボタンに反映させます。

[IEWindow OnActivateイベント]
procedure TIEWindow.FormActivate(Sender: TObject);
begin
  MainForm.Back1.Enabled := E.FBack;
  MainForm.Forward1.Enabled := E.FForward;
end;

>> Lesson23に進む