Files
2026-05-07 20:25:34 +08:00

332 lines
8.2 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
unit uPucFun;
interface
uses SysUtils,Winapi.Messages,Winapi.Windows,FMX.Objects,System.Classes,FMX.Controls,
System.StrUtils, System.Variants, System.Win.Registry;
// ,'i' o,
const arrStr34: Array[0..33] of String =('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z');
function GetSysTimeByFormate: string;
procedure ShowTouchKeyBoard();
procedure HideTouchKeyBoard();
procedure TxtShowErrorInfo(TxtError:TText;ErrorInfo:string);
function GetBuildInfo: string;
function CheckParameter(sValue:string;var sDevName,sIp,sPort:string):boolean;
procedure DelayedSetFocus(control:TControl);
procedure ShowNumericTouchKeyboard;
function IntToStr34(Value: Integer):String; //批号转34位
function Str34ToInt(Value: String):Integer; //34位转批号
procedure SetTime(Value: String);
procedure GetComPorts(var aComList: TStringList);
function GetComPortList: TStrings;
var
ComName, ComType, FactoryCode:String;
implementation
//引用单元:SysUtils
uses uSafeLog;//目的:实现跨环境兼容不同日期格式,如果不做强制格式处理,不同环境存在发生问题的可能性;
function GetSysTimeByFormate: string;
var
dtFormate: TFormatSettings;
begin
try
dtFormate.ShortDateFormat := 'yyyy/MM/dd';
dtFormate.DateSeparator := '/';
dtFormate.LongTimeFormat := 'hh:mm:ss';
dtFormate.TimeSeparator := ':';
Result := DateTimeToStr(Now(),dtFormate);
except
end;
end;
procedure ShowTouchKeyBoard();
VAR
ShellTrayWnd: THandle;
TrayHandle:HWND;
begin
HideTouchKeyBoard();
Sleep(100);
ShellTrayWnd := FindWindow('Shell_TrayWnd', nil);
if ShellTrayWnd > 0 then
begin
TrayHandle := FindWindowEx(ShellTrayWnd, 0, 'TrayNotifyWnd', nil);
if TrayHandle > 0 then
begin
TrayHandle := FindWindowEx(TrayHandle, 0, 'TIPBand', nil);
end;
end;
PostMessage(TrayHandle, WM_LBUTTONDOWN, MK_LBUTTON, $00010001);
PostMessage(TrayHandle, WM_LBUTTONUP, 0, $00010001);
end;
procedure HideTouchKeyBoard();
VAR
TrayHandle: THandle;
begin
TrayHandle:=FindWindow(pchar('IPTip_Main_Window'),nil);
if TrayHandle<>0 then PostMessage(TrayHandle,WM_SYSCOMMAND,SC_CLOSE,0);
end;
procedure TxtShowErrorInfo(TxtError:TText;ErrorInfo:string);
begin
TxtError.Visible:=ErrorInfo<>'';
TxtError.Text:=ErrorInfo;
end;
function GetBuildInfo: string; //获取版本号
var
verinfosize : DWORD;
verinfo : pointer;
vervaluesize : dword;
vervalue : pvsfixedfileinfo;
dummy : dword;
v1,v2,v3,v4 : word;
begin
verinfosize := getfileversioninfosize(pchar(paramstr(0)),dummy);
if verinfosize = 0 then begin
dummy := getlasterror;
result := '0.0.0.0';
end;
getmem(verinfo,verinfosize);
getfileversioninfo(pchar(paramstr(0)),0,verinfosize,verinfo);
verqueryvalue(verinfo,'\',pointer(vervalue),vervaluesize);
with vervalue^ do begin
v1 := dwfileversionms shr 16;
v2 := dwfileversionms and $ffff;
v3 := dwfileversionls shr 16;
v4 := dwfileversionls and $ffff;
end;
result :='春景智慧工厂 '+#13+#10+'Version '+inttostr(v1) + '.' + inttostr(v2) + '.' + inttostr(v3) + '.' + inttostr(v4);
freemem(verinfo,verinfosize);
end;
function CheckParameter(sValue:string;var sDevName,sIp,sPort:string):boolean;
var
tmpList:Tstrings;
i:integer;
begin
tmpList:=TStringlist.Create;
try
tmpList.DelimitedText:=sValue;
tmpList.Delimiter:=',';
Result:=(tmpList.Count=3) and (strtointdef(tmpList.Strings[2],0)<>0);
if Result then
begin
sDevName:=tmpList.Strings[0];
sIp:=tmpList.Strings[1];
sPort:=tmpList.Strings[2];
end;
finally
tmpList.Free;
end;
end;
procedure DelayedSetFocus(control:TControl);
begin
TThread.CreateAnonymousThread(
procedure
begin
TThread.Synchronize( nil,
procedure
begin
control.SetFocus;
end
);
end
).Start;
end;
function GetNumericTouchKeyboardHandle: HWND;
begin
Result := FindWindow('NumericKeyPadClass', nil);
end;
// 显示数字触摸键盘
procedure ShowNumericTouchKeyboard;
var
KeyboardHandle: HWND;
begin
KeyboardHandle := GetNumericTouchKeyboardHandle;
if KeyboardHandle <> 0 then
SendMessage(KeyboardHandle, WM_SYSCOMMAND, SC_RESTORE, 0);
end;
// 隐藏数字触摸键盘
procedure HideNumericTouchKeyboard;
var
KeyboardHandle: HWND;
begin
KeyboardHandle := GetNumericTouchKeyboardHandle;
if KeyboardHandle <> 0 then
SendMessage(KeyboardHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;
function IntToStr34(Value: Integer):String; //批号转34位
var
i,vii,iii:integer;
V,VV,VVV:Integer;
s:string;
begin
VVV:= Value; //123456 34T2
i:= VVV div 34;
while i*34<VVV do
begin
// if s<>'' then s:=s+',';
s:= ArrStr34[VVV-i*34]+s;
VVV:= VVV div 34;
i:= VVV div 34;
end;
WorkLog.MessageInfo('IntToStr34:'+s);
Str34ToInt(s);
// if i*34<Value then
// begin
// v:= Value-i*34; //2
// end;
end;
function Str34ToInt(Value: String):Integer; //34位转批号
var
i,y: integer;
s:string;
iss:long;
function Str34Index(Value: String):Integer;
var
ii:integer;
begin
Result:= -1;
for ii := Low(ArrStr34) to High(ArrStr34) do
if ArrStr34[ii]=Value then
begin
Result:= ii;
end;
end;
begin
iss:= 0; //34T2 123456
for I := Length(Value) downto 1 do
begin
if Length(Value)-i=0 then
iss:=Str34Index(Value[I]);
if Length(Value)-i=1 then
iss:=iss+Str34Index(Value[I])*34;
if Length(Value)-i=2 then
iss:=iss+Str34Index(Value[I])*34*34;
if Length(Value)-i=3 then
iss:=iss+Str34Index(Value[I])*34*34*34;
s:= s+Value[I];
end;
WorkLog.MessageInfo('Int:'+intToStr(iss)+',s:'+s);
// RightStr();
end;
procedure SetTime(Value: String);
//delphi中设置系统时间方法
var
systemtime:Tsystemtime;
DateTime:TDateTime;
v:Variant;
function StrToDateTimeStr(Value1: String):String;
begin
if Value1='' then exit;
if pos('/',Value1)=0 then
begin
Result:= Copy(Value1,1,4)+'/'+Copy(Value1,5,2)+'/'+Copy(Value1,7,Length(Value1)-6);
end
else
Result:= Value1;
end;
begin
if Value='' then Exit;
Value:= StrToDateTimeStr(Value.Replace('T',' '));
WorkLog.MessageInfo('返回服务器日期时间:'+Value);
try
v:= Value;
// Format('yyyy/MM/dd HH:mm:ss',Value);
DateTime:=VarToDateTime(Value); //获得时间(TDateTime格式)
// WorkLog.MessageInfo('返回服务器日期时间1'+FormatDateTime('YYYY/MM/dd HH:mm:ss',DateTime));
DateTimeToSystemTime(DateTime,systemtime); //把Delphi的TDateTime格式转化为API的TSystemTime格式
SetLocalTime(SystemTime); //设置系统时间
GetLocalTime(SystemTime); //读取系统时间
DateTime:=SystemTimeToDateTime(SystemTime); //把API的TSystemTime格式 转化为 Delphi的TDateTime格式
//Edit2.Text:=DateTimeToStr(DateTime); //显示当前系统的时间
Except
end;
end;
procedure GetComPorts(var aComList: TStringList);
var
reg: TRegistry;
ts: TStrings;
i: integer;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware\devicemap\SerialComm', False);
ts := TStringList.Create;
reg.GetValueNames(ts);
WorkLog.MessageInfo('Com:'+ts.Text);
// self.mmo1.Lines.AddStrings(ts);
for i := 0 to ts.Count - 1 do
begin
aComList.Add(reg.ReadString(ts.Strings[i]));
WorkLog.MessageInfo(aComList.Strings[i]);
end;
ts.Free;
reg.CloseKey;
reg.Free;
end;
{ ----------------------获取端口列表-------------------------------- }
function GetComPortList: TStrings;
var
Reg: TRegistry;
sts1,sts2: TStrings;
i: Integer;
RegPath: string; //注册表中存放串口路径
begin
Result := nil;
Reg := TRegistry.Create;
try
sts1 := TStringList.Create;
try
sts2 := TStringList.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
RegPath := 'hardware\devicemap\SerialComm';
if Reg.OpenKey(RegPath, False) then
begin
Reg.GetValueNames(sts1);
WorkLog.MessageInfo('Com2:'+sts1.Text);
for i := 0 to sts1.Count-1 do
sts2.Add(Reg.ReadString(sts1.Strings[i]));
end;
Result := sts2;
sts2 := nil;
finally
FreeAndNil(sts1);
end;
finally
Reg.CloseKey;
FreeAndNil(Reg);
end;
end;
end.