⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 card_inicard.pas

📁 亚惠快餐管理信息系统 包括亚惠快餐管理的各项功能
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  returnvalue: smallint;
  pass: PChar;
begin
  Result := False;
  pass := Pchar(Trim(PassWord1));
  //校验密码
  returnvalue := ReadFromDll('checkpass', Comhm, pass);
  if returnvalue <> 1 then
    Exit;
  CkJe1 := FloatToStr(CkJe * 100);
  //写卡(密码,端口号,卡号,有效期,卡片类型,用户密码,折扣率,卡内余额)
  returnvalue := WriteToCard(Pchar(pass), Comhm, Pchar(IcKh), '00000000', '04',
    '0000', '15', Trim(CkJe1));
  if returnvalue = 0 then
  begin
    ShowMessage('写卡错误!');
    Exit;
  end;
  if not DeleteFromDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
    Exit;
  if not DeleteFromSubDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
    Exit;
  if not InsertToDb(rq, IcKh, CkJe, TkJe, Yj, KhName, ValDayNum, CardStatus,
    CardLx, CzyName, MachineNo, CardValue, Ye) then
    Exit;
  if not InsertToSubDb(rq, IcKh, Yj, ValDayNum, CardStatus, CardLx, CzyName,
    MachineNo, CardValue) then
    Exit;
  Result := True;
end;

{判断Edit是否有为空的字段}

function TFrmCard_IniCard.IfEditNull: Boolean;
var
  i: integer;
  Temp: TComponent;
begin
  Result := True;
  for i := 0 to ComponentCount - 1 do
  begin
    Temp := Components[i];
    if (Temp is TDBEdit) then
      if TDBEdit(Temp).Text = '' then
      begin
        ShowMessage(TDBEdit(Temp).Hint + '不能为空');
        TDBEdit(Temp).SetFocus;
        Exit;
      end;
  end;
  Result := False;
end;

//向卡中写入数据

function TFrmCard_IniCard.WriteToCard(PassWord: Pchar; Comh: smallint; Cardh:
  PChar; ValDay: PChar; CardType: string; UserPass1: string; Discount: string;
  Ye:
  string): smallint;
type
  TDllFunc = function(pass: Pchar; comh: smallint; cardno: PChar; valdate:
    PChar; dyte: string; userpass: string; disc: string; blance: string):
    smallint; stdcall;
var
  alib: THandle;
  proc: TDllFunc;
  FileName: string;
  x: FARPROC;
begin
  FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
  alib := LoadLibrary(PChar(FileName));
  if alib = 0 then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('无法访问ic卡机的函数iccardp.dll!');
    Exit;
  end;
  x := GetProcAddress(alib, PChar('writeCard'));
  if x = nil then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('写卡函数writeCard调用失败!');
    FreeLibrary(alib);
    Exit;
  end;
  Proc := TDllFunc(x);
  if @Proc = nil then
  begin
    Screen.Cursor := crDefault;
    x := nil;
    FreeLibrary(alib);
    ShowMessage('无法访问ic卡机写卡函数!');
    Exit;
  end;
  try
    Result := Proc(PassWord, Comh, Cardh, ValDay, CardType, UserPass1, Discount,
      Ye);
  except
    ShowMessage('写卡函数运行失败!');
    proc := nil;
    FreeLibrary(alib);
  end;
  proc := nil;
  FreeLibrary(alib);
end;

{删除售卡信息SCSJ_TSKXX表中相同的记录}

function TFrmCard_IniCard.DeleteFromDB(rq: TDate; cardno, machineno, cardstatus,
  czyname: string): Boolean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Delete');
    Sql.Add('From SCSJ_TSKXX');
    Sql.Add('Where Convert(char(10),日期,20)=''' + Trim(DateToStr(rq)) + '''');
    Sql.Add('And IC卡号=''' + Trim(cardno) + '''');
    Sql.Add('And 售卡机编码=''' + Trim(machineno) + '''');
    Sql.Add('And 卡片状态=''' + Trim(cardstatus) + '''');
    Sql.Add('And 操作员姓名=''' + Trim(czyname) + '''');
    try
      ExecSql;
    except
      ShowMessage('无法清空' + machineno + '号售卡机' + DateToStr(rq) + '日' +
        cardno + '号卡' + '的数据,系统无法继续工作!');
      Exit;
    end;
  end;
  Result := True;
end;

{删除与售卡信息表相关的SCSJ_TKPXX表中相同的记录}

function TFrmCard_IniCard.DeleteFromSubDB(rq: TDate; cardno, machineno,
  cardstatus, czyname: string): Boolean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Delete');
    Sql.Add('From SCSJ_TKPXX');
    Sql.Add('Where Convert(char(10),创建日期,20)=''' + Trim(DateToStr(rq)) +
      '''');
    Sql.Add('And IC卡号=''' + Trim(cardno) + '''');
    Sql.Add('And 售卡机编码=''' + Trim(machineno) + '''');
    Sql.Add('And 卡片状态=''' + Trim(cardstatus) + '''');
    Sql.Add('And 操作员姓名=''' + Trim(czyname) + '''');
    try
      ExecSql;
    except
      ShowMessage('无法清空' + machineno + '号售卡机' + DateToStr(rq) + '日' +
        cardno + '号卡' + '的数据,系统无法继续工作!');
      Exit;
    end;
  end;
  Result := True;
end;
{向售卡信息表中插入记录}

function TFrmCard_IniCard.InsertToDb(rq: TDate; IcKh: string; CkJe, TkJe, Yj:
  Double; KhName: string; ValDaynum: integer; CardStatus, CardLx, CzyName,
  MachineNo, CardValue: string; Ye: Double): BooLean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Insert Into SCSJ_TSKXX');
    Sql.Add('(IC卡号,日期,存款金额,退款金额,押金,客户姓名,有效天数,卡片状态,卡片类型,操作员姓名,售卡机编码,卡片面值,卡内余额)');
    Sql.Add('values(');
    Sql.Add('''' + IcKh + ''',''' + Trim(DateTimeToStr(rq)) + ''',' +
      floattostr(CkJe) + ',' + floattostr(TkJe) + ',' + floattostr(Yj));
    Sql.Add(',''' + KhName + ''',' + IntToStr(ValDaynum) + ',''' +
      Trim(CardStatus) + '''');
    Sql.Add(',''' + CardLx + ''',''' + CzyName + ''',''' + MachineNo + ''',''' +
      CardValue + ''',' + floatToStr(Ye) + ')');
    try
      ExecSql;
    except
      ShowMessage('向数据库中插入' + DateTimeToStr(rq) + '日' + IcKh +
        '号卡数据失败');
      Exit;
    end;
  end;
  Result := True;
end;
{向与售卡信息表相关的表中插入记录}

function TFrmCard_IniCard.InsertToSubDb(rq: TDate; IcKh: string; Yj: Double;
  ValDaynum: integer; CardStatus, CardLx, CzyName, MachineNo, CardValue:
  string):
  BooLean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Insert Into SCSJ_TKPXX');
    Sql.Add('(IC卡号,创建日期,押金,有效天数,卡片状态,卡片类型,操作员姓名,售卡机编码,卡片面值)');
    Sql.Add('values(');
    Sql.Add('''' + IcKh + ''',''' + Trim(DateTimeToStr(rq)) + ''',' +
      floattostr(Yj));
    Sql.Add(',' + IntToStr(ValDaynum) + ',''' + Trim(CardStatus) + '''');
    Sql.Add(',''' + CardLx + ''',''' + CzyName + ''',''' + MachineNo + ''',''' +
      CardValue + ''')');
    try
      ExecSql;
    except
      ShowMessage('向数据库中插入' + DateTimeToStr(rq) + '日' + IcKh +
        '号卡数据失败');
      Exit;
    end;
  end;
  Result := True;
end;

// 读取卡的各类信息

function TFrmCard_IniCard.ReadFromDll(filelx: string; comh: smallint; passwordz:
  PChar): smallint;
type
  TDllFunc = function(com: integer; password: pchar): smallint; stdcall;
var
  alib: THandle;
  proc: TDllFunc;
  FileName: string;
  x: FARPROC;
begin
  Screen.Cursor := crHourGlass;
  FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
  //ShowMessage('开始调用文件iccardp.dll');
  alib := LoadLibrary(PChar(FileName)); //调用dll文件
  if alib = 0 then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('无法访问ic卡机的函数iccardp.dll!');
    FreeLibrary(alib);
    Exit;
  end;
  //ShowMessage('调用文件iccardp.dll成功!');
  //ShowMessage('开始调用函数'+filelx);
  x := GetProcAddress(alib, PChar(filelx)); //获取指定函数指针
  if x = nil then
  begin
    Screen.Cursor := crDefault;
    ShowMessage(' 函数' + filelx + '调用失败!');
    FreeLibrary(alib);
    Exit;
  end;
  // else ShowMessage('函数调用成功!');
  Proc := TDllFunc(x); //转换函数类型
  if @Proc = nil then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('无法访问ic卡机读取数据函数!');
    x := nil;
    FreeLibrary(alib);
    Exit;
  end;
  //else ShowMessage('函数转换成功!');
  try
    Result := Proc(comh, passwordz);
    //ShowMessage('函数运行成功!');
  except
    ShowMessage('函数运行失败!');
  end;
  proc := nil;
  if not FreeLibrary(alib) then
    ShowMessage('释放文件不成功!');
  // else ShowMessage('释放文件成功!');
  Screen.Cursor := crDefault;
end;

//从文件中读取卡号信息

function TFrmCard_IniCard.ReadKh(var CardNo: string; comh: smallint; pass:
  Pchar): Boolean;
var
  returnvalue: smallint;
  AFileName, s: string;
  ATextFile: Textfile;
begin
  Result := False;
  returnvalue := ReadFromDll('readcardno', comh, pass);
  if returnvalue <> 0 then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('读取卡号错误!');
    Exit;
  end;
  AFileName := Trim('c:\windows\cardno.txt');
  if not FileExists(AFileName) then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('卡号信息文件' + AFileName + '不存在,系统无法继续工作!');
    Exit;
  end;
  AssignFile(ATextFile, AFileName);
  try
    ReSet(ATextFile);
  except
    Screen.Cursor := crDefault;
    ShowMessage('卡号信息文件' + AFileName + '受到破坏,系统无法继续工作!');
    CloseFile(ATextFile);
    Exit;
  end;
  while not Eof(ATextFile) do
    Readln(ATextFile, s);
  CloseFile(ATextFile);
  s := Trim(s);
  if s='FFFFFFFF' then
  begin
    ShowMessage('卡片插反了,请正确插入卡片!');
    Exit;
  end;
  {while Copy(s, 1, 1) = '0' do
    s := Trim(Copy(s, 2, 10000000));}
  CardNo := Trim(s);
  Result := True;
end;

{从系统文件中获得初始值}

procedure TFrmCard_IniCard.GetIniValue;
var
  ti: TInifile;
  MachineNo, CardType, CardValue, CardNo: string;
  Yj: Double;
begin
  PublicUnit.IsErrorFlag := False;
  OldCardFlag := False;
  SetReadOnlyFalse;
  CardSell_DataModule.ADOQuery2.FieldByName('日期').AsDateTime := Date;
  CardSell_DataModule.ADOQuery2.FieldByName('操作员姓名').AsString :=
    Trim(FrmMain.UserName);
  CardSell_DataModule.ADOQuery2.FieldByName('卡片状态').AsString := '未使用';
  ti := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'System.ini');
  MachineNo := ti.ReadString('默认选项', 'MachineNo', '2');
  CardType := ti.ReadString('默认选项', 'CardType', 'A');
  CardValue := ti.ReadString('默认选项', 'CardValue', '10');
  Yj := ti.ReadFloat('默认选项', 'CardYj', 5);
  IniComboBox;
  PassWord1 := ti.ReadString('默认选项', 'Mima', '55555');
  PassWord1 := UnEncryFunc(Trim(PassWord1));
  Comhm := ti.ReadInteger('默认选项', 'Port', 0);
  CardSell_DataModule.ADOQuery2.FieldByName('售卡机编码').AsString :=
    Trim(MachineNo);
  CardSell_DataModule.ADOQuery2.FieldByName('押金').AsFloat := Yj;
  CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString :=
    Trim(CardType);
  CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString :=
    Trim(CardValue);
  CardSell_DataModule.ADOQuery2.FieldByName('存款金额').AsFloat :=
    StrToFloat(CardValue) - Yj;
  if not ReadKh(CardNo, Comhm, Pchar(PassWord1)) then
  begin
    PublicUnit.IsErrorFlag := True;
    DBNavigator1.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert,
      nbEdit, nbCancel];
    DBNavigator1.DataSource.DataSet.Cancel;
    Exit;
  end;
  if CardNo <> '00000000' then {老卡}
  begin
    //GetPreCardXx(CardNo);
    CardSell_DataModule.ADOQuery2.FieldByName('IC卡号').AsString :=

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -