procedure TForm1.Button1Click(Sender: TObject);
var
v: Variant;
doc: IHTMLDocument4;
doc2: IHTMLDocument2;
elems: IHTMLElementCollection;
i: Integer;
elem: IHtmlElement;
PersistStream: IPersistStreamInit;
Stream: IStream;
MemoryStream: TMemoryStream;
begin
//CoInitialize(nil);// Если запуск будет внутри другого потока (thread'а), нужно вызывать для работы Ole объектов, rtm
//Временный документ, для вызова метода
doc:= CoHTMLDocument.Create as IHTMLDocument4;
//Чтобы работали методы, нужно чтоб документ был непустой
v:= VarArrayCreate([0, 0], varVariant);
//html код временного документа. можно любой, он не играет роли
v[0] := '<html></html>';
with (doc as IHTMLDocument2) do
begin
//Преобразование к требуемому типу
writeln(PSafeArray(TVarData(v).VArray));
close();
end;
//Создаем документ по url. Сюда подставить надо нужный адрес
//Предварительно стоит проверить и отэскейпить если надо логин и пароль (самостоятельно:)
doc2:=doc.createDocumentFromUrl('http://example.com/login/?name='+Edt1.Text+'&pass='+Edt2.Text,'');
//Ждем пока загрузится документ
while doc2.readyState <> 'complete' do
Application.ProcessMessages;
//Загрузился документ
//Выбираем все элементы по тэгу
elems:=doc2.all.tags('span') as IHTMLElementCollection;
//Альтернативный вариант из IHTMLDocument3 вызывать getElementsByTagName или другие необходимые методы
// предварительно преобразуем doc3:=doc2 as IHTMLDocument3;
for i := 0 to elems.length - 1 do
begin
//Соответствующее сообщение
MessageBox(Handle,'Span найден!!!111','Искали span',MB_OK);
//Вдруг понадобится не только сообщать но еще что-то получить из этих элементов:
// elem:=elems.item(i,0) as IHTMLElement;
// Memo2.Lines.Add('Span найден!!!111');
// Memo2.Lines.Add(elem.innerHTML);
end;
//Сохраняем исходный текст страницы
//Преобразуем документ к другому интерфейсу
PersistStream := doc2 as IPersistStreamInit;
//Поток, в который будем писать исходник
MemoryStream:= TMemoryStream.Create;
try
//Создаем объект с интерфейсом IStream, он нужен для общения с интерфейсом документа
Stream := TStreamAdapter.Create(MemoryStream, soReference) as IStream;
//Сохраняем исходный текст документа, если не вышло, ругаемся
if Failed(PersistStream.Save(Stream, True)) then ShowMessage('SaveAs HTML fail!') ;
//Перемещаем позицию в потоке в начало (после записи она в конце)
MemoryStream.Position:=0;
//Грузим из потока в Memo1
Memo1.Lines.LoadFromStream(MemoryStream);
finally
//Освобождаем память
MemoryStream.Free;
end;
end;
ЗЫ Первую часть - загрузку документа можно упростить с помощью TWebBrowser'а, в поисковиках полно примеров на эту тему.