Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > TWebBrowser.ExecWB(OLECMDID_SAVEAS, 0) не работает


Автор: Delphist 3.10.2007, 16:23
У меня в БД (Firebird 2.0) в blob-поле хранятся html-страницы, а картинки на диске. В компонент WebBrowser: TWebBrowser, загружаются данные из БД через Document.write, для того чтобы сохранить страничку со всем её содержимым я использую метод 
WebBrowser.ExecWB(OLECMDID_SAVEAS, 0), но почему-то сохраняется пустая страница. Как быть?

Автор: December 3.10.2007, 16:47
Эта команда сохраняет только код старницы, на которую ты отнавигировался, а не результат деятельности яваскрипта и его аналогов.
Ты можешь брать HTML у DOM'a, тока он будет покорёженный до неузнаваемости. Можешь также просто хранить исходник рядом и не трогать встроенный в ТВебБроузер функции. Как ни странно, это самый "правильный" вариант.

Автор: Delphist 3.10.2007, 17:14
Цитата(December @  3.10.2007,  17:47 Найти цитируемый пост)
Ты можешь брать HTML у DOM'a, тока он будет покорёженный до неузнаваемости. Можешь также просто хранить исходник рядом и не трогать встроенный в ТВебБроузер функции. Как ни странно, это самый "правильный" вариант. 

Ты, наверное, немножко не понял. У меня есть БД, хранящая html-код, так вот конечный пользователь в моей программе, просматривает эти html-ки, а потом он захотел сохранить эту страницу со всеми картинками себе на диск в виде html-файла, как мне это сделать, применение WebBrowser.ExecWB(OLECMDID_SAVEAS, 0) сохраняет пустой html

Автор: December 3.10.2007, 18:42
Таки я понял правильно smile И мой предыдущий пост остаётся в силе. Поясню ещё раз. Если ты навигируешься на about:blank, то исходник является пустым. И метод document.write() ситуацию не меняет.

Могу ещё предложить сначала формировать страницу со всеми файлами и сохранять всё это на диск во временную локацию. В таком случае Save As будет работать... Но правильнее будет просто скопировать всю сгенерённую папку.

Автор: 2fank 22.10.2007, 18:54
А почему бы не использовать свой диалог сохранения?

например так:

Код

uses
   ActiveX;

function WB_SaveHTMLCode(WebBrowser: TWebBrowser; const FileName: TFileName): Boolean;
var
   ps: IPersistStreamInit;
   fs: TFileStream;
   sa: IStream;
begin
   ps := WebBrowser.Document as IPersistStreamInit;
   fs := TFileStream.Create(FileName, fmCreate);
   try
     sa := TStreamAdapter.Create(fs, soReference) as IStream;
     Result := Succeeded(ps.Save(sa, True));
   finally
     fs.Free;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveDialog1.Execute then
if SaveDialog1.FileName <> '' then
  WB_SaveHTMLCode(Webbrowser1, SaveDialog1.FileName);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)