DataSnapコールバックの例:サーバーメソッドの呼び出し中にユーザーにデータを要求する

それは何で、何のためですか:



Datasnapの操作は、データサーバーからの要求とサーバーメソッドの呼び出しで構成されます。たとえば、次のとおりです。

-サーバー(データセット)から製品のリストを要求します

-新しいドキュメントを作成する

-アイテムを追加します

-文書を閉じる



ポジションを追加するときに、委託品またはカットを選択するなど、追加の選択が必要になる場合があります。



これは、エラーコード(準備/実行など)を返すことで実行できます。これにより、クライアントはユーザーに尋ねてから、操作を再試行します。

または、必要なすべてのデータを使用して、操作中にサーバーにクライアントを直接要求する機能を提供します。







できること:

最初のオプションでは、適切な処理を伴うエラーコードのリストが必要です。

2番目のオプションでは、サーバーが呼び出すことができるコールバック関数を使用してクライアントを登録する必要があります。また、サーバーへの呼び出しごとに、サーバーはクライアントからの応答を要求する場合があることに注意してください(要求がユーザーからの応答を要求する場合、ブロックする恐れがあります)。 シングルスレッドのユーザーインターフェイスでロックが発生しないようにするには、サーバーへの呼び出しを別のスレッドで行う必要があります-サーバーからの呼び出しはメインスレッドと同期できます(メインスレッドは、元のサーバーメソッド呼び出しから制御が戻るまで待機しません)。 また、サーバーにクライアントIDを伝えることを忘れないでください。



呼び出し:

procedure TForm2.btnRegisterWareClick(Sender: TObject); begin TThread.CreateAnonymousThread( procedure() begin clmClient.ServerMethods1Client.RegisterWare(seWareID.Value, clmClient.DSClientCallbackChannelManager1.ManagerId) end).Start; end;
      
      







コールバック関数自体:

  TmyCallback = class(TDBXCallback) protected FSelectedString: Integer; procedure SelectString(const Arg: TJSONValue); public function Execute(const Arg: TJSONValue): TJSONValue; override; end; { TmyCallback } function TmyCallback.Execute(const Arg: TJSONValue): TJSONValue; begin TThread.Synchronize(nil, procedure() //     -     begin SelectString(Arg); end); Result := TJSONNumber.Create(FSelectedString); end; procedure TmyCallback.SelectString(const Arg: TJSONValue); var strs: TStringList; enum: TJSONPairEnumerator; val, str: string; begin enum := TJSONObject(Arg).GetEnumerator; if Assigned(enum) then begin strs := TStringList.Create; try while enum.MoveNext do begin Val:= enum.Current.JsonString.Value; str := enum.Current.JsonValue.Value; strs.AddObject(str, TObject(val.ToInteger())); end; FSelectedString := TfrmSelectString.SelectString(strs); finally strs.Free; end; end; enum.Free; end;
      
      





そして、ここでサーバー上で何が起こるかです:

 procedure TServerMethods1.RegisterWare(ID: Integer; ClientID: string); var Params, ParamsServ: TJSONObject; ResObj: TJSONValue; temp: TJSONValue; begin ResObj := nil; Params := TJSONObject.Create; Params.AddPair(TJSONPair.Create('1', ' 42')); Params.AddPair(TJSONPair.Create('2', ' 43')); Params.AddPair(TJSONPair.Create('3', ' 44')); ParamsServ := TJSONObject(Params.Clone); ServerContainer1.DSServer1.NotifyCallback(ClientID, 'SelectString', Params, ResObj); if Assigned(ResObj) then begin temp := ParamsServ.GetValue(ResObj.Value); if Assigned(temp) then Form1.QueueLogMsg(Format('RegisterWare %d   %s', [ID, temp.ToString])) else Form1.QueueLogMsg(Format('RegisterWare %d  ', [ID])); ResObj.Free; ParamsServ.Free; end else Form1.QueueLogMsg(Format('RegisterWare %d  ', [ID])); end;
      
      





そして最後に、リマインダー:

-ローカルプロシージャ変数-初期化されていません

-あなたが関数に渡すすべて-あなたは彼らに別れを告げることができ、自由ではない

-関数から取得するすべて-解放する必要があります(ここではARCは機能しません(ただし、携帯電話の場合は明確にする必要があります))



コールバックを使用して何でもできます。既製のデータセットまたはSQLクエリを渡すか、ストアドプロシージャが選択のためにセットを返すディレクトリの名前を渡します。



コード: http : //code.google.com/p/datasnap-callback-with-ui/source/browse/



この例は、Datasnapのコールバック、特にサーバーリクエスト中のクライアントへのコールバックの技術を研究するために私が作成したものです。

私はまだ技術を決定していないので、RealThinClientはそのような技術の研究の次の人になります



All Articles