Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Отображать ход копирования в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.033 c
15-1140431069
Ega23
2006-02-20 13:24
2006.03.12
Чукча - чум


4-1135073467
davinchi
2005-12-20 13:11
2006.03.12
Как дождаться окончания загрузки Win98


10-1115197863
Phenix2005
2005-05-04 13:11
2006.03.12
Встраивание Excel в форму приложения


4-1135254028
ArtemESC
2005-12-22 15:20
2006.03.12
Как выйти в меню выбора пользователя?


2-1141044851
dera
2006-02-27 15:54
2006.03.12
как сделать исключение для SQL-запроса?