[Notes2-team] =?iso-8859-1?Q?Substit=F3i_o_q_eu_passei_por_esse_aki=2C_eu_sempre_deixo_?= =?iso-885
Brought to you by:
andersonrb
From: Jonas R. S. S. <jon...@bo...> - 2004-04-22 14:21:56
|
procedure BuildFolderTree( var TheFolderTree: PNotesFolderTree; Folder: string; const Options: TNotesBuildFolderTreeOptions = ftAll; const ScanSubFolders: Boolean = false; const FolderMask: string = '*'; const FileMask: string = '*' ); type PFolderStackItem = ^TFolderStackItem; TFolderStackItem = record FolderTree: PNotesFolderTree; Folder: string; end; TFolderStack = array of PFolderStackItem; var FolderStack: TFolderStack; SearchRec: TSearchRec; CurStack: PFolderStackItem; SameMask: Boolean; procedure PushStack( var FT: PNotesFolderTree; const AFolder: string ); var FSI: PFolderStackItem; begin FSI := AllocMem( SizeOf( TFolderStackItem ) ); if not Assigned( FT ) then FT := AllocMem( SizeOf( TNotesFolderTree ) ); with FSI^ do begin FolderTree := FT; Folder := AFolder; end; SetLength( FolderStack, Length( FolderStack ) + 1 ); FolderStack[ High( FolderStack ) ] := FSI; end; procedure PopStack; begin CurStack := FolderStack[ High( FolderStack ) ]; SetLength( FolderStack, High( FolderStack ) ); end; begin TheFolderTree := nil; SameMask := FolderMask = FileMask; Folder := AddSlash( Folder ); PushStack( TheFolderTree, Folder ); while Length( FolderStack ) > 0 do begin PopStack; if ( Options in [ftAll,ftOnlyFolders] ) and ( FindFirst( CurStack^.Folder + FolderMask, faAnyFile, SearchRec ) = 0 ) then begin repeat if ( SearchRec.Attr and faDirectory <> 0 ) then begin if( SearchRec.Name[1] <> '.' ) then begin SetLength( CurStack^.FolderTree^, Length( CurStack^.FolderTree^ ) + 1 ); with CurStack^.FolderTree^[ High( CurStack^.FolderTree^ ) ] do begin Path := SearchRec.Name; IsFolder := True; if ScanSubFolders then PushStack( Items, AddSlash( CurStack^.Folder + Path ) ); end; end; end else if ( Options = ftAll ) and SameMask then begin SetLength( CurStack^.FolderTree^, Length( CurStack^.FolderTree^ ) + 1 ); with CurStack^.FolderTree^[ High( CurStack^.FolderTree^ ) ] do begin Path := SearchRec.Name; IsFolder := False; end; end; until FindNext( SearchRec ) <> 0; SysUtils.FindClose( SearchRec ); end else if FindFirst( CurStack^.Folder + FileMask, faAnyFile, SearchRec ) = 0 then begin repeat if ( SearchRec.Attr and faDirectory <> 0 ) and ( SearchRec.Name[1] <> '.' ) and ScanSubFolders then PushStack( CurStack^.FolderTree, AddSlash( CurStack^.Folder + SearchRec.Name ) ) else if SearchRec.Attr and faDirectory = 0 then begin SetLength( CurStack^.FolderTree^, Length( CurStack^.FolderTree^ ) + 1 ); with CurStack^.FolderTree^[ High( CurStack^.FolderTree^ ) ] do begin Path := SearchRec.Name; IsFolder := False; end; end; until FindNext( SearchRec ) <> 0; SysUtils.FindClose( SearchRec ); end; CurStack^.Folder := ''; FreeMem( CurStack ); end; end; huheauehaueahuea, oh o fotolog do tio joninhas -> http://www.fotolog.net/jonasraoni Jonas Raoni Soares Silva ------------------------ Delphi & Web Developer jon...@bo... |