📄 cncommon.pas
字号:
function GetTextFileLineCount(FileName: String): Integer;{* 返回文本文件的行数}function Spc(Len: Integer): string;{* 返回空格串}procedure SwapStr(var s1, s2: string);{* 交换字串}procedure SeparateStrAndNum(const AInStr: string; var AOutStr: string; var AOutNum: Integer);{* 分割"非数字+数字"格式的字符串中的非数字和数字}function UnQuotedStr(const str: string; const ch: Char; const sep: string = ''): string;{* 去除被引用的字符串的引用}function CharPosWithCounter(const Sub: Char; const AStr: String; Counter: Integer = 1): Integer;{* 查找字符串中出现的第 Counter 次的字符的位置 }function CountCharInStr(const Sub: Char; const AStr: string): Integer;{* 查找字符串中字符的出现次数}function IsValidIdentChar(C: Char; First: Boolean = False): Boolean;{* 判断字符是否有效标识符字符,First 表示是否为首字符}{$IFDEF COMPILER5}function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;{* Delphi5没有实现布尔型转换为字符串,类似于Delphi6,7的实现}{$ENDIF COMPILER5}function LinesToStr(const Lines: string): string;{* 多行文本转单行(换行符转'\n')}function StrToLines(const Str: string): string;{* 单行文本转多行('\n'转换行符)}function MyDateToStr(Date: TDate): string;{* 日期转字符串,使用 yyyy.mm.dd 格式}function RegReadStringDef(const RootKey: HKEY; const Key, Name, Def: string): string;{* 取注册表键值}procedure ReadStringsFromIni(Ini: TCustomIniFile; const Section: string; Strings: TStrings);{* 从 INI 中读取字符串列表}procedure WriteStringsToIni(Ini: TCustomIniFile; const Section: string; Strings: TStrings);{* 写字符串列表到 INI 文件中}function VersionToStr(Version: DWORD): string;{* 版本号转成字符串,如 $01020000 --> '1.2.0.0' }function StrToVersion(s: string): DWORD;{* 字符串转成版本号,如 '1.2.0.0' --> $01020000,如果格式不正确,返回 $01000000 }function CnDateToStr(Date: TDateTime): string;{* 转换日期为 yyyy.mm.dd 格式字符串 }function CnStrToDate(const S: string): TDateTime;{* 将 yyyy.mm.dd 格式字符串转换为日期 }function DateTimeToFlatStr(const DateTime: TDateTime): string;{* 日期时间转 '20030203132345' 式样的 14 位数字字符串}function FlatStrToDateTime(const Section: string; var DateTime: TDateTime): Boolean;{* '20030203132345' 式样的 14 位数字字符串转日期时间}function StrToRegRoot(const s: string): HKEY;{* 字符串转注册表根键,支持 'HKEY_CURRENT_USER' 'HKCR' 长短两种格式}function RegRootToStr(Key: HKEY; ShortFormat: Boolean = True): string;{* 注册表根键转字符串,可选 'HKEY_CURRENT_USER' 'HKCR' 长短两种格式}function ExtractSubstr(const S: string; var Pos: Integer; const Delims: TSysCharSet): string;{* 从字符串中根据指定的分隔符分离出子串 |<PRE> const S: string - 源字符串 var Pos: Integer - 输入查找的起始位置,输出查找完成的结束位置 const Delims: TSysCharSet - 分隔符集合 Result: string - 返回子串 |</PRE>}function WildcardCompare(const FileWildcard, FileName: string; const IgnoreCase: Boolean = True): Boolean;{* 文件名通配符比较}function ScanCodeToAscii(Code: Word): Char;{* 根据当前键盘布局将键盘扫描码转换成 ASCII 字符,可在 WM_KEYDOWN 等处使用 由于不调用 ToAscii,故可支持使用 Accent Character 的键盘布局 }function IsDeadKey(Key: Word): Boolean;{* 返回一个虚拟键是否 Dead key}function VirtualKeyToAscii(Key: Word): Char;{* 根据当前键盘状态将虚拟键转换成 ASCII 字符,可在 WM_KEYDOWN 等处使用 可能会导致 Accent Character 不正确}function VK_ScanCodeToAscii(VKey: Word; Code: Word): Char;{* 根据当前的键盘布局将虚拟键和扫描码转换成 ASCII 字符。通过虚拟键来处理小键盘, 扫描码处理大键盘,支持 Accent Character 的键盘布局 }function GetShiftState: TShiftState;{* 返回当前的按键状态,暂不支持 ssDouble 状态 }function IsShiftDown: Boolean;{* 判断当前 Shift 是否按下 }function IsAltDown: Boolean;{* 判断当前 Alt 是否按下 }function IsCtrlDown: Boolean;{* 判断当前 Ctrl 是否按下 }function IsInsertDown: Boolean;{* 判断当前 Insert 是否按下 }function IsCapsLockDown: Boolean;{* 判断当前 Caps Lock 是否按下 }function IsNumLockDown: Boolean;{* 判断当前 NumLock 是否按下 }function IsScrollLockDown: Boolean;{* 判断当前 Scroll Lock 是否按下 }function RemoveClassPrefix(const ClassName: string): string;{* 删除类名前缀 T}function CnAuthorEmailToStr(Author, Email: string): string;{* 用分号分隔的作者、邮箱字符串转换为输出格式,例如: |<PRE> Author = 'Tom;Jack;Bill' Email = 'tom@email.com;jack@email.com;Bill@email.net' Result = 'Tom(tom@email.com)' + #13#10 + 'Jack(jack@email.com)' + #13#10 + 'Bill(bill@email.net) |</PRE>}//------------------------------------------------------------------------------// 扩展的对话框函数//------------------------------------------------------------------------------procedure InfoDlg(Mess: string; Caption: string = ''; Flags: Integer = MB_OK + MB_ICONINFORMATION);{* 显示提示窗口}function InfoOk(Mess: string; Caption: string = ''): Boolean;{* 显示提示确认窗口}procedure ErrorDlg(Mess: string; Caption: string = '');{* 显示错误窗口}procedure WarningDlg(Mess: string; Caption: string = '');{* 显示警告窗口}function QueryDlg(Mess: string; DefaultNo: Boolean = False; Caption: string = ''): Boolean;{* 显示查询是否窗口}const csDefComboBoxSection = 'History';function CnInputQuery(const ACaption, APrompt: string; var Value: string; Ini: TCustomIniFile = nil; const Section: string = csDefComboBoxSection): Boolean;{* 输入对话框}function CnInputBox(const ACaption, APrompt, ADefault: string; Ini: TCustomIniFile = nil; const Section: string = csDefComboBoxSection): 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;{* 取时间毫秒分量}//------------------------------------------------------------------------------// 位操作函数//------------------------------------------------------------------------------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;{* 取二进制位}//------------------------------------------------------------------------------// 系统功能函数//------------------------------------------------------------------------------type PDLLVERSIONINFO = ^TDLLVERSIONINFO; TDLLVERSIONINFO = packed record cbSize: DWORD; dwMajorVersion: DWORD; dwMinorVersion: DWORD; dwBuildNumber: DWORD; dwPlatformId: DWORD; end; PDLLVERSIONINFO2 = ^TDLLVERSIONINFO2; TDLLVERSIONINFO2 = packed record info1: TDLLVERSIONINFO; dwFlags: DWORD; ullVersion: ULARGE_INTEGER; end;procedure MoveMouseIntoControl(AWinControl: TControl);{* 移动鼠标到控件}procedure AddComboBoxTextToItems(ComboBox: TComboBox; MaxItemsCount: Integer = 10);{* 将 ComboBox 的文本内容增加到下拉列表中}function DynamicResolution(x, y: WORD): Boolean;{* 动态设置分辨率}procedure StayOnTop(Handle: HWND; OnTop: Boolean);{* 窗口最上方显示}procedure SetHidden(Hide: Boolean);{* 设置程序是否出现在任务栏}procedure SetTaskBarVisible(Visible: Boolean);{* 设置任务栏是否可见}procedure SetDesktopVisible(Visible: Boolean);{* 设置桌面是否可见}function ForceForegroundWindow(HWND: HWND): Boolean;{* 强制让一个窗口显示在前台}function GetWorkRect(const Form: TCustomForm = nil): TRect;{* 取桌面区域}procedure BeginWait;{* 显示等待光标}procedure EndWait;{* 结束等待光标}function CheckWindows9598: Boolean;{* 检测是否Win95/98平台}function CheckWinXP: Boolean;{* 检测是否WinXP以上平台}function DllGetVersion(const dllname: string; var DVI: TDLLVERSIONINFO2): Boolean;{* 获得Dll的版本信息}function GetOSString: string;{* 返回操作系统标识串}function GetComputeNameStr : string;{* 得到本机名}function GetLocalUserName: string;{* 得到本机用户名}function GetRegisteredCompany: string;{* 得到公司名}function GetRegisteredOwner: string;{* 得到注册用户名}//------------------------------------------------------------------------------// 其它过程//------------------------------------------------------------------------------function GetControlScreenRect(AControl: TControl): TRect;{* 返回控件在屏幕上的坐标区域 }procedure SetControlScreenRect(AControl: TControl; ARect: TRect);{* 设置控件在屏幕上的坐标区域 }procedure ListboxHorizontalScrollbar(Listbox: TCustomListBox);{* 为 Listbox 增加水平滚动条}function TrimInt(Value, Min, Max: Integer): Integer;{* 输出限制在Min..Max之间}function CompareInt(V1, V2: Integer; Desc: Boolean = False): Integer;{* 比较两个整数,V1 > V2 返回 1,V1 < V2 返回 -1,V1 = V2 返回 0 如果 Desc 为 True,返回结果反向 }function IntToByte(Value: Integer): Byte;{* 输出限制在0..255之间}function InBound(Value: Integer; V1, V2: Integer): Boolean;{* 判断整数Value是否在V1和V2之间}function SameMethod(Method1, Method2: TMethod): Boolean;{* 比较两个方法地址是否相等}function HalfFind(List: TList; P: Pointer; SCompare: TListSortCompare): Integer;{* 二分法在排序列表中查找}type TFindRange = record tgFirst: Integer; tgLast: Integer; end;function HalfFindEx(List: TList; P: Pointer; SCompare: TListSortCompare): TFindRange;{* 二分法在排序列表中查找,支持重复记录,返回一个范围值}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下让喇叭发声}function GetLastErrorMsg(IncludeErrorCode: Boolean = False): string;{* 取得最后一次错误信息}procedure ShowLastError;{* 显示Win32 Api运行结果信息}function GetHzPy(const AHzStr: string): string;{* 取汉字的拼音}function GetSelText(edt: TCustomEdit): string;{* 获得CustomEdit选中的字符串,可正确处理使用了XP样式的程序}function SoundCardExist: Boolean;{* 声卡是否存在}function FindFormByClass(AClass: TClass): TForm;{* 根据指定类名查找窗体}function InheritsFromClassName(ASrc: TClass; const AClass: string): Boolean; overload;{* 判断 ASrc 是否派生自类名为 AClass 的类 }function InheritsFromClassName(AObject: TObject; const AClass: string): Boolean; overload;{* 判断 AObject 是否派生自类名为 AClass 的类 }procedure KillProcessByFileName(const FileName: String);{* 根据文件名结束进程,不区分路径}function IndexStr(AText: string; AValues: array of string; IgCase: Boolean = True): Integer;{* 查找字符串在动态数组中的索引,用于string类型使用Case语句}function IndexInt(ANum: Integer; AValues: array of Integer): Integer;{* 查找整形变量在动态数组中的索引,用于变量使用Case语句}procedure TrimStrings(AList: TStrings);{* 删除空行和每一行的行首尾空格 }//==============================================================================// 级联属性操作相关函数 by LiuXiao//==============================================================================function GetPropInfoIncludeSub(Instance: TObject; const PropName: string; AKinds: TTypeKinds = []): PPropInfo;{* 获得级联属性信息}function GetPropValueIncludeSub(Instance: TObject; PropName: string; PreferStrings: Boolean = True): Variant;{* 获得级联属性值}function SetPropValueIncludeSub(Instance: TObject; const PropName: string; const Value: Variant): Boolean;{* 设置级联属性值}procedure DoSetPropValueIncludeSub(Instance: TObject; const PropName: string; Value: Variant);{* 设置级联属性值,不处理异常}function StrToSetValue(const Value: string; PInfo: PTypeInfo): Integer;{* 字符串转集合值 }procedure GetAllPropNames(AComp: TObject; PropNames: TStrings; const BaseName: string = '');{* 获得某对象的所有属性的字符串值,包括子属性的属性 } //==============================================================================// 其他杂项函数 by LiuXiao//==============================================================================type TCnFontControl = class(TControl) public property ParentFont; property Font; end;function IsParentFont(AControl: TControl): Boolean;{* 判断某 Control 的 ParentFont 属性是否为 True,如无 Parent 则返回 False }function GetParentFont(AControl: TComponent): TFont;{* 取某 Control 的 Parent 的 Font 属性,如果没有返回 nil }const InvalidFileNameChar: set of Char = ['\', '/', ':', '*', '?', '"', '<', '>', '|'];implementation
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -