FileDownLoadFrm.pas 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. // For test.
  62. // Application.MessageBox(PChar('下完了!'), '操作提醒', MB_OK + MB_ICONWARNING);
  63. end;
  64. procedure TFileDownLoadForm.SetURL(const Value: string);
  65. begin
  66. FDownThread.URL := Value;
  67. end;
  68. procedure TFileDownLoadForm.RefreshDisplay(AFileName: string);
  69. begin
  70. lblFileName.Caption := AFileName;
  71. lblFileName.Update;
  72. end;
  73. { TDownThread }
  74. procedure TDownThread.Execute;
  75. var
  76. vStream: TMemoryStream;
  77. begin
  78. inherited;
  79. if Trim(FURL) = '' then Exit;
  80. vStream := TMemoryStream.Create;
  81. try
  82. TFileDownLoadForm(FOwner).ITPDown.Get(FURL, vStream);
  83. vStream.SaveToFile(FLocalFile);
  84. ShellExecute(Handle, 'open', pchar(FLocalFile), nil, nil, SW_SHOWNORMAL);
  85. TFileDownLoadForm(FOwner).Close;
  86. Synchronize(Application.Terminate); // 同步到主线程,不然执行后没响应。
  87. finally
  88. vStream.Free;
  89. end;
  90. end;
  91. procedure TFileDownLoadForm.FormCreate(Sender: TObject);
  92. begin
  93. FDownThread := TDownThread.Create(True);
  94. FDownThread.FOwner := Self;
  95. FDownThread.FreeOnTerminate := True;
  96. end;
  97. procedure TDownThread.SetURL(const Value: string);
  98. var s, path: string;
  99. begin
  100. FURL := Value;
  101. path := ExtractFilePath(Application.ExeName) + 'Web\';
  102. ForceDirectories(path);
  103. // 反斜杠 ExtractFileName 函数搞不定,这里先转换
  104. s := StringReplace(Value, '/', '\', [rfReplaceAll, rfIgnoreCase]);
  105. FFileName := ExtractFileName(s);
  106. FLocalFile := path + FFileName;
  107. TFileDownLoadForm(FOwner).RefreshDisplay(FFileName);
  108. Resume; // 在这里唤醒
  109. end;
  110. end.