home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / zkuste / delphi / kompon / d5 / cak / CAKINST.ZIP / cmarc139.lzh / DEMO.LZH / LHPRGDLG.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  2001-05-27  |  14.1 KB  |  468 lines

  1. // ô¥ìçâAü[âJâCâoâRâôâ|ü[âlâôâg for Delphi/C++Builder
  2. // Common Archivers Component for Delphi/C++Builder
  3. // Copyright(C) NORG1964/M.Yoneda 1997,1998,1999,2000
  4. //
  5. // UNLHA32.DLLòù îoë▀ò\Īâ_âCâAâìâO  LHPRGDLG.PAS
  6. //
  7. // v1.27:âfâéé╔é▒é╠âéâWâàü[âïé≡Æ╟ë┴
  8. // v1.32:UnpackFiles/PackFiles/RemoveItemsé╚é╟é╠âüâ\âbâhé≡Æ╟ë┴
  9. // v1.36:é▒é╠âtâHü[âÇé╠ò\Īé╔ ShowModal é≡Ägéñéµéñé╔é╡é╜üB
  10. //       â_âCâAâìâOâCâôâXâ^âôâXé≡É╢ɼé╡é─Ägùpé╖éΘ(ìLï`é╠)âüâ\âbâhé≡Æ╟ë┴
  11. //
  12. unit LHPRGDLG;
  13.  
  14. interface
  15.  
  16. uses
  17.     Windows,
  18.     Messages,
  19.     SysUtils,
  20.     Classes,
  21.     Graphics,
  22.     Controls,
  23.     Forms,
  24.     Dialogs,
  25.     StdCtrls,
  26.     ComCtrls,
  27.     Archives;
  28.  
  29. const
  30.     WM_EXECMETHOD = WM_USER+100;
  31.  
  32. type
  33.     TArchiverMethod = function:Integer of object;
  34.     TArchiverMethodAndParams = class
  35.         private
  36.             FMethod:                TArchiverMethod;
  37.             FArchiveFIle:        TArchiveFIle;
  38.             FOptions:            TArchiverOptions;
  39.             FBaseDir:            string;
  40.             FFileList:            TStringList;
  41.             FBuffer:                Pointer;
  42.             FdwBuffSize:        DWORD;
  43.             FArchiverResult:    integer;
  44.         public
  45.             constructor Create( Method:TArchiverMethod;ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:string;FileList:array of const;Buffer:Pointer;dwBuffSize:DWORD );
  46.             destructor Destroy; override;
  47.             procedure ExecMethod;
  48.         public
  49.             dwWriteSize:        DWORD;
  50.         public
  51.             property ArchiveFile:        TArchiveFile        read FArchiveFile;
  52.             property Options:                TArchiverOptions    read FOptions;
  53.             property BaseDir:                string                read FBaseDir;
  54.             property FileList:            TStringList            read FFileList;
  55.             property Buffer:                Pointer                read FBuffer;
  56.             property dwBuffSize:            DWORD                    read FdwBuffSize;
  57.             property ArchiverResult:    integer                read FArchiverResult;
  58.     end;
  59.  
  60.     TdlgArchiverProgress = class( TForm )
  61.         ProgressBar1:            TProgressBar;
  62.         cmdCancel:                TButton;
  63.         lblArchiveFileName:    TLabel;
  64.         lblSrcFileName1:        TLabel;
  65.         lblSrcFileName2:        TLabel;
  66.         lblWriteSize:            TLabel;
  67.         lblCount:                TLabel;
  68.         Label1:                    TLabel;
  69.         Label3:                    TLabel;
  70.         Label5:                    TLabel;
  71.         Label6:                    TLabel;
  72.         Label4:                    TLabel;
  73.         procedure FormShow( Sender:TObject );
  74.         procedure cmdCancelClick( Sender:TObject );
  75.         procedure ArchiveFileProgress( Sender:TObject;State:Integer;lpEis:LPEXTRACTINGINFOEX;var Abort:Boolean );
  76.  
  77.     private
  78.         FFileCount1:            integer;
  79.         FFileCount2:            integer;
  80.         FFileCount3:            integer;
  81.         FCanceled:                boolean;
  82.         FOrgProgress:           TArchiverProgressEvent;
  83.         procedure SetArchiveFileName( const Value:string );
  84.  
  85.     protected
  86.         procedure DoShow; override;
  87.         procedure DoHide; override;
  88.         procedure BeforeExec( ArchiveFile:TArchiveFile );
  89.         procedure AfterExec( ArchiveFile:TArchiveFile );
  90.  
  91.     private
  92.         FArchiver:                TArchiverMethodAndParams;
  93.         function DoUnpackFiles  :Integer;
  94.         function DoPackFiles    :Integer;
  95.         function DoRemoveItems  :Integer;
  96.         function DoUpdateArchive:Integer;
  97.         function DoMakeSfx      :Integer;
  98.         function DoUnpackToMem  :Integer;
  99. //        function DoCheckArchive :integer;
  100.         procedure ExecMethod( var msg:TMessage ); message WM_EXECMETHOD;
  101.  
  102.     public
  103.         property ArchiveFileName:    string write SetArchiveFileName;
  104.  
  105.         function UnpackFiles  ( ArchiveFile:TArchiveFile;Options:TArchiverOptions;DstPath:String;FileList:array of const ):Integer;
  106.         function PackFiles    ( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  107.         function RemoveItems  ( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  108.         function UpdateArchive( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  109.         function MakeSfx      ( ArchiveFile:TArchiveFile;Options:TArchiverOptions;DstPath:String ):Integer;
  110.         function UnpackToMem  ( ArchiveFile:TArchiveFile;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  111.     end;
  112.  
  113. var
  114.     dlgArchiverProgress: TdlgArchiverProgress;
  115.  
  116. implementation
  117.  
  118. uses
  119.     Filters;
  120.  
  121. {$OPTIMIZATION ON}    // é▒éΩé≡ôⁿéΩé╚éóé╞ C++ Builder 3 é┼îδô«ì∞
  122. {$BOOLEVAL OFF}
  123.  
  124. {$IFNDEF VER90} // not Delphi 2 ?
  125.     {$IFNDEF VER100} // not Delphi 3 ?
  126.         {$HPPEMIT '#include "LHPRSTUB.h"'}
  127.         {$ObjExportAll On}
  128.     {$ENDIF}
  129. {$ENDIF}
  130.  
  131. {$R *.DFM}
  132.  
  133. procedure TdlgArchiverProgress.FormShow( Sender:TObject );
  134. begin
  135.     PostMessage( Handle,WM_EXECMETHOD,0,0 );
  136. end;
  137.  
  138. procedure TdlgArchiverProgress.ExecMethod;
  139. begin
  140.     BeforeExec( FArchiver.ArchiveFile );
  141.     try
  142.         FArchiver.ExecMethod;
  143.     finally
  144.         AfterExec( FArchiver.ArchiveFile );
  145.         ModalResult := mrOk;
  146.     end;
  147. end;
  148.  
  149. procedure TDlgArchiverProgress.ArchiveFileProgress( Sender:TObject;State:Integer;lpEis:LPEXTRACTINGINFOEX;var Abort: Boolean );
  150. begin
  151.     Application.ProcessMessages;
  152.     ABort := FCanceled;
  153.  
  154.     if lpEis = nil then exit;
  155.  
  156.     with lpEis^,lpEis^.exinfo do begin
  157.         lblSrcFileName1.Caption := ExtractFileName( szSourceFileName );
  158.         if State <> 5
  159.         then begin
  160.             lblSrcFileName2.Caption := szDestFileName;
  161.             lblWriteSize   .Caption := IntToStr( dwWriteSize );
  162.             if dwFileSize <> 0
  163.             then ProgressBar1  .Position := dwWriteSize * 100 div dwFileSize
  164.             else ProgressBar1  .Position := 0;
  165.         end;
  166.     end;
  167.  
  168.     case State of
  169.         ARCEXTRACT_BEGIN:            // èYôûâtâ@âCâïé╠Åêù¥é╠èJÄn
  170.             if FFileCount1 > 0
  171.             then begin
  172.                 Inc( FFileCount2 );
  173.                 lblCount.Caption := '[' + IntToStr( FFileCount2 ) + '/' + IntToStr( FFileCount1 ) + ']';
  174.             end else begin
  175.                 if FFileCount3 > 0
  176.                 then begin
  177.                     Inc( FFileCount2 );
  178.                     lblCount.Caption := '[' + IntToStr( FFileCount2 ) + '/' + IntToStr( FFileCount3 ) + ']';
  179.                 end;
  180.             end;
  181.         ARCEXTRACT_INPROCESS:    // èYôûâtâ@âCâïé╠ôWèJÆå
  182.             ;
  183.         ARCEXTRACT_COPY:            // âÅü[âNâtâ@âCâïé╠Åæé½û▀é╡
  184.             begin
  185.                 Label4.Visible := False;
  186.                 Label5.Visible := True;
  187.                 lblSrcFileName2.Visible := False;
  188.                 cmdCancel.Enabled := False;
  189.             end;
  190.         ARCEXTRACT_END:            // Åêù¥ÅIù╣üAè╓ÿAâüâéâèé≡èJò·
  191.             ;
  192.         ARCEXTRACT_OPEN:            //    èYôûÅæî╔é╠Åêù¥é╠èJÄn
  193.             ;
  194.         5:                                // âAü[âJâCâo DLL é╔éµéΘâtâ@âCâïû╝Ä√ÅWÆåüH
  195.             begin
  196.             Inc( FFileCount1 );
  197.             lblCount.Caption := '[' + IntToStr( FFileCount1 ) + ']';
  198.             end;
  199.         $805:                            // ôαòöâtâBâïâ^é╔éµéΘâtâ@âCâïû╝Ä√ÅWÆåüH
  200.             begin
  201.             Inc( FFileCount3 );
  202.             lblCount.Caption := '[' + IntToStr( FFileCount3 ) + ']';
  203.             end;
  204.         6:                                // ê│Åké╠ÅΩìçé═üCé▒é╠âüâbâZü[âWé┼Äné▀é─æSé─é╠âüâôâoé¬ùLî°é╞é╚éΘ
  205.             ;
  206.     end;
  207. end;
  208.  
  209. procedure TdlgArchiverProgress.BeforeExec( ArchiveFile:TArchiveFile );
  210. begin
  211.     FOrgProgress := ArchiveFile.OnProgress;
  212.     ArchiveFile.OnProgress := ArchiveFileProgress;
  213.     ArchiveFileName := ArchiveFile.FileName;
  214. //    Show;
  215. //    Update;
  216. end;
  217.  
  218. procedure TdlgArchiverProgress.AfterExec( ArchiveFile:TArchiveFile );
  219. begin
  220.     ArchiveFile.OnProgress := FOrgProgress;
  221. //    Hide;
  222. end;
  223.  
  224. procedure TDlgArchiverProgress.DoShow;
  225. begin
  226.     FFileCount1 := 0;
  227.     FFileCount2 := 0;
  228.     FFileCount3 := 0;
  229.     lblCount.       Caption := '';
  230.     lblWriteSize   .Caption := '';
  231.     lblSrcFileName2.Caption := '';
  232.     lblSrcFileName2.Visible := True;
  233.     Label4.Visible := True;
  234.     Label5.Visible := False;
  235.     ProgressBar1  .Position := 0;
  236.     FCanceled := False;
  237.     inherited;
  238. end;
  239.  
  240. procedure TDlgArchiverProgress.DoHide;
  241. begin
  242.     cmdCancel.Enabled := True;
  243. end;
  244.  
  245. procedure TDlgArchiverProgress.SetArchiveFileName( const Value:string );
  246. begin
  247.     lblArchiveFileName.Caption := Value;
  248. end;
  249.  
  250. procedure TdlgArchiverProgress.cmdCancelClick( Sender:TObject );
  251. begin
  252.     FCanceled := True;
  253. end;
  254.  
  255. function TdlgArchiverProgress.MakeSfx( ArchiveFile:TArchiveFile;Options:TArchiverOptions;DstPath:String ):Integer;
  256. begin
  257.     Assert( Self <> nil,'dlgArchiverProgress not assigned' );
  258.     FArchiver := TArchiverMethodAndParams.Create( DoMakeSfx,ArchiveFile,Options,DstPath,[nil],nil,0 );
  259.     try
  260.         Caption        := 'Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼ';
  261.         Label4.Caption := 'ê│Åkâtâ@âCâïüF';
  262.         ShowModal;
  263.         Result := FArchiver.ArchiverResult;
  264.     finally
  265.         FArchiver.Free;
  266.         FArchiver := nil;
  267.     end;
  268. end;
  269.  
  270. function TdlgArchiverProgress.PackFiles( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  271. begin
  272.     Assert( Self <> nil,'dlgArchiverProgress not assigned' );
  273.     FArchiver := TArchiverMethodAndParams.Create( DoPackFiles,ArchiveFile,Options,BaseDir,FileList,nil,0 );
  274.     try
  275.         Caption        := 'ê│ÅkÅ≤ï╡';
  276.         Label4.Caption := 'ê│Åkâtâ@âCâïüF';
  277.         ShowModal;
  278.         Result := FArchiver.ArchiverResult;
  279.     finally
  280.         FArchiver.Free;
  281.         FArchiver := nil;
  282.     end;
  283. end;
  284.  
  285. function TdlgArchiverProgress.RemoveItems( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  286. begin
  287.     Assert( Self <> nil,'dlgArchiverProgress not assigned' );
  288.     FArchiver := TArchiverMethodAndParams.Create( DoRemoveItems,ArchiveFile,Options,BaseDir,FileList,nil,0 );
  289.     try
  290.         Caption        := 'ìφÅ£Å≤ï╡';
  291.         Label4.Caption := 'ìφÅ£âtâ@âCâïüF';
  292.         ShowModal;
  293.         Result := FArchiver.ArchiverResult;
  294.     finally
  295.         FArchiver.Free;
  296.         FArchiver := nil;
  297.     end;
  298. end;
  299.  
  300. function TdlgArchiverProgress.UnpackFiles( ArchiveFile:TArchiveFile;Options:TArchiverOptions;DstPath:String;FileList:array of const ):Integer;
  301. begin
  302.     Assert( Self <> nil,'dlgArchiverProgress not assigned' );
  303.     FArchiver := TArchiverMethodAndParams.Create( DoUnpackFiles,ArchiveFile,Options,DstPath,FileList,nil,0 );
  304.     try
  305.         Caption        := 'ë≡ôÇÅ≤ï╡';
  306.         Label4.Caption := 'ë≡ôÇɵü@ü@ü@üF';
  307.         ShowModal;
  308.         Result := FArchiver.ArchiverResult;
  309.     finally
  310.         FArchiver.Free;
  311.         FArchiver := nil;
  312.     end;
  313. end;
  314.  
  315. function TdlgArchiverProgress.UnpackToMem( ArchiveFile:TArchiveFile;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  316. begin
  317.     Assert( Self <> nil,'dlgArchiverProgress not assigned' );
  318.     FArchiver := TArchiverMethodAndParams.Create( DoUnpackToMem,ArchiveFile,Options,'',[FileName],nil,0 );
  319.     try
  320.         Caption        := 'ë≡ôÇÅ≤ï╡';
  321.         Label4.Caption := '';
  322.         ShowModal;
  323.         Result := FArchiver.ArchiverResult;
  324.     finally
  325.         FArchiver.Free;
  326.         FArchiver := nil;
  327.     end;
  328. end;
  329.  
  330. function TdlgArchiverProgress.UpdateArchive( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  331. begin
  332.     Assert( Self <> nil,'dlgArchiverProgress not assigned' );
  333.     FArchiver := TArchiverMethodAndParams.Create( DoUpdateArchive,ArchiveFile,Options,BaseDir,FileList,nil,0 );
  334.     try
  335.         Caption        := 'ê│ÅkÅ≤ï╡';
  336.         Label4.Caption := 'ê│Åkâtâ@âCâïüF';
  337.         ShowModal;
  338.         Result := FArchiver.ArchiverResult;
  339.     finally
  340.         FArchiver.Free;
  341.         FArchiver := nil;
  342.     end;
  343. end;
  344.  
  345. function TdlgArchiverProgress.DoUnpackFiles:Integer;
  346. begin
  347.     with FArchiver do Result := ArchiveFile.UnpackFiles( Handle,Options,BaseDir,[FileList] );
  348. end;
  349.  
  350. function TdlgArchiverProgress.DoPackFiles:Integer;
  351. begin
  352.     with FArchiver do Result := ArchiveFile.PackFiles( Handle,Options,BaseDir,[FileList] );
  353. end;
  354.  
  355. function TdlgArchiverProgress.DoRemoveItems:Integer;
  356. begin
  357.     with FArchiver do Result := ArchiveFile.RemoveItems( Handle,Options,BaseDir,[FileList] );
  358. end;
  359.  
  360. function TdlgArchiverProgress.DoUpdateArchive:Integer;
  361. begin
  362.     with FArchiver do Result := ArchiveFile.UpdateArchive( Handle,Options,BaseDir,[FileList] );
  363. end;
  364.  
  365. function TdlgArchiverProgress.DoMakeSfx:Integer;
  366. begin
  367.     with FArchiver do Result := ArchiveFile.MakeSfx( Handle,Options,BaseDir );
  368. end;
  369.  
  370. function TdlgArchiverProgress.DoUnpackToMem:Integer;
  371. begin
  372.     with FArchiver do Result := ArchiveFile.UnpackToMem( Handle,Options,FileList[0],Buffer,dwBuffSize,@dwWriteSize );
  373. end;
  374.  
  375. constructor TArchiverMethodAndParams.Create( Method:TArchiverMethod;ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:string;FileList:array of const;Buffer:Pointer;dwBuffSize:DWORD );
  376. begin
  377.     FMethod      := Method;
  378.     FArchiveFile := ArchiveFIle;
  379.     FOptions     := Options;
  380.     FBaseDir     := BaseDir;
  381.     FFileList    := ArrayToList( FileList );
  382.     FBuffer      := Buffer;
  383.     FdwBuffSize  := dwBuffSize;
  384. end;
  385.  
  386. destructor TArchiverMethodAndParams.Destroy;
  387. begin
  388.     FFileList.Free;
  389.     inherited;
  390. end;
  391.  
  392. procedure TArchiverMethodAndParams.ExecMethod;
  393. begin
  394.     FArchiverResult := FMethod;
  395. end;
  396.  
  397. function UnpackFiles( ArchiveFile:TArchiveFile;Options:TArchiverOptions;DstPath:String;FileList:array of const ):Integer;
  398. var
  399.     dlgArchiverProgress:    TdlgArchiverProgress;
  400. begin
  401.     dlgArchiverProgress := TdlgArchiverProgress.Create( Application );
  402.     try
  403.         Result := dlgArchiverProgress.UnpackFiles( ArchiveFile,Options,DstPath,FileList )
  404.     finally
  405.         dlgArchiverProgress.Free;
  406.     end;
  407. end;
  408.  
  409. function PackFiles( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  410. var
  411.     dlgArchiverProgress:    TdlgArchiverProgress;
  412. begin
  413.     dlgArchiverProgress := TdlgArchiverProgress.Create( Application );
  414.     try
  415.         Result := dlgArchiverProgress.PackFiles( ArchiveFile,Options,BaseDir,FileList )
  416.     finally
  417.         dlgArchiverProgress.Free;
  418.     end;
  419. end;
  420.  
  421. function RemoveItems( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  422. var
  423.     dlgArchiverProgress:    TdlgArchiverProgress;
  424. begin
  425.     dlgArchiverProgress := TdlgArchiverProgress.Create( Application );
  426.     try
  427.         Result := dlgArchiverProgress.RemoveItems( ArchiveFile,Options,BaseDir,FileList )
  428.     finally
  429.         dlgArchiverProgress.Free;
  430.     end;
  431. end;
  432.  
  433. function UpdateArchive( ArchiveFile:TArchiveFile;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  434. var
  435.     dlgArchiverProgress:    TdlgArchiverProgress;
  436. begin
  437.     dlgArchiverProgress := TdlgArchiverProgress.Create( Application );
  438.     try
  439.         Result := dlgArchiverProgress.UpdateArchive( ArchiveFile,Options,BaseDir,FileList )
  440.     finally
  441.         dlgArchiverProgress.Free;
  442.     end;
  443. end;
  444.  
  445. function MakeSfx( ArchiveFile:TArchiveFile;Options:TArchiverOptions;DstPath:String ):Integer;
  446. var
  447.     dlgArchiverProgress:    TdlgArchiverProgress;
  448. begin
  449.     dlgArchiverProgress := TdlgArchiverProgress.Create( Application );
  450.     try
  451.         Result := dlgArchiverProgress.MakeSfx( ArchiveFile,Options,DstPath )
  452.     finally
  453.         dlgArchiverProgress.Free;
  454.     end;
  455. end;
  456.  
  457. function UnpackToMem( ArchiveFile:TArchiveFile;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  458. begin
  459.     dlgArchiverProgress := TdlgArchiverProgress.Create( Application );
  460.     try
  461.         Result := dlgArchiverProgress.UnpackToMem( ArchiveFile,Options,FileName,lpvBuffer,dwSize,lpdwWriteSize );
  462.     finally
  463.         dlgArchiverProgress.Free;
  464.     end;
  465. end;
  466.  
  467. end.
  468.