Что такое опция Index в производных от TRemotable классах?

StackOverflow https://stackoverflow.com/questions/407467

  •  03-07-2019
  •  | 
  •  

Вопрос

Когда мастер импорта 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top