|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Сохранение WEB страницы с вкладки WebBrowser
Доброго времени суток!
Сделал небольшое приложение, все получилось все работает. Но не могу разобраться с сохранением WEB страницы. По подробнее - на форме есть PageControl на которую помещен вэб-браузер. При работе вэб-браузер в процедуре WebBrowser1NewWindow2 создает вторую вкладку в PageControl, на нее кидает WebBrowser, в котором собственно и отображается результат. Простое сохранение в одном окне WebBrouser делал так: Код:
procedure TForm1.Button6Click(Sender: TObject); begin WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER); end; Все работает, все замечательно, вылетает диалоговое окно, выбираешь формат, сохраняешь. В данном случае получается две вкладки и когда вторая вкладка создана, при нажатии на кнопку "Сохранить" - он сохраняет первую вкладку WebBrouser. А как сохранить вторую? Мне нужен вариант сохранения именно с функциями OLECMDID enumeration, она же описана в коде выше. Перерыв кучу страниц в интернете, нормальных (да и ненормальных тоже) вариантов решения проблемы не нашел. Пытался использовать вариант такого плана (называется "Извращениям нет предела"): после того как на первой вкладке страница загружена, выполнила код, вывела результат в окно вэб-браузера на второй вкладке, убивал вкладку №1 - все равно - сохраняет только то, что грузилось в первой вкладке. P.S. Варианты cохранения с использованием CDO (Collaboration Data Objects) не рассматриваю, там "рак мозгов" полный. +100500 вариантов cdosys.dll - при подключении которых, или же вылетают ошибки о том, что такой dll просто нет в системе (хотя она установлена и зарегистрирована), или если брать готовые ***.pas модули то они все равно не работают, так как версии dll прописываются в реестре, а соответственно найти к какой dll относится ***.pas и как он был сделан нельзя, как правило ***.pas выложены без dll на базе которых они созданы. Спасибо заранее. Последний раз редактировалось LIONSMILE, 26.04.2018 в 07:14. |
#2
|
||||
|
||||
Добавлю немного.
Вот сам код програмки (чтобы было понятно как работает PageControl и WebBrouser): Код:
procedure TForm1.CreateNewTab(Title : string); //Создаем новую вкладку в PageControl var tabsheet : TTabSheet; WB : TWebBrowser; begin tabsheet := TTabSheet.Create(PageControl1); tabsheet.Visible := true; tabsheet.Caption := Title; tabsheet.PageControl := PageControl1; PageControl1.ActivePage := tabsheet; // Делаем новую вкладку активной WB := TWebBrowser.Create(self); // Создаем на ней WebBrowser TWinControl(WB).Parent := TabSheet; WB.Align := alClient; // Распахиваем его на всю вкладку WB.OnNewWindow2 := WebBrowser1NewWindow2; // Назначаем обработчик события OnNewWindow2 TabSheet.Tag := Integer(WB); // Запоминаем как браузер для TabSheet end; procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); begin CreateNewTab('Обработанный листинг кода'); // Создаем новую вклакду в PageControl ppDisp := TWebBrowser(PageControl1.ActivePage.Tag).DefaultDispatch; //Кладем на нее WebBrowser end; procedure TForm1.Button1Click(Sender: TObject); //Запрос на сайт (нажатие кнопки на сайте) var WB : TWebBrowser; begin html_tag:= WebBrowser1.OleObject.Document.forms.item(0).elements; for i:=0 to (html_tag.Length-1) do begin if html_tag.item(i).value = 'Show Highlighted' then //ищем элемент со значением "Show Highlighted" он же кнопка html_tag.item(i).click; // и нажимаем на него end; end; procedure TForm1.Button2Click(Sender: TObject); //Управление элементами на странице, закидываем текст и выбираем синтаксис begin html_tag:= WebBrowser1.OleObject.Document.forms.item(0).elements; for i:=0 to (html_tag.Length-1) do begin if html_tag.item(i).name = 'code' then //ищем элемент с именем "code" - поле для ввода кода html_tag.item(i).value:= (Memo1.Text); //и заливаем в него текст из Мемо if html_tag.item(i).name = 'class' then //ищем элемент с именем "Class" - выбираем в комбобоксе тип синтаксиса html_tag.item(i).value:= (ComboBox1.Text); //и присваиваем ему значение из комбобокс на форме (значения записаны в самом комбобокс) end; end; procedure TForm1.Button3Click(Sender: TObject); //Грузим исходный файл TXT, XML begin openDialog1.InitialDir := GetCurrentDir; if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName); end; procedure TForm1.Button4Click(Sender: TObject); //Сохраняем полученный документ в HTML, MHT файл на выбор при помощи функций OLE enumeration begin WebBrowser1.ExecWB(OLECMDID_Saveas,OLECMDEXECOPT_PROMPTUSER); end; procedure TForm1.Button5Click(Sender: TObject); //Выход begin close end; procedure TForm1.Button6Click(Sender: TObject); //Печатаем begin WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT); end; procedure TForm1.Button7Click(Sender: TObject); //Предпросмотр begin WebBrowser1.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT); end; procedure TForm1.ComboBox1Change(Sender: TObject); begin Button1.Enabled := True; Button2.Enabled := True; end; procedure TForm1.FormCreate(Sender: TObject); //загрузка стартовой страницы begin WebBrowser1.Navigate('http://www.planetb.ca/projects/syntaxHighlighter/'); end; Все работает нормально, проблемы только с сохранением, ну и предпросмотр соответственно показывает 1 вкладку браузера. Как победить пока не придумал. |
#3
|
|||
|
|||
C WB Не работал, но может вы про это?
Код:
WebBrowser1.OleObject.Document.frames.Length - 1 Написал до кода выше Последний раз редактировалось nixon232, 26.04.2018 в 09:00. |
#4
|
|||
|
|||
А так не пойдет? Выбрав нужный Док
Код:
var Doc: IHTMLDocument2; begin Doc := Webbrowser.Document as IHTMLDocument2; if doc <> nil then Doc.execCommand('Print',false,''); Doc := Nil; end; Последний раз редактировалось nixon232, 26.04.2018 в 09:15. |
#5
|
||||
|
||||
Спасибо большое, по сути сам код полностью рабочий, так же выкидывает диалоговое окно если "Print" заменить на "SaveAs", но все равно сохраняет только 1 вкладку. И еще один маленький минус, но его я могу обойти другим способом, в этом диалоговом окне нет такого типа файла как MHT - он же контейнер вэб-страницы.
Попытался впарить программе некий код, который открывает все вкладки в одном вэб-браузере. Код:
procedure TFormWeb.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext, bstrUrl: WideString); begin Cancel := True; WebBrowser1.Navigate(bstrUrl); end; |
#6
|
||||
|
||||
Да и посути метод execCommand, предоставляет команды для работы с контентом в редактируемой области, когда HTML документ переключен в режим редактирования (document.designMode). Но мне его пилить не надо Сохранить просто хочу)
|
#7
|
|||
|
|||
Понятно, что вариант так себе, но можно создать темповый вб, засунуть нужный документ, засейвить, удалить.
|
#8
|
||||
|
||||
Да нет, на самом деле вариант очень даже нормальный и использовать его можно вполне. Это кому как удобно как говорится. А что касаемо временного WB, так по сути на PageControl Он то и создается на время работы программы, причем при OnCreate формы он не отображается даже, а появляется потом в работе при WebBrowser1NewWindow2. Чот тут какая-то заморочка с этим WB, имхо нужно найти как обратиться к тому, который создается в Run-time. Не хочется строить аля "Рояль в кустах" - лепить на форму два WB - один из которых прятать. Хочется все как бы по уму сделать.
|
#9
|
|||
|
|||
Тогда вопрос можно поставить иначе: А ну ли вам он вообще. По сути вы его используете только для одной функции - отправки команд. Нужен ли для этого именно вб? можно по старинке использовать ту же indy,
|
#10
|
||||
|
||||
Быстрее оказалось накидать тестовый проект. Взял запчасти вашего листинга и добавил функционал, как понял Вашу задачу.
Не забывайте уничтожать динамически созданные объекты. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
LIONSMILE (26.04.2018)
|
#11
|
||||
|
||||
Спасибо огромное, все работает!
|