打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
delphi公用函数
  • {*******************************************************} 
  • {                                                       }  
  • {             Delphi公用函数单元                        }  
  • {                                                       }  
  • {        版权所有 (C) 2008                           }  
  • {                                                       }  
  • {*******************************************************}  
  • unit YzDelphiFunc;  
  •   
  • interface  
  •   
  • uses  
  •   ComCtrls, Forms, Windows, Classes, SysUtils, ComObj, ActiveX, ShlObj, Messages,  
  •   Graphics, Registry, Dialogs, Controls, uProcess, uCpuUsage, StrUtils, CommCtrl,  
  •   jpeg, WinInet, ShellAPI, SHFolder, ADODB, WinSock;  
  •   
  • { 保存日志文件 }  
  • procedure YzWriteLogFile(Msg: String);  
  •   
  • { 延时函数,单位为毫秒 }  
  • procedure YzDelayTime(MSecs: Longint);  
  •   
  • { 判断字符串是否为数字 }  
  • function YzStrIsNum(Str: string):boolean;  
  •   
  • { 判断文件是否正在使用 }  
  • function YzIsFileInUse(fName: string): boolean;  
  •   
  • { 删除字符串列表中的空字符串 }  
  • procedure YzDelEmptyChar(AList: TStringList);  
  •   
  • { 删除文件列表中的"Thumbs.db"文件 }  
  • procedure YzDelThumbsFile(AList: TStrings);  
  •   
  • { 返回一个整数指定位数的带"0"字符串 }  
  • function YzIntToZeroStr(Value, ALength: Integer): string;  
  •   
  • { 取日期年份分量 }  
  • function YzGetYear(Date: TDate): Integer;  
  •   
  • { 取日期月份分量 }  
  • function YzGetMonth(Date: TDate): Integer;  
  •   
  • { 取日期天数分量 }  
  • function YzGetDay(Date: TDate): Integer;  
  •   
  • { 取时间小时分量 }  
  • function YzGetHour(Time: TTime): Integer;  
  •   
  • { 取时间分钟分量 }  
  • function YzGetMinute(Time: TTime): Integer;  
  •   
  • { 取时间秒钟分量 }  
  • function YzGetSecond(Time: TTime): Integer;  
  •   
  • { 返回时间分量字符串 }  
  • function YzGetTimeStr(ATime: TTime;AFlag: string): string;  
  •   
  • { 返回日期时间字符串 }  
  • function YzGetDateTimeStr(ATime: TTime;ADate: TDate): string;  
  •   
  • { 获取计算机名称 }  
  • function YzGetComputerName(): string;  
  •   
  • { 通过窗体子串查找窗体 }  
  • procedure YzFindSpecWindow(ASubTitle: string);  
  •   
  • { 判断进程CPU占用率 }  
  • procedure YzJudgeCPU(ProcessName: string;CPUUsage: Single);  
  •   
  • { 分割字符串 }  
  • procedure YzSeparateTerms(Source: string;Separator: Char;Terms: TStringList);  
  •   
  • { 切换页面控件的活动页面 }  
  • procedure YzGotoNewPage(AOwerPage: TPageControl;ANewPage: TTabSheet);  
  •   
  • { 设置页面控件标签的可见性 }  
  • procedure YzSetTableVisible(PageControl: TPageControl;ShowFlag: Boolean);  
  •   
  • { 根据产品名称获取产品编号 }  
  • function YzGetLevelCode(AName:string;ProductList: TStringList): string;  
  •   
  • { 取文件的主文件名 }  
  • function YzGetMainFileName(AFileName: string): string;  
  •   
  • { 按下一个键 }  
  • procedure YzPressOneKey(AByteCode: Byte);overload;  
  •   
  • { 按下一个指定次数的键 }  
  • procedure YzPressOneKey(AByteCode: Byte;ATimes: Integer);overload;  
  •   
  • { 按下二个键 }  
  • procedure YzPressTwoKeys(AFirstByteCode, ASecByteCode: Byte);  
  •   
  • { 按下三个键 }  
  • procedure YzPressThreeKeys(AFirstByteCode, ASecByteCode, AThirdByteCode: Byte);  
  •   
  • { 创建桌面快捷方式 }  
  • procedure YzCreateShortCut(const sPath: string; sShortCutName: WideString);  
  •   
  • { 删除桌面快捷方式 }  
  • procedure YzDeleteShortCut(sShortCutName: WideString);  
  •   
  • { 通过光标位置进行鼠标左键单击 }  
  • procedure YzMouseLeftClick(X, Y: Integer);overload;  
  •   
  • { 鼠标左键双击 }  
  • procedure YzMouseDoubleClick(X, Y: Integer);  
  •   
  • { 通过窗口句柄进行鼠标左键单击 }  
  • procedure YzMouseLeftClick(lpClassName, lpWindowName: PAnsiChar);overload;  
  •   
  • { 通过光标位置查找窗口句柄 }  
  • function YzWindowFromPoint(X, Y: Integer): THandle;  
  •   
  • { 等待窗口在指定时间后出现 }  
  • function YzWaitWindowExist(lpClassName, lpWindowName: PAnsiChar;  
  •   ASecond: Integer = 0): THandle;overload;  
  •   
  • { 通光标位置,窗口类名与标题查找窗口是否存在 }  
  • function YzWaitWindowExist(X, Y: Integer;AClassName, AWinName: string;  
  •   ASecond: Integer = 0):THandle; overload;  
  •   
  • { 等待指定窗口消失 }  
  • procedure YzWaitWindowClose(lpClassName, lpWindowName: PAnsiChar;  
  •   ASecond: Integer = 0);  
  •   
  • { 通过窗口句柄设置文本框控件文本 }  
  • procedure YzSetEditText(lpClassName, lpWindowName: PAnsiChar;  
  •   AText: string);overload;  
  •   
  • { 通过光标位置设置文本框控件文本 }  
  • procedure YzSetEditText(X, Y: Integer;AText: string);overload;  
  •   
  • { 获取Window操作系统语言 }  
  • function YzGetWindowsLanguageStr: String;  
  •   
  • { 清空动态数组 }  
  • procedure YzDynArraySetZero(var A);  
  •   
  • { 动态设置屏幕分辨率 }  
  • function YzDynamicResolution(X, Y: WORD): Boolean;  
  •   
  • { 检测系统屏幕分辨率 }  
  • function YzCheckDisplayInfo(X, Y: Integer): Boolean;  
  •   
  • type  
  •   TFontedControl = class(TControl)  
  •   public  
  •     property Font;  
  •   end;  
  •   TFontMapping = record  
  •     SWidth : Integer;  
  •     SHeight: Integer;  
  •     FName: string;  
  •     FSize: Integer;  
  •   end;  
  •   
  •   procedure YzFixForm(AForm: TForm);  
  •   procedure YzSetFontMapping;  
  •   
  • {--------------------------------------------------- 
  •  以下是关于获取系统软件卸载的信息的类型声明和函数 
  •  ----------------------------------------------------}  
  • type  
  •   TUninstallInfo = array of record  
  •     RegProgramName: string;  
  •     ProgramName   : string;  
  •     UninstallPath : string;  
  •     Publisher     : string;  
  •     PublisherURL  : string;  
  •     Version       : string;  
  •     HelpLink      : string;  
  •     UpdateInfoURL : string;  
  •     RegCompany    : string;  
  •     RegOwner      : string;  
  •   end;  
  •   
  • { GetUninstallInfo 返回系统软件卸载的信息 }  
  • function YzGetUninstallInfo : TUninstallInfo;  
  •   
  • { 检测Java安装信息 }  
  • function YzCheckJavaInfo(AUninstallInfo: TUninstallInfo;CheckJava6 : Boolean = False): Boolean;  
  •   
  • { 窗口自适应屏幕大小 }  
  • procedure YzAdjustForm(Form: TForm;const OrgWidth, OrgHeight: integer);  
  •   
  • { 设置窗口为当前窗体 }  
  • procedure YzBringMyAppToFront(AppHandle: THandle);  
  •   
  • { 获取文件夹大小 }  
  • function YzGetDirSize(Dir: string;SubDir: Boolean): LongInt;  
  •   
  • { 获取文件夹文件数量 }  
  • function YzGetDirFiles(Dir: string;SubDir: Boolean): LongInt;  
  •   
  • { 获取文件大小(KB) }  
  • function YzGetFileSize(const FileName: String): LongInt;  
  •   
  • { 获取文件大小(字节) }  
  • function YzGetFileSize_Byte(const FileName: String): LongInt;  
  •   
  • { 算术舍入法的四舍五入取整函数 }  
  • function YzRoundEx (const Value: Real): LongInt;  
  •   
  • { 弹出选择目录对话框 }  
  • function YzSelectDir(const iMode: integer;const sInfo: string): string;  
  •   
  • { 获取指定路径下文件夹的个数 }  
  • procedure YzListFolders(const Path: String; const ShowPath: Boolean;var List: TStrings);  
  •   
  • { 禁用窗器控件的所有子控件 }  
  • procedure YzSetSubCtlState(AOwer: TWinControl;AState: Boolean);  
  •   
  • { 模拟键盘按键操作(处理字节码) }  
  • procedure YzFKeyent(byteCard: byte); overload;  
  •   
  • { 模拟键盘按键操作(处理字符串 }  
  • procedure YzFKeyent(strCard: string); overload;  
  •   
  • { 锁定窗口位置 }  
  • procedure YzLockWindow(ClassName,WinName: PChar;poX,poY: Integer);  
  •   
  • {   注册一个DLL形式或OCX形式的OLE/COM控件 
  •     参数strOleFileName为一个DLL或OCX文件名, 
  •     参数OleAction表示注册操作类型,1表示注册,0表示卸载 
  •     返回值True表示操作执行成功,False表示操作执行失败 
  • }  
  • function YzRegisterOleFile (strOleFileName: STRING;OleAction: Byte): BOOLEAN;  
  •   
  • function YzListViewColumnCount(mHandle: THandle): Integer;  
  •   
  • function YzGetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;  
  •   
  • { 删除目录树 }  
  • function YzDeleteDirectoryTree(Path: string): boolean;  
  •   
  • { Jpg格式转换为bmp格式 }  
  • function JpgToBmp(Jpg: TJpegImage): TBitmap;  
  •   
  • { 设置程序自启动函数 }  
  • function YzSetAutoRun(AFilePath: string;AFlag: Boolean): boolean;  
  •   
  • { 检测URL地址是否有效 }  
  • function YzCheckUrl(url: string): Boolean;  
  •   
  • { 获取程序可执行文件名 }  
  • function YzGetExeFName: string;  
  •   
  • { 目录浏览对话框函数 }  
  • function YzBrowseFolder(AOwer: TWinControl;ATitle: string):string;  
  •   
  • { 重启计算机 }  
  • function YzShutDownSystem(AFlag: Integer):BOOL;  
  •   
  • { 程序运行后删除自身 }  
  • procedure YzDeleteSelf;  
  •   
  • { 程序重启 }  
  • procedure YzAppRestart;  
  •   
  • { 压缩Access数据库 }  
  • function YzCompactAccessDB(const AFileName, APassWord: string): Boolean;  
  •   
  • { 标题:获取其他进程中TreeView的文本 }  
  • function YzTreeNodeGetNext(mHandle: THandle; mTreeItem: HTreeItem): HTreeItem;  
  • function YzTreeNodeGetLevel(mHandle: THandle; mTreeItem: HTreeItem): Integer;  
  • function YzGetTreeViewText(mHandle: THandle; mStrings: TStrings): Boolean;  
  •   
  • { 获取本地Application Data目录路径 }  
  • function YzLocalAppDataPath : string;  
  •   
  • { 获取Windows当前登录的用户名 }  
  • function YzGetWindwosUserName: String;  
  •   
  • {枚举托盘图标 }  
  • function YzEnumTrayNotifyWnd(AFindList: TStringList;ADestStr: string): BOOL;  
  •   
  • { 获取SQL Server用户数据库列表 }  
  • procedure YzGetSQLServerDBList(ADBHostIP, ALoginPwd: string;ADBList: TStringList);  
  •   
  • { 读取据库中所有的表 }  
  • procedure YzGetTableList(ConncetStr: string;ATableList: TStringList);  
  •   
  • { 将域名解释成IP地址 }  
  • function YzDomainToIP(HostName: string): string;  
  •   
  • { 等待进程结束 }  
  • procedure YzWaitProcessExit(AProcessName: string);  
  •   
  • { 移去系统托盘失效图标 }  
  • procedure YzRemoveDeadIcons();  
  •   
  • { 转移程序占用内存至虚拟内存 }  
  • procedure YzClearMemory;  
  •   
  • { 检测允许试用的天数是否已到期 }  
  • function YzCheckTrialDays(AllowDays: Integer): Boolean;  
  •   
  • { 指定长度的随机小写字符串函数 }  
  • function YzRandomStr(aLength: Longint): string;  
  •   
  • var  
  •   FontMapping : array of TFontMapping;  
  •   
  • implementation  
  •   
  • uses  
  •   uMain;  
  •   
  • { 保存日志文件 }  
  • procedure YzWriteLogFile(Msg: String);  
  • var  
  •   FileStream: TFileStream;  
  •   LogFile   : String;  
  • begin  
  •   try  
  •     { 每天一个日志文件 }  
  •     Msg := '[' + DateTimeToStr(Now)+ '] '+ Msg;  
  •     LogFile := ExtractFilePath(Application.ExeName) + '/Logs/' + DateToStr(Now) + '.log';  
  •     if not DirectoryExists(ExtractFilePath(LogFile)) then  
  •       CreateDir(ExtractFilePath(LogFile));  
  •     if FileExists(LogFile) then  
  •       FileStream := TFileStream.Create(LogFile, fmOpenWrite or fmShareDenyNone)  
  •     else  
  •       FileStream:=TFileStream.Create(LogFile,fmCreate or fmShareDenyNone);  
  •     FileStream.Position:=FileStream.Size;  
  •     Msg := Msg + #13#10;  
  •     FileStream.Write(PChar(Msg)^, Length(Msg));  
  •     FileStream.Free;  
  •   except  
  •   end;  
  • end;  
  •   
  • { 延时函数,单位为毫秒 }  
  • procedure YZDelayTime(MSecs: Longint);  
  • var  
  •   FirstTickCount, Now: Longint;  
  • begin  
  •   FirstTickCount := GetTickCount();  
  •   repeat  
  •     Application.ProcessMessages;  
  •     Now := GetTickCount();  
  •   until (Now - FirstTickCount>=MSecs) or (Now < FirstTickCount);  
  • end;  
  •   
  • { 判断字符串是否为数字 }  
  • function YzStrIsNum(Str: string):boolean;  
  • var  
  •   I: integer;  
  • begin  
  •   if Str = '' then  
  •   begin  
  •     Result := False;  
  •     Exit;  
  •   end;  
  •   for I:=1 to length(str) do  
  •     if not (Str[I] in ['0'..'9']) then  
  •     begin  
  •       Result := False;  
  •       Exit;  
  •     end;  
  •   Result := True;  
  • end;  
  •   
  • { 判断文件是否正在使用 }  
  • function YzIsFileInUse(fName: string): boolean;  
  • var  
  •   HFileRes: HFILE;  
  • begin  
  •   Result := false;  
  •   if not FileExists(fName) then exit;  
  •   HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0nil,  
  •     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  
  •   Result := (HFileRes = INVALID_HANDLE_VALUE);  
  •   if not Result then CloseHandle(HFileRes);  
  • end;  
  •   
  • { 删除字符串列表中的空字符串 }  
  • procedure YzDelEmptyChar(AList: TStringList);  
  • var  
  •   I: Integer;  
  •   TmpList: TStringList;  
  • begin  
  •   TmpList := TStringList.Create;  
  •   for I := 0 to AList.Count - 1 do  
  •     if AList.Strings[I] <> '' then TmpList.Add(AList.Strings[I]);  
  •   AList.Clear;  
  •   AList.Text := TmpList.Text;  
  •   TmpList.Free;  
  • end;  
  •   
  • { 删除文件列表中的"Thumbs.db"文件 }  
  • procedure YzDelThumbsFile(AList: TStrings);  
  • var  
  •   I: Integer;  
  •   TmpList: TStringList;  
  • begin  
  •   TmpList := TStringList.Create;  
  •   for I := 0 to AList.Count - 1 do  
  •     if ExtractFileName(AList.Strings[I]) <> 'Thumbs.db' then  
  •       TmpList.Add(AList.Strings[I]);  
  •   AList.Clear;  
  •   AList.Text := TmpList.Text;  
  •   TmpList.Free;  
  • end;  
  •   
  • {------------------------------------------------------------- 
  •   功能:    返回一个整数指定位数的带"0"字符串 
  •   参数:    Value:要转换的整数 ALength:字符串长度 
  •   返回值:  string 
  • --------------------------------------------------------------}  
  • function YzIntToZeroStr(Value, ALength: Integer): string;  
  • var  
  •   I, ACount: Integer;  
  • begin  
  •   Result := '';  
  •   ACount := Length(IntToStr(Value));  
  •   if ACount >= ALength then Result := IntToStr(Value)  
  •   else  
  •   begin  
  •     for I := 1 to ALength-ACount do  
  •       Result := Result + '0';  
  •     Result := Result + IntToStr(Value)  
  •   end;  
  • end;  
  •   
  • { 取日期年份分量 }  
  • function YzGetYear(Date: TDate): Integer;  
  • var  
  •   y, m, d: WORD;  
  • begin  
  •   DecodeDate(Date, y, m, d);  
  •   Result := y;  
  • end;  
  •   
  • { 取日期月份分量 }  
  • function YzGetMonth(Date: TDate): Integer;  
  • var  
  •   y, m, d: WORD;  
  • begin  
  •   DecodeDate(Date, y, m, d);  
  •   Result := m;  
  • end;  
  •   
  • { 取日期天数分量 }  
  • function YzGetDay(Date: TDate): Integer;  
  • var  
  •   y, m, d: WORD;  
  • begin  
  •   DecodeDate(Date, y, m, d);  
  •   Result := d;  
  • end;  
  •   
  • { 取时间小时分量 }  
  • function YzGetHour(Time: TTime): Integer;  
  • var  
  •   h, m, s, ms: WORD;  
  • begin  
  •   DecodeTime(Time, h, m, s, ms);  
  •   Result := h;  
  • end;  
  •   
  • { 取时间分钟分量 }  
  • function YzGetMinute(Time: TTime): Integer;  
  • var  
  •   h, m, s, ms: WORD;  
  • begin  
  •   DecodeTime(Time, h, m, s, ms);  
  •   Result := m;  
  • end;  
  •   
  • { 取时间秒钟分量 }  
  • function YzGetSecond(Time: TTime): Integer;  
  • var  
  •   h, m, s, ms: WORD;  
  • begin  
  •   DecodeTime(Time, h, m, s, ms);  
  •   Result := s;  
  • end;  
  •   
  • { 返回时间分量字符串 }  
  • function YzGetTimeStr(ATime: TTime;AFlag: string): string;  
  • var  
  •   wTimeStr: string;  
  •   FH, FM, FS, FMS: WORD;  
  • const  
  •   HOURTYPE    = 'Hour';  
  •   MINUTETYPE  = 'Minute';  
  •   SECONDTYPE  = 'Second';  
  •   MSECONDTYPE = 'MSecond';  
  • begin  
  •   wTimeStr := TimeToStr(ATime);  
  •   if Pos('上午', wTimeStr) <> 0 then  
  •     wTimeStr := Copy(wTimeStr, Pos('上午', wTimeStr) + 410)  
  •   else if Pos('下午', wTimeStr) <> 0 then  
  •     wTimeStr := Copy(wTimeStr, Pos('下午', wTimeStr) + 410);  
  •   DecodeTime(ATime, FH, FM, FS, FMS);  
  •   if AFlag = HOURTYPE then  
  •   begin  
  •     { 如果是12小时制则下午的小时分量加12 }  
  •     if Pos('下午', wTimeStr) <> 0 then  
  •       Result := YzIntToZeroStr(FH + 122)  
  •     else  
  •       Result := YzIntToZeroStr(FH, 2);  
  •   end;  
  •   if AFlag = MINUTETYPE  then Result := YzIntToZeroStr(FM, 2);  
  •   if AFlag = SECONDTYPE  then Result := YzIntToZeroStr(FS, 2);  
  •   if AFlag = MSECONDTYPE then Result := YzIntToZeroStr(FMS, 2);  
  • end;  
  •   
  • { 返回日期时间字符串 }  
  • function YzGetDateTimeStr(ATime: TTime;ADate: TDate): string;  
  • var  
  •   wYear, wMonth, wDay: string;  
  •   wHour, wMinute, wSecond: string;  
  • begin  
  •   wYear := RightStr(YzIntToZeroStr(YzGetYear(ADate), 4), 2);  
  •   wMonth := YzIntToZeroStr(YzGetMonth(ADate), 2);  
  •   wDay := YzIntToZeroStr(YzGetDay(ADate), 2);  
  •   
  •   wHour := YzGetTimeStr(ATime, 'Hour');  
  •   wMinute := YzGetTimeStr(ATime, 'Minute');  
  •   wSecond := YzGetTimeStr(ATime, 'Second');  
  •   
  •   Result := wYear + wMonth + wDay + wHour + wMinute + wSecond;  
  • end;  
  •   
  • { 通过窗体子串查找窗体 }  
  • procedure YzFindSpecWindow(ASubTitle: string);  
  •   
  •   function EnumWndProc(AWnd: THandle;AWinName: string): Boolean;stdcall;  
  •   var  
  •     WindowText: array[0..255of Char;  
  •     WindowStr: string;  
  •   begin  
  •     GetWindowText(AWnd, WindowText, 255);  
  •     WindowStr := StrPas(WindowText);  
  •     WindowStr := COPY(WindowStr, 1, StrLen(PChar(AWinName)));  
  •     if CompareText(AWinName, WindowStr) = 0 then  
  •     begin  
  •       SetForegroundWindow(AWnd);  
  •       Result := False; Exit;  
  •     end;  
  •     Result := True;  
  •   end;  
  •   
  • begin  
  •   EnumWindows(@EnumWndProc, LongInt(@ASubTitle));  
  •   YzDelayTime(1000);  
  • end;  
  •   
  • { 获取计算机名称 }  
  • function YzGetComputerName(): string;  
  • var  
  •   pcComputer: PChar;  
  •   dwCSize: DWORD;  
  • begin  
  •   dwCSize := MAX_COMPUTERNAME_LENGTH + 1;  
  •   Result := '';  
  •   GetMem(pcComputer, dwCSize);  
  •   try  
  •     if Windows.GetComputerName(pcComputer, dwCSize) then  
  •       Result := pcComputer;  
  •   finally  
  •     FreeMem(pcComputer);  
  •   end;  
  • end;  
  •   
  • { 判断进程CPU占用率 }  
  • procedure YzJudgeCPU(ProcessName: string;CPUUsage: Single);  
  • var  
  •   cnt: PCPUUsageData;  
  •   usage: Single;  
  • begin  
  •   cnt := wsCreateUsageCounter(FindProcess(ProcessName));  
  •   while True do  
  •   begin  
  •     usage := wsGetCpuUsage(cnt);  
  •     if usage <= CPUUsage then  
  •     begin  
  •       wsDestroyUsageCounter(cnt);  
  •       YzDelayTime(2000);  
  •       Break;  
  •     end;  
  •     YzDelayTime(10);  
  •     Application.ProcessMessages;  
  •   end;  
  • end;  
  •   
  • { 分割字符串 }  
  • procedure YzSeparateTerms(Source: string;Separator: Char;Terms: TStringList);  
  • var  
  •   TmpStr: string;  
  •   PO: integer;  
  • begin  
  •   Terms.Clear;  
  •   if Length(Source) = 0 then Exit;   { 长度为0则退出 }  
  •   PO := Pos(Separator, Source);  
  •   if PO = 0 then  
  •   begin  
  •     Terms.Add(Source);  
  •     Exit;  
  •   end;  
  •   while PO <> 0 do  
  •   begin  
  •     TmpStr := Copy(Source, 1, PO - 1);{ 复制字符 }  
  •     Terms.Add(TmpStr);                { 添加到列表 }  
  •     Delete(Source, 1, PO);            { 删除字符和分割符 }  
  •     PO := Pos(Separator, Source);     { 查找分割符 }  
  •   end;  
  •   if Length(Source) > 0 then  
  •     Terms.Add(Source);                { 添加剩下的条目 }  
  • end;  
  •   
  • { 切换页面控件的活动页面 }  
  • procedure YzGotoNewPage(AOwerPage: TPageControl;ANewPage: TTabSheet);  
  • begin  
  •   if AOwerPage.ActivePage <> ANewPage then AOwerPage.ActivePage := ANewPage;  
  • end;  
  •   
  • { 设置页面控件标签的可见性 }  
  • procedure YzSetTableVisible(PageControl: TPageControl;ShowFlag: Boolean);  
  • var  
  •   I: Integer;  
  • begin  
  •   for I := 0 to PageControl.PageCount -1 do  
  •     PageControl.Pages[I].TabVisible := ShowFlag;  
  • end;  
  •   
  • { 根据产品名称获取产品编号 }  
  • function YZGetLevelCode(AName:string;ProductList: TStringList): string;  
  • var  
  •   I: Integer;  
  •   TmpStr: string;  
  • begin  
  •   Result := '';  
  •   if ProductList.Count <= 0 then Exit;  
  •   for I := 0 to ProductList.Count-1 do  
  •   begin  
  •     TmpStr := ProductList.Strings[I];  
  •     if AName = Copy(TmpStr,1, Pos('_', TmpStr)-1then  
  •     begin  
  •       Result := Copy(TmpStr, Pos('_', TmpStr)+110);  
  •       Break;  
  •     end;  
  •   end;  
  • end;  
  •   
  • { 取文件的主文件名 }  
  • function YzGetMainFileName(AFileName:string): string;  
  • var  
  •   TmpStr: string;  
  • begin  
  •   if AFileName = '' then Exit;  
  •   TmpStr := ExtractFileName(AFileName);  
  •   Result := Copy(TmpStr, 1, Pos('.', TmpStr) - 1);  
  • end;  
  •   
  • { 按下一个键 }  
  • procedure YzPressOneKey(AByteCode: Byte);  
  • begin  
  •   keybd_event(AByteCode, 000);  
  •   YzDelayTime(100);  
  •   keybd_event(AByteCode, 0, KEYEVENTF_KEYUP, 0);  
  •   YzDelayTime(400);  
  • end;  
  •   
  • { 按下一个指定次数的键 }  
  • procedure YzPressOneKey(AByteCode: Byte;ATimes: Integer);overload;  
  • var  
  •   I: Integer;  
  • begin  
  •   for I := 1 to ATimes do  
  •   begin  
  •     keybd_event(AByteCode, 000);  
  •     YzDelayTime(10);  
  •     keybd_event(AByteCode, 0, KEYEVENTF_KEYUP, 0);  
  •     YzDelayTime(150);  
  •   end;  
  • end;  
  •   
  • { 按下二个键 }  
  • procedure YzPressTwoKeys(AFirstByteCode, ASecByteCode: Byte);  
  • begin  
  •   keybd_event(AFirstByteCode, 000);  
  •   keybd_event(ASecByteCode, 000);  
  •   YzDelayTime(100);  
  •   keybd_event(ASecByteCode, 0, KEYEVENTF_KEYUP, 0);  
  •   keybd_event(AFirstByteCode, 0, KEYEVENTF_KEYUP, 0);  
  •   YzDelayTime(400);  
  • end;  
  •   
  • { 按下三个键 }  
  • procedure YzPressThreeKeys(AFirstByteCode, ASecByteCode, AThirdByteCode: Byte);  
  • begin  
  •   keybd_event(AFirstByteCode, 000);  
  •   keybd_event(ASecByteCode, 000);  
  •   keybd_event(AThirdByteCode, 000);  
  •   YzDelayTime(100);  
  •   keybd_event(AThirdByteCode, 0, KEYEVENTF_KEYUP, 0);  
  •   keybd_event(ASecByteCode, 0, KEYEVENTF_KEYUP, 0);  
  •   keybd_event(AFirstByteCode, 0, KEYEVENTF_KEYUP, 0);  
  •   YzDelayTime(400);  
  • end;  
  •   
  • { 创建桌面快捷方式 }  
  • procedure YzCreateShortCut(const sPath: string; sShortCutName: WideString);  
  • var  
  •   tmpObject: IUnknown;  
  •   tmpSLink: IShellLink;  
  •   tmpPFile: IPersistFile;  
  •   PIDL: PItemIDList;  
  •   StartupDirectory: array[0..MAX_PATH] of Char;  
  •   StartupFilename: String;  
  •   LinkFilename: WideString;  
  • begin  
  •   StartupFilename := sPath;  
  •   tmpObject := CreateComObject(CLSID_ShellLink); { 创建建立快捷方式的外壳扩展 }  
  •   tmpSLink := tmpObject as IShellLink;           { 取得接口 }  
  •   tmpPFile := tmpObject as IPersistFile;         { 用来储存*.lnk文件的接口 }  
  •   tmpSLink.SetPath(pChar(StartupFilename));      { 设定notepad.exe所在路径 }  
  •   tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename))); {设定工作目录 }  
  •   SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL); { 获得桌面的Itemidlist }  
  •   SHGetPathFromIDList(PIDL, StartupDirectory);   { 获得桌面路径 }  
  •   sShortCutName := '/' + sShortCutName + '.lnk';  
  •   LinkFilename := StartupDirectory + sShortCutName;  
  •   tmpPFile.Save(pWChar(LinkFilename), FALSE);    { 保存*.lnk文件 }  
  • end;  
  •   
  • { 删除桌面快捷方式 }  
  • procedure YzDeleteShortCut(sShortCutName: WideString);  
  • var  
  •   PIDL : PItemIDList;  
  •   StartupDirectory: array[0..MAX_PATH] of Char;  
  •   LinkFilename: WideString;  
  • begin  
  •   SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,PIDL);  
  •   SHGetPathFromIDList(PIDL,StartupDirectory);  
  •   LinkFilename := StrPas(StartupDirectory) + '/' + sShortCutName + '.lnk';  
  •   DeleteFile(LinkFilename);  
  • end;  
  •   
  • { 通过光标位置进行鼠标左键单击 }  
  • procedure YzMouseLeftClick(X, Y: Integer);  
  • begin  
  •   SetCursorPos(X, Y);  
  •   YzDelayTime(100);  
  •   mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
  •   mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);  
  •   YzDelayTime(400);  
  • end;  
  •   
  • { 鼠标左键双击 }  
  • procedure YzMouseDoubleClick(X, Y: Integer);  
  • begin  
  •   SetCursorPos(X, Y);  
  •   YzDelayTime(100);  
  •   mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
  •   mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);  
  •   YzDelayTime(100);  
  •   mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
  •   mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);  
  •   YzDelayTime(400);  
  • end;  
  •   
  •   
  • { 通过窗口句柄进行鼠标左键单击 }  
  • procedure YzMouseLeftClick(lpClassName, lpWindowName: PAnsiChar);overload;  
  • var  
  •   AHandel: THandle;  
  • begin  
  •   AHandel := FindWindow(lpClassName, lpWindowName);  
  •   SendMessage(AHandel, WM_LBUTTONDOWN, 00);  
  •   SendMessage(AHandel, WM_LBUTTONUP, 00);  
  •   YzDelayTime(500);  
  • end;  
  •   
  • { 等待进程结束 }  
  • procedure YzWaitProcessExit(AProcessName: string);  
  • begin  
  •   while True do  
  •   begin  
  •     KillByPID(FindProcess(AProcessName));  
  •     if FindProcess(AProcessName) = 0 then Break;  
  •     YzDelayTime(10);  
  •     Application.ProcessMessages;  
  •   end;  
  • end;  
  •   
  • {------------------------------------------------------------- 
  •   功  能:  等待窗口在指定时间后出现 
  •   参  数:  lpClassName: 窗口类名 
  •            lpWindowName: 窗口标题 
  •            ASecond: 要等待的时间,"0"代表永久等待 
  •   返回值:  无 
  •   备  注:  如果指定的等待时间未到窗口已出现则立即退出 
  • --------------------------------------------------------------}  
  • function YzWaitWindowExist(lpClassName, lpWindowName: PAnsiChar;  
  •   ASecond: Integer = 0): THandle;overload;  
  • var  
  •   StartTickCount, PassTickCount: LongWord;  
  • begin  
  •   Result := 0;  
  •   { 永久等待 }  
  •   if ASecond = 0 then  
  •   begin  
  •     while True do  
  •     begin  
  •       Result := FindWindow(lpClassName, lpWindowName);  
  •       if Result <> 0 then Break;  
  •       YzDelayTime(10);  
  •       Application.ProcessMessages;  
  •     end;  
  •   end  
  •   else { 等待指定时间 }  
  •   begin  
  •     StartTickCount := GetTickCount;  
  •     while True do  
  •     begin  
  •       Result := FindWindow(lpClassName, lpWindowName);  
  •       { 窗口已出现则立即退出 }  
  •       if Result <> 0 then Break  
  •       else  
  •       begin  
  •         PassTickCount := GetTickCount;  
  •         { 等待时间已到则退出 }  
  •         if (PassTickCount - StartTickCount) div 1000 >= ASecond then Break;  
  •       end;  
  •       YzDelayTime(10);  
  •       Application.ProcessMessages;  
  •     end;  
  •   end;  
  •   YzDelayTime(1000);  
  • end;  
  •   
  • { 等待指定窗口消失 }  
  • procedure YzWaitWindowClose(lpClassName, lpWindowName: PAnsiChar;  
  •   ASecond: Integer = 0);  
  • var  
  •   StartTickCount, PassTickCount: LongWord;  
  • begin  
  •   if ASecond = 0 then  
  •   begin  
  •     while True do  
  •     begin  
  •       if FindWindow(lpClassName, lpWindowName) = 0 then Break;  
  •       YzDelayTime(10);  
  •       Application.ProcessMessages;  
  •     end  
  •   end  
  •   else  
  •   begin  
  •     StartTickCount := GetTickCount;  
  •     while True do  
  •     begin  
  •       { 窗口已关闭则立即退出 }  
  •       if FindWindow(lpClassName, lpWindowName)= 0 then Break  
  •       else  
  •       begin  
  •         PassTickCount := GetTickCount;  
  •         { 等待时间已到则退出 }  
  •         if (PassTickCount - StartTickCount) div 1000 >= ASecond then Break;  
  •       end;  
  •       YzDelayTime(10);  
  •       Application.ProcessMessages;  
  •     end;  
  •   end;  
  •   YzDelayTime(500);  
  • end;  
  •   
  • { 通过光标位置查找窗口句柄 }  
  • function YzWindowFromPoint(X, Y: Integer): THandle;  
  • var  
  •   MousePoint: TPoint;  
  •   CurWindow: THandle;  
  •   hRect: TRect;  
  •   Canvas: TCanvas;  
  • begin  
  •   MousePoint.X := X;  
  •   MousePoint.Y := Y;  
  •   CurWindow := WindowFromPoint(MousePoint);  
  •   GetWindowRect(Curwindow, hRect);  
  •   if Curwindow <> 0 then  
  •   begin  
  •     Canvas := TCanvas.Create;  
  •     Canvas.Handle := GetWindowDC(Curwindow);  
  •     Canvas.Pen.Width := 2;  
  •     Canvas.Pen.Color := clRed;  
  •     Canvas.Pen.Mode := pmNotXor;  
  •     Canvas.Brush.Style := bsClear;  
  •     Canvas.Rectangle(00, hRect.Right-hRect.Left, hRect.Bottom-hRect.Top);  
  •     Canvas.Free;  
  •   end;  
  •   Result := CurWindow;  
  • end;  
  •   
  • { 通光标位置,窗口类名与标题查找窗口是否存在 }  
  • function YzWaitWindowExist(X, Y: Integer;AClassName, AWinName: string;  
  •   ASecond: Integer):THandle;overload;  
  • var  
  •   MousePo: TPoint;  
  •   CurWindow: THandle;  
  •   bufClassName: array[0..MAXBYTE-1of Char;  
  •   bufWinName: array[0..MAXBYTE-1of Char;  
  •   StartTickCount, PassTickCount: LongWord;  
  • begin  
  •   Result := 0;  
  •   { 永久等待 }  
  •   if ASecond = 0 then  
  •   begin  
  •     while True do  
  •     begin  
  •       MousePo.X := X;  
  •       MousePo.Y := Y;  
  •       CurWindow := WindowFromPoint(MousePo);  
  •       GetClassName(CurWindow, bufClassName, MAXBYTE);  
  •       GetWindowText(CurWindow, bufWinname, MAXBYTE);  
  •       if (CompareText(StrPas(bufClassName), AClassName) = 0 ) and  
  •          (CompareText(StrPas(bufWinName), AWinName) = 0then  
  •       begin  
  •         Result := CurWindow;  
  •         Break;  
  •       end;  
  •       YzDelayTime(10);  
  •       Application.ProcessMessages;  
  •     end;  
  •   end  
  •   else { 等待指定时间 }  
  •   begin  
  •     StartTickCount := GetTickCount;  
  •     while True do  
  •     begin  
  •       { 窗口已出现则立即退出 }  
  •       MousePo.X := X;  
  •       MousePo.Y := Y;  
  •       CurWindow := WindowFromPoint(MousePo);  
  •       GetClassName(CurWindow, bufClassName, MAXBYTE);  
  •       GetWindowText(CurWindow, bufWinname, MAXBYTE);  
  •       if (CompareText(StrPas(bufClassName), AClassName) = 0 ) and  
  •          (CompareText(StrPas(bufWinName), AWinName) = 0then  
  •       begin  
  •         Result := CurWindow; Break;  
  •       end  
  •       else  
  •       begin  
  •         PassTickCount := GetTickCount;  
  •         { 等待时间已到则退出 }  
  •         if (PassTickCount - StartTickCount) div 1000 >= ASecond then Break;  
  •       end;  
  •       YzDelayTime(10);  
  •       Application.ProcessMessages;  
  •     end;  
  •   end;  
  •   YzDelayTime(1000);  
  • end;  
  •   
  • { 通过窗口句柄设置文本框控件文本 }  
  • procedure YzSetEditText(lpClassName, lpWindowName: PAnsiChar;  
  •   AText: string);overload;  
  • var  
  •   CurWindow: THandle;  
  • begin  
  •   CurWindow := FindWindow(lpClassName, lpWindowName);  
  •   SendMessage(CurWindow ,WM_SETTEXT, 0, Integer(PChar(AText)));  
  •   YzDelayTime(500);  
  • end;  
  •   
  • { 通过光标位置设置文本框控件文本 }  
  • procedure YzSetEditText(X, Y: Integer;AText: string);overload;  
  • var  
  •   CurWindow: THandle;  
  • begin  
  •   CurWindow := YzWindowFromPoint(X, Y);  
  •   SendMessage(CurWindow, WM_SETTEXT, 0, Integer(PChar(AText)));  
  •   YzMouseLeftClick(X, Y);  
  • end;  
  •   
  • { 获取Window操作系统语言 }  
  • function YzGetWindowsLanguageStr: String;  
  • var  
  •   WinLanguage: array [0..50of char;  
  • begin  
  •   VerLanguageName(GetSystemDefaultLangID, WinLanguage, 50);  
  •   Result := StrPas(WinLanguage);  
  • end;  
  •   
  • procedure YzDynArraySetZero(var A);  
  • var  
  •   P: PLongint;  { 4个字节 }  
  • begin  
  •   P := PLongint(A); { 指向 A 的地址 }  
  •   Dec(P);  { P地址偏移量是 sizeof(A),指向了数组长度 }  
  •   P^ := 0{ 数组长度清空 }  
  •   Dec(P);  { 指向数组引用计数 }  
  •   P^ := 0{ 数组计数清空 }  
  • end;  
  •   
  • { 动态设置分辨率 }  
  • function YzDynamicResolution(x, y: WORD): Boolean;  
  • var  
  •   lpDevMode: TDeviceMode;  
  • begin  
  •   Result := EnumDisplaySettings(nil0, 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 YzSetFontMapping;  
  • begin  
  •   SetLength(FontMapping, 3);  
  •   
  •   { 800 x 600 }  
  •   FontMapping[0].SWidth := 800;  
  •   FontMapping[0].SHeight := 600;  
  •   FontMapping[0].FName := '宋体';  
  •   FontMapping[0].FSize := 7;  
  •   
  •   { 1024 x 768 }  
  •   FontMapping[1].SWidth := 1024;  
  •   FontMapping[1].SHeight := 768;  
  •   FontMapping[1].FName := '宋体';  
  •   FontMapping[1].FSize := 9;  
  •   
  •   { 1280 x 1024 }  
  •   FontMapping[2].SWidth := 1280;  
  •   FontMapping[2].SHeight := 1024;  
  •   FontMapping[2].FName := '宋体';  
  •   FontMapping[2].FSize := 11;  
  • end;  
  •   
  • { 程序窗体及控件自适应分辨率(有问题) }  
  • procedure YzFixForm(AForm: TForm);  
  • var  
  •   I, J: integer;  
  •   T: TControl;  
  • begin  
  •   with AForm do  
  •   begin  
  •     for I := 0 to ComponentCount - 1 do  
  •     begin  
  •       try  
  •         T := TControl(Components[I]);  
  •         T.left := Trunc(T.left * (Screen.width / 1024));  
  •         T.top := Trunc(T.Top * (Screen.Height / 768));  
  •         T.Width := Trunc(T.Width * (Screen.Width / 1024));  
  •         T.Height := Trunc(T.Height * (Screen.Height / 768));  
  •       except  
  •       end{ try }  
  •     end{ for I }  
  •   
  •     for I:= 0 to Length(FontMapping) - 1 do  
  •     begin  
  •       if (Screen.Width = FontMapping[I].SWidth) and (Screen.Height =  
  •         FontMapping[I].SHeight) then  
  •       begin  
  •         for J := 0 to ComponentCount - 1 do  
  •         begin  
  •           try  
  •             TFontedControl(Components[J]).Font.Name := FontMapping[I].FName;  
  •             TFontedControl(Components[J]).FONT.Size := FontMapping[I].FSize;  
  •           except  
  •           end{ try }  
  •         end{ for J }  
  •       end{ if }  
  •     end{ for I }  
  •   end{ with }  
  • end;  
  •   
  • { 检测系统屏幕分辨率 }  
  • function YzCheckDisplayInfo(X, Y: Integer): Boolean;  
  • begin  
  •   Result := True;  
  •   if (Screen.Width <> X) and (Screen.Height <> Y) then  
  •   begin  
  •     if MessageBox(Application.Handle, PChar( '系统检测到您的屏幕分辨率不是 '  
  •       + IntToStr(X) + '×' + IntToStr(Y) + ',这将影响到系统的正常运行,'  
  •       + '是否要自动调整屏幕分辨率?'), '提示', MB_YESNO + MB_ICONQUESTION  
  •       + MB_TOPMOST) = 6 then YzDynamicResolution(1024768)  
  •     else Result := False;  
  •   end;  
  • end;  
  •   
  • function YzGetUninstallInfo: TUninstallInfo;  
  • const  
  •   Key = '/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/';  
  • var  
  •   S : TStrings;  
  •   I : Integer;  
  •   J : Integer;  
  • begin  
  •   with TRegistry.Create do  
  •   begin  
  •     S := TStringlist.Create;  
  •     J := 0;  
  •     try  
  •       RootKey:= HKEY_LOCAL_MACHINE;  
  •       OpenKeyReadOnly(Key);  
  •       GetKeyNames(S);  
  •       Setlength(Result, S.Count);  
  •       for I:= 0 to S.Count - 1 do  
  •       begin  
  •         If OpenKeyReadOnly(Key + S[I]) then  
  •         If ValueExists('DisplayName'and ValueExists('UninstallString'then  
  •         begin  
  •           Result[J].RegProgramName:= S[I];  
  •           Result[J].ProgramName:= ReadString('DisplayName');  
  •           Result[J].UninstallPath:= ReadString('UninstallString');  
  •           If ValueExists('Publisher'then  
  •             Result[J].Publisher:= ReadString('Publisher');  
  •           If ValueExists('URLInfoAbout'then  
  •             Result[J].PublisherURL:= ReadString('URLInfoAbout');  
  •           If ValueExists('DisplayVersion'then  
  •             Result[J].Version:= ReadString('DisplayVersion');  
  •           If ValueExists('HelpLink'then  
  •             Result[J].HelpLink:= ReadString('HelpLink');  
  •           If ValueExists('URLUpdateInfo'then  
  •             Result[J].UpdateInfoURL:= ReadString('URLUpdateInfo');  
  •           If ValueExists('RegCompany'then  
  •             Result[J].RegCompany:= ReadString('RegCompany');  
  •           If ValueExists('RegOwner'then  
  •             Result[J].RegOwner:= ReadString('RegOwner');  
  •           Inc(J);  
  •         end;  
  •       end;  
  •     finally  
  •       Free;  
  •       S.Free;  
  •       SetLength(Result, J);  
  •     end;  
  •   end;  
  • end;  
  •   
  • { 检测Java安装信息 }  
  • function YzCheckJavaInfo(AUninstallInfo: TUninstallInfo;CheckJava6 : Boolean = False): Boolean;  
  • var  
  •   I: Integer;  
  •   Java6Exist: Boolean;  
  •   AUninstall: TUninstallInfo;  
  •   AProgramList: TStringList;  
  •   AJavaVersion, AFilePath: string;  
  • begin  
  •   Result := True;  
  •   Java6Exist := False;  
  •   AJavaVersion := 'J2SE Runtime Environment 5.0 Update 14';  
  •   AUninstall := YzGetUninstallInfo;  
  •   AProgramList := TStringList.Create;  
  •   for I := Low(AUninstall) to High(AUninstall) do  
  •   begin  
  •     if Pos('J2SE', AUninstall[I].ProgramName) <> 0 then  
  •       AProgramList.Add(AUninstall[I].ProgramName);  
  •     if Pos('Java(TM)', AUninstall[I].ProgramName) <> 0 then  
  •       Java6Exist := True;  
  •   end;  
  •   if Java6Exist then  
  •   begin  
  •     if CheckJava6 then  
  •     begin  
  •       MessageBox(Application.Handle, '系统检测到您机器上安装了Java6以上的版本,'  
  •         + '如果影响到系统的正常运行请先将其卸载再重新启动系统!''提示',  
  •         MB_OK + MB_ICONINFORMATION + MB_TOPMOST);  
  •       Result := False;  
  •     end;  
  •   end  
  •   else if AProgramList.Count = 0 then  
  •   begin  
  •     MessageBox(Application.Handle, '系统检测到您机器上没有安装Java运行环境,'  
  •       + '请点击 "确定" 安装Java运行环境后再重新运行程序!',  
  •       '提示', MB_OK + MB_ICONINFORMATION + MB_TOPMOST);  
  •   
  •     AFilePath := ExtractFilePath(ParamStr(0)) + 'java' + '/'  
  •       + 'jre-1_5_0_14-windows-i586-p.exe';  
  •     if FileExists(AFilePath) then  WinExec(PChar(AFilePath), SW_SHOWNORMAL)  
  •     else  
  •       MessageBox(Application.Handle, '找不到Java安装文件,请您手动安装!',  
  •         '提示', MB_OK + MB_ICONINFORMATION  + MB_TOPMOST);  
  •     Result := False;  
  •   end;  
  •   AProgramList.Free;  
  • end;  
  •   
  • {------------------------------------------------------------- 
  •   功能:    窗口自适应屏幕大小 
  •   参数:    Form: 需要调整的Form 
  •            OrgWidth:开发时屏幕的宽度 
  •            OrgHeight:开发时屏幕的高度 
  • --------------------------------------------------------------}  
  • procedure YzAdjustForm(Form: TForm;const OrgWidth, OrgHeight: integer);  
  • begin  
  •   with Form do  
  •   begin  
  •     if (Screen.width <> OrgWidth) then  
  •     begin  
  •       Scaled := True;  
  •       Height := longint(Height) * longint(Screen.height) div OrgHeight;  
  •       Width := longint(Width) * longint(Screen.Width) div OrgWidth;  
  •       ScaleBy(Screen.Width, OrgWidth);  
  •     end;  
  •   end;  
  • end;  
  •   
  • { 设置窗口为当前窗体 }  
  • procedure YzBringMyAppToFront(AppHandle: THandle);  
  • var  
  •   Th1, Th2: Cardinal;  
  • begin  
  •   Th1 := GetCurrentThreadId;  
  •   Th2 := GetWindowThreadProcessId(GetForegroundWindow, NIL);  
  •   AttachThreadInput(Th2, Th1, TRUE);  
  •   try  
  •     SetForegroundWindow(AppHandle);  
  •   finally  
  •     AttachThreadInput(Th2, Th1, TRUE);  
  •   end;  
  • end;  
  •   
  • { 获取文件夹文件数量 }  
  • function YzGetDirFiles(Dir: string;SubDir: Boolean): LongInt;  
  • var  
  •   SearchRec: TSearchRec;  
  •   Founded: integer;  
  • begin  
  •   Result := 0;  
  •   if Dir[length(Dir)] <> '/' then Dir := Dir + '/';  
  •   Founded := FindFirst(Dir + '*.*', faAnyFile, SearchRec);  
  •   while Founded = 0 do  
  •   begin  
  •     Inc(Result);  
  •     if (SearchRec.Attr and faDirectory > 0and (SearchRec.Name[1] <> '.'and  
  •       (SubDir = True) then  
  •       Inc(Result, YzGetDirFiles(Dir + SearchRec.Name, True));  
  •       Founded := FindNext(SearchRec);  
  •   end;  
  •   FindClose(SearchRec);  
  • end;  
  •   
  • { 算术舍入法的四舍五入取整函数 }  
  • function YzRoundEx (const Value: Real): LongInt;  
  • var  
  •   x: Real;  
  • begin  
  •   x := Value - Trunc(Value);  
  •   if x >= 0.5 then  
  •     Result := Trunc(Value) + 1  
  •   else Result := Trunc(Value);  
  • end;  
  •   
  • { 获取文件大小(KB) }  
  • function YzGetFileSize(const FileName: String): LongInt;  
  • var  
  •   SearchRec: TSearchRec;  
  • begin  
  •   if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then  
  •     Result := SearchRec.Size  
  •   else  
  •     Result := -1;  
  •   Result := YzRoundEx(Result / 1024);  
  • end;  
  •   
  • { 获取文件大小(字节) }  
  • function YzGetFileSize_Byte(const FileName: String): LongInt;  
  • var  
  •   SearchRec: TSearchRec;  
  • begin  
  •   if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then  
  •     Result := SearchRec.Size  
  •   else  
  •     Result := -1;  
  • end;  
  •   
  • { 获取文件夹大小 }  
  • function YzGetDirSize(Dir: string;SubDir: Boolean): LongInt;  
  • var  
  •   SearchRec: TSearchRec;  
  •   Founded: integer;  
  • begin  
  •   Result := 0;  
  •   if Dir[length(Dir)] <> '/' then Dir := Dir + '/';  
  •   Founded := FindFirst(Dir + '*.*', faAnyFile, SearchRec);  
  •   while Founded = 0 do  
  •   begin  
  •     Inc(Result, SearchRec.size);  
  •     if (SearchRec.Attr and faDirectory > 0and (SearchRec.Name[1] <> '.'and  
  •       (SubDir = True) then  
  •       Inc(Result, YzGetDirSize(Dir + SearchRec.Name, True));  
  •       Founded := FindNext(SearchRec);  
  •   end;  
  •   FindClose(SearchRec);  
  •   Result := YzRoundEx(Result / 1024);  
  • end;  
  •   
  • {------------------------------------------------------------- 
  •   功能:    弹出选择目录对话框 
  •   参数:    const iMode: 选择模式 
  •            const sInfo: 对话框提示信息 
  •   返回值:  如果取消取返回为空,否则返回选中的路径 
  • --------------------------------------------------------------}  
  • function YzSelectDir(const iMode: integer;const sInfo: string): string;  
  • var  
  •   Info: TBrowseInfo;  
  •   IDList: pItemIDList;  
  •   Buffer: PChar;  
  • begin  
  •   Result:='';  
  •   Buffer := StrAlloc(MAX_PATH);  
  •   with Info do  
  •   begin  
  •     hwndOwner := application.mainform.Handle;  { 目录对话框所属的窗口句柄 }  
  •     pidlRoot := nil;                           { 起始位置,缺省为我的电脑 }  
  •     pszDisplayName := Buffer;                  { 用于存放选择目录的指针 }  
  •     lpszTitle := PChar(sInfo);  
  •     { 此处表示显示目录和文件,如果只显示目录则将后一个去掉即可 }  
  •     if iMode = 1 then  
  •       ulFlags := BIF_RETURNONLYFSDIRS or BIF_BROWSEINCLUDEFILES  
  •     else  
  •       ulFlags := BIF_RETURNONLYFSDIRS;  
  •     lpfn := nil;                               { 指定回调函数指针 }  
  •     lParam := 0;                               { 传递给回调函数参数 }  
  •     IDList := SHBrowseForFolder(Info);         { 读取目录信息 }  
  •   end;  
  •   if IDList <> nil then  
  •   begin  
  •     SHGetPathFromIDList(IDList, Buffer);     { 将目录信息转化为路径字符串 }  
  •     Result := strpas(Buffer);  
  •   end;  
  •   StrDispose(buffer);  
  • end;  
  •   
  • { 获取指定路径下文件夹的个数 }  
  • procedure YzListFolders(const Path: String; const ShowPath: Boolean;var List: TStrings);  
  • var  
  •   SRec: TSearchRec;  
  • begin  
  •  if not Assigned(List) then List:= TStringList.Create;  
  •  FindFirst(Path + '*.*', faDirectory, SRec);  
  •  if ShowPath then  
  •     List.Add(Path + SRec.Name)  
  •  else  
  •     List.Add(SRec.Name);  
  •  while FindNext(SRec) = 0 do  
  •     if ShowPath then  
  •        List.Add(Path + SRec.Name)  
  •     else  
  •        List.Add(SRec.Name);  
  •  FindClose(SRec);  
  • end;  
  •   
  • { 禁用窗器控件的所有子控件 }  
  • procedure YzSetSubCtlState(AOwer: TWinControl;AState: Boolean);  
  • var  
  •   I: Integer;  
  • begin  
  •   for I := 0 to AOwer.ControlCount - 1 do  
  •    AOwer.Controls[I].Enabled := AState;  
  • end;  
  •   
  • { 模拟键盘按键操作(处理字节码) }  
  • procedure YzFKeyent(byteCard: byte);  
  • var  
  •   vkkey: integer;  
  • begin  
  •   vkkey := VkKeyScan(chr(byteCard));  
  •   if (chr(byteCard) in ['A'..'Z']) then  
  •   begin  
  •     keybd_event(VK_SHIFT, 000);  
  •     keybd_event(byte(byteCard), 000);  
  •     keybd_event(VK_SHIFT, 020);  
  •   end  
  •   else if chr(byteCard) in ['!''@''#''$''%''^''&''*''('')',  
  •     '_''+''|''{''}'':''"''<''>''?''~'then  
  •   begin  
  •     keybd_event(VK_SHIFT, 000);  
  •     keybd_event(byte(vkkey), 000);  
  •     keybd_event(VK_SHIFT, 020);  
  •   end  
  •   else { if byteCard in [8,13,27,32] }  
  •   begin  
  •     keybd_event(byte(vkkey), 000);  
  •   end;  
  • end;  
  •   
  • { 模拟键盘按键(处理字符) }  
  • procedure YzFKeyent(strCard: string);  
  • var  
  •   str: string;  
  •   strLength: integer;  
  •   I: integer;  
  •   byteSend: byte;  
  • begin  
  •   str := strCard;  
  •   strLength := length(str);  
  •   for I := 1 to strLength do  
  •   begin  
  •     byteSend := byte(str[I]);  
  •     YzFKeyent(byteSend);  
  •   end;  
  • end;  
  •   
  • { 锁定窗口位置 }  
  • procedure YzLockWindow(ClassName,WinName: PChar;poX,poY: Integer);  
  • var  
  •   CurWindow: THandle;  
  •   _wndRect: TRect;  
  • begin  
  •   CurWindow := 0;  
  •   while True do  
  •   begin  
  •     CurWindow := FindWindow(ClassName,WinName);  
  •     if CurWindow <> 0 then Break;  
  •     YzDelayTime(10);  
  •     Application.ProcessMessages;  
  •   end;  
  •   GetWindowRect(CurWindow,_wndRect);  
  •   if ( _wndRect.Left <> poX) or ( _wndRect.Top <> poY) then  
  •   begin  
  •        MoveWindow(CurWindow,  
  •        poX,  
  •        poY,  
  •        (_wndRect.Right-_wndRect.Left),  
  •        (_wndRect.Bottom-_wndRect.Top),  
  •         TRUE);  
  •   end;  
  •   YzDelayTime(1000);  
  • end;  
  •   
  • { 
  •   注册一个DLL形式或OCX形式的OLE/COM控件 
  •   参数strOleFileName为一个DLL或OCX文件名, 
  •   参数OleAction表示注册操作类型,1表示注册,0表示卸载 
  •   返回值True表示操作执行成功,False表示操作执行失败 
  • }  
  • function YzRegisterOleFile (strOleFileName: STRING;OleAction: Byte): BOOLEAN;  
  • const  
  •   RegisterOle   =   1{ 注册 }  
  •   UnRegisterOle =   0{ 卸载 }  
  • type  
  •   TOleRegisterFunction = function: HResult; { 注册或卸载函数的原型 }  
  • var  
  •   hLibraryHandle: THandle;    { 由LoadLibrary返回的DLL或OCX句柄 }  
  •   hFunctionAddress: TFarProc; { DLL或OCX中的函数句柄,由GetProcAddress返回 }  
  •   RegFunction: TOleRegisterFunction; { 注册或卸载函数指针 }  
  • begin  
  •   Result := FALSE;  
  •   { 打开OLE/DCOM文件,返回的DLL或OCX句柄 }  
  •   hLibraryHandle := LoadLibrary(PCHAR(strOleFileName));  
  •   if (hLibraryHandle > 0then        { DLL或OCX句柄正确 }  
  •   try  
  •     { 返回注册或卸载函数的指针 }  
  •     if (OleAction = RegisterOle) then { 返回注册函数的指针 }  
  •       hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllRegisterServer'))  
  •     { 返回卸载函数的指针 }  
  •     else  
  •       hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllUnregisterServer'));  
  •     if (hFunctionAddress <> NIL) then { 注册或卸载函数存在 }  
  •     begin  
  •       { 获取操作函数的指针 }  
  •       RegFunction := TOleRegisterFunction(hFunctionAddress);  
  •       { 执行注册或卸载操作,返回值>=0表示执行成功 }  
  •       if RegFunction >= 0 then  
  •         Result   :=   true;  
  •     end;  
  •   finally  
  •     { 关闭已打开的OLE/DCOM文件 }  
  •     FreeLibrary(hLibraryHandle);  
  •   end;  
  • end;  
  •   
  • function YzListViewColumnCount(mHandle: THandle): Integer;  
  • begin  
  •   Result := Header_GetItemCount(ListView_GetHeader(mHandle));  
  • end{ ListViewColumnCount }  
  •   
  • function YzGetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;  
  • var  
  •   vColumnCount: Integer;  
  •   vItemCount: Integer;  
  •   I, J: Integer;  
  •   vBuffer: array[0..255of Char;  
  •   vProcessId: DWORD;  
  •   vProcess: THandle;  
  •   vPointer: Pointer;  
  •   vNumberOfBytesRead: Cardinal;  
  •   S: string;  vItem: TLVItem;  
  • begin  
  •   Result := False;  
  •   if not Assigned(mStrings) then Exit;  
  •   vColumnCount := YzListViewColumnCount(mHandle);  
  •   if vColumnCount <= 0 then Exit;  
  •   vItemCount := ListView_GetItemCount(mHandle);  
  •   GetWindowThreadProcessId(mHandle, @vProcessId);  
  •   vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ  
  •     or  PROCESS_VM_WRITE, False, vProcessId);  
  •   vPointer := VirtualAllocEx(vProcess, nil4096, MEM_RESERVE or MEM_COMMIT,  
  •     PAGE_READWRITE);  
  •   mStrings.BeginUpdate;  
  •   try  
  •     mStrings.Clear;  
  •     for I := 0 to vItemCount - 1 do  
  •     begin  
  •       S := '';  
  •       for J := 0 to vColumnCount - 1 do  
  •       begin  
  •         with vItem do  
  •         begin  
  •           mask := LVIF_TEXT;  
  •           iItem := I;  
  •           iSubItem := J;  
  •           cchTextMax := SizeOf(vBuffer);  
  •           pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));  
  •         end;  
  •         WriteProcessMemory(vProcess, vPointer, @vItem,  
  •         SizeOf(TLVItem), vNumberOfBytesRead);  
  •         SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));  
  •         ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),  
  •           @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);  
  •         S := S + #9 + vBuffer;  
  •       end;  
  •       Delete(S, 11);  
  •       mStrings.Add(S);  
  •     end;  
  •   finally  
  •     VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);  
  •     CloseHandle(vProcess);    mStrings.EndUpdate;  
  •   end;  
  •   Result := True;  
  • end{ GetListViewText }  
  •   
  • { 删除目录树 }  
  • function YzDeleteDirectoryTree(Path: string): boolean;  
  • var  
  •   SearchRec: TSearchRec;  
  •   SFI: string;  
  • begin  
  •   Result := False;  
  •   if (Path = ''or (not DirectoryExists(Path)) then exit;  
  •   if Path[length(Path)] <> '/' then Path := Path + '/';  
  •   SFI := Path + '*.*';  
  •   if FindFirst(SFI, faAnyFile, SearchRec) = 0 then  
  •   begin  
  •     repeat  
  •       begin  
  •         if (SearchRec.Name = '.'or (SearchRec.Name = '..'then  
  •           Continue;  
  •         if (SearchRec.Attr and faDirectory <> 0then  
  •         begin  
  •           if not YzDeleteDirectoryTree(Path + SearchRec.name) then  
  •             Result := FALSE;  
  •         end  
  •         else  
  •         begin  
  •           FileSetAttr(Path + SearchRec.Name, 128);  
  •           DeleteFile(Path + SearchRec.Name);  
  •         end;  
  •       end  
  •     until FindNext(SearchRec) <> 0;  
  •     FindClose(SearchRec);  
  •   end;  
  •   FileSetAttr(Path, 0);  
  •   if RemoveDir(Path) then  
  •     Result := TRUE  
  •   else  
  •     Result := FALSE;  
  • end;  
  •   
  • { Jpg格式转换为bmp格式 }  
  • function JpgToBmp(Jpg: TJpegImage): TBitmap;  
  • begin  
  •   Result := nil;  
  •   if Assigned(Jpg) then  
  •   begin  
  •     Result := TBitmap.Create;  
  •     Jpg.DIBNeeded;  
  •     Result.Assign(Jpg);  
  •   end;  
  • end;  
  •   
  • { 设置程序自启动函数 }  
  • function YzSetAutoRun(AFilePath: string;AFlag: Boolean): boolean;  
  • var  
  •   AMainFName: string;  
  •   Reg: TRegistry;  
  • begin  
  •   Result := true;  
  •   AMainFName := YzGetMainFileName(AFilePath);  
  •   Reg := TRegistry.Create;  
  •   Reg.RootKey := HKEY_LOCAL_MACHINE;  
  •   try  
  •     Reg.OpenKey('SOFTWARE/Microsoft/Windows/CurrentVersion/Run', True);  
  •     if AFlag = False then  { 取消自启动 }  
  •       Reg.DeleteValue(AMainFName)  
  •     else                   { 设置自启动 }  
  •       Reg.WriteString(AMainFName, '"' + AFilePath + '"')  
  •   except  
  •     Result := False;  
  •   end;  
  •   Reg.CloseKey;  
  •   Reg.Free;  
  • end;  
  •   
  • { 检测URL地址是否有效 }  
  • function YzCheckUrl(url: string): Boolean;  
  • var  
  •   hSession, hfile, hRequest: HINTERNET;  
  •   dwindex, dwcodelen: dword;  
  •   dwcode: array[1..20of Char;  
  •   res: PChar;  
  • begin  
  •   Result := False;  
  •   try  
  •     if Pos('http://',LowerCase(url)) = 0 then url := 'http://' + url;  
  •     { Open an internet session }  
  •     hSession:=InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil0);  
  •     if Assigned(hsession) then  
  •     begin  
  •       hfile := InternetOpenUrl(hsession, PChar(url), nil0,INTERNET_FLAG_RELOAD, 0);  
  •       dwIndex := 0;  
  •       dwCodeLen := 10;  
  •       HttpQueryInfo(hfile,HTTP_QUERY_STATUS_CODE,@dwcode,dwcodeLen,dwIndex);  
  •       res := PChar(@dwcode);  
  •       Result := (res = '200'or (res = '302');  
  •       if Assigned(hfile) then InternetCloseHandle(hfile);  
  •       InternetCloseHandle(hsession);  
  •     end;  
  •   except  
  •   end;  
  • end;  
  •   
  • { 获取程序可执行文件名 }  
  • function YzGetExeFName: string;  
  • begin  
  •   Result := ExtractFileName(Application.ExeName);  
  • end;  
  •   
  • { 目录浏览对话框函数 }  
  • function YzBrowseFolder(AOwer: TWinControl;ATitle: string):string;  
  • var  
  •   Info: TBrowseInfo;  
  •   Dir: array[0..260of char;  
  •   ItemId: PItemIDList;  
  • begin  
  •   with Info do  
  •   begin  
  •     hwndOwner := AOwer.Handle;  
  •     pidlRoot := nil;  
  •     pszDisplayName := nil;  
  •     lpszTitle := PChar(ATitle);  
  •     ulFlags := 0;  
  •     lpfn := nil;  
  •     lParam := 0;  
  •     iImage := 0;  
  •   end;  
  •   ItemId := SHBrowseForFolder(Info);  
  •   SHGetPathFromIDList(ItemId,@Dir);  
  •   Result := string(Dir);  
  • end;  
  •   
  • { 重启计算机 }  
  • function YzShutDownSystem(AFlag: Integer):BOOL;  
  • var  
  •   hProcess,hAccessToken: THandle;  
  •   LUID_AND_ATTRIBUTES: TLUIDAndAttributes;  
  •   TOKEN_PRIVILEGES: TTokenPrivileges;  
  •   BufferIsNull: DWORD;  
  • Const  
  •   SE_SHUTDOWN_NAME='SeShutdownPrivilege';  
  • begin  
  •   hProcess:=GetCurrentProcess();  
  •   
  •   OpenProcessToken(hprocess, TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY, hAccessToken);  
  •   LookupPrivilegeValue(Nil, SE_SHUTDOWN_NAME, LUID_AND_ATTRIBUTES.Luid);  
  •   LUID_AND_ATTRIBUTES.Attributes := SE_PRIVILEGE_ENABLED;  
  •   TOKEN_PRIVILEGES.PrivilegeCount := 1;  
  •   TOKEN_PRIVILEGES.Privileges[0] := LUID_AND_ATTRIBUTES;  
  •   BufferIsNull := 0;  
  •   
  •   AdjustTokenPrivileges(hAccessToken, False, TOKEN_PRIVILEGES, sizeof(  
  •     TOKEN_PRIVILEGES) ,Nil, BufferIsNull);  
  •   Result := ExitWindowsEx(AFlag, 0);  
  • end;  
  •   
  • { 程序运行后删除自身 }  
  • procedure YzDeleteSelf;  
  • var  
  •   hModule: THandle;  
  •   buff:    array[0..255of Char;  
  •   hKernel32: THandle;  
  •   pExitProcess, pDeleteFileA, pUnmapViewOfFile: Pointer;  
  • begin  
  •   hModule := GetModuleHandle(nil);  
  •   GetModuleFileName(hModule, buff, sizeof(buff));  
  •   
  •   CloseHandle(THandle(4));  
  •   
  •   hKernel32        := GetModuleHandle('KERNEL32');  
  •   pExitProcess     := GetProcAddress(hKernel32, 'ExitProcess');  
  •   pDeleteFileA     := GetProcAddress(hKernel32, 'DeleteFileA');  
  •   pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');  
  •   
  •   asm  
  •     LEA         EAX, buff  
  •     PUSH        0  
  •     PUSH        0  
  •     PUSH        EAX  
  •     PUSH        pExitProcess  
  •     PUSH        hModule  
  •     PUSH        pDeleteFileA  
  •     PUSH        pUnmapViewOfFile  
  •     RET  
  •   end;  
  • end;  
  •   
  • { 程序重启 }  
  • procedure YzAppRestart;  
  • var  
  •   AppName : PChar;  
  • begin  
  •   AppName := PChar(Application.ExeName) ;  
  •   ShellExecute(Application.Handle,'open', AppName, nilnil, SW_SHOWNORMAL);  
  •   KillByPID(GetCurrentProcessId);  
  • end;  
  •   
  • { 压缩Access数据库 }  
  • function YzCompactAccessDB(const AFileName, APassWord: string): Boolean;  
  • var  
  •   SPath, FConStr, TmpConStr: string;  
  •   SFile: array[0..254of Char;  
  •   STempFileName: string;  
  •   JE: OleVariant;  
  •   function GetTempDir: string;  
  •   var  
  •     Buffer: array[0..MAX_PATH] of Char;  
  •   begin  
  •     ZeroMemory(@Buffer, MAX_PATH);  
  •     GetTempPath(MAX_PATH, Buffer);  
  •     Result := IncludeTrailingBackslash(StrPas(Buffer));  
  •   end;  
  • begin  
  •   Result := False;  
  •   SPath := GetTempDir;  { 取得Windows的Temp路径 }  
  •   
  •   { 取得Temp文件名,Windows将自动建立0字节文件 }  
  •   GetTempFileName(PChar(SPath), '~ACP'0, SFile);  
  •   STempFileName := SFile;  
  •   
  •   { 删除Windows建立的0字节文件 }  
  •   if not DeleteFile(STempFileName) then Exit;  
  •   try  
  •     JE := CreateOleObject('JRO.JetEngine');  
  •   
  •     { 压缩数据库 }  
  •     FConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' + AFileName  
  •       + ';Jet OLEDB:DataBase PassWord=' + APassWord;  
  •   
  •     TmpConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' + STempFileName  
  •       + ';Jet OLEDB:DataBase PassWord=' + APassWord;  
  •     JE.CompactDatabase(FConStr, TmpConStr);  
  •   
  •     { 覆盖源数据库文件 }  
  •     Result := CopyFile(PChar(STempFileName), PChar(AFileName), False);  
  •   
  •     { 删除临时文件 }  
  •     DeleteFile(STempFileName);  
  •   except  
  •     Application.MessageBox('压缩数据库失败!''提示', MB_OK +  
  •       MB_ICONINFORMATION);  
  •   end;  
  • end;  
  •   
  • { 标题:获取其他进程中TreeView的文本 }  
  • function YzTreeNodeGetNext(mHandle: THandle; mTreeItem: HTreeItem): HTreeItem;  
  • var  
  •   vParentID: HTreeItem;  
  • begin  
  •   Result := nil;  
  •   if (mHandle <> 0and (mTreeItem <> nilthen  
  •   begin  
  •     Result := TreeView_GetChild(mHandle, mTreeItem);  
  •     if Result = nil then  
  •       Result := TreeView_GetNextSibling(mHandle, mTreeItem);  
  •     vParentID := mTreeItem;  
  •     while (Result = niland (vParentID <> nildo  
  •     begin  
  •       vParentID := TreeView_GetParent(mHandle, vParentID);  
  •       Result := TreeView_GetNextSibling(mHandle, vParentID);  
  •     end;  
  •   end;  
  • end{ TreeNodeGetNext }  
  •   
  • function YzTreeNodeGetLevel(mHandle: THandle; mTreeItem: HTreeItem): Integer;  
  • var  
  •   vParentID: HTreeItem;  
  • begin  
  •   Result := -1;  
  •   if (mHandle <> 0and (mTreeItem <> nilthen  
  •   begin  
  •     vParentID := mTreeItem;  
  •     repeat  
  •       Inc(Result);  
  •       vParentID := TreeView_GetParent(mHandle, vParentID);  
  •     until vParentID = nil;  
  •   end;  
  • end{ TreeNodeGetLevel }  
  •   
  • function YzGetTreeViewText(mHandle: THandle; mStrings: TStrings): Boolean;  
  • var  
  •   vItemCount: Integer;  
  •   vBuffer: array[0..255of Char;  
  •   vProcessId: DWORD;  
  •   vProcess: THandle;  
  •   vPointer: Pointer;  
  •   vNumberOfBytesRead: Cardinal;  
  •   I: Integer;  
  •   vItem: TTVItem;  
  •   vTreeItem: HTreeItem;  
  • begin  
  •   Result := False;  
  •   if not Assigned(mStrings) then Exit;  
  •   GetWindowThreadProcessId(mHandle, @vProcessId);  
  •   vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or  
  •     PROCESS_VM_WRITE, False, vProcessId);  
  •   vPointer := VirtualAllocEx(vProcess, nil4096, MEM_RESERVE or  
  •     MEM_COMMIT, PAGE_READWRITE);  
  •   mStrings.BeginUpdate;  
  •   try  
  •     mStrings.Clear;  
  •     vItemCount := TreeView_GetCount(mHandle);  
  •     vTreeItem := TreeView_GetRoot(mHandle);  
  •     for I := 0 to vItemCount - 1 do  
  •     begin  
  •       with vItem do begin  
  •         mask := TVIF_TEXT; cchTextMax := SizeOf(vBuffer);  
  •         pszText := Pointer(Cardinal(vPointer) + SizeOf(vItem));  
  •         hItem := vTreeItem;  
  •       end;  
  •       WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(vItem),  
  •         vNumberOfBytesRead);  
  •       SendMessage(mHandle, TVM_GETITEM, 0, lparam(vPointer));  
  •       ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),  
  •       @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);  
  •       mStrings.Add(StringOfChar(#9, YzTreeNodeGetLevel(mHandle, vTreeItem)) + vBuffer);  
  •       vTreeItem := YzTreeNodeGetNext(mHandle, vTreeItem);  
  •     end;  
  •   finally  
  •     VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);  
  •     CloseHandle(vProcess); mStrings.EndUpdate;  
  •   end;  
  •   Result := True;  
  • end{ GetTreeViewText }  
  •   
  • { 获取其他进程中ListBox和ComboBox的内容 }  
  • function YzGetListBoxText(mHandle: THandle; mStrings: TStrings): Boolean;  
  • var  
  •   vItemCount: Integer;  
  •   I: Integer;  
  •   S: string;  
  • begin  
  •   Result := False;  
  •   if not Assigned(mStrings) then Exit;  
  •   mStrings.BeginUpdate;  
  •   try  
  •     mStrings.Clear;  
  •     vItemCount := SendMessage(mHandle, LB_GETCOUNT, 00);  
  •     for I := 0 to vItemCount - 1 do  
  •     begin  
  •       SetLength(S, SendMessage(mHandle, LB_GETTEXTLEN, I, 0));  
  •       SendMessage(mHandle, LB_GETTEXT, I, Integer(@S[1]));  
  •       mStrings.Add(S);  
  •     end;  
  •     SetLength(S, 0);  
  •   finally  
  •     mStrings.EndUpdate;  
  •   end;  
  •   Result := True;  
  • end{ GetListBoxText }  
  •   
  • function YzGetComboBoxText(mHandle: THandle; mStrings: TStrings): Boolean;  
  • var  
  •   vItemCount: Integer;  
  •   I: Integer;  
  •   S: string;  
  • begin  
  •   Result := False;  
  •   if not Assigned(mStrings) then Exit;  
  •   mStrings.BeginUpdate;  
  •   try  
  •     mStrings.Clear;  
  •     vItemCount := SendMessage(mHandle, CB_GETCOUNT, 00);  
  •     for I := 0 to vItemCount - 1 do  
  •     begin  
  •       SetLength(S, SendMessage(mHandle, CB_GETLBTEXTLEN, I, 0));  
  •       SendMessage(mHandle, CB_GETLBTEXT, I, Integer(@S[1]));  
  •       mStrings.Add(S);  
  •     end;  
  •     SetLength(S, 0);  
  •   finally  
  •     mStrings.EndUpdate;  
  •   end;  
  •   Result := True;  
  • end{ GetComboBoxText }  
  •   
  • { 获取本地Application Data目录路径 }  
  • function YzLocalAppDataPath : string;  
  • const  
  •    SHGFP_TYPE_CURRENT = 0;  
  • var  
  •    Path: array [0..MAX_PATH] of char;  
  • begin  
  •    SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path[0]) ;  
  •    Result := Path;  
  • end;  
  •   
  • { 获取Windows当前登录的用户名 }  
  • function YzGetWindwosUserName: String;  
  • var  
  •   pcUser: PChar;  
  •   dwUSize: DWORD;  
  • begin  
  •   dwUSize := 21;  
  •   result  := '';  
  •   GetMem(pcUser, dwUSize);  
  •   try  
  •     if Windows.GetUserName(pcUser, dwUSize) then  
  •       Result := pcUser  
  •   finally  
  •     FreeMem(pcUser);  
  •   end;  
  • end;  
  •   
  • {------------------------------------------------------------- 
  •   功  能:  delphi 枚举托盘图标 
  •   参  数:  AFindList: 返回找到的托盘列表信息 
  •   返回值:  成功为True,反之为False 
  •   备  注:  返回的格式为: 位置_名称_窗口句柄_进程ID 
  • --------------------------------------------------------------}  
  • function YzEnumTrayNotifyWnd(AFindList: TStringList;ADestStr: string): BOOL;  
  • var  
  •   wd: HWND;  
  •   wtd: HWND;  
  •   wd1: HWND;  
  •   pid: DWORD;  
  •   hd: THandle;  
  •   num, i: integer;  
  •   n: ULONG;  
  •   p: TTBBUTTON;  
  •   pp: ^TTBBUTTON;  
  •   x: string;  
  •   name: array[0..255of WCHAR;  
  •   whd, proid: ulong;  
  •   temp: string;  
  •   sp: ^TTBBUTTON;  
  •   _sp: TTBButton;  
  • begin  
  •   Result := False;  
  •   wd := FindWindow('Shell_TrayWnd'nil);  
  •   if (wd = 0then Exit;  
  •   
  •   wtd := FindWindowEx(wd, 0'TrayNotifyWnd'nil);  
  •   if (wtd = 0then Exit;  
  •   
  •   wtd := FindWindowEx(wtd, 0'SysPager'nil);  
  •   if (wtd = 0then Exit;  
  •   
  •   wd1 := FindWindowEx(wtd, 0'ToolbarWindow32'nil);  
  •   if (wd1 = 0then Exit;  
  •   
  •   pid := 0;  
  •   GetWindowThreadProcessId(wd1, @pid);  
  •   if (pid = 0then Exit;  
  •   
  •   hd := OpenProcess(PROCESS_ALL_ACCESS, true, pid);  
  •   if (hd = 0then Exit;  
  •   num := SendMessage(wd1, TB_BUTTONCOUNT, 00);  
  •   sp := @_sp;  
  •   for i := 0 to num do  
  •   begin  
  •     SendMessage(wd1, TB_GETBUTTON, i, integer(sp));  
  •     pp := @p;  
  •     ReadProcessMemory(hd, sp, pp, sizeof(p), n);  
  •     name[0] := Char(0);  
  •     if (Cardinal(p.iString) <> $FFFFFFFFthen  
  •     begin  
  •       try  
  •         ReadProcessMemory(hd, pointer(p.iString), @name, 255, n);  
  •         name[n] := Char(0);  
  •       except  
  •       end;  
  •       temp := name;  
  •       try  
  •         whd := 0;  
  •         ReadProcessMemory(hd, pointer(p.dwData), @whd, 4, n);  
  •       except  
  •       end;  
  •       proid := 0;  
  •       GetWindowThreadProcessId(whd, @proid);  
  •       AFindList.Add(Format('%d_%s_%x_%x', [i, temp, whd, proid]));  
  •       if CompareStr(temp, ADestStr) = 0 then Result := True;  
  •     end;  
  •   end;  
  • end;  
  •   
  • { 获取SQL Server用户数据库列表 }  
  • procedure YzGetSQLServerDBList(ADBHostIP, ALoginPwd: string;ADBList: TStringList);  
  • var  
  •   PQuery: TADOQuery;  
  •   ConnectStr: string;  
  • begin  
  •   ConnectStr := 'Provider=SQLOLEDB.1;Password=' + ALoginPwd  
  •     + ';Persist Security Info=True;User ID=sa;Initial Catalog=master'  
  •     + ';Data Source=' + ADBHostIP;  
  •   ADBList.Clear;  
  •   PQuery := TADOQuery.Create(nil);  
  •   try  
  •     PQuery.ConnectionString := ConnectStr;  
  •     PQuery.SQL.Text:='select name from sysdatabases where dbid > 6';  
  •     PQuery.Open;  
  •     while not PQuery.Eof do  
  •     begin  
  •       ADBList.add(PQuery.Fields[0].AsString);  
  •       PQuery.Next;  
  •     end;  
  •   finally  
  •     PQuery.Free;  
  •   end;  
  • end;  
  •   
  • { 检测数据库中是否存在给定的表 }  
  • procedure YzGetTableList(ConncetStr: string;ATableList: TStringList);  
  • var  
  •   FConnection: TADOConnection;  
  • begin  
  •   FConnection := TADOConnection.Create(nil);  
  •   try  
  •     FConnection.LoginPrompt := False;  
  •     FConnection.Connected := False;  
  •     FConnection.ConnectionString := ConncetStr;  
  •     FConnection.Connected := True;  
  •     FConnection.GetTableNames(ATableList, False);  
  •   finally  
  •     FConnection.Free;  
  •   end;  
  • end;  
  •   
  • { 将域名解释成IP地址 }  
  • function YzDomainToIP(HostName: string): string;  
  • type  
  •   tAddr = array[0..100of PInAddr;  
  •   pAddr = ^tAddr;  
  • var  
  •   I: Integer;  
  •   WSA: TWSAData;  
  •   PHE: PHostEnt;  
  •   P: pAddr;  
  • begin  
  •   Result := '';  
  •   WSAStartUp($101, WSA);  
  •   try  
  •     PHE := GetHostByName(pChar(HostName));  
  •     if (PHE <> nilthen  
  •     begin  
  •       P := pAddr(PHE^.h_addr_list);  
  •       I := 0;  
  •       while (P^[I] <> nildo  
  •       begin  
  •         Result := (inet_nToa(P^[I]^));  
  •         Inc(I);  
  •       end;  
  •     end;  
  •   except  
  •   end;  
  •   WSACleanUp;  
  • end;  
  •   
  • { 移去系统托盘失效图标 }  
  • procedure YzRemoveDeadIcons();  
  • var  
  •   hTrayWindow: HWND;  
  •   rctTrayIcon: TRECT;  
  •   nIconWidth, nIconHeight:integer;  
  •   CursorPos: TPoint;  
  •   nRow, nCol: Integer;  
  • Begin  
  •   //Get tray window handle and bounding rectangle  
  •   hTrayWindow := FindWindowEx(FindWindow('Shell_TrayWnd 'nil), 0'TrayNotifyWnd 'nil);  
  •   if Not (GetWindowRect(hTrayWindow, rctTrayIcon)) then Exit;  
  •   //Get small icon metrics  
  •   nIconWidth := GetSystemMetrics(SM_CXSMICON);  
  •   nIconHeight := GetSystemMetrics(SM_CYSMICON);  
  •   //Save current mouse position   }  
  •   GetCursorPos(CursorPos);  
  •   //Sweep the mouse cursor over each icon in the tray in both dimensions  
  •   for nRow := 0 To ((rctTrayIcon.bottom - rctTrayIcon.top) div nIconHeight) Do  
  •   Begin  
  •     for nCol := 0 To ((rctTrayIcon.right - rctTrayIcon.left) div nIconWidth) Do  
  •     Begin  
  •       SetCursorPos(rctTrayIcon.left + nCol * nIconWidth + 5,  
  •         rctTrayIcon.top + nRow * nIconHeight + 5);  
  •       Sleep(0);  
  •     end;  
  •   end;  
  •   //Restore mouse position  
  •   SetCursorPos(CursorPos.x, CursorPos.x);  
  •   //Redraw tray window(to fix bug in multi-line tray area)  
  •   RedrawWindow(hTrayWindow, nil0, RDW_INVALIDATE Or RDW_ERASE Or RDW_UPDATENOW);  
  • end;  
  •   
  • { 转移程序占用内存至虚拟内存 }  
  • procedure YzClearMemory;  
  • begin  
  •   if Win32Platform = VER_PLATFORM_WIN32_NT then  
  •   begin  
  •     SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF$FFFFFFFF);  
  •     Application.ProcessMessages;  
  •   end;  
  • end;  
  •   
  • { 检测允许试用的天数是否已到期 }  
  • function YzCheckTrialDays(AllowDays: Integer): Boolean;  
  • var  
  •   Reg_ID, Pre_ID: TDateTime;  
  •   FRegister: TRegistry;  
  • begin  
  •   { 初始化为试用没有到期 }  
  •   Result := True;  
  •   FRegister := TRegistry.Create;  
  •   try  
  •     with FRegister do  
  •     begin  
  •       RootKey := HKEY_LOCAL_MACHINE;  
  •       if OpenKey('Software/Microsoft/Windows/CurrentSoftware/'  
  •         + YzGetMainFileName(Application.ExeName), True) then  
  •       begin  
  •         if ValueExists('DateTag'then  
  •         begin  
  •           Reg_ID := ReadDate('DateTag');  
  •           if Reg_ID = 0 then Exit;  
  •           Pre_ID := ReadDate('PreDate');  
  •           { 允许使用的时间到 }  
  •           if ((Reg_ID <> 0and (Now - Reg_ID > AllowDays)) or  
  •             (Pre_ID <> Reg_ID) or (Reg_ID > Now) then  
  •           begin  
  •             { 防止向前更改日期 }  
  •             WriteDateTime('PreDate', Now + 20000);  
  •             Result := False;  
  •           end;  
  •         end  
  •         else  
  •         begin  
  •           { 首次运行时保存初始化数据 }  
  •           WriteDateTime('PreDate', Now);  
  •           WriteDateTime('DateTag', Now);  
  •         end;  
  •       end;  
  •     end;  
  •   finally  
  •     FRegister.Free;  
  •   end;  
  • end;  
  •   
  • { 指定长度的随机小写字符串函数 }  
  • function YzRandomStr(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);  
  •   Result := LowerCase(Result);  
  • end;  
  •   
  • end.  
  • 本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
    打开APP,阅读全文并永久保存 查看更多类似文章
    猜你喜欢
    类似文章
    【热】打开小程序,算一算2024你的财运
    delphi 获取网络文件大小
    vclZip控件的使用
    delphi基础开发技巧
    XML编程手记,XML操作类
    Delphi 的接口
    字符串操作中较常用的函数
    更多类似文章 >>
    生活服务
    热点新闻
    分享 收藏 导长图 关注 下载文章
    绑定账号成功
    后续可登录账号畅享VIP特权!
    如果VIP功能使用有故障,
    可点击这里联系客服!

    联系客服