[DCC Error] SPCOMM.PAS(1195): E2010 Incompatible types: ‘Array’ and ‘PAnsiChar’

Delphi中有PChar、PWideChar、 PAnsiChar三种形式。
在 Delphi2010 之前,默认PChar是PAnsiChar,之后默认都是 PWideChar。
如果你当前版本报错,就要具体指定是PAnsiChar或者是PWideChar。

Delphi 农行闪付接口

unit TestFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils;

type
  TfrmTest = class(TForm)
    btnTest: TButton;
    memLine: TMemo;
    procedure btnTestClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  //农行闪付接口
  function CARDPAY(str: PChar; pin: PChar): Integer; stdcall; external 'sPosDll.dll';

var
  frmTest: TfrmTest;

implementation

{$R *.dfm}

//---------------------------------------------------
//测试
//add by jzh 2014-09-30
//---------------------------------------------------
procedure TfrmTest.btnTestClick(Sender: TObject);
var
  strin, strout: array [0..1024] of Char;
  in_str: String;      //输入参数
  out_str: String;     //返回参数
  flag_str: String;    //返回结果 00 表示成功,ER表示失败
  msg_str: String;     //返回消息 交易失败的中文提示信息
  money_str: String;   //金额
  poscode_str: String; //收银机编号 长度8位
  usercode_str: String;//操作员编号 长度6位 放宽到 12位
  dSaleMoney: double;  //金额
begin
  try
    ZeroMemory(@strin, 1024);
    ZeroMemory(@strout, 1024);

    //消费=S01

    //金额 1.5元, 转换为分
    dSaleMoney:= 1.5 * 100;

    //交易金额 12位 右对齐,以分为单位,不足左补 0
    money_str:= StringOfChar('0', 12 - Length(FloatToStr(dSaleMoney))) + FloatToStr(dSaleMoney);

    //收银机编号 长度8位 左对齐,不足右补空格
    poscode_str:= '00000001';
    poscode_str:= poscode_str + StringOfChar(' ', 8 - Length(poscode_str));
    
    //操作员编号 长度12位 左对齐,不足右补空格
    usercode_str:= '123456';
    usercode_str:= usercode_str + StringOfChar(' ', 12 - Length(usercode_str));

    in_str:= 'S01' + money_str + ' '+  poscode_str + ' '+ usercode_str;

    //格式转换
    StrPCopy(strin, in_str);

    //调用闪付接口
    CARDPAY(strin, strout);

    //返回值处理
    out_str:= strout;
    flag_str:= LeftBStr(out_str, 2);
    msg_str:= MidBStr(out_str, 3, 40);

    if flag_str = '00' then
    begin
      //成功
    end
    else begin
      //失败
    end;

    memLine.Lines.Add(out_str);

  except
  end;
end;

end.

关于Delphi通过https访问支付宝接口

1、将libeay32.dll、ssleay32.dll拷贝至exe目录下。
2、uses IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL,
IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient,
IdTCPClient, IdHTTP;
3、编写函数fucHttpAlipay。

//---------------------------------------------------------------
//支付宝请求
//add by jzh 2014-06-06
//---------------------------------------------------------------
function fucHttpAlipay(sUrl: String; slPara: TStrings): String;
var
  idhttpApp: TIdHTTP;
  idssl: TIdSSLIOHandlerSocket;
  sValue: String;
begin
  idhttpApp:= TIdHTTP.Create(nil);
  idhttpApp.HandleRedirects:= True;
  idhttpApp.AllowCookies:= True;
  idhttpApp.HTTPOptions:= [hoForceEncodeParams];
  idhttpApp.ProtocolVersion:= pv1_1;
  idhttpApp.Request.ContentType:= 'application/x-www-form-urlencoded';
  idhttpApp.ConnectTimeout:= 6000;
  idhttpApp.ReadTimeout:= 12000;

  idssl:= TIdSSLIOHandlerSocket.Create(nil);
  idssl.SSLOptions.Method:= sslvSSLv3;
    
  idhttpApp.IOHandler:= idssl;

  try
    sValue:= idhttpApp.Post(sUrl, slPara);
    //sValue:= StringReplace(sValue, #$D#$A, '', [rfReplaceAll, rfIgnoreCase]); //rfIgnoreCase忽略大小写
    sValue:= StringReplace(sValue, #$A, '', [rfReplaceAll, rfIgnoreCase]); //rfIgnoreCase忽略大小写
    idhttpApp.Free;
    idssl.Free;
    Result:= sValue;
  except
    begin
      idhttpApp.Free;
      idssl.Free;
      Result:= '-1';
    end;
  end;
end;
阅读全文

POS连锁收银系统

从零开始,一个人从研究业务、设计系统架构、编写概要设计/详细设计等相关文档,像蚂蚁搬家一样,一点一滴的逐步完成各个子系的Demo。基本功能完成之后,又加入了1位伙伴,两个人历时1年,完成系统所有功能的研发/测试,顺利完成系统的上线。
一、主要功能
1、支持触摸屏(双屏),纯触摸操作。
2、图形化界面,美观简洁,操作方便,易学易用。
3、产品分类、产品信息由总部统一建立、统一维护、指定产品的销售区域、门店,所有数据由总部统一下发。
4、灵活的营销方案,允许指定日期优惠、满多少送多少、支付方式打折等。
5、会员管理支持积分、储值、折扣。支持消费、充值、挂失、解挂、补卡、退卡等操作。
6、可自定义多种支付方式,支持现金、会员卡、礼券、银行卡等多种支付方式收银,还支持混合模式收银。
7、产品可定义厨打,支持吧台小票打印、厨房打印、打包打印。
8、严格细致的用户权限控制,给门店不同工种的人员设置不同的操作权限(功能模块、报表、退单、会员卡处理等)。
9、报表功能丰富,总部系统对门店的销售数据进行汇总处理,提供清晰的、多维度的业务报表。
10、系统支持断网脱机销售,即使网络中断,也能保障正常收银。
二、主要架构
1、系统组件

2、技术架构


3、网络架构

4、负载均衡
阅读全文

Delphi代码动态创建控件与事件动态绑定

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmMain = class(TForm)
    btnTest: TButton;
    mmLine: TMemo;
    btnList: TButton;
    btnCreate: TButton;
    procedure btnTestClick(Sender: TObject);
    procedure btnListClick(Sender: TObject);
    procedure btnCreateClick(Sender: TObject);
    procedure btnCateClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

  type
    TUser = record
    usercode: string;
    username: string;
    usertel: string;
  end;

implementation

{$R *.dfm}

// 按钮事件
procedure TfrmMain.btnCateClick(Sender: TObject);
var
  flag: Integer;
begin
   flag:= (Sender as TButton).Tag;
   ShowMessage('Cate' + IntToStr(flag));
end;

// 测试
procedure TfrmMain.btnCreateClick(Sender: TObject);
var
  btns: TButton;
  i: Integer;
begin
  try
    for i:= 0 to 3 do
    begin
      btns:= TButton.Create(Self);
      btns.Width:= 100;
      btns.Height:= 20;
      btns.Caption:= 'Cate' + IntToStr(i);
      btns.OnClick:= btnCateClick;
      btns.Left:= i * 100;
      btns.Tag:= i;
      btns.Parent:= Self;
    end;
  finally

  end;
end;


end.

Delphi结构体的定义和使用

var
  frmMain: TfrmMain;

  type
    TUser = record
    usercode: string;
    username: string;
    usertel: string;
  end;

implementation

{$R *.dfm}

// 测试
procedure TfrmMain.btnTestClick(Sender: TObject);
var
  user: TUser;
begin
  try
    user.usercode:= '9001';
    user.username:= 'jzh';
    user.usertel:= '159';

    mmLine.Lines.Add(user.usercode);
    mmLine.Lines.Add(user.username);
    mmLine.Lines.Add(user.usertel);

  finally

  end;
end;

Delphi快捷键

Delphi常用快捷键

分类 快捷键 解释
组件设计类 Esc 选择当前组件容器
Shift + Click 选择多个组件;选择窗体
Tab 选择下一个组件
Shift + Tab 选择上一个组件
方向键 选择此方向的下一个组件
Ctrl + 方向键 将所选组件的位置移动 1 个像素
Shift + 方向键 将所选组件的大小改变 1 个像素
Ctrl + Shift + 方向键 将所选组件的位置移动 1 个栅格
Del 删除所选组件
Ctrl + 鼠标拖动 选择一个容器内的多个组件
Tab(在 Object Inspector 中使用) 搜索属性或事件
代码编辑类 F1; Ctrl + F1 光标所在单词的帮助
Ctrl + Shift + Enter 光标所在单词的参考
Ctrl + Click(标识符) 寻找标识符的声明处
Ctrl + A 全选
Ctrl + C 复制
Ctrl + X 剪切
Ctrl + V 粘贴
Ctrl + S 保存
Ctrl + F 查找
F3; Ctrl + L 继续查找
Ctrl + R 替换
Ctrl + E 高级查找
Ctrl + Shift + F 查找文件
Ctrl + Z Undo
Del 删除选中的代码
Ctrl + Home 到开始
Ctrl + End 到结束
Ctrl + ← 按词左移
Ctrl + → 按词右移
Ctrl + ↑ 窗口上滚
Ctrl + ↓ 窗口下滚
Ctrl + PgUp 本屏首行
Ctrl + PgDn 本屏尾行
Alt + G; Ctrl + O + G 到指定行
Ctrl + Shift + 0..9; Ctrl + K + 0..9 设置(或取消)书签
Ctrl + 0..9; Ctrl + Q + 0..9 跳到书签
Ctrl + 空格 输入提示
Ctrl + J 代码模版
Ctrl + Shift + J (选定后)进入同步编辑模式
Ctrl + Shift + 空格 重新提示参数列表
Ctrl + K + T 选定光标前的单词
Ctrl + N 插入新行
Shift + 方向键/Home/End/PgUp/PgDn 扩选
Shift + Alt + 方向键/Home/End/PgUp/PgDn 区域选择
Shift + Alt + PgUp/PgDn 区域选择
Ctrl + Shift + Alt + PgUp/PgDn 区域选择
Ctrl + Shift + PgUp/PgDn 区域选择
Ctrl + Shift + 水平方向键 按单词扩选
Ctrl + O + C 变换选区
Ctrl + O + I 变换选区
Ctrl + O + L 变换选区
Ctrl + O + K 恢复选区的变换选区
Alt + 左键拖动 区域选择
Ctrl + O + L 选择当前行
Ctrl + Y 删除当前行
Ctrl + Shift + Y 删除行右边部分
Ctrl + T 向右删除词
Ctrl + BackSpace 向左删除词
Ctrl + K + W 将文本块写入文件
Ctrl + K + R 读入文本块
Ctrl + K + C 文本再制
Ctrl + K + N 代码转大写
Ctrl + K + O 代码转小写
Ctrl + K + F 代码转大写, 并取消选择
Ctrl + K + E 代码转小写, 并取消选择
Ctrl + O + U 改变光标后面的字母大小写
Ctrl + Shift + I; Ctrl + K + I 右移代码块
Ctrl + Shift + U; Ctrl + K + U 左移代码块
Ctrl + I 似Tab
Ctrl + M 似Enter
Ctrl + N 似Enter,但光标位置不变
Ctrl + Enter 打开光标所在单词的文件
Alt + ]/[ 查找本组定界符
Ctrl + Shift + V 把选定的字符声明为变量
Ctrl + Alt + ↓ 光标从声明区跳到代码区
Ctrl + / 注释与取消注释
Ctrl + Shift + R 录制(开始/停止)宏
Ctrl + Shift + P 播放宏
Ctrl + Shift + T 加入TO DO注释
Alt + V + i 打开 TO DO List
Ctrl + Shift + C 类自动生成
Ctrl + Shift + ↑/↓ 从接口到实现; 到程序第一行
Ctrl + Shift + G 为接口加入新的GUID
Ctrl + Alt + PgUp 第一个函数
Ctrl + Alt + PgDn 最后一个函数
窗口控制类 Shift + F12 查找窗体
Alt + F12 窗体与窗体代码切换
Ctrl + F12 查找模块
Alt + F11 查找自定义uses模块
Ctrl + F11 打开工程
Ctrl + Alt + F11 打开或激活 Project manager
F12 代码窗口/窗体之间切换
Ctrl + Alt + F12 已打开单元的列表
F11 对象观察器/代码窗口/窗体切换
Alt + 0 窗口列表
Alt + PgUp/PgDn Code/Design/History 切换
Ctrl + Alt + F11 工程管理器
Shift + Alt + F11 打开或激活 Structure
Ctrl + Alt + P Tool Palette
Ctrl + Alt + L Local Variables 窗口
Ctrl + F5; Ctrl + Alt + W Watch List 窗口
Ctrl + Alt + T Threads 窗口
Ctrl + F7 Evaluate/Modify 窗口
Alt + F8 Message 窗口
Alt + 0 Window List 窗口
Ctrl + B Buffer List 窗口
Ctrl + Alt + B Breakpoint 窗口
Ctrl + F3; Ctrl + Alt + S Call Stack 窗口
Ctrl + Alt + V Event Log 窗口
Ctrl + Alt + F FPU 窗口
Ctrl + Alt + C CPU 窗口
Ctrl + Alt + M Modules 窗口
Ctrl + Shift + A Find Unit 窗口
Ctrl + Shift + F11 Project Options 窗口
Ctrl + Q + W 到下一个信息窗口
F10; Ctrl + F10 使菜单获得焦点
Shift + F10; Alt + F10 同鼠标右键
Ctrl + Down 在对象观察器中, 下拉该窗体的组件列表
Alt + Down 在对象观察器中,下拉属性列表
Tab + 输入 搜索对象观察器的属性或事件列表
Ctrl + Enter 在对象观察器中, 切换属性值
Ctrl + Tab 属性/事件切换; 在代码窗口中是已打开的窗口切换
Shift + F11 添加工程窗口
Ctrl + F4 关闭打开的窗口,但不关闭项目
Alt + F4 关闭程序
编译类 F4 运行到光标位置
F5 设置/取消断点
F7 调试,进入子过程
Shift + F7 Trace into next source line
F8 调试,不进子过程(除非有断点)
Shift + F8 Run until return
F9 运行
Ctrl + F9 编译工程
Shift + F9; Alt + P + B 编译 DLL
Ctrl + Shift + F9 Run without debugging
Ctrl + O + O 插入编译选项
阅读全文