Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> C++Builder - управление свойствами Label
avtor
сообщение 4.02.2009 - 12:44

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Никак не могу решить проблему.
Есть приложение, написанное на C++Builder. При нажатии на кнопку этого приложения запускается процесс копирования файлов из одной директории в другую. Одновременно делается видимым ПрогрессБар, показывающий ход процесса. Он завершается - ПрогрессБар становится невидимым. Поставил рядом с ПрогрессБаром Label с текстом "Идет копирование" и свойством Visible=false. Сделал так, чтобы текст становился видимым в начале процесса и невидимым после завершения. Приложение работает, ПрогрессБар показывает ход процесса, а вот текст ни в какую не хочет показываться.
Вот фрагмент кода:
Label1 -> Visible = true;
ProgressBar1 -> Visible = true;
Здесь происходит копирование...
ProgressBar1 -> Visible = false;
Label1 -> Visible = false;
Как заставить программу показывать текст?
Перейти в начало страницы
 
+Цитировать сообщение
Holsten
сообщение 4.02.2009 - 14:14

Это вам не это...
*******
орден V степениорден I степени19 лет с форумом
Группа: Участник
Сообщений: 3987
Регистрация: 17.03.2004
Пользователь №: 2796


Цитата(avtor @ 4.02.2009 - 12:44) *
Поставил рядом с ПрогрессБаром Label с текстом "Идет копирование" и свойством Visible=false.
А если изначально отобразить Label и посмотреть куда убегает текст?


Или может форма подвисает. Процесс копирования в отдельном потоке идёт?
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 4.02.2009 - 15:38

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Цитата(Holsten @ 4.02.2009 - 14:14) *
А если изначально отобразить Label и посмотреть куда убегает текст?
Или может форма подвисает. Процесс копирования в отдельном потоке идёт?

Пробовал. Текст никуда не убегает - стоит на месте.
Все процессы идут последовательно один за другим.
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 4.02.2009 - 16:28

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Очевидно, в приведенных четырех строках ошибки нет. Нельзя ли более подробный код показать? Особенно ту часть, где описан процесс, ход которого отражается прогресс-баром.

Я не очень помню, как работает прогресс-бар, но как вариант можно попробовать воткнуть примерно там же, где делается степ прогресс-бара, Application->ProcessMessages();

Это должно сработать, если действительно форма подвисает, как сказал Holsten.

Сообщение отредактировано Graker - 4.02.2009 - 16:31
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 4.02.2009 - 23:28

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


void __fastcall TForm1::Button3Click(TObject *Sender)
{
Label12 -> Visible = false;
Label13 -> Visible = false;
RadioGroup1 -> Visible = false;
Button3 -> Visible = false;

if (RadioGroup1 -> ItemIndex == 1)
{
AnsiString onesour = puti + "\\FILE\\d_file\\cont.pl";
AnsiString twosour = puti + "\\FILE\\d_file\\otpr.pl";
CopyFile (onesour.c_str(), "C:\\localhost\\htdocs\\cont.pl", false);
CopyFile (twosour.c_str(), "C:\\localhost\\htdocs\\otpr.pl", false);
}

Label19 -> Visible = true; (эта надпись должна появляться, но она не выводится)
ProgressBar1 -> Visible = true;
DirectoryListBox2 -> Directory = "C:\\localhost\\htdocs\\";
int d = 0;
for (d = 0; d < FileListBox2 -> Count; d++)
{
AnsiString itogo = "";
AnsiString df = "C:\\localhost\\htdocs\\" + FileListBox2 -> Items -> Strings[d];
TStringList *strk1 = new TStringList;
TStringList *strkO = new TStringList;
strkO -> Insert (0, itogo);
strk1 -> LoadFromFile (df);
strk1 -> Strings[0] = "#!C:/Perl/bin/perl";
int z = 0;
for (z = 0; z < strk1 -> Count; z++)
{
itogo = itogo + strk1 -> Strings[z] + "\n";
}
strkO -> Strings[0] = itogo;
strkO -> SaveToFile(df);
ProgressBar1 -> Position = 100 * d / FileListBox2 -> Count;
}
Label3 -> Visible = true;

AnsiString oneso = puti + "\\FILE\\ntpr.pl";
CopyFile (oneso.c_str(), "C:\\localhost\\htdocs\\ntpr.pl", false);
ProgressBar1 -> Visible = false;
Label19 -> Visible = false; (здесь надпись должна выключаться)
Label4 -> Visible = true;
Label14 -> Visible = true;
Label15 -> Visible = true;
Label16 -> Visible = true;
Button4 -> Visible = true;
Button2 -> Visible = true;
}

Сообщение отредактировано avtor - 5.02.2009 - 12:37
Перейти в начало страницы
 
+Цитировать сообщение
Holsten
сообщение 5.02.2009 - 01:31

Это вам не это...
*******
орден V степениорден I степени19 лет с форумом
Группа: Участник
Сообщений: 3987
Регистрация: 17.03.2004
Пользователь №: 2796


Подозрительно:
Цитата(avtor @ 4.02.2009 - 23:28) *
Label19 -> Visible = true; (эта надпись должна появляться, но она не выводится)
...
Label14 -> Visible = false; (здесь надпись должна выключаться)
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 5.02.2009 - 07:39

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Ага. А ProcessMessages() все-таки надо вставить.

Кстати, ProgressBar1 -> Position = 100 * d / FileListBox2 -> Count; - неэффективно. У прогресс-бара есть свойство Step и метод, совершающий шаг - не помню точно название, в описании есть. Использование избавляет от необходимости каждый раз пересчитывать позицию вручную.
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 5.02.2009 - 12:37

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Цитата(Holsten @ 5.02.2009 - 01:31) *
Подозрительно:

Это опечатка. Правильно Label19 -> Visible = false;

Цитата(Graker @ 5.02.2009 - 07:39) *
Ага. А ProcessMessages() все-таки надо вставить.
Кстати, ProgressBar1 -> Position = 100 * d / FileListBox2 -> Count; - неэффективно. У прогресс-бара есть свойство Step и метод, совершающий шаг - не помню точно название, в описании есть. Использование избавляет от необходимости каждый раз пересчитывать позицию вручную.

Задача-то совершенно другая: заставить текст в Label19 становится видимым во время работы ПрогрессБара.

Конструкции
Label -> Visible = true;
Label -> Visible = false;
работают где угодно, кроме ситуации
Label -> Visible = true;
процесс копирования или записи в файлы
Label -> Visible = false;

У меня несколько разных приложений, связанных с копированием группы файлов или записью в группы файлов. И ни в одном из них текст в Label не выводится, если сразу за Label -> Visible = true; стоит какой-то цикл, связанный с копированием или записью.
Перейти в начало страницы
 
+Цитировать сообщение
Holsten
сообщение 5.02.2009 - 14:31

Это вам не это...
*******
орден V степениорден I степени19 лет с форумом
Группа: Участник
Сообщений: 3987
Регистрация: 17.03.2004
Пользователь №: 2796


Цитата(avtor @ 5.02.2009 - 12:37) *
работают где угодно, кроме ситуации
Label -> Visible = true;
процесс копирования или записи в файлы
Label -> Visible = false;
А как насчёт предложения Graker:
Код
Label -> Visible = true;
Application->ProcessMessages();
...


Сообщение отредактировано Holsten - 5.02.2009 - 14:58
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 5.02.2009 - 15:17

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Цитата(Graker @ 5.02.2009 - 07:39) *
Ага. А ProcessMessages() все-таки надо вставить.


Цитата(Holsten @ 5.02.2009 - 14:31) *
А как насчёт предложения Graker

Graker, Holsten - большое спасибо!
Теперь все работает.
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 5.02.2009 - 15:43

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Цитата(avtor @ 5.02.2009 - 15:17) *
Graker, Holsten - большое спасибо!
Теперь все работает.

Вот и отлично smile.gif

Вообще говоря, так нужно делать всегда, если в приложении есть какой-то длительный процесс, запускаемый не в отдельном треде, иначе форма подвиснет и будет висеть до окончания процесса, т.е. до того момента, пока обработчик сообщений не сможет обработать все, что поставлено ему в очередь.
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 8.02.2009 - 21:15

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


А есть ли в C++Builder какая-нибудь функция, которая сразу позволяет копировать все содержимое одной директории в другую?
Перейти в начало страницы
 
+Цитировать сообщение
SHADE
сообщение 10.02.2009 - 22:43

Bill rulz ^^
******
орден IV степени
Группа: Участник
Сообщений: 1418
Регистрация: 28.09.2003
Пользователь №: 24


Цитата(avtor @ 8.02.2009 - 21:15) *
А есть ли в C++Builder какая-нибудь функция, которая сразу позволяет копировать все содержимое одной директории в другую?

]]>http://www.google.ru/search?hl=ru&neww...mp;aq=f&oq=]]>
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 20.04.2024 - 02:48