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;
|