FileDownLoadFrm.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. {*******************************************************************************
  2. 单元名称: FileDownLoadFrm.pas
  3. 单元说明: 通用的文件下载进度窗体,下载完退出程序,并运行刚下载的文件。
  4. 作者时间: Chenshilong, 2016-08-10
  5. *******************************************************************************}
  6. unit FileDownLoadFrm;
  7. interface
  8. uses
  9. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  10. Dialogs, Gauges, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  11. IdTCPClient, IdHTTP, ShellAPI;
  12. type
  13. TDownThread = class(TThread)
  14. private
  15. FURL: string;
  16. FFileName: string;
  17. FLocalFile: string;
  18. FOwner: TObject;
  19. procedure SetURL(const Value: string);
  20. public
  21. property URL: string read FURL write SetURL;
  22. procedure Execute; override;
  23. end;
  24. TFileDownLoadForm = class(TForm)
  25. lblFileName: TLabel;
  26. gDown: TGauge;
  27. ITPDown: TIdHTTP;
  28. procedure ITPDownWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  29. const AWorkCountMax: Integer);
  30. procedure ITPDownWork(Sender: TObject; AWorkMode: TWorkMode;
  31. const AWorkCount: Integer);
  32. procedure ITPDownWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  33. procedure FormCreate(Sender: TObject);
  34. private
  35. FDownThread: TDownThread;
  36. procedure SetURL(const Value: string);
  37. { Private declarations }
  38. public
  39. { Public declarations }
  40. property URL: string write SetURL;
  41. procedure RefreshDisplay(AFileName: string);
  42. end;
  43. implementation
  44. {$R *.dfm}
  45. { TFileDownLoadForm }
  46. procedure TFileDownLoadForm.ITPDownWorkBegin(Sender: TObject;
  47. AWorkMode: TWorkMode; const AWorkCountMax: Integer);
  48. begin
  49. gDown.MinValue := 0;
  50. gDown.Progress := 0;
  51. gDown.MaxValue := AWorkCountMax;
  52. end;
  53. procedure TFileDownLoadForm.ITPDownWork(Sender: TObject;
  54. AWorkMode: TWorkMode; const AWorkCount: Integer);
  55. begin
  56. gDown.Progress := AWorkCount;
  57. end;
  58. procedure TFileDownLoadForm.ITPDownWorkEnd(Sender: TObject;
  59. AWorkMode: TWorkMode);
  60. begin
  61. //
  62. end;
  63. procedure TFileDownLoadForm.SetURL(const Value: string);
  64. begin
  65. FDownThread.URL := Value;
  66. end;
  67. procedure TFileDownLoadForm.RefreshDisplay(AFileName: string);
  68. begin
  69. lblFileName.Caption := AFileName;
  70. lblFileName.Update;
  71. end;
  72. { TDownThread }
  73. procedure TDownThread.Execute;
  74. var
  75. vStream: TMemoryStream;
  76. begin
  77. inherited;
  78. if Trim(FURL) = '' then Exit;
  79. vStream := TMemoryStream.Create;
  80. try
  81. TFileDownLoadForm(FOwner).ITPDown.Get(FURL, vStream);
  82. vStream.SaveToFile(FLocalFile);
  83. ShellExecute(Handle, 'open', pchar(FLocalFile), nil, nil, SW_SHOWNORMAL);
  84. TFileDownLoadForm(FOwner).Close;
  85. Synchronize(Application.Terminate); // 同步到主线程,不然执行后没响应。
  86. finally
  87. vStream.Free;
  88. end;
  89. end;
  90. procedure TFileDownLoadForm.FormCreate(Sender: TObject);
  91. begin
  92. FDownThread := TDownThread.Create(True);
  93. FDownThread.FOwner := Self;
  94. FDownThread.FreeOnTerminate := True;
  95. end;
  96. procedure TDownThread.SetURL(const Value: string);
  97. var s: string;
  98. begin
  99. FURL := Value;
  100. // 反斜杠 ExtractFileName 函数搞不定,这里先转换
  101. s := StringReplace(Value, '/', '\', [rfReplaceAll, rfIgnoreCase]);
  102. FFileName := ExtractFileName(s);
  103. FLocalFile := 'Web\' + FFileName;
  104. TFileDownLoadForm(FOwner).RefreshDisplay(FFileName);
  105. Resume; // 在这里唤醒
  106. end;
  107. end.