Содержание материала

 

Главная функциональность сосредоточена в методе Next, который получает следующие переменные:

celt количество запрашиваемых элементов

rgvar адрес первого элемента массива переменных типа OleVariant

pceltFetched адрес переменной, в которую должно быть записано количество реально переданных элементов. Этот адрес может быть равен NIL, в этом случае ничего записывать не надо.

Метод должен заполнить запрошенное количество элементов rgvar и вернуть S_OK, если это удалось и S_FALSE, если элементов не хватило.

 

Code:

type

TVariantList = array [0..0] of OleVariant;

 

function TVCLEnumerator.Next(celt: LongWord; var rgvar: OleVariant;

pceltFetched: PLongWord): HResult;

var

I: Cardinal;

begin

Result := S_OK;

I := 0;

Для объекта TWinControl возвращаем интерфейсы IDispatch для компонентов из свойства Controls

if FOwner is TWinControl then begin

   with TWinControl(FOwner) do begin

     while (FEnumPosition < ControlCount) and (I < celt) do begin

       TVariantList(rgvar)[I] :=

         FScriptControl.GetProxy(Controls[FEnumPosition]);

       Inc(I);

       Inc(FEnumPosition);

     end;

   end;

end

 

Для TCollection организуется перебор элементов коллекции

 

Code:

else

if FOwner is TCollection then begin

   with TCollection(FOwner) do begin

     while (FEnumPosition < Count) and (I < celt) do begin

       TVariantList(rgvar)[I] :=

         FScriptControl.GetProxy(Items[FEnumPosition]);

       Inc(I);

       Inc(FEnumPosition);

     end;

   end;

end

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить