![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управление Internet Explorer [D3, D6, Win95/98, WinME, NT4, Win2k, WinXP]
PVOzerski © (2003-11-10 13:14:00)
Мне на своей халтуре приходится набивать через обычные браузеры базу данных. При этом user interface этой БД сделан не слишком удобно. В частности, приходится выделять помногу элементов в MultiSelect ListBox"ах на Web-странице, притом вручную предписывается делать то, что вполне поддается алгоритмизации. Естественно, я попытался это дело автоматизировать: находить в окошке браузера нужнве ListBox"ы и программно выставлять selected в нужных позициях. Делал это так: искал из своей программы дочерние элементы класса ListBox (или подобных) в окошке браузера, проверял число элементов (оно постоянно для нужных мне) и посылал им LB_SETSEL. Для Netscape 4.x этот трюк прошел "на ура". Но программкой заинтересовались мои коллеги, а они сидят в IE. А там дело оказалось хуже: я тоже смог выделять элементы ListBox"а, однако только с точки зрения "на экране", но не для IE: при передаче введенного удаленному CGI-приложению он сообщает ему только то, что введено "вручную". Не хочется мне заниматься эмуляцией ввода с мыши или даже c клавиатуры, нет ли более разумных путей? Вдруг кто с подобной задачей сталкивался?
PVOzerski (2003-11-11 15:19:00) [1]
2all: все получилось, особое спасибо BizonWar!
nikkie (2003-11-10 19:01:00) [2]
>PVOzerski
что-то мне кажется Вы куда-то не туда двинулись... вот это читали?
http://www.delphikingdom.ru/mastering/tweb.htm
BizonWar (2003-11-10 16:17:00) [3]
Если не то послал, то что именно нужно?
PVOzerski (2003-11-10 16:04:00) [4]
2BizonWar:
Нет, такой вариант неудобен. Я, на самом деле, уже кое-что отыскал на эту тему, но легче с того особо не стало. Проблема, оказывается, решается через интерфейс IShellWindows, но в тех версиях Delphi, что у меня под рукой, он не реализован в RTL.
В примерах же всё вот такое:
function GetActiveIEBrowser: IWebBrowser2;
var
shellWindows: IShellWindows;
i: Integer;
webBrowser: IWebBrowser2;
begin
Result:= nil;
shellWindows:= CoShellWindows.Create;
for i:=0 to shellWindows.Count -1 do
if Supports(shellWindows.Item(i), IWebBrowser2, webBrowser) then
А CoShellWindows у меня просто нет, ни в каком юните RTL. Может, кто поделится по E-Mail нужным кусочком?
BizonWar (2003-11-10 15:42:00) [5]
А обязательно к уже открытому окну обращаться?
Может такой вариант подойдет?
procedure TForm1.Button1Click(Sender: TObject);
var IE:OleVariant;
begin
IE:=CreateOleObject("InternetExplorer.Application");
IE.Visible:=true;
IE.Navigate(" Http://www.mail.ru");
end;
PVOzerski (2003-11-10 15:17:00) [6]
Следующий дурацкий вопрос: а как найти именно то окно, эксплорера, которое мне нужно, если открыто несколько. А нужно активное окно, в то время как после выполнения IE:=GetActiveOleObject("InternetExplorer.Application") я получаю доступ к 1-му запущенному окну. Можно ли добраться до интересующего (доступны и уникальны заголовок и, естественно, hwnd)?
BizonWar (2003-11-10 14:05:00) [7]
Конечно, можно. Посмотри объектную модель IE. Кроме того, компонент TWebBrowser - это есть обычный IE. я не ковырялся в его исходниках, но на сколько я понял - он просто поднимает IE и с ним работает. У меня получилось обращаться ко всем объетам их свойствам и методам.
Романов Р.В. (2003-11-10 14:03:00) [8]
А саму страницу поправить нельзя? Скриптов всяких умных добавить.
PVOzerski (2003-11-10 13:57:00) [9]
2 panov[1]: боюсь, от браузеров не уйти. Помимо "стабильных" полей для ввода, есть еще и "вариабельные", так что тогда придется писать практически свой браузер, по меньшем мере - очень интеллектуального клиента - не очень хочется :^(... Может, как-нибудь эксплорером через OLE управлять можно или что-нибудь подобное?
panov (2003-11-10 13:47:00) [10]
Как я понял, данные в достаточной мере структурированы, поэтому
меня простое преложение - обрабатывать запросы ир езультаты не браузером, а простыми сокетами.