![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с htm- страницами, загруженными браузером. [D7, Win95/98, WinXP]
Kisha © (2006-02-26 14:21:00)Вот проблема. Пишу программу, которая обращается к Internet Explorer (6.0), при этом в браузере загружена страница, html-код которой содержит:
1) <INPUT name=ans><INPUT type=hidden value=txt name=qtype>
2). <INPUT type=radio value=1 name=ans>
......................................................
<INPUT type=radio value=6 name=ans>
3). <INPUT type=CheckBox value=1 name=ans>
...........................................................
<INPUT type=CheckBox value=6 name=ans>
Как заставить свою программу выставлять галочки и писать значения в такие htm-овские CheckBox, Radio и txt?
Заранее благодарен.
Nick Denry (2006-02-28 01:31:00) [1]Согласен, но не важно.
Игорь Шевченко (2006-02-28 01:19:00) [2]
> на чистом апи
Это грязный апи
Nick Denry (2006-02-28 00:33:00) [3]Правда для ТWebBrowser'a но все же:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls, MSHTML, ExtCtrls;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure WebBrowser1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
PageLoaded : boolean;
document : IHTMLDocument2;
img1 : IHTMLImgElement;
n : integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
curPage : string;
begin
curPage := GetCurrentDir+'\HTML_02\'+ 'index.html';
WebBrowser1.Navigate(curPage);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PageLoaded := false;
n := 0;
end;
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
PageLoaded := true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if PageLoaded = false
then ShowMessage('You must load the page')
else begin
if WebBrowser1.Document <> nil then begin
form1.webBrowser1.Document.QueryInterface(IHTMLDocument2, document);
document.images.item('img1',0).QueryInterface(IHTMLImgElement, img1);
if Timer1.Enabled = false then Timer1.Enabled := true;
end;
end;
document._Release;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if n = 0 then begin
img1.src := GetCurrentDir+'\HTML_02\pyramid_sm_h.jpg';
n := 1;
end
else
begin
img1.src := GetCurrentDir+'\HTML_02\pyramid_sm.jpg';
n := 0;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Timer1.Enabled := false;
img1.src := GetCurrentDir+'\HTML_02\pyramid_sm.jpg';
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Timer1.Enabled := false;
img1.src := GetCurrentDir+'\HTML_02\pyramid.jpg';
end;
end.
Nick Denry (2006-02-28 00:29:00) [4][5],[7]
на чистом апи это будет примерно как:
var
hr : HRESULT;
lpUnk : IUnknown;
WebBr : IWebBrowser2;
EmptyParam : OleVariant;
procedure InitWebBrowserl;
begin
{* Init WebBrowser *}
CoInitialize(nil);
//WebBr := CreateComObject(CLASS_InternetExplorer) as IWebBrowser2;}
lpUnk := nil;
WebBr := nil;
//OleInitialize(nil);
hr := CoCreateInstance(CLASS_InternetExplorer, nil, CLSCTX_SERVER, IUnknown, lpUnk);
hr := lpUnk.QueryInterface(IWebBrowser2, WebBr);
//if Failed(hr) then ShowMessage('Query failed');
WebBr.AddressBar := false;
WebBr.StatusBar := false;
WebBr.MenuBar := false;
WebBr.ToolBar := 0;
WebBr.Left := xPos;
WebBr.Top := yPos;
WebBr.Width := nWidth;
WebBr.Height := nHeight;
WebBr.Visible := true;
WebBr.Navigate(GetARootDir+ szInfoShellPath+'start.htm',
EmptyParam,EmptyParam,EmptyParam,EmptyParam);
end;
Ihor Osov'yak (2006-02-28 00:15:00) [5]see, please, mshtml.pas
Потом по всяким умным идентификаторам, обнаруженым там - поиск в гугле, или сразу в msdn - там в секции реюзинг ие браузер или что то типа того - очень много умных и интересных вещей написано.. Или мою статью на Королевстве, писалось давно, не все аккуратно написано - то для начала может быть полезной.. Кажется, в подземелье Магов, название - использование функциональности IE. Правда, там в основном вокруг TWebBrowser, но работа с внешним IE почти не отличается, ньюансы лишь в получении начального IHTMLDocument2
Kisha (2006-02-27 19:34:00) [6]Мне нужно чтобы именно проставлялись значения, я должен их видеть перед отправкой, чтобы изучить. Это важно.
NIck Denry (2006-02-27 16:51:00) [7]2All, а разве нельзя управлять эксплорером, если создать его как COM-объект? Потом ведь можно получать доступ почти ко всему содердимому, и даже скрипты вызывать ит т.д.
Style (2006-02-27 11:42:00) [8]
> На локальной странице помечать надо. А потом сам буду отправлять
> на сервер по нажатии кнопки "Отправить".
Если нужно заполнить локальную страницу, то проще будет
эмулировать нажатия клавиш...
keybd_event
Для начала только нужно найти окно explorera и сделать его активным, а потом переключатся между "контролами" - элементами формы, можно с помощью клавиши табуляции.
НО!
> <INPUT type=hidden value=txt name=qtype>
значение этого параметра тебе не поменять.
qtype - Это скрытый параметр - изменить его с помощью интерфейса пользователя нельзя...
Поэтому самое правильное решение - это
1) Изучить протокол http.
2) Понять что такое GET и POST параметры
3) Самому сформировать GET/POST запрос, заполнить необходимые данные и отправить на сервер - причем уже не важно как ты это будешь делать, через WinInet или через напрямую через SocketAPI, или вообще воспользуешся сторонними сторонними компонентами... Главное в первую очередь понять как работает http протокол.
Но если тебе вдруг уж действительно так нужно именно заполнять форму...
То я бы воспользовался JavaScript'ом, а не локальной программой...
Cоздал бы свою html страницу, которая в новом окне бы открывала необходимую форуму и заполняла бы все параметры...
n0name (2006-02-27 10:09:00) [9]А как ты будешь отлавливать это событие?
Я веду всё это к тому, что можно просто послать POST/GET запрос с помошью WinInet.
Kisha (2006-02-26 22:32:00) [10]На локальной странице помечать надо. А потом сам буду отправлять на сервер по нажатии кнопки "Отправить".
n0name (2006-02-26 19:00:00) [11]Тебе надо отправлять данные на веб-сервер?
Ил на локальной странице помечать чекбоксы?