[Delphi:90041] WebBrowserで編集・保存した後の再読み込みを行いたい。

584 views
Skip to first unread message

石澤 一幸

unread,
Nov 7, 2007, 2:21:39 AM11/7/07
to Del...@ml.users.gr.jp
石澤と申します。

現在 WebBrowserコンポーネントを使ってプログラムを作成しております。

以下のものをusesで追加し

uses MSHTML, ActiveX;

編集モードにすることで編集はできました。
(WebBrowser1.Document as IHTMLDocument2).designMode := 'on';

保存する際
以下のように保存しておりますが、このときに保存ダイアログが表示され
自由に保存先を指定できます。
(WebBrowser1.Document as IHTMLDocument2).execCommand('SaveAs', False, '');

このときに指定されたファイル名の取得をおこない再表示を行いたいのですが
取得方法がわかりません。

Delphiに付属しているSaveDialog等を使えば保存したファイル名は取得
取得できるのですが、編集を加えると自動的にWebBrowser側の保存ダイアログも
表示されてしまい、保存ダイアログが2回表示されてしまいます。

WebBrowserからの保存ダイアログの保存先パスの取得方法もしくは
WebBrowserからの保存ダイアログを表示させない方法
がありましたらご教授ください。


環境
Delphi5
windowsXP
IE6


suz1...@yahoo.co.jp

unread,
Nov 7, 2007, 9:27:39 AM11/7/07
to Del...@ml.users.gr.jp
鈴木@EcoSoftです。

---[[Delphi:90041] WebBrowserで編集・保存した後の再読み込みを行いたい。]への返信です。---
> WebBrowserからの保存ダイアログの保存先パスの取得方法もしくは
> WebBrowserからの保存ダイアログを表示させない方法
> がありましたらご教授ください。

上記の実現方法は分かりませんが、execCommand を使って保存する代わりに、
Document3 から HTML を取得してアプリ側で保存することでファイル名の問題は
回避できると思います。

保存時の文字セットはアプリ側で設定する必要があると思いますが...

---
// 鈴木 充 <http://www.geocities.jp/eco21426/>


石澤 一幸

unread,
Nov 7, 2007, 10:36:16 PM11/7/07
to Del...@ml.users.gr.jp
鈴木さん、こんにちは

>上記の実現方法は分かりませんが、execCommand を使って保存する代わりに、
>Document3 から HTML を取得してアプリ側で保存することでファイル名の問題は
>回避できると思います。

まだ実装はしていないのですが、
編集モードで編集した場合、アプリ側で保存した場合
再読み込み時に保存Daialogが表示されるのではないでしょうか?
Document2ではそうでした。

問題点がうまく表現できていなかったようなので
以下にソースを提示いたします。

手順としては
1.適当なHTML,HTMファイルを指定して開く
2.適当に編集を行う
3.保存ボタン押下(保存ダイアログ表示)

問題点
**別名で保存されたときにファイル名がわからない
**アプリ側で保存する場合、ファイル名はわかるが再読み込みした際
 現在表示されているファイルの内容が変更されているので保存ダイアログが表示される

ファイル名が取得できるか再読み込み時の保存ダイアログ表示の抑止が
できればと思っております。

以上 よろしくお願いします。


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, SHDocVw;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

uses MSHTML, ActiveX;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin


(WebBrowser1.Document as IHTMLDocument2).execCommand('SaveAs', False, '');

//ここでNavigateして再読み込みを行いたい

WebBrowser1.Navigate('hogehoge') ;

//*****問題点1*********
//ファイル名が取得できないためNavigateできない

//*****問題点2*******
//execCommandを使用しないで保存した場合にも
//Naviagateかけた時に保存確認ダイアログが表示されてしまう。
//***********

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption:='保存';
Button2.caption:='閉じる';
//読み込み
WebBrowser1.Navigate('c:\test.htm') ;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;


procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
//編集モードへ


(WebBrowser1.Document as IHTMLDocument2).designMode := 'on';

end;

initialization
OleInitialize(nil);

finalization
OleUninitialize;

end.


Takashi Ishikawa

unread,
Nov 7, 2007, 11:47:20 PM11/7/07
to Del...@ml.users.gr.jp
石澤さん、こんにちは。

石川と申します。


> 再読み込み時に保存Daialogが表示されるのではないでしょうか?
そうなると思います。ただしこれは編集モードの状態でNavigateしようとしたとき
の場合です。
designModeをoffにしてからNavigateすれば確認ダイアログは表示されないと思いま
す。

流れはこんな感じになるでしょうか。
・アプリケーション側で用意した保存処理を行う
・designModeをoffにする
・保存したファイルへNavigateする(このあとDocumentCompleteが呼ばれて、再び編
集できるようになると思います)


お役にたてれば幸いです。


--
****************************************
石川 貴士
Takashi Ishikawa
筑波大学第三学群情報学類
i04...@coins.tsukuba.ac.jp
****************************************

石澤 一幸

unread,
Nov 8, 2007, 12:28:35 AM11/8/07
to Del...@ml.users.gr.jp
鈴木様、石川様ありがとうございます。

保存部分を以下のようにすることで無事できました。
閲覧モードへ戻す処理を実際にはいれてあったんですが
Navigateの後、読み込まれたタイミングで閲覧モードにしておりました。

単純なミスですね。ただexecCommandではファイル名が取得できなそうなので
Memoコンポーネントでソースを保存するようにしました。

無事できましたので以下に修正部分だけ載せておきます。


Memoコンポーネント追加

 //閲覧モードへ戻す
(WebBrowser1.Document as IHTMLDocument2).designMode := 'off';

if SaveDialog1.Execute Then
begin
//Memoへ内容を保存後Save
memo1.text:=WebBrowser1.OleObject.Document.documentElement.innerHTML;
memo1.Lines.SaveToFile(SaveDialog1.FileName);
//再読み込み
WebBrowser1.Navigate(SaveDialog1.FileName);
End;

-


Reply all
Reply to author
Forward
0 new messages