Если создавать TVCLProxy при каждом случае, когда запрашивается ссылка – они окажутся разными, и оператор Is не будет работать.
Code: |
DISPID_CONTROLS: begin // Вызвана функция Controls with FOwner as TWinControl do begin // Проверяем параметр CheckArgCount(dps.cArgs, [1], TRUE); P := NIL; if _ValidType(0, VT_BSTR, FALSE) then begin // Если параметр - строка - ищем дочерний компонент // с таким именем S := dps.rgvarg^[pDispIds^[0]].bstrVal; for I := 0 to Pred(ControlCount) do if CompareText(S, Controls[I].Name) = 0 then begin P := Controls[I]; Break; end; end else begin // Иначе - параметр - число, берем компонент по индексу I := _IntValue(0); P := Controls[I]; end; if not Assigned(P) then // Компонент не найден raise EInvalidParamType.Create(''); // Возвращаем интерфейс IDispatch для найденного компонента OleVariant(VarResult^) := FScriptControl.GetProxy(P); end; end; |
Функция Count должна вызываться без параметров и возвращает количество элементов в запрашиваемом объекте.
Code: |
DISPID_COUNT: begin // Вызвана функция Count // Проверяем, что не было параметров CheckArgCount(dps.cArgs, [0], TRUE); if FOwner is TWinControl then // Возвращаем количество дочерних компонентов OleVariant(VarResult^) := TWinControl(FOwner).ControlCount; else if FOwner is TCollection then // Возвращаем количество элементов коллекции OleVariant(VarResult^) := TCollection(FOwner).Count else if FOwner is TStrings then // Возвращаем количество строк OleVariant(VarResult^) := TStrings(FOwner).Count; end; |
Метод Add добавляет элемент к объекту-владельцу «представителя». Обратите внимание на реализацию необязательных параметров для TWinControl и TStrings
Code: |
DISPID_ADD: begin // Вызвана функция Add if FOwner is TWinControl then begin // Проверяем количество аргументов CheckArgCount(dps.cArgs, [2,3], TRUE); // Проверяем типы обязательных аргументов _ValidType(0, VT_BSTR, TRUE); _ValidType(1, VT_BSTR, TRUE); // Третий аргумент - необязательный, если он не задан - // полагаем FALSE if (dps.cArgs = 3) and _ValidType(2, VT_BOOL, TRUE) then B := dps.rgvarg^[pDispIds^[0]].vbool else B := FALSE; // Вызываем метод для создания компонента DoCreateControl(dps.rgvarg^[pDispIds^[0]].bstrVal, dps.rgvarg^[pDispIds^[1]].bstrVal, B); end else if FOwner is TCollection then begin // Добавляем компонент P := TCollection(FOwner).Add; // И возвращаем его интерфейс IDispatch OleVariant(varResult^) := FScriptControl.GetProxy(P); end else if FOwner is TStrings then begin // Проверяем наличие аргументов CheckArgCount(dps.cArgs, [1,2], TRUE); // Проверяем, что аргумент – строка _ValidType(0, VT_BSTR, TRUE); if dps.cArgs = 2 then // Второй аргумент - позиция в списке I := _IntValue(1) else // Если его нету - вставляем в конец I := TStrings(FOwner).Count; // Добавляем строку TStrings(FOwner).Insert(I, dps.rgvarg^[pDispIds^[0]].bstrVal); end; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!