zoukankan      html  css  js  c++  java
  • 转载

      1 unit Unit3;
      2 
      3 interface
      4 
      5 uses
      6   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      7   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Net.HttpClient,
      8   Vcl.ComCtrls;
      9 
     10 type
     11   TForm3 = class(TForm)
     12     btnStart: TButton;
     13     ProgressBar1: TProgressBar;
     14     edt1: TEdit;
     15     procedure btnStartClick(Sender: TObject);
     16     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
     17     procedure FormShow(Sender: TObject);
     18     procedure FormCreate(Sender: TObject);
     19   private
     20     { Private declarations }
     21 
     22     /// <summary>
     23     /// 下载的时候不允许关闭窗体
     24     /// </summary>
     25     FAllowFormClose: Boolean;
     26 
     27     /// <summary>
     28     /// 接收数据事件
     29     /// </summary>
     30     procedure ReceiveDataEvent(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean);
     31   public
     32     { Public declarations }
     33   end;
     34 
     35 var
     36   Form3: TForm3;
     37 
     38 implementation
     39 
     40 {$R *.dfm}
     41 
     42 procedure TForm3.ReceiveDataEvent(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean);
     43 begin
     44   //Queue运行在主线程中,且是异步的。
     45   TThread.Queue(nil,
     46     procedure
     47     begin
     48       ProgressBar1.Position := AReadCount;
     49     end);
     50 end;
     51 
     52 procedure TForm3.btnStartClick(Sender: TObject);
     53 begin
     54   //创建一个普通线程,防止界面假死.
     55   TThread.CreateAnonymousThread(
     56   procedure
     57     var
     58       MyHTTPClient: THTTPClient;
     59       MyHTTPResponse: IHTTPResponse;
     60       MyMemoryStream: TMemoryStream;
     61       downloadUrl: string;
     62   begin
     63     MyHTTPClient := THTTPClient.Create;
     64     MyMemoryStream := TMemoryStream.Create;
     65     try
     66       btnStart.Enabled := False;
     67       FAllowFormClose := False;
     68       downloadUrl := Trim(edt1.Text);
     69 
     70       //获取文件的大小
     71       MyHTTPResponse := MyHTTPClient.Head(downloadUrl);
     72       ProgressBar1.Position := 0;
     73       ProgressBar1.Max := MyHTTPResponse.ContentLength;
     74 
     75       //开始下载,保存到本地
     76       MyHTTPClient.OnReceiveData := ReceiveDataEvent;
     77       MyHTTPResponse := MyHTTPClient.Get(downloadUrl, MyMemoryStream);
     78       if MyHTTPResponse.StatusCode = 200 then
     79       begin
     80         MyMemoryStream.SaveToFile('c:aa.exe');
     81         ShowMessage('下载完成');
     82       end;
     83     finally
     84       MyHTTPClient.Free;
     85       MyMemoryStream.Free;
     86       //最终都允许关闭窗体
     87       btnStart.Enabled := True;
     88       FAllowFormClose := True;
     89     end;
     90   end).Start;
     91 end;
     92 
     93 procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
     94 begin
     95   CanClose := FAllowFormClose;
     96 end;
     97 
     98 procedure TForm3.FormCreate(Sender: TObject);
     99 begin
    100   ReportMemoryLeaksOnShutdown := True;
    101 end;
    102 
    103 procedure TForm3.FormShow(Sender: TObject);
    104 begin
    105   btnStart.Enabled := True;
    106   FAllowFormClose := True;
    107   ProgressBar1.Position := 0;
    108 end;
    109 
    110 end.
    111 
    11
  • 相关阅读:
    做了好几年的程序员,才发现自己天天都在用设计模式!
    先搞清楚这些问题,简历上再写你熟悉Java!
    Java中实现多线程继承Thread类与实现Runnable接口的区别
    JAVA中实现多线程的四种方式
    JDK和Cglib动态代理
    Java中选择排序,冒泡排序,插入排序,快速排序
    java死锁详解
    github常用命令
    字符串之StringBuffer 与 StringBuilder的对比
    基础数据类型之AbstractStringBuilder
  • 原文地址:https://www.cnblogs.com/xionda/p/5817194.html
Copyright © 2011-2022 走看看