文档章节

关于 Delphi 中流的使用(10): 压缩与解压缩进度 - 回复 "ilst" 的问题

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 415
阅读 6
收藏 0
问题来源: http://www.cnblogs.com/del/archive/2008/08/02/1022539.html#1275599

本例是在这个例子的基础上修改的: http://www.cnblogs.com/del/archive/2008/01/01/1022539.html

本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure CsProgress(Sender: TObject); {压缩的 OnProgress 事件}
    procedure DsProgress(Sender: TObject); {解压缩的 OnProgress 事件}
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Zlib;

{压缩的 OnProgress 事件}
procedure TForm1.CsProgress(Sender: TObject);
begin
  ProgressBar1.Position := Integer(TCompressionStream(Sender).Position div 1024);
  Application.ProcessMessages;
end;

{解压缩的 OnProgress 事件}
procedure TForm1.DsProgress(Sender: TObject);
begin
  ProgressBar1.Position := Integer(TDecompressionStream(Sender).Position div 1024);
  Application.ProcessMessages;
end;

{压缩}
procedure TForm1.Button1Click(Sender: TObject);
var
  cs: TCompressionStream;
  fs,ms: TMemoryStream;
  num: Integer;
begin
  fs := TMemoryStream.Create;
  fs.LoadFromFile('c:\temp\test.txt'); {我是用一个 15M 的文本文件测试的}
  num := fs.Size;

  ms := TMemoryStream.Create;
  ms.Write(num, SizeOf(num));

  cs := TCompressionStream.Create(clMax, ms);

  {在原来代码基础是添加这两行}
  ProgressBar1.Max := Integer(fs.Size div 1024);
  cs.OnProgress := CsProgress;

  fs.SaveToStream(cs);
  cs.Free;

  ms.SaveToFile('c:\temp\test.zipx');

  ms.Free;
  fs.Free;
end;


{解压缩}
procedure TForm1.Button2Click(Sender: TObject);
var
  ds: TDecompressionStream;
  fs,ms: TMemoryStream;    
  num: Integer;
begin
  fs := TMemoryStream.Create;
  fs.LoadFromFile('c:\temp\test.zipx');
  fs.Position := 0;
  fs.ReadBuffer(num,SizeOf(num));

  ms := TMemoryStream.Create;
  ms.SetSize(num);

  ds := TDecompressionStream.Create(fs);

  {在原来代码基础是添加这两行}
  ProgressBar1.Max := Integer(ms.Size div 1024);
  ds.OnProgress := DsProgress;

  ds.Read(ms.Memory^, num);

  ms.SaveToFile('c:\temp\test2.txt');

  ds.Free;
  ms.Free;
  fs.Free;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 136
  ClientWidth = 205
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 64
    Top = 24
    Width = 75
    Height = 25
    Caption = #21387#32553
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 64
    Top = 55
    Width = 75
    Height = 25
    Caption = #35299#21387#32553
    TabOrder = 1
    OnClick = Button2Click
  end
  object ProgressBar1: TProgressBar
    Left = 24
    Top = 97
    Width = 150
    Height = 17
    TabOrder = 2
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/08/02/1258881.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
SQLite for Delphi的网友评论

SQLite的一个Delphi的开源封装库,全面支持Delphi 4, 5, 6, 7, 2005 和 2006。对于Delphi 4和Delphi 5请使用带有D4、D5后缀的文件。解压缩下载回来的文件包到Delphi的子目录下,安装该组件,...

红薯
2009/12/11
1K
2
SQLite for Delphi

SQLite的一个Delphi的开源封装库,全面支持Delphi 4, 5, 6, 7, 2005 和 2006。对于Delphi 4和Delphi 5请使用带有D4、D5后缀的文件。解压缩下载回来的文件包到Delphi的子目录下,安装该组件,...

匿名
2008/10/06
12.3K
1
通过WCF扩展实现消息压缩

对于需要进行大规模数据传输的WCF应用来说,对于请求消息和回复消息进行传输前的压缩,不但可以降低网络流量,也可以提高网络传输的性能。由于WCF的扩展性,我们可以采用不同的方式实现对消息...

长平狐
2012/09/04
328
0
ZIP4J---ZIP文件压缩与解压缩学习

最近公司准备让各项目组提供公共工具组件,手中正好无事便研究其中一个工具 - 文件压缩与解压缩工具。 目前JAVA API已提供对于ZIP文件的压缩与解压缩,但网上总结不支持ZIP文件加密与解密甚至...

皮蛋猫
2013/09/06
0
2
Delphi惹谁了?

Delphi惹谁了? 最早的时候就有C++程序员做Win23的产品没有Delphi程序员快,不服气地说Delphi的不好,理由是Delphi只能拖拉控件,不能OOP。几年以前,当Java刚刚火起来的时候,Java程序员说D...

vga
2016/08/09
35
6

没有更多内容

加载失败,请刷新页面

加载更多

Linux学习-1031(rsync同步工具 上)

10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通过ssh同步 一、 rsync工具介绍 rsync是一个同步工具,在日常的运维中常会用到。它可以本地同步,也实现可以远程两台机器同步。...

wxy丶
18分钟前
1
0
python实战一期:第一天

1. 为什么学习python 1.1 为什么要学Python? Python第一是个非常牛B的脚本语言,能满足绝大部分自动化运维的需求,又能做后端C/S架构,又能用WEB框架快速开发出高大上的Web界面,只有当你自...

laoba
20分钟前
2
0
Java并发编程学习三:线程同步的关键字以及理解

上篇文章中介绍了Java线程的带来的问题与内存模型中介绍了线程可能会引发的问题以及对应Java的内存模型,顺带介绍了Volatile和Sychronized关键字。今天对Java中涉及到的常见的关键类和关键字...

JerryLin123
26分钟前
0
0
我用代码来给你们分析一个赚钱的技巧

赚钱是个俗气的话题,但又是人人都绕不开的事情。我今天来“科学”地触碰下这个话题。 谈赚钱,就会谈到理财、投资,谈到炒股。有这样一个笑话: 问:如何成为百万富翁? 答:带一千万进入股...

crossin
27分钟前
1
0
spring MatchingBean应用

1、编写接口FactoryList import java.util.List;public interface FactoryList<E extends MatchingBean<K>, K> extends List<E> { E getBean(K factor); List<E> getBeanLi......

重城重楼
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部