Главная функциональность сосредоточена в методе 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 |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!