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

📄 functions.pas

📁 pasa人力资源考勤管理系统
💻 PAS
字号:
{       EastRiver Smart Function Example               }
{                                                      }
{            Author: shuguang LING                     }
{                                                      }
{               April.14.2004                          }


unit Functions;

interface

uses
  Windows, SysUtils, Forms, Controls, EastRiver, Classes;

  function CheckHandle(hPort: THandle): Boolean;
  function OpenPort(pclk: PClockInfo): Boolean;
  function ClosePort(pclk: PClockInfo): Boolean;
  function Is880(Model: Integer): Boolean;
  function Is780(Model: Integer): Boolean;
  function MsgBox(const Text: string; Flags: Longint=MB_ICONINFORMATION): Integer;
  function MyStrToTime(StrTime: string): TDateTime;
  function TimeToMyStr(Time: TDateTime): string;
  function StrsToPeriods(const Strs: TStrings; var Periods: string): Boolean;
  function PeriodsToStrs(var Strs: TStrings; const PeriodBytes: string): Boolean;
  function SplitString(const S: string;var args: array of string;const Seperators: TSysCharSet=[#9]): Integer;
  function AryStrToString(const args: array of string; Seperator: Char=#9; MaxCol: Integer=0): string;

implementation

uses
  PrjConst;

function CheckHandle(hPort: THandle): Boolean;
begin
  Result:=(hPort<>0) and (hPort<>INVALID_HANDLE_VALUE);
end;

function OpenPort(pclk: PClockInfo): Boolean;
var
  SaveCursor: TCursor;
begin
  SaveCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  try
    if CheckHandle(pclk.hPort) then
    begin
      Result:=True;
    end else //如果不在联机状态则联机
    begin
      pclk.hPort:=ConnectClock(pclk.Port, pclk.BaudRate, pclk.clock_id);
      Result:=CheckHandle(pclk.hPort);
      if Result then
      begin
        GetClockModel(pclk.hPort, pclk.Model, pclk.fireware, pclk.cls);
        pclk.VerOrd:=GetClockVersionOrd(pclk.hPort);
      end;
    end;
    pclk.Connected := Result;
    if not Result then
      MsgBox(format(msg_connect_clock_fail, [pclk.Port, pclk.clock_id]), MB_ICONERROR); 
  finally
    Screen.Cursor := SaveCursor;
  end;
end;

function ClosePort(pclk: PClockInfo): Boolean;
begin
  Result:=False;
  if Assigned(pclk) then
  begin
    if CheckHandle(pclk.hPort) then
    begin
      DisConnectClock(pclk.hPort);
      Result:=True;
    end;
    pclk.hPort:=0;
  end;
end;

function Is880(Model: Integer): Boolean;
begin
  Result:=ClockVerOrd(Model)>1;
end;

function Is780(Model: Integer): Boolean;
begin
  Result:=ClockVerOrd(Model)>2;
end;

function MsgBox(const Text: string; Flags: Longint): Integer;
var
  Caption: string;
begin
  if (Flags and MB_ICONWARNING)<>0 then
    Caption:=msg_warning
  else if (Flags and MB_ICONERROR)<>0 then
    Caption:=msg_error
  else if (Flags and MB_ICONQUESTION)<>0 then
    Caption:=msg_confirm
  else Caption:=msg_infor;
  if Assigned(Screen.ActiveForm) then
    Result:=MessageBox(Screen.ActiveForm.Handle, PChar(Text), PChar(Caption), Flags)
  else
    Result:=Application.MessageBox(PChar(Text), PChar(Caption), Flags);
end;

function MyStrToTime(StrTime: string): TDateTime;
//时间字符串格式:32:45
var
  tmpStr: string;
  tmpVar: Integer;
  tmpTime: TDateTime;
  Day, Hour, Min: WORD;
begin
  Result := 0;
  try
    StrTime := Trim(StrTime);
    if Length(StrTime)=5 then
    begin
      if StrTime[3]=TimeSeparator then
      begin
        tmpStr := Copy(StrTime, 1, 2);
        tmpVar := StrToIntDef(tmpStr, 0);
        Day := tmpVar div 24;
        Hour := tmpVar mod 24;
        tmpStr := Copy(StrTime, 4, 2);
        tmpVar := StrToIntDef(tmpStr, 0);
        Min := tmpVar;
        tmpTime := EncodeTime(Hour, Min, 0, 0);
        ReplaceDate(tmpTime, Day);
        Result := tmpTime;
      end;
    end
    else if Length(StrTime)=4 then //中间无时间分隔符
    begin
      tmpStr := Copy(StrTime, 1, 2);
      tmpVar := StrToIntDef(tmpStr, 0);
      Day := tmpVar div 24;
      Hour := tmpVar mod 24;
      tmpStr := Copy(StrTime, 3, 2);
      tmpVar := StrToIntDef(tmpStr, 0);
      Min := tmpVar;
      tmpTime := EncodeTime(Hour, Min, 0, 0);
      ReplaceDate(tmpTime, Day);
      Result := tmpTime;
    end;
  except
    Result := -1;
  end;
end;

function TimeToMyStr(Time: TDateTime): string;
var
  Day, Hour, Min, Sec, Msec: WORD;
  tmpStr: string;
begin
  if Time>=100/24 then
    Exit;
  if Time<0 then
    Exit;
  try
    Day := WORD(Trunc(Time));
    DecodeTime(Time, Hour, Min, Sec, MSec);
    Hour := Day*24+Hour;
    tmpStr := format('%.2u', [Hour]);
    Result := tmpStr+TimeSeparator;
    tmpStr := format('%.2u', [Min]);
    Result := Result+tmpStr;
  except
    Result := '';
  end;
end;

function StrsToPeriods(const Strs: TStrings; var Periods: string): Boolean;
var
  i, y: Integer;
  Buf: array[0..5] of Byte;
  TimeBegin, TimeEnd: TDateTime;
begin
  Result := False;
  if Assigned(Strs) then
  begin
    SetLength(Periods, 12);
    FillChar(Buf, Length(Buf), 0);
    for i := 0 to Strs.Count-1 do
    begin
      TimeBegin := MyStrToTime(Copy(Strs[i], 1, 5));
      TimeEnd := MyStrToTime(Copy(Strs[i], 6, 5));
      if (TimeEnd>0)and(TimeEnd>TimeBegin) then
        for y := Round(TimeBegin*48)to Round(TimeEnd*48)-1 do
        begin
          Buf[y div 8] := ((Buf[y div 8])or(1 shl(y mod 8)));
        end;
    end;
    for i := 0 to 5 do
    begin
      StrMove(@Periods[i*2+1], PChar(IntToHex(Buf[i], 2)), 2);
    end;
    Result := True;
  end;
end;

function PeriodsToStrs(var Strs: TStrings; const PeriodBytes: string): Boolean;
var
  i, head, tail: Integer;
  TimeBegin, TimeEnd: TDateTime;
  Buf: array[0..6] of Byte;
begin
  Result := False;
  tail := -1;
  if Assigned(Strs) then
  begin
    Strs.Clear;
    HexToBin(PChar(PeriodBytes), @Buf, Length(PeriodBytes));
    Buf[6] := 0;
    for i := 0 to 48 do
    begin
      if ((Buf[i div 8])and(1 shl(i mod 8)))=0 then
      begin
        head := tail+1;
        tail := i;
        if (tail>head) then
        begin
          TimeBegin := head/48;
          TimeEnd := (tail)/48;
          if TimeEnd>=TimeBegin then
          begin
            Strs.Add(TimeToMyStr(TimeBegin)+TimeToMyStr(TimeEnd));
          end;
        end;
      end;
    end;
    Result := True;
  end;
end;

function SplitString(const S: string;var args: array of string;const Seperators: TSysCharSet=[#9]): Integer;
var
  i, ct, head, tail: Integer;
begin
  ct := 0;
  tail := 0;
  Result:=0;
  FillChar(Args, SizeOf(Args), 0);
  if Length(args)=0 then Exit;
  for i := 1 to Length(S) do
  begin
    if S[i] in Seperators then
    begin
      head := tail;
      tail := i;
      Args[Low(Args)+ct] := Copy(S, head+1, tail-head-1);
      inc(ct);
    end
    else if (i=Length(S)) then
    begin
      Args[Low(Args)+ct]:=Copy(S, tail+1, i-tail);
      Inc(ct);
      Break;
    end;
    if ct>High(Args) then Break;
  end;
  Result:=ct;
end;

function AryStrToString(const args: array of string; Seperator: Char; MaxCol: Integer): string;
var
  i: Integer;
begin
  if MaxCol=0 then MaxCol:=High(args) else
    if MaxCol>High(args) then MaxCol:=High(args);
  Result:=args[Low(args)];
  for i:=Low(args)+1 to MaxCol do
    Result:=Result+Seperator+args[i];
end;



end.

⌨️ 快捷键说明

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