Delphi はじめの一歩

タブブラウザを作る

<Lesson25> タブを機能させる

子ウインドウとタブが連動するようにします。

エディタのCHILDWINタブを選択してください。
子ウインドウが作られた際に、タブも同時に作られるようにします。
IEWindowフォームのOnCreateイベントを下記のようにしてください。
下記のソースは、MainFormのTabControl1にタブを1つ追加し、同時に、自身を関連づけます。
TabControl1.Tabs.Add('NoName1');
で、NoName1という文字の入ったタブを追加することが出来ます。
TabControl1.Tabs.AddObject('NoName1',Child);
では、NoName1というタブを追加し、さらに、Child(ChildはTObject型の変数とする)と関連づける事が出来ます。
関連づけるオブジェクト(フォームやコンポーネント類)はTObject型でなくてはなりません。
ここでのSelfはIEWindowでTForm型なので、型キャストしないとここで使えませんから、Tobject(Self)とします。

[IEWindow OnCreateイベント]
procedure TIEWindow.FormCreate(Sender: TObject);
begin
  MainForm.TabControl1.Tabs.AddObject('',TObject(Self));
end;
Webページのタイトルが変わったら、自身のCaptionと対応するタブの文字も変えます。
下記のソースの
  i := MainForm.TabControl1.Tabs.IndexOfObject(TObject(Self));
で、自身と関連付けられてるタブのIndexを知ることが出来ます。
const Text:WideString とあるOnTitleChangeイベントの定数パラメータ Text は、新しいタイトルですので、次の
  MainForm.TabControl1.Tabs.Strings[i] := Text;
で、そのタブに表示されている文字を新しいタイトルに変えます。
それと、integerは整数型です。

[IEWindow WebBrowser1 OnTitleChangeイベント]
procedure TIEWindow.WebBrowser1TitleChange(Sender: TObject;
  const Text: WideString);
var
  i:integer;
begin
  Self.Caption := Text;
  i := MainForm.TabControl1.Tabs.IndexOfObject(TObject(Self));
  MainForm.TabControl1.Tabs.Strings[i] := Text;
end;
自身がアクティブになった時に、対応するタブもアクティブになるようにします。
TabIndexはアクティブなタブの番号です。
自身と対応するタブのIndexを代入すれば、そのタブがアクティブになります。

[IEWindow OnActivateイベント]
procedure TIEWindow.FormActivate(Sender: TObject);
var
  i:integer;
begin
  i := MainForm.TabControl1.Tabs.IndexOfObject(TObject(Self));
  MainForm.TabControl1.TabIndex := i;
  MainForm.Back1.Enabled := E.FBack;
  MainForm.Forward1.Enabled := E.FForward;
end;
自身を閉じるときに、対応するタブも同時に削除します。
TabControl1.Delete(i)でi番目のタブが削除されます。

[IEWindow OnCloseイベント]
procedure TIEWindow.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i:integer;
begin
  i := MainForm.TabControl1.Tabs.IndexOfObject(TObject(Self));
  MainForm.TabControl1.Tabs.Delete(i);
  if MDIChildCount = 1 then
  begin
    MainForm.Back1.Enabled := False;
    MainForm.Forward1.Enabled := False;
  end;
  Action := caFree;
end;
タブをクリックした時に、対応する子ウインドウがアクティブになるようにします。
今度はTabControl1のOnMouseDownイベントに書くので、エディタのタブをMAINに切り替えてください。
OnMouseDownイベントのパラメータ、Buttonは押されたマウスボタンの種類、Shiftはマウスボタンが押されたときの[Shift]や[Alt]が押されているかなど、X,Yはマウスボタンを押したポイント(位置)です。
TabControl1.IndexOfTabAt(X,Y)で、ポイント(X,Y)にあるタブの番号を知ることが出来ます。
そこにタブが無いと−1が返ってきます。
TabControl1.Tabs.Object[i]はi番目のタブと関連づけられたオブジェクトです。 それと、mbLeftは左ボタンで、ssDoubleはダブルクリックの意味です。
Child.BringToFrontでChildをアクティブにすることが出来ます。

[MainForm TabControl1 OnMouseDownイベント]
procedure TMainForm.TabControl1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i:integer;
  Child:TIEWindow;
begin
  i := TabControl1.IndexOfTabAt(X,Y);
  if (i > -1) and (Button = mbLeft) then
  begin
    if ssDouble in Shift then
    begin
      Child := TIEWindow(TabControl1.Tabs.Objects[i]);
      Child.Close;
    end
    else
    begin
      Child := TIEWindow(TabControl1.Tabs.Objects[i]);
      Child.BringToFront;
    end;
  end;
end;

>> Lesson26に進む