来自: daocaoren0824, 时间: 2005-10-21 11:48:42, ID: 3240062 再给你一份 程序员实用函数 {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ ▎} {▎ 大家都是程序员 没有必要重复一些无聊的事情 我的这些函数能给大家带来方便 ▎} {▎ 如果觉得还一般 请关注 WWW.cdsunco.com/www.ccemove.com QQ:35013354 ▎} {▎ 系统公用函数及过程 ▎} {▎ ▎} {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ 软件名称: 开发包基础库 ▎} {▎ 单元名称: 公共运行时间库单元 ▎} {▎ 单元版本: V1.0 ▎} {▎ 备 注: 该单元定义了组件包的基础类库 ▎} {▎ 开发平台: PWin98SE + Delphi 6.0 ▎} {▎ 兼容测试: PWin9X/2000/XP + Delphi 6.0 ▎} {▎ 本 地 化: 该单元中的字符串均符合本地化处理方式 ▎} {▎ 更新记录: 2002.07.03 V2.0 ▎} {▎ 整理单元,重设版本号 ▎} {▎ 2002.03.17 V0.02 ▎} {▎ 新增部分函数,并部分修改 ▎} {▎ 2002.01.30 V0.01 ▎} {▎ 创建单元(整理而来) ▎} {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ ①: 扩展的字符串操作函数 ▎} {▎ ②: 扩展的日期时间操作函数 ▎} {▎ ③: 扩展的位操作函数 ▎} {▎ ④: 扩展的文件及目录操作函数 ▎} {▎ ⑤: 扩展的对话框函数 ▎} {▎ ⑥: 系统功能函数 ▎} {▎ ⑦: 硬件功能函数 ▎} {▎ ⑧: 网络功能函数 ▎} {▎ ⑨: 汉字拼音函数及过程 ▎} {▎ ⑩: 数据库功能函数 ▎} {▎ ⑾: 进制功能函数 ▎} {▎ ⑿: 其它功能函数 ▎} {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} unit Communal; {* |<PRE> |</PRE>} interface {$I CnPack.inc} uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, FileCtrl, ShellAPI, CommDlg, MMSystem, WinSock, IniFiles, DBTables, BDE, StdCtrls, ComObj, ADODB, Imm, DbCtrls, Db, Registry; const // 公共信息 {$IFDEF GB2312} SCnInformation = '提示'; SCnWarning = '警告'; SCnError = '错误'; {$ELSE} SCnInformation = 'Information'; SCnWarning = 'Warning'; SCnError = 'Error'; {$ENDIF} C1=52845; //字符串加密算法的公匙 C2=22719; //字符串加密算法的公匙 resourcestring {$IFDEF GB2312} SUnknowError = '未知错误'; SErrorCode = '错误代码:'; {$ELSE} SUnknowError = 'Unknow error'; SErrorCode = 'Error code:'; {$ENDIF} type EDBUpdateErr = class(Exception);//修改表结构时触发的错误句柄 //▎============================================================▎// //▎================① 扩展的字符串操作函数 ===================▎// //▎============================================================▎// //从文件中返回Ado连接字串。 function GetConnectionString(DataBaseName:string):string; //返回服务器的机器名称. function GetRemoteServerName:string; function InStr(const sShort: string; const sLong: string): Boolean; {测试通过} {* 判断s1是否包含在s2中} function IntToStrEx(Value: Integer; Len: Integer; FillChar: Char = '0'): string; {测试通过} {* 扩展整数转字符串函数 Example: IntToStrEx(1,5,'0'); 返回:"00001"} function IntToStrSp(Value: Integer; SpLen: Integer = 3; Sp: Char = ','): string; {测试通过} {* 带分隔符的整数-字符转换} function ByteToBin(Value: Byte): string; {测试通过} {* 字节转二进制串} function StrRight(Str: string; Len: Integer): string; {测试通过} {* 返回字符串右边的字符 Examples: StrRight('ABCEDFG',3); 返回:'DFG' } function StrLeft(Str: string; Len: Integer): string; {测试通过} {* 返回字符串左边的字符} function Spc(Len: Integer): string; {测试通过} {* 返回空格串} function Replace(Str,s1,s2:string;CaseSensitive:Boolean):string; {测试通过} {* 返回将指定字符s1用字符串s2替换后的字符串,可支持大小写敏感由CaseSensitive操作} {example: replace('We know what we want','we','I',false) = 'I Know what I want'} function Replicate(pcChar:Char; piCount:integer):string; {在一个字符串中查找某个字符串的位置} function StrNum(ShortStr:string;LongString:string):Integer; {测试通过} {* 返回某个字符串中某个字符串中出现的次数} function FindStr(ShortStr:String;LongStrIng:String):Integer; {测试通过} {* 返回某个字符串中查找某个字符串的位置} function SubStr(psInput:String; BeginPlace,CutLeng:Integer):String; {测试通过} {* 返回从位置BeginPlace开始切取长度为CatLeng字符串} function LeftStr(psInput:String; CutLeng:Integer):String; {测试通过} {* 返回从左边第一为开始切取 CutLeng长度的字符串} function RightStr(psInput:String; CutLeng:Integer):String; {测试通过} {* 返回从右边第一为开始切取 CutLeng长度的字符串} function PadLStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; {测试通过} {* 返回从psInput字符串左边开始用pcPadWith填充后总长度为PiWidth的字符串} function PadRStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; {测试通过} {* 返回从psInput字符串右边开始用pcPadWith填充后总长度为PiWidth的字符串} function PadCStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; {测试通过} {* 返回从psInput字符串两边开始用pcPadWith填充后总长度为PiWidth的字符串} function ChrTran(psInput:String; pcSearch:Char; pcTranWith:Char):String; {测试通过} {* 返回替换后字符串[替换单个字符] Examples: ChrTran('abCdEgdlkh','d','#'); 返回'abC#Eg#lkh'} function StrTran(psInput:String; psSearch:String; psTranWith:String):String; {测试通过} {* 返回替换后字符串[替换字符串] Examples: StrTran('aruyfbn','ruy','=====');; 返回'a=====fbn'} function Stuff(psInput:String; piBeginPlace,piCount:Integer; psStuffWith:String):String; { *返回替换后字符串[替换字符串] Examples: Stuff('ABCDEFGHI',3,4,'12345');返回'AB12345GHI'} procedure SwapStr(var s1, s2: string); {测试通过} {* 交换字串} function LinesToStr(const Lines: string): string; {测试通过} {* 多行文本转单行(换行符转'/n')} function StrToLines(const Str: string): string; {测试通过} {* 单行文本转多行('/n'转换行符)} function Encrypt(const S: String; Key: Word): String; {* 字符串加密函数} function Decrypt(const S: String; Key: Word): String; {* 字符串解密函数} function varIIF(aTest: Boolean; TrueValue, FalseValue: Variant): Variant; function varToStr(const V: Variant): string; {* VarIIF及VartoStr为变体函数} function IsDigital(Value: string): boolean; {功能说明:判断string是否全是数字} function RandomStr(aLength : Longint) : String; {随机字符串函数} //▎============================================================▎// //▎================② 扩展的日期时间操作函数 =================▎// //▎============================================================▎// function GetYear(Date: TDate): Integer; {测试通过} {* 取日期年份分量} function GetMonth(Date: TDate): Integer; {测试通过} {* 取日期月份分量} function GetDay(Date: TDate): Integer; {测试通过} {* 取日期天数分量} function GetHour(Time: TTime): Integer; {测试通过} {* 取时间小时分量} function GetMinute(Time: TTime): Integer; {测试通过} {* 取时间分钟分量} function GetSecond(Time: TTime): Integer; {测试通过} {* 取时间秒分量} function GetMSecond(Time: TTime): Integer; {测试通过} {* 取时间毫秒分量} function GetMonthLastDay(Cs_Year,Cs_Month:string):string; { *传入年、月,得到该月份最后一天} function IsLeapYear( nYear: Integer ): Boolean; {*/判断某年是否为闰年} function MaxDateTime(const Values: array of TDateTime): TDateTime; {//两个日期取较大的日期} function MinDateTime(const Values: array of TDateTime): TDateTime; {//两个日期取较小的日期} function dateBeginOfMonth(D: TDateTime): TDateTime; {//得到本月的第一天} function DateEndOfMonth(D: TDateTime): TDateTime; {//得到本月的最后一天} function DateEndOfYear(D: TDateTime): TDateTime; {//得到本年的最后一天} function DaysBetween(Date1, Date2: TDateTime): integer; {//得到两个日期相隔的天数} //▎============================================================▎// //▎===================③ 扩展的位操作函数 ====================▎// //▎============================================================▎// type TByteBit = 0..7; {* Byte类型位数范围} TWordBit = 0..15; {* Word类型位数范围} TDWordBit = 0..31; {* DWord类型位数范围} procedure SetBit(var Value: Byte; Bit: TByteBit; IsSet: Boolean); overload; {* 设置二进制位} procedure SetBit(var Value: WORD; Bit: TWordBit; IsSet: Boolean); overload; {* 设置二进制位} procedure SetBit(var Value: DWORD; Bit: TDWordBit; IsSet: Boolean); overload; {* 设置二进制位} function GetBit(Value: Byte; Bit: TByteBit): Boolean; overload; {* 取二进制位} function GetBit(Value: WORD; Bit: TWordBit): Boolean; overload; {* 取二进制位} function GetBit(Value: DWORD; Bit: TDWordBit): Boolean; overload; {* 取二进制位} //▎============================================================▎// //▎=================④扩展的文件及目录操作函数=================▎// //▎============================================================▎// function MoveFile(const sName, dName: string): Boolean; {测试通过} {* 移动文件、目录,参数为源、目标名} procedure FileProperties(const FName: string); {测试通过} {* 打开文件属性窗口} function OpenDialog(var FileName: string; Title: string; Filter: string; Ext: string): Boolean; {* 打开文件框} function FormatPath(APath: string; Width: Integer): string; {测试通过} {* 缩短显示不下的长路径名} function GetRelativePath(Source, Dest: string): string; {测试通过} {* 取两个目录的相对路径,注意串尾不能是'/'字符!} procedure RunFile(const FName: string; Handle: THandle = 0; const Param: string = ''); {测试通过} {* 运行一个文件} function WinExecAndWait32(FileName: string; Visibility: Integer = SW_NORMAL): Integer; {测试通过} {* 运行一个文件并等待其结束} function AppPath: string; {测试通过} {* 应用程序路径} function GetWindowsDir: string; {测试通过} {* 取Windows系统目录} function GetWinTempDir: string; {测试通过} {* 取临时文件目录} function AddDirSuffix(Dir: string): string; {测试通过} {* 目录尾加'/'修正} function MakePath(Dir: string): string; {测试通过} {* 目录尾加'/'修正} function IsFileInUse(FName: string): Boolean; {测试通过} {* 判断文件是否正在使用} function GetFileSize(FileName: string): Integer; {测试通过} {* 取文件长度} function SetFileDate(FileName: string; CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean; {测试通过} {* 设置文件时间 Example: FileSetDate('c:/Test/Test1.exe',753160662); } function GetFileDate(FileName: string; var CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean; {测试通过} {* 取文件时间} function FileTimeToLocalSystemTime(FTime: TFileTime): TSystemTime; {测试通过} {* 文件时间转本地时间} function LocalSystemTimeToFileTime(STime: TSystemTime): TFileTime; {测试通过} {* 本地时间转文件时间} function GetFileIcon(FileName: string; var Icon: TIcon): Boolean; {测试通过} {* 取得与文件相关的图标,成功则返回True} function CreateBakFile(FileName, Ext: string): Boolean; {测试通过} {* 创建备份文件} function Deltree(Dir: string): Boolean; {测试通过} {* 删除整个目录} function GetDirFiles(Dir: string): Integer; {测试通过} {* 取文件夹文件数} type TFindCallBack = procedure(const FileName: string; const Info: TSearchRec; var Abort: Boolean); {* 查找指定目录下文件的回调函数} procedure FindFile(const Path: string; const FileName: string = '*.*'; Proc: TFindCallBack = nil; bSub: Boolean = True; const bMsg: Boolean = True); {* 查找指定目录下文件} procedure FindFileList(Path,Filter:string;FileList:TStrings;ContainSubDir:Boolean); { 功能说明:查找一个路径下的所有文件。 参数: path:路径,filter:文件扩展名过滤,FileList:文件列表, ContainSubDir:是否包含子目录} function Txtline(const txt: string): integer; {* 返回一文本文件的行数} function Html2Txt(htmlfilename: string): string; {* Html文件转化成文本文件} function OpenWith(const FileName: string): Integer; {测试通过} {* 文件打开方式} //▎============================================================▎// //▎====================⑤扩展的对话框函数======================▎// //▎============================================================▎// procedure InfoDlg(Mess: string; Caption: string = SCnInformation; Flags: Integer = MB_OK + MB_ICONINFORMATION); {测试通过} {* 显示提示窗口} function InfoOk(Mess: string; Caption: string = SCnInformation): Boolean; {测试通过} {* 显示提示确认窗口} procedure ErrorDlg(Mess: string; Caption: string = SCnError); {测试通过} {* 显示错误窗口} procedure WarningDlg(Mess: string; Caption: string = SCnWarning); {测试通过} {* 显示警告窗口} function QueryDlg(Mess: string; Caption: string = SCnInformation): Boolean; {测试通过} {* 显示查询是否窗口} procedure SetWindowAnimate(Sender : TForm; IsSetAni : bool); //▎============================================================▎// //▎=====================⑥系统功能函数=========================▎// //▎============================================================▎// procedure MoveMouseIntoControl(AWinControl: TControl); {测试通过} {* 移动鼠标到控件} function DynamicResolution(x, y: WORD): Boolean; {测试通过} {* 动态设置分辨率} procedure StayOnTop(Handle: HWND; OnTop: Boolean); {测试通过} {* 窗口最上方显示} procedure SetHidden(Hide: Boolean); {测试通过} {* 设置程序是否出现在任务栏} procedure SetTaskBarVisible(Visible: Boolean); {测试通过} {* 设置任务栏是否可见} procedure SetDesktopVisible(Visible: Boolean); {测试通过} {* 设置桌面是否可见} procedure BeginWait; {测试通过} {* 显示等待光标} procedure EndWait; {测试通过} {* 结束等待光标} function CheckWindows9598NT: string; {测试通过} {* 检测是否Win95/98/NT平台} function GetOSInfo : String; {测试通过} {* 取得当前操作平台是 Windows 95/98 还是NT} function GetCurrentUserName : string; {*获取当前Windows登录名的用户} function GetRegistryOrg_User(UserKeyType:string):string; {*获取当前注册的单位及用户名称} function GetSysVersion:string; {*//获取操作系统版本号} function WinBootMode:string; {//Windows启动模式} type PShutType = (UPowerOff, UShutdown, UReboot, ULogOff, USuspend, UHibernate); procedure WinShutDown(ShutWinType:PShutType; PForce:Boolean); {//Windows ShutDown等} //▎============================================================▎// //▎=====================⑦硬件功能函数=========================▎// //▎============================================================▎// function GetClientGUID:string; { 功能描述:在本机上得到一个GUID.去掉两端的大括号和中间的横线 返回值:去掉两端的大括号和中间的横线的一个GUID 适用范围:windows } function SoundCardExist: Boolean; {测试通过} {* 声卡是否存在} function GetDiskSerial(DiskChar: Char): string; {* 获取磁盘序列号} function DiskReady(Root: string) : Boolean; {*检查磁盘准备是否就绪} procedure WritePortB( wPort : Word; bValue : Byte ); {* 写串口} function ReadPortB( wPort : Word ) : Byte; {*读串口} function CPUSpeed: Double; {* 获知当前机器CPU的速率(MHz)} type TCPUID = array[1..4] of Longint; function GetCPUID : TCPUID; assembler; register; {*获取CPU的标识ID号*} function GetMemoryTotalPhys : Dword; {*获取计算机的物理内存} type TDriveState = (DSNODISK, DSUNFORMATTEDDISK, DSEMPTYDISK, DSDISK_WITHFILES); function DriveState (driveletter: Char) : TDriveState; {* 检查驱动器A中磁盘是否有效} //▎============================================================▎// //▎=====================⑧网络功能函数=========================▎// //▎============================================================▎// function GetComputerName:string; {* 获取网络计算机名称} function GetHostIP:string; {* 获取计算机的IP地址} function NetUserChangePassword(Domain:PWideChar; UserName:PWideChar; OldPassword:PWideChar; NewPassword:PWideChar): LongInt; stdcall; external 'netapi32.dll' name 'NetUserChangePassword'; {* // 运行平台:Windows NT/2000/XP {* // Windows 95/98/Me平台:可以用该函数修改用户的Windows登录密码} //▎============================================================▎// //▎=====================⑨汉字拼音功能函数=====================▎// //▎============================================================▎// function GetHzPy(const AHzStr: string): string; {测试通过} {* 取汉字的拼音} function HowManyChineseChar(Const s:String):Integer; {* 判断一个字符串中有多少各汉字} //▎============================================================▎// //▎===================⑩数据库功能函数及过程===================▎// //▎============================================================▎// {function PackDbDbf(Var StatusMsg: String): Boolean;} {* 物理删除数据库(Db,Dbf)中的数据[着了删除标记的记录]} procedure RepairDb(DbName: string); {* 修复Access表} function CreateODBCCfgInRegistry(ODBCSourceName:WideString;ServerName, DataBaseDescription:String):boolean; {* 通过注册表创建ODBC配置[创建在系统DSN页下]} function ADOConnectSysBase(Const Adocon:TadoConnection):boolean; {* 用Ado连接SysBase数据库函数} function ADOConnectLocalDB(Const Adocon:TadoConnection;Const Dbname,DbServerName:string;ValidateMode:Integer):boolean; {* 用Ado连接数据库函数} function ADOODBCConnectLocalDB(Const Adocon:TadoConnection;Const Dbname:string;ValidateMode:Integer):boolean; {* 用Ado与ODBC共同连接数据库函数} function CreatTable(LpDataBaseName,LpTableName,LpSentence:string):Boolean; {* //建立新表} function AddField(LpFieldName:string; LpDataType: TFieldType; LpSize: Word):string; {*//在表中添加字段} function KillField(LpFieldName:string):String; {* //在表中删除字段} function AlterTableExec(LpDataBaseName,LpSentence:string):Boolean; {* //修改表结构} function GetSQLSentence(LpTableName,LpSQLsentence:string): string; {* /修改、添加、删除表结构时的SQL句体} //▎============================================================▎// //▎======================⑾进制函数及过程======================▎// //▎============================================================▎// function StrToHex(AStr: string): string; {* 字符转化成十六进制} function HexToStr(AStr: string): string; {* 十六进制转化成字符} function TransChar(AChar: Char): Integer; //▎============================================================▎// //▎=====================⑿其它函数及过程=======================▎// //▎============================================================▎// function TrimInt(Value, Min, Max: Integer): Integer; overload; {测试通过} {* 输出限制在Min..Max之间} function IntToByte(Value: Integer): Byte; overload; {测试通过} {* 输出限制在0..255之间} function InBound(Value: Integer; Min, Max: Integer): Boolean; {测试通过} {* 判断整数Value是否在Min和Max之间} procedure CnSwap(var A, B: Byte); overload; {* 交换两个数} procedure CnSwap(var A, B: Integer); overload; {* 交换两个数} procedure CnSwap(var A, B: Single); overload; {* 交换两个数} procedure CnSwap(var A, B: Double); overload; {* 交换两个数} function RectEqu(Rect1, Rect2: TRect): Boolean; {* 比较两个Rect是否相等} procedure DeRect(Rect: TRect; var x, y, Width, Height: Integer); {* 分解一个TRect为左上角坐标x, y和宽度Width、高度Height} function EnSize(cx, cy: Integer): TSize; {* 返回一个TSize类型} function RectWidth(Rect: TRect): Integer; {* 计算TRect的宽度} function RectHeight(Rect: TRect): Integer; {* 计算TRect的高度} procedure Delay(const uDelay: DWORD); {测试通过} {* 延时} procedure BeepEx(const Freq: WORD = 1200; const Delay: WORD = 1); {Win9X下测试通过} {* 只能在Win9X下让喇叭发声} procedure ShowLastError; {测试通过} {* 显示Win32 Api运行结果信息} function writeFontStyle(FS: TFontStyles; inifile: string; write: boolean):string; {* 将字体Font.Style写入INI文件} function readFontStyle(inifile: string): TFontStyles; {* 从INI文件中读取字体Font.Style文件} //function ReadCursorPos(SourceMemo: TMemo): TPoint; function ReadCursorPos(SourceMemo: TMemo): string; {* 取得TMemo 控件当前光标的行和列信息到Tpoint中} function CanUndo(AMemo: TMemo): Boolean; {* 检查Tmemo控件能否Undo} procedure Undo(Amemo: Tmemo); {*实现Undo功能} procedure AutoListDisplay(ACombox:TComboBox); {* 实现ComBoBox自动下拉} function UpperMoney(small:real):string; {* 小写金额转换为大写 } function Myrandom(Num: Integer): integer; {*利用系统时间产生随机数)} procedure OpenIME(ImeName: string); {*打开输入法} procedure CloseIME; {*关闭输入法} procedure ToChinese(hWindows: THandle; bChinese: boolean); {*打开中文输入法} //数据备份 procedure BackUpData(LpBackDispMessTitle:String); implementation {▎=======函数及过程体开始==========▎} //▎============================================================▎// //▎==================①扩展的字符串操作函数====================▎// //▎============================================================▎// // 判断s1是否包含在s2中 function InStr(const sShort: string; const sLong: string): Boolean; var s1, s2: string; begin s1 := LowerCase(sShort); s2 := LowerCase(sLong); Result := Pos(s1, s2) > 0; end; // 扩展整数转字符串函数,参数分别为目标数、长度、填充字符(默认为0) function IntToStrEx(Value: Integer; Len: Integer; FillChar: Char = '0'): string; begin Result := IntToStr(Value); while Length(Result) < Len do Result := FillChar + Result; end; // 带分隔符的整数-字符转换 function IntToStrSp(Value: Integer; SpLen: Integer = 3; Sp: Char = ','): string; var s: string; i, j: Integer; begin s := IntToStr(Value); Result := ''; j := 0; for i := Length(s) downto 1 do begin Result := s[i] + Result; Inc(j); try if ((j mod SpLen) = 0) and (i <> 1) then Result := Sp + Result; except MessageBox(Application.Handle,' IntToStrSp函数的第二个参数值不能为数字0 !',SCnError,16); exit; end end; end; // 返回字符串右边的字符 function StrRight(Str: string; Len: Integer): string; begin if Len >= Length(Str) then Result := Str else Result := Copy(Str, Length(Str) - Len + 1, Len); end; // 返回字符串左边的字符 function StrLeft(Str: string; Len: Integer): string; begin if Len >= Length(Str) then Result := Str else Result := Copy(Str, 1, Len); end; // 字节转二进制串 function ByteToBin(Value: Byte): string; const V: Byte = 1; var i: Integer; begin for i := 7 downto 0 do if (V shl i) and Value <> 0 then Result := Result + '1' else Result := Result + '0'; end; // 返回空格串 function Spc(Len: Integer): string; var i: Integer; begin Result := ''; for i := 0 to Len - 1 do Result := Result + ' '; end; // 返回将指定字符s1用字符串s2替换后的字符串,可支持大小写敏感由CaseSensitive操作} function Replace(Str,s1,s2:string;CaseSensitive:Boolean):string; var i:integer; s,t:string; begin s:=''; t:=str; repeat if casesensitive then i:=pos(s1,t) else i:=pos(lowercase(s1),lowercase(t)); if i>0 then begin s:=s+Copy(t,1,i-1)+s2; t:=Copy(t,i+Length(s1),MaxInt); end else s:=s+t; until i<=0; result:=s; end; function Replicate(pcChar:Char; piCount:integer):string; begin Result:=''; SetLength(Result,piCount); fillChar(Pointer(Result)^,piCount,pcChar) end; // 返回某个字符串中某个字符串中出现的次数} function StrNum(ShortStr:string;LongString:string):Integer; {测试通过} var i:Integer; begin i:=0; while pos(ShortStr,LongString)>0 do begin i:=i+1; LongString:=Substr(LongString,(FindStr(ShortStr,LongString))+1,Length(LongString)-FindStr(ShortStr,LongString)) end; Result:=i; end; // 返回某个字符串中查找某个字符串的位置} function FindStr(ShortStr:String;LongStrIng:String):Integer;//在一个字符串中找某个字符的位置 var locality:integer; begin locality:=Pos(ShortStr,LongStrIng); if locality=0 then Result:=0 else Result:=locality; end; // 返回从位置BeginPlace开始切取长度为CatLeng字符串} function SubStr(psInput:String; BeginPlace,CutLeng:Integer):String; begin Result:=Copy(psInput,BeginPlace,CutLeng) end; // 返回从左边第一为开始切取 CutLeng长度的字符串 function LeftStr(psInput:String; CutLeng:Integer):String; begin Result:=Copy(psInput,1,CutLeng) end; // 返回从左边第一为开始切取 CutLeng长度的字符串 function RightStr(psInput:String; CutLeng:Integer):String; begin Result:=Copy(psInput,Length(psInput)-CutLeng+1,CutLeng) end; {* 返回从psInput字符串左边开始用pcPadWith填充后总长度为PiWidth的字符串} function PadLStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; begin Result:=Replicate(pcPadWith,piWidth-Length(psInput))+psInput end; {* 返回从psInput字符串右边开始用pcPadWith填充后总长度为PiWidth的字符串} function PadRStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; begin Result:=psInput+Replicate(pcPadWith,piWidth-Length(psInput)) end; {* 返回从psInput字符串两边开始用pcPadWith填充后总长度为PiWidth的字符串} function PadCStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; var liHalf :integer; begin liHalf:=(piWidth-Length(psInput))div 2; Result:=Replicate(pcPadWith,liHalf)+psInput+Replicate(pcPadWith,piWidth-Length(psInput)-liHalf) end; {* 返回替换后字符串 Examples: ChrTran('abCdEgdlkh','d','#'); 返回'bC#Eg#lkh'} function ChrTran(psInput:String; pcSearch:Char; pcTranWith:Char):String; var i,j:integer; begin j:=Length(psInput); for i:=1 to j do begin if psInput[i]=pcSearch then psInput[i]:=pcTranWith end; Result:=psInput end; {* 返回替换后字符串 Examples: StrTran('aruyfbn','ruy','====='); 返回'a=====fbn'} function StrTran(psInput:String; psSearch:String; psTranWith:String):String; var liPosition,liLenOfSrch,liLenOfIn:integer; begin liPosition:=Pos(psSearch,psInput); liLenOfSrch:=Length(psSearch); liLenOfIn:=Length(psInput); while liPosition>0 do begin psInput:=Copy(psInput,1,liPosition-1) +psTranWith +Copy(psInput,liPosition+liLenOfSrch,liLenOfIn); liPosition:=Pos(psSearch,psInput) end; Result:=psInput end; { *返回替换后字符串[替换字符串] Examples: Stuff('ABCDEFGHI',3,4,'12345');返回'AB12345GHI'} function Stuff(psInput:String; piBeginPlace,piCount:Integer; psStuffWith:String):String; begin Result:=Copy(psInput,1,piBeginPlace-1)+ psStuffWith+ Copy(psInput,piBeginPlace+piCount,Length(psInput)) end; // 交换字串 procedure SwapStr(var s1, s2: string); var tempstr: string; begin tempstr := s1; s1 := s2; s2 := tempstr; end; const csLinesCR = #13#10; csStrCR = '/n'; // 多行文本转单行(换行符转'/n') function LinesToStr(const Lines: string): string; var i: Integer; begin Result := Lines; i := Pos(csLinesCR, Result); while i > 0 do begin system.Delete(Result, i, Length(csLinesCR)); system.insert(csStrCR, Result, i); i := Pos(csLinesCR, Result); end; end; // 单行文本转多行('/n'转换行符) function StrToLines(const Str: string): string; var i: Integer; begin Result := Str; i := Pos(csStrCR, Result); while i > 0 do begin system.Delete(Result, i, Length(csStrCR)); system.insert(csLinesCR, Result, i); i := Pos(csStrCR, Result); end; end; //字符串加密函数 function Encrypt(const S: String; Key: Word): String; var I : Integer; begin Result := S; for I := 1 to Length(S) do begin Result[I] := char(byte(S[I]) xor (Key shr 8)); Key := (byte(Result[I]) + Key) * C1 + C2; if Result[I] = Chr(0) then Result[I] := S[I]; end; Result := StrToHex(Result); end; //字符串解密函数 function Decrypt(const S: String; Key: Word): String; var I: Integer; S1: string; begin S1 := HexToStr(S); Result := S1; for I := 1 to Length(S1) do begin if char(byte(S1[I]) xor (Key shr 8)) = Chr(0) then begin Result[I] := S1[I]; Key := (byte(Chr(0)) + Key) * C1 + C2; //保证Key的正确性 end else begin Result[I] := char(byte(S1[I]) xor (Key shr 8)); Key := (byte(S1[I]) + Key) * C1 + C2; end; end; end; ///VarIIF,VarTostr为变体函数 function varIIF(aTest: Boolean; TrueValue, FalseValue: Variant): Variant; begin if aTest then Result := TrueValue else Result := FalseValue; end; function varToStr(const V: Variant): string; begin case TVarData(v).vType of varSmallInt: Result := IntToStr(TVarData(v).VSmallInt); varInteger: Result := IntToStr(TVarData(v).VInteger); varSingle: Result := FloatToStr(TVarData(v).VSingle); varDouble: Result := FloatToStr(TVarData(v).VDouble); varCurrency: Result := FloatToStr(TVarData(v).VCurrency); varDate: Result := DateToStr(TVarData(v).VDate); varBoolean: Result := varIIf(TVarData(v).VBoolean, 'True', 'False'); varByte: Result := IntToStr(TVarData(v).VByte); varString: Result := StrPas(TVarData(v).VString); varEmpty, varNull, varVariant, varUnknown, varTypeMask, varArray, varByRef, varDispatch, varError: Result := ''; end; end; {功能说明:判断string是否全是数字} function IsDigital(Value: string): boolean; var i, j: integer; str: char; begin result := true; Value := trim(Value); j := Length(Value); if j = 0 then begin result := false; exit; end; for i := 1 to j do begin str := Value[i]; if not (str in ['0'..'9']) then begin result := false; exit; end; end; end; {随机字符串函数} function RandomStr(aLength : Longint) : String; var X : Longint; begin if aLength <= 0 then exit; SetLength(Result, aLength); for X:=1 to aLength do Result[X] := Chr(Random(26) + 65); end; //▎============================================================▎// //▎==================②扩展日期时间操作函数====================▎// //▎============================================================▎// function GetYear(Date: TDate): Integer; var y, m, d: WORD; begin DecodeDate(Date, y, m, d); Result := y; end; function GetMonth(Date: TDate): Integer; var y, m, d: WORD; begin DecodeDate(Date, y, m, d); Result := m; end; function GetDay(Date: TDate): Integer; var y, m, d: WORD; begin DecodeDate(Date, y, m, d); Result := d; end; function GetHour(Time: TTime): Integer; var h, m, s, ms: WORD; begin DecodeTime(Time, h, m, s, ms); Result := h; end; function GetMinute(Time: TTime): Integer; var h, m, s, ms: WORD; begin DecodeTime(Time, h, m, s, ms); Result := m; end; function GetSecond(Time: TTime): Integer; var h, m, s, ms: WORD; begin DecodeTime(Time, h, m, s, ms); Result := s; end; function GetMSecond(Time: TTime): Integer; var h, m, s, ms: WORD; begin DecodeTime(Time, h, m, s, ms); Result := ms; end; //传入年、月,得到该月份最后一天 function GetMonthLastDay(Cs_Year,Cs_Month:string):string; Var V_date:Tdate; V_year,V_month,V_day:word; begin V_year:=strtoint(Cs_year); V_month:=strtoint(Cs_month); if V_month=12 then begin V_month:=1; inc(V_year); end else inc(V_month); V_date:=EncodeDate(V_year,V_month,1); V_date:=V_date-1; DecodeDate(V_date,V_year,V_month,V_day); Result:=DateToStr(EncodeDate(V_year,V_month,V_day)); end; //判断某年是否为闰年 function IsLeapYear( nYear: Integer ): Boolean; begin Result := (nYear mod 4 = 0) and ((nYear mod 100 <> 0) or (nYear mod 400 = 0)); end; //两个日期取较大的日期 function MaxDateTime(const Values: array of TDateTime): TDateTime; var I: Cardinal; begin Result := Values[0]; for I := 0 to Low(Values) do if Values[I] < Result then Result := Values[I]; end; //两个日期取较小的日期 function MinDateTime(const Values: array of TDateTime): TDateTime; var I: Cardinal; begin Result := Values[0]; for I := 0 to High(Values) do if Values[I] < Result then Result := Values[I]; end; //得到本月的第一一天 function dateBeginOfMonth(D: TDateTime): TDateTime; var Year, Month, Day: Word; begin DecodeDate(D, Year, Month, Day); Result := EncodeDate(Year, Month, 1); end; //得到本月的最后一天 function dateEndOfMonth(D: TDateTime): TDateTime; var Year, Month, Day: Word; begin DecodeDate(D, Year, Month, Day); if Month = 12 then begin Inc(Year); Month := 1; end else Inc(Month); Result := EncodeDate(Year, Month, 1) - 1; end; //得到本年的最后一天 function dateEndOfYear(D: TDateTime): TDateTime; var Year, Month, Day: Word; begin DecodeDate(D, Year, Month, Day); Result := EncodeDate(Year, 12, 31); end; //得到两个日期相隔的天数 function DaysBetween(Date1, Date2: TDateTime): integer; begin Result := Trunc(Date2) - Trunc(Date1) + 1; if Result < 0 then Result := 0; end; //▎============================================================▎// //▎=====================③位操作函数===========================▎// //▎============================================================▎// // 设置位 procedure SetBit(var Value: Byte; Bit: TByteBit; IsSet: Boolean); begin if IsSet then Value := Value or (1 shl Bit) else Value := Value and not (1 shl Bit); end; procedure SetBit(var Value: WORD; Bit: TWordBit; IsSet: Boolean); begin if IsSet then Value := Value or (1 shl Bit) else Value := Value and not (1 shl Bit); end; procedure SetBit(var Value: DWORD; Bit: TDWordBit; IsSet: Boolean); begin if IsSet then Value := Value or (1 shl Bit) else Value := Value and not (1 shl Bit); end; // 取位 function GetBit(Value: Byte; Bit: TByteBit): Boolean; begin Result := Value and (1 shl Bit) <> 0; end; function GetBit(Value: WORD; Bit: TWordBit): Boolean; begin Result := Value and (1 shl Bit) <> 0; end; function GetBit(Value: DWORD; Bit: TDWordBit): Boolean; begin Result := Value and (1 shl Bit) <> 0; end; //▎============================================================▎// //▎=================④扩展的文件及目录操作函数=================▎// //▎============================================================▎// // 移动文件、目录 function MoveFile(const sName, dName: string): Boolean; var s1, s2: AnsiString; lpFileOp: TSHFileOpStruct; begin s1 := PChar(sName) + #0#0; s2 := PChar(dName) + #0#0; with lpFileOp do begin Wnd := Application.Handle; wFunc := FO_MOVE; pFrom := PChar(s1); pTo := PChar(s2); fFlags := FOF_ALLOWUNDO; hNameMappings := nil; lpszProgressTitle := nil; fAnyOperationsAborted := True; end; Result := SHFileOperation(lpFileOp) = 0; end; // 打开文件属性窗口 procedure FileProperties(const FName: string); var SEI: SHELLEXECUTEINFO; begin with SEI do begin cbSize := SizeOf(SEI); fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_INVOKEIDLIST or SEE_MASK_FLAG_NO_UI; Wnd := Application.Handle; lpVerb := 'properties'; lpFile := PChar(FName); lpParameters := nil; lpDirectory := nil; nShow := 0; hInstApp := 0; lpIDList := nil; end; ShellExecuteEx(@SEI); end; // 缩短显示不下的长路径名 function FormatPath(APath: string; Width: Integer): string; var SLen: Integer; i, j: Integer; TString: string; begin SLen := Length(APath); if (SLen <= Width) or (Width <= 6) then begin Result := APath; Exit end else begin i := SLen; TString := APath; for j := 1 to 2 do begin while (TString[i] <> '/') and (SLen - i < Width - 8) do i := i - 1; i := i - 1; end; for j := SLen - i - 1 downto 0 do TString[Width - j] := TString[SLen - j]; for j := SLen - i to SLen - i + 2 do TString[Width - j] := '.'; Delete(TString, Width + 1, 255); Result := TString; end; end; // 打开文件框 function OpenDialog(var FileName: string; Title: string; Filter: string; Ext: string): Boolean; var OpenName: TOPENFILENAME; TempFilename, ReturnFile: string; begin with OpenName do begin lStructSize := SizeOf(OpenName); hWndOwner := GetModuleHandle(''); Hinstance := SysInit.Hinstance; lpstrFilter := PChar(Filter + #0 + Ext + #0#0); lpstrCustomFilter := ''; nMaxCustFilter := 0; nFilterIndex := 1; nMaxFile := MAX_PATH; SetLength(TempFilename, nMaxFile + 2); lpstrFile := PChar(TempFilename); FillChar(lpstrFile^, MAX_PATH, 0); SetLength(TempFilename, nMaxFile + 2); nMaxFileTitle := MAX_PATH; SetLength(ReturnFile, MAX_PATH + 2); lpstrFileTitle := PChar(ReturnFile); FillChar(lpstrFile^, MAX_PATH, 0); lpstrInitialDir := '.'; lpstrTitle := PChar(Title); Flags := OFN_HIDEREADONLY + OFN_ENABLESIZING; nFileOffset := 0; nFileExtension := 0; lpstrDefExt := PChar(Ext); lCustData := 0; lpfnHook := nil; lpTemplateName := ''; end; Result := GetOpenFileName(OpenName); if Result then FileName := ReturnFile else FileName := ''; end; // 取两个目录的相对路径,注意串尾不能是'/'字符! function GetRelativePath(Source, Dest: string): string; // 比较两路径字符串头部相同串的函数 function GetPathComp(s1, s2: string): Integer; begin if Length(s1) > Length(s2) then swapStr(s1, s2); Result := Pos(s1, s2); while (Result = 0) and (Length(s1) > 3) do begin if s1 = '' then Exit; s1 := ExtractFileDir(s1); Result := Pos(s1, s2); end; if Result <> 0 then Result := Length(s1); if Result = 3 then Result := 2; // 修正因ExtractFileDir()处理'c:/'时产生的错误. end; // 取Dest的相对根路径的函数 function GetRoot(s: ShortString): string; var i: Integer; begin Result := ''; for i := 1 to Length(s) do if s[i] = '/' then Result := Result + '../'; if Result = '' then Result := './'; // 如果不想处理成"./"的路径格式,可去掉本行 end; var RelativRoot, RelativSub: string; HeadNum: Integer; begin Source := UpperCase(Source); Dest := UpperCase(Dest); // 比较两路径字符串头部相同串 HeadNum := GetPathComp(Source, Dest); // 取Dest的相对根路径 RelativRoot := GetRoot(StrRight(Dest, Length(Dest) - HeadNum)); // 取Source的相对子路径 RelativSub := StrRight(Source, Length(Source) - HeadNum - 1); // 返回 Result := RelativRoot + RelativSub; end; // 运行一个文件 procedure RunFile(const FName: string; Handle: THandle; const Param: string); begin ShellExecute(Handle, nil, PChar(FName), PChar(Param), nil, SW_SHOWNORMAL); end; // 运行一个文件并等待其结束 function WinExecAndWait32(FileName: string; Visibility: Integer): Integer; var zAppName: array[0..512] of Char; zCurDir: array[0..255] of Char; WorkDir: string; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin StrPCopy(zAppName, FileName); GetDir(0, WorkDir); StrPCopy(zCurDir, WorkDir); FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := Visibility; if not CreateProcess(nil, zAppName, { pointer to command line string } nil, { pointer to process security attributes } nil, { pointer to thread security attributes } False, { handle inheritance flag } CREATE_NEW_CONSOLE or { creation flags } NORMAL_PRIORITY_CLASS, nil, { pointer to new environment block } nil, { pointer to current directory name } StartupInfo, { pointer to STARTUPINFO } ProcessInfo) then Result := -1 { pointer to PROCESS_INF } else begin WaitforSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result)); end; end; // 应用程序路径 function AppPath: string; begin Result := ExtractFilePath(Application.ExeName); end; // 取Windows系统目录 function GetWindowsDir: string; var Buf: array[0..MAX_PATH] of Char; begin GetWindowsDirectory(Buf, MAX_PATH); Result := AddDirSuffix(Buf); end; // 取临时文件目录 function GetWinTempDir: string; var Buf: array[0..MAX_PATH] of Char; begin GetTempPath(MAX_PATH, Buf); Result := AddDirSuffix(Buf); end; // 目录尾加'/'修正 function AddDirSuffix(Dir: string): string; begin Result := Trim(Dir); if Result = '' then Exit; if Result[Length(Result)] <> '/' then Result := Result + '/'; end; function MakePath(Dir: string): string; begin Result := AddDirSuffix(Dir); end; // 判断文件是否正在使用 function IsFileInUse(FName: string): Boolean; var HFileRes: HFILE; begin Result := False; if not FileExists(FName) then Exit; HFileRes := CreateFile(PChar(FName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (HFileRes = INVALID_HANDLE_VALUE); if not Result then CloseHandle(HFileRes); end; // 取文件长度 function GetFileSize(FileName: string): Integer; var FileVar: file of Byte; begin {$I-} try AssignFile(FileVar, FileName); Reset(FileVar); Result := FileSize(FileVar); CloseFile(FileVar); except Result := 0; end; {$I+} end; // 设置文件时间 function SetFileDate(FileName: string; CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean; var FileHandle: Integer; begin FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone); if FileHandle > 0 then begin SetFileTime(FileHandle, @CreationTime, @LastAccessTime, @LastWriteTime); FileClose(FileHandle); Result := True; end else Result := False; end; // 取文件时间 function GetFileDate(FileName: string; var CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean; var FileHandle: Integer; begin FileHandle := FileOpen(FileName, fmOpenRead or fmShareDenyNone); if FileHandle > 0 then begin GetFileTime(FileHandle, @CreationTime, @LastAccessTime, @LastWriteTime); FileClose(FileHandle); Result := True; end else Result := False; end; // 取得与文件相关的图标 // FileName: e.g. "e:/hao/a.txt" // 成功则返回True function GetFileIcon(FileName: string; var Icon: TIcon): Boolean; var SHFileInfo: TSHFileInfo; h: HWND; begin if not Assigned(Icon) then Icon := TIcon.Create; h := SHGetFileInfo(PChar(FileName), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_ICON or SHGFI_SYSICONINDEX); Icon.Handle := SHFileInfo.hIcon; Result := (h <> 0); end; // 文件时间转本地时间 function FileTimeToLocalSystemTime(FTime: TFileTime): TSystemTime; var STime: TSystemTime; begin FileTimeToLocalFileTime(FTime, FTime); FileTimeToSystemTime(FTime, STime); Result := STime; end; // 本地时间转文件时间 function LocalSystemTimeToFileTime(STime: TSystemTime): TFileTime; var FTime: TFileTime; begin SystemTimeToFileTime(STime, FTime); LocalFileTimeToFileTime(FTime, FTime); Result := FTime; end; // 创建备份文件 function CreateBakFile(FileName, Ext: string): Boolean; var BakFileName: string; begin BakFileName := FileName + '.' + Ext; Result := CopyFile(PChar(FileName), PChar(BakFileName), False); end; // 删除整个目录 function Deltree(Dir: string): Boolean; var sr: TSearchRec; fr: Integer; begin if not DirectoryExists(Dir) then begin Result := True; Exit; end; fr := FindFirst(AddDirSuffix(Dir) + '*.*', faAnyFile, sr); try while fr = 0 do begin if (sr.Name <> '.') and (sr.Name <> '..') then begin if sr.Attr and faDirectory = faDirectory then Result := Deltree(AddDirSuffix(Dir) + sr.Name) else Result := DeleteFile(AddDirSuffix(Dir) + sr.Name); if not Result then Exit; end; fr := FindNext(sr); end; finally FindClose(sr); end; Result := RemoveDir(Dir); end; // 取文件夹文件数 function GetDirFiles(Dir: string): Integer; var sr: TSearchRec; fr: Integer; begin Result := 0; fr := FindFirst(AddDirSuffix(Dir) + '*.*', faAnyFile, sr); while fr = 0 do begin if (sr.Name <> '.') and (sr.Name <> '..') then Inc(Result); fr := FindNext(sr); end; FindClose(sr); end; var FindAbort: Boolean; // 查找指定目录下文件 procedure FindFile(const Path: string; const FileName: string = '*.*'; Proc: TFindCallBack = nil; bSub: Boolean = True; const bMsg: Boolean = True); var APath: string; Info: TSearchRec; Succ: Integer; begin FindAbort := False; APath := MakePath(Path); try Succ := FindFirst(APath + FileName, faAnyFile - faVolumeID, Info); while Succ = 0 do begin if (Info.Name <> '.') and (Info.Name <> '..') then begin if (Info.Attr and faDirectory) <> faDirectory then begin if Assigned(Proc) then Proc(APath + Info.FindData.cFileName, Info, FindAbort); end else if bSub then FindFile(APath + Info.Name, FileName, Proc, bSub, bMsg); end; if bMsg then Application.ProcessMessages; if FindAbort then Exit; Succ := FindNext(Info); end; finally FindClose(Info); end; end; { 功能说明:查找一个路径下的所有文件。 参数:path:路径, filter:文件扩展名过滤, FileList:文件列表, ContainSubDir:是否包含子目录} procedure FindFileList(Path,Filter:string;FileList:TStrings;ContainSubDir:Boolean); var FSearchRec,DSearchRec:TSearchRec; FindResult:shortint; begin FindResult:=FindFirst(path+Filter,sysutils.faAnyFile,FSearchRec); try while FindResult=0 do begin FileList.Add(FSearchRec.Name); FindResult:=FindNext(FSearchRec); end; if ContainSubDir then begin FindResult:=FindFirst(path+Filter,faDirectory,DSearchRec); while FindResult=0 do begin if ((DSearchRec.Attr and faDirectory)=faDirectory) and (DSearchRec.Name<>'.') and (DSearchRec.Name<>'..') then FindFileList(Path,Filter,FileList,ContainSubDir); FindResult:=FindNext(DSearchRec); end; end; finally FindClose(FSearchRec); end; end; //返回一文本文件的行数 function Txtline(const txt: string): integer; var F : TextFile; {设定为文本文件} StrLine : string; {每行字符串} line : Integer; {行数} begin AssignFile(F, txt); {建立文件} Reset(F); Line := 0; while not SeekEof(f) do {文件没到尾} begin if SeekEoln(f) then {判断是否到行尾} Readln; Readln(F, StrLine); if SeekEof(f) then break else inc(Line); end; CloseFile(F); {关闭文件} Result := Line; end; //Html文件转化成文本文件 function Html2Txt(htmlfilename: string): string; var Mystring:TStrings; s,lineS:string; line,Llen,i,j:integer; rloop:boolean; begin rloop:=False; Mystring:=TStringlist.Create; s:=''; Mystring.LoadFromFile(htmlfilename); line:=Mystring.Count; try for i:=0 to line-1 do Begin lineS:=Mystring[i]; Llen:=length(lineS); j:=1; while (j<=Llen)and(lineS[j]=' ')do begin j:=j+1; s:=s+' '; End; while j<=Llen do Begin if lineS[j]='<'then rloop:=True; if lineS[j]='>'then Begin rloop:=False; j:=j+1; continue; End; if rloop then begin j:=j+1; continue; end else s:=s+lineS[j]; j:=j+1; End; s:=s+#13#10; End; finally Mystring.Free; end;{try} result:=s; end; // 文件打开方式 function OpenWith(const FileName: string): Integer; begin Result := ShellExecute(Application.Handle, 'open', 'rundll32.exe', PChar('shell32.dll,OpenAs_RunDLL ' + FileName), '', SW_SHOW); end; //▎============================================================▎// //▎===================⑤扩展的对话框函数=======================▎// //▎============================================================▎// // 显示提示窗口 procedure InfoDlg(Mess: string; Caption: string; Flags: Integer); begin Application.MessageBox(PChar(Mess), PChar(Caption), Flags); end; // 显示提示确认窗口 function InfoOk(Mess: string; Caption: string): Boolean; begin Result := Application.MessageBox(PChar(Mess), PChar(Caption), MB_OK + MB_ICONINFORMATION) = IDOK; end; // 显示错误窗口 procedure ErrorDlg(Mess: string; Caption: string); begin Application.MessageBox(PChar(Mess), PChar(Caption), MB_OK + MB_ICONSTOP); end; // 显示警告窗口 procedure WarningDlg(Mess: string; Caption: string); begin Application.MessageBox(PChar(Mess), PChar(Caption), MB_OK + MB_ICONWARNING); end; // 显示查询是否窗口 function QueryDlg(Mess: string; Caption: string): Boolean; begin Result := Application.MessageBox(PChar(Mess), PChar(Caption), MB_YESNO + MB_ICONQUESTION) = IDYES; end; //窗体渐变 procedure SetWindowAnimate(Sender : TForm; IsSetAni : bool); var pOSVersionInfo : OSVersionInfo; begin pOSVersionInfo.dwOSVersionInfoSize := sizeof(OSVersionInfo); GetVersionEx(pOSVersionInfo); if pOSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin if IsSetAni then AnimateWindow(Sender.Handle,444,AW_HIDE or AW_BLEND); end else if IsSetAni then begin AnimateWindow(Sender.Handle,444,AW_HIDE or AW_CENTER); end; end; //▎============================================================▎// //▎====================⑥ 系统功能函数 =======================▎// //▎============================================================▎// // 移动鼠标到控件 procedure MoveMouseIntoControl(AWinControl: TControl); var rtControl: TRect; begin rtControl := AWinControl.BoundsRect; MapWindowPoints(AWinControl.Parent.Handle, 0, rtControl, 2); SetCursorPos(rtControl.Left + (rtControl.Right - rtControl.Left) div 2, rtControl.Top + (rtControl.Bottom - rtControl.Top) div 2); end; // 动态设置分辨率 function DynamicResolution(x, y: WORD): Boolean; var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := x; lpDevMode.dmPelsHeight := y; Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL; end; end; // 窗口最上方显示 procedure StayOnTop(Handle: HWND; OnTop: Boolean); const csOnTop: array[Boolean] of HWND = (HWND_NOTOPMOST, HWND_TOPMOST); begin SetWindowPos(Handle, csOnTop[OnTop], 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); end; var WndLong: Integer; // 设置程序是否出现在任务栏 procedure SetHidden(Hide: Boolean); begin ShowWindow(Application.Handle, SW_HIDE); if Hide then SetWindowLong(Application.Handle, GWL_EXSTYLE, WndLong or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW or WS_EX_TOPMOST) else SetWindowLong(Application.Handle, GWL_EXSTYLE, WndLong); ShowWindow(Application.Handle, SW_SHOW); end; const csWndShowFlag: array[Boolean] of DWORD = (SW_HIDE, SW_RESTORE); // 设置任务栏是否可见 procedure SetTaskBarVisible(Visible: Boolean); var wndHandle: THandle; begin wndHandle := FindWindow('Shell_TrayWnd', nil); ShowWindow(wndHandle, csWndShowFlag[Visible]); end; // 设置桌面是否可见 procedure SetDesktopVisible(Visible: Boolean); var hDesktop: THandle; begin hDesktop := FindWindow('Progman', nil); ShowWindow(hDesktop, csWndShowFlag[Visible]); end; // 显示等待光标 procedure BeginWait; begin Screen.Cursor := crHourGlass; end; // 结束等待光标 procedure EndWait; begin Screen.Cursor := crDefault; end; // 检测是否Win95/98平台 function CheckWindows9598NT: String; var V: TOSVersionInfo; begin V.dwOSVersionInfoSize := SizeOf(V); Result := '未知操作系统'; if not GetVersionEx(V) then Exit; if V.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then Result := 'Windows 95/98' else begin if V.dwPlatformId = VER_PLATFORM_WIN32_NT then Result := 'Windows NT' else Result :='Windows' end; end; {* 取得当前操作平台是 Windows 95/98 还是NT} function GetOSInfo : String; begin Result := ''; case Win32Platform of VER_PLATFORM_WIN32_WINDOWS: Result := 'Windows 95/98'; VER_PLATFORM_WIN32_NT: Result := 'Windows NT'; else Result := 'Windows32'; end; end; //*获取当前Windows登录名的用户 function GetCurrentUserName : string; const cnMaxUserNameLen = 254; var sUserName : string; dwUserNameLen : Dword; begin dwUserNameLen := cnMaxUserNameLen-1; SetLength( sUserName, cnMaxUserNameLen ); GetUserName(Pchar( sUserName ), dwUserNameLen ); SetLength( sUserName, dwUserNameLen ); Result := sUserName; end; function GetRegistryOrg_User(UserKeyType:string):string; var Myreg:Tregistry; RegString:string; begin MyReg:=Tregistry.Create; MyReg.RootKey:=HKEY_LOCAL_MACHINE; if (Win32Platform = VER_PLATFORM_WIN32_NT) then RegString:='Software/Microsoft/Windows NT/CurrentVersion' else RegString:='Software/Microsoft/Windows/CurrentVersion'; if MyReg.openkey(RegString,False) then begin if UpperCase(UserKeyType)='REGISTEREDORGANIZATION' then Result:= MyReg.readstring('RegisteredOrganization') else begin if UpperCase(UserKeyType)='REGISTEREDOWNER' then Result:= MyReg.readstring('RegisteredOwner') else Result:=''; end; end; MyReg.CloseKey; MyReg.Free; end; //获取操作系统版本号 function GetSysVersion:string; Var OSVI:OSVERSIONINFO; ObjSysVersion:string; begin OSVI.dwOSversioninfoSize:=Sizeof(OSVERSIONINFO); GetVersionEx(OSVI); ObjSysVersion:=IntToStr(OSVI.dwMinorVersion)+','+IntToStr(OSVI.dwMinorVersion)+',' +IntToStr(OSVI.dwBuildNumber)+','+IntToStr(OSVI.dwPlatformId)+',' +OSVI.szCSDVersion; if rightstr(ObjSysVersion,1)=',' then ObjSysVersion:=Substr(ObjSysVersion,1,length(ObjSysVersion)-1); Result:=ObjSysVersion; end; //Windows启动模式 function WinBootMode:string; begin case(GetSystemMetrics(SM_CLEANBOOT)) of 0:Result:='正常模式启动'; 1:Result:='安全模式启动'; 2:Result:='安全模式启动,但附带网络功能'; else Result:='错误:系统启动有问题。'; end; end; ////Windows ShutDown等 procedure WinShutDown(ShutWinType:PShutType; PForce:Boolean); var hToken, hProcess: THandle; tp, prev_tp: TTokenPrivileges; Len, Flags: DWORD; CanShutdown: Boolean; begin if Win32Platform = VER_PLATFORM_WIN32_NT then begin hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, GetCurrentProcessID); try if not OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit; finally CloseHandle(hProcess); end; try if not LookupPrivilegeValue('', 'SeShutdownPrivilege', tp.Privileges[0].Luid) then Exit; tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; if not AdjustTokenPrivileges(hToken, False, tp, SizeOf(prev_tp), prev_tp, Len) then Exit; finally CloseHandle(hToken); end; end; CanShutdown := True; // DoQueryShutdown(CanShutdown); if not CanShutdown then Exit; if PForce then Flags := EWX_FORCE else Flags := 0; case ShutWinType of UPowerOff: ExitWindowsEx(Flags or EWX_POWEROFF, 0); UShutdown: ExitWindowsEx(Flags or EWX_SHUTDOWN, 0); UReboot: ExitWindowsEx(Flags or EWX_REBOOT, 0); ULogoff: ExitWindowsEx(Flags or EWX_LOGOFF, 0); USuspend: SetSystemPowerState(True, PForce); UHibernate: SetSystemPowerState(False, PForce); end; end; //▎============================================================▎// //▎=====================⑦硬件功能函数=========================▎// //▎============================================================▎// function GetClientGUID:string; var myGuid:TGUID; ResultStr:string; begin CreateGuid(myGuid); ResultStr:=GUIDToString(myGuid); ResultStr:=Communal.Replace(ResultStr,'-','',False); ResultStr:=Communal.Replace(ResultStr,'{','',False); ResultStr:=Communal.Replace(ResultStr,'}','',False); Result:=Substr(ResultStr,1,30); end; // 声卡是否存在 function SoundCardExist: Boolean; begin Result := WaveOutGetNumDevs > 0; end; //* 获取磁盘序列号 function GetDiskSerial(DiskChar: Char): string; var SerialNum : pdword; a, b : dword; Buffer : array [0..255] of char; begin result := ''; if GetVolumeInformation(PChar(diskchar+':/'), Buffer, SizeOf(Buffer), SerialNum,a, b, nil, 0) then Result := IntToStr(SerialNum^); end; //*检查磁盘准备是否就绪 function DiskReady(Root: string) : Boolean; var Oem : CARDINAL ; Dw1,Dw2 : DWORD ; begin Oem := SetErrorMode( SEM_FAILCRITICALERRORS ) ; if LENGTH(Root) = 1 then Root := Root + '://'; Result := GetVolumeInformation( PCHAR( Root ), NIL,0,NIL, Dw1,Dw2, NIL,0 ) ; SetErrorMode( Oem ) ; end; //*检查驱动器A中磁盘的是否有文件及文件状态 function DriveState (driveletter: Char) : TDriveState; var mask: String[6]; sRec: TSearchRec; oldMode: Cardinal; retcode: Integer; begin oldMode := SetErrorMode(SEM_FAILCRITICALERRORS); mask:= '?:/*.*'; mask[1] := driveletter; {$I-} retcode := FindFirst (mask, faAnyfile, Srec); FindClose(Srec); {$I+} case retcode of 0 : Result := DSDISK_WITHFILES; //磁盘有文件 -18 : Result := DSEMPTYDISK; //好的空磁盘 -21, -3: Result := DSNODISK; //NT,Win31的错误代号 else Result := DSUNFORMATTEDDISK; end; SetErrorMode(oldMode); end; //写串口 procedure WritePortB( wPort : Word; bValue : Byte ); begin asm mov dx, wPort mov al, bValue out dx, al end; end; //读串口 function ReadPortB( wPort : Word ):Byte; begin asm mov dx, wPort in al, dx mov result, al end; end; //获知当前机器CPU的速率(MHz) function CPUSpeed: Double; const DelayTime = 500; var TimerHi, TimerLo: DWORD; PriorityClass, Priority: Integer; begin PriorityClass := GetPriorityClass(GetCurrentProcess); Priority := GetThreadPriority(GetCurrentThread); SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); Sleep(10); asm dw 310Fh mov TimerLo, eax mov TimerHi, edx end; Sleep(DelayTime); asm dw 310Fh sub eax, TimerLo sbb edx, TimerHi mov TimerLo, eax mov TimerHi, edx end; SetThreadPriority(GetCurrentThread, Priority); SetPriorityClass(GetCurrentProcess, PriorityClass); Result := TimerLo / (1000.0 * DelayTime); end; //获取CPU的标识ID号 function GetCPUID : TCPUID; assembler; register; asm PUSH EBX {Save affected register} PUSH EDI MOV EDI,EAX {@Resukt} MOV EAX,1 DW $A20F {CPUID Command} STOSD {CPUID[1]} MOV EAX,EBX STOSD {CPUID[2]} MOV EAX,ECX STOSD {CPUID[3]} MOV EAX,EDX STOSD {CPUID[4]} POP EDI {Restore registers} POP EBX end; //获取计算机的物理内存 function GetMemoryTotalPhys : Dword; var memStatus: TMemoryStatus; begin memStatus.dwLength := sizeOf ( memStatus ); GlobalMemoryStatus ( memStatus ); Result := memStatus.dwTotalPhys div 1024; end; //▎============================================================▎// //▎=====================⑧网络功能函数=========================▎// //▎============================================================▎// {* 获取网络计算机名称} function GetComputerName:string; var wVersionRequested : WORD; wsaData : TWSAData; p : PHostEnt; s : array[0..128] of char; begin try wVersionRequested := MAKEWORD(1, 1); //创建 WinSock WSAStartup(wVersionRequested, wsaData); //创建 WinSock GetHostName(@s,128); p:=GetHostByName(@s); Result:=p^.h_Name; finally WSACleanup; //释放 WinSock end; end; {* 获取计算机的IP地址} function GetHostIP:string; var wVersionRequested : WORD; wsaData : TWSAData; p : PHostEnt; s : array[0..128] of char; p2 : pchar; begin try wVersionRequested := MAKEWORD(1, 1); //创建 WinSock WSAStartup(wVersionRequested, wsaData); //创建 WinSock GetHostName(@s,128); p:=GetHostByName(@s); p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^); Result:= P2; finally WSACleanup; //释放 WinSock end; end; //▎============================================================▎// //▎=====================⑨汉字拼音功能函数=====================▎// //▎============================================================▎// // 取汉字的拼音 function GetHzPy(const AHzStr: string): string; const ChinaCode: array[0..25, 0..1] of Integer = ((1601, 1636), (1637, 1832), (1833, 2077), (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000), (2787, 3105), (3106, 3211), (3212, 3471), (3472, 3634), (3635, 3722), (3723, 3729), (3730, 3857), (3858, 4026), (4027, 4085), (4086, 4389), (4390, 4557), (9999, 0000), (9999, 0000), (4558, 4683), (4684, 4924), (4925, 5248), (5249, 5589)); var i, j, HzOrd: Integer; begin Result:=''; i := 1; while i <= Length(AHzStr) do begin if (AHzStr[i] >= #160) and (AHzStr[i + 1] >= #160) then begin HzOrd := (Ord(AHzStr[i]) - 160) * 100 + Ord(AHzStr[i + 1]) - 160; for j := 0 to 25 do begin if (HzOrd >= ChinaCode[j][0]) and (HzOrd <= ChinaCode[j][1]) then begin Result := Result + Char(Byte('A') + j); Break; end; end; Inc(i); end else Result := Result + AHzStr[i]; Inc(i); end; end; {* 判断一个字符串中有多少各汉字} function HowManyChineseChar(Const s:String):Integer; var SW:WideString; C:String; i, WCount:Integer; begin SW:=s; WCount:=0; For i:=1 to Length(SW) do begin c:=SW[i]; if Length(c)>1 then Inc(WCount); end; Result:=WCount; end; //▎============================================================▎// //▎==================⑩数据库功能函数及过程====================▎// //▎============================================================▎// //* 物理删除数据库(Db,Dbf)中的数据[着了删除标记的记录]} {function PackDbDbf(Var StatusMsg: String): Boolean; var rslt:DBIResult; szErrMsg:DBIMSG; pTblDesc:pCRTblDesc; bExclusive:Boolean; bActive:Boolean; isParadox,isDbase:Boolean; tempTableName:string; Props:CurProps;//保护口令 begin Result:=False; StatusMsg:=''; if TableType=ttDefault then begin tempTableName:=TableName; tempTableName:=Lowercase(tempTableName); isParadox:=(pos('.db',tempTableName)>0) and (tempTableName[length(tempTableName)]='b'); isDbase:=pos('.dbf',tempTableName)>0; end else begin isParadox:=TableType=ttParadox; isDbase:=TableType=ttDbase; end; if isparadox or isDbase then begin bExclusive:=Exclusive; bActive:=Active; DisableControls; // Close; Exculsive:=true; end else begin StatusMsg:='无效的数据表类型。'; Exit; end; if isParadox then begin if wwMemAvail(Sizeof(CRTblDesc)) then begin StatusMsg:='内存不足,压缩表失败。'; end else begin GetMem(pTblDesc,Sizeof(CRTblDesc)); fillchar(pTblDesc^,Sizeof(CRTblDesc),0); with pTblDesc^ do begin strCopy(szTblName,Tablename); strCopy(szTblType,szParadox); Active:=True; Check(DbiGetCursorProps(handle,Props));//检测是否右口令保护 bProtected:=props.bProtected; Active:=False; bPack:=True; end; Screen.Cursor:=crHourGlass; SetDBFlag(dbfOpened,True); rslt:=DBIdoRestructure(DBHandle,1,pTblDesc,nil,nil,nil,False); if rslt<>DBIERR_NONE then begin DBiGetErrorString(rslt,SzErrMsg); StatusMsg:=SzErrMsg; end else Result:=True; SetDBFlag(dbfOpened,False); FreeMem(pTblDesc,Sizeof(CRTlDesc)); Screen.Cursor:=crDefault; end; end else if isDbase then begin Screen.Cursor:=crHourGlass; OPen; rslt:=dbiPacktable(DBHandle,Handle,nil,nil,True); Screen.Cursor:=crDefault; if rslt<>DBIERR_NONE then begin DBiGetERRorString(rslt,szErrMsg); StatusMSg:=SzErrMsg; end else Result:=True; end; Close; Exculsive:=bExclusive; Active:=bActive; EnableControls; end;} {procedure CompactDb(DbName, NewDbName: string); var dao: OLEVariant; begin dao := CreateOleObject('DAO.DBEngine.35'); dao.CompactDatabase(DbName, NewDbName); end;} //修复Access表 procedure RepairDb(DbName: string); var Dao: OLEVariant; begin Dao := CreateOleObject('DAO.DBEngine.35'); Dao.RepairDatabase(DbName); end; //通过注册表创建ODBC配置[创建在系统DSN页下] function CreateODBCCfgInRegistry(ODBCSourceName:WideString; ServerName, DataBaseDescription:String):boolean; var Reg: TRegistry; LPT_systemDir:array [1..255] of char; P:Pchar; DriverString:String; begin Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; try try if not Reg.KeyExists('/Software/ODBC/ODBC.INI/'+trim(ODBCSourceName)) then begin //创建并打开主键。 if Reg.OpenKey('/Software/ODBC/ODBC.INI/'+trim(ODBCSourceName),True) then begin //写入键值 Reg.WriteString('DataBase', ODBCSourceName); Reg.WriteString('Description',Trim(DataBaseDescription)); GetSystemDirectory(@LPT_systemDir,255) ; P:=@LPT_systemDir; DriverString:=StrCat(P,Pchar('/SQLSRV32.DLL')) ; Reg.WriteString('Driver', DriverString); Reg.WriteString('LastUser', 'Administrator'); Reg.WriteString('Server', trim(ServerName)); Reg.WriteString('Trusted_Connection', 'Yes'); reg.CloseKey; end; //加入ODBCDataSource if Reg.OpenKey('/Software/ODBC/ODBC.INI/ODBC Data Sources/',True) then begin Reg.DeleteValue(ODBCSourceName); Reg.WriteString(ODBCSourceName, 'SQL Server'); Reg.CloseKey; end; end; Result:=True; except Result:=False; end; finally Reg.Free; end; end; function ADOConnectSysBase(Const Adocon:TadoConnection):boolean; {* 用Ado连接SysBase数据库函数} begin with Adocon do begin Close; LoginPrompt:=False; //若数据库不存在时,进行判断。。。。。。 ConnectionString:='Provider=MSDASQL.1;'+ 'Password="";'+ 'Persist Security Info=True;'+ 'Data Source=Sy_Finalact'; try KeepConnection:=True; Screen.Cursor:=crHourGlass; Connected:=True; Open; Screen.Cursor:=crDefault; ADOConnectSysBase:=True; except ADOConnectSysBase:=False; end; end; end; //Ado连接数据库函数 function ADOConnectLocalDB(Const Adocon:TAdoConnection;Const Dbname,DBServerName:String;ValidateMode:Integer):boolean; begin with Adocon do begin Close; LoginPrompt:=False; //若数据库不存在时,进行判断。。。。。。 if ValidateMode=0 then//使用Windows NT验证模式 ConnectionString:='Provider=SQLOLEDB.1;'+ 'Password="";'+ 'Integrated Security=SSPI;'+ //集成安全 'Persist Security Info=False;'+ 'User ID=sa;Initial Catalog='+''''+dbname+''''+';'+ 'Data Source='+''''+DBServerName+''''; if ValidateMode=1 then//使用SQL SERVER验证模式 ConnectionString:='Provider=SQLOLEDB.1;'+ 'Password="";'+ 'Persist Security Info=True;'+ 'User ID=sa;Initial Catalog='+''''+Dbname+''''+';'+ 'Data Source='+''''+DBServerName+''''; try KeepConnection:=True; Screen.Cursor:=crHourGlass; Connected:=True; Open; Screen.Cursor:=crDefault; ADOConnectLocalDB:=True; except ADOConnectLocalDB:=False; end; end; end; //Ado与ODBC共同连接数据库函数 function ADOODBCConnectLocalDB(Const Adocon:TAdoConnection;Const Dbname:String;ValidateMode:Integer):boolean; begin with Adocon do begin Close; LoginPrompt:=False; //若数据库不存在时,进行判断。。。。。。 if ValidateMode=0 then//使用Windows NT验证模式 ConnectionString:='Provider=MSDASQL.1;'+ 'Password="";'+ 'Persist Security Info=False;'+ 'User ID=sa;Data Source='+''''+DBName+''''+';'+ 'Initial Catalog='+''''+DBname+''''; if ValidateMode=1 then//使用SQL SERVER验证模式 ConnectionString:='Provider=MSDASQL.1;'+ 'Password="";'+ 'Persist Security Info=True;'+ 'User ID=sa;Data Source='+''''+DBName+''''+';'+ 'Initial Catalog='+''''+DBname+''''; try KeepConnection:=True; Screen.Cursor:=crHourGlass; Connected:=True; Open; Screen.Cursor:=crDefault; ADOODBCConnectLocalDB:=True; except ADOODBCConnectLocalDB:=False; end; end; end; ///在指定的数据库中建立表 function CreatTable(LpDataBaseName,LpTableName,LpSentence:string):Boolean;//建立新表 Var CreatTableQuery:TQuery; SQLsentence:string; Successed:Boolean;//成功否 begin Successed:=False; SQLsentence:='CREATE TABLE "'+ LpTableName +'" ' + LpSentence; CreatTableQuery:=TQuery.Create(nil); try try with CreatTableQuery do begin UniDirectional:=True; Active:=False; Sql.Clear; DataBaseName := LpDataBaseName; //数据库名 Sql.Add(SQLsentence); ExecSQL; Successed:=True; end; except MessageBox(Application.Handle,Pchar(' 在建立数据库 '+Trim(LpDataBaseName)+' 中的 '+Trim(LpTableName)+' 表出错,建立未能成功 !'),'建立失败',0+16); Successed:=False; end; finally CreatTableQuery.Free;//释放建立的Query if Successed then Result:=True//建立成功 else Result:=False;//建立失败 end; end; //在指定的表中新填字段 function AddField(LpFieldName:string; LpDataType: TFieldType; LpSize: Word):string;//建立新表 var Sentence,SQLsentence : string; begin Sentence:= ''; SQLsentence:=''; if LpFieldName = '' then raise EDBUpdateErr.Create('字段名不能为空'); if Pos(' ', LpFieldName) <> 0 then raise EDBUpdateErr.Create('字段名中不能含有空格字符'); if LpDataType = ftString then sentence := 'ADD '+LpFieldName+' Char('+ IntToStr( LpSize ) + ')'; if LpDataType = ftInteger then sentence := 'ADD '+LpFieldName+' Integer'; if LpDataType = ftSmallInt then sentence := 'ADD '+LpFieldName+' SmallInt'; if LpDataType = ftFloat then sentence := 'ADD '+LpFieldName+' Float('+ IntToStr( LpSize ) +',0)'; if LpDataType = ftDate then sentence := 'ADD '+LpFieldName+' Date'; if LpDataType = ftTime then sentence := 'ADD '+LpFieldName+' Time'; if LpDataType = ftDateTime then sentence := 'ADD '+LpFieldName+' TimeStamp'; if sentence = '' then raise EDBUpdateErr.Create('无效的字段类型'); if SQLSentence = '' then SQLSentence := sentence else SQLSentence := SQLSentence + ', ' + sentence; Result:=SQLSentence;//返回SQL句体 end; //在指定的表中删除字段 function KillField(LpFieldName:string):String;//删除表中的字段 var SQLsentence : string; begin if LpFieldName = '' then raise EDBUpdateErr.Create('字段名不能为空'); if Pos(' ', LpFieldName) <> 0 then raise EDBUpdateErr.Create('字段名中不能含有空格字符'); if SQLSentence = '' then SQLSentence := 'DROP COLUMN ' + LpFieldName else SQLSentence := SQLSentence + ', DROP ' + LpFieldName; Result:=SQLSentence; end; //修改表结构的SQL语句执行体 function AlterTableExec(LpDataBaseName,LpSentence:string):Boolean;//修改表结构 var AlterQueryTable:TQuery; Successed:Boolean;//成功否 begin Successed:=False; AlterQueryTable:= TQuery.Create(nil); try try with AlterQueryTable do begin DataBaseName:=LpDataBaseName;//数据库名 UniDirectional:=True; Active:=False; Sql.Clear; Sql.Add(LpSentence); ExecSQL; Successed:=True; end; except Successed:=False; end; finally AlterQueryTable.Free; if successed then Result:=True else Result:=False; end; end; //修改、添加、删除表结构时的SQL句体 function GetSQLSentence(LpTableName,LpSQLsentence:string): string; begin Result := 'ALTER TABLE "'+ LpTableName +'" ' + LpSQLSentence + ';'; end; //▎============================================================▎// //▎======================⑾进制函数及过程======================▎// //▎============================================================▎// //字符转化成十六进制 function StrToHex(AStr: string): string; var I : Integer; // Tmp: string; begin Result := ''; For I := 1 to Length(AStr) do begin Result := Result + Format('%2x', [Byte(AStr[I])]); end; I := Pos(' ', Result); While I <> 0 do begin Result[I] := '0'; I := Pos(' ', Result); end; end; //十六进制转化成字符 function HexToStr(AStr: string): string; var I : Integer; CharValue: Word; begin Result := ''; for I := 1 to Trunc(Length(Astr)/2) do begin Result := Result + ' '; CharValue := TransChar(AStr[2*I-1])*16 + TransChar(AStr[2*I]); Result[I] := Char(CharValue); end; end; function TransChar(AChar: Char): Integer; begin if AChar in ['0'..'9'] then Result := Ord(AChar) - Ord('0') else Result := 10 + Ord(AChar) - Ord('A'); end; //▎============================================================▎// //▎=====================⑿其它函数及过程=======================▎// //▎============================================================▎// // 输出限制在Min..Max之间 function TrimInt(Value, Min, Max: Integer): Integer; overload; begin if Value > Max then Result := Max else if Value < Min then Result := Min else Result := Value; end; // 输出限制在0..255之间 function IntToByte(Value: Integer): Byte; overload; asm OR EAX, EAX JNS @@Positive XOR EAX, EAX RET @@Positive: CMP EAX, 255 JBE @@OK MOV EAX, 255 @@OK: end; // 由TRect分离出坐标、宽高 procedure DeRect(Rect: TRect; var x, y, Width, Height: Integer); begin x := Rect.Left; y := Rect.Top; Width := Rect.Right - Rect.Left; Height := Rect.Bottom - Rect.Top; end; // 比较两个Rect function RectEqu(Rect1, Rect2: TRect): Boolean; begin Result := (Rect1.Left = Rect2.Left) and (Rect1.Top = Rect2.Top) and (Rect1.Right = Rect2.Right) and (Rect1.Bottom = Rect2.Bottom); end; // 产生TSize类型 function EnSize(cx, cy: Integer): TSize; begin Result.cx := cx; Result.cy := cy; end; // 计算Rect的宽度 function RectWidth(Rect: TRect): Integer; begin Result := Rect.Right - Rect.Left; end; // 计算Rect的高度 function RectHeight(Rect: TRect): Integer; begin Result := Rect.Bottom - Rect.Top; end; // 判断范围 function InBound(Value: Integer; Min, Max: Integer): Boolean; begin Result := (Value >= Min) and (Value <= Max); end; // 交换两个数 procedure CnSwap(var A, B: Byte); overload; var Tmp: Byte; begin Tmp := A; A := B; B := Tmp; end; procedure CnSwap(var A, B: Integer); overload; var Tmp: Integer; begin Tmp := A; A := B; B := Tmp; end; procedure CnSwap(var A, B: Single); overload; var Tmp: Single; begin Tmp := A; A := B; B := Tmp; end; procedure CnSwap(var A, B: Double); overload; var Tmp: Double; begin Tmp := A; A := B; B := Tmp; end; // 延时 procedure Delay(const uDelay: DWORD); var n: DWORD; begin n := GetTickCount; while ((GetTickCount - n) <= uDelay) do Application.ProcessMessages; end; // 在Win9X下让喇叭发声 procedure BeepEx(const Freq: WORD = 1200; const Delay: WORD = 1); const FREQ_SCALE = $1193180; var Temp: WORD; begin Temp := FREQ_SCALE div Freq; asm in al,61h; or al,3; out 61h,al; mov al,$b6; out 43h,al; mov ax,temp; out 42h,al; mov al,ah; out 42h,al; end; Sleep(Delay); asm in al,$61; and al,$fc; out $61,al; end; end; // 显示Win32 Api运行结果信息 procedure ShowLastError; var ErrNo: Integer; Buf: array[0..255] of Char; begin ErrNo := GetLastError; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, ErrNo, $400, Buf, 255, nil); if Buf = '' then StrCopy(@Buf, PChar(SUnknowError)); MessageBox(Application.Handle, PChar(string(Buf) + #10#13 + SErrorCode + IntToStr(ErrNo)), SCnInformation, MB_OK + MB_ICONINFORMATION); end; //将字体Font.Style写入INI文件 function writeFontStyle(FS: TFontStyles; inifile: string; write: boolean):string; var Mystyle : string; Myini : Tinifile; begin Mystyle := '['; if fsBold in FS then MyStyle := MyStyle + 'fsBold'; if fsItalic in FS then if MyStyle = '[' then MyStyle := MyStyle + 'fsItalic' else MyStyle := MyStyle + ',fsItalic'; if fsUnderline in FS then if MyStyle = '[' then MyStyle := MyStyle + 'fsUnderline' else MyStyle := MyStyle + ',fsUnderline'; if fsStrikeOut in FS then if MyStyle = '[' then MyStyle := MyStyle + 'fsStrikeOut' else MyStyle := MyStyle + ',fsStrikeOut'; MyStyle := MyStyle + ']'; if write then begin Myini := TInifile.Create(inifile); Myini.WriteString('FontStyle', 'style', MyStyle); Myini.free; end; Result := MyStyle; end; //从INI文件中读取字体Font.Style文件 function readFontStyle(inifile: string): TFontStyles; var MyFontStyle : TFontStyles; MyStyle : string; Myini : Tinifile; begin MyFontStyle := []; Myini := TInifile.Create(inifile); Mystyle := Myini.ReadString('Fontstyle', 'style', '[]'); if pos('fsBold', Mystyle) > 0 then MyFontStyle := MyFontStyle + [fsBold]; if Pos('fsItalic', MyStyle) > 0 then MyFontStyle := MyFontStyle + [fsItalic]; if Pos('fsUnderline', MyStyle) > 0 then MyFontStyle := MyFontStyle + [fsUnderline]; if Pos('fsStrikeOut', MyStyle) > 0 then MyFontStyle := MyFontStyle + [fsStrikeOut]; MyIni.free; Result := MyFontStyle; end; //*取得TMemo 控件当前光标的行和列信息到Tpoint中 //function ReadCursorPos(SourceMemo: TMemo): TPoint; function ReadCursorPos(SourceMemo: TMemo): string; var // Point: TPoint; X,Y:integer; begin // point.y := SendMessage(SourceMemo.Handle, EM_LINEFROMCHAR,SourceMemo.SelStart,0); // point.x := SourceMemo.SelStart- SendMessage(SourceMemo.Handle,EM_LINEINDEX,point.y,0); y := SendMessage(SourceMemo.Handle, EM_LINEFROMCHAR,SourceMemo.SelStart,0); x := SourceMemo.SelStart- SendMessage(SourceMemo.Handle,EM_LINEINDEX,y,0); Result := '行:'+inttostr(y+1)+' '+'列:'+inttostr(x+1); end; //*检查Tmemo控件能否Undo功能 function CanUndo(AMemo: TMemo): Boolean; begin Result :=AMemo.Perform(EM_CANUNDO, 0, 0)<>0; end; //* 实现Undo功能 procedure Undo(Amemo: Tmemo); begin Amemo.Perform(EM_UNDO, 0, 0); end; //* 实现ComBoBox自动下拉 procedure AutoListDisplay(ACombox:TComboBox); begin SendMessage(ACombox.handle, CB_SHOWDROPDOWN, Integer(True), 0); end; //* 小写金额转换为大写 function UpperMoney(small:real):string; var SmallMonth,BigMonth:string; wei1,qianwei1:string[2]; qianwei,dianweizhi,qian:integer; ObjSmall:real; begin {------- 修改参数令值更精确 -------} ObjSmall:=Abs(small); qianwei:=-2;{小数点后的位置,需要的话也可以改动-2值} Smallmonth:=formatfloat('0.00',ObjSmall);{转换成货币形式,需要的话小数点后加多几个零} {---------------------------------} dianweizhi :=pos('.',Smallmonth);{小数点的位置} for qian:=length(Smallmonth) downto 1 do{循环小写货币的每一位,从小写的右边位置到左边} begin if qian<>dianweizhi then{如果读到的不是小数点就继续} begin case strtoint(copy(Smallmonth,qian,1)) of{位置上的数转换成大写} 1:wei1:='壹'; 2:wei1:='贰'; 3:wei1:='叁'; 4:wei1:='肆'; 5:wei1:='伍'; 6:wei1:='陆'; 7:wei1:='柒'; 8:wei1:='捌'; 9:wei1:='玖'; 0:wei1:='零'; end; case qianwei of{判断大写位置,可以继续增大到real类型的最大值} -3:qianwei1:='厘'; -2:qianwei1:='分'; -1:qianwei1:='角'; 0 :qianwei1:='元'; 1 :qianwei1:='拾'; 2 :qianwei1:='佰'; 3 :qianwei1:='千'; 4 :qianwei1:='万'; 5 :qianwei1:='拾'; 6 :qianwei1:='佰'; 7 :qianwei1:='千'; 8 :qianwei1:='亿'; 9 :qianwei1:='十'; 10:qianwei1:='佰'; 11:qianwei1:='千'; end; inc(qianwei); if Small<0 then BigMonth :='负'+wei1+qianwei1+BigMonth {组合成大写金额} else BigMonth :=wei1+qianwei1+BigMonth {组合成大写金额} end; end; Result:=BigMonth; end; //利用系统时间产生随机数 function Myrandom(Num: Integer): integer; var T: _SystemTime; X: integer; I: integer; begin Result := 0; If Num = 0 then Exit;; GetSystemTime(T); X := Trunc(T.wMilliseconds/10) * T.wSecond * 1231; X := X + random(1); if X<>0 then X := -X; X := Random(X); X := X mod num; for I := 0 to X do X := Random(Num); Result := X; end; //打开输入法 procedure OpenIME(ImeName: string); var i: integer; MyHKL: hkl; begin if ImeName <> '' then begin if Screen.Imes.Count <> 0 then begin i := Screen.Imes.IndexOf(ImeName); if i >= 0 then MyHKL := hkl(Screen.Imes.Objects[i]); ActivateKeyboardLayout(MyHKL, KLF_ACTIVATE); end; end; end; //关闭输入法 procedure CloseIME; var MyHKL: hkl; begin MyHKL := GetKeyboardLayout(0); if ImmIsIme(MyHKL) then ImmSimulateHotKey(Application.Handle, IME_CHOTKEY_IME_NONIME_TOGGLE); end; //打开中文输入法 procedure ToChinese(hWindows: THandle; bChinese: boolean); begin if ImmIsIME(GetKeyboardLayOut(0)) <> bChinese then ImmSimulateHotKey(hWindows, IME_THotKey_IME_NonIME_Toggle); end; //数据备份 procedure BackUpData(LpBackDispMessTitle:String); var i,j:integer; Source,Dest:array[0..200]of char; s1:string; Lp:_SHFILEOPSTRUCTA; Success:Integer; begin if MessageBox(Application.Handle,' 您确认要备份数据吗?','询问窗口',4+32+256)=6 then begin with LP do begin Lp.wnd:=Application.Handle; wFunc:=FO_COPY; s1:='DATA/*.*'; i:=Length(s1); StrCopy(Source,PChar(s1)); Source[i]:=#0; Source[i+1]:=#0; Source[i+2]:=#0; pFrom:=Source; s1:='BACKUP'; j:=Length(s1); StrCopy(Dest,PChar(s1)); Dest[j]:='/'; Dest[j+1]:=#0; Dest[j+2]:=#0; Dest[j+3]:=#0; pTo:=Dest; fFlags:=FOF_ALLOWUNDO; fAnyOperationsAborted:=False; lpszProgressTitle:=PChar(LpBackDispMessTitle); end; Success:=SHFileOperation(LP); case Success of 0: MessageBox(Application.Handle,' 所有数据已备份完成 !','提示窗口',0+48); 117: MessageBox(Application.Handle,Pchar(' 您未创建“'+ExtractFilePath(Application.ExeName)+'BACKUP”目录所以不能完成数据备份 !'),'提示窗口',0+16) else MessageBox(Application.Handle,' 在备份数据的过程中被用户中途中断 !','提示窗口',0+16); end; end; end; //////////////////////////////////////////////////////////////////////////////// // // // 从文件中读取Ado连接字串 // // // //////////////////////////////////////////////////////////////////////////////// function GetConnectionString(DataBaseName:string):string; var FileStringList:Tstringlist; TempString: ansistring; TheReg:TRegistry;KeyName,fAppPath:string; i:Integer; begin TheReg:=TRegistry.Create; try TheReg.RootKey:=HKEY_LOCAL_MACHINE; KeyName:='Software/政府采购管理系统'; if TheReg.OpenKey(KeyName,False) then fAppPath:=TheReg.ReadString('ApplicationPath'); finally TheReg.Free; end; FileStringList:=Tstringlist.Create; //先判断connection.txt是否存在,存在就调入 if FileExists(fAppPath+'/connection.txt') then FileStringList.LoadFromFile(fAppPath+'/connection.txt') else begin application.MessageBox('在系统所在目录中没有检测到连接文件(connection.txt),无法启动系统。','提示',MB_IconError+mb_ok); Result:=''; FileStringList.Free; Exit; end; //组成一个符串,好进行处理。 TempString:=''; for i:=0 to FileStringList.Count-1 do begin TempString:=TempString+FileStringList.strings[i]; end; {连接指定名称的数据库} TempString:=Replace(TempString,'DataBaseName',DataBaseName,False); Result:=TempString; end; {------------------------------------------------------------------------------} {function GetRemoteServerName:返回远程服务器的机器名称} function GetRemoteServerName:string; var iniServer:TIniFile; TheReg:TRegistry;KeyName,fAppPath,RServerName:string; begin TheReg:=TRegistry.Create; try TheReg.RootKey:=HKEY_LOCAL_MACHINE; KeyName:='Software/政府采购管理系统'; if TheReg.OpenKey(KeyName,False) then fAppPath:=TheReg.ReadString('ApplicationPath'); finally TheReg.Free; end; {创建远程服务器名称} try iniServer:=TIniFile.Create(fAppPath+'/RemoteServerName.ini'); with iniServer do RServerName:=ReadString('Option','RServerName',''); iniServer.Free; except raise exception.Create('致命错误:未找到包含Com服务器配置的信息文件,初始化失败。'); end; Result:=RServerName; end; initialization WndLong := GetWindowLong(Application.Handle, GWL_EXSTYLE); end.