PageControlでタブブラウザの情報管理は?

解決


武田  2006-05-20 20:55:41  No: 21677

皆様、お世話になります。環境はDelphi6  Personalです。
PageControlだけformに貼り付けて、タブブラウザを作成中です。
http://www.wwlnk.com/boheme/delphi/tips/tec1620.htm  を参考にしてます。
当初はTabControlで管理するタブブラウザを作成しましたが(  http://delphi.sakura.vg/index2.htmlを参考)、
これはTabControlの次のような機能で子フォームの情報を管理しているようです。
Form1.TabControl1.Tabs.AddObject('',TObject(Self));
ところが、PageControlで同じような管理をしようとプロパティにPagesがあるのですが違うようです。
【教えて頂きたいこと】
PageControlで各ページのURLや前進後進情報などどのように保存管理、取り出しするのかご教授をお願いいたします。
URLだけはStringListにいれて見ましたが、どうにも間が抜けているような気がします。
以下はすこし長くなりましたがヘルプやあちこちのサイトを参考にした作成中のコードです。
procedure TForm1.Navigate(const URL:string);//ナビゲートボタンで実行する
begin
  TabSheet  :=  TTabSheet.Create(Self);
  TabSheet.Parent       :=  PageControl1;
  TabSheet.PageControl  :=  PageControl1;
  TabSheet.Caption      :=  '';

  PageControl1.ActivePageIndex:=PageControl1.PageCount-1;//次の画面をアクティブにする
  WebBrowser1  :=  TWebBrowser.Create(Self);
  TOleControl(WebBrowser1).Parent  :=  TabSheet;
  //使うであろうイベントを明示的に記述しておく。
  WebBrowser1.Align      :=  alClient;
  WebBrowser1.OnCommandStateChange  := WebBrowser1CommandStateChange;//以下はprocedureを書いておく
  WebBrowser1.OnNavigateComplete2   := WebBrowser1NavigateComplete2;
  WebBrowser1.OnNewWindow2          := WebBrowser1NewWindow2;
  WebBrowser1.OnStatusTextChange    := WebBrowser1StatusTextChange;
  WebBrowser1.OnTitleChange         := WebBrowser1TitleChange;

  WebBrowser1.Navigate(URL, EmptyParam, EmptyParam,EmptyParam, EmptyParam);
end;
//画面が切り替わったときタイトルとURLを再表示する
procedure TForm1.PageControl1Change(Sender: TObject);
begin
    Form1.Caption := PageControl1.Pages[PageControl1.ActivePageIndex].Caption;
        //↓間が抜けているし、前進後進などの情報を再現できない
    ComboBox1.Text   := SiteRecList.Strings[PageControl1.ActivePageIndex];
end;
宜しくお願いいたします。m(_ _)m


  2006-05-20 23:04:38  No: 21678

こんな感じではどうでしょう?
戻る、進むの状態は、WebBrowserから引っ張り出すことも可能です。
長くなるので、ここでは簡単にCommandStateChangeイベントで記録する方法にしていますが、
本格的なブラウザを目指されているのなら、いずれ必要になると思います。
もし、ご興味があれば ITravelLogStg などを調べてみると良いでしょう。

type
  TTabSheetEx = class(TTabSheet)
  private
    WebBrowser: TWebBrowser;
    IsBack: Boolean;
    IsForward: Boolean;
  end;

procedure TForm1.AddTab(const Url: string);
var
  TabSheetEx: TTabSheetEx;
begin
  TabSheetEx:=TTabSheetEx.Create(PageControl1);
  TabSheetEx.WebBrowser:=TWebBrowser.Create(TabSheetEx);
  TOleControl(TabSheetEx.WebBrowser).Parent:=TabSheetEx;
  TabSheetEx.PageControl:=PageControl1;

  TabSheetEx.WebBrowser.OnCommandStateChange:=WebBrowserCommandStateChange;

  TabSheetEx.WebBrowser.Navigate(Url);
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  ComboBox1.Text:=(PageControl1.ActivePage as TTabSheetEx).WebBrowser.LocationURL;
//  戻るボタン.Enabled:=(PageControl1.ActivePage as TTabSheetEx).IsBack;
//  進むボタン.Enabled:=(PageControl1.ActivePage as TTabSheetEx).IsForward;
end;

procedure TForm1.WebBrowserCommandStateChange(Sender: TObject;
  Command: Integer; Enable: WordBool);
begin
  case Command of
    CSC_NAVIGATEBACK:
      ((Sender as TWebBrowser).Owner as TTabSheetEx).IsBack:=Enable;
    CSC_NAVIGATEFORWARD:
      ((Sender as TWebBrowser).Owner as TTabSheetEx).IsForward:=Enable;
  end;
end;


武田  2006-05-21 10:48:58  No: 21679

#さん。早速教えて頂いてありがとうございました。
詳細な説明でとても参考になります。じつは別にクラスを作成しなければ無理だなと漠然と考えていました(理屈は判りませんが)。そして「さてクラスにするのはPageControlなのか、TabSheetなのか、WebBrowserなのか?」・・・?と苦悶していました。
なにしろ、自前のプログラムでクラスを定義して作成した経験もない「駆け出し」な者ですから回答をみて、「やはりTabSheetの派生クラスを定義するだったのか」と光明が見えてきました。
あとは、ここから勉強して挑戦します。
ブラウザらしくするのには膨大なコードになると思いますので時間はかかりますが、こつこつやります。
目標とその方角がわかってとても助かりました。
ありがとうございます。m(_ _)m
では。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加