Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TWebBrowser и копирование страницы в ПЕРЕМ

36K
14 декабря 2011 года
Pcrepair
64 / / 16.01.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;

Если кто в курсе, подскажите код
Заранее спасибо.
14
14 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
А в каком виде то он это все копирует?
36K
15 декабря 2011 года
Pcrepair
64 / / 16.01.2011
Цитата:

Phodopus
А в каком виде то он это все копирует?


в виде текстов, картинок, ссылок, заключенных в соответсвующие теги
если сделать для текущей страницы Ctrl+A Ctrl+C затем открыть ХТМЛ-редактор и сделать Ctrl+V то как раз и можно будет увидеть "в каком виде"

10
15 декабря 2011 года
Freeman
3.2K / / 06.03.2004
Удивляюсь, как человек, написавший не самый простой код по управлению браузером, сливается на такой простой вещи.

Во-первых, у TMemoryStream вроде было свойство, содержащее указатель на данные. Его можно передать в SetString вместе с длиной потока. Во-вторых, где-то в нутрях VCL даже был TStringStream, наследованный от TMemoryStream и имеющий свойство типа AsString. Пишу по памяти.

Всего-то надо было в справку заглянуть не полениться.
36K
15 декабря 2011 года
Pcrepair
64 / / 16.01.2011
никто никуда не сливается
этот код по кусочкам собирался из разных источников

сейчас нужно добавить еще кусочек - выделенное в браузе скопировать не в клипборд а в переменную.
Итак??? у кого есть конкретный код, ну что то типа

 
Код:
if (Webbrowser1.Document as IHTMLDocument2).queryCommandEnabled('Copy') then
  //WebBrowser1.ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DONTPROMPTUSER);
  HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
  PersistFile := HTMLDocument as IPersistFile;
  Application.ProcessMessages;
    begin
      Memo1.Clear;
      //Memo1.PasteFromClipboard;
      Memo1.Text := PersistFile; //тут компилятор говорит что типы перем не совпадают

но только работающий
10
15 декабря 2011 года
Freeman
3.2K / / 06.03.2004
Цитата: Pcrepair
этот код по кусочкам собирался из разных источников


:facepalm: Теперь понятно, почему Delphi-программистов считают маргиналами.

14
16 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Посмотрите в каком формате находится клипбоард после копирования. CF_?
36K
16 декабря 2011 года
Pcrepair
64 / / 16.01.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 почемуто неправильно копирует сслылки, к примеру
то что в коде страницы, ЕСЛИ ВРУЧНУЮ копировать в ХТМЛ-редактор
[HTML]<a target="_top" href="http://vkontakte.ru/login?act=forgot">[/HTML]
а вот это в коде самой страницы, отсутствует протокол и имя сервера
[HTML]<A href="/login?act=forgot" target=_top>Не можете войти?</A>[/HTML]
как такое вообще получается и что с этим можно сделать?
36K
17 декабря 2011 года
Pcrepair
64 / / 16.01.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; компилятор пишет: несовместипые типы
никто не в курсе что тут млжно сделать? чтоб в МЕМО поместить данные из буфера?
19K
18 декабря 2011 года
Alegun
269 / / 10.09.2010
Цитата: Pcrepair
...на строке Memo1 := HTML; компилятор пишет: несовместипые типы
никто не в курсе что тут млжно сделать? чтоб в МЕМО поместить данные из буфера?


Clipboard за раз может быть только один, поэтому при его очистке все данные пропадают. Memo1 может содержать лишь текстовую инфу и засунуть туда графику не получится - только в виде HTML-кода, отсюда и конфликт типов (Memo1 := HTML т.е. TMemo:=TClipboard? ) Нужно предварительно в клипборд класть HTML-код (CF_TEXT)

14
18 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Clipboard помнится синглтон.
36K
18 декабря 2011 года
Pcrepair
64 / / 16.01.2011
Цитата: Alegun
Нужно предварительно в клипборд класть HTML-код (CF_TEXT)



в буфер обмена содержимое страницы помещает вот этот код

Код:
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
  Application.ProcessMessages;
  WebBrowser1.ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DONTPROMPTUSER);
  Application.ProcessMessages;

если затем в ХТМЛ-редактор вставить содержимое буфера обмена, то все в норме, ссылки сохраняются в полном виде, даже если в исходном коде отсутствует протокол и имя сайта
в МЕМО содержимое буфера хотелось вставить в виде ХТМЛ-кода, с тега и тд, просто чтоб посмотреть что там и кто восстанавливает ссылки ИЕ8 или ХТМЛ-редактор
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог