Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 4850|回复: 8

QuickBurro for Lazarus三层架构开发资料

[复制链接]

该用户从未签到

发表于 2013-7-29 00:28:56 | 显示全部楼层 |阅读模式
本帖最后由 wpy020327 于 2013-7-29 00:44 编辑

目录
引言
一、基础类
1.1. Lazarus特有的内存表控件
1.2. LazJson类
1.3. TLazParcel字段类型及属性
1.4. 数据序列化与打包
1.5. 数据解包与反序列化
1.6. 使用TLazParcel类的完整示例
二、资源查找与连接
2.1. TLazConnection控件
2.1.1. 控件属性
2.1.2. 控件事件
2.1.3. 控件方法
2.2. TLazFinder控件
2.2.1. 控件属性
2.2.2. 控件事件
2.2.3. 控件方法
三、数据库访问
3.1. TLazAccessor属性
3.2. TLazAccessor事件
3.3. TLazAccessor方法
3.3.1. 简单读写方法
3.3.2. 记录插入与修改
3.3.3. Blob字段处理方法
3.3.4. 存储过程调用
3.3.5. 键值生成
3.3.6. 多数据集读写
3.3.7. 组合任务
3.3.8. 分页查询与大数据集读取
3.3.9. 数据库实体类
3.3.10. 基于实体类的实例
四、文件目录访问
4.1. TLazFiles属性
4.2. TLazFiles事件
4.3. TLazFiles方法
五、文件传输
5.1. TLazFileTransfer属性
5.2. TLazFileTransfer事件
5.3. TLazFileTransfer方法
5.4. 文件传输完整示例
5.5. 文件夹传输完整示例
六、消息发送
6.1. TLazPoster属性
6.2. TLazPoster事件
6.3. TLazPoster方法
七、消息接收
7.1. TLazReceiver属性
7.2. TLazReceiver事件
7.3. TLazReceiver方法
八、与其它终端的消息互通
8.1. 与IM模式用户间的消息传输
8.2. 与DB模式基本连接间的消息传输
8.3. 与Webocket终端间的消息传输
8.4. 与移动终端间的消息传输
九、插件及远过程调用
9.1. TLazRPC属性
9.2. TLazRPC事件
9.3. TLazRPC方法
9.4. 插件编写模板
十、后记

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-7-29 23:32:09 | 显示全部楼层
QuickBurro V4.28版本正式发布,
开始支持Lazarus ! 主要更新内容:

1、用户反馈的一些小问题的修正
2、新增标准ISAPI接口的支持
3、新增for Lazarus的应用开发包
4、新增for Lazarus开发包用户指南资料

----------
请加QQ群 79114999
或到网站 www.qukckburro.com 下载试用
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-7-29 23:42:28 | 显示全部楼层
1、Lazarus开发包的安装方法:

1)、先安装Indy 10 for Lazarus
2)、安装LazSDK\qblazarus.lpk

2、for Lazarus的Demo,位于:
demo\lazarus_demo下
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-8-4 14:33:51 | 显示全部楼层


WinCE下应用开发的demo
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-8-4 14:34:18 | 显示全部楼层
unit main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, ComCtrls, LazConnection, LazAccessor, LazRpc, memds, db, LazParcel,
  LazFileTransfer, LazFiles, LazMemTable;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button5: TButton;
    dba: TLazAccessor;
    ImageList1: TImageList;
    LazConn: TLazConnection;
    files: TLazFiles;
    MTab: TLazMemTable;
    ListView1: TListView;
    Memo1: TMemo;
    Panel1: TPanel;
    Panel2: TPanel;
    Rpc: TLazRpc;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

//
// 退出...
procedure TForm1.Button5Click(Sender: TObject);
begin
  application.Terminate;
end;

//
// 读数据集测试...
procedure TForm1.Button1Click(Sender: TObject);
begin
  if dba.ReadDataset('select * from customers',MTab) then
     begin
        memo1.lines.add('读远程数据集成功!');
        memo1.lines.add('    记录总数='+inttostr(MTab.RecordCount));
        MTab.First;
        listview1.Items.BeginUpdate;
        listview1.Items.Clear;
        while not MTab.EOF do
           begin
              with listview1.items.add do
                 begin
                    caption:=trim(AnsiToUTF8(MTab.GetAsString('CustomerId')));
                    subitems.add(trim(AnsiToUTF8(MTab.GetAsString('CompanyName'))));
                    subitems.add(trim(AnsiToUTF8(MTab.GetAsString('Phone'))));
                 end;
              MTab.next;
           end;
        listview1.Items.EndUpdate;
        MTab.Close;
     end
  else
     memo1.lines.add('读远程数据集失败!Error='+dba.LastError);
end;

//
// 读文件内容测试...
procedure TForm1.Button2Click(Sender: TObject);
var
  Stream: TMemoryStream;
  tmpstr: string;
begin
  Stream:=TMemoryStream.Create;
  if files.RemoteFileToStream('config\users.lst',stream) then
     begin
        memo1.lines.add('从服务器读文件成功!内容:');
        setlength(tmpstr,stream.size);
        stream.Position:=0;
        move(stream.Memory^,tmpstr[1],stream.size);
        tmpstr:=AnsiToUtf8(tmpstr);
        memo1.lines.add(tmpstr);
     end
  else
     memo1.lines.add('从服务器读文件失败!Error='+dba.LastError);
end;

//
// 远过程调用测试...
procedure TForm1.Button3Click(Sender: TObject);
var
   InParcel,OutParcel: TLazParcel;
   tmpstr: string;
begin
   InParcel:=TLazParcel.create;
   InParcel.putstringgoods('echostring','欲把西湖比西子,淡妆浓抹总相宜。');
   OutParcel:=TLazParcel.create;
   if rpc.Call('rpcecho.asq',inparcel,outparcel) then
      begin
         memo1.lines.add('远过程调用成功!');
         memo1.lines.add('   传入的参数='+'欲把西湖比西子,淡妆浓抹总相宜。');
         tmpstr:=outparcel.getstringgoods('echostring');
         memo1.lines.add('   传出的参数='+tmpstr);
      end
   else
      memo1.lines.add('远过程调用成功失败!');
   FreeAndNil(inparcel);
   FreeAndNil(OutParcel);
end;

//
// 程序启动时,连接应用服务器...
procedure TForm1.FormCreate(Sender: TObject);
begin
   if lazconn.Connect then
      memo1.lines.add('连接服务器成功!')
   else
      memo1.lines.add('连接服务器失败!Error='+dba.LastError);
end;

end.

                        
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-8-4 14:36:09 | 显示全部楼层
远过程调用时,服务端业务逻辑部件使用Delphi编写,上面这个例子的示例:

//
// rpcecho.pas -- Lazarus下的插件编写Demo
//                Version: 1.00
//                Date: 2013.7.6.
//                Author: Jopher(W.G.Z)
//                Homepage: http://www.quickburro.com/
//
library rpcecho;

uses
  FastMM4,
  FastMove,
  SysUtils,
  Classes,
  Windows,
  AnsiStrings,
  QBParcel,
  DllSpread,
  NodeServiceAPI,
  LazPluginApi;

{$R *.RES}

//
// 主函数...
function MainFunction(RequestParcel: TQBParcel; ResponseParcel: TQBParcel): boolean;
var
   LazRequest,LazResponse: TQBParcel;
   tmpstr: ansistring;
begin
//
// 取请求参数...
   LazRequest:=TQBParcel.Create;
   if not GetLazRequest(RequestParcel,LazRequest) then
      begin
         result:=false;
         FreeAndNil(LazRequest);
         exit;
      end;
//
// 业务逻辑处理...
   tmpstr:=ansistring(utf8toansi(LazRequest.GetAnsiStringGoods('echostring')));
   tmpstr:=AnsiToUtf8('Received and feedback: '+string(tmpstr));
//
// 写入到目标包裹...
   LazResponse:=TQBParcel.Create;
   LazResponse.PutAnsiStringGoods('echostring',tmpstr);
   result:=PutLazResponse(LazResponse,ResponseParcel);
   FreeAndNil(LazResponse);
//
// 完成,释放对象...
   FreeAndNil(LazRequest);
end;

//
// 导出函数,应用程序员不用改动...
function WebpageProcess(InParcelPtr: integer; var OutParcelPtr: integer): boolean; stdcall;
var
   aInParcel: TQBParcel;
   aOutParcel: TQBParcel;
begin
   try
      aInParcel:=TQBParcel(InParcelPtr);
   except
      result:=false;
      exit;
   end;
   aOutParcel:=TQBParcel.Create;
   try
      Result:=MainFunction(aInParcel,aOutParcel);
   except
      result:=false;
      aOutParcel.Clear;
   end;
   if aOutParcel.GoodsCount<=0 then
      OutParcelPtr:=0
   else
      OutParcelPtr:=Parcel2Mem(aOutParcel);
   aOutParcel.free;
end;

exports
   WebpageProcess;

begin
end.

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-8-4 14:36:23 | 显示全部楼层
//
// rpcecho.pas -- Lazarus下的插件编写Demo
//                Version: 1.00
//                Date: 2013.7.6.
//                Author: Jopher(W.G.Z)
//                Homepage: http://www.quickburro.com/
//
library rpcecho;

uses
  FastMM4,
  FastMove,
  SysUtils,
  Classes,
  Windows,
  AnsiStrings,
  QBParcel,
  DllSpread,
  NodeServiceAPI,
  LazPluginApi;

{$R *.RES}

//
// 主函数...
function MainFunction(RequestParcel: TQBParcel; ResponseParcel: TQBParcel): boolean;
var
   LazRequest,LazResponse: TQBParcel;
   tmpstr: ansistring;
begin
//
// 取请求参数...
   LazRequest:=TQBParcel.Create;
   if not GetLazRequest(RequestParcel,LazRequest) then
      begin
         result:=false;
         FreeAndNil(LazRequest);
         exit;
      end;
//
// 业务逻辑处理...
   tmpstr:=ansistring(utf8toansi(LazRequest.GetAnsiStringGoods('echostring')));
   tmpstr:=AnsiToUtf8('Received and feedback: '+string(tmpstr));
//
// 写入到目标包裹...
   LazResponse:=TQBParcel.Create;
   LazResponse.PutAnsiStringGoods('echostring',tmpstr);
   result:=PutLazResponse(LazResponse,ResponseParcel);
   FreeAndNil(LazResponse);
//
// 完成,释放对象...
   FreeAndNil(LazRequest);
end;

//
// 导出函数,应用程序员不用改动...
function WebpageProcess(InParcelPtr: integer; var OutParcelPtr: integer): boolean; stdcall;
var
   aInParcel: TQBParcel;
   aOutParcel: TQBParcel;
begin
   try
      aInParcel:=TQBParcel(InParcelPtr);
   except
      result:=false;
      exit;
   end;
   aOutParcel:=TQBParcel.Create;
   try
      Result:=MainFunction(aInParcel,aOutParcel);
   except
      result:=false;
      aOutParcel.Clear;
   end;
   if aOutParcel.GoodsCount<=0 then
      OutParcelPtr:=0
   else
      OutParcelPtr:=Parcel2Mem(aOutParcel);
   aOutParcel.free;
end;

exports
   WebpageProcess;

begin
end.

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-8-4 14:57:35 | 显示全部楼层
上例中的远过程调用对应的服务端业务逻辑部件采用DELPHI编写,简单地回传一下参数、非常简单,复杂的业务逻辑,请各位自己变通:

//
// rpcecho.pas -- 供Lazarus远程调用的业务逻辑部件Demo
//                Version: 1.00
//                Date: 2013.7.6.
//                Author: Jopher(W.G.Z)
//                QQ: 779545524
//
library rpcecho;

uses
  FastMM4,
  FastMove,
  SysUtils,
  Classes,
  Windows,
  AnsiStrings,
  QBParcel,
  DllSpread,
  NodeServiceAPI,
  LazPluginApi;

{$R *.RES}

//
// 主函数...
function MainFunction(RequestParcel: TQBParcel; ResponseParcel: TQBParcel): boolean;
var
   LazRequest,LazResponse: TQBParcel;
   tmpstr: ansistring;
begin
//
// 取请求参数...
   LazRequest:=TQBParcel.Create;
   if not GetLazRequest(RequestParcel,LazRequest) then
      begin
         result:=false;
         FreeAndNil(LazRequest);
         exit;
      end;
//
// 业务逻辑处理...
   tmpstr:=ansistring(utf8toansi(LazRequest.GetAnsiStringGoods('echostring')));
   tmpstr:=AnsiToUtf8('Received and feedback: '+string(tmpstr));
//
// 写入到目标包裹...
   LazResponse:=TQBParcel.Create;
   LazResponse.PutAnsiStringGoods('echostring',tmpstr);
   result:=PutLazResponse(LazResponse,ResponseParcel);
   FreeAndNil(LazResponse);
//
// 完成,释放对象...
   FreeAndNil(LazRequest);
end;

//
// 导出函数,应用程序员不用改动...
function WebpageProcess(InParcelPtr: integer; var OutParcelPtr: integer): boolean; stdcall;
var
   aInParcel: TQBParcel;
   aOutParcel: TQBParcel;
begin
   try
      aInParcel:=TQBParcel(InParcelPtr);
   except
      result:=false;
      exit;
   end;
   aOutParcel:=TQBParcel.Create;
   try
      Result:=MainFunction(aInParcel,aOutParcel);
   except
      result:=false;
      aOutParcel.Clear;
   end;
   if aOutParcel.GoodsCount<=0 then
      OutParcelPtr:=0
   else
      OutParcelPtr:=Parcel2Mem(aOutParcel);
   aOutParcel.free;
end;

exports
   WebpageProcess;

begin
end.


回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2014-2-4 19:41:41 | 显示全部楼层
这是收费工具 。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 23:54 , Processed in 0.029555 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表