Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Индикатор (Загрузки) перекачки. есть такой объект? 
:(
    Опции темы
Ner-zul
  Дата 14.8.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



Я написал клиентское приложение, которое закачивает определенные файлы из сети клиенту на компьютер. И так вот, когда закачиваются маленькие файлы все хорошо, так как они быстренько закачиваются и пользователь видит, что они появляются на его компе в спец окошке которое я тоже сделал, чтобы пользователь мог следить за процессом копирования. Иначе дело обстоит когда файл большой. Программа как будто подвисает и блокирует все приложения(тем самым жутко пугая пользователя), а на самом деле она в фоне качает здоровенный файл. И так вот чтобы пользоваетль мог понять в чем дело и не скучал , хотелось бы выводить перед ним какой-нибудь индикатор закачки(загрузки) файла. Я знаю о существовании объекта ProgressBar. Но вот что и как использовать в данном случае я не знаю....
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
z-END
Дата 14.8.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



Цитата(Ner-zul @  14.8.2006,  18:17 Найти цитируемый пост)
 объекта ProgressBar

его родимого и юзай=)
ProgressBar.Max - размер файла в байтах
при получении файла  ProgressBar.Position:=ProgressBar.Position+ByteRecieved; и Update; или Application.ProcessMessages;



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Snowy
Дата 14.8.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Как качаешь?
Если через Indy - брось на форму антифриз.
Если нет, вынеси закачку в отдельный поток.
PM MAIL   Вверх
Ner-zul
Дата 15.8.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



to z-END:

А можешь просто кусок кода (пример) выложить, а то у меня что-то не очень выходит...


to Snowy:

Я использую функцию  'CopyFile(Sourc,Dest,False)'.

А что такое 

1)Indy ??? 
2)Антифриз???

И как
3) Вынести закачку в отдельный поток???
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
dvamaster
Дата 15.8.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 3
Всего: 10



Indy - компоненты доступа к сети, 'CopyFileEx юзай

Добавлено @ 11:51 
CopyFileEx - там можно указать back-функцию с прогрессом


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Snowy
Дата 15.8.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Значит Indy тебе не нужно.
Что касается потока - поищи примеры на форуме по слову TThread.
Также стоит вообще познакомиться с теорией многопоточности.
PM MAIL   Вверх
z-END
Дата 15.8.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



Цитата(Ner-zul @  15.8.2006,  12:32 Найти цитируемый пост)
А можешь просто кусок кода (пример) выложить, а то у меня что-то не очень выходит...

покажи свой код, кде и что невыходит..


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Snowy
Дата 15.8.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



PM MAIL   Вверх
Ner-zul
  Дата 15.8.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



У меня чето нет такой функции "CopyFileEx".... даже в хелпе.


 
Код

// вот тут устанавливаю откуд куда копировать
StrPCopy(sourc,FString);        
  StrPCopy(Dest,LocalName);
 
{ ResultW.ProgressBar1.Max:=fsize;
   ResultW.ProgressBar1.Position:=ProgressBar.Position+ByteRecieved;
   Update;}// Я все правильно написал?
  
 
 if not CopyFile(Sourc,Dest,False) then  // Вот тут я копирую
  begin
...   
  end
  else
...  


И у меня вопрос как вставить апдейт прогресс бара именно в процесс копирования одного файла???
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 15.8.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



CopyFileEx - описание в Help -> Windows SDK
Но работает только в WinNT (в 9х не работает).
Впрочем и незачем.
TFileStream отлично для этого подходит.
И даже поток отдельный создавать не нужно - только давать в промежутке между блоками Application.ProcessMessages.
Хотя по честному лучше с потоками, но не обязательно.
PM MAIL   Вверх
dvamaster
Дата 15.8.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 3
Всего: 10



Код

function CopyFileEx(lpExistingFileName: PChar;
  lpNewFileName: PChar;
  lpProgressRoutine: Pointer;
  lpData: Pointer;
  var pbCancel: Boolean;
  dwCopyFlags: DWORD): Boolean;

Заголовок Back-функции

Код

function CopyProgressRoutine(
  TotalFileSize: LARGE_INTEGER;
  TotalBytesTransferred: LARGE_INTEGER;
  StreamSize: LARGE_INTEGER;
  StreamBytesTransferred: LARGE_INTEGER;
  dwStreamNumber: DWORD;
  dwCallbackReason: DWORD;
  hSourceFile: THANDLE;
  hDestinationFile: THANDLE;
  lpData: Pointer
): DWORD;


Код

if not CopyFileEx(Sourc,Dest, @MyCopyProgressRoutine, nil, ifcancel {если была отмена}, 0) then


Это сообщение отредактировал(а) dvamaster - 15.8.2006, 12:12


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Ner-zul
Дата 15.8.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



to Snowy

мне оч слложно понять что вы имеете ввиду
" TFileStream отлично для этого подходит.
И даже поток отдельный создавать не нужно - только давать в промежутке между блоками Application.ProcessMessages. "

Как использовать TFileStream??? 
 smile  smile  smile 

Дальше , между какими блоками Application.ProcessMessages его давать???? Простите, но мне совсем не понятно!

Добавлено @ 12:28 
to dvamaster

if not CopyFileEx(Sourc,Dest, @MyCopyProgressRoutine, nil, ifcancel {если была отмена}, 0) then

Вы не моглибы прокомментировать третий и пятый параметры???? Я совсем не понял что на их месте надо писать в моем случае....




--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 15.8.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Твоё приложение использует Forms? Или чистый WinAPI?
PM MAIL   Вверх
Ner-zul
Дата 15.8.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



мммм ну у меня там разные формы... ну объекты класса TForm
Аж 8 штук)
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 15.8.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вот, нарисовал пример копирования одного файла.
Код

// на входе путь к искодному файлу и к копии
// на выходе - удалось скопировать или нет
function CopyFile(src, dest: string): boolean;
const BlockSize = $F000; // размер блока - больший размер - быстрее, но форма тормозит
var
  ss, ds: TFileStream;
  buf: string;
  N:   int64;
begin
  try
    SetLength(buf, BlockSize);
    ss := TFileStream.Create(src, fmOpenRead or fmShareDenyNone);
    try
      ds := TFileStream.Create(dest, fmCreate or fmShareDenyNone);
      Form1.ProgressBar1.Max := ss.Size div BlockSize;
      try
        repeat
          N := ss.Size - ss.Position; if N > BlockSize then N := BlockSize;
          ss.ReadBuffer(buf[1], N); ds.WriteBuffer(buf[1], N);
          Form1.ProgressBar1.Position := Form1.ProgressBar1.Position + 1;
          Application.ProcessMessages;
        until ss.Position >= ss.Size;
        result := true;
      finally
        ds.Free;
      end;
    finally
      ss.Free;
    end;
  except result := false; end;
end;

// пример
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Enabled := false; // гасим кнопку, чтобы не нажали второй раз во время копирования
  CopyFile('D:\1.avi', 'C:\1.avi'); // запускаем копирование
  Button1.Enabled := true; // включаем кнопку обратно
end;
Сделай два PrograssBar'a - в одном общий индикатор, во втором текущего файла.
В примере Form1.ProgressBar1 - индикатор файла.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1168 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.