Шаг 27.
Microsoft Visual C++ 2010. Начала.
Базовые компоненты. Компонент TextBox

    На этом шаге мы рассмотрим этот компонент.

    Компонент TextBox (рисунок 1) предназначен для ввода данных с клавиатуры.


Рис.1. Компонент TextBox

    В зависимости от настройки компонента, в поле редактирования можно ввести одну или несколько строк текста. Свойства компонента приведены в таблице 1.

Таблица 1. Свойства компонента TextBox
Свойство Описание
Name Имя компонента. Используется в программе для доступа к компоненту и его свойствам, в том числе к тексту, который находится в поле редактирования
Text Текст, который находится в поле редактирования
Location Положение компонента на поверхности формы
Size Размер компонента
Font Шрифт, используемый для отображения текста в поле компонента
ForeColor Цвет текста, находящегося в поле компонента
BackColor Цвет фона поля компонента
BorderStyle Вид рамки (границы) компонента. Граница компонента может быть обычной (Fixed3D), тонкой (FixedSingle). Граница вокруг компонента может отсутствовать (в этом случае значение свойства равно None)
TextAlign Способ выравнивания текста в поле компонента. Текст в поле компонента может быть прижат к левой границе компонента (Left), правой (Right) или находиться по центру (Center)
MaxLength Максимальное количество символов, которое можно ввести в поле компонента
PasswordChar Символ, который используется для отображения вводимых пользователем символов (введенная пользователем строка находится в свойстве Text)
Multiline Разрешает (True) или запрещает (False) ввод нескольких строк текста
Dock Способ привязки положения и размера компонента к размеру формы. По умолчанию привязка отсутствует (None). Если значение свойства равно Top или Bottom, то ширина компонента устанавливается равной ширине формы и компонент прижимается соответственно к верхней или нижней границе формы. Если значение свойства Dock равно Fill, а свойства Multiline - True, то размер компонента устанавливается максимально возможным
Lines Массив строк, элементы которого содержат текст, находящийся в поле редактирования, если компонент находится в режиме Multiline. Доступ к строке осуществляется по номеру. Строки нумеруются с нуля
SkroolBars Задает отображаемые полосы прокрутки: Horizontal - горизонтальная; Vertical - вертикальная; Both - горизонтальная и вертикальная; None - не отображать

    Если не предпринимать никаких усилий, то в поле компонента TexBox отображаются все символы, которые пользователь набирает на клавиатуре, что не всегда удобно. Программа может обеспечить фильтрацию вводимых символов путем запрета отображения запрещенных символов. Для того чтобы символ не отображался в поле редактирования, в процедуре обработки события KeyPress параметру Handled надо присвоить значение True.

    Представленная далее программа (форма приведена на рисунке 2, а текст — в листинге ниже) демонстрирует использование компонента TextBox для ввода данных различного типа. Программа спроектирована таким образом, что в режиме ввода текста в поле редактирования можно ввести любой символ, в режиме ввода целого числа — только цифры. В режиме ввода дробного числа кроме цифр в поле компонента можно ввести символ-разделитель (запятую или точку, в зависимости от настройки операционной системы).

    Следует обратить внимание, что в директиву uses надо поместить ссылку на пространство имен System.Globalization.


Рис.2. Форма программы TextBox

    Размещение ссылки и обработка события KeyPress компонентов TextBox

using namespace System::Globalization;
.   .   .   .   .
private: System::Void textBox1_KeyPress(System::Object^  sender, 
	System::Windows::Forms::KeyPressEventArgs^  e) {
	if (Char::IsControl(e->KeyChar)) 
	{ 
		if (e->KeyChar == (char)Keys::Enter) 
		{ 
			// Нажата клавиша <Enter>. 
			// Переместить фокус в поле textBox2 
			textBox2->Focus(); 
		} 
	}
 }

private: System::Void textBox2_KeyPress(System::Object^  sender, 
	System::Windows::Forms::KeyPressEventArgs^  e) {
	// в textBox2 можно ввести только целое число 
	if ((e->KeyChar >= '0') && (e->KeyChar <= '9')) 
	// цифра 
		return; 
	if (Char::IsControl(e->KeyChar)) 
	{ 
		if (e->KeyChar == (char)Keys::Enter) 
		{ 
			// Нажата клавиша <Enter>. 
			// Переместить фокус в поле textBox3 
			textBox3->Focus(); 
		} 
		return; 
	} 
	// остальные символы запрещены 
	e->Handled = true; 
 }

private: System::Void textBox3_KeyPress(System::Object^  sender, 
	System::Windows::Forms::KeyPressEventArgs^  e) {
	// CultureInfo::CurrentCulture->NumberFormat-> 
	// NumberDecimalSeparator - строка. 
	// Нам нужен первый символ 
	char aDecimalSeparator = 
		CultureInfo::CurrentCulture->NumberFormat->NumberDecimalSeparator[0];
	if ((e->KeyChar >= '0') && (e->KeyChar <= '9')) 
		// цифра 
		return; 
	// Заменим введенный пользователем десятичный разделитель 
	// (точку или запятую) на "правильный" - 
	// CultureInfo::CurrentCulture->NumberFormat->NumberDecimalSeparator 
	// CultureInfo::CurrentCulture->NumberFormat->NumberDecimalSeparator - строка. 
	// Нам нужен первый символ 
	if ((e->KeyChar == '.') || (e->KeyChar == ',')) 
		e->KeyChar = aDecimalSeparator; 
	if (e->KeyChar == aDecimalSeparator) 
	{ 
		// Нажата запятая. Проверим, 
		// может, запятая уже есть в поле редактирования 
		if ((textBox3->Text->IndexOf(aDecimalSeparator) != -1) || 
			(textBox3->Text->Length == 0)) 
		{ 
			// Запятая уже есть. 
			// Запретить ввод еще одной 
			e->Handled = true; 
		} 
		return; 
	} 
	if (Char::IsControl(e->KeyChar)) 
	{ 
		if (e->KeyChar == (char)Keys::Enter) 
		{ 
			// Нажата клавиша <Enter>. 
			// Переместить курсор в поле textBox1 
			textBox1->Focus(); 
		} 
		return; 
	} 
	// остальные символы запрещены 
	e->Handled = true;
 }
Архив проекта можно взять здесь.

    На следующем шаге мы рассмотрим компонент Button.




Предыдущий шаг Содержание Следующий шаг