程序还可以优化一下。
如这几句:
  with adoquery1 do begin
    close;
    sql.Clear;
    sql.Add('select empname,photo from employee where empcardno=');
    sql.Add(' '''+ carnumber +''' ');
    Open;
  end
不应该放在OnClick中,最好放在FormCreate事件中,这样Timer每次的OnTimer事件就不会每次都要作一个
    close;
    sql.Clear;
    sql.Add('select empname,photo from employee where empcardno=');
    sql.Add(' '''+ carnumber +''' ');
动作了。
改动后如下:
procedure TForm1.FormCreate(Sender;TObject);
begin
  with adoquery1 do 
  begin
    close;
    sql.Clear;
    sql.Add('select empname,photo from employee where empcardno=':CardNO');
    sql.Prepare;  
  end
end;procedure TForm1.onClick;
var
  carnumber:string; //用来存取得的IC卡卡号
begin
  setlength(carnumber,5);
  carnumber:=pchar(get_carnumber);  // 函数返回新纪录的卡号  if (carnumber='')or(carnumber=Vtmp_cn) then exit;   //如果卡号没有取得
                                                     //或者与上次取得一样
                                                      //则退出,不进行数据查询  ADOQuery1.Close;
  ADOQuery1.Params[0].AsString:=carnumber;
  ADOQuery1.Open;
  end;      //根据卡号查询卡号对应的相片  show_jpeg;   //调用show_jpeg过程 显示卡号所对应的相片  vtmp_cn:=carnumber;  //把最新的卡号存到虚拟号中去,以便下次进行对比
end;
//以上随手写的代码,可能有错。只给你作一个参考吧