www.pudn.com > Jiayu.rar > Untfun.pas


unit Untfun; 
 
interface 
 
 uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ImgList, ExtCtrls, ComCtrls, ToolWin,WinSock,StdCtrls, jpeg, 
  REGISTRY,ComObj, WordXP,inifiles,Math,ActiveX,ShlObj; 
 
 
  const 
 
  // 公共信息 
{$IFDEF GB2312} 
  SCnInformation = '提示'; 
  SCnWarning = '警告'; 
  SCnError = '错误'; 
{$ELSE} 
  SCnInformation = 'Information'; 
  SCnWarning = 'Warning'; 
  SCnError = 'Error'; 
{$ENDIF} 
 
  C1=52845; //字符串加密算法的公匙 
  C2=22719; //字符串加密算法的公匙 
 
 
 
//▎================1、扩展的MDI有关操作函数  ===================▎// 
 
  procedure OpenChildForm(FormClass: TFormClass; var Fm; AOwner:TComponent); 
  procedure OpenForm(FormClass: TFormClass; var fm; AOwner: TComponent); 
 
  function IsForm(formClass:TFormClass) : boolean; //判断指定窗口存在没有 
  function isapprun(str:string):boolean;//判断指定程序运行没有 
  function CloseApp(ClassName: String): Boolean;   //关闭外部应用程序 
 
//▎================2、扩展的网络有关操作函数  ===================▎// 
 
 
 
  function GetHostIP:string;   {* 获取计算机的IP地址} 
  function GetComputerName:string;  {* 获取网络计算机名称} 
  function GetCurrentUserName : string;  //*获取当前Windows登录名的用户 
 
 
//▎================3、 扩展的注册有关操作函数  ===================▎// 
 
  function getzcm:string; 
  function readzcm_ini(s:string):Integer ; 
  function writezcm_ini(i:Integer;s:string):Boolean ; 
  function readzcm_reg(s:string):integer; 
  function writezcm_reg(s:string):Boolean; 
 
  function GetHDNumber(Drv : String): DWORD; //得到硬盘序列号 
  function Serial(Num:DWORD):string; //这个号码是用户给你生成注册码的,它通过对硬盘序列号编码而来。 
   
  function StrToHex(AStr: string): string; {* 字符转化成十六进制} 
  function HexToStr(AStr: string): string; {* 十六进制转化成字符} 
  function TransChar(AChar: Char): Integer; 
 
  function Encrypt(const S: String; Key: Word): String;//字符串加密函数 
  function Decrypt(const S: String; Key: Word): String; //字符串解密函数 
 
 //▎================4、 扩展的文件路径函数  ===================▎// 
 
 function PathWithSlash(const Path: string): string; 
 {功能,将路径变为带\符号的路径} 
 
 function PathGetWindowsPath: string;  //WINDOWS路径\ 
 function PathGetSystemPath: string;   //SYSTEM32路径\ 
 function getsyspath:string;          //SYSTEM路径\ 
 function getAppPath : string;        //程序路径   带"\" 
 function GetTempDirectory: String;    //临时目录\ 
 
 function shFileCopy(srcFile,destFile:String;bDelDest:boolean=true):boolean;// 功能:安全的复制文件 
  { 功能:安全的复制文件 ,srcFile,destFile:源文件和目标文件 , 
 bDelDest:如果目标文件已经存在,是否覆盖 ,返回值:true成功,false失败} 
 
 procedure DelTree(DirName:String); 
 {如C:\123  或C:\123\都行,内部会补齐 } 
 
 function EmptyDirectory(TheDirectory :String ; Recursive : Boolean):Boolean; 
 {删除目录内的文件和子目录;如:"C:\123\" } 
 
 procedure creatdesktoplink(Linkname:string); 
 {建立桌面快捷方式,Linkname为在桌面上要显示的字符} 
 
 
//▎================5 扩展的字符串操作函数  ===================▎// 
 
function InStr(const sShort: string; const sLong: string): Boolean;     {测试通过} 
{* 判断s1是否包含在s2中} 
 
function IntToStrEx(Value: Integer; Len: Integer; FillChar: Char = '0'): string;  {测试通过} 
{* 扩展整数转字符串函数  Example:   IntToStrEx(1,5,'0');   返回:"00001"} 
 
function IntToStrSp(Value: Integer; SpLen: Integer = 3; Sp: Char = ','): string;  {测试通过} 
{* 带分隔符的整数-字符转换} 
 
function ByteToBin(Value: Byte): string; {测试通过} 
{* 字节转二进制串} 
 
function StrRight(Str: string; Len: Integer): string;  {测试通过} 
{* 返回字符串右边的字符   Examples: StrRight('ABCEDFG',3);   返回:'DFG' } 
 
function StrLeft(Str: string; Len: Integer): string; {测试通过} 
{* 返回字符串左边的字符} 
 
function Spc(Len: Integer): string;  {测试通过} 
{* 返回空格串} 
 
function Replace(Str,s1,s2:string;CaseSensitive:Boolean):string;  {测试通过} 
{* 返回将指定字符s1用字符串s2替换后的字符串,可支持大小写敏感由CaseSensitive操作} 
{example: replace('We know what we want','we','I',false) = 'I Know what I want'} 
 
function Replicate(pcChar:Char; piCount:integer):string; 
{在一个字符串中查找某个字符串的位置} 
 
function StrNum(ShortStr:string;LongString:string):Integer;     {测试通过} 
{* 返回某个字符串中某个字符串中出现的次数} 
 
 
function PadLStr(psInput:String; piWidth:Integer; pcPadWith:Char):String;        {测试通过} 
{* 返回从psInput字符串左边开始用pcPadWith填充后总长度为PiWidth的字符串} 
 
function PadRStr(psInput:String; piWidth:Integer; pcPadWith:Char):String;       {测试通过} 
{* 返回从psInput字符串右边开始用pcPadWith填充后总长度为PiWidth的字符串} 
 
function PadCStr(psInput:String; piWidth:Integer; pcPadWith:Char):String;        {测试通过} 
{* 返回从psInput字符串两边开始用pcPadWith填充后总长度为PiWidth的字符串} 
 
function ChrTran(psInput:String; pcSearch:Char; pcTranWith:Char):String;        {测试通过} 
{* 返回替换后字符串[替换单个字符] Examples: ChrTran('abCdEgdlkh','d','#'); 返回'abC#Eg#lkh'} 
 
function StrTran(psInput:String; psSearch:String; psTranWith:String):String;        {测试通过} 
{* 返回替换后字符串[替换字符串] Examples: StrTran('aruyfbn','ruy','=====');; 返回'a=====fbn'} 
 
function Stuff(psInput:String; piBeginPlace,piCount:Integer; psStuffWith:String):String; 
{ *返回替换后字符串[替换字符串] Examples: Stuff('ABCDEFGHI',3,4,'12345');返回'AB12345GHI'} 
 
function IsDigital(Value: string): boolean; 
{功能说明:判断string是否全是数字} 
 
function RandomStr(aLength : Longint) : String; 
{随机字符串函数} 
 
procedure TxttoWords(const S: string; words: TstringList);   
{功能说明:分解成单个汉字,没有乱码,测试通过} 
 
function tx(i: integer): string;       
{功能说明:将数字变成汉字,如1变一} 
 
 //==================================== 自定义的字符串 
  function deleleftdot(str:string):string;   //删除行首点号 
  function deleleftdun(str:string):string; //删除行首顿号 
  function deleleftdigital(str:string;partstr:string):string; 
 
  function replacing(S,source,target:string):string;    
  {功能:在S中用target来替换source,能够完全去除} 
 
  function balancerate(source,target:string;pdxz:Boolean):Real; 
  {功能:计算两个字体符相同的经率,pdxz为是不是判断选择,处理时有差别,自定义} 
 
 //以下为    处理时间 
 function TimeToSecond(const H, M, S: Integer): Integer; 
 function TimeSecondToTime(const secs: Integer):string; 
 //▎================6 扩展的WORD操作函数  ===================▎// 
 
 function CONNECTWORD: Boolean; 
 {功能:建立、连接} 
 
 procedure addstrtoword(text:string;align:Boolean;fontname:WideString;fontsize:integer); 
 {向WORD中追加字符,顺序为追加内容、对齐方式、字体、字体大小} 
 
 procedure Addbmptoword(STR:string); 
 {功能:向WORD加入图片,STR为文件路径} 
  
 procedure addstrtorich(s, fontname: string; fontsize,alimen: Integer; Richedit: TRichEdit); 
 {功能:向RICHEDIT控件中追加内容,顺序为内容、字体、字体大小、对齐方式(O为左,1为中,2为中)、控件NAME} 
 
 procedure  loadpicture(str:string;var image:TImage); 
 {功能:打开图像文件,STR为路役,IMAGE为显示的控件} 
 
 //▎================7 扩展的读取皮肤文件的函数  ===================▎// 
  function  readskinfile(Keyname:string):string; 
  {功能,读出皮肤路役,Keyname一般可设为程序名称,以利识别} 
 
  procedure writeskinfile(keyname,filename:string); 
  {功能,写入皮肤路役,Keyname一般可设为程序名称,以利识别} 
 
//===================8.ado=========== 
  function setadoaccess(mdbpath:string;passwd:string):string; 
  // 加入字体 
  
 
 
 var 
   msword: Variant; 
 
 
  implementation 
 
procedure OpenChildForm(FormClass: TFormClass; var Fm; AOwner:TComponent); 
var 
  I: Integer; 
  Child: TForm; 
begin 
  for I := 0 to Screen.FormCount - 1 do 
   if Screen.Forms[I].ClassType = FormClass then 
     begin 
       Child := Screen.Forms[I]; 
       if Child.WindowState = wsMinimized then 
       ShowWindow(Child.Handle, SW_SHOWNORMAL) 
       else 
       ShowWindow(Child.handle,SW_SHOWNA); 
       if (not Child.Visible) then Child.Visible := True; 
        Child.BringToFront; 
        Child.Setfocus; 
        TForm(Fm) := Child; 
        Exit; 
     end; 
    Child := TForm(FormClass.NewInstance); 
    TForm(Fm) := Child; 
    Child.Create(AOwner); 
end; 
 
 
procedure OpenForm(FormClass: TFormClass; var fm; AOwner: TComponent); 
var 
  i: integer; 
  Child: TForm; 
begin 
  for i := 0 to Screen.FormCount - 1 do 
    if screen.Forms[i].Owner = Aowner then 
     begin 
        //如有一窗口打开,将不打开新的窗口 
        if Screen.Forms[i].ClassType = FormClass then 
          begin 
            Child := Screen.Forms[i]; 
            if Child.WindowState = wsMinimized then    //如已存在但最少化的窗口,将还原显示 
            ShowWindow(Child.handle, SW_SHOWNORMAL) 
            else 
            ShowWindow(Child.handle, SW_SHOWNA); 
            if (not Child.Visible) then Child.Visible := True; 
            Child.BringToFront; 
            Child.Setfocus; 
            TForm(fm) := Child; 
            exit; 
          end; 
 
      exit; 
   end; 
 
 
  Child := TForm(FormClass.NewInstance); 
  TForm(fm) := Child; 
  Child.Create(AOwner); 
end; 
 
function readzcm_reg(s:string):integer; 
var 
  re_id:integer; 
  registerTemp : TRegistry; 
  re_code:string; 
  ini_num:Integer; 
  Temres:Integer; 
begin 
  Temres:=0; 
  registerTemp := TRegistry.Create; 
    with registerTemp do 
    begin 
      RootKey:=HKEY_LOCAL_MACHINE; 
       try 
       if OpenKey('Software\Microsoft\Windows\'+s,True) then// 建一目录 
          begin                               //wwwwwwwwwwwwwwwww  
            if ValueExists('reg_code') then  //如存在则 
            begin 
              re_code:=ReadString('reg_code'); 
              if re_code=getzcm then Temres:=0;// 己注册 
            end 
            else 
            begin  //如果注册码键值不存在      //eeeeeeeeeeeee 
 
              ini_num:=readzcm_ini('xlxt');   //读出INI记录的运行次数 
 
              //往下语句肯定是非注册用户 
              if valueexists('gc_id')=False then   //如NOT存在则 
              begin //判断其存在否?     //ggggggggggggggg 
                if ini_num =0 then 
                begin 
                  Writeinteger('gc_id',1);//如不存在则建立 
                  writezcm_ini(1,'xlxt'); 
                  Temres:=1; 
                end 
                else 
                Writeinteger('gc_id',ini_num); 
              END                     //gggggggggggggg 
              else 
              begin //判断其存在否?   rrrrrrrrrrrrrrrrrr 
                re_id:=readinteger('gc_id');//读出标志值 
                re_id:=max(re_id,ini_num); 
                if (re_id>500) or (re_id<1) then  Temres :=1000//假如1000,则应注册。 
                else 
                begin 
                  re_id:=re_id+1; //最大值为500 ,试用期 
                  Writeinteger('gc_id',re_id); 
                  writezcm_ini(re_id,'xlxt'); 
                  Temres :=re_id; 
                end; 
              end;  //IF  EXSIT      rrrrrrrrrrrrrrrrrrrr 
         end;//如果键值不存在        eeeeeeeeeeeeeeeeeeee 
       end;    //      wwwwwwwwwww 
        
     finally 
     CloseKey; 
     Free; 
   end; 
 Result :=Temres; 
end; //with registerTemp do 
 
end; 
 
 
function writezcm_reg(s:string):Boolean; 
VAR 
  REG:TREGISTRY; 
  str:string; 
begin 
   Result :=False; 
   str:=getzcm; 
   REG:=TREGISTRY.Create ; 
      WITH REG DO 
        BEGIN 
          ROOTKEY:=HKEY_LOCAL_MACHINE; 
          TRY 
          if OpenKey('Software\Microsoft\Windows\'+s,True) then 
            begin 
              WriteString('reg_code',str); 
              Writeinteger('gc_id',0);//若输入的注册码正确,则将标志值置为0 即已注册。 
              Result :=True; 
            end; 
          FINALLY 
          CloseKey; 
          Free; 
          END; 
       end; 
end; 
 
function getzcm:string; 
var 
  str,temstr:string; 
  i:Integer; 
begin 
  str:=Trim(Serial(GetHDNumber('C:'))); 
  temstr:=Copy(str,1,10); 
  i:=Length(temstr); 
  if i<10 then temstr:=temstr+copy('luzhenfeng',1,10-i); 
  Result :=temstr ; 
end; 
 
function readzcm_ini(s:string):Integer ; 
var 
  inifile:TIniFile ; 
  IniFileName:string; 
  num:Integer ; 
begin 
  IniFileName:= PathGetWindowsPath+'myset.ini' ; 
  inifile:=TInifile.Create(IniFileName); 
  try 
  num:=inifile.ReadInteger(s,'recorder',0); 
  finally 
  inifile.Free; 
  end; 
 
  Result :=num;   
end; 
 
function writezcm_ini(i:integer;s:string):Boolean ; 
var 
  inifile:TIniFile ; 
  IniFileName:string; 
  BB:Boolean ; 
begin 
 
  IniFileName:= PathGetWindowsPath+'myset.ini' ; 
  inifile:=TInifile.Create(IniFileName); 
  try 
    inifile.WriteInteger(s,'recorder',i); 
    BB :=True; 
  finally 
    inifile.Free ; 
  end; 
  result:=BB; 
end; 
 
 //-------------------------------------  生成注册码 
function GetHDNumber(Drv : String): DWORD; //得到硬盘序列号 
var 
 VolumeSerialNumber : DWORD; 
 MaximumComponentLength : DWORD; 
 FileSystemFlags : DWORD; 
begin 
 if Drv[Length(Drv)] =':' then Drv := Drv + '\'; 
 GetVolumeInformation(pChar(Drv), 
            nil, 
            0, 
            @VolumeSerialNumber, 
            MaximumComponentLength, 
            FileSystemFlags, 
            nil, 
            0); 
 Result:= (VolumeSerialNumber); 
 //GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL); 
end; 
 
function Serial(Num:DWORD):string; //这个号码是用户给你生成注册码的,它通过对硬盘序列号编码而来。 
var sNum:string; inChar:array[1..4]of char; 
begin  
 
 Num:=Num xor 8009211011; 
 sNum:=inttostr(Num); 
 inChar[1]:=char(((integer(sNum[1])+integer(sNum[2]))mod 5)+integer('a')); 
 inChar[2]:=char(((integer(sNum[3])+integer(sNum[4]))mod 5)+integer('a')); 
 inChar[3]:=char(((integer(sNum[5])+integer(sNum[6]))mod 5)+integer('a')); 
 inChar[4]:=char(((integer(sNum[7])+integer(sNum[8])+integer(sNum[9]))mod 5)+integer('a')); 
 insert(inChar[1],sNum,1); 
 insert(inChar[4],sNum,3); 
 insert(inChar[2],sNum,5); 
 insert(inChar[3],sNum,9); 
 Result:=sNum; 
end; 
 
//▎======================⑾进制函数及过程======================▎// 
 
function TransChar(AChar: Char): Integer; 
begin 
   if AChar in ['0'..'9'] then 
      Result := Ord(AChar) - Ord('0') 
   else 
      Result := 10 + Ord(AChar) - Ord('A'); 
   end; 
 
 
//字符转化成十六进制 
function StrToHex(AStr: string): string; 
var 
   I : Integer; 
//   Tmp: string; 
   begin 
      Result := ''; 
      For I := 1 to Length(AStr) do 
      begin 
         Result := Result + Format('%2x', [Byte(AStr[I])]); 
      end; 
      I := Pos(' ', Result); 
      While I <> 0 do 
      begin 
         Result[I] := '0'; 
         I := Pos(' ', Result); 
      end; 
end; 
 
//十六进制转化成字符 
function HexToStr(AStr: string): string; 
var 
   I : Integer; 
   CharValue: Word; 
   begin 
   Result := ''; 
   for I := 1 to Trunc(Length(Astr)/2) do 
   begin 
      Result := Result + ' '; 
      CharValue := TransChar(AStr[2*I-1])*16 + TransChar(AStr[2*I]); 
      Result[I] := Char(CharValue); 
   end; 
end; 
 
//▎======================字符串加密和解密======================▎// 
 
//字符串加密函数 
function Encrypt(const S: String; Key: Word): String; 
var 
   I : Integer; 
begin 
      Result := S; 
      for I := 1 to Length(S) do 
      begin 
         Result[I] := char(byte(S[I]) xor (Key shr 8)); 
         Key := (byte(Result[I]) + Key) * C1 + C2; 
         if Result[I] = Chr(0) then 
            Result[I] := S[I]; 
      end; 
      Result := StrToHex(Result); 
end; 
 
 
//字符串解密函数 
function Decrypt(const S: String; Key: Word): String; 
var 
   I: Integer; 
   S1: string; 
begin 
   S1 := HexToStr(S); 
   Result := S1; 
   for I := 1 to Length(S1) do 
   begin 
      if char(byte(S1[I]) xor (Key shr 8)) = Chr(0) then 
         begin 
            Result[I] := S1[I]; 
            Key := (byte(Chr(0)) + Key) * C1 + C2; //保证Key的正确性   
         end 
      else 
         begin 
            Result[I] := char(byte(S1[I]) xor (Key shr 8)); 
            Key := (byte(S1[I]) + Key) * C1 + C2; 
         end; 
   end; 
end; 
//==========================================     文件路径 
function PathWithSlash(const Path: string): string;       //带\符号 
begin 
 Result := Path; 
 if (Length(Result) > 0) and (Result[Length(Result)] <> '\') then Result := Result + '\'; 
end; 
 
function PathGetSystemPath: string;   //SYSTEM32路径 
var 
 Buf: array[0..255] of Char; 
begin 
 GetSystemDirectory(@Buf, 255); 
 Result := PathWithSlash(StrPas(@Buf)); 
end; 
 
function PathGetWindowsPath: string;  //WINDOWS路径 
var 
 Buf: array[0..255] of Char; 
begin 
 GetWindowsDirectory(@Buf, 255); 
 Result := PathWithSlash(StrPas(@Buf)); 
end; 
 
function getsyspath:string; //  注:MySysPath为SYSTEM路径 
var 
MySysPath : PCHAR ; 
  begin 
  GetMem(MySysPath,255); 
  GetSystemDirectory(MySysPath,255); 
  result:=PathWithSlash(strpas(mysyspath)); 
 end; 
 
function getAppPath : string;   //程序目录带\ 
var 
  strTmp : string; 
begin 
  strTmp :=ExtractFilePath(application.Exename); 
  result := PathWithSlash(strTmp); 
end; 
 
function GetTempDirectory: String;    //临时目录\ 
var 
TempDir: array[0..255] of Char; 
begin 
GetTempPath(255, @TempDir); 
result:=PathWithSlash(strpas(TempDir)); 
end;  
 
 
//▎============================================================▎// 
//▎==================①扩展的字符串操作函数====================▎// 
//▎============================================================▎// 
 // 判断s1是否包含在s2中 
function InStr(const sShort: string; const sLong: string): Boolean; 
var 
  s1, s2: string; 
begin 
  s1 := LowerCase(sShort); 
  s2 := LowerCase(sLong); 
  Result := Pos(s1, s2) > 0; 
end; 
 
// 扩展整数转字符串函数,参数分别为目标数、长度、填充字符(默认为0) 
function IntToStrEx(Value: Integer; Len: Integer; FillChar: Char = '0'): string; 
begin 
  Result := IntToStr(Value); 
  while Length(Result) < Len do 
    Result := FillChar + Result; 
end; 
 
// 带分隔符的整数-字符转换 
function IntToStrSp(Value: Integer; SpLen: Integer = 3; Sp: Char = ','): string; 
var 
  s: string; 
  i, j: Integer; 
begin 
  s := IntToStr(Value); 
  Result := ''; 
  j := 0; 
  for i := Length(s) downto 1 do 
  begin 
    Result := s[i] + Result; 
    Inc(j); 
    try 
       if ((j mod SpLen) = 0) and (i <> 1) then 
          Result := Sp + Result; 
    except 
       MessageBox(Application.Handle,' IntToStrSp函数的第二个参数值不能为数字0 !',SCnError,16); 
       exit; 
    end 
  end; 
end; 
 
// 返回字符串右边的字符 
function StrRight(Str: string; Len: Integer): string; 
begin 
  if Len >= Length(Str) then 
    Result := Str 
  else 
    Result := Copy(Str, Length(Str) - Len + 1, Len); 
end; 
 
// 返回字符串左边的字符 
function StrLeft(Str: string; Len: Integer): string; 
begin 
  if Len >= Length(Str) then 
    Result := Str 
  else 
    Result := Copy(Str, 1, Len); 
end; 
 
// 字节转二进制串 
function ByteToBin(Value: Byte): string; 
const 
  V: Byte = 1; 
var 
  i: Integer; 
begin 
  for i := 7 downto 0 do 
    if (V shl i) and Value <> 0 then 
      Result := Result + '1' 
    else 
      Result := Result + '0'; 
end; 
 
// 返回空格串 
function Spc(Len: Integer): string; 
var 
  i: Integer; 
begin 
  Result := ''; 
  for i := 0 to Len - 1 do 
    Result := Result + ' '; 
end; 
 
// 返回将指定字符s1用字符串s2替换后的字符串,可支持大小写敏感由CaseSensitive操作} 
function Replace(Str,s1,s2:string;CaseSensitive:Boolean):string; 
var 
   i:integer; 
   s,t:string; 
begin 
   s:=''; 
   t:=str; 
   repeat 
      if casesensitive then 
         i:=pos(s1,t) 
      else 
         i:=pos(lowercase(s1),lowercase(t)); 
         if i>0 then 
            begin 
               s:=s+Copy(t,1,i-1)+s2; 
               t:=Copy(t,i+Length(s1),MaxInt); 
            end 
         else 
            s:=s+t; 
   until i<=0; 
   result:=s; 
end; 
 
function Replicate(pcChar:Char; piCount:integer):string; 
begin 
	Result:=''; 
	SetLength(Result,piCount); 
	fillChar(Pointer(Result)^,piCount,pcChar) 
end; 
 
// 返回某个字符串中某个字符串中出现的次数} 
function StrNum(ShortStr:string;LongString:string):Integer;     {测试通过} 
var 
   i:Integer; 
begin 
   i:=0; 
   while pos(ShortStr,LongString)>0 do 
      begin 
         i:=i+1; 
         LongString:=Copy(LongString,(pos(ShortStr,LongString))+1,Length(LongString)-pos(ShortStr,LongString)) 
      end; 
   Result:=i; 
end; 
 
 
{* 返回从psInput字符串左边开始用pcPadWith填充后总长度为PiWidth的字符串} 
function PadLStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; 
begin 
	Result:=Replicate(pcPadWith,piWidth-Length(psInput))+psInput 
end; 
 
{* 返回从psInput字符串右边开始用pcPadWith填充后总长度为PiWidth的字符串} 
function PadRStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; 
begin 
	Result:=psInput+Replicate(pcPadWith,piWidth-Length(psInput)) 
end; 
 
{* 返回从psInput字符串两边开始用pcPadWith填充后总长度为PiWidth的字符串} 
function PadCStr(psInput:String; piWidth:Integer; pcPadWith:Char):String; 
var 
	liHalf :integer; 
begin 
	liHalf:=(piWidth-Length(psInput))div 2; 
	Result:=Replicate(pcPadWith,liHalf)+psInput+Replicate(pcPadWith,piWidth-Length(psInput)-liHalf) 
end; 
 
{* 返回替换后字符串 Examples: ChrTran('abCdEgdlkh','d','#'); 返回'bC#Eg#lkh'} 
function ChrTran(psInput:String; pcSearch:Char; pcTranWith:Char):String; 
var 
	i,j:integer; 
begin 
	j:=Length(psInput); 
	for i:=1 to j do 
  begin 
		if psInput[i]=pcSearch then 
			psInput[i]:=pcTranWith 
  end; 
	Result:=psInput 
end; 
 
{* 返回替换后字符串 Examples: StrTran('aruyfbn','ruy','====='); 返回'a=====fbn'} 
function StrTran(psInput:String; psSearch:String; psTranWith:String):String; 
var 
	liPosition,liLenOfSrch,liLenOfIn:integer; 
begin 
	liPosition:=Pos(psSearch,psInput); 
	liLenOfSrch:=Length(psSearch); 
	liLenOfIn:=Length(psInput); 
	while liPosition>0 do 
	begin 
		psInput:=Copy(psInput,1,liPosition-1) 
			+psTranWith 
      +Copy(psInput,liPosition+liLenOfSrch,liLenOfIn); 
		liPosition:=Pos(psSearch,psInput) 
	end; 
	Result:=psInput 
end; 
 
{ *返回替换后字符串[替换字符串] Examples: Stuff('ABCDEFGHI',3,4,'12345');返回'AB12345GHI'} 
function Stuff(psInput:String; piBeginPlace,piCount:Integer; psStuffWith:String):String; 
begin 
	Result:=Copy(psInput,1,piBeginPlace-1)+ 
		psStuffWith+ 
    Copy(psInput,piBeginPlace+piCount,Length(psInput)) 
end; 
 
 
{功能说明:判断string是否全是数字} 
function IsDigital(Value: string): boolean; 
var 
  i, j: integer; 
  str: char; 
begin 
  result := true; 
  Value := trim(Value); 
  j := Length(Value); 
  if j = 0 then 
  begin 
    result := false; 
    exit; 
  end; 
  for i := 1 to j do 
  begin 
    str := Value[i]; 
    if not (str in ['0'..'9']) then 
    begin 
      result := false; 
      exit; 
    end; 
  end; 
end; 
 
{随机字符串函数} 
function RandomStr(aLength : Longint) : String; 
var 
  X : Longint; 
begin 
  if aLength <= 0 then exit; 
  SetLength(Result, aLength); 
  for X:=1 to aLength do 
    Result[X] := Chr(Random(26) + 65); 
end; 
 
 
//============================================= 
 
function tx(i: integer): string; 
begin 
 case i of 
 0:RESULT:='一'; 
 1:RESULT:='二'; 
 2:result:='三'; 
 3:result:='四'; 
 4:result:='五'; 
 5:result:='六'; 
 6:result:='七'; 
 7:result:='八'; 
 8:result:='九'; 
 9:result:='十'; 
  ELSE 
   result:='太多了'; 
 end; 
 
end; 
 
 
function deleleftdigital(str:string;partstr:string):string; 
var 
  i,j:integer  ; 
  s:string; 
begin 
   
  j:=Length(partstr); 
 
  i:=pos(partstr,str); 
  s:=StrLeft(str,i-1); 
 
  if IsDigital(s) then 
  begin 
    if j=1 then delete(str,1,i) 
    else 
    Delete(str,1,i+j-1) 
  end; 
  result:=trim(str); 
end; 
 
 
function deleleftdot(str:string):string; //删除行首点号 
var 
  I:integer  ; 
  s:string; 
begin 
  str:=Trim(str); 
  i:=pos('.',str); 
  s:=StrLeft(str,i-1); 
 
  if IsDigital(s) then delete(str,1,i); 
  result:=trim(str); 
end; 
 
function deleleftdun(str:string):string;    //删除行首顿号 
var 
  I:integer  ; 
  s:string; 
begin 
  str:=Trim(str); 
  i:=pos('、',str); 
  s:=StrLeft(str,i-1); 
 
  if IsDigital(s) then delete(str,1,i+1);  // 顿号是2个字节 
  result:=trim(str); 
end; 
 
 //字符串处理,分成单个字,没有乱码 
procedure TxttoWords(const S: string; words: TstringList); 
var 
  j:Integer ; 
  sCuted{ 按固定长度分割出来的部分字符串 }: string; 
  iCutLength{ 按固定长度分割出来的部分字符串的长度 }: integer; 
  bIsDBCS{ 是否是汉字的前半字节 }: boolean; 
  sline:string; 
begin 
  sline:=s; 
  if Length(sline)=0 then words.Add(#13#10) 
  else 
  repeat ; 
  iCutLength :=2; 
  sCuted :=Copy(sline,1,iCutLength ); 
  bIsDBCS:=False ; 
  for j:=1 to icutlength do 
    begin 
      if bIsDBCS then 
        bIsDBCS :=False 
        else 
          if Windows.IsDBCSLeadByte(Byte(sCuted[j])) then 
            bIsDBCS :=True; 
 
    end; //end of for 
 
    if bIsDBCS then Dec(iCutLength); 
    if Copy(sline,1,iCutLength)<>#13#10 then   //去除回车 
    words.Add(Copy(sline,1,iCutLength)); 
    sline :=Copy(sline,iCutLength +1,Length(sline )-icutlength); 
    until Length (sline)<=0 ; 
end; 
 
function replacing(S,source,target:string):string;    //完全去除 
var 
  site,StrLen:integer; 
begin 
  {source在S中出现的位置} 
  site:=pos(source,s); 
  {source的长度} 
  StrLen:=length(source); 
  {删除source字符串} 
  delete(s,site,StrLen); 
  {插入target字符串到S中} 
  insert(target,s,site); 
 {返回新串} 
 
 site:=pos(source,s); 
  IF site >0 then 
      S:=replacing(S,source,target) ; 
  Result :=S; 
end; 
 
 function balancerate(source,target:string;pdxz:Boolean):Real; 
 var 
   str1,str2:string; 
   sourcelist,targetlist: TstringList; 
   i,df:Integer; 
   Temstr:string; 
   maxcount:Integer ; 
 begin 
   source :=Trim(source);    //去除前后空格 
   target :=Trim(target); 
 
   if Trim(source)=Trim(target ) then    //   如果相等就对了 
      begin 
        Result :=1; 
        Exit; 
      end; 
 
   source:=replacing(source,',',''); //去除逗号 
   source:=replacing(source,',','');  //去除半角, 
   source:=replacing(source,'。',''); //去除句号 
   source:=replacing(source,'?',''); //去除问号 
   source:=replacing(source,':',''); //去除: 
   source:=replacing(source,':','');  //去除半角: 
   source:=replacing(source,';','');  //去除分号 
   source:=replacing(source,';','');  //去除半角分号 
   source:=replacing(source,' ','');  //去除空格 
   source:=replacing(source,'《','');  //去除书引号 
   source:=replacing(source,'》','');  //去除书引号 
 
//======================= 
   target:=replacing(target,',',''); //去除逗号 
   target:=replacing(target,',','');  //去除半角, 
   target:=replacing(target,'。',''); //去除句号 
   target:=replacing(target,'?',''); //去除问号 
   target:=replacing(target,':',''); //去除: 
   target:=replacing(target,':','');  //去除半角: 
   target:=replacing(target,';','');  //去除分号 
   target:=replacing(target,';','');  //去除半角分号 
   target:=replacing(target,' ','');  //去除空格 
   target:=replacing(target,'《','');  //去除书引号 
   target:=replacing(target,'》','');  //去除书引号 
 
  
    if Trim(source)=Trim(target ) then    //   去除符号后如果相等就对了 
      begin 
        Result :=1; 
        Exit; 
      end; 
 
     df :=0; 
      
  if pdxz then  //if is 判断\选择题则 
    begin 
      target:=replacing(target,'.','');  //去除. 
      source:=replacing(source,'.','');  //去除. 
 
        // source代表答案,targe代表答的答题 
       if Length(target)>Length(source) then 
        begin 
          Result :=0 ; //多选不得分; 
          Exit; 
        end; 
 
      str2:=target; 
        for i:=1 to Length(source) do 
          begin 
            str1:=Copy(source,i,1) ; 
            if InStr(str1,str2) then 
            df:=df+1;  //计算对的个数 
          end; 
 
      Result :=df/length(source); 
    
     end//如果不是判断/选择题 
     else 
     begin 
       sourcelist :=TStringList.Create ; 
       targetlist :=TStringList.Create ; 
       TxttoWords(source,sourcelist); 
       TxttoWords(target,targetlist); 
 
        if sourcelist.Count >targetlist.Count then 
        maxcount :=sourcelist.Count 
        else 
        maxcount :=targetlist.Count ;//最大值 
 
 
       str2 :=target ; 
       for i:=0 to sourcelist.Count -2 do 
         begin 
           Temstr:=sourcelist.Strings[i+1]; 
           str1:=sourcelist.Strings[i]+temstr; 
           if InStr(str1,str2) then 
              df:=df+1; 
         end; 
 
       if df>0 then df:=df+1; 
       Result :=df/maxcount;        //输出结果 
       // Result :=df/sourcelist.count; 
      sourcelist.Free ;  //清除内存 
      targetlist.Free ; 
     end; 
 
end; 
 
 
 
//========================= 
function IsForm(FormClass: TFormClass) : boolean; //判断指定窗口存在没有 
var 
i : integer; 
begin 
result := False; 
for i := 0 to screen.FormCount -1 do 
begin 
if (screen.Forms[i].ClassType = formClass) then 
begin 
result := True; 
Break; 
end; 
end; 
end; 
 
function isapprun(str:string):boolean; //判断指定程序运行没有 
var 
HWndCalculator : HWnd; 
begin 
result:=false; 
 
HWndCalculator := FindWindow(nil, pchar(str)); 
if HWndCalculator <> 0 then 
    result:=true; 
 
end; 
 
function CloseApp(ClassName: String): Boolean; 
//关闭外部应用程序 
var Exehandle: THandle; 
begin 
  //ExeHandle := FindWindow(nil, Pchar(Caption)); 
  ExeHandle := FindWindow(Pchar(ClassName),nil); 
  if ExeHandle <> 0 
  then 
   begin 
     PostMessage(ExeHandle, WM_Quit, 0, 0); 
     Result:=True; 
   end 
  else 
   begin 
     Result:=False; 
   end; 
end; 
 
 
{* 获取计算机的IP地址} 
function GetHostIP:string; 
var 
   wVersionRequested : WORD; 
   wsaData : TWSAData; 
   p : PHostEnt; s : array[0..128] of char; p2 : pchar; 
begin 
   try 
      wVersionRequested := MAKEWORD(1, 1); //创建 WinSock 
      WSAStartup(wVersionRequested, wsaData); //创建 WinSock 
      GetHostName(@s,128); 
      p:=GetHostByName(@s); 
      p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^); 
      Result:= P2; 
   finally 
      WSACleanup; //释放 WinSock 
   end; 
end; 
 
 {* 获取网络计算机名称} 
function GetComputerName:string; 
var 
   wVersionRequested : WORD; 
   wsaData : TWSAData; 
   p : PHostEnt; s : array[0..128] of char; 
begin 
   try 
      wVersionRequested := MAKEWORD(1, 1); //创建 WinSock 
      WSAStartup(wVersionRequested, wsaData); //创建 WinSock 
      GetHostName(@s,128); 
      p:=GetHostByName(@s); 
      Result:=p^.h_Name; 
   finally 
      WSACleanup; //释放 WinSock 
   end; 
end; 
 
//*获取当前Windows登录名的用户 
function GetCurrentUserName : string; 
const 
   cnMaxUserNameLen = 254; 
var 
   sUserName : string; 
   dwUserNameLen : Dword; 
begin 
   dwUserNameLen := cnMaxUserNameLen-1; 
   SetLength( sUserName, cnMaxUserNameLen ); 
   GetUserName(Pchar( sUserName ), dwUserNameLen ); 
   SetLength( sUserName, dwUserNameLen ); 
   Result := sUserName; 
end; 
 
//===================================时间处理 
function TimeToSecond(const H, M, S: Integer): Integer; 
begin 
Result := H * 3600 + M * 60 + S; 
end; 
 
function TimeSecondToTime(const secs: Integer):string; 
var 
  H, M, S: Word; 
begin 
H := secs div 3600; 
M := (secs mod 3600) div 60; 
S := secs mod 60; 
 
Result :=format('%-.2d', [h])+':'+format('%-.2d', [m])+ ':'+format('%-.2d', [s]); 
 
end;  
 
 
function CONNECTWORD: Boolean; 
var 
  template:OleVariant ; 
  newtemplate:OleVariant ; 
  docutype:OleVariant ; 
  visible:OleVariant ; 
 
begin 
  template:=EmptyParam ; 
 // newtemplate :=TRUE;  //模板式 
  //docutype:=0;   //模板式 
   newtemplate :=False; 
   docutype :=wdNewBlankDocument ;    //文档式 
   visible :=True; 
  try 
   begin 
    MSWord := CreateOLEObject('Word.Application');//连接Word 
    msword.visible:=True; 
    msword.Documents.Add(template,newtemplate,docutype ,visible ); 
    Result:=True; 
    END; 
  except 
    begin 
     application.MessageBox('Word文档连接失败','提示',MB_OK+  MB_ICONEXCLAMATION); 
     Result :=False ; 
     END; 
  END; 
end; 
 
 
procedure addstrtoword(text:string;align:Boolean;fontname:WideString;fontsize:integer); 
begin 
  MSWord.Selection.Font.Size:=fontsize ; 
  MSWord.Selection.Font.Name := fontname ; 
  if  align then 
  MSWord.Selection.ParagraphFormat.Alignment:= wdAlignParagraphCenter 
  else 
   BEGIN 
   MSWord.Selection.ParagraphFormat.Alignment:= wdAlignParagraphLEFT; 
   MSWord.Selection.ParagraphFormat.FirstLineIndent:=30; 
   end; 
 
  MSWord.Selection.TypeText(text); 
  MSWord.Selection.TypeParagraph; 
end; 
 
procedure Addbmptoword(str:string ); 
begin  //str:图片绝对路径; 
    msword.Selection.InlineShapes.AddPicture(str,False, True); 
end; 
{s:加入的字符;FONTNAME:字体名称,FONTSIZE:字体大小;ALIGENM:对齐方式0为左2为中1为右,RICHEDIT为加入对象的载体} 
 
procedure addstrtorich(s, fontname: string; fontsize,alimen: Integer; Richedit: TRichEdit); 
begin 
  try 
    Richedit.Lines.Add(s) ; 
    Richedit.SelLength :=-length(s)-2; 
    Richedit.SelAttributes.Size :=fontsize ; 
    Richedit.SelAttributes.Name :=fontname ; 
    Richedit.Paragraph.Alignment :=talignment(alimen) ; 
  //  Richedit.SelStart:=Length(Richedit.Lines.Text); 
  except 
    Exit ; 
  END;   
end; 
 
//读取皮肤文件======================================================== 
function readskinfile(keyname:string):string; 
var 
 IniFileName:string; 
 inifile:TInifile; 
 str:string; 
 ML:string; 
  
begin 
  ml:= getapppath+'ini'; 
  if Not DirectoryExists(ml) then CreateDir(ml); 
 
  IniFileName:=getapppath+'ini\skin.ini'; 
  inifile:=TInifile.Create(IniFileName); 
  str:=inifile.ReadString(Keyname,'skinfiles',''); 
  inifile.Free; 
 
  Result :=str; 
 
end; 
 
procedure writeskinfile(keyname,filename:string); 
var 
  inifile:TInifile; 
  IniFileName:string; 
  ML:string; 
 
begin 
  ml:= getapppath+'ini'; 
  if Not DirectoryExists(ml) then CreateDir(ml); 
 
  IniFileName:=GETAPPPath+'ini\Skin.ini'; 
  inifile:=TInifile.Create(IniFileName); 
    try 
       inifile.WriteString(keyname,'skinfiles',filename); 
    finally 
      inifile.Free; 
    end; 
end; 
 
{  
功能:安全的复制文件  
srcFile,destFile:源文件和目标文件  
bDelDest:如果目标文件已经存在,是否覆盖  
返回值:true成功,false失败  
}  
function shFileCopy(srcFile,destFile:String;bDelDest:boolean=true):boolean;  
begin 
  result:=false; 
  if not FileExists(srcFile) then 
  begin 
    Application.MessageBox ('源文件不存在,不能复制','提示',MB_OK+MB_ICONEXCLAMATION); 
    exit; 
  end; 
 
  if srcFile=destFile then 
  begin 
    Application.MessageBox ('源文件和目标文件相同,不能复制','提示',MB_OK+MB_ICONEXCLAMATION); 
    exit; 
  end; 
   
  if FileExists(destFile) then 
  begin 
  if not bDelDest then 
      begin 
       Application.MessageBox ('目标文件已经存在,不能复制','提示',MB_OK+MB_ICONEXCLAMATION); 
       exit; 
       end 
  else 
  begin 
    if Application.MessageBox('目标文件己存在,要覆盖吗?','提示',MB_OK+MB_ICONQUESTION)=IDOK then 
    begin 
      FileSetAttr(destFile,FileGetAttr(destFile) and not $00000001); 
       
      if not DeleteFile(PChar(destFile)) then 
      begin 
        Application.MessageBox ('目标文件已经存在,并且不能被删除,复制失败','提示',MB_OK+MB_ICONEXCLAMATION); 
        exit; 
      end; 
    END; 
  END; 
  end; //END IF FILEEXISTS 
     if not CopyFile(PChar(srcFile),PChar(destFile),False ) then     //COPY 
     begin 
       Application.MessageBox ('发生未知的错误,复制文件失败','提示',MB_OK+MB_ICONEXCLAMATION); 
       exit; 
     end; 
//目标文件去掉只读属性  
    FileSetAttr(destFile,FileGetAttr(destFile) and not $00000001); 
    result:=true; 
end; 
 
procedure loadpicture(str:string;var image:TImage); 
var 
 ms: tmemorystream; 
 mJPeg: TJPegImage; 
 sType:String ; 
begin 
   sType:=ExtractFileExt(str) ; 
   ms:=TMemoryStream.Create ; 
   mJpeg:=TJpegImage.Create ; 
    Try 
     ms.LoadFromFile(str ) ; 
     ms.Position:=0 ; 
    If (UpperCase(sType)='.JPEG') or (UpperCase(sType)='.JPG') Then 
      Begin 
        mJpeg.LoadFromStream(ms) ;    //把JPG流引入 
        Image.Picture.Bitmap.Assign(mJpeg) ; 
     End 
     Else 
      if UpperCase(sType)='.BMP' then 
        Image.Picture.Bitmap.LoadFromStream(ms) ;    //引入BMP流 
   Finally 
   ms.Free ; 
   mJpeg.Free ; 
   End ; 
  
End ; 
 
//======================   目录操作 
procedure DelTree(DirName:String);  
var  
hFindFile:Cardinal;  
FileName: String;  
FindFileData:WIN32_FIND_DATA;  
begin  
if DirName[Length(DirName)]<>'\' then  
  DirName:= DirName + '\';  
hFindFile:= FindFirstFile(PChar(DirName + '*.*'), FindFileData);  
if hFindFile <> INVALID_HANDLE_VALUE then  
begin  
  repeat  
   FileName:= FindFileData.cFileName;  
   if (FileName <> '.') and (FileName <> '..') then  
   begin  
    if (FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY) then  
     DelTree(DirName + FileName)  
    else  
     DeleteFile(PChar(DirName + FileName));  
   end;  
  until FindNextFile(hFindFile, FindFileData) = false;  
  Windows.FindClose(hFindFile);  
  RmDir(DirName);  
end;  
end;    
 
function EmptyDirectory(TheDirectory :String ; Recursive : Boolean):Boolean; 
var 
SearchRec : TSearchRec;  
Res : Integer;  
begin  
Result := False;  
TheDirectory := Trim(TheDirectory); 
Res := FindFirst(TheDirectory + '*.*', faAnyFile, SearchRec);  
try  
while Res = 0 do  
begin  
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then  
begin  
if ((SearchRec.Attr and faDirectory) > 0) and Recursive  
then begin  
EmptyDirectory(TheDirectory + SearchRec.Name, True);  
RemoveDirectory(PChar(TheDirectory + SearchRec.Name));  
end  
else begin  
DeleteFile(PChar(TheDirectory + SearchRec.Name))  
end;  
end;  
Res := FindNext(SearchRec);  
end; 
Result := True; 
finally 
FindClose(SearchRec); 
//FindClose(SearchRec.FindHandle); 
end; 
end; 
 
procedure creatdesktoplink(Linkname:string); 
var 
 tmpObject: IUnknown; 
 tmpSLink: IShellLink; 
 tmpPFile: IPersistFile; 
 PIDL: PItemIDList; 
 StartupDirectory: array[0..MAX_PATH] of Char; 
 StartupFilename: string; 
 LinkFilename: WideString; 
 Tempstr:string ; 
begin 
 //StartupFilename := ExtractFilePath(Application.ExeName) + 'xlxt.exe'; 
 StartupFilename :=Application.ExeName; 
 
 if not FileExists(StartupFilename) then Exit; 
 tmpObject := CreateComObject(CLSID_ShellLink); 
 tmpSLink := tmpObject as IShellLink; 
 tmpPFile := tmpObject as IPersistFile; 
 tmpSLink.SetPath(pChar(StartupFilename)); 
 tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename))); 
 SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,PIDL); 
 SHGetPathFromIDList(PIDL,StartupDirectory); 
 
 Tempstr :='\'+ Linkname+'.lnk' ; 
 
 LinkFilename := StartupDirectory + Tempstr ; 
  
 
 if FileExists(LinkFileName) then 
 
  begin 
  application.MessageBox('快捷方式己存在,不能重复建立','提示',MB_OK+  MB_ICONEXCLAMATION); 
  Exit; 
  end 
  else 
  begin 
   tmpPFile.Save(pWChar(LinkFilename), FALSE); 
   application.MessageBox('快捷方式己建立','提示',MB_OK+MB_ICONinformation); 
  END; 
end; 
 
 
 
function setadoaccess(mdbpath:string;passwd:string):string; 
Const 
  SConnectionString       = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;' 
                                +'Jet OLEDB:Database Password=%s;'; 
begin 
  mdbpath:=trim(mdbpath); 
  passwd:=trim(passwd); 
  result:=format(SConnectionString,[mdbpath,passwd]); 
end; 
 
 
 
 
end.