Browse Source

* Examples added

git-svn-id: trunk@15333 -
michael 15 years ago
parent
commit
ef213e67d6
71 changed files with 4194 additions and 0 deletions
  1. 70 0
      .gitattributes
  2. 77 0
      packages/fcl-web/examples/webdata/demo/createusers.lpi
  3. 136 0
      packages/fcl-web/examples/webdata/demo/createusers.lpr
  4. 11 0
      packages/fcl-web/examples/webdata/demo/extgrid-json.html
  5. 95 0
      packages/fcl-web/examples/webdata/demo/extgrid-json.js
  6. 11 0
      packages/fcl-web/examples/webdata/demo/extgrid-xml.html
  7. 98 0
      packages/fcl-web/examples/webdata/demo/extgrid-xml.js
  8. 73 0
      packages/fcl-web/examples/webdata/demo/extgrid.lpi
  9. 14 0
      packages/fcl-web/examples/webdata/demo/extgrid.lpr
  10. 22 0
      packages/fcl-web/examples/webdata/demo/lazwebdata.pas
  11. 78 0
      packages/fcl-web/examples/webdata/demo/reglazwebdata.pp
  12. 36 0
      packages/fcl-web/examples/webdata/demo/wmusers.lfm
  13. 12 0
      packages/fcl-web/examples/webdata/demo/wmusers.lrs
  14. 337 0
      packages/fcl-web/examples/webdata/demo/wmusers.pp
  15. 11 0
      packages/fcl-web/examples/webdata/demo2/extgrid-json.html
  16. 97 0
      packages/fcl-web/examples/webdata/demo2/extgrid-json.js
  17. 11 0
      packages/fcl-web/examples/webdata/demo2/extgrid-xml.html
  18. 100 0
      packages/fcl-web/examples/webdata/demo2/extgrid-xml.js
  19. 84 0
      packages/fcl-web/examples/webdata/demo2/extgrid.lpi
  20. 16 0
      packages/fcl-web/examples/webdata/demo2/extgrid.lpr
  21. 46 0
      packages/fcl-web/examples/webdata/demo2/wmusers.lfm
  22. 18 0
      packages/fcl-web/examples/webdata/demo2/wmusers.lrs
  23. 86 0
      packages/fcl-web/examples/webdata/demo2/wmusers.pp
  24. 11 0
      packages/fcl-web/examples/webdata/demo3/extgrid-json.html
  25. 97 0
      packages/fcl-web/examples/webdata/demo3/extgrid-json.js
  26. 11 0
      packages/fcl-web/examples/webdata/demo3/extgrid-xml.html
  27. 100 0
      packages/fcl-web/examples/webdata/demo3/extgrid-xml.js
  28. 334 0
      packages/fcl-web/examples/webdata/demo3/extgrid.lpi
  29. 16 0
      packages/fcl-web/examples/webdata/demo3/extgrid.lpr
  30. 9 0
      packages/fcl-web/examples/webdata/demo3/tralala.lfm
  31. 7 0
      packages/fcl-web/examples/webdata/demo3/tralala.lrs
  32. 28 0
      packages/fcl-web/examples/webdata/demo3/tralala.pp
  33. 49 0
      packages/fcl-web/examples/webdata/demo3/wmusers.lfm
  34. 21 0
      packages/fcl-web/examples/webdata/demo3/wmusers.lrs
  35. 68 0
      packages/fcl-web/examples/webdata/demo3/wmusers.pp
  36. 27 0
      packages/fcl-web/examples/webdata/demo4/dmusers.lfm
  37. 12 0
      packages/fcl-web/examples/webdata/demo4/dmusers.lrs
  38. 52 0
      packages/fcl-web/examples/webdata/demo4/dmusers.pp
  39. 11 0
      packages/fcl-web/examples/webdata/demo4/extgrid-json.html
  40. 97 0
      packages/fcl-web/examples/webdata/demo4/extgrid-json.js
  41. 11 0
      packages/fcl-web/examples/webdata/demo4/extgrid-xml.html
  42. 100 0
      packages/fcl-web/examples/webdata/demo4/extgrid-xml.js
  43. 93 0
      packages/fcl-web/examples/webdata/demo4/extgrid.lpi
  44. 15 0
      packages/fcl-web/examples/webdata/demo4/extgrid.lpr
  45. 18 0
      packages/fcl-web/examples/webdata/demo4/wmjsonusers.lfm
  46. 11 0
      packages/fcl-web/examples/webdata/demo4/wmjsonusers.lrs
  47. 34 0
      packages/fcl-web/examples/webdata/demo4/wmjsonusers.pp
  48. 18 0
      packages/fcl-web/examples/webdata/demo4/wmxmlusers.lfm
  49. 11 0
      packages/fcl-web/examples/webdata/demo4/wmxmlusers.lrs
  50. 34 0
      packages/fcl-web/examples/webdata/demo4/wmxmlusers.pp
  51. 11 0
      packages/fcl-web/examples/webdata/demo5/extgrid-json.html
  52. 97 0
      packages/fcl-web/examples/webdata/demo5/extgrid-json.js
  53. 11 0
      packages/fcl-web/examples/webdata/demo5/extgrid-xml.html
  54. 100 0
      packages/fcl-web/examples/webdata/demo5/extgrid-xml.js
  55. 75 0
      packages/fcl-web/examples/webdata/demo5/extgrid.lpi
  56. 15 0
      packages/fcl-web/examples/webdata/demo5/extgrid.lpr
  57. 29 0
      packages/fcl-web/examples/webdata/demo5/wmusers.lfm
  58. 15 0
      packages/fcl-web/examples/webdata/demo5/wmusers.lrs
  59. 85 0
      packages/fcl-web/examples/webdata/demo5/wmusers.pp
  60. 11 0
      packages/fcl-web/examples/webdata/demo6/extgrid-json.html
  61. 97 0
      packages/fcl-web/examples/webdata/demo6/extgrid-json.js
  62. 11 0
      packages/fcl-web/examples/webdata/demo6/extgrid-xml.html
  63. 100 0
      packages/fcl-web/examples/webdata/demo6/extgrid-xml.js
  64. 4 0
      packages/fcl-web/examples/webdata/demo6/extgrid.ini
  65. 362 0
      packages/fcl-web/examples/webdata/demo6/extgrid.lpi
  66. 16 0
      packages/fcl-web/examples/webdata/demo6/extgrid.lpr
  67. 131 0
      packages/fcl-web/examples/webdata/demo6/wmusers.lfm
  68. 43 0
      packages/fcl-web/examples/webdata/demo6/wmusers.lrs
  69. 107 0
      packages/fcl-web/examples/webdata/demo6/wmusers.pp
  70. 40 0
      packages/fcl-web/examples/webdata/demos.txt
  71. BIN
      packages/fcl-web/examples/webdata/users.dbf

+ 70 - 0
.gitattributes

@@ -2169,6 +2169,76 @@ packages/fcl-res/xml/versiontypes.xml svneol=native#text/plain
 packages/fcl-res/xml/winpeimagereader.xml svneol=native#text/plain
 packages/fcl-web/Makefile svneol=native#text/plain
 packages/fcl-web/Makefile.fpc svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/createusers.lpi svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/createusers.lpr svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/extgrid-json.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/extgrid-json.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/extgrid-xml.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/extgrid-xml.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/extgrid.lpi svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/extgrid.lpr svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/lazwebdata.pas svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/reglazwebdata.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/wmusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/wmusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo/wmusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/extgrid-json.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/extgrid-json.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/extgrid-xml.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/extgrid-xml.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/extgrid.lpi svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/extgrid.lpr svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/wmusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/wmusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo2/wmusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/extgrid-json.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/extgrid-json.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/extgrid-xml.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/extgrid-xml.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/extgrid.lpi svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/extgrid.lpr svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/tralala.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/tralala.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/tralala.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/wmusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/wmusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo3/wmusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/dmusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/dmusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/dmusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/extgrid-json.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/extgrid-json.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/extgrid-xml.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/extgrid-xml.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/extgrid.lpi svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/extgrid.lpr svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/wmjsonusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/wmjsonusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/wmjsonusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/wmxmlusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/wmxmlusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo4/wmxmlusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/extgrid-json.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/extgrid-json.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/extgrid-xml.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/extgrid-xml.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/extgrid.lpi svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/extgrid.lpr svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/wmusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/wmusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo5/wmusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/extgrid-json.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/extgrid-json.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/extgrid-xml.html svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/extgrid-xml.js svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/extgrid.ini svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/extgrid.lpi svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/extgrid.lpr svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/wmusers.lfm svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/wmusers.lrs svneol=native#text/plain
+packages/fcl-web/examples/webdata/demo6/wmusers.pp svneol=native#text/plain
+packages/fcl-web/examples/webdata/demos.txt svneol=native#text/plain
+packages/fcl-web/examples/webdata/users.dbf -text
 packages/fcl-web/fpmake.pp svneol=native#text/plain
 packages/fcl-web/fptemplate.txt svneol=native#text/plain
 packages/fcl-web/src/base/README.txt svneol=native#text/plain

+ 77 - 0
packages/fcl-web/examples/webdata/demo/createusers.lpi

@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <MainUnitHasTitleStatement Value="False"/>
+      </Flags>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Icon Value="0"/>
+      <UseXPManifest Value="True"/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+      <Language Value=""/>
+      <CharSet Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <Units Count="2">
+      <Unit0>
+        <Filename Value="createusers.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="createusers"/>
+        <CursorPos X="16" Y="35"/>
+        <TopLine Value="15"/>
+        <UsageCount Value="20"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="../../fpc/packages/fcl-db/src/dbase/dbf.pas"/>
+        <UnitName Value="dbf"/>
+        <CursorPos X="3" Y="1477"/>
+        <TopLine Value="1436"/>
+        <UsageCount Value="10"/>
+      </Unit1>
+    </Units>
+    <JumpHistory Count="0" HistoryIndex="-1"/>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <Target>
+      <Filename Value="createusers"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+      <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 136 - 0
packages/fcl-web/examples/webdata/demo/createusers.lpr

@@ -0,0 +1,136 @@
+program createusers;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}{$IFDEF UseCThreads}
+  cthreads,
+  {$ENDIF}{$ENDIF}
+  Classes, SysUtils, dbf, CustApp, db
+  { you can add units after this };
+
+type
+
+  { TMyApplication }
+
+  TMyApplication = class(TCustomApplication)
+  private
+    procedure CreateUsers(DS: TDataset);
+  protected
+    procedure DoRun; override;
+  public
+    constructor Create(TheOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure WriteHelp; virtual;
+  end;
+
+{ TMyApplication }
+
+Type
+  TUserRecord = Record
+    L,N,E : string;
+  end;
+
+Const
+  UserCount = 8;
+  Users : Array[1..UserCount] of TUserRecord = (
+   (L:'Daniel';N:'Daniel mantione'; E:'[email protected]'),
+   (L:'Florian';N:'Florian Klaempfl'; E:'[email protected]'),
+   (L:'Joost';N:'Joost van der Sluis'; E:'[email protected]'),
+   (L:'Jonas';N:'Jonas Maebe'; E:'[email protected]'),
+   (L:'Michael';N:'Michael van canneyt'; E:'[email protected]'),
+   (L:'Marco';N:'Marco Van De Voort'; E:'[email protected]'),
+   (L:'Pierre';N:'Pierre Muller'; E:'[email protected]'),
+   (L:'Tomas';N:'Tomas Hajny'; E:'[email protected]')
+   )  ;
+
+
+procedure TMyApplication.CreateUsers(DS : TDataset);
+
+Var
+  I : integer;
+
+begin
+  For I:=1 to UserCount do
+    begin
+    DS.Append;
+    DS.FieldByName('Login').AsString:=Users[i].L;
+    DS.FieldByName('Name').AsString:=Users[i].N;
+    DS.FieldByName('Email').AsString:=Users[i].E;
+    If Random(2)<1 then
+      DS.FieldByname('LastLogin').AsDatetime:=Date-Random(10);
+    DS.Post;
+    end;
+end;
+procedure TMyApplication.DoRun;
+var
+  ErrorMsg: String;
+  DB : TDBF;
+begin
+  // quick check parameters
+  ErrorMsg:=CheckOptions('h','help');
+  if ErrorMsg<>'' then begin
+    ShowException(Exception.Create(ErrorMsg));
+    Terminate;
+    Exit;
+  end;
+
+  // parse parameters
+  if HasOption('h','help') then begin
+    WriteHelp;
+    Terminate;
+    Exit;
+  end;
+
+  { add your program here }
+  DB:=TDBF.Create(Self);
+  try
+    With DB.FieldDefs do
+      begin
+      Add('ID',ftAutoInc,0,True);
+      Add('Login',ftString,30,true);
+      Add('Name',ftString,50,True);
+      Add('Email',ftString,50,False);
+      Add('LastLogin',ftDate,0,False);
+      end;
+    DB.TableName:='users.dbf';
+    DB.TableLevel:=7;
+    DB.CreateTable;
+    DB.Open;
+    CreateUsers(DB);
+  finally
+    DB.Free;
+  end;
+  // stop program loop
+  Terminate;
+end;
+
+constructor TMyApplication.Create(TheOwner: TComponent);
+begin
+  inherited Create(TheOwner);
+  StopOnException:=True;
+end;
+
+destructor TMyApplication.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TMyApplication.WriteHelp;
+begin
+  { add your help code here }
+  writeln('Usage: ',ExeName,' -h');
+end;
+
+var
+  Application: TMyApplication;
+
+{$IFDEF WINDOWS}{$R createusers.rc}{$ENDIF}
+
+begin
+  Application:=TMyApplication.Create(nil);
+  Application.Title:='My Application';
+  Application.Run;
+  Application.Free;
+end.
+

+ 11 - 0
packages/fcl-web/examples/webdata/demo/extgrid-json.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS JSON Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-json.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 95 - 0
packages/fcl-web/examples/webdata/demo/extgrid-json.js

@@ -0,0 +1,95 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/Read/name/",
+      update: "extgrid.cgi/Provider/Update/name/",
+      create: "extgrid.cgi/Provider/Insert/name/",
+      destroy: "extgrid.cgi/Provider/Delete/name/"
+    }
+  });
+  var myreader = new Ext.data.JsonReader ({
+      root: "rows",
+      idProperty: "ID",
+      messageProperty: 'message', // Must be specified here
+      fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.JsonWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID"
+  });
+  var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 11 - 0
packages/fcl-web/examples/webdata/demo/extgrid-xml.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS XML Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-xml.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 98 - 0
packages/fcl-web/examples/webdata/demo/extgrid-xml.js

@@ -0,0 +1,98 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/Read/name/?format=xml",
+      update: "extgrid.cgi/Provider/Update/name/?format=xml",
+      create: "extgrid.cgi/Provider/Insert/name/?format=xml",
+      destroy: "extgrid.cgi/Provider/Delete/name/?format=xml",
+    }
+  });
+  var myreader = new Ext.data.XmlReader ({
+      totalProperty: "total",
+      record: "row",
+      idProperty: "ID",
+      successProperty: "success",
+      messageProperty: "message",
+      fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.XmlWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID",
+      root: "records"
+  }); 
+    var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 73 - 0
packages/fcl-web/examples/webdata/demo/extgrid.lpi

@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <SaveClosedFiles Value="False"/>
+        <SaveOnlyProjectUnits Value="True"/>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <Runnable Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Icon Value="0"/>
+      <UseXPManifest Value="True"/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="3">
+      <Item1>
+        <PackageName Value="DBFLaz"/>
+        <MinVersion Minor="1" Release="1" Valid="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="WebLaz"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="FCL"/>
+      </Item3>
+    </RequiredPackages>
+    <Units Count="2">
+      <Unit0>
+        <Filename Value="extgrid.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="extgrid"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="wmusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmusers"/>
+      </Unit1>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <Target>
+      <Filename Value="extgrid.cgi"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+      <OtherUnitFiles Value="/home/michael/public_html/extjs/"/>
+    </SearchPaths>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+</CONFIG>

+ 14 - 0
packages/fcl-web/examples/webdata/demo/extgrid.lpr

@@ -0,0 +1,14 @@
+program extgrid;
+
+{$mode objfpc}{$H+}
+
+uses
+  fpCGI, wmusers;
+
+{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
+
+begin
+  Application.Initialize;
+  Application.Run;
+end.
+

+ 22 - 0
packages/fcl-web/examples/webdata/demo/lazwebdata.pas

@@ -0,0 +1,22 @@
+{ This file was automatically created by Lazarus. do not edit!
+  This source is only used to compile and install the package.
+ }
+
+unit lazwebdata; 
+
+interface
+
+uses
+    reglazwebdata, extjsjson, extjsxml, fpextjs, fpwebdata, sqldbwebdata, 
+  LazarusPackageIntf;
+
+implementation
+
+procedure Register; 
+begin
+  RegisterUnit('reglazwebdata', @reglazwebdata.Register); 
+end; 
+
+initialization
+  RegisterPackage('lazwebdata', @Register); 
+end.

+ 78 - 0
packages/fcl-web/examples/webdata/demo/reglazwebdata.pp

@@ -0,0 +1,78 @@
+unit reglazwebdata;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, fpwebdata, sqldbwebdata, LazIDEIntf, ProjectIntf, fpextjs, extjsjson, extjsxml;
+
+Type
+
+  { TFileDescWebProviderDataModule }
+
+  TFileDescWebProviderDataModule = class(TFileDescPascalUnitWithResource)
+  public
+    constructor Create; override;
+    function GetInterfaceUsesSection: string; override;
+    function GetLocalizedName: string; override;
+    function GetLocalizedDescription: string; override;
+    function GetImplementationSource(const Filename, SourceName, ResourceName: string): string;override;
+  end;
+
+Procedure Register;
+
+Var
+   FileDescriptorWebProviderDataModule: TFileDescWebProviderDataModule;
+
+implementation
+
+uses FormEditingIntf;
+
+constructor TFileDescWebProviderDataModule.Create;
+begin
+  inherited Create;
+  Name:='Web DataProvider Module';
+  ResourceClass:=TFPWebProviderDataModule;
+  UseCreateFormStatements:=False;
+end;
+
+function TFileDescWebProviderDataModule.GetInterfaceUsesSection: string;
+begin
+  Result:=inherited GetInterfaceUsesSection;
+  Result:=Result+', HTTPDefs, websession, fpHTTP, fpWeb, fpwebdata';
+end;
+
+function TFileDescWebProviderDataModule.GetLocalizedName: string;
+begin
+  Result:='Web DataProvider Module';
+end;
+
+function TFileDescWebProviderDataModule.GetLocalizedDescription: string;
+begin
+  Result:='WEB DataProvider Module'#13
+         +'A datamodule to handle data requests for WEB (HTTP) applications using WebDataProvider components.';
+end;
+
+function TFileDescWebProviderDataModule.GetImplementationSource(const Filename,
+  SourceName, ResourceName: string): string;
+begin
+  Result:=Inherited GetImplementationSource(FileName,SourceName,ResourceName);
+  Result:=Result+'  RegisterHTTPModule(''T'+ResourceName+''',T'+ResourceName+');'+LineEnding;
+end;
+
+
+Procedure Register;
+
+begin
+   RegisterComponents('fpWeb',[TWebdataInputAdaptor,TFPWebDataProvider, TSQLDBWebDataProvider,
+                               TExtJSJSonWebdataInputAdaptor,TExtJSJSONDataFormatter,
+                               TExtJSXMLWebdataInputAdaptor,TExtJSXMLDataFormatter]);
+   FileDescriptorWebProviderDataModule:=TFileDescWebProviderDataModule.Create;
+   RegisterProjectFileDescriptor(FileDescriptorWebProviderDataModule);
+   FormEditingHook.RegisterDesignerBaseClass(TFPCustomWebProviderDataModule);
+   FormEditingHook.RegisterDesignerBaseClass(TFPWebProviderDataModule);
+end;
+
+end.
+

+ 36 - 0
packages/fcl-web/examples/webdata/demo/wmusers.lfm

@@ -0,0 +1,36 @@
+object FPWebModule1: TFPWebModule1
+  OldCreateOrder = False
+  Actions = <  
+    item
+      Name = 'Read'
+      Default = False
+      OnRequest = TFPWebActions0Request
+    end  
+    item
+      Name = 'Insert'
+      Default = False
+      OnRequest = TFPWebActions1Request
+    end  
+    item
+      Name = 'Update'
+      Default = False
+      OnRequest = TFPWebActions2Request
+    end  
+    item
+      Name = 'Delete'
+      Default = False
+      OnRequest = TFPWebActions3Request
+    end>
+  CreateSession = False
+  Height = 300
+  HorizontalOffset = 696
+  VerticalOffset = 366
+  Width = 400
+  object Dbf1: TDbf
+    IndexDefs = <>
+    TableLevel = 4
+    FilterOptions = []
+    left = 23
+    top = 53
+  end
+end

+ 12 - 0
packages/fcl-web/examples/webdata/demo/wmusers.lrs

@@ -0,0 +1,12 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebModule1','FORMDATA',[
+  'TPF0'#13'TFPWebModule1'#12'FPWebModule1'#14'OldCreateOrder'#8#7'Actions'#14#1
+  +#4'Name'#6#4'Read'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions0Request'#0#1
+  +#4'Name'#6#6'Insert'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions1Request'#0
+  +#1#4'Name'#6#6'Update'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions2Request'
+  +#0#1#4'Name'#6#6'Delete'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions3Reques'
+  +'t'#0#0#13'CreateSession'#8#6'Height'#3','#1#16'HorizontalOffset'#3#184#2#14
+  +'VerticalOffset'#3'n'#1#5'Width'#3#144#1#0#4'TDbf'#4'Dbf1'#9'IndexDefs'#14#0
+  +#10'TableLevel'#2#4#13'FilterOptions'#11#0#4'left'#2#23#3'top'#2'5'#0#0#0
+]);

+ 337 - 0
packages/fcl-web/examples/webdata/demo/wmusers.pp

@@ -0,0 +1,337 @@
+unit wmusers;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
+  db, dbf, fpwebdata, fpextjs,extjsjson,extjsxml;
+
+type
+
+  { TFPWebModule1 }
+
+  TFPWebModule1 = class(TFPWebModule)
+    Dbf1: TDbf;
+    procedure TFPWebActions0Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions1Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions2Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions3Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebModule1: TFPWebModule1; 
+
+implementation
+{$define wmdebug}
+
+{$ifdef wmdebug}
+uses dbugintf;
+{$endif}
+
+{ TFPWebModule1 }
+
+procedure TFPWebModule1.TFPWebActions0Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+
+Var
+  PN : String;
+  P : TFPWebDataProvider;
+  F : TExtJSDataFormatter;
+  DS : TDatasource;
+  M : TMemoryStream;
+  L : Text;
+
+begin
+  // Providername;
+  PN:=ARequest.GetNextPathInfo;
+//  P:=GetWebDataProvider(PN);
+  P:=TFPWebDataProvider.Create(Self);
+  try
+    P.Adaptor:=TWebDataInputAdaptor.Create(Self);
+    P.Adaptor.Request:=ARequest;
+    If Request.QueryFields.values['format']='xml' then
+      begin
+      F:=TExtJSXMLDataFormatter.Create(Self);
+      TExtJSXMLDataFormatter(F).TotalProperty:='total';
+      AResponse.ContentType:='text/xml';
+      end
+    else
+      F:=TExtJSJSONDataFormatter.Create(Self);
+    {$ifdef wmdebug} SendDebug(className+' '+F.ClassName);{$endif}
+    try
+      DS:=TDatasource.Create(Self);
+      try
+        DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+        DS.Dataset:=DBf1;
+        DBF1.Open;
+        try
+          F.ADaptor:=P.Adaptor;
+          P.Datasource:=DS;
+          P.Adaptor.Action:=wdaRead;
+          P.ApplyParams;
+          F.Provider:=P;
+          M:=TMemoryStream.Create;
+          try
+            F.GetContent(ARequest,M,Handled);
+            M.Position:=0;
+            Response.ContentStream:=M;
+            Response.SendResponse;
+            Response.ContentStream:=Nil;
+            With TFileStream.Create('/tmp/data.xml',fmCreate) do
+              try
+                CopyFrom(M,0);
+              finally
+                Free;
+              end;
+          finally
+            M.Free;
+          end;
+        finally
+          DBF1.Close;
+        end;
+      finally
+        DS.Free;
+      end;
+    finally
+      F.Free;
+    end;
+  finally
+    P.Free;
+  end;
+end;
+
+procedure TFPWebModule1.TFPWebActions1Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+Var
+  PN : String;
+  P : TFPWebDataProvider;
+  F : TExtJSDataFormatter;
+  DS : TDatasource;
+  M : TMemoryStream;
+  L : Text;
+
+begin
+  // Providername;
+  PN:=ARequest.GetNextPathInfo;
+//  P:=GetWebDataProvider(PN);
+  P:=TFPWebDataProvider.Create(Self);
+  try
+    P.IDFieldName:='ID';
+    If Request.QueryFields.values['format']='xml' then
+      begin
+      F:=TExtJSXMLDataFormatter.Create(Self);
+      AResponse.ContentType:='text/xml';
+      P.Adaptor:=TWebDataInputAdaptor.Create(Self);
+      end
+    else
+      begin
+      F:=TExtJSJSONDataFormatter.Create(Self);
+      P.Adaptor:=TExtJSJSonWebdataInputAdaptor.Create(Self);
+      end;
+    P.Adaptor.Request:=ARequest;
+    {$ifdef wmdebug} SendDebug(className+' '+F.ClassName);{$endif}
+    try
+      DS:=TDatasource.Create(Self);
+      try
+        DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+        DS.Dataset:=DBf1;
+        DBF1.Open;
+        try
+          F.ADaptor:=P.Adaptor;
+          P.Datasource:=DS;
+          P.Adaptor.Action:=wdaInsert;
+          P.ApplyParams;
+          F.Provider:=P;
+          M:=TMemoryStream.Create;
+          try
+            F.GetContent(ARequest,M,Handled);
+            M.Position:=0;
+            Response.ContentStream:=M;
+            Response.SendResponse;
+            Response.ContentStream:=Nil;
+            With TFileStream.Create('/tmp/data.xml',fmCreate) do
+              try
+                CopyFrom(M,0);
+              finally
+                Free;
+              end;
+          finally
+            M.Free;
+          end;
+        finally
+          DBF1.Close;
+        end;
+      finally
+        DS.Free;
+      end;
+    finally
+      F.Free;
+    end;
+  finally
+    P.Free;
+  end;
+end;
+
+procedure TFPWebModule1.TFPWebActions2Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+Var
+  PN : String;
+  P : TFPWebDataProvider;
+  F : TExtJSDataFormatter;
+  DS : TDatasource;
+  M : TMemoryStream;
+  L : Text;
+
+begin
+  // Providername;
+  {$ifdef wmdebug} SendDebug('Update request received');{$endif}
+  PN:=ARequest.GetNextPathInfo;
+//  P:=GetWebDataProvider(PN);
+  P:=TFPWebDataProvider.Create(Self);
+  try
+    P.IDFieldName:='ID';
+    If Request.QueryFields.values['format']='xml' then
+      begin
+      {$ifdef wmdebug} SendDebug('Update request received in XML');{$endif}
+      F:=TExtJSXMLDataFormatter.Create(Self);
+      AResponse.ContentType:='text/xml';
+      P.Adaptor:=TWebDataInputAdaptor.Create(Self);
+      end
+    else
+      begin
+      F:=TExtJSJSONDataFormatter.Create(Self);
+      P.Adaptor:=TExtJSJSonWebdataInputAdaptor.Create(Self);
+      end;
+    P.Adaptor.Request:=ARequest;
+    {$ifdef wmdebug} SendDebug(className+' '+F.ClassName);{$endif}
+    try
+      DS:=TDatasource.Create(Self);
+      try
+        DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+        DS.Dataset:=DBf1;
+        DBF1.Open;
+        try
+          F.ADaptor:=P.Adaptor;
+          P.Datasource:=DS;
+          P.Adaptor.Action:=wdaUpdate;
+          P.ApplyParams;
+          F.Provider:=P;
+          M:=TMemoryStream.Create;
+          try
+            F.GetContent(ARequest,M,Handled);
+            M.Position:=0;
+            Response.ContentStream:=M;
+            Response.SendResponse;
+            Response.ContentStream:=Nil;
+            With TFileStream.Create('/tmp/data.xml',fmCreate) do
+              try
+                CopyFrom(M,0);
+              finally
+                Free;
+              end;
+          finally
+            M.Free;
+          end;
+        finally
+          DBF1.Close;
+        end;
+      finally
+        DS.Free;
+      end;
+    finally
+      F.Free;
+    end;
+  finally
+    P.Free;
+  end;
+end;
+
+procedure TFPWebModule1.TFPWebActions3Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+
+Var
+  PN : String;
+  P : TFPWebDataProvider;
+  F : TExtJSDataFormatter;
+  DS : TDatasource;
+  M : TMemoryStream;
+  L : Text;
+
+begin
+  // Providername;
+  PN:=ARequest.GetNextPathInfo;
+//  P:=GetWebDataProvider(PN);
+  P:=TFPWebDataProvider.Create(Self);
+  try
+    P.IDFieldName:='ID';
+    If Request.QueryFields.values['format']='xml' then
+      begin
+      F:=TExtJSXMLDataFormatter.Create(Self);
+      AResponse.ContentType:='text/xml';
+      P.Adaptor:=TWebDataInputAdaptor.Create(Self);
+      end
+    else
+      begin
+      F:=TExtJSJSONDataFormatter.Create(Self);
+      P.Adaptor:=TExtJSJSonWebdataInputAdaptor.Create(Self);
+      end;
+    P.Adaptor.Request:=ARequest;
+    {$ifdef wmdebug} SendDebug('className '+F.ClassName);{$endif}
+    try
+      DS:=TDatasource.Create(Self);
+      try
+        DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+        DS.Dataset:=DBf1;
+        DBF1.Open;
+        try
+          F.ADaptor:=P.Adaptor;
+          P.Datasource:=DS;
+          P.Adaptor.Action:=wdaDelete;
+          P.ApplyParams;
+          F.Provider:=P;
+          M:=TMemoryStream.Create;
+          try
+            F.GetContent(ARequest,M,Handled);
+            M.Position:=0;
+            Response.ContentStream:=M;
+            Response.SendResponse;
+            Response.ContentStream:=Nil;
+            With TFileStream.Create('/tmp/data.xml',fmCreate) do
+              try
+                CopyFrom(M,0);
+              finally
+                Free;
+              end;
+          finally
+            M.Free;
+          end;
+        finally
+          DBF1.Close;
+        end;
+      finally
+        DS.Free;
+      end;
+    finally
+      F.Free;
+    end;
+  finally
+    P.Free;
+  end;
+end;
+
+initialization
+  {$I wmusers.lrs}
+
+  RegisterHTTPModule('Provider', TFPWebModule1);
+end.
+

+ 11 - 0
packages/fcl-web/examples/webdata/demo2/extgrid-json.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS JSON Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-json.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 97 - 0
packages/fcl-web/examples/webdata/demo2/extgrid-json.js

@@ -0,0 +1,97 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/Name/Read/",
+      update: "extgrid.cgi/Provider/Name/Update/",
+      create: "extgrid.cgi/Provider/Name/Insert/",
+      destroy: "extgrid.cgi/Provider/Name/Delete/"
+    }
+  });
+  var myreader = new Ext.data.JsonReader ({
+      root: "rows",
+      idProperty: "ID",
+      messageProperty: 'message', // Must be specified here
+      fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.JsonWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID"
+  }); 
+  var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 11 - 0
packages/fcl-web/examples/webdata/demo2/extgrid-xml.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS XML Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-xml.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 100 - 0
packages/fcl-web/examples/webdata/demo2/extgrid-xml.js

@@ -0,0 +1,100 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/Name/Read/?format=xml",
+      update: "extgrid.cgi/Provider/Name/Update/?format=xml",
+      create: "extgrid.cgi/Provider/Name/Insert/?format=xml",
+      destroy: "extgrid.cgi/Provider/Name/Delete/?format=xml",
+    }
+  });
+  var myreader = new Ext.data.XmlReader ({
+      totalProperty: "total",
+      record: "row",
+      idProperty: "ID",
+      successProperty: "success",
+      messageProperty: "message",
+      fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.XmlWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID",
+      root: "records"
+  }); 
+    var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 84 - 0
packages/fcl-web/examples/webdata/demo2/extgrid.lpi

@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <SaveOnlyProjectUnits Value="True"/>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <Runnable Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Title Value="ExtJS Grid demo for fpwebdata"/>
+      <Icon Value="0"/>
+      <UseXPManifest Value="True"/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="5">
+      <Item1>
+        <PackageName Value="lazwebdata"/>
+        <MinVersion Valid="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="DBFLaz"/>
+        <MinVersion Minor="1" Release="1" Valid="True"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="WebLaz"/>
+      </Item3>
+      <Item4>
+        <PackageName Value="LCL"/>
+      </Item4>
+      <Item5>
+        <PackageName Value="FCL"/>
+      </Item5>
+    </RequiredPackages>
+    <Units Count="2">
+      <Unit0>
+        <Filename Value="extgrid.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="extgrid"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="wmusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmusers"/>
+      </Unit1>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <Target>
+      <Filename Value="extgrid.cgi"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+    </SearchPaths>
+    <CodeGeneration>
+      <Optimizations>
+        <OptimizationLevel Value="0"/>
+      </Optimizations>
+    </CodeGeneration>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+</CONFIG>

+ 16 - 0
packages/fcl-web/examples/webdata/demo2/extgrid.lpr

@@ -0,0 +1,16 @@
+program extgrid;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$ifdef unix}cwstring,xmliconv,{$endif}
+  fpCGI, wmusers;
+
+{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
+
+begin
+  Application.Title:='ExtJS Grid demo for fpwebdata';
+  Application.Initialize;
+  Application.Run;
+end.
+

+ 46 - 0
packages/fcl-web/examples/webdata/demo2/wmusers.lfm

@@ -0,0 +1,46 @@
+object FPWebModule1: TFPWebModule1
+  OnCreate = DataModuleCreate
+  OldCreateOrder = False
+  Actions = <>
+  OnRequest = DataModuleRequest
+  CreateSession = False
+  Height = 300
+  HorizontalOffset = 477
+  VerticalOffset = 302
+  Width = 400
+  object Dbf1: TDbf
+    FilePath = '/home/michael/public_html/extjs/demo2/'
+    IndexDefs = <>
+    TableName = 'users.dbf'
+    TableLevel = 4
+    FilterOptions = []
+    left = 51
+    top = 64
+  end
+  object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
+    left = 146
+    top = 63
+  end
+  object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
+    left = 207
+    top = 61
+  end
+  object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
+    left = 151
+    top = 101
+  end
+  object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
+    left = 211
+    top = 100
+  end
+  object FPWebDataProvider1: TFPWebDataProvider
+    DataSource = Datasource1
+    left = 105
+    top = 89
+  end
+  object Datasource1: TDatasource
+    DataSet = Dbf1
+    left = 48
+    top = 104
+  end
+end

+ 18 - 0
packages/fcl-web/examples/webdata/demo2/wmusers.lrs

@@ -0,0 +1,18 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebModule1','FORMDATA',[
+  'TPF0'#13'TFPWebModule1'#12'FPWebModule1'#8'OnCreate'#7#16'DataModuleCreate'
+  +#14'OldCreateOrder'#8#7'Actions'#14#0#9'OnRequest'#7#17'DataModuleRequest'#13
+  +'CreateSession'#8#6'Height'#3','#1#16'HorizontalOffset'#3#221#1#14'VerticalO'
+  +'ffset'#3'.'#1#5'Width'#3#144#1#0#4'TDbf'#4'Dbf1'#8'FilePath'#6'&/home/micha'
+  +'el/public_html/extjs/demo2/'#9'IndexDefs'#14#0#9'TableName'#6#9'users.dbf'
+  +#10'TableLevel'#2#4#13'FilterOptions'#11#0#4'left'#2'3'#3'top'#2'@'#0#0#29'T'
+  +'ExtJSJSonWebdataInputAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3
+  +#146#0#3'top'#2'?'#0#0#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter'
+  +'1'#4'left'#3#207#0#3'top'#2'='#0#0#28'TExtJSXMLWebdataInputAdaptor'#28'ExtJ'
+  +'SXMLWebdataInputAdaptor1'#4'left'#3#151#0#3'top'#2'e'#0#0#22'TExtJSXMLDataF'
+  +'ormatter'#22'ExtJSXMLDataFormatter1'#4'left'#3#211#0#3'top'#2'd'#0#0#18'TFP'
+  +'WebDataProvider'#18'FPWebDataProvider1'#10'DataSource'#7#11'Datasource1'#4
+  +'left'#2'i'#3'top'#2'Y'#0#0#11'TDatasource'#11'Datasource1'#7'DataSet'#7#4'D'
+  +'bf1'#4'left'#2'0'#3'top'#2'h'#0#0#0
+]);

+ 86 - 0
packages/fcl-web/examples/webdata/demo2/wmusers.pp

@@ -0,0 +1,86 @@
+unit wmusers; 
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, fpwebdata, extjsjson, extjsxml,
+  HTTPDefs, websession, fpHTTP, fpWeb, dbf, db;
+
+type
+
+  { TFPWebModule1 }
+
+  TFPWebModule1 = class(TFPWebModule)
+    Datasource1: TDatasource;
+    Dbf1: TDbf;
+    ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
+    ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
+    ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
+    ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
+    FPWebDataProvider1: TFPWebDataProvider;
+    procedure DataModuleCreate(Sender: TObject);
+    procedure DataModuleRequest(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebModule1: TFPWebModule1; 
+
+implementation
+
+uses dbugintf;
+
+{ TFPWebModule1 }
+
+procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
+  AResponse: TResponse; var Handled: Boolean);
+
+Var
+  CP : TCustomHTTPDataContentProducer;
+  M : TMemoryStream;
+  A : TCustomWebDataInputAdaptor;
+  PN : String;
+
+begin
+  PN:=ARequest.GetNextPathInfo;
+  If ARequest.QueryFields.values['format']='xml' then
+    begin
+    A:=ExtJSXMLWebdataInputAdaptor1;
+    CP:=ExtJSXMLDataFormatter1;
+    end
+  else
+    begin
+    A:=ExtJSJSONWebdataInputAdaptor1;
+    cp:=ExtJSJSONDataFormatter1;
+    end;
+  FPWebDataProvider1.Adaptor:=A;
+  CP.Adaptor:=A;
+  CP.Adaptor.Request:=ARequest;
+  CP.Provider:=FPWebDataProvider1;
+  M:=TmemoryStream.Create;
+  AResponse.ContentStream:=M;
+  AResponse.ContentType:=CP.DataContentType;
+  CP.GetContent(ARequest,M,Handled);
+  M.Position:=0;
+  AResponse.SendContent;
+end;
+
+procedure TFPWebModule1.DataModuleCreate(Sender: TObject);
+begin
+  DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+  DBF1.Open;
+  With DBF1.FieldByname('ID') do
+    ProviderFlags:=ProviderFlags+[pfInKey];
+end;
+
+initialization
+  {$I wmusers.lrs}
+  RegisterHTTPModule('Provider', TFPWebModule1);
+end.
+

+ 11 - 0
packages/fcl-web/examples/webdata/demo3/extgrid-json.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS JSON Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-json.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 97 - 0
packages/fcl-web/examples/webdata/demo3/extgrid-json.js

@@ -0,0 +1,97 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/AName/Read/",
+      update: "extgrid.cgi/Provider/AName/Update/",
+      create: "extgrid.cgi/Provider/AName/Insert/",
+      destroy: "extgrid.cgi/Provider/AName/Delete/"
+    }
+  });
+  var myreader = new Ext.data.JsonReader ({
+      root: "rows",
+      idProperty: "ID",
+      messageProperty: 'message', // Must be specified here
+      fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.JsonWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID"
+  }); 
+  var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 11 - 0
packages/fcl-web/examples/webdata/demo3/extgrid-xml.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS XML Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-xml.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 100 - 0
packages/fcl-web/examples/webdata/demo3/extgrid-xml.js

@@ -0,0 +1,100 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/AName/Read/?format=xml",
+      update: "extgrid.cgi/Provider/AName/Update/?format=xml",
+      create: "extgrid.cgi/Provider/AName/Insert/?format=xml",
+      destroy: "extgrid.cgi/Provider/AName/Delete/?format=xml",
+    }
+  });
+  var myreader = new Ext.data.XmlReader ({
+      totalProperty: "total",
+      record: "row",
+      idProperty: "ID",
+      successProperty: "success",
+      messageProperty: "message",
+      fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.XmlWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID",
+      root: "records"
+  }); 
+    var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 334 - 0
packages/fcl-web/examples/webdata/demo3/extgrid.lpi

@@ -0,0 +1,334 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <Runnable Value="False"/>
+      </Flags>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Icon Value="0"/>
+      <UseXPManifest Value="True"/>
+      <ActiveEditorIndexAtStart Value="3"/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="5">
+      <Item1>
+        <PackageName Value="DBFLaz"/>
+        <MinVersion Minor="1" Release="1" Valid="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="lazwebdata"/>
+        <MinVersion Valid="True"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="WebLaz"/>
+      </Item3>
+      <Item4>
+        <PackageName Value="LCL"/>
+      </Item4>
+      <Item5>
+        <PackageName Value="FCL"/>
+      </Item5>
+    </RequiredPackages>
+    <Units Count="16">
+      <Unit0>
+        <Filename Value="extgrid.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="extgrid"/>
+        <CursorPos X="24" Y="6"/>
+        <TopLine Value="1"/>
+        <EditorIndex Value="3"/>
+        <UsageCount Value="21"/>
+        <Loaded Value="True"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="wmusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebProviderDataModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmusers"/>
+        <CursorPos X="33" Y="60"/>
+        <TopLine Value="27"/>
+        <EditorIndex Value="2"/>
+        <UsageCount Value="21"/>
+        <Loaded Value="True"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="../demo2/wmusers.pp"/>
+        <ComponentName Value="FPWebModule1"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmusers"/>
+        <CursorPos X="1" Y="80"/>
+        <TopLine Value="45"/>
+        <UsageCount Value="10"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="../fpwebdata.pp"/>
+        <ComponentName Value="FPWebProviderDataModule"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="fpwebdata"/>
+        <CursorPos X="26" Y="1530"/>
+        <TopLine Value="1526"/>
+        <EditorIndex Value="4"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit3>
+      <Unit4>
+        <Filename Value="wmusers.lfm"/>
+        <UsageCount Value="10"/>
+        <SyntaxHighlighter Value="LFM"/>
+      </Unit4>
+      <Unit5>
+        <Filename Value="../demo/reglazwebdata.pp"/>
+        <UnitName Value="reglazwebdata"/>
+        <CursorPos X="53" Y="50"/>
+        <TopLine Value="34"/>
+        <EditorIndex Value="0"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit5>
+      <Unit6>
+        <Filename Value="../../../fpc/rtl/objpas/classes/classesh.inc"/>
+        <CursorPos X="17" Y="1833"/>
+        <TopLine Value="1812"/>
+        <UsageCount Value="10"/>
+      </Unit6>
+      <Unit7>
+        <Filename Value="../../../fpc/rtl/objpas/classes/dm.inc"/>
+        <CursorPos X="3" Y="18"/>
+        <TopLine Value="16"/>
+        <UsageCount Value="10"/>
+      </Unit7>
+      <Unit8>
+        <Filename Value="../../../fpc/packages/fcl-web/src/fphttp.pp"/>
+        <UnitName Value="fphttp"/>
+        <CursorPos X="3" Y="105"/>
+        <TopLine Value="108"/>
+        <EditorIndex Value="5"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit8>
+      <Unit9>
+        <Filename Value="../../../fpc/packages/fcl-web/src/fpweb.pp"/>
+        <UnitName Value="fpWeb"/>
+        <CursorPos X="3" Y="421"/>
+        <TopLine Value="419"/>
+        <EditorIndex Value="6"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit9>
+      <Unit10>
+        <Filename Value="../../../fpc/lazarus/components/fpweb/weblazideintf.pp"/>
+        <UnitName Value="WebLazIDEIntf"/>
+        <CursorPos X="52" Y="173"/>
+        <TopLine Value="145"/>
+        <UsageCount Value="10"/>
+      </Unit10>
+      <Unit11>
+        <Filename Value="../../../fpc/lazarus/components/fpweb/lazweb.pp"/>
+        <UnitName Value="lazweb"/>
+        <CursorPos X="12" Y="7"/>
+        <TopLine Value="1"/>
+        <UsageCount Value="10"/>
+      </Unit11>
+      <Unit12>
+        <Filename Value="tralala.pp"/>
+        <ComponentName Value="FPWebModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="tralala"/>
+        <CursorPos X="7" Y="11"/>
+        <TopLine Value="1"/>
+        <UsageCount Value="20"/>
+      </Unit12>
+      <Unit13>
+        <Filename Value="../fpwebdata.lfm"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
+        <UsageCount Value="10"/>
+        <SyntaxHighlighter Value="LFM"/>
+      </Unit13>
+      <Unit14>
+        <Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
+        <UnitName Value="websession"/>
+        <CursorPos X="20" Y="40"/>
+        <TopLine Value="20"/>
+        <EditorIndex Value="1"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit14>
+      <Unit15>
+        <Filename Value="../../../fpc/packages/fcl-xml/src/xmliconv.pas"/>
+        <UnitName Value="xmliconv"/>
+        <CursorPos X="1" Y="64"/>
+        <TopLine Value="37"/>
+        <UsageCount Value="10"/>
+      </Unit15>
+    </Units>
+    <JumpHistory Count="30" HistoryIndex="29">
+      <Position1>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="385" Column="53" TopLine="364"/>
+      </Position1>
+      <Position2>
+        <Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
+        <Caret Line="381" Column="25" TopLine="345"/>
+      </Position2>
+      <Position3>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="385" Column="51" TopLine="364"/>
+      </Position3>
+      <Position4>
+        <Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
+        <Caret Line="27" Column="39" TopLine="20"/>
+      </Position4>
+      <Position5>
+        <Filename Value="wmusers.pp"/>
+        <Caret Line="34" Column="29" TopLine="3"/>
+      </Position5>
+      <Position6>
+        <Filename Value="wmusers.pp"/>
+        <Caret Line="48" Column="45" TopLine="15"/>
+      </Position6>
+      <Position7>
+        <Filename Value="wmusers.pp"/>
+        <Caret Line="49" Column="45" TopLine="14"/>
+      </Position7>
+      <Position8>
+        <Filename Value="wmusers.pp"/>
+        <Caret Line="50" Column="45" TopLine="14"/>
+      </Position8>
+      <Position9>
+        <Filename Value="wmusers.pp"/>
+        <Caret Line="17" Column="18" TopLine="14"/>
+      </Position9>
+      <Position10>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="395" Column="32" TopLine="387"/>
+      </Position10>
+      <Position11>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1066" Column="1" TopLine="1039"/>
+      </Position11>
+      <Position12>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1624" Column="20" TopLine="1606"/>
+      </Position12>
+      <Position13>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="955" Column="46" TopLine="933"/>
+      </Position13>
+      <Position14>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="956" Column="19" TopLine="933"/>
+      </Position14>
+      <Position15>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="957" Column="16" TopLine="933"/>
+      </Position15>
+      <Position16>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="971" Column="38" TopLine="933"/>
+      </Position16>
+      <Position17>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="975" Column="77" TopLine="954"/>
+      </Position17>
+      <Position18>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="985" Column="43" TopLine="954"/>
+      </Position18>
+      <Position19>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1013" Column="66" TopLine="992"/>
+      </Position19>
+      <Position20>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1017" Column="77" TopLine="992"/>
+      </Position20>
+      <Position21>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1042" Column="62" TopLine="1013"/>
+      </Position21>
+      <Position22>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1066" Column="35" TopLine="1055"/>
+      </Position22>
+      <Position23>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1646" Column="22" TopLine="1630"/>
+      </Position23>
+      <Position24>
+        <Filename Value="wmusers.pp"/>
+        <Caret Line="15" Column="41" TopLine="1"/>
+      </Position24>
+      <Position25>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1655" Column="28" TopLine="1632"/>
+      </Position25>
+      <Position26>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1587" Column="17" TopLine="1565"/>
+      </Position26>
+      <Position27>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="414" Column="15" TopLine="393"/>
+      </Position27>
+      <Position28>
+        <Filename Value="extgrid.lpr"/>
+        <Caret Line="6" Column="36" TopLine="1"/>
+      </Position28>
+      <Position29>
+        <Filename Value="extgrid.lpr"/>
+        <Caret Line="11" Column="17" TopLine="1"/>
+      </Position29>
+      <Position30>
+        <Filename Value="extgrid.lpr"/>
+        <Caret Line="6" Column="33" TopLine="1"/>
+      </Position30>
+    </JumpHistory>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <Target>
+      <Filename Value="extgrid.cgi"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+    </SearchPaths>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 16 - 0
packages/fcl-web/examples/webdata/demo3/extgrid.lpr

@@ -0,0 +1,16 @@
+program extgrid;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$ifdef unix}cwstring, xmliconv,{$endif}
+  fpCGI,
+  wmusers;
+
+{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
+
+begin
+  Application.Initialize;
+  Application.Run;
+end.
+

+ 9 - 0
packages/fcl-web/examples/webdata/demo3/tralala.lfm

@@ -0,0 +1,9 @@
+object FPWebModule1: TFPWebModule1
+  OldCreateOrder = False
+  Actions = <>
+  CreateSession = False
+  Height = 300
+  HorizontalOffset = 585
+  VerticalOffset = 230
+  Width = 400
+end

+ 7 - 0
packages/fcl-web/examples/webdata/demo3/tralala.lrs

@@ -0,0 +1,7 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebModule1','FORMDATA',[
+  'TPF0'#13'TFPWebModule1'#12'FPWebModule1'#14'OldCreateOrder'#8#7'Actions'#14#0
+  +#13'CreateSession'#8#6'Height'#3','#1#16'HorizontalOffset'#3'I'#2#14'Vertica'
+  +'lOffset'#3#230#0#5'Width'#3#144#1#0#0
+]);

+ 28 - 0
packages/fcl-web/examples/webdata/demo3/tralala.pp

@@ -0,0 +1,28 @@
+unit tralala; 
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb; 
+
+type
+  TFPWebModule1 = class(TFPWebModule)
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebModule1: TFPWebModule1; 
+
+implementation
+
+initialization
+  {$I tralala.lrs}
+
+  RegisterHTTPModule('TFPWebModule1', TFPWebModule1); 
+end.
+

+ 49 - 0
packages/fcl-web/examples/webdata/demo3/wmusers.lfm

@@ -0,0 +1,49 @@
+object FPWebProviderDataModule1: TFPWebProviderDataModule1
+  OnCreate = DataModuleCreate
+  OldCreateOrder = False
+  InputAdaptor = ExtJSJSonWebdataInputAdaptor1
+  ContentProducer = ExtJSJSONDataFormatter1
+  OnGetContentProducer = DataModuleGetContentProducer
+  OnGetInputAdaptor = DataModuleGetInputAdaptor
+  Height = 300
+  HorizontalOffset = 539
+  VerticalOffset = 447
+  Width = 400
+  object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
+    left = 176
+    top = 96
+  end
+  object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
+    AllowPageSize = False
+    left = 176
+    top = 136
+  end
+  object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
+    left = 216
+    top = 96
+  end
+  object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
+    AllowPageSize = False
+    left = 216
+    top = 136
+  end
+  object Dbf1: TDbf
+    FilePath = '/home/michael/public_html/extjs/demo2/'
+    IndexDefs = <>
+    TableName = 'users.dbf'
+    TableLevel = 7
+    FilterOptions = []
+    left = 79
+    top = 92
+  end
+  object Datasource1: TDatasource
+    DataSet = Dbf1
+    left = 76
+    top = 132
+  end
+  object AName: TFPWebDataProvider
+    DataSource = Datasource1
+    left = 133
+    top = 117
+  end
+end

+ 21 - 0
packages/fcl-web/examples/webdata/demo3/wmusers.lrs

@@ -0,0 +1,21 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebProviderDataModule1','FORMDATA',[
+  'TPF0'#25'TFPWebProviderDataModule1'#24'FPWebProviderDataModule1'#8'OnCreate'
+  +#7#16'DataModuleCreate'#14'OldCreateOrder'#8#12'InputAdaptor'#7#29'ExtJSJSon'
+  +'WebdataInputAdaptor1'#15'ContentProducer'#7#23'ExtJSJSONDataFormatter1'#20
+  +'OnGetContentProducer'#7#28'DataModuleGetContentProducer'#17'OnGetInputAdapt'
+  +'or'#7#25'DataModuleGetInputAdaptor'#6'Height'#3','#1#16'HorizontalOffset'#3
+  +#27#2#14'VerticalOffset'#3#191#1#5'Width'#3#144#1#0#29'TExtJSJSonWebdataInpu'
+  +'tAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3#176#0#3'top'#2'`'#0#0
+  +#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter1'#13'AllowPageSize'#8
+  +#4'left'#3#176#0#3'top'#3#136#0#0#0#28'TExtJSXMLWebdataInputAdaptor'#28'ExtJ'
+  +'SXMLWebdataInputAdaptor1'#4'left'#3#216#0#3'top'#2'`'#0#0#22'TExtJSXMLDataF'
+  +'ormatter'#22'ExtJSXMLDataFormatter1'#13'AllowPageSize'#8#4'left'#3#216#0#3
+  +'top'#3#136#0#0#0#4'TDbf'#4'Dbf1'#8'FilePath'#6'&/home/michael/public_html/e'
+  +'xtjs/demo2/'#9'IndexDefs'#14#0#9'TableName'#6#9'users.dbf'#10'TableLevel'#2
+  +#7#13'FilterOptions'#11#0#4'left'#2'O'#3'top'#2'\'#0#0#11'TDatasource'#11'Da'
+  +'tasource1'#7'DataSet'#7#4'Dbf1'#4'left'#2'L'#3'top'#3#132#0#0#0#18'TFPWebDa'
+  +'taProvider'#5'AName'#10'DataSource'#7#11'Datasource1'#4'left'#3#133#0#3'top'
+  +#2'u'#0#0#0
+]);

+ 68 - 0
packages/fcl-web/examples/webdata/demo3/wmusers.pp

@@ -0,0 +1,68 @@
+unit wmusers; 
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
+  dbf, db, fpwebdata, extjsjson, extjsxml;
+
+type
+
+  { TFPWebProviderDataModule1 }
+
+  TFPWebProviderDataModule1 = class(TFPWebProviderDataModule)
+    Datasource1: TDatasource;
+    Dbf1: TDbf;
+    ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
+    ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
+    ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
+    ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
+    AName: TFPWebDataProvider;
+    procedure DataModuleCreate(Sender: TObject);
+    procedure DataModuleGetContentProducer(Sender: TObject;
+      var AContentProducer: TCustomHTTPDataContentProducer);
+    procedure DataModuleGetInputAdaptor(Sender: TObject;
+      var AInputAdaptor: TCustomWebdataInputAdaptor);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebProviderDataModule1: TFPWebProviderDataModule1; 
+
+implementation
+
+{ TFPWebProviderDataModule1 }
+
+procedure TFPWebProviderDataModule1.DataModuleGetInputAdaptor(Sender: TObject;
+  var AInputAdaptor: TCustomWebdataInputAdaptor);
+begin
+  If Request.QueryFields.values['format']='xml' then
+    AInputAdaptor:=ExtJSXMLWebdataInputAdaptor1;
+end;
+
+procedure TFPWebProviderDataModule1.DataModuleGetContentProducer(
+  Sender: TObject; var AContentProducer: TCustomHTTPDataContentProducer);
+begin
+  If Request.QueryFields.values['format']='xml' then
+    AContentProducer:=ExtJSXMLDataFormatter1;
+end;
+
+procedure TFPWebProviderDataModule1.DataModuleCreate(Sender: TObject);
+begin
+  DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+  DBF1.Open;
+  With DBF1.FieldByname('ID') do
+    ProviderFlags:=ProviderFlags+[pfInKey];
+end;
+
+initialization
+  {$I wmusers.lrs}
+
+  RegisterHTTPModule('Provider', TFPWebProviderDataModule1);
+end.
+

+ 27 - 0
packages/fcl-web/examples/webdata/demo4/dmusers.lfm

@@ -0,0 +1,27 @@
+object DataModule1: TDataModule1
+  OnCreate = DataModuleCreate
+  OldCreateOrder = False
+  Height = 300
+  HorizontalOffset = 356
+  VerticalOffset = 360
+  Width = 400
+  object AName: TFPWebDataProvider
+    DataSource = Datasource1
+    left = 161
+    top = 145
+  end
+  object Datasource1: TDatasource
+    DataSet = Dbf1
+    left = 104
+    top = 160
+  end
+  object Dbf1: TDbf
+    FilePath = '/home/michael/public_html/extjs/demo2/'
+    IndexDefs = <>
+    TableName = 'users.dbf'
+    TableLevel = 7
+    FilterOptions = []
+    left = 107
+    top = 120
+  end
+end

+ 12 - 0
packages/fcl-web/examples/webdata/demo4/dmusers.lrs

@@ -0,0 +1,12 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TDataModule1','FORMDATA',[
+  'TPF0'#12'TDataModule1'#11'DataModule1'#8'OnCreate'#7#16'DataModuleCreate'#14
+  +'OldCreateOrder'#8#6'Height'#3','#1#16'HorizontalOffset'#3'd'#1#14'VerticalO'
+  +'ffset'#3'h'#1#5'Width'#3#144#1#0#18'TFPWebDataProvider'#5'AName'#10'DataSou'
+  +'rce'#7#11'Datasource1'#4'left'#3#161#0#3'top'#3#145#0#0#0#11'TDatasource'#11
+  +'Datasource1'#7'DataSet'#7#4'Dbf1'#4'left'#2'h'#3'top'#3#160#0#0#0#4'TDbf'#4
+  +'Dbf1'#8'FilePath'#6'&/home/michael/public_html/extjs/demo2/'#9'IndexDefs'#14
+  +#0#9'TableName'#6#9'users.dbf'#10'TableLevel'#2#7#13'FilterOptions'#11#0#4'l'
+  +'eft'#2'k'#3'top'#2'x'#0#0#0
+]);

+ 52 - 0
packages/fcl-web/examples/webdata/demo4/dmusers.pp

@@ -0,0 +1,52 @@
+unit dmusers;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, db, dbf,
+  fpwebdata;
+
+type
+
+  { TDataModule1 }
+
+  TDataModule1 = class(TDataModule)
+    AName: TFPWebDataProvider;
+    Datasource1: TDatasource;
+    Dbf1: TDbf;
+    procedure DataModuleCreate(Sender: TObject);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  DataModule1: TDataModule1; 
+
+implementation
+
+uses dbugintf;
+{ TDataModule1 }
+
+procedure TDataModule1.DataModuleCreate(Sender: TObject);
+begin
+  senddebug('Creating datamodule 1 '+InTToStr(Ord(WebDataProviderManager.Registering)));
+  If not WebDataProviderManager.Registering then
+    begin
+    DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+    DBF1.Open;
+    With DBF1.FieldByname('ID') do
+      ProviderFlags:=ProviderFlags+[pfInKey];
+    DBF1.First;
+    end;
+end;
+
+initialization
+  {$I dmusers.lrs}
+  WebDataProviderManager.RegisterDatamodule(TDataModule1)
+
+end.
+

+ 11 - 0
packages/fcl-web/examples/webdata/demo4/extgrid-json.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS JSON Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-json.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 97 - 0
packages/fcl-web/examples/webdata/demo4/extgrid-json.js

@@ -0,0 +1,97 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/JSONProvider/AName/Read/",
+      update: "extgrid.cgi/JSONProvider/AName/Update/",
+      create: "extgrid.cgi/JSONProvider/AName/Insert/",
+      destroy: "extgrid.cgi/JSONProvider/AName/Delete/"
+    }
+  });
+  var myreader = new Ext.data.JsonReader ({
+      root: "rows",
+      idProperty: "ID",
+      messageProperty: 'message', // Must be specified here
+      fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.JsonWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID"
+  }); 
+  var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 11 - 0
packages/fcl-web/examples/webdata/demo4/extgrid-xml.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS XML Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-xml.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 100 - 0
packages/fcl-web/examples/webdata/demo4/extgrid-xml.js

@@ -0,0 +1,100 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/XMLProvider/AName/Read/",
+      update: "extgrid.cgi/XMLProvider/AName/Update/",
+      create: "extgrid.cgi/XMLProvider/AName/Insert/",
+      destroy: "extgrid.cgi/XMLProvider/AName/Delete/",
+    }
+  });
+  var myreader = new Ext.data.XmlReader ({
+      totalProperty: "total",
+      record: "row",
+      idProperty: "ID",
+      successProperty: "success",
+      messageProperty: "message",
+      fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.XmlWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID",
+      root: "records"
+  }); 
+    var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 93 - 0
packages/fcl-web/examples/webdata/demo4/extgrid.lpi

@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <SaveClosedFiles Value="False"/>
+        <SaveOnlyProjectUnits Value="True"/>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <Runnable Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Icon Value="0"/>
+      <UseXPManifest Value="True"/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="5">
+      <Item1>
+        <PackageName Value="DBFLaz"/>
+        <MinVersion Minor="1" Release="1" Valid="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="lazwebdata"/>
+        <MinVersion Valid="True"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="WebLaz"/>
+      </Item3>
+      <Item4>
+        <PackageName Value="LCL"/>
+      </Item4>
+      <Item5>
+        <PackageName Value="FCL"/>
+      </Item5>
+    </RequiredPackages>
+    <Units Count="4">
+      <Unit0>
+        <Filename Value="extgrid.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="extgrid"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="wmjsonusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebProviderDataModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmjsonusers"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="wmxmlusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebProviderDataModule2"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmxmlusers"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="dmusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="DataModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="dmusers"/>
+      </Unit3>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <Target>
+      <Filename Value="extgrid.cgi"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+    </SearchPaths>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+</CONFIG>

+ 15 - 0
packages/fcl-web/examples/webdata/demo4/extgrid.lpr

@@ -0,0 +1,15 @@
+program extgrid;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$ifdef unix}cwstring,xmliconv,{$endif}
+  fpCGI, wmjsonusers, wmxmlusers, dmusers;
+
+{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
+
+begin
+  Application.Initialize;
+  Application.Run;
+end.
+

+ 18 - 0
packages/fcl-web/examples/webdata/demo4/wmjsonusers.lfm

@@ -0,0 +1,18 @@
+object FPWebProviderDataModule1: TFPWebProviderDataModule1
+  OldCreateOrder = False
+  InputAdaptor = ExtJSJSonWebdataInputAdaptor1
+  ContentProducer = ExtJSJSONDataFormatter1
+  Height = 300
+  HorizontalOffset = 635
+  VerticalOffset = 230
+  Width = 400
+  object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
+    left = 204
+    top = 124
+  end
+  object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
+    AllowPageSize = False
+    left = 204
+    top = 164
+  end
+end

+ 11 - 0
packages/fcl-web/examples/webdata/demo4/wmjsonusers.lrs

@@ -0,0 +1,11 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebProviderDataModule1','FORMDATA',[
+  'TPF0'#25'TFPWebProviderDataModule1'#24'FPWebProviderDataModule1'#14'OldCreat'
+  +'eOrder'#8#12'InputAdaptor'#7#29'ExtJSJSonWebdataInputAdaptor1'#15'ContentPr'
+  +'oducer'#7#23'ExtJSJSONDataFormatter1'#6'Height'#3','#1#16'HorizontalOffset'
+  +#3'{'#2#14'VerticalOffset'#3#230#0#5'Width'#3#144#1#0#29'TExtJSJSonWebdataIn'
+  +'putAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3#204#0#3'top'#2'|'#0
+  +#0#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter1'#13'AllowPageSize'
+  +#8#4'left'#3#204#0#3'top'#3#164#0#0#0#0
+]);

+ 34 - 0
packages/fcl-web/examples/webdata/demo4/wmjsonusers.pp

@@ -0,0 +1,34 @@
+unit wmjsonusers;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb, 
+    fpwebdata, extjsjson;
+
+type
+
+  { TFPWebProviderDataModule1 }
+
+  TFPWebProviderDataModule1 = class(TFPWebProviderDataModule)
+    ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
+    ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebProviderDataModule1: TFPWebProviderDataModule1; 
+
+implementation
+
+initialization
+  {$I wmjsonusers.lrs}
+
+  RegisterHTTPModule('JSONProvider', TFPWebProviderDataModule1);
+end.
+

+ 18 - 0
packages/fcl-web/examples/webdata/demo4/wmxmlusers.lfm

@@ -0,0 +1,18 @@
+object FPWebProviderDataModule2: TFPWebProviderDataModule2
+  OldCreateOrder = False
+  InputAdaptor = ExtJSXMLWebdataInputAdaptor1
+  ContentProducer = ExtJSXMLDataFormatter1
+  Height = 300
+  HorizontalOffset = 545
+  VerticalOffset = 399
+  Width = 400
+  object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
+    left = 244
+    top = 124
+  end
+  object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
+    AllowPageSize = False
+    left = 244
+    top = 164
+  end
+end

+ 11 - 0
packages/fcl-web/examples/webdata/demo4/wmxmlusers.lrs

@@ -0,0 +1,11 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebProviderDataModule2','FORMDATA',[
+  'TPF0'#25'TFPWebProviderDataModule2'#24'FPWebProviderDataModule2'#14'OldCreat'
+  +'eOrder'#8#12'InputAdaptor'#7#28'ExtJSXMLWebdataInputAdaptor1'#15'ContentPro'
+  +'ducer'#7#22'ExtJSXMLDataFormatter1'#6'Height'#3','#1#16'HorizontalOffset'#3
+  +'!'#2#14'VerticalOffset'#3#143#1#5'Width'#3#144#1#0#28'TExtJSXMLWebdataInput'
+  +'Adaptor'#28'ExtJSXMLWebdataInputAdaptor1'#4'left'#3#244#0#3'top'#2'|'#0#0#22
+  +'TExtJSXMLDataFormatter'#22'ExtJSXMLDataFormatter1'#13'AllowPageSize'#8#4'le'
+  +'ft'#3#244#0#3'top'#3#164#0#0#0#0
+]);

+ 34 - 0
packages/fcl-web/examples/webdata/demo4/wmxmlusers.pp

@@ -0,0 +1,34 @@
+unit wmxmlusers; 
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb, 
+    fpwebdata, extjsxml;
+
+type
+
+  { TFPWebProviderDataModule2 }
+
+  TFPWebProviderDataModule2 = class(TFPWebProviderDataModule)
+    ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
+    ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebProviderDataModule2: TFPWebProviderDataModule2; 
+
+implementation
+
+initialization
+  {$I wmxmlusers.lrs}
+
+  RegisterHTTPModule('XMLProvider', TFPWebProviderDataModule2);
+end.
+

+ 11 - 0
packages/fcl-web/examples/webdata/demo5/extgrid-json.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS JSON Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-json.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 97 - 0
packages/fcl-web/examples/webdata/demo5/extgrid-json.js

@@ -0,0 +1,97 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/AName/Read/",
+      update: "extgrid.cgi/Provider/AName/Update/",
+      create: "extgrid.cgi/Provider/AName/Insert/",
+      destroy: "extgrid.cgi/Provider/AName/Delete/"
+    }
+  });
+  var myreader = new Ext.data.JsonReader ({
+      root: "rows",
+      idProperty: "ID",
+      messageProperty: 'message', // Must be specified here
+      fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.JsonWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID"
+  }); 
+  var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 11 - 0
packages/fcl-web/examples/webdata/demo5/extgrid-xml.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS XML Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-xml.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 100 - 0
packages/fcl-web/examples/webdata/demo5/extgrid-xml.js

@@ -0,0 +1,100 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/AName/Read/?format=xml",
+      update: "extgrid.cgi/Provider/AName/Update/?format=xml",
+      create: "extgrid.cgi/Provider/AName/Insert/?format=xml",
+      destroy: "extgrid.cgi/Provider/AName/Delete/?format=xml",
+    }
+  });
+  var myreader = new Ext.data.XmlReader ({
+      totalProperty: "total",
+      record: "row",
+      idProperty: "ID",
+      successProperty: "success",
+      messageProperty: "message",
+      fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.XmlWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID",
+      root: "records"
+  }); 
+    var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 75 - 0
packages/fcl-web/examples/webdata/demo5/extgrid.lpi

@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <SaveClosedFiles Value="False"/>
+        <SaveOnlyProjectUnits Value="True"/>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <Runnable Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Icon Value="0"/>
+      <UseXPManifest Value="True"/>
+    </General>
+    <VersionInfo>
+      <ProjectVersion Value=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="4">
+      <Item1>
+        <PackageName Value="lazwebdata"/>
+        <MinVersion Valid="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="WebLaz"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="LCL"/>
+      </Item3>
+      <Item4>
+        <PackageName Value="FCL"/>
+      </Item4>
+    </RequiredPackages>
+    <Units Count="2">
+      <Unit0>
+        <Filename Value="extgrid.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="extgrid"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="wmusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebProviderDataModule2"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmusers"/>
+      </Unit1>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <Target>
+      <Filename Value="extgrid.cgi"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+    </SearchPaths>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+</CONFIG>

+ 15 - 0
packages/fcl-web/examples/webdata/demo5/extgrid.lpr

@@ -0,0 +1,15 @@
+program extgrid;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$ifdef unix}cwstring, xmliconv,{$endif}
+  fpCGI, wmusers;
+
+{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
+
+begin
+  Application.Initialize;
+  Application.Run;
+end.
+

+ 29 - 0
packages/fcl-web/examples/webdata/demo5/wmusers.lfm

@@ -0,0 +1,29 @@
+object FPWebProviderDataModule2: TFPWebProviderDataModule2
+  OldCreateOrder = False
+  InputAdaptor = ExtJSJSonWebdataInputAdaptor1
+  ContentProducer = ExtJSJSONDataFormatter1
+  OnGetContentProducer = DataModuleGetContentProducer
+  OnGetInputAdaptor = DataModuleGetInputAdaptor
+  Height = 300
+  HorizontalOffset = 538
+  VerticalOffset = 460
+  Width = 400
+  object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
+    left = 204
+    top = 124
+  end
+  object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
+    left = 244
+    top = 124
+  end
+  object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
+    AllowPageSize = False
+    left = 244
+    top = 164
+  end
+  object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
+    AllowPageSize = False
+    left = 204
+    top = 164
+  end
+end

+ 15 - 0
packages/fcl-web/examples/webdata/demo5/wmusers.lrs

@@ -0,0 +1,15 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebProviderDataModule2','FORMDATA',[
+  'TPF0'#25'TFPWebProviderDataModule2'#24'FPWebProviderDataModule2'#14'OldCreat'
+  +'eOrder'#8#12'InputAdaptor'#7#29'ExtJSJSonWebdataInputAdaptor1'#15'ContentPr'
+  +'oducer'#7#23'ExtJSJSONDataFormatter1'#20'OnGetContentProducer'#7#28'DataMod'
+  +'uleGetContentProducer'#17'OnGetInputAdaptor'#7#25'DataModuleGetInputAdaptor'
+  +#6'Height'#3','#1#16'HorizontalOffset'#3#26#2#14'VerticalOffset'#3#204#1#5'W'
+  +'idth'#3#144#1#0#29'TExtJSJSonWebdataInputAdaptor'#29'ExtJSJSonWebdataInputA'
+  +'daptor1'#4'left'#3#204#0#3'top'#2'|'#0#0#28'TExtJSXMLWebdataInputAdaptor'#28
+  +'ExtJSXMLWebdataInputAdaptor1'#4'left'#3#244#0#3'top'#2'|'#0#0#22'TExtJSXMLD'
+  +'ataFormatter'#22'ExtJSXMLDataFormatter1'#13'AllowPageSize'#8#4'left'#3#244#0
+  +#3'top'#3#164#0#0#0#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter1'
+  +#13'AllowPageSize'#8#4'left'#3#204#0#3'top'#3#164#0#0#0#0
+]);

+ 85 - 0
packages/fcl-web/examples/webdata/demo5/wmusers.pp

@@ -0,0 +1,85 @@
+unit wmusers;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb, 
+  db, dbf, fpwebdata, extjsjson, extjsxml;
+
+type
+
+  { TFPWebProviderDataModule2 }
+
+  TFPWebProviderDataModule2 = class(TFPWebProviderDataModule)
+    ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
+    ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
+    ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
+    ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
+    procedure DataModuleGetContentProducer(Sender: TObject;
+      var AContentProducer: TCustomHTTPDataContentProducer);
+    procedure DataModuleGetInputAdaptor(Sender: TObject;
+      var AInputAdaptor: TCustomWebdataInputAdaptor);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebProviderDataModule2: TFPWebProviderDataModule2; 
+
+implementation
+
+Type
+
+    { TDBFWebDataProvider }
+
+    TDBFWebDataProvider = Class(TFPCustomWebDataProvider)
+      FDBF : TDBF;
+    Public
+      Constructor Create(AOwner : TComponent); override;
+      Function GetDataset : TDataset; override;
+    end;
+
+{ TDBFWebDataProvider }
+
+constructor TDBFWebDataProvider.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FDBF:=TDBF.Create(Self);
+  FDBF.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
+  FDBF.Open;
+  With FDBF.FieldByname('ID') do
+    ProviderFlags:=ProviderFlags+[pfInKey];
+end;
+
+function TDBFWebDataProvider.GetDataset: TDataset;
+begin
+  Result:=FDBF;
+end;
+
+{ TFPWebProviderDataModule2 }
+
+procedure TFPWebProviderDataModule2.DataModuleGetInputAdaptor(Sender: TObject;
+  var AInputAdaptor: TCustomWebdataInputAdaptor);
+begin
+  If Request.QueryFields.values['format']='xml' then
+    AInputAdaptor:=ExtJSXMLWebdataInputAdaptor1;
+end;
+
+procedure TFPWebProviderDataModule2.DataModuleGetContentProducer(
+  Sender: TObject; var AContentProducer: TCustomHTTPDataContentProducer);
+begin
+  If Request.QueryFields.values['format']='xml' then
+    AContentProducer:=ExtJSXMLDataFormatter1;
+end;
+
+initialization
+  {$I wmusers.lrs}
+
+  RegisterHTTPModule('Provider', TFPWebProviderDataModule2);
+  WebDataProviderManager.RegisterProvider('AName',TDBFWebDataProvider);
+end.
+

+ 11 - 0
packages/fcl-web/examples/webdata/demo6/extgrid-json.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS JSON Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-json.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 97 - 0
packages/fcl-web/examples/webdata/demo6/extgrid-json.js

@@ -0,0 +1,97 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/AName/Read/",
+      update: "extgrid.cgi/Provider/AName/Update/",
+      create: "extgrid.cgi/Provider/AName/Insert/",
+      destroy: "extgrid.cgi/Provider/AName/Delete/"
+    }
+  });
+  var myreader = new Ext.data.JsonReader ({
+      root: "rows",
+      idProperty: "ID",
+      messageProperty: 'message', // Must be specified here
+      fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.JsonWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID"
+  }); 
+  var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 11 - 0
packages/fcl-web/examples/webdata/demo6/extgrid-xml.html

@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>ExtJS XML Data demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="extgrid-xml.js"></script>
+</head>
+<body>
+</body>
+</html>

+ 100 - 0
packages/fcl-web/examples/webdata/demo6/extgrid-xml.js

@@ -0,0 +1,100 @@
+Ext.ns('FPC');
+
+FPC.ShowPage = function () {
+  var myproxy = new Ext.data.HttpProxy ( {
+    api : {
+      read: "extgrid.cgi/Provider/AName/Read/?format=xml",
+      update: "extgrid.cgi/Provider/AName/Update/?format=xml",
+      create: "extgrid.cgi/Provider/AName/Insert/?format=xml",
+      destroy: "extgrid.cgi/Provider/AName/Delete/?format=xml",
+    }
+  });
+  var myreader = new Ext.data.XmlReader ({
+      totalProperty: "total",
+      record: "row",
+      idProperty: "ID",
+      successProperty: "success",
+      messageProperty: "message",
+      fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
+  });
+  var mywriter = new Ext.data.XmlWriter({
+      encode: true,
+      writeAllFields: true,
+      idProperty: "ID",
+      root: "records"
+  }); 
+    var data = new Ext.data.Store({
+    proxy: myproxy,
+    reader: myreader,
+    writer: mywriter,
+    autoSave: false,
+    idProperty: "ID",
+  });
+  // Listen to errors.
+  data.addListener('exception', function(proxy, type, action, options, res) {
+    if (type === 'remote') {
+        Ext.Msg.show({
+            title: 'REMOTE EXCEPTION',
+            msg: res.message, 
+            icon: Ext.MessageBox.ERROR,
+            buttons: Ext.Msg.OK
+        });
+    }
+  });
+  data.load({ params:{start: 0, limit: 30}});
+  var grid = new Ext.grid.EditorGridPanel({
+    renderTo: Ext.getBody(),
+    frame: true,
+    title: "Known users",
+    height: 600,
+    width: 800,
+    store: data,
+    columns: [
+      {header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
+      {header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+      {header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
+    ],
+    bbar: new Ext.PagingToolbar({
+      pageSize: 30,
+      store: data,
+      displayInfo: true
+    }),
+    tbar : [{
+            text: 'Add',
+            iconCls: 'icon-add',
+            handler: function(btn, ev) {
+              var u = new grid.store.recordType();
+              grid.stopEditing();
+              grid.store.insert(0, u);
+              grid.startEditing(0, 1);
+            },
+            scope: grid
+        }, '-', {
+            text: 'Delete',
+            iconCls: 'icon-delete',
+            handler: function(btn, ev) {
+	      var index = grid.getSelectionModel().getSelectedCell();
+	      if (!index) {
+		  return false;
+	      }
+	      var rec = grid.store.getAt(index[0]);
+	      grid.store.remove(rec);
+	      },
+            scope: grid
+        }, '-', {
+            text: 'Save',
+            iconCls: 'icon-save',
+            handler: function(btn, ev) {
+	      grid.store.save();
+	    },
+            scope: grid
+        }
+	]
+ //          F.ContentToStream(M);
+
+  });
+  grid.show();
+}
+Ext.onReady(FPC.ShowPage);

+ 4 - 0
packages/fcl-web/examples/webdata/demo6/extgrid.ini

@@ -0,0 +1,4 @@
+[Database]
+Path=/wisa/firebird/fpcusers.fb
+UserName=WISASOFT
+Password=SysteemD

+ 362 - 0
packages/fcl-web/examples/webdata/demo6/extgrid.lpi

@@ -0,0 +1,362 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <Runnable Value="False"/>
+      </Flags>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Title Value="SQLDBWebDataProvider demo using ExtJS"/>
+      <UseXPManifest Value="True"/>
+      <Icon Value="0"/>
+      <ActiveWindowIndexAtStart Value="0"/>
+    </General>
+    <VersionInfo>
+      <StringTable Comments="" CompanyName="" FileDescription="" FileVersion="0.0.0.0" InternalName="" LegalCopyright="" LegalTrademarks="" OriginalFilename="" ProductName="" ProductVersion=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="5">
+      <Item1>
+        <PackageName Value="SQLDBLaz"/>
+        <MinVersion Major="1" Release="1" Valid="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="lazwebdata"/>
+        <MinVersion Valid="True"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="WebLaz"/>
+      </Item3>
+      <Item4>
+        <PackageName Value="LCL"/>
+      </Item4>
+      <Item5>
+        <PackageName Value="FCL"/>
+      </Item5>
+    </RequiredPackages>
+    <Units Count="16">
+      <Unit0>
+        <Filename Value="extgrid.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="extgrid"/>
+        <EditorIndex Value="12"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="33" Y="8"/>
+        <UsageCount Value="20"/>
+        <Loaded Value="True"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="wmusers.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebProviderDataModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmusers"/>
+        <EditorIndex Value="0"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="78"/>
+        <CursorPos X="29" Y="86"/>
+        <UsageCount Value="20"/>
+        <Loaded Value="True"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="../demo5/wmusers.pp"/>
+        <ComponentName Value="FPWebProviderDataModule2"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmusers"/>
+        <TopLine Value="44"/>
+        <CursorPos X="1" Y="70"/>
+        <UsageCount Value="10"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="../fpwebdata.pp"/>
+        <ComponentName Value="FPWebProviderDataModule"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="fpwebdata"/>
+        <IsVisibleTab Value="True"/>
+        <EditorIndex Value="1"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1584"/>
+        <CursorPos X="8" Y="1600"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit3>
+      <Unit4>
+        <Filename Value="../sqldbwebdata.pp"/>
+        <UnitName Value="sqldbwebdata"/>
+        <EditorIndex Value="3"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="49"/>
+        <CursorPos X="2" Y="70"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit4>
+      <Unit5>
+        <Filename Value="../extjsjson.pp"/>
+        <UnitName Value="extjsjson"/>
+        <EditorIndex Value="11"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="25"/>
+        <CursorPos X="3" Y="45"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit5>
+      <Unit6>
+        <Filename Value="../extjsxml.pp"/>
+        <UnitName Value="extjsxml"/>
+        <EditorIndex Value="4"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="49"/>
+        <CursorPos X="13" Y="54"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit6>
+      <Unit7>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <UnitName Value="wstmodule"/>
+        <EditorIndex Value="5"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="25"/>
+        <CursorPos X="48" Y="22"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit7>
+      <Unit8>
+        <Filename Value="../../../fpc/packages/fcl-web/src/fphttp.pp"/>
+        <UnitName Value="fphttp"/>
+        <EditorIndex Value="8"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="109"/>
+        <CursorPos X="92" Y="100"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit8>
+      <Unit9>
+        <Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
+        <UnitName Value="websession"/>
+        <EditorIndex Value="10"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="3" Y="27"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit9>
+      <Unit10>
+        <Filename Value="../../../fpc/packages/fcl-web/src/httpdefs.pp"/>
+        <UnitName Value="HTTPDefs"/>
+        <EditorIndex Value="7"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="264"/>
+        <CursorPos X="18" Y="285"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit10>
+      <Unit11>
+        <Filename Value="../../../source/wst/tests/apache_module/wst_apache_binding.pas"/>
+        <UnitName Value="wst_apache_binding"/>
+        <TopLine Value="142"/>
+        <CursorPos X="1" Y="178"/>
+        <UsageCount Value="10"/>
+      </Unit11>
+      <Unit12>
+        <Filename Value="../../../fpc/packages/fcl-web/src/fpweb.pp"/>
+        <UnitName Value="fpWeb"/>
+        <EditorIndex Value="2"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="412"/>
+        <CursorPos X="18" Y="452"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit12>
+      <Unit13>
+        <Filename Value="../../../Documents/source/wst/wst_global.inc"/>
+        <TopLine Value="1"/>
+        <CursorPos X="30" Y="19"/>
+        <UsageCount Value="10"/>
+      </Unit13>
+      <Unit14>
+        <Filename Value="../../wst/regwstmodule.pp"/>
+        <UnitName Value="regwstmodule"/>
+        <EditorIndex Value="6"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="2" Y="1"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit14>
+      <Unit15>
+        <Filename Value="../demo/reglazwebdata.pp"/>
+        <UnitName Value="reglazwebdata"/>
+        <EditorIndex Value="9"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="37"/>
+        <CursorPos X="1" Y="73"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit15>
+    </Units>
+    <JumpHistory Count="30" HistoryIndex="29">
+      <Position1>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="135" Column="3" TopLine="115"/>
+      </Position1>
+      <Position2>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="130" Column="16" TopLine="109"/>
+      </Position2>
+      <Position3>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="148" Column="1" TopLine="127"/>
+      </Position3>
+      <Position4>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="122" Column="92" TopLine="121"/>
+      </Position4>
+      <Position5>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="137" Column="1" TopLine="122"/>
+      </Position5>
+      <Position6>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="169" Column="26" TopLine="135"/>
+      </Position6>
+      <Position7>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="34" Column="1" TopLine="1"/>
+      </Position7>
+      <Position8>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="123" Column="17" TopLine="92"/>
+      </Position8>
+      <Position9>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="128" Column="36" TopLine="104"/>
+      </Position9>
+      <Position10>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="46" Column="48" TopLine="25"/>
+      </Position10>
+      <Position11>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="147" Column="1" TopLine="126"/>
+      </Position11>
+      <Position12>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="138" Column="6" TopLine="115"/>
+      </Position12>
+      <Position13>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="150" Column="1" TopLine="137"/>
+      </Position13>
+      <Position14>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="151" Column="3" TopLine="130"/>
+      </Position14>
+      <Position15>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="15" Column="1" TopLine="1"/>
+      </Position15>
+      <Position16>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="177" Column="37" TopLine="145"/>
+      </Position16>
+      <Position17>
+        <Filename Value="../../wst/wstmodule.pas"/>
+        <Caret Line="58" Column="1" TopLine="22"/>
+      </Position17>
+      <Position18>
+        <Filename Value="../demo/reglazwebdata.pp"/>
+        <Caret Line="17" Column="15" TopLine="1"/>
+      </Position18>
+      <Position19>
+        <Filename Value="../../wst/regwstmodule.pp"/>
+        <Caret Line="55" Column="79" TopLine="16"/>
+      </Position19>
+      <Position20>
+        <Filename Value="../../wst/regwstmodule.pp"/>
+        <Caret Line="26" Column="3" TopLine="1"/>
+      </Position20>
+      <Position21>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="446" Column="14" TopLine="433"/>
+      </Position21>
+      <Position22>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="969" Column="79" TopLine="954"/>
+      </Position22>
+      <Position23>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1171" Column="41" TopLine="1154"/>
+      </Position23>
+      <Position24>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1281" Column="32" TopLine="1280"/>
+      </Position24>
+      <Position25>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1296" Column="30" TopLine="1282"/>
+      </Position25>
+      <Position26>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="327" Column="14" TopLine="324"/>
+      </Position26>
+      <Position27>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1296" Column="51" TopLine="1280"/>
+      </Position27>
+      <Position28>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1594" Column="19" TopLine="1579"/>
+      </Position28>
+      <Position29>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1606" Column="58" TopLine="1591"/>
+      </Position29>
+      <Position30>
+        <Filename Value="../fpwebdata.pp"/>
+        <Caret Line="1607" Column="1" TopLine="1592"/>
+      </Position30>
+    </JumpHistory>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <Target>
+      <Filename Value="extgrid.cgi"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+    </SearchPaths>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 16 - 0
packages/fcl-web/examples/webdata/demo6/extgrid.lpr

@@ -0,0 +1,16 @@
+program extgrid;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$ifdef unix}cwstring,xmliconv,{$endif}
+  fpCGI, wmusers;
+
+{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
+
+begin
+  Application.Title:='SQLDBWebDataProvider demo using ExtJS';
+  Application.Initialize;
+  Application.Run;
+end.
+

+ 131 - 0
packages/fcl-web/examples/webdata/demo6/wmusers.lfm

@@ -0,0 +1,131 @@
+object FPWebProviderDataModule1: TFPWebProviderDataModule1
+  OnCreate = DataModuleCreate
+  OldCreateOrder = False
+  InputAdaptor = ExtJSJSonWebdataInputAdaptor1
+  ContentProducer = ExtJSJSONDataFormatter1
+  OnGetContentProducer = DataModuleGetContentProducer
+  OnGetInputAdaptor = DataModuleGetInputAdaptor
+  Height = 300
+  HorizontalOffset = 635
+  VerticalOffset = 230
+  Width = 400
+  object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
+    left = 232
+    top = 152
+  end
+  object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
+    left = 272
+    top = 152
+  end
+  object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
+    AllowPageSize = False
+    left = 272
+    top = 192
+  end
+  object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
+    AllowPageSize = False
+    left = 232
+    top = 192
+  end
+  object ANAME: TSQLDBWebDataProvider
+    SelectSQL.Strings = (
+      'SELECT * FROM FPCUSERS'
+    )
+    UpdateSQL.Strings = (
+      'UPDATE FPCUSERS SET'
+      '  NAME=:NAME,'
+      '  LOGIN=:LOGIN,'
+      '  EMAIL=:EMAIL,'
+      '  LASTLOGIN=:LASTLOGIN'
+      'WHERE'
+      '  (ID=:ID)'
+    )
+    DeleteSQL.Strings = (
+      'DELETE FROM FPCUSERS WHERE (ID=:ID)'
+    )
+    InsertSQL.Strings = (
+      'INSERT INTO FPCUSERS '
+      '(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'
+      'VALUES'
+      '(:ID, :LOGIN, :NAME, :EMAIL, :LASTLOGIN)'
+    )
+    Connection = IBConnection1
+    IDFieldName = 'ID'
+    OnGetNewID = ANAMEGetNewID
+    left = 113
+    top = 120
+  end
+  object IBConnection1: TIBConnection
+    Connected = False
+    LoginPrompt = False
+    DatabaseName = '/wisa/firebird/fpcusers.fb'
+    KeepConnection = False
+    Password = 'SysteemD'
+    Transaction = SQLTransaction1
+    UserName = 'WISASOFT'
+    left = 72
+    top = 120
+  end
+  object QGetID: TSQLQuery
+    IndexName = 'DEFAULT_ORDER'
+    AutoCalcFields = False
+    Database = IBConnection1
+    Transaction = SQLTransaction1
+    ReadOnly = False
+    SQL.Strings = (
+      'SELECT GEN_ID(GEN_FPCUSERS,1) AS THEID  FROM RDB$DATABASE'
+    )
+    Params = <>
+    left = 155
+    top = 63
+  end
+  object SQLTransaction1: TSQLTransaction
+    Active = False
+    Action = caNone
+    Database = IBConnection1
+    left = 74
+    top = 64
+  end
+  object SQLQuery1: TSQLQuery
+    IndexName = 'DEFAULT_ORDER'
+    AutoCalcFields = False
+    Database = IBConnection1
+    Transaction = SQLTransaction1
+    ReadOnly = False
+    SQL.Strings = (
+      'INSERT INTO FPCUSERS'
+      '(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'
+      'VALUES'
+      '(:ID, :LOGIN, :NAME, :EMAIL, :LASTLOGIN)'
+      ''
+    )
+    Params = <    
+      item
+        DataType = ftUnknown
+        Name = 'ID'
+        ParamType = ptUnknown
+      end    
+      item
+        DataType = ftUnknown
+        Name = 'LOGIN'
+        ParamType = ptUnknown
+      end    
+      item
+        DataType = ftUnknown
+        Name = 'NAME'
+        ParamType = ptUnknown
+      end    
+      item
+        DataType = ftUnknown
+        Name = 'EMAIL'
+        ParamType = ptUnknown
+      end    
+      item
+        DataType = ftUnknown
+        Name = 'LASTLOGIN'
+        ParamType = ptUnknown
+      end>
+    left = 174
+    top = 111
+  end
+end

+ 43 - 0
packages/fcl-web/examples/webdata/demo6/wmusers.lrs

@@ -0,0 +1,43 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebProviderDataModule1','FORMDATA',[
+  'TPF0'#25'TFPWebProviderDataModule1'#24'FPWebProviderDataModule1'#8'OnCreate'
+  +#7#16'DataModuleCreate'#14'OldCreateOrder'#8#12'InputAdaptor'#7#29'ExtJSJSon'
+  +'WebdataInputAdaptor1'#15'ContentProducer'#7#23'ExtJSJSONDataFormatter1'#20
+  +'OnGetContentProducer'#7#28'DataModuleGetContentProducer'#17'OnGetInputAdapt'
+  +'or'#7#25'DataModuleGetInputAdaptor'#6'Height'#3','#1#16'HorizontalOffset'#3
+  +'{'#2#14'VerticalOffset'#3#230#0#5'Width'#3#144#1#0#29'TExtJSJSonWebdataInpu'
+  +'tAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3#232#0#3'top'#3#152#0#0
+  +#0#28'TExtJSXMLWebdataInputAdaptor'#28'ExtJSXMLWebdataInputAdaptor1'#4'left'
+  +#3#16#1#3'top'#3#152#0#0#0#22'TExtJSXMLDataFormatter'#22'ExtJSXMLDataFormatt'
+  +'er1'#13'AllowPageSize'#8#4'left'#3#16#1#3'top'#3#192#0#0#0#23'TExtJSJSONDat'
+  +'aFormatter'#23'ExtJSJSONDataFormatter1'#13'AllowPageSize'#8#4'left'#3#232#0
+  +#3'top'#3#192#0#0#0#21'TSQLDBWebDataProvider'#5'ANAME'#17'SelectSQL.Strings'
+  +#1#6#22'SELECT * FROM FPCUSERS'#0#17'UpdateSQL.Strings'#1#6#19'UPDATE FPCUSE'
+  +'RS SET'#6#13'  NAME=:NAME,'#6#15'  LOGIN=:LOGIN,'#6#15'  EMAIL=:EMAIL,'#6#22
+  +'  LASTLOGIN=:LASTLOGIN'#6#5'WHERE'#6#10'  (ID=:ID)'#0#17'DeleteSQL.Strings'
+  +#1#6'#DELETE FROM FPCUSERS WHERE (ID=:ID)'#0#17'InsertSQL.Strings'#1#6#21'IN'
+  +'SERT INTO FPCUSERS '#6'#(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'#6#6'VALUES'#6
+  +'((:ID, :LOGIN, :NAME, :EMAIL, :LASTLOGIN)'#0#10'Connection'#7#13'IBConnecti'
+  +'on1'#11'IDFieldName'#6#2'ID'#10'OnGetNewID'#7#13'ANAMEGetNewID'#4'left'#2'q'
+  +#3'top'#2'x'#0#0#13'TIBConnection'#13'IBConnection1'#9'Connected'#8#11'Login'
+  +'Prompt'#8#12'DatabaseName'#6#26'/wisa/firebird/fpcusers.fb'#14'KeepConnecti'
+  +'on'#8#8'Password'#6#8'SysteemD'#11'Transaction'#7#15'SQLTransaction1'#8'Use'
+  +'rName'#6#8'WISASOFT'#4'left'#2'H'#3'top'#2'x'#0#0#9'TSQLQuery'#6'QGetID'#9
+  +'IndexName'#6#13'DEFAULT_ORDER'#14'AutoCalcFields'#8#8'Database'#7#13'IBConn'
+  +'ection1'#11'Transaction'#7#15'SQLTransaction1'#8'ReadOnly'#8#11'SQL.Strings'
+  +#1#6'9SELECT GEN_ID(GEN_FPCUSERS,1) AS THEID  FROM RDB$DATABASE'#0#6'Params'
+  +#14#0#4'left'#3#155#0#3'top'#2'?'#0#0#15'TSQLTransaction'#15'SQLTransaction1'
+  +#6'Active'#8#6'Action'#7#6'caNone'#8'Database'#7#13'IBConnection1'#4'left'#2
+  +'J'#3'top'#2'@'#0#0#9'TSQLQuery'#9'SQLQuery1'#9'IndexName'#6#13'DEFAULT_ORDE'
+  +'R'#14'AutoCalcFields'#8#8'Database'#7#13'IBConnection1'#11'Transaction'#7#15
+  +'SQLTransaction1'#8'ReadOnly'#8#11'SQL.Strings'#1#6#20'INSERT INTO FPCUSERS'
+  +#6'#(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'#6#6'VALUES'#6'((:ID, :LOGIN, :NAME,'
+  +' :EMAIL, :LASTLOGIN)'#6#0#0#6'Params'#14#1#8'DataType'#7#9'ftUnknown'#4'Nam'
+  +'e'#6#2'ID'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'#4'Nam'
+  +'e'#6#5'LOGIN'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'#4
+  +'Name'#6#4'NAME'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'#4
+  +'Name'#6#5'EMAIL'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'
+  +#4'Name'#6#9'LASTLOGIN'#9'ParamType'#7#9'ptUnknown'#0#0#4'left'#3#174#0#3'to'
+  +'p'#2'o'#0#0#0
+]);

+ 107 - 0
packages/fcl-web/examples/webdata/demo6/wmusers.pp

@@ -0,0 +1,107 @@
+unit wmusers;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
+  IBConnection, sqldb, fpwebdata, extjsjson, extjsxml, sqldbwebdata;
+
+type
+
+  { TFPWebProviderDataModule1 }
+
+  TFPWebProviderDataModule1 = class(TFPWebProviderDataModule)
+    ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
+    ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
+    ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
+    ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
+    IBConnection1: TIBConnection;
+    ANAME: TSQLDBWebDataProvider;
+    QGetID: TSQLQuery;
+    SQLQuery1: TSQLQuery;
+    SQLTransaction1: TSQLTransaction;
+    procedure ANAMEGetNewID(Sender: TObject; out AID: String);
+    procedure DataModuleCreate(Sender: TObject);
+    procedure DataModuleGetContentProducer(Sender: TObject;
+      var AContentProducer: TCustomHTTPDataContentProducer);
+    procedure DataModuleGetInputAdaptor(Sender: TObject;
+      var AInputAdaptor: TCustomWebdataInputAdaptor);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebProviderDataModule1: TFPWebProviderDataModule1; 
+
+implementation
+
+uses inifiles;
+
+{ TFPWebProviderDataModule1 }
+
+procedure TFPWebProviderDataModule1.DataModuleGetContentProducer(
+  Sender: TObject; var AContentProducer: TCustomHTTPDataContentProducer);
+begin
+  If Request.QueryFields.values['format']='xml' then
+    AContentProducer:=ExtJSXMLDataFormatter1;
+end;
+
+procedure TFPWebProviderDataModule1.DataModuleCreate(Sender: TObject);
+
+Var
+  FN : String;
+  Ini : TMemIniFile;
+
+begin
+  FN:=ChangeFileExt(Paramstr(0),'.ini');
+  If FileExists(FN) then
+    begin
+    Ini:=TMemIniFile.Create(FN);
+    try
+      With IBConnection1 do
+        begin
+        DatabaseName:=Ini.ReadString('Database','Path',DatabaseName);
+        UserName:=Ini.ReadString('Database','UserName',UserName);
+        Password:=Ini.ReadString('Database','Password',Password);
+        end;
+    finally
+      Ini.Free;
+    end;
+    end;
+  IBConnection1.Connected:=True;
+end;
+
+procedure TFPWebProviderDataModule1.ANAMEGetNewID(Sender: TObject; out
+  AID: String);
+begin
+  With QGetID Do
+    begin
+    Close;
+    Open;
+    try
+      if (EOF and BOF) then
+        Raise Exception.Create('No ID generated');
+      AID:=Fields[0].AsString;
+    finally
+      Close;
+    end;
+    end;
+end;
+
+procedure TFPWebProviderDataModule1.DataModuleGetInputAdaptor(Sender: TObject;
+  var AInputAdaptor: TCustomWebdataInputAdaptor);
+begin
+  If Request.QueryFields.values['format']='xml' then
+    AInputAdaptor:=ExtJSXMLWebdataInputAdaptor1;
+end;
+
+initialization
+  {$I wmusers.lrs}
+
+  RegisterHTTPModule('Provider', TFPWebProviderDataModule1);
+end.
+

+ 40 - 0
packages/fcl-web/examples/webdata/demos.txt

@@ -0,0 +1,40 @@
+
+The demo directories demonstrate the use of the TFPWebDataProvider
+components, using ExtJS. It demonstrates the use of JSON and XML
+communitation between a ExtJS Datastore and the webdataprovider.
+
+ExtJS must be installed, it can be downloaded for free from
+http://www.extjs.com/
+
+The examples assume that it is reachable through /ext/
+
+Demo1 shows how to use the component with a plain webdatamodule,
+using actions, and creating all components on the fly.
+
+Demo2 shows how to use the components by dropping them on a plain
+webdatamodule, and handling all in the OnRequest handler of the
+webdatamodule.
+
+Demo3 shows how to use the components in combination with a
+WebProviderDatamodule.
+
+Demo4 shows how webdataprovider components can be dropped
+on plain datamodules, and how these modules can be made
+available to the webdatamodule.
+
+Demo5 shows how to register your own TWebdataProvider instances, which
+are created on the fly to perform their action.
+
+Demo6 demonstrates the use of the TSQLDBWebDataProvider component.
+
+All demos except Demo6 use CGI and a TDBF component to feed data to 
+the webpage, which means they are not very suitable for real life 
+situations due to file locking etc.
+
+
+To try a demo, compile one of the appropriate CGI apps, and open 
+the extgrid-json.html or extgrid-xml.html page in your browser 
+through the webserver, something like:
+
+http://localhost/~myuser/extjs/demo2/extgrid-json.html
+

BIN
packages/fcl-web/examples/webdata/users.dbf