Remotable-Objekt (Beispiel)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Nicht-skalare Typen in aufrufbaren Interfaces verwenden


Das folgende Beispiel verdeutlicht, wie Sie ein Remotable-Objekt für einen Parameter einer aufrufbaren Schnittstelle erstellen, für die Sie ansonsten eine bestehende Klasse verwenden würden. In diesem Beispiel ist die bestehende Klasse eine Stringliste (TStringList). Um das Beispiel übersichtlich zu halten, wird hier die Eigenschaft Objects der String-Liste nicht wiedergegeben.

Da die neue Klasse nicht skalar ist, ist sie nicht von TRemotableXS, sondern von TRemotable abgeleitet. Sie enthält für jede Eigenschaft der Stringliste, die Sie zwischen Client und Server austauschen möchten, eine publizierte Eigenschaft. Jede dieser Remotable-Eigenschaften entspricht einem bestimmten Remotable-Typ. Außerdem enthält die neue Remotable-Klasse Methoden zur Konvertierung in und aus einer Stringliste.

 TRemotableStringList = class(TRemotable)
   private
     FCaseSensitive: Boolean;
     FSorted: Boolean;
     FDuplicates: TDuplicates;
     FStrings: TStringDynArray;
   public
     procedure Assign(SourceList: TStringList);
     procedure AssignTo(DestList: TStringList);
   published
     property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive;
     property Sorted: Boolean read FSorted write FSorted;
     property Duplicates: TDuplicates read FDuplicates write FDuplicates;
     property Strings: TStringDynArray read FStrings write FStrings;
 end;
 class TRemotableStringList: public TRemotable
 {
   private:
     bool FCaseSensitive;
     bool FSorted;
     Classes::TDuplicates FDuplicates;
     System::TStringDynArray FStrings;
   public:
     void __fastcall Assign(Classes::TStringList *SourceList);
     void __fastcall AssignTo(Classes::TStringList *DestList);
 __published:
     __property bool CaseSensitive = {read=FCaseSensitive, write=FCaseSensitive};
     __property bool Sorted = {read=FSorted, write=FSorted};
     __property Classes::TDuplicates Duplicates = {read=FDuplicates, write=FDuplicates};
     __property System::TStringDynArray Strings = {read=FStrings, write=FStrings};
 }

Beachten Sie, dass TRemotableStringList nur als Transportklasse vorliegt. Obwohl die Klasse die Eigenschaft Sorted aufweist (um den Wert der Eigenschaft Sorted einer String-Liste zu transportieren), braucht sie daher die gespeicherten Strings nicht zu sortieren, sondern lediglich zu vermerken, ob die Strings sortiert werden sollen. Auf diese Weise wird die Implementierung einfach gehalten. Sie müssen lediglich die Methoden Assign und AssignTo implementieren, die zum Konvertieren in und aus einer String-Liste dienen:

 procedure TRemotableStringList.Assign(SourceList: TStrings);
 var I: Integer;
 begin
   SetLength(Strings, SourceList.Count);
   for I := 0 to SourceList.Count - 1 do
     Strings[I] := SourceList[I];
   CaseSensitive := SourceList.CaseSensitive;
   Sorted := SourceList.Sorted;
   Duplicates := SourceList.Duplicates;
 end;
 procedure TRemotableStringList.AssignTo(DestList: TStrings);
 var I: Integer;
 begin
   DestList.Clear;
   DestList.Capacity := Length(Strings);
   DestList.CaseSensitive := CaseSensitive;
   DestList.Sorted := Sorted;
   DestList.Duplicates := Duplicates;
   for I := 0 to Length(Strings) - 1 do
     DestList.Add(Strings[I]);
 end;
 void __fastcall TRemotableStringList::Assign(Classes::TStringList *SourceList)
 {
   SetLength(Strings, SourceList->Count);
   for (int i = 0; i < SourceList->Count; i++)
     Strings[i] = SourceList->Strings[i];
   CaseSensitive = SourceList->CaseSensitive;
   Sorted = SourceList->Sorted;
   Duplicates = SourceList->Duplicates;
 }
 void __fastcall TRemotableStringList::AssignTo(Classes::TStringList *DestList)
 {
   DestList->Clear();
   DestList->Capacity = Length(Strings);
   DestList->CaseSensitive = CaseSensitive;
   DestList->Sorted = Sorted;
   DestList->Duplicates = Duplicates;
   for (int i = 0; i < Length(Strings); i++)
     DestList->Add(Strings[i]);
 }

Wahlweise können Sie die neue Remotable-Klasse registrieren, um ihren Klassennamen festzulegen. Wenn Sie die Klasse nicht registrieren, erfolgt die Registrierung automatisch, sobald Sie die Schnittstelle registrieren, von der die Klasse verwendet wird. Analog dazu werden die Typen TDuplicates und TStringDynArray automatisch registriert, wenn Sie zwar die Klasse, von der sie verwendet werden, nicht jedoch die beiden Typen selbst registrieren. Der folgende Quelltext zeigt, wie die Klasse TRemotableStringList und der Typ TDuplicates zu registrieren sind. TStringDynArray wird automatisch registriert, da dieser Typ zu den integrierten dynamischen Array-Typen gehört, die in der Unit Types deklariert sind.

Der Registrierungsquelltext gehört in den Initialisierungsabschnitt der Unit, in der Sie die Remotable-Klasse definieren:

 RemClassRegistry.RegisterXSInfo(TypeInfo(TDuplicates), MyNameSpace, 'duplicateFlag');
 RemClassRegistry.RegisterXSClass(TRemotableStringList, MyNameSpace, 'stringList', '',False);
 void RegTypes()
 {
   RemTypeRegistry()->RegisterXSclass(__classid(TRemotableStringList), MyNameSpace, "stringList", "", false);
 }

Siehe auch