Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.04.2018, 07:06
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сохранение 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  
Старый 26.04.2018, 08:56
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Добавлю немного.
Вот сам код програмки (чтобы было понятно как работает 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  
Старый 26.04.2018, 08:58
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

C WB Не работал, но может вы про это?
Код:
WebBrowser1.OleObject.Document.frames.Length - 1
..
Написал до кода выше

Последний раз редактировалось nixon232, 26.04.2018 в 09:00.
Ответить с цитированием
  #4  
Старый 26.04.2018, 09:13
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

А так не пойдет? Выбрав нужный Док
Код:
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  
Старый 26.04.2018, 09:49
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое, по сути сам код полностью рабочий, так же выкидывает диалоговое окно если "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  
Старый 26.04.2018, 09:58
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да и посути метод execCommand, предоставляет команды для работы с контентом в редактируемой области, когда HTML документ переключен в режим редактирования (document.designMode). Но мне его пилить не надо Сохранить просто хочу)
Ответить с цитированием
  #7  
Старый 26.04.2018, 10:23
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Понятно, что вариант так себе, но можно создать темповый вб, засунуть нужный документ, засейвить, удалить.
Ответить с цитированием
  #8  
Старый 26.04.2018, 10:42
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да нет, на самом деле вариант очень даже нормальный и использовать его можно вполне. Это кому как удобно как говорится. А что касаемо временного WB, так по сути на PageControl Он то и создается на время работы программы, причем при OnCreate формы он не отображается даже, а появляется потом в работе при WebBrowser1NewWindow2. Чот тут какая-то заморочка с этим WB, имхо нужно найти как обратиться к тому, который создается в Run-time. Не хочется строить аля "Рояль в кустах" - лепить на форму два WB - один из которых прятать. Хочется все как бы по уму сделать.
Ответить с цитированием
  #9  
Старый 26.04.2018, 11:03
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Тогда вопрос можно поставить иначе: А ну ли вам он вообще. По сути вы его используете только для одной функции - отправки команд. Нужен ли для этого именно вб? можно по старинке использовать ту же indy,
Ответить с цитированием
  #10  
Старый 26.04.2018, 15:41
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Быстрее оказалось накидать тестовый проект. Взял запчасти вашего листинга и добавил функционал, как понял Вашу задачу.

Не забывайте уничтожать динамически созданные объекты.
Вложения
Тип файла: zip test.zip (243.1 Кбайт, 4 просмотров)
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение:
LIONSMILE (26.04.2018)
  #11  
Старый 26.04.2018, 20:34
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо огромное, все работает!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter