delphi 实用函数  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 实用函数


{▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎}

{▎        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;

{* |


|}


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.



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.053024053573608 seconds