C++Builder - управление свойствами Label |
Здравствуйте, гость ( Вход | Регистрация )
C++Builder - управление свойствами Label |
4.02.2009 - 12:44
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
Никак не могу решить проблему.
Есть приложение, написанное на C++Builder. При нажатии на кнопку этого приложения запускается процесс копирования файлов из одной директории в другую. Одновременно делается видимым ПрогрессБар, показывающий ход процесса. Он завершается - ПрогрессБар становится невидимым. Поставил рядом с ПрогрессБаром Label с текстом "Идет копирование" и свойством Visible=false. Сделал так, чтобы текст становился видимым в начале процесса и невидимым после завершения. Приложение работает, ПрогрессБар показывает ход процесса, а вот текст ни в какую не хочет показываться. Вот фрагмент кода: Label1 -> Visible = true; ProgressBar1 -> Visible = true; Здесь происходит копирование... ProgressBar1 -> Visible = false; Label1 -> Visible = false; Как заставить программу показывать текст? |
|
|
4.02.2009 - 14:14
Вставить ник | Быстрая цитата | Сообщение
#2
|
|
Это вам не это... Группа: Участник Сообщений: 3987 Регистрация: 17.03.2004 Пользователь №: 2796 |
|
|
|
4.02.2009 - 15:38
Вставить ник | Быстрая цитата | Сообщение
#3
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
|
|
|
4.02.2009 - 16:28
Вставить ник | Быстрая цитата | Сообщение
#4
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
Очевидно, в приведенных четырех строках ошибки нет. Нельзя ли более подробный код показать? Особенно ту часть, где описан процесс, ход которого отражается прогресс-баром.
Я не очень помню, как работает прогресс-бар, но как вариант можно попробовать воткнуть примерно там же, где делается степ прогресс-бара, Application->ProcessMessages(); Это должно сработать, если действительно форма подвисает, как сказал Holsten. Сообщение отредактировано Graker - 4.02.2009 - 16:31 |
|
|
4.02.2009 - 23:28
Вставить ник | Быстрая цитата | Сообщение
#5
|
|
Постоялец форума Группа: Участник Сообщений: 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 |
|
|
5.02.2009 - 01:31
Вставить ник | Быстрая цитата | Сообщение
#6
|
|
Это вам не это... Группа: Участник Сообщений: 3987 Регистрация: 17.03.2004 Пользователь №: 2796 |
|
|
|
5.02.2009 - 07:39
Вставить ник | Быстрая цитата | Сообщение
#7
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
Ага. А ProcessMessages() все-таки надо вставить.
Кстати, ProgressBar1 -> Position = 100 * d / FileListBox2 -> Count; - неэффективно. У прогресс-бара есть свойство Step и метод, совершающий шаг - не помню точно название, в описании есть. Использование избавляет от необходимости каждый раз пересчитывать позицию вручную. |
|
|
5.02.2009 - 12:37
Вставить ник | Быстрая цитата | Сообщение
#8
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
Подозрительно: Это опечатка. Правильно Label19 -> Visible = false; Ага. А 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; стоит какой-то цикл, связанный с копированием или записью. |
|
|
5.02.2009 - 14:31
Вставить ник | Быстрая цитата | Сообщение
#9
|
|
Это вам не это... Группа: Участник Сообщений: 3987 Регистрация: 17.03.2004 Пользователь №: 2796 |
работают где угодно, кроме ситуации А как насчёт предложения Graker:Label -> Visible = true; процесс копирования или записи в файлы Label -> Visible = false; Код Label -> Visible = true;
Application->ProcessMessages(); ... Сообщение отредактировано Holsten - 5.02.2009 - 14:58 |
|
|
5.02.2009 - 15:17
Вставить ник | Быстрая цитата | Сообщение
#10
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
|
|
|
5.02.2009 - 15:43
Вставить ник | Быстрая цитата | Сообщение
#11
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
Graker, Holsten - большое спасибо! Теперь все работает. Вот и отлично Вообще говоря, так нужно делать всегда, если в приложении есть какой-то длительный процесс, запускаемый не в отдельном треде, иначе форма подвиснет и будет висеть до окончания процесса, т.е. до того момента, пока обработчик сообщений не сможет обработать все, что поставлено ему в очередь. |
|
|
8.02.2009 - 21:15
Вставить ник | Быстрая цитата | Сообщение
#12
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
А есть ли в C++Builder какая-нибудь функция, которая сразу позволяет копировать все содержимое одной директории в другую?
|
|
|
10.02.2009 - 22:43
Вставить ник | Быстрая цитата | Сообщение
#13
|
|
Bill rulz ^^ Группа: Участник Сообщений: 1418 Регистрация: 28.09.2003 Пользователь №: 24 |
А есть ли в C++Builder какая-нибудь функция, которая сразу позволяет копировать все содержимое одной директории в другую? ]]>http://www.google.ru/search?hl=ru&neww...mp;aq=f&oq=]]> |
|
|
Текстовая версия | Сейчас: 20.04.2024 - 02:48 |