MSHTML в Лазаре

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

MSHTML в Лазаре

Сообщение Виталий » 11.06.2014 13:26:54

Всем привет. Есть ли у кого простейший пример работы с MSHTML. Т.е. вписать текст страницы и пройтись по нему по его тегам? Чтоб хоть иметь представление как с этим модулем правильно именно в фрипаскале работать.
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: MSHTML в Лазаре

Сообщение vada » 11.06.2014 14:02:28

Я с этим модулем работаю в C#. Ничего такого супер-пупер интересного в нем нет.
Для паскаля есть другие модули. Ничуть не хуже, и, к тому же, переносимые.
А с этим только винда :(
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: MSHTML в Лазаре

Сообщение Виталий » 11.06.2014 14:26:40

Ну я не против, но мне хочется именно этот модуль увязать для начала.
Насчет супер-пупер, это я так утрировал :wink:
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: MSHTML в Лазаре

Сообщение vada » 11.06.2014 14:50:04

Ну если хочется, разбирайтесь. Сам я не пробовал, соответственно, помочь не могу.
Пытался только отговорить :)
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: MSHTML в Лазаре

Сообщение Виталий » 11.06.2014 17:25:30

Верю :D
Вот портировал из Делфи модуль, попробовал:
Код: Выделить всё
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.
И собсно падает не только тут но и в Делфи :mrgreen:
Ни-и-и-и-че не понимаю... Как же тогда данные о элементе получать из коллекции?
el.Get_length четко отображает три элемента в коллекции, а выдернуть их для анализа не получается...
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: MSHTML в Лазаре

Сообщение Sergei I. Gorelkin » 11.06.2014 21:22:28

Метод IHTLMElementCollection.item возвращает не непосредственно IHTMLElement, а некий IDispatch, у которого нужно запрашивать IHTMLElement, как-то так:
Код: Выделить всё
itm:=IDispatch(el.item(i,0)) as IHTMLElement;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: MSHTML в Лазаре

Сообщение Виталий » 12.06.2014 12:16:01

Угу. Овэц я :mrgreen: Недоглядели или недочитал 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.

Собственно теперь хотя бы знаю как дальше поступать. Всем спс.
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 218

Рейтинг@Mail.ru
cron