複数のWebBrowserをDELPHIから操作

解決


mizuki  2014-08-07 00:12:33  No: 46546

WinXP+D6persoalです。
以前こちらで教えていただいた下記の方法でWebBrowser1上にGoogleMapを表示してDelphi上の各種ボタンを押すと地図の中心が移動してマーカーが表示されるようにしてうまく動いていました。これを改造してWebBrowser2を追加して広域の地図をサムネールのように表示させようと考えました。WebBrowser2にHTML地図は表示できたのですが、この地図をWebBrowser1と同様に動かしたいのですが方法がわかりませんので教えてください。

 private
    HTMLWindow2: IHTMLWindow2;
(中間省略)

procedure TForm1.FormCreate(Sender: TObject);
begin
  form1.webbrowser1.Navigate('d:\map\kanagawa.html');
  HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow;
end;

procedure TForm1.Button1Click(Sender: TObject);   
var
  dlat,dlon:string;
begin  
                dlat:='35.3';  dlon:='139.3';
    form1.HTMLWindow2.execScript('GotoLatLng(' + dlat + ',' + dlon + ')', 'JavaScript');
                form1.HTMLWindow2.execScript('PutMarker(' + dlat + ',' + dlon + ')', 'JavaScript');

end;


Harry  2014-08-07 20:06:42  No: 46547

>D6persoal
Delphi6 Personal ですね。私も愛用してます。
検索性向上のため、識別子となる名称の綴りはお間違え無きようご注意…。

>以前こちらで教えていただいた下記の方法
タイトルとURLをください。差し支えあるなら提示されなくても結構です…。

>WebBrowser2にHTML地図は表示できたのですが、この地図をWebBrowser1と同様に動かしたい
WebBrowser1と同様にすれば良いのでは…?

どのような点が分からないのか、分かりません。


mizuki  2014-08-07 23:46:56  No: 46548

Harry様  早速のご回答をありがとうございます。

DelphiからHTMLを操作することに関する基本的な理屈もわからずに質問させていただき失礼しますが教えてください。
WebBrowser1での成功例を真似て下記のコメント行のようにWebBrowser2、HTMLWindow3などを追加してみましたがどうしても動きません。
ParenrWindowのところで引っかかっているのですがその対処が分からず質問させていただきました。

 private
    HTMLWindow2: IHTMLWindow2;
    HTMLWindow3: IHTMLWindow3;  // 追加

(中間省略)

procedure TForm1.FormCreate(Sender: TObject);
 begin
 form1.webbrowser1.Navigate('d:\map\kanagawa.html');
 HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow;

 form1.webbrowser2.Navigate('d:\map\kanagawa_L.html');  // 広域図追加  これは表示OK
 //HTMLWindow3 := (WebBrowser2.Document as IHTMLDocument3).parentWindow;
      //ここで「未定義の識別子  'ParentWindow’」のエラーが出る 
end;

 procedure TForm1.Button1Click(Sender: TObject);   
 var
 dlat,dlon:string;
 begin 
     dlat:='35.3';  dlon:='139.3';
     form1.HTMLWindow2.execScript('GotoLatLng(' + dlat + ',' + dlon + ')', 'JavaScript');
     form1.HTMLWindow2.execScript('PutMarker(' + dlat + ',' + dlon + ')', 'JavaScript');
 end;

//procedure TForm1.Button2Click(Sender: TObject);   
// var
//   dlat,dlon:string;
// begin 
//     dlat:='35.4';  dlon:='139.4';
//     form1.HTMLWindow3.execScript('GotoLatLng(' + dlat + ',' + dlon + ')', 'JavaScript');
//     form1.HTMLWindow3.execScript('PutMarker(' + dlat + ',' + dlon + ')', 'JavaScript');
// end;

Personalのスペルミス、失礼しました。
以前HTMLで得られた緯度、経度をDELPHI側で取得する方法をお伺いしました時に教えていただいたか、それに関連して知った方法です。


take  2014-08-08 19:00:23  No: 46549

> WebBrowser2、HTMLWindow3などを追加してみましたがどうしても動きません。

> HTMLWindow2: IHTMLWindow2;
> HTMLWindow3: IHTMLWindow3;  // 追加

型がIHTMLWindow3に変更されていますが「getElementById」を使うということですか?

webbrowser1とwebbrowser2の定義部が無いのでわかりませんが
この質問内容ですと
ブラウザ表示WebBrowser1とWebBrowser2はまったく同じクラスですから

同じ事をするだけなのに方法がわかりませんという質問になって
回答者が???になります。


mizuki  2014-08-08 20:39:36  No: 46550

take様  回答いただきありがとうございます。

前回の記述に誤りがあり、困惑されましたことをお詫びします。
WebBrowser1とWebBrowser2にZiimだけ異なるが他は同じGoogleMap用のHTMLを読ませてDelphiから指定位置に移動しようとして、Browser1に指定したものを真似して書いたものです。
基本的なことを理解できていないでの質問であることをご容赦ください。
やりたいことは(もしもできるのであれば)以下のようなことです。

procedure TForm1.Button1Click(Sender: TObject);   
  var
  dlat,dlon:string;
  begin 
      dlat:='35.3';  dlon:='139.3';
      form1.HTMLWindow2.execScript('GotoLatLng(' + dlat + ',' + dlon + ')', 'JavaScript');
      form1.HTMLWindow2.execScript('PutMarker(' + dlat + ',' + dlon + ')', 'JavaScript');
  
 //     form1.HTMLWindow3.execScript('GotoLatLng(' + dlat + ',' + dlon + ')', 'JavaScript');
 //     form1.HTMLWindow3.execScript('PutMarker(' + dlat + ',' + dlon + ')', 'JavaScript');
  end;


take  2014-08-08 21:49:41  No: 46551

> Ziimだけ異なるが他は同じGoogleMap用のHTMLを読ませて

まずはこれを元のWebBrowser1にて動作確認してみましょう

WebWebBrowser1、WebBrowser2を使うのはそれからですね。

> HTMLWindow2: IHTMLWindow2;
> HTMLWindow3: IHTMLWindow3;  // 追加

左側は名称ですので重複できないということで数字を増やしても良いですが
右側は「型」です。
今回は偶然使えましたが、IHTMLWindow8までしか存在しません


Harry  2014-08-08 23:01:04  No: 46552

>前回の記述に誤りがあり、
どこが誤りだったのか、正しくは何なのかを具体的に提示していただかないと、
mizukiさんがどのように理解されてるのか分かりません。

>WebBrowser1とWebBrowser2にZiimだけ異なるが他は同じGoogleMap用のHTMLを読ませて
Ziimというキーワードが分かりません…ので、これはスルーします。

すでにtakeさんから十分な回答がありますが、より詳しく。

>HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow;

>  form1.webbrowser2.Navigate('d:\map\kanagawa_L.html');  // 広域図追加  これは表示OK
>  //HTMLWindow3 := (WebBrowser2.Document as IHTMLDocument3).parentWindow;
>       //ここで「未定義の識別子  'ParentWindow’」のエラーが出る

takeさんからの指摘の通り、「未定義の識別子 'ParentWindow'」となるのは
  WebBrowser2.Document as IHTMLDocument3
のように、IHTMLDocument3にキャストしているため、parentWindowプロパティが存在しないためです。
詳しくはIHTMLDocument2やIHTMLDocument3で検索してみてください。

なので、as IHTMLDocument3を、as IHTMLDocument2に直します。
また、以下も同様にIHTMLWindow3をIHTMLWindow2に直します。
>    private
>      HTMLWindow2: IHTMLWindow2;
>      HTMLWindow3: IHTMLWindow3;  // 追加

なお、Delphi6 Personalが入ってるマシンが猛暑により?不調のため、確認は出来ておりません。
あしからずご了承ください。


mizuki  2014-08-08 23:15:53  No: 46553

take様  IHTMLWindow2というものが「型である」というアドバイスをいただき試したところ見事に動きました。
未熟な質問にご回答いただき感謝いたします。ありがとうございました。

他にはこんな問題を抱えている方も少ないとは思いますが動いたコードを書かせていただきます。

 private
    HTMLWindow2: IHTMLWindow2;
    HTMLWindow3: IHTMLWindow2;  // IHTMLWindow3 から2に変更
 (中間省略)

procedure TForm1.FormCreate(Sender: TObject);
  begin
  form1.webbrowser1.Navigate('d:\map\kanagawa.html');
  form1.webbrowser2.Navigate('d:\map\kanagawa_L.html');  // 広域図

  HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow;
  HTMLWindow3 := (WebBrowser2.Document as IHTMLDocument2).parentWindow;

end;

  procedure TForm1.Button1Click(Sender: TObject);   
  var
  dlat,dlon:string;
  begin 
      dlat:='35.3';  dlon:='139.3';
      form1.HTMLWindow2.execScript('GotoLatLng(' + dlat + ',' + dlon + ')', 'JavaScript');
      form1.HTMLWindow2.execScript('PutMarker(' + dlat + ',' + dlon + ')', 'JavaScript');

      form1.HTMLWindow3.execScript('GotoLatLng(' + dlat + ',' + dlon + ')', 'JavaScript');
      form1.HTMLWindow3.execScript('PutMarker(' + dlat + ',' + dlon + ')', 'JavaScript');
  end;


mizuki  2014-08-09 02:14:37  No: 46554

Harry様  詳細なご回答をありがとうございました。
本番開発中のものに実装して動作を確認していましたがうまく動きました。
Harry様の書き込み時刻とこちらの書き込みが前後してしまい申し訳ありませんでした。
何も知らずにIHTMLDocument2というのが3,4と増やせるのではないかと思って試していたのですが今回の質問でその誤りがわかりました。
初歩的な質問にも関わらず皆様からご丁寧な回答をいただき本当にありがとうございました。

(Ziim => Zoom タイプミス失礼しました)


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

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






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