Для чего нужна опция Index в TRemotable производных классах? - PullRequest
3 голосов
/ 02 января 2009

Когда мастер импорта WSDL генерирует интерфейсы, все свойства имеют опцию Index, но, читая код и модуль InvokeRegistry, я не могу найти для чего это, кто-нибудь знает, действительно ли это необходимо?

Как это

  Login = class(TRemotable)
  private
    [...] 
  published
    property User: string Index (IS_OPTN) read GetUser write SetUser stored User_Specified;
    [...]
  end;

Я спрашиваю, потому что я хочу изменить этот модуль, добавив некоторые интерфейсы к этим классам для интеграции с платформой MVP.

Ответы [ 3 ]

2 голосов
/ 13 февраля 2009

Я нашел более подробное объяснение этого вопроса, При использовании индексов несколько свойств могут использовать одни и те же методы доступа.

Хороший пример из Delphi 2009 Help:

type 
   TRectangle = class 
     private 
       FCoordinates: array[0..3] of Longint; 
       function GetCoordinate(Index: Integer): Longint; 
       procedure SetCoordinate(Index: Integer; Value: Longint); 
     public 
       property Left: Longint index 0 read GetCoordinate write SetCoordinate; 
       property Top: Longint index 1 read GetCoordinate write SetCoordinate; 
       property Right: Longint index 2 read GetCoordinate write SetCoordinate; 
       property Bottom: Longint index 3 read GetCoordinate write SetCoordinate; 
       property Coordinates[Index: Integer]: Longint read GetCoordinate write SetCoordinate; 
       ... 
   end;

Обратите внимание, что все свойства имеют одинаковый метод доступа.

2 голосов
/ 03 января 2009

IS_OPTN передается в GetUser и SetUser через параметр 'Index' при доступе к свойству пользователя.

Геттеры / сеттеры, вероятно, выглядят так:

function GetUser(Index:Integer):String;
procedure SetUser(Index:Integer;const value:string);

Итак, подумайте об этом так:

MyString := MyLogin.user;
// is translated to:
MyString := getUser(IS_OPTN);

и

MyLogin.user := 'me'; 
// is translated to:
SetUser(IS_OPTN,'me');
0 голосов
/ 27 октября 2016

Да, это необходимо. С этой информацией, например, для IS_OPTN, класс из TRemotable знает, что когда свойство является необязательным для построения XML, поэтому, если это необязательно, узел добавляется, только если значение сохранено. По вашему делу:

property User: string Index (IS_OPTN) read GetUser write SetUser stored User_Specified

Элемент Пользователь будет добавлен в XML, если User_Specified true. User_Specified автоматически становится истинным, когда вы устанавливаете значение User, потому что установщик SetUser делает это.

Таким образом, когда компонент SOAP, например, будет создавать XML, элемент будет добавлен только в том случае, если он хранится, поскольку он необязательный (IS_OPTN).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...