итерация по IHTMLElementCollection

#delphi #delphi-2009 #loops #ihtmldocument2

#delphi #delphi-2009 #циклы #ihtmldocument2

Вопрос:

есть ли способ выполнить итерацию по IHTMLElementCollection?

например

 var
  e : IHTMLLinkElement;
elementCollection:IHTMLElementCollection;
begin
    for e in elementCollection do
      showmessage(e.caption);
end;
  

я знаю, что есть свойство с именем _NewEnum, однако оно не поддерживается в delphi, насколько я мог понять.

обновление: по-видимому, ссылки являются IHTMLElement, а не ihtmllink Element

Комментарии:

1. Я прочитал это как «разгневанный из-за IHTMLElementCollection» и подумал: «Это не может быть так плохо!» 🙂

Ответ №1:

 for I := 0 to Pred(elementCollection.length) do
begin
  e := elementCollection.item(I, EmptyParam) as IHTMLElement;
  //...
end;
  

Ответ №2:

Код для использования _NewEnum выглядит следующим образом. Если вы уверены, что у вас есть только элементы link elements в коллекции, вы можете изменить as IHTMLElement часть (и тип значения элемента) внутреннего цикла на as IHTMLAnchorElement (ihtmllink Element кажется чем-то совершенно другим)

 uses MSHTML, ActiveX;

var
  collection:IHTMLElementCollection;
  enum:IEnumVariant;
  v:OleVariant;
  u:IUnknown;
  element:IHTMLElement;
begin
  //...
  enum:=collection._newEnum as IEnumVariant;
  while enum.Next(1,v,u)=S_OK do
   begin
    elem:=u as IHTMLElement;
    //...
   end;
  

Комментарии:

1. 1 Это может быть довольно легко обернуто как перечислитель Delphi.

2. Возможно, это так? Я слышал, что в самых последних версиях Delphi есть оператор foreach, который использует интерфейс перечисления, если он доступен, возможно, это включает IEnumVARIANT? (Я не могу проверить, потому что у меня еще нет самой последней версии Delphi)