unit uPucFun; interface uses SysUtils,Winapi.Messages,Winapi.Windows,FMX.Objects,System.Classes,FMX.Controls, System.StrUtils, System.Variants, System.Win.Registry; 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'; Exit; end; getmem(verinfo,verinfosize); try if getfileversioninfo(pchar(paramstr(0)),0,verinfosize,verinfo) then begin if verqueryvalue(verinfo,'\',pointer(vervalue),vervaluesize) then begin with vervalue^ do begin v1 := dwfileversionms shr 16; v2 := dwfileversionms and $ffff; v3 := dwfileversionls shr 16; v4 := dwfileversionls and $ffff; end; // 使用Unicode字符串确保中文字符正确显示 result := '春景智慧工厂' + #13#10 + 'Version ' + IntToStr(v1) + '.' + IntToStr(v2) + '.' + IntToStr(v3) + '.' + IntToStr(v4); end else result := '0.0.0.0'; end else result := '0.0.0.0'; finally freemem(verinfo,verinfosize); end; 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'' then s:=s+','; try s:= ArrStr34[VVV-i*34]+s; except on E: Exception do begin WorkLog.Error('数组访问越界: %s', [E.Message]); s := ''; // 设置默认值 end; end; VVV:= VVV div 34; i:= VVV div 34; end; WorkLog.MessageInfo('IntToStr34:'+s); Str34ToInt(s); // if i*34