2

これらの新しい型を宣言しました:

type
 TRacer = record
  name: string;
  win, tie, loss, points: integer;
 end;

 TRacersList = TList<TRacer>;

次のようなデータモジュールにプロシージャがあります。

procedure DMConnection.getDivision(aList: TRacersList; const game, id: string);
begin

 //1) setup the REST params
 RESTRequest.Params[0].Value := game;
 RESTRequest.Params[1].Value := id;

 //2) execute async so UI won't freeze
 RESTRequest.ExecuteAsync(procedure
 var tmp: TRacer;
    ja: TJSONArray;
    jv: TJSONValue;
 begin

  //parse the JSON. The RESTResponse is a TRESTResponse that holds the result of the RESTRequest. I have made a test inside the component (right click -> execute) and it works properly (= I can see the JSON inside the Content property).
  ja := TJSONObject.ParseJSONValue(RESTResponse.Content) as TJSONArray;

  for jv in ja do begin
   tmp.name := jv.GetValue<string>('name');
   tmp.win := jv.GetValue<integer>('Wins');
   tmp.tie := jv.GetValue<integer>('Ties');
   tmp.loss := jv.GetValue<integer>('Loss');
   tmp.points := jv.GetValue<integer>('Pts');

   aList.Add(tmp);
  end;

 end);

end;

ご参考までに、これは JSON 文字列です。

[{"name":"payer1","Wins":"1","Ties":"0","Loss":"0","Pts":"3"},{"name":"Velocity","Wins":"0","Ties":"0","Loss":"1","Pts":"0"},{"name":"test2","Wins":"0","Ties":"0","Loss":"0","Pts":"0"}]

メイン フォームでは、次の方法でプロシージャを呼び出すことができます。

DMConnection.getDivision(myList, 'mku', 'k2');

次の問題があります。変数myList: TRacersListは、フォームの OnCreate および OnDestroy イベントで作成および解放されます。このコードを実行しようとすると:

DMConnection.getDivision(myList, 'mku', 'k2');
ShowMessage(myList.Count.toString);

結果は 0 です。代わりに、aList.Add(tmp); OUTSIDEを非同期リクエスト (たとえば、パラメーターのセットアップの前) に配置すると、カウントは 1 になります。

これは、リストがの完了ハンドラーの外側にある場合はリストが満たされているExecuteAsyncが、リストが内側にある場合はそうでないことを意味します。何か案が?

デフォルトで Synchronize が True に設定されていることを確認したので、追加します

TTHread.Synchronize(nil, procedure
begin
 aList.Add(tmp);
end)

役に立たないでしょう。私は何をすべきか?この解析/残りのものをデータモジュールに入れたいので、インターネットのものをアプリの実装から分離しておくことができます。

4

0 に答える 0