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

📄 timeclock.pas

📁 上传个考勤系统,希望别人也能用.该代码只能算初级的东东,软件代码复用性不高,重复代码比较多.唯一感觉有点取鉴的可能就是端口和dll的连接,还有线程的使用,本想改一改,但是手头没有考勤机了,对应考勤机是
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  end;
end;


procedure TfrmMain.sbDelClockClick(Sender: TObject);
var
  i: Integer;
begin
  if (lvClocks.SelCount>0)  then
  begin
   if (MsgBox(Screen.ActiveForm.Handle, SECNEYNOGAEuOGEe, SAE1, MB_YESNO or MB_ICONQUESTION)=IDYES) then
    for i := lvClocks.Items.Count-1 downto 0 do
      if lvClocks.Items[i].Selected then
      begin
        lvClocks.Items.Delete(i);
      end;
        msg.Caption := SDROPDECIVE;
        Windows.Beep(2500,100)
    end
    else
       msg.Caption :=SSELECTDECIVE;
       Windows.Beep(2500,100);

end;



procedure TfrmMain.lvClocksDeletion(Sender: TObject; Item: TListItem);
var
  idx: Integer;
begin
  lvClocks.Items.BeginUpdate;
  try
    idx := clbDevs.Items.IndexOfObject(Item.Data);
   if pclk=Item.Data then
      ClosePort(pclk);
    if Idx<>-1 then
      begin
      clbDevs.Items.Delete(idx);
      cbDecive.Items.Delete(idx);
      end;
    Idx := FClocks.IndexOf(Item.Data);
    Item.Data:=nil;
    if Idx<>-1 then
    begin
      if Assigned(pclk)and(pclk=FClocks[idx]) then
      begin
        ClosePort(pclk);
        pclk := nil;
      end;
      if Assigned(FClocks[idx]) then
        Dispose(FClocks[idx]);
      FClocks[idx] := nil;
      FClocks.Delete(Idx);
    end;
  finally
    lvClocks.Items.EndUpdate;
  end;
end;


procedure TfrmMain.lvClocksSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  if Selected and Assigned(Item)and(Assigned(Item.Data)) then
    with PClockInfo(Item.Data)^ do
    begin
      edClockID.Text := IntToHex(clock_id, 2);
      cbPort.ItemIndex := Port-1;
      //cbRate.Text := format('%d', [BaudRate]);
      cbCmdVerify.Checked:=CmdVerify;
      if clock_type=0 then
      begin
        edClockType.Text := SOEG;
        edFireware.Text := '';
      end else
      begin
        edClockType.Text := format('%d', [clock_type]);
        edFireware.Text:=format('%1.2n', [Fireware]);
      end;
      edPlace.Text := format('%s',[clock_place]);
      cbICID.Checked := cls>0;
//      edClockTypeChange(Sender);
    end;
end;
procedure TfrmMain.btnSearchClick(Sender: TObject);
var
  Strs: TStringList;

  function SearchClock(Port, BaudRate, start_id, end_id, Delay: Integer): Integer;
  var
    i: Integer;
    hPort: THandle;
    S: string;
  begin
    Result := 0;
    hPort := OpenCommPort(Port, BaudRate);
    if hPort=0 then Exit;
    SetCmdVerify(dlgSearchPort.cbCmdVerify.Checked);
    if not Assigned(dlgHints) then
      dlgHints := TdlgHints.Create(Self);
    try
      dlgHints.Show;
      dlgHints.Update;
      dlgHints.msg.Caption := '';
      for i := start_id to end_id do
      begin
        S := IntToHex(i, 2);
        dlgHints.msg.Caption := format(SOyOUAOCOMDS, [Port, S]);
        dlgHints.msg.Update;
        if TestCallClock(hPort, i, Delay) then
        begin
          Strs.Add(S+#9+IntToStr(Port));
          Inc(Result);
        end;
      end;
    finally
      EastRiver.DisConnectClock(hPort);
      dlgHints.Close;
    end;
  end;
var
  i, nInt, Port, BaudRate, start_id, end_id, Delay, flag: Integer;
  AllPort: Boolean;
  Item: TListItem;
  S: string;
  pclk2: PClockInfo;
  SaveCursor: TCursor;
begin
  Strs := TStringList.Create;
  SaveCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  try
    if dlgSearchPort.Execute(Port, BaudRate, start_id, end_id, Delay, AllPort) then
    begin
      if Assigned(pclk) then ClosePort(pclk);
      nInt := 0;
      if not AllPort then
        nInt := SearchClock(Port, BaudRate, start_id, end_id, Delay)
      else
        for i := 0 to cbPort.Items.Count-1 do
        begin
          Port := StrToIntDef(Copy(cbPort.Items[i], 4, Length(cbPort.Items[i])-3), 1);
          nInt := nInt+SearchClock(Port, BaudRate, start_id, end_id, delay);
        end;
      if (nInt>0) then
      begin
        if (Sender=nil)or(MsgBox(Screen.ActiveForm.Handle, PChar(format(SOODOEeECNOEeEeAGI, [nInt])), SIaE, MB_YESNO or MB_ICONQUESTION)=IDYES) then
        begin
         flag := 1;
         FClocks.Clear;
         lvClocks.Items.Clear;
         clbDevs.Clear;
        end;
        //if flag = 1  then
        begin
          for i := 0 to Strs.Count-1 do
          begin
            nInt := pos(#9, Strs[i]);
            S := Copy(Strs[i], 1, nInt-1);
            Port := StrToIntDef(Copy(Strs[i], nInt+1, Length(Strs[i])-nInt), 1);
            Item := lvClocks.FindCaption(0, S, False, True, False);
            if (not Assigned(Item))or(Item.SubItems[1]<>IntToStr(Port)) then
            begin
              New(pclk2);
              FClocks.Add(pclk2);
              FillChar(pclk2^, SizeOf(TClockInfo), 0);
              pclk2.CmdVerify := dlgSearchPort.cbCmdVerify.Checked;
              pclk2.hPort := 0;
              pclk2.clock_id := StrToInt('$'+S);
//              pclk2.clock_name := S;
              pclk2.Port := Port;
              pclk2.BaudRate := BaudRate;
              with lvClocks.Items.Add do
              begin
                Data := pclk2;
                Caption := S;
                SubItems.Add('');
                SubItems.Add(IntToStr(pclk2.Port));
                SubItems.Add(IntToStr(pclk2.BaudRate));
                SubItems.Add(SOEG);
                SubItems.Add('');
                SubItems.Add('');
                SubItems.Add('');
              end;

              clbDevs.Items.AddObject(format(SSCOMD, [pclk2.Port, pclk2.clock_id,pclk2.clock_place]), TObject(pclk2));
              cbDecive.Items.AddObject(format(SSCOMD, [pclk2.port, pclk2.clock_id,pclk2.clock_place]),TObject(pclk2));
            end
          end;
          if (clbDevs.ItemIndex=-1)and(clbDevs.Items.Count>0) then
          begin
            clbDevs.Checked[0] := True;
            clbDevs.ItemIndex := 0;
          end;
        end;
      end
      else
      begin
        MsgBox(Screen.ActiveForm.Handle, SAOGOOEe, SIaE, MB_OK or MB_ICONINFORMATION);
      end;
    end;
  finally
    Screen.Cursor := SaveCursor;
    Strs.Free;
  end;
end;


procedure TfrmMain.edInspectorDblClick(Sender: TObject);
begin
 ClosePort(pclk);
end;

procedure TfrmMain.ClosePort(pclk: PClockInfo);
begin
  if Assigned(pclk) then
  begin
    if (pclk.hPort<>0)and(pclk.hPort<>INVALID_HANDLE_VALUE) then
      EastRiver.DisConnectClock(pclk.hPort);
    pclk.hPort := 0;
    pclk.Connected:=False;
    edInspector.Caption := SINU;
  end;
end;

function TfrmMain.OpenPort(pclk: PClockInfo): Boolean;
var
  i: Integer;
  R: Boolean;
  SaveCursor: TCursor;
begin
  Result:=False;
  SaveCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  try
    msg.Caption := Format(SOyOUAOSS, [pclk.Port, pclk.clock_id]);
    msg.Update;
    if not CheckHandle(pclk.hPort) then
    begin
      pclk.Connected := False;
      pclk.hPort := OpenCommPort(pclk.Port, pclk.BaudRate);
      if CheckHandle(pclk.hPort) then
      begin
        if pclk.clock_type<>0 then
          SetClockModel(pclk.hPort, pclk.Model, pclk.Fireware, pclk.cls)
        else
        begin
          SetCmdVerify(cbCmdVerifyFirst.Checked);
        end;
        if not CallClock(pclk.hPort, pclk.clock_id) then
        begin
          CloseHandle(pclk.hPort);
          pclk.hPort:=0;
          Result:=False;
        end else
        begin
          Result:=True;
        end;
      end;
      if Result and CheckHandle(pclk.hPort) then
      begin
        SetCardStyle(cbCardStyle.ItemIndex);
        edInspector.Caption := SAU;
        msg.Caption := SAOE;
        if pclk.clock_type<>0 then
        begin
          SetClockModel(pclk.hPort, pclk.Model, pclk.Fireware, pclk.cls);//自动识别
          pclk.VerOrd:=GetClockVersionOrd(pclk.hPort);
//          SetCmdVerify(pclk.CmdVerify);
        end else
        begin
          GetClockModel(pclk.hPort, pclk.Model, pclk.Fireware, pclk.cls);
          pclk.VerOrd:=GetClockVersionOrd(pclk.hPort);
        end;
      end
      else if pclk.hPort=INVALID_HANDLE_VALUE then//端口无效或正在使用
      begin
        Result:=False;
        pclk.hPort := 0;
        edInspector.Caption := SINU;
        msg.Caption := format(SISSOEUCOMD, [pclk.Port]);
      end
      else
      begin
        edInspector.Caption := SINU;
        msg.Caption := format(SISSAOEeSS, [pclk.Port, pclk.clock_id]);
      end;
    end
    else{ if CheckConnectClock(hPort, pclk.clock_id) then}
    begin
      msg.Caption := SAOOK;
      edInspector.Caption := SAU;
      Result := True;
    end{
    else
    begin
      try
        CloseHandle(hPort);
      except
      end;
      hPort := 0;
      pclk.hPort := 0;
      Result := 0;
      edInspector.Caption := SINU;
    end};
    pclk.Connected := CheckHandle(pclk.hPort);
    i := clbDevs.Items.IndexOfObject(TObject(pclk));
    if i<>-1 then
    begin
      if Result then
      begin
        if pclk.Model=0 then
          clbDevs.Items[i] := format(SSCOMDISSEGUGI, [pclk.Port, pclk.clock_id])
        else
          clbDevs.Items[i] := format('COM%d-%.2x(%d%s %1.2n)', [pclk.Port, pclk.clock_id, pclk.Model, arICID[pclk.cls], pclk.Fireware]);
      end
      else
        clbDevs.Items[i] := format(SSCOMDISSIN, [pclk.Port, pclk.clock_id])
    end;
    if Result then
    begin
    {
      if (pclk.model=680) then
      begin
        btnMoneySum.Caption := SIuNUGIU;
        btnMoneySum.Tag := 0;
      end else
      begin
        btnMoneySum.Caption := SIGAEUAEB;
        btnMoneySum.Tag := 1;
      end;
      }
      btnRead.Enabled:=GetClockSupports(pclk.hPort, fiStoreRecord);
      btnClearData.Enabled:=btnRead.Enabled;
      btnSetTime.Enabled:=GetClockSupports(pclk.hPort, fiClockTime);
  //    btnGetTime.Enabled:=btnSetTime.Enabled;
      if not btnRead.Enabled then
      begin
        //btnSetAdmin.Enabled:=GetClockSupports(pclk.hPort, fiAdminCard);
        btnSetMark.Enabled:=GetClockSupports(pclk.hPort, fiHaveMark);
        //btnRealCollect.Enabled:=GetClockSupports(pclk.hPort, fiRealTime);
        btnSetClockId.Enabled:=GetClockSupports(pclk.hPort, fiChangeClockId);
      end else
      begin
        //btnSetAdmin.Enabled:=True;
        btnSetMark.Enabled:=True;
        btnSetClockId.Enabled:=True;
        //btnRealCollect.Enabled:=True;
      end;
      //btnSetPwd.Enabled:=GetClockSupports(pclk.hPort, fiICReader);
      R:=GetClockSupports(pclk.hPort, fiConsumption);
      //tsConsumption.TabVisible:=R;
      //tsPeriods.TabVisible:=pclk.VerOrd>2;
      //tsPriceList.TabVisible:=GetClockSupports(pclk.hPort, fiPriceList);
    end;
  finally
    Screen.Cursor := SaveCursor;
    msg.Update;
  end;
end;

procedure TfrmMain.ChooseDev;
begin
  PageControl1.ActivePage := tsBaseOP;
  MsgBox(Screen.ActiveForm.Handle, PChar(SCeNOnUAE), PChar(SIaE), MB_OK);
  Abort;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  Screen.OnActiveFormChange:=nil;

  ClosePort(pclk);
  pclk := nil;
  //ClearIDList(DeviceList);
  ClearIDList(FClocks);
  //DeviceList.Free;
  lvClocks.Free;
  fIni.Free;
  FreeIcon;
  NormalIcon.Free;
end;

procedure TfrmMain.btnGetTimeClick(Sender: TObject);
var
  curTime: Double;
  TimeString:Array[0..16] of char;
begin
  if clbDevs.ItemIndex=-1 then
    ChooseDev;
  with clbDevs do
  begin
    pclk := PClockInfo(Items.Objects[ItemIndex]);
    if OpenPort(pclk) then
    begin
    if ReadClockTime(pclk.hPort, CurTime) then
      begin
        msg.Caption := format(SSSEAIS, [pclk.Port, pclk.clock_id, DateTimeToStr(CurTime)]);
      end
      else
      begin
        msg.Caption := SERROR;
      end;
    end;
    ClosePort(pclk);
    Windows.Beep(2500, 100);
  end;
end;

⌨️ 快捷键说明

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