![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отображать ход копирования в progressbar [D7]
mozgan © (2006-02-21 17:55:00)Добрый вечер!
Как можно заставить progressbar1 отображать
текущую позицию копирования. Т.е. как в программе установки.
Zeqfreed (2006-02-21 21:49:00) [1]В коде, приведенном в [20] есть единственный цикл:
for I := 0 to ListBox1.Items.Count-1 do
begin
label7.Caption := 'Скопировано ' + FloatToStr(i / ListBox1.Items.Count-1+ '%';
progressbar1.position := i;
OldFileName := ListBox1.Items[I];
NewFileName := Edit1.Text + PathDelim + ExtractFileName(OldFileName);
if not CopyFile(PChar(OldFileName),PChar(NewFileName),False) then
RaiseLastOSError;
Statusbar1.Panels[2].Text:='Состояние: Ошибка копирования';
end.
Конец этого цикла находится перед операторной скобкой end. Перед ней и нужно вставить Application.ProcessMessages. Примерно вот так:
for I := 0 to ListBox1.Items.Count-1 do
begin
label7.Caption := 'Скопировано ' + FloatToStr(i / ListBox1.Items.Count-1+ '%';
progressbar1.position := i;
OldFileName := ListBox1.Items[I];
NewFileName := Edit1.Text + PathDelim + ExtractFileName(OldFileName);
if not CopyFile(PChar(OldFileName),PChar(NewFileName),False) then
RaiseLastOSError;
Statusbar1.Panels[2].Text:='Состояние: Ошибка копирования';
Application.ProcessMessages();
end.
Не нужно искать сложности там где их нет :)
mozgan (2006-02-21 21:41:00) [2]А по конкретней можно?
Zeqfreed (2006-02-21 21:34:00) [3]Application.ProcessMessages в конце цикла добавь. Справку по методу почитай.
mozgan (2006-02-21 21:30:00) [4]У меня все так:
Edit1.Text:='C:\';
var
i: integer;
OldFileName,NewFileName: string;
progressbar1.Min := 0;
progressbar1.Max := ListBox1.Items.Count-1;
for I := 0 to ListBox1.Items.Count-1 do
begin
label7.Caption := 'Скопировано ' + FloatToStr(i / ListBox1.Items.Count-1+ '%';
progressbar1.position := i;
OldFileName := ListBox1.Items[I];
NewFileName := Edit1.Text + PathDelim + ExtractFileName(OldFileName);
if not CopyFile(PChar(OldFileName),PChar(NewFileName),False) then
RaiseLastOSError;
Statusbar1.Panels[2].Text:='Состояние: Ошибка копирования';
end.
Сейчас все заработало. Только не пойму где записать, чтобы процент показывал именно текущий скопированный файл, а не все сразу. В конце.
Т.е. я хочу сделать процесс точь в точь, как в программе установки.
Файл-процент. файл-процент и т.д.
mozgan (2006-02-21 21:29:00) [5]У меня все так:
Edit1.Text:='C:\';
var
i: integer;
OldFileName,NewFileName: string;
progressbar1.Min := 0;
progressbar1.Max := ListBox1.Items.Count-1;
for I := 0 to ListBox1.Items.Count-1 do
begin
label7.Caption := 'Скопировано ' + FloatToStr(i / ListBox1.Items.Count-1+ '%';
progressbar1.position := i;
OldFileName := ListBox1.Items[I];
NewFileName := Edit1.Text + PathDelim + ExtractFileName(OldFileName);
if not CopyFile(PChar(OldFileName),PChar(NewFileName),False) then
RaiseLastOSError;
Statusbar1.Panels[2].Text:='Состояние: Ошибка копирования';
end.
Сейчас все заработало. Только не пойму где записать, чтобы процент показывал именно текущий скопированный файл, а не все сразу. В конце.
Т.е. я хочу сделать процесс точь в точь, как в программе установки.
Файл-процент. файл-процент и т.д.
Zeqfreed (2006-02-21 21:25:00) [6]Автор усердно скрывает код копирования. Секретный код, основанный на вызове CopyFile.
Virgo_Style (2006-02-21 21:20:00) [7]во-первых, полностью выполненная работа - это 100%, а не один, как у тебя;
во-вторых, порядок выполнения арифметических действий никто не отменял;
в-третьих... все равно непонятно, как могло получиться 0.25 ... отлаживать придется, я так мыслю...
Zeqfreed (2006-02-21 21:19:00) [8]А где, собственно, процесс копирования?
i / ListBox1.Items.Count-1 по-моему ещё на 100 надо домножить.
mozgan (2006-02-21 21:09:00) [9]Чета все куда-то подевались :((((
mozgan (2006-02-21 20:46:00) [10]Вечер добрый мастера!
И все же ребят, у меня так и не получилось отобразить текущее значение
прогрессбара в процентрах. Скопировал 5-6 файлов. progressbar работает нормально, а вот с процентами вопрос. По окончании копирования показывает 0,25.
Убрал много лишнего - результат все тот же.
Откуда?
вот весь переделанный код
var
i: integer;
OldFileName,NewFileName: string;
progressbar1.Min := 0;
progressbar1.Max := ListBox1.Items.Count-1;
for I := 0 to ListBox1.Items.Count-1 do
begin
label7.Caption := 'Скопировано ' + FloatToStr(i / ListBox1.Items.Count-1) + '%';
progressbar1.position := i;
OldFileName := ListBox1.Items[I];
NewFileName := Edit1.Text + PathDelim + ExtractFileName(OldFileName);
end.
Zeqfreed (2006-02-21 18:46:00) [11]Насколько я понимаю, копирование происходит в основном потоке и тогда, разумеется, будут возникать «тормоза». Тут, как мне кажется, есть только один приемлимый вариант — вынесение копирования в другой поток. Так же, при использовании CopyFile прогресс будет обновляться только при завершении копирования очередного файла, используя CopyFileEx можно осуществлять обновление при копировании очередной порции данных и процесс копирования будет выглядеть несколько «живее».
mozgan (2006-02-21 18:45:00) [12]Все ребят, спасибо за помощь!
Просто не представляете себе, как помогли мне. Я вчерась весь вечер ломал голову. Ещё раз спсибо! Пока все!
mozgan (2006-02-21 18:35:00) [13]Всё в норме, друг!
Это просто чета в компе шарится :(
Тяк... ты кажется про копирование спрашивал... вот...
У меня "два варианта в одном". пытаюсь выявить, что быстрее копирует.
Второй вариант у меня такой вот квсок используется.
if Win32Check(windows.CopyFile(Pchar(Listbox1.items.Text),Pchar(edit1.Text),true)) then
Showmessage('OK')else
Showmessage('Error').
Alkid (2006-02-21 18:31:00) [14]Во-первых советую обложить операторы после then
begin`ом и end`ом.
Во-вторых - как тормозит-то?
Zeqfreed (2006-02-21 18:29:00) [15]Можно ещё, наверное, взглянуть на CopyFileEx.
mozgan (2006-02-21 18:28:00) [16]Вот смотри. Это один из кусков. Дельфя чёта тормозит немного.
if not CopyFile(PChar(OldFileName),PChar(NewFileName),False) then
RaiseLastOSError;
Statusbar1.Panels[2].Text:='Состояние: Ошибка копирования';
mozgan (2006-02-21 18:24:00) [17]Ну!!!! Это настоящие МАСТЕРА!
С Больщой Буквы. Серьезно! Насковозь меня видят. Молодцы!
Alkid (2006-02-21 18:23:00) [18]
> Как с процентами быть? Просто наращивая на единицу текущую
> позицию прогресса? Я правильно размышляю?
Сам прогрессбар себя отрисует корректно при условии, что у тебя
свойство Position будет больше либо равно Min и меньше либо равно
Max. Что же до процентов, то их надо выводить в отдельный label.
Шлёпаешь на форму label и в цикле пишешь
label1.Caption := 'Скопировано ' + FloatToStr(i / ListBox1.Items.Count-1) + '%';
Тогда у тебя на форме будет ещё и счётчик процентов в читабельном виде.
Тебе это надо или я не понял вопроса?
Кстати, не сколько не понял про Edit и Pchar. Что ты куда загоняешь и как это
потом используешь?
Ega23 (2006-02-21 18:18:00) [19]
> Правда где ты собственно копируешь файлы я не понял.
А копирует, скорее всего, в этом же потоке.
Посему - Application.ProcessMessages - не помешает... :о)
mozgan (2006-02-21 18:18:00) [20]Друг СПАСИБО за подсказку!
О... извини я забыл про это сказать. Извиняюсь :)
Я в edit загоняю, естественно, типизирую под PCHAR строку с путем и именем. И все. Работает нормально.
Вот тока ещё один - последний вопрос.
Как с процентами быть? Просто наращивая на единицу текущую позицию прогресса? Я правильно размышляю?