リモート可能オブジェクトの例
Web サービスの利用:インデックス への移動
次の例は,起動可能インターフェースのパラメータ用に,既存のクラスを使用するかわりにリモート可能オブジェクトを作成する方法を示しています。この例では,既存のクラスは文字列リスト(TStringList)です。この例を小さくとどめるために,この文字列リストの Objects プロパティは複製していません。
この新しいクラスはスカラーではないので,TRemotableXS ではなく TRemotable を継承します。クライアントとサーバーの間で通信する文字列リストのあらゆるプロパティのパブリッシュプロパティが含まれています。これらのリモート可能プロパティは,リモート可能型に対応します。さらに,新しいリモート可能クラスには,文字列リストへの変換および文字列リストからの変換を行うメソッドが含まれます。
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};
}
TRemotableStringList は,トランスポートクラスとしてのみ存在しています。したがって,(文字列リストの Sorted プロパティの値を転送するために)Sorted プロパティは持っていますが,格納している文字列をソートする必要はなく,文字列をソートすべきかどうかを記録する必要があるだけです。したがって,実装がたいへん単純になります。文字列リストへの変換および文字列リストからの変換を行う Assign メソッドと AssignTo メソッドさえ実装すればよいからです。
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]);
}
新しいリモート可能クラスを登録してクラス名を指定できるようにすることもできます。このクラスを登録しない場合は,これを使用するインターフェースを登録したときに自動的に登録されます。同様に,このクラスを登録し,このクラスが使用する TDuplicates 型と TStringDynArray 型を登録しない場合は,これらの型は自動的に登録されます。次のコードは,TRemotableStringList クラスおよび TDuplicates 型の登録方法を示しています。TStringDynArray は自動的に登録されます。なぜなら,Types ユニットで宣言された組み込みの動的配列型の 1 つだからです。
この場合,このリモート可能クラスを定義するユニットの初期化部に,次の登録コードを追加します。
RemClassRegistry.RegisterXSInfo(TypeInfo(TDuplicates), MyNameSpace, 'duplicateFlag');
RemClassRegistry.RegisterXSClass(TRemotableStringList, MyNameSpace, 'stringList', '',False);
void RegTypes()
{
RemTypeRegistry()->RegisterXSclass(__classid(TRemotableStringList), MyNameSpace, "stringList", "", false);
}
#pragma startup initServices 32