Как загрузить файл в webbrowser

Обновлено: 04.07.2024

Если делается программа под конкретный форум, то по-моему удобнее было бы организовать работу через GET- POST-запросы, чем ковыряться в HTML-коде. А вообще вставить текст в поле ввода можно как рассказано здесь. Это пост из старого моего блога. Текст немного покорежен, но разобраться можно :)

Доброе время суток. Вопрос Автору. Можно ли привести пример со скачиваемым исходником программы, следующего функционала: 1)загружает страницу 2)находит нужную мне форму 3) Заполняет нужным мне текстом нужную форму. БУДУ ПРИМНОГО БЛАГОДАРЕН ЕСЛИ ПОМОЖЕТЕ В РЕШЕНИИ ДАННОЙ ЗАДАЧИ.

Вопрос возможно не по теме.
Я пытаюсь написать GPS трекер.
Использую Delphi+google map api.
Использую компонент webbrowser.
Нарисовать карту с гугла проблем нет, нарисовать на ней линией маршрут тоже не проблема. Проблема заключается в рисовании маршрута в режиме реального времени.
На гугле есть готовые скрипты java, но вот как заставить их работать на уже открытой html странице пока не пойму. Сейчас я просто изменяю текст html страницы и заново даю комманду WebBrowser1.Navigate(Text); что естественно занимает время, а также создает неудобства при работе с программой.

Можете подсказать путь более правильной работы с этой связкой.

У меня к вам такой вопрос. при загрузки страницы мне надо изменить ее код, то есть не просто вставить что то дополнительное, а в какой то части кода изменить. как это сделать?

Доброго времени!
Вопрос не совсем по теме, но может быть поможете.
Как преобразовать параметр POST события OnBeforeNavigate в читабельный вид?

а можно изменить код страницы в контакте

Хорошая статья. Но есть вопрос. Как получить следующий елемент? Вот допустим такой документ:

Как, находясь на 1-ом диве, перейти на второй не перебирая при этом всю вложенную коллекцию 1-ого.

Вопрос не об том, как получить коллекцию тега div(getElementsByName) и ее перебрать, а как перейти на следующий елемент без перебора вложенных тегов.

Сорри, если не вовсе в тему, может кто знает как решить проблему с использованием возможностей на делфи Internet Explorer 10, по идее какая версия IE установлена то и используется в делфи, но почему то те сайты которые отлично стали работать после установки на IE10, через мою прогу которая запускает этот сайт через webbrowser не корректно отображает, хотя сайтами браузер распознается как версия браузера Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0), но он не работает как сам IE10, даже при вводе в форме нет тех мини кнопок для удобства очистки или показа пароля под звездочками.

Спасибо Влад, попробую там, компонентам chrome я пользовался, по началу все получалось, но потом зашел в тупик когда надо было делать разные манипуляции над страницей, и получением нужных идентификаторов, то что недостаточно открыто расписана документация по нем и не все найдешь в инете, а на webbrowser вроде любая проблема решима, просто нужна поддержка новых стандартов, что IE10 и дает, я вот еще думал установить windows 8 там по умолчанию уже IE10 стоит, но хочу подождать официального выхода.

Здравствуйте!
Я сделала меню боковое из картинок и обложку картинку. Когда щелкаешь на картинку меню должно на месте обложки открываться HTML-страница. Я сделала как у вас написано, но для того что бы работал WebBrowser1 я его растянула поверх картинки и получается он ее закрывает. Как можно сделать что бы была обложка, а потом при нажатии на меню(картинку) появлялась HTML-страница?

Лилия, использовать методы BringToFront и SendToBack компонентов, видимо?

Нажимала но WebBrowser1 не уходит на задний план и на оборот. Но ведь мне кроме того что убрать надо что бы при щелчке WebBrowser1 вышел на передний план. Возможно надо прописать какой-то код?

Спасибо за ответ) А пример можно? или вот у меня идея, например сохранить полный исходный код странички и потом удалить все то что мне не нужно и спокойно смотреть не вариант? Скрипты только правельно подключить и все?


Загрузки всякие

Связь

Содержание

ActiveX компонент TWebBrowser. Этот же компонент использует IE. В некоторых случаях это даже удобно, так как созданный на основе этого компонента объект будет «видеть» все ваши IE-куки и прочие настройки (если, конечно, вы пользуетесь IE).

Этот компонент удобен в случаях, когда HTML-код страницы нельзя получить другим простым способом (например, некоторые сайты отказываются работать, когда браузер не поддерживает flash). Также TWebBrowser удобен для автоматизации работы с формами на сайтах.

Два способа обратиться к документу

WebBrowser1.OleObject.Document.FileSize - возвращает размер HTML-документа в байтах

Ссылки

How to load and save documents in TWebBrowser in a Delphi-like way - довольно большая статья, рассмотрена загрузка из ресурсов

innerHTML и outerHTML

Отличие между свойствами innerHTML/innerText и outerHTML/outerText для элемента страницы:

для строки <p>это строка</p> innerHTML вернет <p>это строка</p> , а outerHTML вернет это строка .

Свойства страницы

Заголовок страницы

Адрес текущего документа

Это то же самое, что свойство LocationURL.

Cookies

Возвращает строку, содержащую все кукисы браузера:

Дата последней модификации

Возвращает дату последней модификации (в виде строки).

Официально — в формате «MM/DD/YY hh:mm:ss», но реально может быть возвращена в формате в соответствии с местными региональными настройками.

Ожидание загрузки страницы

Второй вариант - использовать события:

Версия установленного IE

Если IE не установлен, возвращает пустую строку.

Перебор определенного тега: getElementsByTagName

Стандарт DOM предусматривает несколько средств поиска элемента. Это методы getElementById, getElementsByTagName и getElementsByName.

Самый удобный способ найти элемент в DOM - это получить его по id. Для этого используется вызов document.getElementById(id).

Следующий способ - это получить все элементы с определенным тегом, и среди них искать нужный. Для этого служит document.getElementsByTagName(tag). Она возвращает массив из элементов, имеющих такой тег.

Пример - парсинг выдачи яндекса. Программа перебирает все тэги <LI> в странице поиска, ищет в них URL заданного сайта. Если находит, то определяет его позицию, которая содержится в первом тэге <B> первого тэга <H2>:

Что интересно, getElementsByTagName можно вызывать не только для document, но и вообще для любого элемента, у которого есть тег (не текстового).

При этом будут найдены только те объекты, которые находятся под этим элементом.

Например, следующий вызов получает список элементов LI, находящихся внутри первого тега div:

Получить всех потомков

Например, на таком DOM:

Выведет последовательность: ol1, li1, li2.

getElementsByName

Метод document.getElementsByName(name) возвращает все элементы, у которых имя (атрибут name) равно данному.

Он работает только с теми элементами, для которых в спецификации явно предусмотрен атрибут name: это form, input, a, select, textarea и ряд других.

Метод document.getElementsByName не будет работать с остальными элементами типа div,p и т.п.

Другие способы

Существуют и другие способы поиска по DOM: XPath, cssQuery и т.п. Как правило, они реализуются javascript-библиотеками для расширения стандартных возможностей браузеров.

Также есть метод getElementsByClassName для поиска элементов по классу, но он совсем не работает в IE, поэтому в чистом виде им никто не пользуется.

Найти все ссылки

Массив всех ссылок: WebBrowser.OleObject.Document.Links

Пример - пробегает по всем ссылкам на загруженной странице и кликает по одной из них:

Пример: узнать url определенных ссылок на загруженной странице. Примечание: если известен id ссылки, то нужно использовать getElementById и тогда цикл не нужен.

Только для того, что бы иметь доступ к WebBrowser.Document (IHTMLDocumnet(2)), проинициализуруйте WebBrowser примерно следующим образом (в терминах vb - дельфи не стоит):

WebBrowser.Navigate("about:blank")
wheel (not WebBrowser.ReadyState <> READYSTATE_COMPLETE)
sleep 100
doevents " в случае Д - Application.ProcessMessage
wend

Вот моя процедурка, которая считывает поле и пишет информацию в файл. Этот файл затем, я могу присвоить свойству Navigate. Так у меня нет проблем. Но мне надо без файла, а сразу. Но КАК ?

procedure TForm1.WriteFromFieldToFile(Field : TField);
var
F: TFileStream;
Stream: TStream;
begin
with Query1 do
begin
Stream := (Field.DataSet as TCustomADODataSet).CreateBlobStream(Field, bmRead);
F := TFilestream.Create("E:\TEMP.hmt",fmCreate);
F.CopyFrom(Stream,Stream.Size);
F.Free;
Stream.Free;
end;
end;

Вызывается она просто: WriteFromFieldToFile(Поле в БД);

Это решение оттуда

Вопрос: Как загрузить потоковые(stream) данные в WebBrowser не прибегая к открытию файла?

Ответ: Вот пример кода:

function TForm1.LoadFromStream(const AStream: TStream): HRESULT;
begin
AStream.seek(0, 0);
Result := (WebBrowser1.Document as
IPersistStreamInit).Load(TStreamAdapter.Create(AStream));
end;

Автор: Per Larsen

procedure TForm1.KeyStoreClick(Sender: TObject);
var
Stream: TStream;
begin
with Query1 do
begin
Stream := (FieldByName("DataBlob").DataSet as TCustomADODataSet).CreateBlobStream(FieldByName("DataBlob"), bmRead);
WebBrowser1.Navigate("about:Blank");
LoadFromStream(Stream);
end;

Вот моя процедура, которая читает BLOB поле.

procedure TForm1.KeyStoreClick(Sender: TObject);
var
Stream: TStream;
begin
with Query1 do
begin
Stream := (FieldByName("DataBlob").DataSet as TCustomADODataSet).CreateBlobStream(FieldByName("DataBlob"), bmRead);
WebBrowser1.Navigate("about:Blank");
LoadFromStream(Stream);
end;
Stream.Free;
end;

После нее, WebBrowser - отображает ее как ТЕКСТ. Что на этот раз не так.?
К стати, за ссылку спасибо.
С праздничком.

WebBrowser1.Document as
IPersistStreamInit).InitNew();

(WebBrowser1.Document as
IPersistStreamInit).Load.

(по крайней мере в MSDN предлагается именно так)

Если это не поможет - превратите поток в строку и воспользуйтесь
методом write или writeln WebBrowser1.Document

Что умеет TWebBrowser.
Микрософт создала этот компонент для отображения в Internet Explorer. В нём есть только то, что нужно самому IE. Если IE что либо не нужно, там этого нет. Причём многие вещи, которые нужны в IE, там тоже отсутствуют. Так что последний тоже выкарабкивается, как может.

Что с TWebBrowser умеет делать демо
Я создал пример, который позволяет делать две разные вещи
1. производить загрузку для просмотра любого html файла, в т.ч. с изображениями и скриптами напрямую с памяти, производить загрузку для просмотра любого mht файла
2. редактировать загруженный html файл (_не_ mht) и сохранять его напрямую в память вместе с изображениями и проч.

Есть идеи сохранения файлов html/mht напрямую в mht, но они отсутствуют в демо и описаны в посте ниже.

Теперь, когда у нас есть обработчик, его надо подключить.
Создаём com сервер через TComObjectFactory.create и привязываем к нему наш протокол через InternetSession.RegisterNameSpace.
Я описал создание сервера в CreateMyProtocol, привязку протокола в RegisterMyProtocol и отвязку в UnregisterMyProtocol.

Теперь, когда мы можем загружать содержимое любых запросов по нашему протоколу через LoadDataToStream, можно перейти к вопросу - а как сохранять файлы.
Файл в нашу страничку может попасть двумя путями:
- в момент загрузки странички
- при добавлении изображения пользователем при редактировании

В момент загрузки все запросы проходят через LoadDataToStream, где мы можем контролировать всё что угодно, даже MIME тип и имя файла в кеше.
Сколько у нас в странице элементов <img src=>, <script src=> и т.п., столько запросов к LoadDataToStream мы получим, по одному на каждый. (Внимание - это не относится к файлам mht!)
Так что при загрузке мы просто помещаем все считанные файлы в память нашего приложения. Это будет что-то вроде кеша.

Теперь осталось добавление изображения в редактор.
В любом редакторе для этого есть своя кнопка, и вместо добавления через команду WebBrowser мы пишем свой код.
Наш код заменяет выделенный диапазон текстом <img src="mem://image.xxx">, где mem - это название нашего протокола, а image.xxx - изображение с уникальным в пределах страницы именем
Когда мы вставляем такой код, WebBrowser немедленно запрашивает файл по нашему протоколу, и мы попадаем в уже ставшую родной LoadDataToStream.
Осталось только подставить содержимое реального файла на диске или в интернете, и - запихать в наш кеш, что приведённый код собственно и делает.

В результате мы имеем для любого контекта, хоть загруженного, хоть редактированного внутренний html и картинки в памяти нашего приложения.
Сохранить из памяти в БД или на диск - проблем нет. Правда придётся заменить mem:// на чистое имя файла без путей.

Собственно внутри демо все операции производятся в памяти, даже если потом надо сохранить на диск.
Все графические файлы, т.е. кеш в памяти программы - отображены в табличке справа.
При всех операциях загрузки выставлен таймаут 10 сек.

Как мы можем работать с этим форматом?
Есть библиотека Collaboration Data Objects, в простонародье CDO.
в ней определён интерфейс IMessage. Я уже написал выше, что mht это фактически сохраненное в таком расширении электронное письмо. Там даже поля "кому", "от" и тема есть - достаточно открыть в блокноте чтобы убедиться.

При загрузке mht мы можем создать IMessage, загрузить mht файл в него и дальше передавать WebBrowser через наш протокол. В этом случае все файлы попадут в наш кеш и формат станет свободно редактируемым и сохраняемым минуя всякие временные файлы.

Ниже я прилагаю пример, как создать mht файл с html телом, изображением и вложенным файлом - все три вида разделов, что могут вам потребоваться. Он автоматически создаёт файл test.mht при запуске формы и сразу закрывается.

Я у тебя увидел то что я давно искал и никто не захотел ответить.
"сохранение графического файла из кеша (GetCachedFileFromURL)"
Я не понял что это за метод, и где его найти, TwebBrowser мне такого не нашел.
Не мог ли бы ты рассказать как сохранить картинку которую УЖЕ загрузил TwebBrowser?
Я уже две темы создавал на эту тему. и ниче не вышло с этого..

Я по правде говоря не понимаю зачем этот EMbeddedWB нужен. В примерах пытаются показать тот же эксплорер, только вид с боку. Смысл? Были уже такие проекты, до сих пор есть браузеры на движке IE.

В эксплорере есть куда более интересные функции - запихать туда свой контект и манипулировать им. Например я делал проект, когда в ИЕ отображалась страница today, было ещё отображение блок схем с редактированием (на jsсript). В скрипт можно вешать свои функции и обрабатывать их в своём приложении - фактически вызов твоего кода из скрипта. Эксплорер почти не имеет адекватных альтернатив как редактор и "отображатель" html контекта (и скриптов) в программе.

Posted via ActualForum NNTP Server 1.4

При открытии программы отображалась закладка по типу today
В ней все модули были представлены в виде изображений, соединенных стрелочками разными. Типа визуализации производственного процесса. По щелчку на картинке вызывалась из аякса своя функция и она создавала соответствующую форму.

Вот про него я и спрашиваю.

Posted via ActualForum NNTP Server 1.4

При наличии на машине Outlook 2010 CDO отказывается даже ставиться. (В документации тоже написано что вместе они не живут). Как Вы обходите эту проблему? не удялять же Outlook 2010 ?

Читайте также: