Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: TIdTCPServer и ProgressBar  (Прочитано 19044 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Shouldercannon
Помогающий

ru
Offline Offline

« : 20-02-2016 15:40 » 

Пытаюсь подключить ProgressBar к TIdTCPServer
Код: (Delphi)
unit Unit1;
...
const
  Host = '192.168.0.10';
  Port = 1120;
  MY_MESS = WM_USER + 105;

type
  TForm1 = class(TForm)
...
  private
    { Private declarations }
    procedure MyProgress(var Msg: TMessage); message MY_MESS;
    procedure Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  FS: TFileStream;
  FPath, FName: String;
begin
  FPath := ExtractFilePath(Application.ExeName) + 'Downloads';
  FName := AContext.Connection.IOHandler.ReadLn;

  if not DirectoryExists(FPath) then ForceDirectories(FPath);

  FS := TFileStream.Create(FPath + '\' + ExtractFileName(FName), fmCreate); // Сохранение
  try
    {ProgressBar1.Max := AContext.Connection.IOHandler.ReadLongInt; //!// Не скачивается 4 байта
    ProgressBar1.Position := 0;}


    AContext.Connection.OnWork := Work;
    AContext.Connection.OnWorkBegin := WorkBegin;
    AContext.Connection.IOHandler.ReadStream(FS, -1, True); // Поток передаваемый клиентом
  finally
    FreeAndNil(FS);;
  end;

  AContext.Connection.Disconnect;

  Label1.Caption := 'Файл принят';
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.Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  PostMessage(Self.Handle, MY_MESS, 1, AWorkCount);
end;

procedure TForm1.WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  PostMessage(Self.Handle, MY_MESS, 0, AWorkCountMax);
end;

end.
AWorkCountMax равен нулю, зато AWorkCount не равен нулю.
Сделал так
Код: (Delphi)
ProgressBar1.Max := AContext.Connection.IOHandler.ReadLongInt;
И получил проблемы:
1. ProgressBar доходит только до 1/3
2. Файл скачивается не полностью
Отправляемый файл: 344 МБ (361*402*544 байт)
Полученный файл: 344 МБ (361*402*540 байт)
4 байта тю-тю
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 21-02-2016 05:59 » 

прогресс бар тут явно ни при чём, его пока можешь отключить, чтобы отладке не мешал

попытайся отправить файл длиной в 44 байта, проще в отладке смотреть, что где теряется
Записан

Shouldercannon
Помогающий

ru
Offline Offline

« Ответ #2 : 22-02-2016 09:01 » 

Имя и размер файла надо отдельно передавать Улыбаюсь
« Последнее редактирование: 22-02-2016 12:44 от Shouldercannon » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines