unit VariantsClientMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROWinInetHTTPChannel, ExtCtrls, uROSOAPMessage, VariantsLibrary_Intf; type TVariantsClientMainForm = class(TForm) BINMessage: TROBinMessage; HTTPChannel: TROWinInetHTTPChannel; RORemoteService: TRORemoteService; TestButton: TButton; Memo: TMemo; SOAPMessage: TROSOAPMessage; rgMessageType: TRadioGroup; procedure TestButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure rgMessageTypeClick(Sender: TObject); private fVariantsService: IVariantsService; { Private declarations } public { Public declarations } end; var VariantsClientMainForm: TVariantsClientMainForm; implementation uses Variants; {$R *.dfm} procedure TVariantsClientMainForm.TestButtonClick(Sender: TObject); procedure CheckVariants(const InputVariant, OutputVariant: Variant; CheckType: boolean = TRUE); var v1, v2: integer; begin if (InputVariant <> OutputVariant) then raise Exception.Create('Variants differ!'); { if CheckType then begin v1 := VarType(InputVariant); v2 := VarType(OutputVariant); if v1<>v2 then raise Exception.CreateFmt('Variant TYPE is different (%d, %d)!', [v1, v2]); end;} end; var inputvar, outputvar: Variant; i: integer; incomplex, outcomplex: TComplexObject; inarray, outarray: TVariantArray; begin // Complex object incomplex := TComplexObject.Create; incomplex.IntegerId := 101; incomplex.VariantValue := 'My Variant'; fVariantsService.EchoComplexObject(incomplex, outcomplex); Memo.Lines.Add('Received ' + IntToStr(outcomplex.IntegerId) + ', ' + outcomplex.VariantValue); incomplex.Free; outcomplex.Free; // Simple variant array if not (RORemoteService.Message is TROSOAPMessage) then begin inputvar := VarArrayCreate([0, 10], varVariant); i := 0; for i := 0 to 10 do inputvar[i] := 'SomeText'; fVariantsService.EchoVariant(inputvar, outputvar); for i := 0 to VarArrayHighBound(outputvar, 1) do Memo.Lines.Add('Simple variant array item #' + IntToStr(i) + '=' + VarToStr(outputvar[i])); end; // Variant array (complex type) inarray := TVariantArray.Create; inarray.Add('A string'); inarray.Add(1); inarray.Add(Now); inarray.Add(True); fVariantsService.EchoVariantArray(inarray, outarray); for i := 0 to outarray.Count - 1 do Memo.Lines.Add('Variant array item #' + IntToStr(i) + '=' + VarToStr(outarray[i])); inarray.Free; outarray.Free; Memo.Lines.Add(''); // String inputvar := 'Test'; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Shortint inputvar := 12; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Byte inputvar := 200; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Integer inputvar := 123456; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Float inputvar := 22.39; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar, FALSE); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Float (big one) inputvar := 780000.32; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar, FALSE); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Shortint inputvar := -12; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Byte inputvar := -200; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Integer inputvar := -123456; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Float inputvar := -22.39; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar, FALSE); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Float (big one) inputvar := -780000.32; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar, FALSE); Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Datetime inputvar := Now; fVariantsService.EchoVariant(inputvar, outputvar); // CheckVariants(inputvar, outputvar); // For some reason 2 equal datetimes seem different to Delphi (using SOAP) Memo.Lines.Add('Received ' + VarToStr(outputvar)); // Boolean inputvar := true; fVariantsService.EchoVariant(inputvar, outputvar); CheckVariants(inputvar, outputvar); Memo.Lines.Add('Received ' + VarToStr(outputvar)); if (RORemoteService.Message is TROSOAPMessage) then Exit; // Array Memo.Lines.Add(''); inputvar := VarArrayCreate([0, 3], varVariant); inputvar[0] := 1; inputvar[1] := 1234.5678; inputvar[2] := 'Hello world'; inputvar[3] := True; fVariantsService.EchoVariant(inputvar, outputvar); for i := 0 to VarArrayHighBound(outputvar, 1) do Memo.Lines.Add('Array element #' + IntToStr(i) + ': ' + VarToStr(outputvar[i])); end; procedure TVariantsClientMainForm.FormCreate(Sender: TObject); var i: integer; begin for i := 0 to ComponentCount - 1 do if (Components[i] is TROMessage) then begin rgMessageType.Items.AddObject(TROMessage(Components[i]).Name, Components[i]); end; rgMessageType.ItemIndex := 1; FVariantsService := (RORemoteService as IVariantsService); end; procedure TVariantsClientMainForm.rgMessageTypeClick(Sender: TObject); begin RORemoteService.Message := TROMessage(rgMessageType.Items.Objects[rgMessageType.ItemIndex]); FVariantsService := (RORemoteService as IVariantsService); if (RORemoteService.Message is TROSOAPMessage) then HTTPChannel.TargetURL := 'http://localhost:8099/SOAP' else HTTPChannel.TargetURL := 'http://localhost:8099/BIN'; end; end.