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.
TWebBrowser и копирование страницы в ПЕРЕМ
Но использовать Буфер обмена нежелательно, его могут использовать и другие программы что может привести к ошибкам
вот текущий код:
Код:
ВОПРОС: каким образом копировать содержимое страницы в ПЕРЕМ?
Наверно что то вроде:
Код:
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;
HTML : TMemoryStream; //та самая ПЕРЕМ, далее остальной код, меняем {WebBrowser1.ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DONTPROMPTUSER);} на что то типа
if (Webbrowser1.Document as IHTMLDocument2).queryCommandEnabled('Copy') then
begin
HTML := TMemoryStream.create; //создадим поток
вот тут какой то код, который переносит в ПЕРЕМ содержимое контейнера браузера
end;
Application.ProcessMessages; //хотя зачем это несовсем понятно
end;
Если кто в курсе, подскажите код
Заранее спасибо.
А в каком виде то он это все копирует?
Цитата:
Phodopus
А в каком виде то он это все копирует?
в виде текстов, картинок, ссылок, заключенных в соответсвующие теги
если сделать для текущей страницы Ctrl+A Ctrl+C затем открыть ХТМЛ-редактор и сделать Ctrl+V то как раз и можно будет увидеть "в каком виде"
Во-первых, у TMemoryStream вроде было свойство, содержащее указатель на данные. Его можно передать в SetString вместе с длиной потока. Во-вторых, где-то в нутрях VCL даже был TStringStream, наследованный от TMemoryStream и имеющий свойство типа AsString. Пишу по памяти.
Всего-то надо было в справку заглянуть не полениться.
этот код по кусочкам собирался из разных источников
сейчас нужно добавить еще кусочек - выделенное в браузе скопировать не в клипборд а в переменную.
Итак??? у кого есть конкретный код, ну что то типа
Код:
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; //тут компилятор говорит что типы перем не совпадают
//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; //тут компилятор говорит что типы перем не совпадают
но только работающий
Цитата: Pcrepair
этот код по кусочкам собирался из разных источников
:facepalm: Теперь понятно, почему Delphi-программистов считают маргиналами.
Посмотрите в каком формате находится клипбоард после копирования. CF_?
Код:
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;
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]
как такое вообще получается и что с этим можно сделать?
- копируем в буфер обмена
- из буфера обмена копируем в ПЕРЕМ типа 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;
Application.ProcessMessages;
begin
HTML.Free; //обнуляем ПЕРЕМ перед новым циклом
HTML := TClipboard.Create;
HTML := Clipboard; //копируем содер. Буфера в ПЕРЕМ типа строка
Clipboard.Clear; //очищаем Буфер обмена
Memo1.Clear; //очистить МЕМО
Memo1 := HTML; //копировать содержимое в МЕМО из ПЕРЕМ
end;
end;
но вот проблема - на строке Memo1 := HTML; компилятор пишет: несовместипые типы
никто не в курсе что тут млжно сделать? чтоб в МЕМО поместить данные из буфера?
Цитата: Pcrepair
...на строке Memo1 := HTML; компилятор пишет: несовместипые типы
никто не в курсе что тут млжно сделать? чтоб в МЕМО поместить данные из буфера?
никто не в курсе что тут млжно сделать? чтоб в МЕМО поместить данные из буфера?
Clipboard за раз может быть только один, поэтому при его очистке все данные пропадают. Memo1 может содержать лишь текстовую инфу и засунуть туда графику не получится - только в виде HTML-кода, отсюда и конфликт типов (Memo1 := HTML т.е. TMemo:=TClipboard? ) Нужно предварительно в клипборд класть HTML-код (CF_TEXT)
Clipboard помнится синглтон.
Цитата: 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;
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 или ХТМЛ-редактор