mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-04-05 12:27:48 +02:00
132 lines
3.2 KiB
ObjectPascal
132 lines
3.2 KiB
ObjectPascal
program demoxhr;
|
|
|
|
uses SysUtils, JS, Web, DB, JSonDataset, ExtJSDataset, strutils, DBConst;
|
|
|
|
Type
|
|
|
|
{ TForm }
|
|
|
|
TForm = Class
|
|
XHR : TJSXMLHttpRequest;
|
|
Table,
|
|
Panel,
|
|
PanelContent,
|
|
Button : TJSElement;
|
|
DS : TExtJSJSONObjectDataSet;
|
|
|
|
function onLoad(Event: TEventListenerEvent): boolean;
|
|
Constructor create;
|
|
function CreateTable: TJSElement;
|
|
private
|
|
function ButtonClick(Event: TJSMouseEvent): boolean;
|
|
function CreateRow(AName: String; APopulation: NativeInt): TJSElement;
|
|
end;
|
|
|
|
|
|
function TForm.CreateRow(AName : String; APopulation : NativeInt) : TJSElement;
|
|
|
|
Var
|
|
C : TJSElement;
|
|
|
|
begin
|
|
Result:=document.createElement('TR');
|
|
C:=document.createElement('TD');
|
|
Result.Append(C);
|
|
C.appendChild(Document.createTextNode(AName));
|
|
C:=document.createElement('TD');
|
|
Result.Append(C);
|
|
C.AppendChild(document.createTextNode(IntToStr(APopulation)));
|
|
end;
|
|
|
|
function TForm.CreateTable : TJSElement;
|
|
|
|
Var
|
|
TH,R,H : TJSElement;
|
|
|
|
begin
|
|
Result:=document.createElement('TABLE');
|
|
Result.className:='table table-striped table-bordered table-hover table-condensed';
|
|
TH:=document.createElement('THEAD');
|
|
Result.Append(TH);
|
|
R:=document.createElement('TR');
|
|
TH.Append(R);
|
|
H:=document.createElement('TH');
|
|
R.Append(H);
|
|
H.AppendChild(document.createTextNode('Name'));
|
|
H:=document.createElement('TH');
|
|
R.Append(H);
|
|
H.AppendChild(document.createTextNode('Population'));
|
|
end;
|
|
|
|
function TForm.onLoad(Event: TEventListenerEvent): boolean;
|
|
|
|
var
|
|
i : integer;
|
|
C,J : TJSObject;
|
|
N,TB : TJSElement;
|
|
|
|
begin
|
|
console.log('Result of call ',xhr.Status);
|
|
{ While (PanelContent.childNodes.length>0) do
|
|
PanelContent.removeChild(PanelContent.childNodes.item(PanelContent.childNodes.length-1));}
|
|
if (xhr.status = 200) then
|
|
begin
|
|
J:=TJSJSON.parseObject(xhr.responseText);
|
|
DS.Metadata:=TJSObject(J.Properties['metaData']);
|
|
DS.Rows:=TJSArray(J.Properties['Data']);
|
|
DS.Open;
|
|
Table:=CreateTable;
|
|
Document.Body.append(Table);
|
|
TB:=document.createElement('TBODY');
|
|
Table.Append(TB);
|
|
While not DS.EOF do
|
|
begin
|
|
TB.Append(CreateRow(DS.FieldByName('Name').AsString,DS.FieldByName('Population').AsInteger));
|
|
DS.Next;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
N:=Document.CreateElement('div');
|
|
N.appendChild(Document.createTextNode('Failed to load countries: '+IntToStr(xhr.Status)));
|
|
PanelContent.append(N);
|
|
end;
|
|
Result := True;
|
|
end;
|
|
|
|
function TForm.ButtonClick(Event: TJSMouseEvent): boolean;
|
|
|
|
begin
|
|
xhr:=TJSXMLHttpRequest.New;
|
|
xhr.addEventListener('load', @OnLoad);
|
|
xhr.open('GET', 'countries.json', true);
|
|
xhr.send;
|
|
Result:=true;
|
|
end;
|
|
|
|
constructor TForm.create;
|
|
|
|
|
|
begin
|
|
Panel:=document.createElement('div');
|
|
// attrs are default array property...
|
|
Panel['class']:='panel panel-default';
|
|
PanelContent:=document.createElement('div');
|
|
PanelContent['class']:='panel-body';
|
|
Button:=document.createElement('input');
|
|
Button['id']:='Button1';
|
|
Button['type']:='submit';
|
|
Button.className:='btn btn-default';
|
|
Button['value']:='Fetch countries';
|
|
TJSHTMLElement(Button).onclick:=@ButtonClick;
|
|
document.body.appendChild(panel);
|
|
Panel.appendChild(PanelContent);
|
|
PanelContent.appendChild(Button);
|
|
DS:=TExtJSJSONObjectDataSet.Create(Nil);
|
|
end;
|
|
|
|
begin
|
|
TForm.Create;
|
|
end.
|
|
|