Главная » C++, C++ Builder » Создание полоски прогресса C++ Builder

0

Когда пользователь нажимает на первую кнопку (названную Создать новую полосу прогресса), нам хотелось бы создать динамически полосу прогресса на панели состояния. Создайте новый обработчик для нажатия на первую кнопку и добавьте в него следующий код:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

FpProgress = new TProgressBar(StatusBar1); FpProgress->Parent = StatusBar1; FpProgress->Top = 4;

FpProgress->Height = STatusBar1->Height — 6; FpProgress->Left = 2;

FpProgress->Width = 200; FpProgress->Enabled = true;

// Устанавливаем диапазон полоски прогресса

FpProgress->Min = 0;

FpProgress->Max = 100;

FpProgress->Step = 1;

// и делаем доступными две других кнопки

Button1->Enabled = false; Button2->Enabled = true; Button3->Enabled = true;

}

Как видите, код очень похож на создание компонента в предыдущем примере. Сначала создается компонент, потом устанавливается свойство Parent (родитель). Здесь мы используем панель состояния (а не форму) качестве родителя полоски прогресса. Запомните, что все позиционные свойства нового компонента устанавливаются относительно родительского компонента, а не компонента, в котором он создан. Хотя форма и отвечает за создание полоски прогресса (потому что создание происходит в обработчике, принадлежащем форме), но теперь за сам управляющий элемент отвечает панель состояния. Возвращаясь к нашей дискуссии о важных классах, массив Components панели состояния теперь будет содержать указатель на компонент — полоску состояния, в то время как массив Components формы содержать его не будет. Он будет содержать указатель на саму панель состояния, также как и на три кнопки на форме.

Мы располагаем полоску прогресса на панели состояния, используя для установки свойств Height (высота) и Top (верх) полоски прогресса координаты панели состояния. Вероятно, вам стоит немного поиграть с этим, чтобы добиться расположения, которое вам больше нравится. Индивидуальные вкусы различаются, и не существует общих рецептов на этот случай.

Как только мы расположили полоску прогресса, мы устанавливаем некоторые его важные свойства. В нашем случае вам нужно установить три важных свойства. Min (минимум) — наименьшее возможное значение счетчика прогресса. Max (максимум), не удивительно, есть наибольшее возможное значение счетчика прогресса. Step (шаг) — это значение, на которое будет увеличиваться счетчик при каждом шаге. Полоска прогресса будет отражать значение от 0 до 100 (процентов), которое занимает счетчик в диапазоне Min-Max.

Позаботившись о полоске  прогресса, мы управляем доступностью кнопок в зависимости от их текущего состояния. Не стоит создавать второй управляющий элемент — полоску прогресса — в том же месте, что и первый, так что делаем кнопку Создать недоступной. Теперь счетчик полоски можно изменять, а саму полоску прогресса удалять, так что мы делаем доступными вторую и третью кнопки.

Увеличение счетчика прогресса

Первым делом мы добавим в код возможность увеличивать счетчик прогресса. Это эмуляция ситуации, когда вы в своей программе увеличиваете его параллельно с основной задачей (сохранение, загрузка файлов). Создайте обработчик для нажатия на кнопку Button2 (Увеличение счетчика прогресса) на форме. Добавьте в обработчик следующий код:

void __fastcall TForm1::Button2Click(TObject *Sender)

{

if ( FpProgress )

FpProgress->StepIt();

}

Этот обработчик проверяет, существует ли компонент — полоска прогресса (проверка разумности действия) и, если он существует, вызывает его метод StepIt.

Метод StepIt увеличит счетчик прогресса на величину, указанную в свойстве Step. Для проверки добавьте этот код, скомпилируйте и запустите приложение. Нажмите на кнопку создания, чтобы создать новую полосу прогресса на панели состояния. Вы увидите этот управляющий элемент в левой части панели состояния. Нажмите несколько раз на кнопку увеличения счетчика, и  вы увидите что-либо, похожее на рис. 4.6.

Рис. 4.6. «Динамические компоненты 2» с увеличенным счетчиком прогресса

Удаление полоски прогресса

Последний шаг — удалить полоску прогресса с панели состояния. Это эмулирует ваши действия, когда основная операция завершена. Заметьте, что как только полоска прогресса удалена, процесс можно повторить целиком по новой.

Добавьте следующий код в обработчик нажатия на третью кнопку (Удалить полосу прогресса): void __fastcall TForm1::Button3Click(TObject *Sender)

{

// Удалить полоску прогресса, если она есть

if ( FpProgress ) delete FpProgress; FpProgress = NULL;

// Сделать соотв. кнопки недоступными

Button2->Enabled = false; Button3->Enabled = false;

// Позволить создавать новую полоску

Button1->Enabled = true;

}

Как видите, удаление управляющего элемента с формы — это просто  удаление  указателя  на объект VCL. Как только мы удалили объект, мы устанавливаем указатель в NULL, чтобы быть уверенными, что про этот указатель будет точно известно, что он пуст. Это хорошая привычка, ее стоит придерживаться в ваших программах на C++. Всегда ставьте указатель в NULL, как только вы закончили с ним работать.

Когда объект удален, мы снова ставим доступной первую кнопку, чтобы можно  было  создать новый объект, и ставим кнопки 2 и 3 недоступными, так как в данный момент объекта — полоски прогресса не существует.

Последний штрих

Есть один последний шаг. Форма будет замечательно работать и не будет возникать никаких проблем. Однако если пользователь закроет форму, не удалив полоску прогресса, то часть памяти в системе будет потеряна. Чтобы этого избежать, мы добавляем деструктор класса формы. Добавьте следующее объявление в заголовочный файл:

private:  // User declarations TProgressBar *FpProgress;

public: // User declarations

__fastcall TForm1(TComponent *Owner);

__fastcall ~TForm1(void);

};

А затем добавьте код деструктора в исходный файл (Unit1.cpp):

__fastcall  TForm1::~TForm1(void)

{

if ( FpProgress ) delete FpProgress;

}

Заметьте:  мы  опять  проверяем,  что  указатель  не  NULL.  Попытка  удалить  указатель,  равный

NULL, может привести к сбою программы.

Вот и все про динамическое создание компонентов в CBuilder. Вы теперь знаете, как создавать управляющий элемент динамически (не забывая указать, кто его родитель), как устанавливать свойства управляющего элемента, а также как реагировать на события в динамически созданном компоненте. Вы также увидели, как создать популярную полоску прогресса в панели состояния и как заставить ее отражать состояние прогресса.

Далее мы рассмотрим, как проверять правильность ввода в управляющих элементах в CBuilder.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии