Что такое опция Index в производных от TRemotable классах?
Вопрос
Когда мастер импорта WSDL генерирует интерфейсы, все свойства имеют опцию Index, но, читая код и блок InvokeRegistry, я не могу найти, для чего это нужно, кто-нибудь знает, действительно ли это необходимо?
Вот так
Login = class(TRemotable)
private
[...]
published
property User: string Index (IS_OPTN) read GetUser write SetUser stored User_Specified;
[...]
end;
Я спрашиваю, потому что хочу изменить этот модуль, добавив некоторые интерфейсы к этим классам, для интеграции с MVP framework.
Решение 2
Я нашел более подробное объяснение этого вопроса, При использовании индексов несколько свойств могут совместно использовать одни и те же методы доступа.
Хороший пример из справки Delphi 2009:
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;
Обратите внимание, что ко всем свойствам используется один и тот же метод доступа.
Другие советы
IS_OPTN передается getUser и setUser через параметр 'Index', когда вы обращаетесь к свойству user.
Получатели / установщики, вероятно, выглядят следующим образом:
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');
Да, это необходимо.С помощью этой информации, например IS_OPTN, класс из TRemotable знает, что свойство when является необязательным для построения XML, поэтому, если это необязательно, узел добавляется только в том случае, если значение сохранено.По вашему делу:
property User: string Index (IS_OPTN) read GetUser write SetUser stored User_Specified
Элемент Пользователь будет добавлено в XML, если Указанный пользователем верно.Тот Самый Указанный пользователем автоматически становится true, когда вы устанавливаете значение User, потому что установщик setUser делает это.
Итак, когда компонент SOAP, например, создаст XML, элемент будет добавлен только в том случае, если сохранен, потому что он необязательный (IS_OPTN).