中控 X638考勤机编程 SetStrCardNumber 用法

         今天被这个函数搞晕了,按以前开发设备的经验,应该是先找到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;



 


posted @ 2013-04-27 19:22  javawebsoa  Views(660)  Comments(0Edit  收藏  举报