今天被这个函数搞晕了,按以前开发设备的经验,应该是先找到ID项,再为此ID设置CardNumber;但中控这个有点搞笑是先设置,再用SetUserInfo写入的;
经反复测试,得到的结论是SetStrCardNumber 函数只是起到给用户信息添加了个CardNumber属性并给了值(完全是个人理解)。即使设备上不存在该ID都是可以的。
实际例子如下:
procedure TfrmMain.btnRestoreClick(Sender: TObject);
var i,Max,Value:integer;
tmp: array[0..2047]of byte;
MS: TmemoryStream;
CZKEM:TCZKEM;
Qry:TADOQuery;
_EmpName,_PassWord,_CardNo:WideString;
_EmpNo,_EmpRight:integer;
_Enabled:WordBool;
begin
if not IsConn then
begin
MessageBox(self.Handle,\'出错!数据库没有连接!\',\'提示\',MB_OK or MB_ICONWARNING);
Exit;
end;
if LView1.Items.Count<1 then exit;
if LView1.Selected=nil then
begin
MessageBox(self.Handle,\'请选择一个设备!!\',\'提示\',MB_OK or MB_ICONWARNING);
Exit;
end;
if LView1.Selected.ImageIndex=0 then
begin
MessageBox(self.Handle,PChar(\'连接设备 \'+trim(LView1.Selected.Caption)+
\' 后再重试!\'),\'提示\',MB_OK or MB_ICONWARNING);
Exit;
end;
CZKEM:=GetCZKEM(trim(LView1.Selected.Caption),i);
if CZKEM=nil then exit;
MS:=TmemoryStream.Create;
Qry:=TADOQuery.Create(nil);
Qry.Connection:=ADOConn;
try
Qry.SQL.Add(\'select * from ZK_Userinfo order by fEmpNo\');
Qry.Active:=True;
if not Qry.Eof then
begin
ShowWinWait(Self,\'正在上传用户资料,请等待.....\',true);
Max:=Qry.RecordCount;
Value:=0;
WinWaitProgressBar(Max,Value);
Application.ProcessMessages;
while not Qry.Eof do
begin
Inc(Value);
WinWaitProgressBar(Max,Value);
Application.ProcessMessages;
//设置卡号信息
if length(Qry.fieldbyName(\'fCardNo\').AsString)>0 then begin
_CardNo:=Qry.fieldbyName(\'fCardNo\').AsString;
if CZKEM.SetStrCardNumber(_CardNo) then begin
AddLogInfo(\'设置卡号 \'+Qry.FieldbyName(\'fEmpNo\').AsString+\'-\'+_CardNo+\' 成功!\');
end
else begin
AddLogInfo(\'设置卡号 \'+Qry.FieldbyName(\'fEmpNo\').AsString+\' error!\');
end;
end;
//--------先设置用户-------------
if CZKEM.SetUserInfo(1,Qry.FieldbyName(\'fEmpNo\').AsInteger,
Qry.FieldbyName(\'fEmpName\').AsString,
Qry.FieldbyName(\'fPassWord\').AsString,
Qry.FieldbyName(\'fEmpRight\').AsInteger,
true) then
begin
//设置指纹信息
if not Qry.FieldByName(\'fTEMPLate\').IsNull then begin
MS.Clear;//
TBlobField(Qry.FieldbyName(\'fTEMPLate\')).SaveToStream(MS);
MS.Position:=0;//
ZeroMemory(@tmp[0],MS.Size);
MS.ReadBuffer(tmp[0],MS.Size);
if CZKEM.SetUserTmpEx(1,Qry.FieldbyName(\'fEmpNo\').AsString
,Qry.FieldbyName(\'fFindID\').AsInteger
,Qry.FieldbyName(\'fFlag\').AsInteger
,pbyte(@tmp[0])^) then begin
AddLogInfo(\'设置指纹 \'+Qry.FieldbyName(\'fEmpNo\').AsString+\' 成功!\');
end
else begin
AddLogInfo(\'设置指纹 \'+Qry.FieldbyName(\'fEmpNo\').AsString+\' error!\');
end;
end;
AddLogInfo(\'设置人员 \'+Qry.FieldbyName(\'fEmpNo\').AsString+\' 成功!\');
end
else begin
AddLogInfo(\'设置人员 \'+Qry.FieldbyName(\'fEmpNo\').AsString+\' 失败!\');
end;
Qry.Next;
end;
end;
finally
Ms.Free;
Qry.Free;
HideWinWait;
end;
end;