📄 functions.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 + -