TIdTCPServer и ProgressBar

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

20 фев 2016, 18:29

Пытаюсь подключить ProgressBar к TIdTCPServer

Код: Выделить всё

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 не равен нулю.
Сделал так

Код: Выделить всё

ProgressBar1.Max := AContext.Connection.IOHandler.ReadLongInt;
И получил проблемы:
1. ProgressBar доходит только до 1/3
2. Файл скачивается не полностью
Отправляемый файл: 344 МБ (361*402*544 байт)
Полученный файл: 344 МБ (361*402*540 байт)
4 байта тю-тю
Ответить