📄 un_utl.pas
字号:
unit un_utl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
StdCtrls, WinTypes, WinProcs, FORMS, Menus, inifiles;
// CPU ID 专用变量==================================
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
//===================================================
// UN_UTL 专用变量==================================
//===================================================
// 日期---------------------------------------------
//英日期转中日期
FUNCTION EDATETOCDATE(EDATE:STRING):STRING;
//检查英文日期格式是否正确
FUNCTION EDATECHECK(EDATE:STRING):BOOLEAN;
//英日期转中日期
FUNCTION EDATE_TO_CDATE(EDATE:STRING):STRING;
//中日期转英日期
FUNCTION CDATE_TO_EDATE(CDATE:STRING):STRING;
//中日期 -> 取年份
FUNCTION CDATE_GET_YEAR(T_DATE:STRING):STRING;
//中日期 -> 取月份
FUNCTION CDATE_GET_MONTH(T_DATE:STRING):STRING;
//中日期 -> 取日期
FUNCTION CDATE_GET_DAY(T_DATE:STRING):STRING;
//英日期 -> 取年份
FUNCTION DATE_GET_YEAR(T_DATE:STRING):STRING;
//英日期 -> 取月份
FUNCTION DATE_GET_MONTH(T_DATE:STRING):STRING;
//英日期 -> 取日期
FUNCTION DATE_GET_DAY(T_DATE:STRING):STRING;
//时间 -> 取时间 24H
FUNCTION TIME_GET_24H(T_TIME:TTIME):STRING;
//时间 -> 检查是否在时间范围内
FUNCTION TIME_CHECK_RANGE(TIME1,TIME2 :STRING; T_RANGE :INTEGER):BOOLEAN;
//检查英文日期格式是否正确
FUNCTION CHECK_EDATE(EDATE:STRING;WARNING:BOOLEAN):BOOLEAN;
//检查中文日期格式是否正确
FUNCTION CHECK_CDATE(CDATE:STRING;WARNING:BOOLEAN):BOOLEAN;
//检查 月份 日期数 格式是否正确
FUNCTION CHECK_DAY(MONTH,DAY:INTEGER;WARNING:BOOLEAN):BOOLEAN;
//检查 时间 格式是否正确
FUNCTION CHECK_TIME(TIME:STRING;WARNING:BOOLEAN):BOOLEAN;
//检查 时间 格式是否正确(可超过 24H )
FUNCTION CHECK_LONGTIME(TIME:STRING;WARNING:BOOLEAN):BOOLEAN;
// 计算 当月 日数
FUNCTION CYEARMONTH_DAYS(CYEARMONTH:STRING):INTEGER;
// 计算 当月 日数
FUNCTION EYEARMONTH_DAYS(EYEARMONTH:STRING):INTEGER;
// 英文 日期 - 日期 减法
FUNCTION EDATE_SUB_EDATE(DAT1, DAT2 : TDATETIME):INTEGER;
// 英文 年份 减法
FUNCTION EYEAR_SUB(CYEAR:STRING;T_SUB:INTEGER):STRING;
// 中文 月份 减法
FUNCTION CYEARMONTH_SUB(CYEARMONTH:STRING;T_SUB:INTEGER):STRING;
// 密码---------------------------------------------
FUNCTION Encrypt(const InSTRING:STRING; StartKey,MultKey,AddKey:INTEGER): STRING;
FUNCTION Decrypt(const InSTRING:STRING; StartKey,MultKey,AddKey:INTEGER): STRING;
//edit2.text := Encrypt(edit1.text,123456,13579,24680);
//edit3.text := Decrypt(edit2.text,123456,13579,24680);
// 文件相关功能 ================================================================
FUNCTION TEST_OPEN_FILE(FILENAME:STRING):BOOLEAN; // 测试文件是否可以打开
FUNCTION FILE_CREATE(FILENAME:STRING):BOOLEAN; // 建立新文件
FUNCTION FILE_REWRITE(FILENAME:STRING):BOOLEAN; // 清除文件
FUNCTION TEXTFILE_RECCNT(FILENAME:STRING):INTEGER; // TEXT读出文件 行数
FUNCTION FILE_APPEND_LOG(FILENAME,TITLE,TXT:STRING):BOOLEAN; // 写入文件
FUNCTION FILE_WRITELN_REC(FILENAME,TITLE,TXT:STRING):STRING; // 写入文件单行
FUNCTION FILE_READLN_REC(FILENAME,TITLE:STRING):STRING; // 读出文件单行
// 文件相关功能 ================================================================
//字符串处理 =======================================================================
//copy 由右至左
FUNCTION Copy_R(S: STRING; Index, Count: INTEGER): STRING;
//产生空白
FUNCTION SPACE(Count: INTEGER): STRING;
{ 字符串复制 }
FUNCTION REPLICATE(VSTR1:STRING;VLEN:SMALLINT):STRING;
{ 字符串填满 }
FUNCTION FILL_STR(FILL_STR, STR, KIND:STRING; TOTAL_LENGTH:INTEGER):STRING;
{ 字符串累加 }
FUNCTION STR_INC(FILL_STR, STR:STRING; T_START, T_END, T_CNT:INTEGER):STRING;
{ 字符串转浮点 }
FUNCTION STRTOFLOATDEF(STR:STRING;FDEFAULT:REAL):REAL;
{ 字符串替换 }
FUNCTION STR_REPLACE(STR, SUBSTR1,SUBSTR2:STRING):STRING;
{ 字符串插入 }
FUNCTION STR_INSERT(STR, S1, S2:STRING; FB:BOOLEAN):STRING;
{ 数据字符串找寻 }
FUNCTION STR_DB_FIELDBYNO(STR, RAIL:STRING;FIELD_NO:INTEGER):STRING;
{ 删除数据字符串 }
FUNCTION TRIM_STR(STR, TRIMSTR:STRING):STRING;
{ 整数 转 字符串 再补零 }
FUNCTION INTTOSTR_REP(TINT,REP:INTEGER):STRING;
{ BOOLEAN TRUE FALSE 转 01 }
FUNCTION BOOLEANTOSTR(TB : BOOLEAN):STRING;
{ 检查是否为整数 }
FUNCTION CHECK_INT(T_STR:STRING):BOOLEAN;
{ 检查是否为浮点数 }
FUNCTION CHECK_FLOAT(T_STR:STRING):BOOLEAN;
{ 检查是否为浮点数 和 整数}
FUNCTION CHECK_FLOATINT(T_STR:STRING):BOOLEAN;
{ 取 浮点数 , 小数点位数 }
FUNCTION FLOAT_LENGTH(T_STR:STRING;T_LENGTH:INTEGER):STRING;
{ 浮点数 转 整数 }
FUNCTION FLOATTOINT(T_FLOAT:REAL):INTEGER;
{ 浮点数 转 整数 PS: 无条件小数第一位进位}
FUNCTION FLOATTOINT_ROUND(T_FLOAT:REAL):INTEGER;
{ 整数 个位数 四舍五入 }
FUNCTION ROUND_1(T_INT:INTEGER):INTEGER;
{ 整数 次方 }
FUNCTION INT_CUBE(T_INT,T_CUBE:INTEGER):INTEGER;
{ 16 进位 转 整数 }
FUNCTION HEXTOINT(THEX:STRING):INTEGER;
//其它{ Delay program execution by n milliseconds }
procedure Delay(n: INTEGER);
//汇率计算
FUNCTION EXCHANGE_CAL(T_EXCHG:STRING;T_LENGTH:INTEGER):STRING;
//打印机 输出入 ================================================================
procedure Out32(PortAddress:smallint;Value:smallint);stdcall;export;
FUNCTION Inp32(PortAddress:smallint):smallint;stdcall;export;
FUNCTION COMPORT_OUT (PortNAME,EXPRESS:STRING):BOOLEAN;
FUNCTION COMPORT_OUTLN(PortNAME,EXPRESS:STRING):BOOLEAN;
//打印机 输出入 ================================================================
//CPU ID 及信息
FUNCTION IsCPUID_Available : BOOLEAN; register;
FUNCTION GetCPUID : TCPUID; assembler; register;
FUNCTION GetCPUVendor : TVendor; assembler; register;
//条形码类
FUNCTION EAN13_ENCODE(T_STR:STRING):STRING;
FUNCTION EAN13_AUTOADD(T_STR:STRING):STRING;
//发票类 =======================================================================
FUNCTION INVOICE_NO_CHECK(T_STR:STRING):BOOLEAN; //检查发票号码
//发票类 =======================================================================
//检查信用卡号
FUNCTION ValidateCreditCardNo(value: STRING; WARNING:BOOLEAN): BOOLEAN;
//对象 储存相关信息值 INI FILE ================================================
FUNCTION INI_SAVE_OBJECT(INIFILENAME, OBJECT_NAME :STRING; T_LEFT, T_TOP :INTEGER; T_TEXT:STRING):BOOLEAN;
FUNCTION INI_SAVE_INT (INIFILENAME, OBJECT_NAME :STRING; T_INTEGER :INTEGER):BOOLEAN;
FUNCTION INI_SAVE_STR (INIFILENAME, OBJECT_NAME :STRING; T_STR :STRING):BOOLEAN;
FUNCTION INI_SAVE_STR2 (INIFILENAME, OBJECT_NAME, OBJECT_KIND :STRING; T_STR :STRING):BOOLEAN;
FUNCTION INI_SAVE_BOOL (INIFILENAME, OBJECT_NAME :STRING; T_BOOL :BOOLEAN):BOOLEAN;
//对象 取回相关信息值 INI FILE ================================================
FUNCTION INI_LOAD_OBJECT(INIFILENAME, OBJECT_NAME, OBJECT_KIND, T_DEFAULT :STRING):STRING;
FUNCTION INI_LOAD_INT (INIFILENAME, OBJECT_NAME :STRING; T_DEFAULT:INTEGER ):INTEGER;
FUNCTION INI_LOAD_STR (INIFILENAME, OBJECT_NAME :STRING; T_DEFAULT:STRING ):STRING;
FUNCTION INI_LOAD_STR2 (INIFILENAME, OBJECT_NAME , OBJECT_KIND:STRING; T_DEFAULT:STRING ):STRING;
FUNCTION INI_LOAD_BOOL (INIFILENAME, OBJECT_NAME :STRING; T_DEFAULT:BOOLEAN ):BOOLEAN;
// =============================================================================
{ Input dialog }
FUNCTION JInputBox(const ACaption, APrompt, ADefault: STRING): STRING;
FUNCTION JInputQuery(const ACaption, APrompt: STRING; VAR Value: STRING): BOOLEAN;
FUNCTION JMSGFORM(const ACaption, ADefault: STRING;T_FONTSIZE:INTEGER): BOOLEAN;
FUNCTION JSHOWMESSAGE(const ACaption, APROMPT: STRING): BOOLEAN;
//FUNCTION JInputIntQuery(const ACaption, APrompt: STRING; Value: INTEGER):INTEGER;
implementation
// 日期---------------------------------------------
//英日期转中日期
FUNCTION EDATETOCDATE(EDATE:STRING):STRING;
VAR T_DATE :STRING;
T_YEAR, T_MONTH, T_DAY :STRING;
BEGIN
IF EDATECHECK(EDATE) = FALSE THEN EXIT;
T_DATE := EDATE;
T_YEAR := COPY(T_DATE,1,POS('/',T_DATE)-1 );
T_DATE := TRIM( COPY(T_DATE,POS('/',T_DATE)+1 ,10) );
T_MONTH := COPY(T_DATE,1,POS('/',T_DATE)-1 );
T_DATE := TRIM( COPY(T_DATE,POS('/',T_DATE)+1 ,10) );
T_DAY := T_DATE;
T_YEAR := INTTOSTR( STRTOINT(T_YEAR)-1911 );
T_MONTH := REPLICATE('0',2 - LENGTH(T_MONTH)) + T_MONTH; //加'0'
T_DAY := REPLICATE('0',2 - LENGTH(T_DAY )) + T_DAY ; //加'0'
Result := T_YEAR+T_MONTH+T_DAY;
END;
//检查英文日期格式是否正确
FUNCTION EDATECHECK(EDATE:STRING):BOOLEAN;
VAR T_DATE :STRING;
T_YEAR, T_MONTH, T_DAY :STRING;
BEGIN
T_DATE := EDATE;
T_YEAR := COPY(T_DATE,1,POS('/',T_DATE)-1 );
T_DATE := TRIM( COPY(T_DATE,POS('/',T_DATE)+1 ,10) );
T_MONTH := COPY(T_DATE,1,POS('/',T_DATE)-1 );
T_DATE := TRIM( COPY(T_DATE,POS('/',T_DATE)+1 ,10) );
T_DAY := T_DATE;
IF (T_YEAR = '') OR
(T_MONTH = '') OR
(T_DAY = '') OR
( STRTOINTDEF(T_YEAR ,-1)<= 0 ) OR
( STRTOINTDEF(T_MONTH ,-1)<= 0 ) OR
( STRTOINTDEF(T_DAY ,-1)<= 0 ) OR
( STRTOINTDEF(T_YEAR ,-1)> 2100) OR
( STRTOINTDEF(T_MONTH ,-1)> 12 ) OR
( STRTOINTDEF(T_DAY ,-1)> 31 ) THEN
BEGIN
SHOWMESSAGE('日期格式不正确');
Result := FALSE;
END ELSE
BEGIN
Result := TRUE;
END;
END;
FUNCTION EDATE_TO_CDATE(EDATE:STRING):STRING;
VAR T_YEAR,T_MONTH,T_DAY, T_STR :STRING;
BASE_YEAR :INTEGER;
BEGIN
IF CHECK_EDATE(EDATE,FALSE) = FALSE THEN EXIT;
T_YEAR := COPY(EDATE,1,4);
T_STR := TRIM(COPY(EDATE,POS('/',EDATE)+1,10));
T_MONTH := COPY(T_STR,1,POS('/',T_STR)-1);
T_STR := TRIM(COPY(T_STR,POS('/',T_STR)+1,10));
T_DAY := COPY(T_STR,POS('/',T_STR)+1,2);
IF LENGTH(T_MONTH) < 2 THEN T_MONTH := '0' + T_MONTH;
IF LENGTH(T_DAY) < 2 THEN T_DAY := '0' + T_DAY;
BASE_YEAR := 1911;
//RESULT := INTTOSTR(STRTOINT(T_YEAR)-BASE_YEAR) + T_MONTH + T_DAY ;
RESULT := T_YEAR + '-' + T_MONTH + '-' + T_DAY ;
END;
FUNCTION CDATE_TO_EDATE(CDATE:STRING):STRING;
VAR T_YEAR,T_MONTH,T_DAY :STRING;
BASE_YEAR :INTEGER;
BEGIN
IF CHECK_CDATE(CDATE,TRUE) = FALSE THEN EXIT;
//ds
IF LENGTH(CDATE) = 10 THEN
BEGIN
T_YEAR := COPY(CDATE,1,4);
T_MONTH := COPY(CDATE,6,2);
T_DAY := COPY(CDATE,9,2);
END;
//ds
{ds
IF LENGTH(CDATE) = 7 THEN
BEGIN
T_YEAR := COPY(CDATE,1,3);
T_MONTH := COPY(CDATE,4,2);
T_DAY := COPY(CDATE,6,2);
END;
IF LENGTH(CDATE) = 6 THEN
BEGIN
T_YEAR := COPY(CDATE,1,2);
T_MONTH := COPY(CDATE,3,2);
T_DAY := COPY(CDATE,5,2);
END;}
BASE_YEAR := 1911;
//RESULT := INTTOSTR(STRTOINT(T_YEAR)+BASE_YEAR)+'/'+T_MONTH+'/'+T_DAY ;
RESULT := T_YEAR+'/'+T_MONTH+'/'+T_DAY ;
END;
//中日期 -> 取年份
FUNCTION CDATE_GET_YEAR(T_DATE:STRING):STRING;
BEGIN
RESULT := '';
IF LENGTH(T_DATE) = 10 THEN RESULT := TRIM(COPY(T_DATE,1,4));
//IF LENGTH(T_DATE) = 6 THEN RESULT := TRIM(COPY(T_DATE,1,2));
//IF LENGTH(T_DATE) = 7 THEN RESULT := TRIM(COPY(T_DATE,1,3));
END;
//中日期 -> 取月份
FUNCTION CDATE_GET_MONTH(T_DATE:STRING):STRING;
BEGIN
RESULT := '';
IF LENGTH(T_DATE) = 10 THEN RESULT := TRIM(COPY(T_DATE,6,2));
//IF LENGTH(T_DATE) = 6 THEN RESULT := TRIM(COPY(T_DATE,3,2));
//IF LENGTH(T_DATE) = 7 THEN RESULT := TRIM(COPY(T_DATE,4,2));
END;
//中日期 -> 取日期
FUNCTION CDATE_GET_DAY(T_DATE:STRING):STRING;
BEGIN
RESULT := '';
IF LENGTH(T_DATE) = 10 THEN RESULT := TRIM(COPY(T_DATE,9,3));
//IF LENGTH(T_DATE) = 6 THEN RESULT := TRIM(COPY(T_DATE,5,2));
//IF LENGTH(T_DATE) = 7 THEN RESULT := TRIM(COPY(T_DATE,6,3));
END;
//英日期 -> 取年份
FUNCTION DATE_GET_YEAR(T_DATE:STRING):STRING;
BEGIN
RESULT := TRIM(COPY(T_DATE,1,POS('/',T_DATE)-1));
END;
//英日期 -> 取月份
FUNCTION DATE_GET_MONTH(T_DATE:STRING):STRING;
VAR T1:STRING;
BEGIN
T1 := TRIM(COPY(T_DATE,POS('/',T_DATE)+1,LENGTH(T_DATE)));
RESULT := TRIM(COPY(T1,1,POS('/',T1)-1));
END;
//英日期 -> 取日期
FUNCTION DATE_GET_DAY(T_DATE:STRING):STRING;
VAR T1:STRING;
BEGIN
T1 := T_DATE;
T1 := TRIM(COPY(T1,POS('/',T1)+1,LENGTH(T1)));
T1 := TRIM(COPY(T1,POS('/',T1)+1,LENGTH(T1)));
RESULT := REPLICATE('0',2-LENGTH(T1)) + TRIM(COPY(T1,1,LENGTH(T1)));
END;
//时间 -> 取时间 24H
FUNCTION TIME_GET_24H(T_TIME:TTIME):STRING;
VAR RET_TIME, T_APM, T_HOUR, T_MIN :STRING;
X_HOUR : INTEGER;
BEGIN
RET_TIME := COPY(TIMETOSTR(T_TIME),4,5);
T_APM := COPY(TIMETOSTR(T_TIME),1,2);
T_HOUR := COPY(TIMETOSTR(T_TIME),4,2);
T_MIN := COPY(TIMETOSTR(T_TIME),7,2);
X_HOUR := STRTOINTDEF(T_HOUR,0);
IF T_APM = 'PM' THEN
BEGIN
IF X_HOUR <12 THEN T_HOUR := INTTOSTR(STRTOINTDEF(T_HOUR,0)+12);
RET_TIME := REPLICATE('0',2-LENGTH(T_HOUR)) + T_HOUR+':'+ T_MIN; //加'0'
END;
IF T_APM = 'AM' THEN
BEGIN
IF X_HOUR =12 THEN T_HOUR := INTTOSTR(STRTOINTDEF(T_HOUR,0)+12);
RET_TIME := REPLICATE('0',2-LENGTH(T_HOUR)) + T_HOUR+':'+ T_MIN; //加'0'
END;
RESULT := RET_TIME;
END;
//时间 -> 检查是否在时间范围内
FUNCTION TIME_CHECK_RANGE(TIME1,TIME2 :STRING; T_RANGE :INTEGER):BOOLEAN;
VAR T11, T12, T21, T22, T1, T2: INTEGER;
BEGIN
RESULT := FALSE;
IF (CHECK_TIME(TIME1,FALSE) = FALSE) OR (CHECK_TIME(TIME2,FALSE) = FALSE) THEN EXIT;
T11 := STRTOINTDEF( COPY(TIME1,1,2) ,0);
T12 := STRTOINTDEF( COPY(TIME1,4,2) ,0);
T21 := STRTOINTDEF( COPY(TIME2,1,2) ,0);
T22 := STRTOINTDEF( COPY(TIME2,4,2) ,0);
T1 := T11 * 60 + T12;
T2 := T21 * 60 + T22;
//SHOWMESSAGE(INTTOSTR(T1)+'='+INTTOSTR(T2));
IF T1 > T2 THEN
IF (T1 - T2) <= T_RANGE THEN RESULT := TRUE;
IF T2 > T1 THEN
IF (T2 - T1) <= T_RANGE THEN RESULT := TRUE;
IF T1 = T2 THEN RESULT := TRUE;
{ IF T12 = T22 THEN RESULT := TRUE;
IF T12 > T22 THEN
IF (T12 - T22) <= T_RANGE THEN RESULT := TRUE;
IF T22 > T12 THEN
IF (T22 - T12) <= T_RANGE THEN RESULT := TRUE;
}
END;
FUNCTION CHECK_EDATE(EDATE:STRING;WARNING:BOOLEAN):BOOLEAN;
VAR T_YEAR,T_MONTH,T_DAY, T_STR :STRING;
BEGIN
T_YEAR := COPY(EDATE,1,4);
T_STR := TRIM(COPY(EDATE,POS('/',EDATE)+1,10));
T_MONTH := COPY(T_STR,1,POS('/',T_STR)-1);
T_STR := TRIM(COPY(T_STR,POS('/',T_STR)+1,10));
T_DAY := COPY(T_STR,POS('/',T_STR)+1,2);
IF (STRTOINTDEF(T_YEAR ,-1) < 0 ) OR
(STRTOINTDEF(T_MONTH,-1) < 0 ) OR
(STRTOINTDEF(T_DAY ,-1) < 0 ) OR
(STRTOINTDEF(T_YEAR ,-1) > 9999 ) OR
(STRTOINTDEF(T_MONTH,-1) > 12 ) OR
(STRTOINTDEF(T_DAY ,-1) > 31 ) THEN
BEGIN
IF WARNING = TRUE THEN showmessage('日期格式不正确!');
RESULT := FALSE;
END ELSE
RESULT := TRUE;
END;
FUNCTION CHECK_CDATE(CDATE:STRING;WARNING:BOOLEAN):BOOLEAN;
VAR T_YEAR,T_MONTH,T_DAY,T_STR :STRING;
BEGIN
T_YEAR := COPY(CDATE,1,4);
T_STR := TRIM(COPY(CDATE,POS('-',CDATE)+1,10));
T_MONTH := COPY(T_STR,1,POS('-',T_STR)-1);
T_STR := TRIM(COPY(T_STR,POS('-',T_STR)+1,10));
T_DAY := COPY(T_STR,POS('-',T_STR)+1,2);
IF (STRTOINTDEF(T_YEAR ,-1) < 0 ) OR
(STRTOINTDEF(T_MONTH,-1) < 0 ) OR
(STRTOINTDEF(T_DAY ,-1) < 0 ) OR
(STRTOINTDEF(T_YEAR ,-1) > 9999 ) OR
(STRTOINTDEF(T_MONTH,-1) > 12 ) OR
(STRTOINTDEF(T_DAY ,-1) > 31 ) or
(Length(CDATE) < 10) or //check length
(CHECK_DAY(STRTOINT(T_MONTH),STRTOINT(T_DAY) ,TRUE)=FALSE)//check day
THEN//ds
BEGIN
IF WARNING = TRUE THEN showmessage('日期格式不正确!');
RESULT := FALSE;
END ELSE
RESULT := TRUE;
{IF (STRTOINTDEF(CDATE,-1) < 0 ) then
BEGIN
IF WARNING = TRUE THEN showmessage('日期格式不正确!');
RESULT := FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -