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

 

Если создавать 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;

 

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

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

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

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


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