Для TStrings перебираются строки и возвращаются их значения.
Code: |
else if FOwner is TStrings then begin with TStrings(FOwner) do begin while (FEnumPosition < Count) and (I < celt) do begin TVariantList(rgvar)[I] := TStrings(FOwner)[FEnumPosition]; Inc(I); Inc(FEnumPosition); end; end; end else Result := S_FALSE; if I <> celt then Result := S_FALSE; if Assigned(pceltFetched) then pceltFetched^ := I; end; |
Метод Skip пропускает запрошенное количество элементов и возвращает S_OK, если еще остались элементы для перебора
Code: |
function TVCLEnumerator.Skip(celt: LongWord): HResult; var Total: Integer; begin Result := S_FALSE; if FOwner is TWinControl then Total := TWinControl(FOwner).ControlCount else if FOwner is TCollection then Total := TCollection(FOwner).Count else if FOwner is TStrings then Total := TStrings(FOwner).Count else Exit; if FEnumPosition + celt <= Total then begin Result := S_OK; Inc(FEnumPosition, celt) end; end; |
Метод Clone клонирует объект, возвращая интерфейс его копии
Code: |
function TVCLEnumerator.Clone(out Enum: IEnumVariant): HResult; var NewEnum: TVCLEnumerator; begin NewEnum := TVCLEnumerator.Create(FOwner, FScriptControl); NewEnum.FEnumPosition := FEnumPosition; Enum := NewEnum as IEnumVariant; Result := S_OK; end; |
Для того чтобы класс TVCLProxy мог вернуть интерфейс IEnumVariant надо дополнить метод Invoke следующим кодом:
Code: |
case DispId of DISPID_NEWENUM: begin // У объекта запрашивают интерфейс IEnumVariant для ForEach // создаем класс, реализующий этот интерфейс OleVariant(VarResult^) := TVCLEnumerator.Create(FOwner, FScriptControl) as IEnumVariant; end; |
Компонент TVCLScriptControl
Текст этого компонента приведен на CD-ROM. Он является наследником TScriptControl и реализует функциональность по работе с TVCLProxy.
Заключение
Microsoft ScriptControl – качественное решение для задач, требующих включения в программу интерпретирующего ядра. Интегрировав его с VCL, мы получаем мощный и гибкий инструмент, позволяющий наращивать возможности в любом направлении. Информация из этой главы вполне достаточна, чтобы на основе приведенного на диске компонента TVCLScriptControl, создать решение, удовлетворяющее любой конкретной задаче.
Тенцер А. Л.
- << Назад
- Вперёд
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!