Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.012 c
2-1140856245
TAK
2006-02-25 11:30
2006.03.12
TPen


15-1139927103
oldman
2006-02-14 17:25
2006.03.12
Напишет же "Версия" такое...


15-1139894641
Лисенок
2006-02-14 08:24
2006.03.12
без темы


2-1140807872
Fl@sh
2006-02-24 22:04
2006.03.12
FireBird!!!!!


4-1135080255
Edit
2005-12-20 15:04
2006.03.12
Прозрачный TEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский