转载

复制代码
  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
复制代码

 

posted @   熊大熊二  阅读(496)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示