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