MSHTML в Лазаре
Модератор: Модераторы
MSHTML в Лазаре
Всем привет. Есть ли у кого простейший пример работы с MSHTML. Т.е. вписать текст страницы и пройтись по нему по его тегам? Чтоб хоть иметь представление как с этим модулем правильно именно в фрипаскале работать.
Я с этим модулем работаю в C#. Ничего такого супер-пупер интересного в нем нет.
Для паскаля есть другие модули. Ничуть не хуже, и, к тому же, переносимые.
А с этим только винда
Для паскаля есть другие модули. Ничуть не хуже, и, к тому же, переносимые.
А с этим только винда
Ну я не против, но мне хочется именно этот модуль увязать для начала.
Насчет супер-пупер, это я так утрировал
Насчет супер-пупер, это я так утрировал
Ну если хочется, разбирайтесь. Сам я не пробовал, соответственно, помочь не могу.
Пытался только отговорить
Пытался только отговорить
Верю
Вот портировал из Делфи модуль, попробовал:
Ну блин, вроде все красиво, но на itm.tagName падает на AV.
И собсно падает не только тут но и в Делфи
Ни-и-и-и-че не понимаю... Как же тогда данные о элементе получать из коллекции?
el.Get_length четко отображает три элемента в коллекции, а выдернуть их для анализа не получается...
Вот портировал из Делфи модуль, попробовал:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses activex,comobj, variants, mshtml,
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var doc:variant;
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
doc:IHTMLDocument2; disp:DispHTMLDocument; v:variant;
el:IHTMLElementCollection;
itm:IHTMLElement;
i:integer;
begin
//http://www.webdelphi.ru/2010/05/mshtml-v-delphi-analiz-ssylok-na-stranice/
disp:=CoHTMLDocument.Create;
doc:=IHTMLDocument2(disp);
V:=VarArrayCreate([0,0],varVariant);
V[0]:='<html><body><a href="123">123</a><a href="123">123</a><br></body></html>';
Doc.write(PSafeArray(TVarData(v).VArray));
el:=IHTMLElementCollection(doc.body.all);
Caption:=IntToStr(el.Get_length);
for i:=0 to el.Get_length-1 do begin
itm:=IHTMLElement(el.item(i,0));
Caption:=itm.tagName;
end;
doc:=nil;
end;
end.
Ну блин, вроде все красиво, но на itm.tagName падает на AV.
И собсно падает не только тут но и в Делфи
Ни-и-и-и-че не понимаю... Как же тогда данные о элементе получать из коллекции?
el.Get_length четко отображает три элемента в коллекции, а выдернуть их для анализа не получается...
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Метод IHTLMElementCollection.item возвращает не непосредственно IHTMLElement, а некий IDispatch, у которого нужно запрашивать IHTMLElement, как-то так:
Код: Выделить всё
itm:=IDispatch(el.item(i,0)) as IHTMLElement;
Угу. Овэц я
Недоглядели или недочитал MSDN.
Ларчик то просто открывается. Прикладываю код, может кому еще будет надебно:
Собственно теперь хотя бы знаю как дальше поступать. Всем спс.
Ларчик то просто открывается. Прикладываю код, может кому еще будет надебно:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses activex,comobj, variants, mshtml,
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var doc:variant;
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
doc:IHTMLDocument2; disp:DispHTMLDocument; v:variant;
el:IHTMLElementCollection;
itm:IHTMLElement;
i:integer;p:pointer;
begin
disp:=CoHTMLDocument.Create;
doc:=IHTMLDocument2(disp);
V:=VarArrayCreate([0,0],varVariant);
V[0]:='<html><body><a href="123">123</a><a href="123">123</a><br></body></html>';
Doc.write(PSafeArray(TVarData(v).VArray));
Doc.close;
el:=IHTMLElementCollection(doc.body.all);
Caption:=IntToStr(el.Get_length);
for i:=0 to el.Get_length-1 do begin
p:=nil;
if el.item(i,0).QueryInterface(IID_IHTMLElement,p)=S_OK then begin
Caption:=IntToStr(integer(p));
itm:=IHTMLElement(p);
ListBox1.Items.Append(itm.tagName+' '+itm.innerHTML);
end;
end;
doc:=nil;
end;
end.
Собственно теперь хотя бы знаю как дальше поступать. Всем спс.
