Delphi 中之 VCLZip 控件很不错的说,结合多线程,很容易搞出颇具特色的软件...
    之前写过 VCLZip + Multi-Thread 的简单 Demo,Now share it:

    program ZipDemo;
    uses
      Forms,
      Unit1 in 'Unit1.pas' {frm_Main};

    {$R *.res}
    begin
      Application.Initialize;
      Application.CreateForm(Tfrm_Main, frm_Main);
      Application.Title:= '解压缩示例';
      Application.Run;
    end.


    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, VCLUnZip, VCLZip, StdCtrls, ComCtrls, Gauges, ExtCtrls;


    const
      WM_ZipDone = WM_USER + 111;
      WM_ZipError = WM_USER + 112;


    type
      TZipThread = class(TThread)
        _VCLZip: TVCLZip;
      protected
        procedure Execute; override;  
      end;


      TUnZipThread = class(TThread)
        _VCLUnZip: TVCLUnZip;
      protected
        procedure Execute; override;  
      end;


      Tfrm_Main = class(TForm)
        VCLZip1: TVCLZip;
        VCLUnZip1: TVCLUnZip;
        Dlg_OpenDlg: TOpenDialog;
        Dlg_SaveDlg: TSaveDialog;
        btn_Zip: TButton;
        btn_UnZip: TButton;
        Memo1: TMemo;
        Label1: TLabel;
        Shp1: TShape;
        Shp2: TShape;
        Shp3: TShape;
        Shp4: TShape;
        Shp5: TShape;
        Tmr_FlashTip: TTimer;
        procedure btn_ZipClick(Sender: TObject);
        procedure btn_UnZipClick(Sender: TObject);
        procedure Label1Click(Sender: TObject);
        procedure Tmr_FlashTipTimer(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
        FZipThread: TZipThread;
        FUnZipThread: TUnZipThread;

        FInProcess: Boolean;
      public
        { Public declarations }
        procedure SetTipShpsVisible(IsVisible: Boolean = True);

        procedure ZipBegin;
    
        procedure WM_ZipDone(var Msg: TMessage); message WM_ZipDone;
        procedure WM_ZipError(var Msg: TMessage); message WM_ZipError;
      end;


    var
      frm_Main: Tfrm_Main;


    implementation

    uses
      QDialogs, ShellAPI;


    const
      ZipFlag = 1; //压缩
      UnZipFlag = 2; //解压
      ZipErrorInfo = '%s失败!失败原因:%s '; //压缩/解压、失败原因


    {$R *.dfm}

    procedure Tfrm_Main.btn_ZipClick(Sender: TObject);
    var
      SaveName: string;
      i: Integer;
    begin
      Memo1.Lines.Clear;


      if Dlg_OpenDlg.Execute then
      begin
        Update;


        for i:= 0 to Dlg_OpenDlg.Files.Count - 1 do
          Memo1.Lines.Add(Dlg_OpenDlg.Files.Strings
);
      end;


      if Dlg_SaveDlg.Execute then
        SaveName:= Dlg_SaveDlg.FileName
      else
        Exit;  


      with VCLZip1 do
      begin
        ZipName:= SaveName;
        Password:= 'Simon.Hu'; //Here set your Password...
        Recurse:= True;

        Screen.Cursor:= crHourGlass;  
  
        for i:= 0 to Memo1.Lines.Count - 1 do
          FilesList.Add(Memo1.Lines
);
      end;


      ZipBegin;
      FZipThread:= TZipThread.Create(True);
      with FZipThread do
      begin
        FreeOnTerminate:= True;

        _VCLZip:= VCLZip1;
    
        Resume;
      end;
    end;


    procedure Tfrm_Main.btn_UnZipClick(Sender: TObject);
    var
      i: Integer;
      OpenName: string;
      DestPath: WideString;
    begin
      Memo1.Lines.Clear;


      if Dlg_OpenDlg.Execute then
        OpenName:= Dlg_OpenDlg.FileName
      else
        Exit;


      with VCLUnZip1 do
      begin
        ZipName:= OpenName;
        Password:= 'Simon.Hu'; //Here set your Password...


        Screen.Cursor:= crHourGlass;
        ReadZip;
        for i:= 0 to Count - 1 do
          Memo1.Lines.Add(Filename
+ #9 + Pathname);
        Screen.Cursor:= crDefault;
        if not SelectDirectory('请选择保存目录', '', DestPath) then //uses QDialogs...
          Exit;
        DestDir:= DestPath; 
        DoAll:= True;
        RecreateDirs:= True;
        RetainAttributes:= True;
      end; 
      ZipBegin;
      FUnZipThread:= TUnZipThread.Create(True);
      with FUnZipThread do
      begin
        FreeOnTerminate:= True;
        _VCLUnZip:= VCLUnZip1;
   
        Resume;
      end;
    end;
    procedure Tfrm_Main.Label1Click(Sender: TObject);
    begin
      ShellExecute(
                   0,
                   'Open',
                   'http://user.qzone.qq.com/395588677/infocenter',
                   nil,
                   nil,
                   SW_SHOW
                  );
    end;
    procedure Tfrm_Main.Tmr_FlashTipTimer(Sender: TObject);
    begin
      if Shp1.Brush.Color = clGreen then
      begin
        Shp1.Brush.Color:= clFuchsia;
        Shp2.Brush.Color:= clGreen;
        Shp3.Brush.Color:= clFuchsia;
        Shp4.Brush.Color:= clFuchsia;
        Shp5.Brush.Color:= clFuchsia;
      end
      else if Shp2.Brush.Color = clGreen then
      begin
        Shp1.Brush.Color:= clFuchsia;
        Shp2.Brush.Color:= clFuchsia;
        Shp3.Brush.Color:= clGreen;
        Shp4.Brush.Color:= clFuchsia;
        Shp5.Brush.Color:= clFuchsia;
      end
      else if Shp3.Brush.Color = clGreen then
      begin
        Shp1.Brush.Color:= clFuchsia;
        Shp2.Brush.Color:= clFuchsia;
        Shp3.Brush.Color:= clFuchsia;
        Shp4.Brush.Color:= clGreen;
        Shp5.Brush.Color:= clFuchsia;
      end
      else if Shp4.Brush.Color = clGreen then
      begin
        Shp1.Brush.Color:= clFuchsia;
        Shp2.Brush.Color:= clFuchsia;
        Shp3.Brush.Color:= clFuchsia;
        Shp4.Brush.Color:= clFuchsia;
        Shp5.Brush.Color:= clGreen;
      end
      else if Shp5.Brush.Color = clGreen then
      begin
        Shp1.Brush.Color:= clGreen;
        Shp2.Brush.Color:= clFuchsia;
        Shp3.Brush.Color:= clFuchsia;
        Shp4.Brush.Color:= clFuchsia;
        Shp5.Brush.Color:= clFuchsia;
      end;
    end;
    procedure Tfrm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if FInProcess then
      begin
        if Assigned(FZipThread) then
        begin
          FZipThread.Suspend;
          if MessageBox(
                        Handle,
                        '正在压缩文件,您确定要退出吗? ',
                        '退出确认',
                        MB_YESNO + MB_ICONQUESTION
                       ) = IDYES then
          begin
            FZipThread.Resume;
       
            SendMessage(frm_Main.Handle, WM_USER + 111, 0, 0);
          end
          else
          begin
            FZipThread.Resume;
           
            Action:= caNone;
          end;
        end
        else
        begin
          FUnZipThread.Suspend;
          if MessageBox(
                        Handle,
                        '正在解压文件,您确定要退出吗? ',
                        '退出确认',
                        MB_YESNO + MB_ICONQUESTION
                       ) = IDYES then
          begin
            FUnZipThread.Resume;
       
            SendMessage(frm_Main.Handle, WM_USER + 111, 0, 0);
          end
          else
          begin
            FUnZipThread.Resume;
       
            Action:= caNone;
          end; 
        end;
      end;
    end;
    procedure Tfrm_Main.ZipBegin;
    begin
      FInProcess:= True;
      btn_Zip.Enabled:= False;
      btn_UnZip.Enabled:= False;
      SetTipShpsVisible(True);
      Shp1.Brush.Color:= clGreen;
      Tmr_FlashTip.Enabled:= True;
    end;
    procedure Tfrm_Main.WM_ZipDone(var Msg: TMessage);
    begin
      Tmr_FlashTip.Enabled:= False;
      SetTipShpsVisible(False);
      if Assigned(FZipThread) then
        FZipThread:= nil
      else if Assigned(FUnZipThread) then
        FUnZipThread:= nil;
      btn_Zip.Enabled:= True;
      btn_UnZip.Enabled:= True;
      FInProcess:= False;
      Screen.Cursor:= crDefault;
 
      if Msg.WParam = ZipFlag then
        MessageBox(
                   Handle,
                   PChar(
                         '压缩完毕! ' + #13 + '共压缩了 ' +
                         IntToStr(Msg.LParam) + ' 个文件。 '
                        ),
                   '提示',
                   MB_OK + MB_ICONINFORMATION
                  )
      else if Msg.WParam = UnZipFlag then
        MessageBox(
                   Handle,
                   PChar(
                         '解压完毕! ' + #13 + '共解压了 ' +
                         IntToStr(Msg.LParam) + ' 个文件。 '
                        ),
                   '提示',
                   MB_OK + MB_ICONINFORMATION
                  );
    end;
    procedure Tfrm_Main.WM_ZipError(var Msg: TMessage);
    begin
      Tmr_FlashTip.Enabled:= False;
      SetTipShpsVisible(False);
      if Assigned(FZipThread) then
        FZipThread:= nil
      else if Assigned(FUnZipThread) then
        FUnZipThread:= nil;
      btn_Zip.Enabled:= True;
      btn_UnZip.Enabled:= True;
      FInProcess:= False;
      Screen.Cursor:= crDefault;
      MessageBox(
                 Handle,
                 PChar(Msg.LParam),
                 '错误',
                 MB_OK + MB_ICONERROR
                );
    end;
    procedure Tfrm_Main.SetTipShpsVisible(IsVisible: Boolean);
    begin
      if IsVisible then
      begin
        Shp1.Visible:= True;
        Shp2.Visible:= True;
        Shp3.Visible:= True;
        Shp4.Visible:= True;
        Shp5.Visible:= True;
      end
      else
      begin
        Shp1.Visible:= False;
        Shp2.Visible:= False;
        Shp3.Visible:= False;
        Shp4.Visible:= False;
        Shp5.Visible:= False;
      end;
    end;
    { TZipThread }
    procedure TZipThread.Execute;
    var
      ZippedCount: Integer;
    begin
      Screen.Cursor:= crHourGlass;
      try
        ZippedCount:= _VCLZip.Zip;
    
        SendMessage(frm_Main.Handle, WM_ZipDone, ZipFlag, ZippedCount);
      except
        on E: Exception do
        begin
          SendMessage(
                      frm_Main.Handle,
                      WM_ZipError,
                      ZipFlag,
                      Integer(Format(ZipErrorInfo, ['压缩', E.Message]))
                     );
        end;
      end;
    end;
    { TUnZipThread }
    procedure TUnZipThread.Execute;
    var
      UnZippedCount: Integer;
    begin
      Screen.Cursor:= crHourGlass;
      try
        UnZippedCount:= _VCLUnZip.UnZip;
        SendMessage(frm_Main.Handle, WM_ZipDone, UnZipFlag, UnZippedCount);
      except
        on E: Exception do
        begin
          SendMessage(
                      frm_Main.Handle,
                      WM_ZipError,
                      UnZipFlag,
                      Integer(Format(ZipErrorInfo, ['解压', E.Message]))
                     );
        end;
      end;
    end;
    end.
附图片:
VCL