#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)