转载
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~