Delphi公共函數(二)

procedure TPub.ConSaveTreeViewToTextFile(Nodes: TTreeNodes; Filename: string);

var

  F: TextFile;

 

  procedure ProcessNode(Node: TTreeNode; Depth: Integer);

  begin

    while Node <> nil do

    begin

      Writeln(F, IntToStr(Depth) + ' ' + Node.Text);

 

      if Node.HasChildren then

        ProcessNode(Node.GetFirstChild, Depth + 1);

 

      Node := Node.getNextSibling;

    end;

  end;

 

begin

  Assignfile(F, Filename);

  rewrite(F);

 

  ProcessNode(Nodes.GetFirstNode, 1);

 

  CloseFile(F);

end;

 

//以下字符串

function TPub.StrGetToken(const S: string; index: Integer; bTrail: Boolean = False;

  Delimiters: TSysCharSet = DEFAULT_DELIMITERS): string;

var

  I, W, head, tail: Integer;

  bInWord         : Boolean;

begin

  I := 1;

  W := 0;

  bInWord := False;

  head := 1;

  tail := Length(S);

  while (I <= Length(S)) and (W <= index) do

  begin

    if S[I] in Delimiters then

    begin

      if (W = index) and bInWord then tail := I - 1;

      bInWord := False;

    end else

    begin

      if not bInWord then

      begin

        bInWord := True;

        Inc(W);

        if W = index then head := I;

      end;

    end;

 

    Inc(I);

  end;

 

  if bTrail then tail := Length(S);

  if W >= index then Result := Copy(S, head, tail - head + 1)

  else Result := '';

end;

 

function TPub.StrCountWords(S: string; Delimiters: TSysCharSet = DEFAULT_DELIMITERS): Integer;

var

  bInWord: Boolean;

  I      : Integer;

begin

  Result := 0;

  I := 1;

  bInWord := False;

  while I <= Length(S) do

  begin

    if S[I] in Delimiters then bInWord := False

    else

    begin

      if not bInWord then

      begin

        bInWord := True;

        Inc(Result);

      end;

    end;

 

    Inc(I);

  end;

end;

 

function TPub.StrIsContainingCRLF(const S: string): Boolean;

var

  len: Integer;

begin

  len := Length(S);

  Result := (len >= 2) and (S[len - 1] = #13) and (S[len] = #10);

end;

 

procedure TPub.StrTruncateCRLF(var S: string);

var

  I: Integer;

begin

  I := 1;

  while I <= Length(S) do

    if (S[I] = #13) or (S[I] = #10) then Delete(S, I, 1)

    else Inc(I);

end;

 

 

 

 

function TPub.StrReplaceString(var S: string; const Token, NewToken: string; bCaseSensitive: Boolean): Boolean;

var

  I         : Integer;

  sFirstPart: string;

begin

  if bCaseSensitive then

    I := AnsiPos(Token, S)

  else

    I := AnsiPos(AnsiUpperCase(Token), AnsiUpperCase(S));

 

  if I <> 0 then

  begin

    sFirstPart := Copy(S, 1, I - 1) + NewToken;

    S := Copy(S, I + Length(Token), Maxint);

  end;

 

  Result := I <> 0;

  if Result then

  begin

    StrReplaceString(S, Token, NewToken, bCaseSensitive);

    S := sFirstPart + S;

  end;

end;

 

procedure TPub.StrSimple_ReplaceString(var S: string; const Substr: string; index, Count: Integer);

begin

  S := Format('%s%s%s',[Copy(S, 1, index - 1), Substr, Copy(S, index + Count, Maxint)]);

end;

 

function TPub.StrCompositeStrings(SL: TStrings; const Delimiter: string): string;

var

  I: Integer;

begin

  Result := '';

 

  with SL do

  begin

    for I := 0 to Count - 2 do

      Result := Result + Strings[I] + Delimiter;

    if Count > 0 then

      Result := Result + Strings[Count - 1];

  end;

end;

 

function TPub.StrSafeLoadStrings(SL: TStrings; const Filename: string): Boolean;

begin

  Result := False;

  repeat

    try

      if not FileExists(Filename) then Exit;

      SL.LoadFromFile(Filename);

      Result := True;

      Break;

    except

      Sleep(500);

    end;

  until False;

end;

 

procedure TPub.StrSafeSaveStrings(SL: TStrings; const Filename: string);

begin

  ForceDirectories(ExtractFilePath(Filename));

  repeat

    try

      SL.SaveToFile(Filename);

      Break;

    except

      Sleep(500);

    end;

  until False;

end;

//以下字體

function TPub.FontToString(Font: TFont; bIncludeColor: Boolean): string;

var

  sStyle: string;

begin

  with Font do

  begin

    // convert font style to string

    sStyle := '';

   

    if (fsBold in Style) then

      sStyle := sStyle + csfsBold;

   

    if (fsItalic in Style) then

      sStyle := sStyle + csfsItalic;

   

    if (fsUnderline in Style) then

      sStyle := sStyle + csfsUnderline;

   

    if (fsStrikeOut in Style) then

      sStyle := sStyle + csfsStrikeout;

   

    if ((Length(sStyle) > 0) and ('|' = sStyle[1])) then

      sStyle := Copy(sStyle, 2, Length(sStyle) - 1);

   

    Result := Format('"%s", %d, [%s]',[name, Size, sStyle]);

    if bIncludeColor then

      Result := Result + Format(', [%s]',[ColorToString(Color)]);

  end;

end;

 

procedure TPub.StringToFont(sFont: string; Font: TFont;

  bIncludeColor: Boolean);

var

  P     : Integer;

  sStyle: string;                                  // Expected format:

begin                                              //   "Arial", 9, [Bold], [clRed]

  with Font do                                     //

    try

      // get font name

      P := Pos(',', sFont);

      name := Copy(sFont, 2, P - 3);

      Delete(sFont, 1, P);

 

      // get font size

      P := Pos(',', sFont);

      Size := StrToInt(Copy(sFont, 2, P - 2));

      Delete(sFont, 1, P);

 

      // get font style

      P := Pos(',', sFont);

      sStyle := '|' + Copy(sFont, 3, P - 4);

      Delete(sFont, 1, P);

 

      // get font color

      if bIncludeColor then

        Color := StringToColor(Copy(sFont, 3, Length(sFont) - 3));

 

      // convert str font style to

      // font style

      Style := [];

 

      if (Pos(csfsBold, sStyle) > 0) then

        Style := Style + [fsBold];

 

      if (Pos(csfsItalic, sStyle) > 0) then

        Style := Style + [fsItalic];

 

      if (Pos(csfsUnderline, sStyle) > 0) then

        Style := Style + [fsUnderline];

 

      if (Pos(csfsStrikeout, sStyle) > 0) then

        Style := Style + [fsStrikeOut];

    except

    end;

end;

 

procedure TPub.ConWriteText(aContr: TControl;sText: string);

var

  c:TCanvas;

begin

  c:=TControlCanvas.Create;

  TControlCanvas(c).Control := aContr;

  c.Font.Size := 12;// Brush.Style:=bsClear;

  c.Font.Color := clBlue;

  //c.Pen.Color:=clBlue;

  c.TextOut(1,1,sText);// Rectangle(5,5,15,15);

  c.Free;

end;

 

 

procedure TPub.FileCopyDirectory(sDir, tDir: string);

var

  aWaitForm: TForm;

  RetValue: integer;

  procedure MyCopy(aDir, sDir: string);

  var

    sr: TSearchRec;

  begin

    aDir := PathWithSlash(aDir);

    sDir := PathWithSlash(sDir);

    if FindFirst(aDir+'*.*', faAnyFile, sr) = 0 then

    begin

      repeat

        if sr.Attr and faDirectory = faDirectory then

        begin

          if not DirectoryExists(aDir + sr.Name) then exit;

          if (sr.Name <> '.') and (sr.Name <> '..') then

            MyCopy(aDir + sr.Name,sDir + sr.Name);

        end else

        begin

          if (sr.Name <> '.') and (sr.Name <> '..') then

          begin

            ForceDirectories(sDir);

            Application.ProcessMessages;

            aWaitForm.Caption := '正在複製' + aDir + sr.Name;

            Application.ProcessMessages;

            FileCopyFile(aDir + sr.Name,sDir + sr.Name);//在線程中執行

            //MyThread1.sPath := aDir + sr.Name;

            //MyThread1.tPath := sDir + sr.Name;

            //MyThread1.flag := true;

            Application.ProcessMessages;

          end;

        end;

      until FindNext(sr) <> 0;

      FindClose(sr);

    end;

  end;

begin

  if DirectoryExists(tDir) then

  begin

    if  Pub.MsgYesNoBox('已存在該文件夾確信要覆蓋嗎?') then

      FileDeleteDirectory(tDir)

    else exit;

  end;

  aWaitForm := FormCreateProcessFrm('正在複製文件,請稍候...');

  try

    aWaitForm.Show;

    Application.ProcessMessages;

    MyCopy(sDir, tDir);

  finally

    ConFree(aWaitForm);//先釋放Form上的控件

    aWaitForm.Free;

    aWaitForm := nil;

  end;

end;

procedure MyFileCopyDirectory(sDir, tDir:string;AHandle:Thandle;Flag: integer = 0);

var

  fromdir,todir{,dirname}:pchar;

  SHFileOpStruct:TSHFileOpStruct;

begin

  GetMem(fromdir,length(sDir)+2);

  try

    GetMem(todir,length(tdir)+2);

    try

      FIllchar(fromdir^,length(sDir)+2,0);

      FIllchar(todir^,length(tDir)+2,0);

      strcopy(fromdir,pchar(sDir));

      strcopy(todir,pchar(tDir));

      with SHFileOpStruct  do

      begin

        wnd := AHandle;

        if Flag = 1 then

          WFunc := FO_MOVE

        else

          WFunc := FO_COPY;

        //該參數指明shFileOperation函數將執行目錄的拷貝

        pFrom:=fromdir;

        pTO:=todir;

        fFlags:=FOF_NOCONFIRMATION OR FOF_RENAMEONCOLLISION;

        fAnyOperationsAborted:=false;

        hnamemappings:=nil;

        lpszprogresstitle:=nil;

      end;

      if shFileOperation(SHFileOpStruct)<>0 then

        Raiselastwin32Error;

    finally

      FreeMem(todir,length(tDir)+2);

    end;

  finally

    FreeMem(fromdir,length(sDir)+2);

  end;

end;

procedure TPub.FileMoveDirectory(sDir, tDir:string;AHandle:Thandle);

var

  fromdir,todir{,dirname}:pchar;

  SHFileOpStruct:TSHFileOpStruct;

begin

  // 調用shFileOperation函數可以實現對目錄的拷貝、移動、重命名或刪除操作

  if not DirectoryExists(sDir) then

  begin

    MsgBox('不存在源路徑“' + sDir + '”,移動數據失敗!');

    exit;

  end;

  if DirectoryExists(tDir) then

  begin

    if  Pub.MsgYesNoBox('已存在該文件夾確信要覆蓋嗎?') then

      FileDeleteDirectory(tDir)

    else exit;

  end else

  if not MsgYesNoBox('不存在目標路徑“' + tDir + '”,要創建嗎?') then exit;

 

  ForceDirectories(tDir);

  MyFileCopyDirectory(sDir, tDir, AHandle, 1);

end;

 

procedure TPub.FileCopyDirectory(sDir, tDir:string;AHandle:Thandle);

begin

  // 調用shFileOperation函數可以實現對目錄的拷貝、移動、重命名或刪除操作

  if not DirectoryExists(sDir) then

  begin

    MsgBox('不存在源路徑“' + sDir + '”,複製失敗!');

    exit;

  end;

  if DirectoryExists(tDir) then

  begin

    if  Pub.MsgYesNoBox('已存在該文件夾確信要覆蓋嗎?') then

      FileDeleteDirectory(tDir)

    else exit;

  end else

  if not MsgYesNoBox('不存在目標路徑“' + tDir + '”,要創建嗎?') then exit;

  ForceDirectories(tDir);

  MyFileCopyDirectory(sDir, tDir, AHandle);

end;

//以下網絡

 

function TPub.NetJudgeOnline: boolean;

var

  b: array[0..4] of Byte;

begin

  with TRegistry.Create do

  try

    RootKey := HKEY_LOCAL_MACHINE;

    OpenKey('System/CurrentControlSet/Services/RemoteAccess',False);

    ReadBinaryData('Remote Connection',b,4);

  finally

    Free;

  end;

  if b[0]=0 then

    Result := true

  else

    Result := false;

end;

 

{=================================================================

    : 檢測機器是否登入網絡

    :

  返回值: 成功:  True  失敗:  False

  備 注:

  版 本:

     1.0  2002/10/03 09:55:00

=================================================================}

Function TPub.NetCheckMacAttachNet: Boolean;

begin

  Result := False;

  if GetSystemMetrics(SM_NETWORK) <> 0 then  //所有連入網的

    Result := True;

end;

 

{=================================================================

    : 返回本機的局域網Ip地址

    :

  返回值: 成功:  True, 並填充LocalIp   失敗:  False

  備 注:

  版 本:

     1.0  2002/10/02 21:05:00

=================================================================}

function TPub.NetGetLocalIP(var LocalIp: string): Boolean;

var

    HostEnt: PHostEnt;

    Ip: string;

    addr: pchar;

    Buffer: array [0..63] of char;

    GInitData: TWSADATA;

begin

  Result := False;

  try

    WSAStartup(2, GInitData);

    GetHostName(Buffer, SizeOf(Buffer));

    HostEnt := GetHostByName(buffer);

    if HostEnt = nil then Exit;

    addr := HostEnt^.h_addr_list^;

    ip := Format('%d.%d.%d.%d', [byte(addr [0]),

          byte (addr [1]), byte (addr [2]), byte (addr [3])]);

    LocalIp := Ip;

    Result := True;

  finally

    WSACleanup;

  end;

end;

 

{=================================================================

    : 通過Ip返回機器名

   :

          IpAddr: 想要得到名字的Ip

  返回值: 成功:  機器名   失敗:  ''

  備 注:

    inet_addr function converts a string containing an Internet

    Protocol dotted address into an in_addr.

  版 本:

    1.0  2002/10/02 22:09:00

=================================================================}

function TPub.NetGetNameByIPAddr(IPAddr : String;var MacName:String): Boolean;

var

  SockAddrIn: TSockAddrIn;

  HostEnt: PHostEnt;

  WSAData: TWSAData;

begin

  Result := False;

  if IpAddr = '' then exit;

  try

    WSAStartup(2, WSAData);

    SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));

    HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);

    if HostEnt <> nil then

      MacName := StrPas(Hostent^.h_name);

    Result := True;

  finally

    WSACleanup;

  end;

end;

 

 

 

 

{=================================================================

    : 返回網絡中SQLServer列表

    :

          List: 需要填充的List

  返回值: 成功:  True,並填充List  失敗 False

  備 注:

  版 本:

    1.0  2002/10/02 22:44:00

=================================================================}

Function TPub.NetGetSQLServerList(var List: Tstringlist): boolean;

var

   i: integer;

   SQLServer: Variant;

   ServerList: Variant;

begin

  Result := False;

  List.Clear;

  try

    SQLServer := CreateOleObject('SQLDMO.Application');

    ServerList := SQLServer.ListAvailableSQLServers;

    for i := 1 to Serverlist.Count do

      list.Add (Serverlist.item(i));

    Result := True;

  Finally

    SQLServer := NULL;

    ServerList := NULL;

  end;

end;

 

{=================================================================

    : 判斷Ip協議有沒有安裝

    :

  返回值: 成功:  True 失敗: False;

  備 注:   該函數還有問題

  版 本:

     1.0  2002/10/02 21:05:00

=================================================================}

Function TPub.NetIsIPInstalled : boolean;

var

  WSData: TWSAData;

  ProtoEnt: PProtoEnt;

begin

  Result := True;

  try

    if WSAStartup(2,WSData) = 0 then

    begin

      ProtoEnt := GetProtoByName('IP');

      if ProtoEnt = nil then

        Result := False

    end;

  finally

    WSACleanup;

  end;

end;

{=================================================================

    : 返回網絡中的共享資源

    :

          IpAddr: 機器Ip

          List: 需要填充的List

  返回值: 成功:  True,並填充List 失敗: False;

  備 注:

     WNetOpenEnum function starts an enumeration of network

     resources or existing connections.

     WNetEnumResource function continues a network-resource

     enumeration started by the WNetOpenEnum function.

  版 本:

     1.0  2002/10/03 07:30:00

=================================================================}

Function TPub.NetGetUserResource(IpAddr: string; var List: TStringList): Boolean;

type

  TNetResourceArray = ^TNetResource;//網絡類型的數組

Var

  i: Integer;

  Buf: Pointer;

  Temp: TNetResourceArray;

  lphEnum: THandle;

  NetResource: TNetResource;

  Count,BufSize,Res: DWord;

Begin

  Result := False;

  List.Clear;

  if copy(Ipaddr,0,2) <> '//' then

    IpAddr := '//'+IpAddr;   //填充Ip地址信息

  FillChar(NetResource, SizeOf(NetResource), 0);//初始化網絡層次信息

  NetResource.lpRemoteName := @IpAddr[1];//指定計算機名稱

  //獲取指定計算機的網絡資源句柄

  Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,

                      RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);

  if Res <> NO_ERROR then exit;//執行失敗

  while True do//列舉指定工作組的網絡資源

  begin

    Count := $FFFFFFFF;//不限資源數目

    BufSize := 8192;//緩衝區大小設置爲8K

    GetMem(Buf, BufSize);//申請內存,用於獲取工作組信息

    //獲取指定計算機的網絡資源名稱

    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

    if Res = ERROR_NO_MORE_ITEMS then break;//資源列舉完畢

    if (Res <> NO_ERROR) then Exit;//執行失敗

    Temp := TNetResourceArray(Buf);

    for i := 0 to Count - 1 do

    begin

       //獲取指定計算機中的共享資源名稱,+2表示刪除"//"

       ////192.168.0.1 => 192.168.0.1

       List.Add(Temp^.lpRemoteName + 2);

       Inc(Temp);

    end;

  end;

  Res := WNetCloseEnum(lphEnum);//關閉一次列舉

  if Res <> NO_ERROR then exit;//執行失敗

  Result := True;

  FreeMem(Buf);

End;

 

{=================================================================

    : 返回網絡中的工作組

    :

          List: 需要填充的List

  返回值: 成功:  True,並填充List 失敗: False;

    :

    :

     1.0  2002/10/03 08:00:00

=================================================================}

 

 

 

 

Function TPub.NetGetGroupList( var List : TStringList ) : Boolean;

type

  TNetResourceArray = ^TNetResource;//網絡類型的數組

Var

  NetResource: TNetResource;

  Buf: Pointer;

  Count,BufSize,Res: DWORD;

  lphEnum: THandle;

  p: TNetResourceArray;

  i,j: SmallInt;

  NetworkTypeList: TList;

Begin

  Result := False;

  NetworkTypeList := TList.Create;

  List.Clear;

  //獲取整個網絡中的文件資源的句柄,lphEnum爲返回名柄

  Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

                       RESOURCEUSAGE_CONTAINER, Nil,lphEnum);

  if Res <> NO_ERROR then exit;//Raise Exception(Res);//執行失敗

  //獲取整個網絡中的網絡類型信息

  Count := $FFFFFFFF;//不限資源數目

  BufSize := 8192;//緩衝區大小設置爲8K

  GetMem(Buf, BufSize);//申請內存,用於獲取工作組信息

  Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

     //資源列舉完畢                    //執行失敗

  if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;

  P := TNetResourceArray(Buf);

  for i := 0 to Count - 1 do//記錄各個網絡類型的信息

  begin

    NetworkTypeList.Add(p);

    Inc(P);

  end;

  Res := WNetCloseEnum(lphEnum);//關閉一次列舉

  if Res <> NO_ERROR then exit;

  for j := 0 to NetworkTypeList.Count-1 do //列出各個網絡類型中的所有工作組名稱

  begin//列出一個網絡類型中的所有工作組名稱

    NetResource := TNetResource(NetworkTypeList.Items[J]^);//網絡類型信息

    //獲取某個網絡類型的文件資源的句柄,NetResource爲網絡類型信息,lphEnum爲返回名柄

    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

                        RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);

    if Res <> NO_ERROR then break;//執行失敗

    while true do//列舉一個網絡類型的所有工作組的信息

    begin

      Count := $FFFFFFFF;//不限資源數目

      BufSize := 8192;//緩衝區大小設置爲8K

      GetMem(Buf, BufSize);//申請內存,用於獲取工作組信息

      //獲取一個網絡類型的文件資源信息,

      Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

          //資源列舉完畢                   //執行失敗

      if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR)  then break;

      P := TNetResourceArray(Buf);

      for i := 0 to Count - 1 do//列舉各個工作組的信息

      begin

        List.Add( StrPAS( P^.lpRemoteName ));//取得一個工作組的名稱

        Inc(P);

      end;

    end;

    Res := WNetCloseEnum(lphEnum);//關閉一次列舉

    if Res <> NO_ERROR then break;//執行失敗

  end;

  Result := True;

  FreeMem(Buf);

  NetworkTypeList.Destroy;

End;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章