自己写的一些Delphi常用函数

来源:互联网 发布:.net 465端口发邮件 编辑:程序博客网 时间:2024/05/16 05:26
   今天在整理以前写过的代码,发现有些函数还是挺实用的,决定将其贴到Blog上,与众多好友一起分享。
{*******************************************************************************
 
*  模块名称: 公用函数库
 
*  编写人员: Chris Mao
 
*  编写日期: 2004.10.30
 
******************************************************************************}


unit JrCommon;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ShellAPI, CommDlg, MMSystem, StdCtrls, Registry, JrConsts, Winsock;

//------------------------------------------------------------------------------
//窗体类函数
//------------------------------------------------------------------------------
function FindFormClass(FormClassName: PChar): TFormClass;
function HasInstance(FormClassName: PChar): Boolean;

//------------------------------------------------------------------------------
//公用对话框函数
//------------------------------------------------------------------------------
procedure InfoDlg(const Msg: String; ACaption: String = SInformation);
{ 信息对话框 }

procedure ErrorDlg(
const Msg: String; ACaption: String = SError);
{ 错误对话框 }

procedure WarningDlg(
const Msg: String; ACaption: String = SWarning);
{ 警告对话框 }

function QueryDlg(
const Msg: String; ACaption: String = SQuery): Boolean;
{ 确认对话框  }

function QueryNoDlg(
const Msg: string; ACaption: string = SQuery): Boolean;
{ 确认对话框,默认按钮为"" }

function JrInputQuery(
const ACaption, APrompt: String; var Value: string): Boolean;
{ 输入对话框 }

function JrInputBox(
const ACaption, APrompt, ADefault: string): String;
{ 输入对话框 }

//------------------------------------------------------------------------------
//扩展文件目录操作函数
//------------------------------------------------------------------------------

procedure RunFile(
const FileName: String; Handle: THandle = 0; Param: string = '');
{ 运行一个文件 }

function AppPath: 
string;
{ 应用程序路径 }

function GetProgramFilesDir: 
string;
{ 取Program Files目录 }

function GetWindowsDir: 
string;
{ 取Windows目录}

function GetWindowsTempPath: 
string;
{ 取临时文件路径 }

function GetSystemDir: 
string;
{ 取系统目录 }

//------------------------------------------------------------------------------
//扩展字符串操作函数
//------------------------------------------------------------------------------

function InStr(
const sShort: stringconst sLong: string): Boolean;
{ 判断s1是否包含在s2中 }

function IntToStrSp(Value: Integer; SpLen: Integer 
= 3; Sp: Char = ','): string;
{ 带分隔符的整数-字符转换 }

function ByteToBin(Value: Byte): 
string;
{ 字节转二进制串 }

function StrRight(Str: 
string; Len: Integer): string;
{ 返回字符串右边的字符 }

function StrLeft(Str: 
string; Len: Integer): string;
{ 返回字符串左边的字符 }

function Spc(Len: Integer): 
string;
{ 返回空格串 }

procedure SwapStr(var s1, s2: 
string);
{ 交换字串 }

//------------------------------------------------------------------------------
// 扩展日期时间操作函数
//------------------------------------------------------------------------------

function GetYear(Date: TDate): Word;
{ 取日期年份分量 }

function GetMonth(Date: TDate): Word;
{ 取日期月份分量 }

function GetDay(Date: TDate): Word;
{ 取日期天数分量 }

function GetHour(Time: TTime): Word;
{ 取时间小时分量 }

function GetMinute(Time: TTime): Word;
{ 取时间分钟分量 }

function GetSecond(Time: TTime): Word;
{ 取时间秒分量 }

function GetMSecond(Time: TTime): Word;
{ 取时间毫秒分量 }

//------------------------------------------------------------------------------
// 位操作函数
//------------------------------------------------------------------------------
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;
{ 取二进制位 }

//------------------------------------------------------------------------------
// 系统功能函数
//------------------------------------------------------------------------------

procedure ChangeFocus(Handle: THandle; Forword: Boolean 
= False);
{ 改变焦点 }

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 GetWorkRect: TRect;
{ 取桌面区域 }

procedure BeginWait;
{ 显示等待光标 }

procedure EndWait;
{ 结束等待光标 }

function CheckWindows9598: Boolean;
{ 检测是否Win95/98平台 }

function GetOSString: 
string;
{ 返回操作系统标识串 }

function GetComputeNameStr : 
string;
{ 得到本机名 }

function GetLocalUserName: 
string;
{ 得到本机用户名 }

function GetLocalIP: String;
{ 得到本机IP地址 }

//------------------------------------------------------------------------------
// 其它过程
//------------------------------------------------------------------------------

function TrimInt(Value, Min, Max: Integer): Integer; overload;
{ 输出限制在Min..Max之间 }

function InBound(Value: Integer; Min, Max: Integer): Boolean;
{ 判断整数Value是否在Min和Max之间 }

procedure Delay(
const uDelay: DWORD);
{ 延时 }

procedure BeepEx(
const Freq: WORD = 1200const Delay: WORD = 1);
{ 在Win9X下让喇叭发声 }

function GetHzPy(
const AHzStr: string): string;
{ 取汉字的拼音 }

function UpperCaseMoney(
const Money: Double): String;
{ 转换为大与金额 }

function SoundCardExist: Boolean;
{ 声卡是否存在 }

implementation

//------------------------------------------------------------------------------
//窗体类函数
//------------------------------------------------------------------------------

function FindFormClass(FormClassName: PChar): TFormClass;
begin
  Result :
= TFormClass(GetClass(FormClassName));
end;

function HasInstance(FormClassName: PChar): Boolean;
var
  i: integer;
begin
  Result:
=False;
  
for i := Screen.FormCount - 1 downto 0 do begin
    Result :
= SameText(Screen.Forms[i].ClassName, FormClassName);
    
if Result then begin
      TForm(Screen.Forms[i]).BringToFront;
      Break;
    end;
  end;
end;

//------------------------------------------------------------------------------
//公用对话框函数
//------------------------------------------------------------------------------

procedure InfoDlg(
const Msg: String; ACaption: String = SInformation);
begin
  Application.MessageBox(PChar(Msg), PChar(ACaption), MB_OK 
+ MB_ICONINFORMATION);
end;

procedure ErrorDlg(
const Msg: String; ACaption: String = SError);
begin
  Application.MessageBox(PChar(Msg), PChar(ACaption), MB_OK 
+ MB_ICONERROR);
end;

procedure WarningDlg(
const Msg: String; ACaption: String = SWarning);
begin
  Application.MessageBox(PChar(Msg), PChar(ACaption), MB_OK 
+ MB_ICONWARNING);
end;

function QueryDlg(
const Msg: String; ACaption: String = SQuery): Boolean;
begin
  Result :
= Application.MessageBox(PChar(Msg), PChar(ACaption),
    MB_YESNO 
+ MB_ICONQUESTION) = IDYES;
end;

function QueryNoDlg(
const Msg: string; ACaption: string = SQuery): Boolean;
begin
  Result :
= Application.MessageBox(PChar(Msg), PChar(ACaption),
    MB_YESNO 
+ MB_ICONQUESTION + MB_DEFBUTTON2) = IDYES;
end;

function GetAveCharSize(Canvas: TCanvas): TPoint;
var
  I: Integer;
  Buffer: array[
0..51] of Char;
begin
  
for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
  
for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
  GetTextExtentPoint(Canvas.Handle, Buffer, 
52, TSize(Result));
  Result.X :
= Result.X div 52;
end;

function JrInputQuery(
const ACaption, APrompt: String; var Value: string): Boolean;
var
  Form: TForm;
  Prompt: TLabel;
  Edit: TEdit;
  DialogUnits: TPoint;
  ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
  Result :
= False;
  Form :
= TForm.Create(Application);
  with Form 
do
    
try
      Scaled :
= False;
      Font.Name :
= SDefaultFontName;
      Font.Size :
= SDefaultFontSize;
      Font.Charset :
= SDefaultFontCharset;
      Canvas.Font :
= Font;
      DialogUnits :
= GetAveCharSize(Canvas);
      BorderStyle :
= bsDialog;
      Caption :
= ACaption;
      ClientWidth :
= MulDiv(180, DialogUnits.X, 4);
      ClientHeight :
= MulDiv(63, DialogUnits.Y, 8);
      Position :
= poScreenCenter;
      Prompt :
= TLabel.Create(Form);
      with Prompt 
do
      begin
        Parent :
= Form;
        AutoSize :
= True;
        Left :
= MulDiv(8, DialogUnits.X, 4);
        Top :
= MulDiv(8, DialogUnits.Y, 8);
        Caption :
= APrompt;
      end;
      Edit :
= TEdit.Create(Form);
      with Edit 
do
      begin
        Parent :
= Form;
        Left :
= Prompt.Left;
        Top :
= MulDiv(19, DialogUnits.Y, 8);
        Width :
= MulDiv(164, DialogUnits.X, 4);
        MaxLength :
= 255;
        Text :
= Value;
        SelectAll;
      end;
      ButtonTop :
= MulDiv(41, DialogUnits.Y, 8);
      ButtonWidth :
= MulDiv(50, DialogUnits.X, 4);
      ButtonHeight :
= MulDiv(14, DialogUnits.Y, 8);
      with TButton.Create(Form) 
do
      begin
        Parent :
= Form;
        Caption :
= SMsgDlgOK;
        ModalResult :
= mrOk;
        Default :
= True;
        SetBounds(MulDiv(
38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
          ButtonHeight);
      end;
      with TButton.Create(Form) 
do
      begin
        Parent :
= Form;
        Caption :
= SMsgDlgCancel;
        ModalResult :
= mrCancel;
        Cancel :
= True;
        SetBounds(MulDiv(
92, DialogUnits.X, 4), ButtonTop, ButtonWidth,
          ButtonHeight);
      end;
      
if ShowModal = mrOk then
      begin
        Value :
= Edit.Text;
        Result :
= True;
      end;
    
finally
      Form.Free;
    end;
end;

function JrInputBox(
const ACaption, APrompt, ADefault: string): String;
begin
  Result :
= ADefault;
  JrInputQuery(ACaption, APrompt, Result);
end;

//------------------------------------------------------------------------------
//扩展文件目录操作函数
//------------------------------------------------------------------------------

procedure RunFile(
const FileName: String; Handle: THandle = 0; Param: string = '');
begin
  ShellExecute(Handle, nil, PChar(FileName), PChar(Param), nil, SW_SHOWNORMAL);
end;

function AppPath: 
string;
begin
  Result :
= ExtractFilePath(Application.ExeName);
end;

const
  HKLM_CURRENT_VERSION_WINDOWS 
= 'SoftwareMicrosoftWindowsCurrentVersion';
  
function RelativeKey(
const Key: string): PChar;
begin
  Result :
= PChar(Key);
  
if (Key <> '') and (Key[1= '') then
    Inc(Result);
end;

function RegReadStringDef(
const RootKey: HKEY; const Key, Name, Def: string): string;
var
  RegKey: HKEY;
  Size: DWORD;
  StrVal: 
string;
  RegKind: DWORD;
begin
  Result :
= Def;
  
if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS then
  begin
    RegKind :
= 0;
    Size :
= 0;
    
if RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, nil, @Size) = ERROR_SUCCESS then
      
if RegKind in [REG_SZ, REG_EXPAND_SZ] then
      begin
        SetLength(StrVal, Size);
        
if RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, PByte(StrVal), @Size) = ERROR_SUCCESS then
        begin
          SetLength(StrVal, StrLen(PChar(StrVal)));
          Result :
= StrVal;
        end;
      end;
    RegCloseKey(RegKey);
  end;
end;

procedure StrResetLength(var S: AnsiString);
begin
  SetLength(S, StrLen(PChar(S)));
end;

function GetProgramFilesDir: 
string;
begin
  Result :
= RegReadStringDef(HKEY_LOCAL_MACHINE, HKLM_CURRENT_VERSION_WINDOWS, 'ProgramFilesDir''');
end;

function GetWindowsDir: 
string;
var
  Required: Cardinal;
begin
  Result :
= '';
  Required :
= GetWindowsDirectory(nil, 0);
  
if Required <> 0 then
  begin
    SetLength(Result, Required);
    GetWindowsDirectory(PChar(Result), Required);
    StrResetLength(Result);
  end;
end;

function GetWindowsTempPath: 
string;
var
  Required: Cardinal;
begin
  Result :
= '';
  Required :
= GetTempPath(0, nil);
  
if Required <> 0 then
  begin
    SetLength(Result, Required);
    GetTempPath(Required, PChar(Result));
    StrResetLength(Result);
  end;
end;

function GetSystemDir: 
string;
var
  Required: Cardinal;
begin
  Result :
= '';
  Required :
= GetSystemDirectory(nil, 0);
  
if Required <> 0 then
  begin
    SetLength(Result, Required);
    GetSystemDirectory(PChar(Result), Required);
    StrResetLength(Result);
  end;
end;

//------------------------------------------------------------------------------
//扩展字符串操作函数
//------------------------------------------------------------------------------

function InStr(
const sShort: stringconst sLong: string): Boolean;
var
  s1, s2: 
string;
begin
  s1 :
= LowerCase(sShort);
  s2 :
= LowerCase(sLong);
  Result :
= Pos(s1, s2) > 0;
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);
    
if ((j mod SpLen) = 0) and (i <> 1) then Result := Sp + Result;
  end;
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 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 Spc(Len: Integer): 
string;
begin
  SetLength(Result, Len);
  FillChar(PChar(Result)
^, Len, ' ');
end;

procedure SwapStr(var s1, s2: 
string);
var
  tempstr: 
string;
begin
  tempstr :
= s1;
  s1 :
= s2;
  s2 :
= tempstr;
end;

//------------------------------------------------------------------------------
// 扩展日期时间操作函数
//------------------------------------------------------------------------------

function GetYear(Date: TDate): Word;
var
  m, d: WORD;
begin
  DecodeDate(Date, Result, m, d);
end;

function GetMonth(Date: TDate): Word;
var
  y, d: WORD;
begin
  DecodeDate(Date, y, Result, d);
end;

function GetDay(Date: TDate): Word;
var
  y, m: WORD;
begin
  DecodeDate(Date, y, m, Result);
end;

function GetHour(Time: TTime): Word;
var
  h, m, s, ms: WORD;
begin
  DecodeTime(Time, Result, m, s, ms);
end;

function GetMinute(Time: TTime): Word;
var
  h, s, ms: WORD;
begin
  DecodeTime(Time, h, Result, s, ms);
end;

function GetSecond(Time: TTime): Word;
var
  h, m, ms: WORD;
begin
  DecodeTime(Time, h, m, Result, ms);
end;

function GetMSecond(Time: TTime): Word;
var
  h, m, s: WORD;
begin
  DecodeTime(Time, h, m, s, Result);
end;

//------------------------------------------------------------------------------
// 位操作函数
//------------------------------------------------------------------------------

procedure SetBit(var Value: Byte; Bit: TByteBit; IsSet: Boolean); overload;
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); overload;
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); overload;
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; overload;
begin
  Result :
= Value and (1 shl Bit) <> 0;
end;

function GetBit(Value: WORD; Bit: TWordBit): Boolean; overload;
begin
  Result :
= Value and (1 shl Bit) <> 0;
end;

function GetBit(Value: DWORD; Bit: TDWordBit): Boolean; overload;
begin
  Result :
= Value and (1 shl Bit) <> 0;
end;

//------------------------------------------------------------------------------
// 系统功能函数
//------------------------------------------------------------------------------

procedure ChangeFocus(Handle: THandle; Forword: Boolean 
= False);
begin
  
if ForWord then
    PostMessage(Handle, WM_NEXTDLGCTL, 
10)
  
else
    PostMessage(Handle, WM_NEXTDLGCTL, 
00);
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;

procedure AddComboBoxTextToItems(ComboBox: TComboBox; MaxItemsCount: Integer 
= 10);
begin
  
if (ComboBox.Text <> '') and (ComboBox.Items.IndexOf(ComboBox.Text) < 0) then
  begin
    ComboBox.Items.Insert(
0, ComboBox.Text);
    
while (MaxItemsCount > 1) and (ComboBox.Items.Count > MaxItemsCount) do
      ComboBox.Items.Delete(ComboBox.Items.Count 
- 1);
  end;
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], 
0000, 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;

function GetWorkRect: TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA, 
0, @Result, 0)
end;

procedure BeginWait;
begin
  Screen.Cursor :
= crHourGlass;
end;

procedure EndWait;
begin
  Screen.Cursor :
= crDefault;
end;

function CheckWindows9598: Boolean;
var
  V: TOSVersionInfo;
begin
  V.dwOSVersionInfoSize :
= SizeOf(V);
  Result :
= False;
  
if not GetVersionEx(V) then Exit;
  
if V.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
    Result :
= True;
end;

function GetOSString: 
string;
var
  OSPlatform: 
string;
  BuildNumber: Integer;
begin
  Result :
= 'Unknown Windows Version';
  OSPlatform :
= 'Windows';
  BuildNumber :
= 0;

  
case Win32Platform of
    VER_PLATFORM_WIN32_WINDOWS:
      begin
        BuildNumber :
= Win32BuildNumber and $0000FFFF;
        
case Win32MinorVersion of
          
0..9:
            begin
              
if Trim(Win32CSDVersion) = 'B' then
                OSPlatform :
= 'Windows 95 OSR2'
              
else
                OSPlatform :
= 'Windows 95';
            end;
          
10..89:
            begin
              
if Trim(Win32CSDVersion) = 'A' then
                OSPlatform :
= 'Windows 98'
              
else
                OSPlatform :
= 'Windows 98 SE';
            end;
          
90:
            OSPlatform :
= 'Windows Millennium';
        end;
      end;
    VER_PLATFORM_WIN32_NT:
      begin
        
if Win32MajorVersion in [34] then
          OSPlatform :
= 'Windows NT'
        
else if Win32MajorVersion = 5 then
        begin
          
case Win32MinorVersion of
            
0: OSPlatform := 'Windows 2000';
            
1: OSPlatform := 'Windows XP';
          end;
        end;
        BuildNumber :
= Win32BuildNumber;
      end;
    VER_PLATFORM_WIN32s:
      begin
        OSPlatform :
= 'Win32s';
        BuildNumber :
= Win32BuildNumber;
      end;
  end;
  
if (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) or
    (Win32Platform 
= VER_PLATFORM_WIN32_NT) then
  begin
    
if Trim(Win32CSDVersion) = '' then
      Result :
= Format('%s %d.%d (Build %d)', [OSPlatform, Win32MajorVersion,
        Win32MinorVersion, BuildNumber])
    
else
      Result :
= Format('%s %d.%d (Build %d: %s)', [OSPlatform, Win32MajorVersion,
        Win32MinorVersion, BuildNumber, Win32CSDVersion]);
  end
  
else
    Result :
= Format('%s %d.%d', [OSPlatform, Win32MajorVersion, Win32MinorVersion])
end;

function GetComputeNameStr : 
string;
var
  dwBuff : DWORD;
  CmpName : array [
0..255] of Char;
begin
  Result :
= '';
  dwBuff :
= 256;
  FillChar(CmpName, SizeOf(CmpName), 
0);
  
if GetComputerName(CmpName, dwBuff) then
    Result :
= StrPas(CmpName);
end;

function GetLocalUserName: 
string;
var
  Count: DWORD;
begin
  Count :
= 256 + 1// UNLEN + 1
  
// set buffer size to 256 + 2 characters
  SetLength(Result, Count);
  
if GetUserName(PChar(Result), Count) then
    StrResetLength(Result)
  
else
    Result :
= '';
end;

function GetLocalIP: String;
type
    TaPInAddr 
= array [0..10] of PInAddr;
    PaPInAddr 
= ^TaPInAddr;
var
    phe  : PHostEnt;
    pptr : PaPInAddr;
    Buffer : array [
0..63] of char;
    I    : Integer;
    GInitData      : TWSADATA;

begin
    WSAStartup($
101, GInitData);
    Result :
= '';
    GetHostName(Buffer, SizeOf(Buffer));
    phe :
=GetHostByName(buffer);
    
if phe = nil then Exit;
    pptr :
= PaPInAddr(Phe^.h_addr_list);
    I :
= 0;
    
while pptr^[I] <> nil do begin
      result:
=StrPas(inet_ntoa(pptr^[I]^));
      Inc(I);
    end;
    WSACleanup;
end;

//------------------------------------------------------------------------------
// 其它过程
//------------------------------------------------------------------------------

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;

function InBound(Value: Integer; Min, Max: Integer): Boolean;
begin
  Result :
= (Value >= Min) and (Value <= Max);
end;

procedure Delay(
const uDelay: DWORD);
var
  n: DWORD;
begin
  n :
= GetTickCount;
  
while ((GetTickCount - n) <= uDelay) do
    Application.ProcessMessages;
end;

procedure BeepEx(
const Freq: WORD = 1200const 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;

function GetHzPy(
const AHzStr: string): string;
const
  ChinaCode: array[
0..250..1] of Integer = ((16011636), (16371832), (18332077),
    (
20782273), (22742301), (23022432), (24332593), (25942786), (99990000),
    (
27873105), (31063211), (32123471), (34723634), (36353722), (37233729),
    (
37303857), (38584026), (40274085), (40864389), (43904557), (99990000),
    (
99990000), (45584683), (46844924), (49255248), (52495589));
var
  i, j, HzOrd: Integer;
begin
  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 UpperCaseMoney(
const Money: Double): String;
var
  tmp1,rr :
string;
  l,i,j,k:integer;
  r: Double;
const
  n1: array[
0..9] of string = ('''''''''',
                               
'''''''''');
  n2: array[
0..3] of string = ('''' ,'''');
  n3: array[
0..2] of string = ('''''亿');
begin
  r:
=Money;
  tmp1:
=FormatFloat('#.00',r);
  l:
=length(tmp1);
  rr:
='';
  
if strtoint(tmp1[l])<>0 then begin
    rr:
='';
    rr:
=n1[strtoint(tmp1[l])]+rr;
  end;

  
if strtoint(tmp1[l-1])<>0 then begin
    rr:
=''+rr;
    rr:
=n1[strtoint(tmp1[l-1])]+rr;
  end;

  i:
=l-3;
  j:
=0;k:=0;
  
while i>0 do begin
    
if j mod 4=0 then begin
      rr:
=n3[k]+rr;
      inc(k);
if k>2 then k:=1;
      j:
=0;
    end;
    
if strtoint(tmp1[i])<>0 then
      rr:
=n2[j]+rr;
    rr:
=n1[strtoint(tmp1[i])]+rr;
    inc(j);
    dec(i);
  end;

  
while pos('零零',rr)>0 do
    rr:
= stringreplace(rr,'零零','',[rfReplaceAll]);
  rr:
=stringreplace(rr,'零亿','亿零',[rfReplaceAll]);
  
while pos('零零',rr)>0 do
    rr:
= stringreplace(rr,'零零','',[rfReplaceAll]);
  rr:
=stringreplace(rr,'零万','万零',[rfReplaceAll]);
  
while pos('零零',rr)>0 do
    rr:
= stringreplace(rr,'零零','',[rfReplaceAll]);
  rr:
=stringreplace(rr,'零元','元零',[rfReplaceAll]);
  
while pos('零零',rr)>0 do
    rr:
= stringreplace(rr,'零零','',[rfReplaceAll]);
  rr:
=stringreplace(rr,'亿万','亿',[rfReplaceAll]);
  
  
if copy(rr,length(rr)-1,2)='' then
    rr:
=copy(rr,1,length(rr)-2);

  result:
=rr;
end;

function SoundCardExist: Boolean;
begin
  Result :
= WaveOutGetNumDevs > 0;
end;

initialization
  WndLong :
= GetWindowLong(Application.Handle, GWL_EXSTYLE);

end.