客户端开发使用

客户端开发使用

1)delphi7等老版本开发的客户端

参考“client(delphi7)”例子。使用TIdHttp,TClientDataSet。适合改造delphi7等老版本开发的2层客户端升级为3层。可匹配delphi非unicode版本开发的客户端。

接口例程:

unit Unit1;
/// <author>cxg 2025-3-2</author>

interface

uses
  //my--
  server.api, core.binary,
  //system--
  dialogs,  SysUtils, forms,
  DB, DBClient, ExtCtrls, StdCtrls, Controls, Grids,
  DBGrids, Classes;

type
  TForm1 = class(TForm)
    btn: TButton;
    dbgrd1: TDBGrid;
    dbgrd2: TDBGrid;
    ds1: TDataSource;
    ds2: TDataSource;
    Timer1: TTimer;
    Button1: TButton;
    ClientDataSet1: TClientDataSet;
    ClientDataSet2: TClientDataSet;
    Button7: TButton;
    Image1: TImage;
    Memo1: TMemo;
    Button5: TButton;
    Button6: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    OpenDialog1: TOpenDialog;
    procedure btnClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private    { Private declarations }
  public    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnClick(Sender: TObject);
//  多表查询
begin
  query('1', ['select * from tgoods', 'select * from tunit'], [ClientDataSet1, ClientDataSet2]);
end;

procedure TForm1.Button10Click(Sender: TObject);
//下载文件
var
  LRequest, LResponse: TData;
  LFile: TStream;
  LFileName: string;
begin
  LFileName := '1.exe';
  LRequest := TData.Create;
  LRequest.I['count'] := 1;
  LRequest.S['filename0'] := LFileName;
  LResponse := downloadFile(LRequest);
  if LResponse.B['success'] then
  begin
    LFile := LResponse.Stream['file0'];
    TMemoryStream(LFile).SaveToFile('c:\' + LFileName);
    LFile.Free;
    ShowMessage('下载文件成功');
  end else ShowMessage('下载文件失败');
  LRequest.Free;
  LResponse.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
//  多表保存
begin
  save('1', ['tgoods', 'tunit'], [' ', ' '], [ClientDataSet1, ClientDataSet2]);
end;

procedure TForm1.Button2Click(Sender: TObject);
//雪花ID
var LId: Int64;
begin
  snowflakeID(LId, 1, 1);
  Memo1.Lines.Add(inttostr(LId));
end;

procedure TForm1.Button3Click(Sender: TObject);
//验证码
var LCode: string;
  LStream: TStream;
begin
  LStream := TMemoryStream.Create;
  verifyCode(LCode, LStream);
  Memo1.Lines.Add(LCode);
  TMemoryStream(LStream).SaveToFile('c:\1.bmp');
  Image1.Picture.LoadFromFile('c:\1.bmp');
  LStream.free;
end;

procedure TForm1.Button4Click(Sender: TObject);
//存储过程(多数据集)
var LRequest, LResponse: Tdata;
begin
  LRequest := Tdata.Create;
  LRequest.S['dbid'] := '1';
  LRequest.S['procname'] := 'gettables';
  LResponse := storedproc(LRequest);
  ClientDataSet1.DisableControls;
  ClientDataSet1.Data := LResponse.V['dataset0'];
  ClientDataSet1.EnableControls;
  ClientDataSet2.DisableControls;
  ClientDataSet2.Data := LResponse.V['dataset1'];
  ClientDataSet2.EnableControls;
  LRequest.Free;
  LResponse.Free;
end;

procedure TForm1.Button5Click(Sender: TObject);
//  单表查询
begin
  query('1', ['select * from tgoods where goodsname=''秋冬四件套'''], [ClientDataSet1]);
end;

procedure TForm1.Button6Click(Sender: TObject);
// 单表保存
begin
  save('1', ['tgoods'], [' '], [ClientDataSet1]);
end;

procedure TForm1.Button7Click(Sender: TObject);
//execsql
begin
  execsql('1', 'delete from tgoods where goodsid=''5''');
end;

procedure TForm1.Button8Click(Sender: TObject);
//存储过程(单数据集)
var LRequest, LResponse: Tdata;
begin
  LRequest := Tdata.Create;
  LRequest.S['dbid'] := '1';
  LRequest.S['procname'] := 'sp_9';
  LRequest.S['@goodsid'] := '100036';
  LResponse := storedproc(LRequest);
  ClientDataSet1.DisableControls;
  ClientDataSet1.Data := LResponse.V['dataset0'];
  ClientDataSet1.EnableControls;
  LRequest.Free;
  LResponse.Free;
end;

procedure TForm1.Button9Click(Sender: TObject);
//上传文件
var
  LData: TData;
  LStream: TStream;
begin
  if OpenDialog1.Execute then
  begin
    LData := TData.Create;
    LData.I['count'] := 1;
    LData.S['filename0'] := ExtractFileName(OpenDialog1.FileName);
    LStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareExclusive);
    LData.Stream['file0'] := LStream;
    if uploadFile(LData) then
      ShowMessage('上传文件成功')
    else ShowMessage('上传文件失败');
    LData.Free;
    LStream.Free;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  btnClick(nil);
end;

procedure TForm1.Button11Click(Sender: TObject);
var
  sql: String;
  code: string;
  head: string;
  len: Integer;
  isbill: string;
begin
    Query('1', ['select * from tautocode where billname=''采购订单'''], [clientdataset1]);
    code := clientdataset1.fieldbyname('billcode').AsString;
    head := clientdataset1.fieldbyname('billhead').AsString;
    len := clientdataset1.fieldbyname('codelen').AsInteger;
    isbill := clientdataset1.fieldbyname('isbill').AsString;
    while Length(code) < len do
      code := '0' + code;
  //  if isbill = '是' then
      Memo1.Lines.Add(head + FormatDateTime('yymmdd', now) + code);
  //  else
    //  Result := head + code;

end;

end.

 

2)delphi客户端使用TFDMemTable

参考“client(fdmemtable)”例子。使用TIdHttp(TNetHttpClient), TFDMemTable。适合delphi2009+开发的客户端。

可匹配delphi开发的APP,CS,UNIGUI等程序。

接口例程:

unit Unit1;
/// <author>cxg 2025-4-20</author>

interface

uses
  // my--
  server.api, fdmemtable.help, core.binary,
  // system--
  dialogs, System.SysUtils,
  Data.DB, forms, Vcl.ExtCtrls, Vcl.Controls,
  Vcl.Grids, Vcl.DBGrids, System.Classes, Vcl.StdCtrls, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.StorageBin,
  FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
  TForm1 = class(TForm)
    btn: TButton;
    dbgrd1: TDBGrid;
    dbgrd2: TDBGrid;
    ds1: TDataSource;
    ds2: TDataSource;
    Timer1: TTimer;
    Button1: TButton;
    Button7: TButton;
    Image1: TImage;
    Memo1: TMemo;
    Button5: TButton;
    Button6: TButton;
    FDMemTable1: TFDMemTable;
    FDMemTable2: TFDMemTable;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    OpenDialog1: TOpenDialog;
    procedure btnClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private { Private declarations }
  public { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnClick(Sender: TObject);
// 多表查询
var LRpc: Trpc;
begin
  LRpc.Query('1', ['select * from tgoods', 'select * from tunit'],
    [FDMemTable1, FDMemTable2]);
end;

procedure TForm1.Button10Click(Sender: TObject);
//存储过程
var
  LRequest, LResponse: Tdata;
  LStream: TStream;
begin
  LRequest := Tdata.Create;
  LRequest.S['dbid'] := '1';
  LRequest.S['procname'] := 'sp_9';
  LRequest.S['@goodsid'] := '100036';
  LResponse := TRpc.storedproc(LRequest);
  LStream := LResponse.STREAM['dataset0'];
  FDMemTable1.DisableControls;
  FDMemTable1.LoadFromStream(LStream);
  FDMemTable1.EnableControls;
  LRequest.Free;
  LResponse.Free;
  LStream.Free;
end;

procedure TForm1.Button11Click(Sender: TObject);
var
  sql: String;
  code: string;
  head: string;
  len: Integer;
  isbill: string;
  cdscode: Tfdmemtable;
begin
  cdscode := Tfdmemtable.Create(nil);
  try
    sql := 'update tautocode set billcode=billcode+1 where billname=' + QuotedStr('采购订单');
    TRpc.execsql('1', sql);
    sql := 'select * from tautocode where billname=' + QuotedStr('采购订单');
    cdscode.Query('1', sql);
    code := cdscode.fieldbyname('billcode').AsString;
    head := cdscode.fieldbyname('billhead').AsString;
    len := cdscode.fieldbyname('codelen').AsInteger;
    isbill := cdscode.fieldbyname('isbill').AsString;
    while Length(code) < len do
      code := '0' + code;
  //  if isbill = '是' then
      Memo1.Lines.Add(head + FormatDateTime('yymmdd', now) + code);
  //  else
    //  Result := head + code;
  finally
    cdscode.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
// 多表保存
begin
  if TRpc.save('1', ['tgoods', 'tunit'], [' ', ' '], [FDMemTable1, FDMemTable2]) then
  begin
    FDMemTable1.MergeChangeLog;
    FDMemTable2.MergeChangeLog;
    ShowMessage('保存成功');
  end
  else
  begin
    FDMemTable1.Cancel;
    FDMemTable2.Cancel;
    ShowMessage('保存失败');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
// 雪花ID
var
  LId: Int64;
  LRpc: Trpc;
begin
  LRpc.snowflakeID(LId, 1, 1);
  Memo1.Lines.Add(LId.ToString);
end;

procedure TForm1.Button3Click(Sender: TObject);
// 验证码
var
  LCode: string;
  LStream: TStream;
  LRpc: Trpc;
begin
  LStream := TMemoryStream.Create;
  LRpc.verifyCode(LCode, LStream);
  Memo1.Lines.Add(LCode);
  Image1.Picture.LoadFromStream(LStream);
  LStream.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
// 上传文件
var
  LData: TData;
  LStream: TStream;
begin
  if OpenDialog1.Execute then
  begin
    LData := TData.Create;
    LData.I['count'] := 1;
    LData.S['filename0'] := ExtractFileName(OpenDialog1.FileName);
    LStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareExclusive);
    LData.Stream['file0'] := LStream;
    if TRpc.uploadFile(LData) then
      ShowMessage('上传文件成功')
    else ShowMessage('上传文件失败');
    LData.Free;
    LStream.Free;
  end;
end;

procedure TForm1.Button5Click(Sender: TObject);
// 单表查询
begin
  FDMemTable1.query('1', 'select * from tgoods');
end;

procedure TForm1.Button6Click(Sender: TObject);
// 单表保存
begin
  if FDMemTable1.save('1', 'tgoods', ' ') then
  begin
    FDMemTable1.MergeChangeLog;
    ShowMessage('保存成功');
  end
  else
  begin
    FDMemTable1.Cancel;
    ShowMessage('保存失败');
  end;
end;

procedure TForm1.Button7Click(Sender: TObject);
// execsql
begin
  if FDMemTable1.execsql('1', 'delete from tunit where unitid=''1''') then
    ShowMessage('execsql成功')
  else
    ShowMessage('execsql失败');
end;

procedure TForm1.Button8Click(Sender: TObject);
// 下载文件
var
  LRequest, LResponse: TData;
  LFile: TStream;
  LFileName: string;
begin
  LFileName := '1.exe';
  LRequest := TData.Create;
  LRequest.I['count'] := 1;
  LRequest.S['filename0'] := LFileName;
  LResponse := TRpc.downloadFile(LRequest);
  if LResponse.B['success'] then
  begin
    LFile := LResponse.Stream['file0'];
    TMemoryStream(LFile).SaveToFile('c:\' + LFileName);
    LFile.Free;
    ShowMessage('下载文件成功');
  end else ShowMessage('下载文件失败');
  LRequest.Free;
  LResponse.Free;

end;

procedure TForm1.Button9Click(Sender: TObject);
// 存储过程(多数据集)
var
  LRequest, LResponse: TData;
  LStream, LStream2: TStream;
begin
  LRequest := Tdata.Create;
  LRequest.S['dbid'] := '1';
  LRequest.S['procname'] := 'gettables';
  LResponse := TRpc.storedproc(LRequest);
  LStream := LResponse.STREAM['dataset0'];
  LStream2 := LResponse.STREAM['dataset1'];
  FDMemTable1.DisableControls;
  FDMemTable1.LoadFromStream(LStream);
  FDMemTable1.EnableControls;
  FDMemTable2.DisableControls;
  FDMemTable2.LoadFromStream(LStream2);
  FDMemTable2.EnableControls;
  LRequest.Free;
  LResponse.Free;
  LStream.Free;
  LStream2.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  btnClick(nil);
end;

end.

3)delphi客户端使用TClientDataSet

参考“client(clientdataset)”,使用TIdHttp(TNetHttpClient),TClientDataSet。适合delphi2009+开发的客户端。

可匹配delphi开发的APP,CS,UNIGUI等程序。

接口例程:

unit Unit1;
/// <author>cxg 2025-4-20</author>

interface

uses
  // my--
  cds.help, server.api, core.binary,
  // system--
  dialogs, System.SysUtils,
  Data.DB, forms, Vcl.ExtCtrls, Vcl.Controls,
  Vcl.Grids, Vcl.DBGrids, System.Classes, Vcl.StdCtrls, FireDAC.Stan.Intf,
  Datasnap.DBClient;

type
  TForm1 = class(TForm)
    btn: TButton;
    dbgrd1: TDBGrid;
    dbgrd2: TDBGrid;
    ds1: TDataSource;
    ds2: TDataSource;
    Timer1: TTimer;
    Button1: TButton;
    ClientDataSet1: TClientDataSet;
    ClientDataSet2: TClientDataSet;
    Button7: TButton;
    Image1: TImage;
    Memo1: TMemo;
    Button5: TButton;
    Button6: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    OpenDialog1: TOpenDialog;
    procedure btnClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private { Private declarations }
  public { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnClick(Sender: TObject);
// 多表查询
begin
  TRpc.Query('1', ['select * from tgoods', 'select * from tunit'],
    [ClientDataSet1, ClientDataSet2]);
end;

procedure TForm1.Button10Click(Sender: TObject);
// 下载文件
var
  LRequest, LResponse: TData;
  LFile: TStream;
  LFileName: string;
begin
  LFileName := '1.exe';
  LRequest := TData.Create;
  LRequest.I['count'] := 1;
  LRequest.S['filename0'] := LFileName;
  LResponse := TRpc.downloadFile(LRequest);
  if LResponse.B['success'] then
  begin
    LFile := LResponse.Stream['file0'];
    TMemoryStream(LFile).SaveToFile('c:\' + LFileName);
    LFile.Free;
    ShowMessage('下载文件成功');
  end
  else
    ShowMessage('下载文件失败');
  LRequest.Free;
  LResponse.Free;
end;

procedure TForm1.Button11Click(Sender: TObject);
var
  sql: String;
  code: string;
  head: string;
  len: Integer;
  isbill: string;
  cdscode: TClientDataSet;
begin
  cdscode := TClientDataSet.Create(nil);
  try
    sql := 'update tautocode set billcode=billcode+1 where billname=' +
      QuotedStr('采购订单');
    TRpc.execsql('1', sql);
    sql := 'select * from tautocode where billname=' + QuotedStr('采购订单');
    cdscode.Query('1', sql);
    code := cdscode.fieldbyname('billcode').AsString;
    head := cdscode.fieldbyname('billhead').AsString;
    len := cdscode.fieldbyname('codelen').AsInteger;
    isbill := cdscode.fieldbyname('isbill').AsString;
    while Length(code) < len do
      code := '0' + code;
    // if isbill = '是' then
    Memo1.Lines.Add(head + FormatDateTime('yymmdd', now) + code);
    // else
    // Result := head + code;
  finally
    cdscode.Free;
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
// 多表保存
begin
  TRpc.save('1', ['tgoods', 'tunit'], [' ', ' '],
    [ClientDataSet1, ClientDataSet2]);
end;

procedure TForm1.Button2Click(Sender: TObject);
// 雪花ID
var
  LId: Int64;
begin
  TRpc.snowflakeID(LId, 1, 1);
  Memo1.Lines.Add(LId.ToString);
end;

procedure TForm1.Button3Click(Sender: TObject);
// 验证码
var
  LCode: string;
  LStream: TStream;
begin
  LStream := TMemoryStream.Create;
  TRpc.verifyCode(LCode, LStream);
  Memo1.Lines.Add(LCode);
  Image1.Picture.LoadFromStream(LStream);
  LStream.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
// 存储过程(多数据集)
var
  LRequest, LResponse: TData;
begin
  LRequest := TData.Create;
  LRequest.S['dbid'] := '1';
  LRequest.S['procname'] := 'gettables';
  LResponse := TRpc.storedproc(LRequest);
  ClientDataSet1.DisableControls;
  ClientDataSet1.Data := LResponse.V['dataset0'];
  ClientDataSet1.EnableControls;
  ClientDataSet2.DisableControls;
  ClientDataSet2.Data := LResponse.V['dataset1'];
  ClientDataSet2.EnableControls;
  LRequest.Free;
  LResponse.Free;
end;

procedure TForm1.Button5Click(Sender: TObject);
// 单表查询
begin
  ClientDataSet1.Query('1', 'select * from tgoods');
end;

procedure TForm1.Button6Click(Sender: TObject);
// 单表保存
begin
  ClientDataSet1.save('1', 'tgoods', ' ');
end;

procedure TForm1.Button7Click(Sender: TObject);
// execsql
begin
  ClientDataSet1.execsql('1', 'delete from tgoods where goodsid=''5''');
end;

procedure TForm1.Button8Click(Sender: TObject);
// 存储过程(单数据集)
var
  LRequest, LResponse: TData;
begin
  LRequest := TData.Create;
  LRequest.S['dbid'] := '1';
  LRequest.S['procname'] := 'sp_9';
  LRequest.S['@goodsid'] := '100036';
  LResponse := TRpc.storedproc(LRequest);
  ClientDataSet1.DisableControls;
  ClientDataSet1.Data := LResponse.V['dataset0'];
  ClientDataSet1.EnableControls;
  LRequest.Free;
  LResponse.Free;
end;

procedure TForm1.Button9Click(Sender: TObject);
// 上传文件
var
  LData: TData;
  LStream: TStream;
begin
  if OpenDialog1.Execute then
  begin
    LData := TData.Create;
    LData.I['count'] := 1;
    LData.S['filename0'] := ExtractFileName(OpenDialog1.FileName);
    LStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareExclusive);
    LData.Stream['file0'] := LStream;
    if TRpc.uploadFile(LData) then
      ShowMessage('上传文件成功')
    else ShowMessage('上传文件失败');
    LData.Free;
    LStream.Free;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  btnClick(nil);
end;

end.

 

4)web api

中间件提供web api服务接口,请求和应答均使用json序列,方便与web和其他语言开发的3方程序进行对接。

中间件提供了一个例子:webapi包。

如何对接?参看中间件doc\目录下面的文档。

 

posted @ 2025-04-29 12:20  delphi中间件  阅读(63)  评论(0)    收藏  举报