На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Скачиваем файлы из интернета
    Есть код для скачивания через поток:

    ExpandedWrap disabled
      unit Unit1;
        
      interface
        
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
        IdTCPClient, IdHTTP, XPMan;
      const
      MY_MESS = WM_USER + 100;
      type
        TForm1 = class(TForm)
          ProgressBar1: TProgressBar;
          Edit1: TEdit;
          Edit2: TEdit;
          Label1: TLabel;
          Label2: TLabel;
          Button1: TButton;
          SaveDialog1: TSaveDialog;
          Button2: TButton;
          IdHTTP1: TIdHTTP;
          XPManifest1: TXPManifest;
          procedure Button1Click(Sender: TObject);
          procedure Button2Click(Sender: TObject);
        private
          { Private declarations }
        public
          { Public declarations }
          procedure thrTerminate(Sender:TObject);
          procedure MyProgress(var msg:TMessage);message MY_MESS;
        end;
        
      var
        Form1: TForm1;
        
      implementation
        
      {$R *.dfm}
      type
        TDownLoader = class(TThread)
        private
          FToFolder: string;
          FURL: string;
          protected
            procedure Execute;override;
          public
            property URL:string read FURL write FURL;
            property ToFolder:string read FToFolder write FToFolder;
            procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
            AWorkCount: Int64);
            procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
            AWorkCountMax: Int64);
          procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
        end;
      procedure TForm1.Button1Click(Sender: TObject);
      begin
        SaveDialog1.FileName:=copy(Edit1.Text,LastDelimiter('\/',Edit1.Text)+1,maxint);
        if SaveDialog1.Execute then
           Edit2.Text:=SaveDialog1.FileName;
      end;
        
      { TDownLoader }
        
      procedure TDownLoader.Execute;
        var http:TIdHTTP;
            str:TFileStream;
      begin
        //Создим класс для закачки
        http:=TIdHTTP.Create(nil);
        http.OnWork:=IdHTTP1Work;
        http.OnWorkBegin:=IdHTTP1WorkBegin;
        http.OnWorkEnd:=IdHTTP1WorkEnd;
        //каталог, куда файл положить
        ForceDirectories(ExtractFileDir(ToFolder));
        //Поток для сохранения
        str:=TFileStream.Create(ToFolder, fmCreate);
        try
          //Качаем
          http.Get(url,str);
        finally
          //Нас учили чистить за собой
          http.Free;
          str.Free;
        end;
      end;
        
      procedure TForm1.Button2Click(Sender: TObject);
         var d:TDownLoader;
      begin
        //Создадим класс потока.
        //Поток для начала будет остановлен
        d:=TDownLoader.Create(true);
        //Передадим параметры потоку
        d.URL:=Edit1.Text;
        d.ToFolder:=Edit2.Text;
        //Поток должен удалить себя по завершению своей работы
        d.FreeOnTerminate:=true;
        d.OnTerminate:=thrTerminate;
        //И запустим его на закачку.
        d.Resume;
        //Теперь с процедуры мы выйдем, но поток работает
        //и живёт своей жизней
      end;
        
      procedure TForm1.MyProgress(var msg: TMessage);
      begin
        case msg.WParam of
        0:begin ProgressBar1.Max:=msg.LParam;ProgressBar1.Position:=0; end;
        1:ProgressBar1.Position:=msg.LParam;
        end;
      end;
        
      procedure TForm1.thrTerminate(Sender: TObject);
      begin
        ShowMessage('Готово');
      end;
        
      procedure TDownLoader.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
        AWorkCount: Int64);
      begin
        PostMessage(Application.MainForm.Handle,MY_MESS,1,AWorkCount);
      end;
        
      procedure TDownLoader.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
        AWorkCountMax: Int64);
      begin
        PostMessage(Application.MainForm.Handle,MY_MESS,0,AWorkCountMax);
      end;
        
      procedure TDownLoader.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
      begin
      //
      end;
        
      end.


    ...но у меня он не робит - прогресс показывает скачивание, только никакого скачанного файла нету после завершения. В чём может быть проблема?

    Ps: Delphi XE 8 sp1

    Весь проект этого кода:
    Прикреплённый файлПрикреплённый файл____________________.zip (8,48 Кбайт, скачиваний: 422)
      Может надо как-то официально сказать, чтобы закрыть поток (записать файл), а не просто оборвать - str.Free ? :unsure:
        тоже думаю...
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0313 ]   [ 18 queries used ]   [ Generated: 28.03.24, 17:55 GMT ]