2
0

demoload.lpr 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. program demoload;
  2. uses SysUtils, Classes, JS, Web, DB, JSONDataset, ExtJSDataset, RestConnection;
  3. Type
  4. { TRestDataset }
  5. TRestDataset = Class(TExtJSJSONObjectDataSet)
  6. private
  7. FConnection: TRestConnection;
  8. Protected
  9. Function DoGetDataProxy: TDataProxy; override;
  10. Public
  11. Property Connection: TRestConnection Read FConnection Write FConnection;
  12. end;
  13. { TForm }
  14. TForm = Class
  15. Table,
  16. TBody : TJSElement;
  17. Panel,
  18. PanelContent,
  19. Button : TJSElement;
  20. DS : TRestDataset;
  21. Conn : TRestConnection;
  22. Constructor create;
  23. function CreateTable: TJSElement;
  24. private
  25. procedure AddRecords;
  26. function ButtonClick(Event: TJSMouseEvent): boolean;
  27. function CreateRow(AName: String; APopulation: NativeInt): TJSElement;
  28. procedure DoAfterLoad(DataSet: TDataSet);
  29. procedure DoGetURL(Sender: TComponent; aRequest: TDataRequest; Var aURL: String);
  30. procedure DoLoadFail(DataSet: TDataSet; ID: Integer; const ErrorMsg: String);
  31. procedure DSOpen(DataSet: TDataSet);
  32. end;
  33. function TRestDataset.DoGetDataProxy: TDataProxy;
  34. begin
  35. Result:=Connection.DataProxy;
  36. end;
  37. function TForm.CreateRow(AName : String; APopulation : NativeInt) : TJSElement;
  38. Var
  39. C : TJSElement;
  40. begin
  41. Result:=document.createElement('TR');
  42. C:=document.createElement('TD');
  43. Result.Append(C);
  44. C.appendChild(Document.createTextNode(AName));
  45. C:=document.createElement('TD');
  46. Result.Append(C);
  47. C.AppendChild(document.createTextNode(IntToStr(APopulation)));
  48. end;
  49. procedure TForm.DoAfterLoad(DataSet: TDataSet);
  50. begin
  51. if Dataset.Active then
  52. begin
  53. Writeln('Loading additional records to table');
  54. // We're on the last record of the last batch, so move forward 1 record
  55. Dataset.Next;
  56. AddRecords;
  57. end;
  58. end;
  59. procedure TForm.DoGetURL(Sender: TComponent; aRequest: TDataRequest; Var aURL: String);
  60. begin
  61. aURL:='countries-'+IntToStr(aRequest.requestID)+'.json';
  62. end;
  63. procedure TForm.DoLoadFail(DataSet: TDataSet; ID: Integer; const ErrorMsg: String);
  64. Var
  65. N : TJSElement;
  66. begin
  67. N:=Document.CreateElement('div');
  68. N.appendChild(Document.createTextNode('Failed to load countries...'+ErrorMsg));
  69. PanelContent.append(N);
  70. end;
  71. function TForm.CreateTable : TJSElement;
  72. Var
  73. TH,R,H : TJSElement;
  74. begin
  75. Result:=document.createElement('TABLE');
  76. Result.className:='table table-striped table-bordered table-hover table-condensed';
  77. TH:=document.createElement('THEAD');
  78. Result.Append(TH);
  79. R:=document.createElement('TR');
  80. TH.Append(R);
  81. H:=document.createElement('TH');
  82. R.Append(H);
  83. H.AppendChild(document.createTextNode('Name'));
  84. H:=document.createElement('TH');
  85. R.Append(H);
  86. H.AppendChild(document.createTextNode('Population'));
  87. end;
  88. procedure TForm.DSOpen(DataSet: TDataSet);
  89. begin
  90. console.log('Dataset opened');
  91. Table:=CreateTable;
  92. Document.Body.append(Table);
  93. TBody:=document.createElement('TBODY');
  94. Table.Append(TBody);
  95. AddRecords;
  96. end;
  97. procedure TForm.AddRecords;
  98. begin
  99. Writeln('Adding records to table');
  100. While not DS.EOF do
  101. begin
  102. TBody.Append(CreateRow(DS.FieldByName('Name').AsString,DS.FieldByName('Population').AsInteger));
  103. DS.Next;
  104. end;
  105. end;
  106. function TForm.ButtonClick(Event: TJSMouseEvent): boolean;
  107. begin
  108. DS.Load([],Nil);
  109. Result:=true;
  110. end;
  111. constructor TForm.create;
  112. begin
  113. Panel:=document.createElement('div');
  114. // attrs are default array property...
  115. Panel['class']:='panel panel-default';
  116. PanelContent:=document.createElement('div');
  117. PanelContent['class']:='panel-body';
  118. Button:=document.createElement('input');
  119. Button['id']:='Button1';
  120. Button['type']:='submit';
  121. Button.className:='btn btn-default';
  122. Button['value']:='Fetch countries';
  123. TJSHTMLElement(Button).onclick:=@ButtonClick;
  124. document.body.appendChild(panel);
  125. Panel.appendChild(PanelContent);
  126. PanelContent.appendChild(Button);
  127. Conn:=TRestConnection.Create(nil);
  128. Conn.BaseURL:='countries.json';
  129. Conn.OnGetURL:=@DoGetURL;
  130. DS:=TRestDataset.Create(Nil);
  131. DS.Connection:=Conn;
  132. DS.OnLoadFail:=@DoLoadFail;
  133. DS.AfterLoad:=@DoAfterLoad;
  134. DS.AfterOpen:=@DSOpen;
  135. end;
  136. begin
  137. TForm.Create;
  138. end.