Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TWebBrowser и копирование страницы, в переменную 
:(
    Опции темы
Pcrepair
Дата 14.12.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Добрый день. Есть простой код браузера, позволяющий скачать странцу, "выделить все" на странице и скопировать в буфер обмена ОС. все работает (кроме ХТМЛ-страниц с фреймами, там ничего не выделяется)
Но использовать Буфер обмена нежелательно, его могут использовать и другие программы что может привести к ошибкам
вот текущий код:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  URL, Flags, TargetFrameName, PostData, Headers: Olevariant;
begin
  URL := Edit1.Text;
  Flags := 0;
  TargetFrameName := 0;
  Postdata := 0;
  Headers := 0;
  EmptyParam;
  WebBrowser1.Navigate(URL, Flags, TargetFrameName, PostData, Headers);
  repeat
    Application.ProcessMessages;
  until WebBrowser1.ReadyState >= READYSTATE_COMPLETE;
  if WebBrowser1.Document <> nil then
  (Webbrowser1.Document as IHTMLDocument2).ParentWindow.Focus;
  WebBrowser1.ExecWB(OLECMDID_SELECTALL,OLECMDEXECOPT_DONTPROMPTUSER);
  Application.ProcessMessages;
  if (Webbrowser1.Document as IHTMLDocument2).queryCommandEnabled('Copy') then
  WebBrowser1.ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DONTPROMPTUSER); //вот тут копируем в буфер обмена
  Application.ProcessMessages;
end;

initialization
  Set8087CW($133F);
  OleInitialize(nil);
finalization
  OleUninitialize;
end.

ВОПРОС: каким образом копировать содержимое страницы в ПЕРЕМ?
Наверно что то вроде:
Код

var
HTML : TMemoryStream; //та самая ПЕРЕМ, далее остальной код, меняем {WebBrowser1.ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DONTPROMPTUSER);} на что то типа

if (Webbrowser1.Document as IHTMLDocument2).queryCommandEnabled('Copy') then
  begin
    HTML := TMemoryStream.create; //создадим поток
     вот тут какой то код, который переносит в ПЕРЕМ содержимое контейнера браузера
  end;
Application.ProcessMessages; //хотя зачем это несовсем понятно
end;

Если кто в курсе, подскажите код
Заранее спасибо.
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
MetalFan
Дата 14.12.2011, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



зачем же через буфер обмена?
IHTMLDocument2.Body.innerHTML (или outerHTML) ?

з.ы. поправь заголовк темы. а то там кто-то кого-то куда-то вПЕР..


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Pcrepair
Дата 15.12.2011, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Цитата

зачем же через буфер обмена?
IHTMLDocument2.Body.innerHTML (или outerHTML) ?

через буфер обмена не надо, надо в ПЕРЕМенную. вопрос в том как это сделать корректно

Цитата

з.ы. поправь заголовк темы. а то там кто-то кого-то куда-то вПЕР..

что то не нашел где править?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
MetalFan
Дата 15.12.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Pcrepair @  15.12.2011,  13:50 Найти цитируемый пост)
как это сделать корректно


Цитата(MetalFan @  14.12.2011,  17:55 Найти цитируемый пост)
IHTMLDocument2.Body.innerHTML (или outerHTML) ?

?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Pcrepair
Дата 16.12.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



приискал вот такое решение

Код

var
  Form1: TForm1;
  MS : Variant;

.....................
if (Webbrowser1.Document as IHTMLDocument2).queryCommandEnabled('Copy') then
  Application.ProcessMessages;
  MS := (WebBrowser1.Document as IHTMLDocument2).body.innerHTML;
  begin
     MEMO;
  end;
end;

procedure TForm1.MEMO; // для проверки
    begin
      Memo1.Clear;
      Memo1.Text := MS;
    end;



но .body.innerHTML почемуто неправильно копирует сслылки, к примеру
то что в коде страницы, ЕСЛИ ВРУЧНУЮ копировать в ХТМЛ-редактор

Код

<a target="_top" href="http://vkontakte.ru/login?act=forgot">Не можете войти?</A>


а вот это в коде самой страницы, отсутствует протокол и имя сервера

Код

<A href="/login?act=forgot" target=_top>Не можете войти?</A>


как такое вообще получается и что с этим можно сделать?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
MetalFan
Дата 16.12.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Pcrepair @  16.12.2011,  17:56 Найти цитируемый пост)
как такое вообще получается и что с этим можно сделать? 

ну какбы такую сервер отдает страницу. Зачем ему прописывать полные пути то?
А браузер видимо уже автоматом подставляет текущий протокол, сервер, порт, путь и т.п.
Что сделать - а надо ли что-то с этим делать то? если да, то "пробежаться" по всем anchor'ам и допрописать нужную информацию в href.
Хотя возможно есть стандартный способой, но я его не знаю.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Pcrepair
Дата 17.12.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



вот еще вариант
- копируем в буфер обмена
- из буфера обмена копируем в ПЕРЕМ типа HTML : TClipboard;
- обнуляем буфер обмена. времени на это пойдет миллисекунды, вероятность размещения в буфере данных из других программ практически сходит на нуль
- копируем из ПЕРЕМ в МЕМО, для контроля
итого
Код


WebBrowser1.ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DONTPROMPTUSER);
  Application.ProcessMessages;
  begin
      HTML.Free; //обнуляем ПЕРЕМ перед новым циклом
      HTML := TClipboard.Create;
      HTML := Clipboard; //копируем содер. Буфера в ПЕРЕМ типа строка
      Clipboard.Clear;  //очищаем Буфер обмена
      Memo1.Clear;  //очистить МЕМО
      Memo1 := HTML;  //копировать содержимое в МЕМО из ПЕРЕМ
  end;
end;


но вот проблема - на строке Memo1 := HTML; компилятор пишет: несовместипые типы
никто не в курсе что тут млжно сделать? чтоб в МЕМО поместить данные из буфера?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
MetalFan
Дата 17.12.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Pcrepair, да что-то жесть какая-то понаписана...
Код

uses Clipbrd;
...
var
  ClipboardText: string;
...
  ClipboardText := Clipboard.AsText;
  



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Pcrepair
Дата 17.12.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Теперь компилятор компилирует
Код

begin
      //HTML.Free; //обнуляем ПЕРЕМ перед новым циклом
      //HTML := TClipboard.Create;
      HTML := Clipboard.AsText; //копируем содер. Буфера в ПЕРЕМ типа строка
      Clipboard.Clear;  //очищаем Буфер обмена
      Memo1.Clear;  //очистить МЕМО
      Memo1.Text := HTML;  //копировать содержимое в МЕМО из ПЕРЕМ
  end;
end;

НО..... в МЕМО выводится только тестовая часть страницы, а ХТМЛ-код пропал
может можно что то типа HTML := Clipboard.AsHtml; ????
Еще раз, если в автомате сделать КОНТР+А и КОНТР+С (это делает выше стоящий код) то, если вставить потом код в ХТМЛ-редактор, там ссылки имеют полный путь. просто хотелось проверить, что на самом деле содержит буфер обмена ОС, действительно Ишак ссылки восстановил, или все же это работа ХТМЛ-редактора
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
MetalFan
Дата 18.12.2011, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



В общем приятных извращений с буфером.
Я предложил внятный и самый на мой взгляд правильный вариант (через innerHTML). 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.