Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
Скачать 17.38 Mb.
|
All Windows Forms палитры компонентов. Через этот компонент в форму выводится графическое изображение. Какое изображение надо выводить, указывается в свойстве 11. Компоненты, создающие интерфейс между пользователем и приложением 355 Рис 11.72. Свойства PictureBox метода Load (Url) в форму также можно загрузить изображение. В этом случае метод Load() сам назначит свойству ImageLocation значение переменной Url и далее станет работать как этот же метод в своей первой форме (те. без параметра. Пример работы этой функции в обеих формах показан на рис. 11.73 (там же можно увидеть, как работать с TextBox , свойство которого Multiline надо установить в true , чтобы поле компонента растягивалось. Когда информация не помещается в поле, надо его перевести в режим Multiline и растянуть до требуемого размера, что и сделано, поэтому весь путь к изображению виден полностью. Тексты обработчиков кнопок показаны в листинге 11.16. Листинг 11.16 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->pictureBox1->ImageLocation=this->textBox1->Text; загружает изображение, адрес которого указан в свойстве //ImageLocation: this->pictureBox1->Load(); } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } 11. Компоненты, создающие интерфейс между пользователем и приложением 357 Zoom — это свойство обеспечивает соблюдение пропорций изображения при подгонке его к размерам пространства компонента. Значение StretchImage просто втискивает изображение в размеры компонента и может исказить изображение, а Zoom тоже втискивает, но при этом не нарушает пропорций, те. не искажает изображение. ErrorImage — здесь можно задать изображение, которое станет выводиться вместо запрашиваемого, если последнее не удается загрузить из-за возникающих ошибок или по причине отмены загрузки. InitialImage — с помощью этого свойства можно задать вывод "успокаивающего" изображения, которое выводится в компонент на то время, пока основное изображение загружается. Компонент Компонент (календарь) находится в списке All Windows Forms палитры компонентов и позволяет пользователю выбирать необходимую дату или время. При выборе даты или времени (это задается в свойстве Format ) компонент может представляться в двух формах в виде прямоугольного поля, в котором высвечивается дата или время, ив виде выпадающего списка с датами (рис. 11.74). Рис 11.74. Формы компонента DateTimePicker при выборе информации и сам выбор 358 Часть II. Приложения Windows Выборка данных в обеих формах организована с использованием механизма прокрутки. В форме без выпадающего списка используют установку свойства ShowUpDown в значение true . Тогда вместо кнопки для раскрытия выпадающего списка появляется элемент прокрутки содержимого поля — прямоугольник со стрелками вверх/вниз (больше/меньше). Сего помощью можно увеличивать или уменьшать значения отмеченного элемента данного, тем самым значительно ускоряя поиск. Если, например, в поле находится дата в формате 21 марта 2012 г, то при необходимости изменения месяца или года вы щелкаете на элементе 21 и начинаете нажимать кнопкой мыши на стрелки "вверх/вниз" прокручивающего механизма (таким способом вы подгоняете под нужные значения месяц и год. Если же выработаете с другой формой выборки даты — из выпадающего списка, то список открывается кнопкой с галочкой (флажком. В окне списка тоже имеются прокручивающие механизмы (по краям окна — стрелки "влево/вправо") не только в целом для даты, но и отдельно для выбора месяца и прокрутки величины года. Если включено свойство ShowCheckBox , то слева от выбранной даты появляется флажок при условии, что свойство Checked тоже будет установлено в true ). Если флажок включен, то выбранную дату (кроме наименования месяца) можно редактировать щелчком мыши надо отметить соответствующий элемента затем ввести с клавиатуры свое значение. Если флажок выключить, дата становится недоступной. Выбранная с помощью DateTimePicker дата помещается в его свойство Value , откуда ее можно брать в режиме исполнения приложения. Существуют свойства MaxDate и MinDate , которые задают диапазон изменения даты. Значения этих свойств можно установить тоже с помощью механизма календаря (календарь открывается для выборки из него необходимой даты, если нажать кнопку с галочкой в поле каждого из этих свойств. Задание этих свойств — механизм контроля выборки (при осуществлении выборки система не позволит выбрать даты вне указанного диапазона. Например, если установить диапазон между 01.03.2012 и 08.03.2012, то вы не сможете набрать, например, дату 09.03.2012. При разработке конкретного приложения можно использовать этот механизм, задавая диапазон дат вовремя исполнения приложения, что будет определенной гарантией того, что оператор, вводя даты, не совершит ошибки. Значения дат могут выводиться в х форматах, что определяется свойством Format : Long — длинный формат. Если выбрать это значение, то дата станет выводиться так 12 апреля 2012 г Short — короткий формат. Если выбрать это значение, то дата станет выводиться в виде 12.04.2012; Time — формат времени Custom — при выборе этого формата надо установить свойство CustomFormat в соответствующее значение, принятое в среде разработки (об этом чуть позже. Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 359 Рис 11.75. Свойства компонента Перечень свойств DateTimePicker , отображенных в его окне Properties, показан на рис. 11.75. Форматные строки даты и времени Дата и время относятся к типу DateTime , который имеет специальный механизм, позволяющий представлять эти две величины в виде строки. Причем имеются две категории перевода даты в строку стандартная и пользовательская. Там, где стандартный способ перевода даты в строку не подходит, применяется другой механизм так называемый пользовательский формат. Для чего нужен перевод даты в строку Например, вы получили из календаря некоторую дату и хотите ее вывести на экран в удобном для вас формате. Допустим, что вы хотите вывести дату в виде последовательности цифр, разделенных на группы (число, месяц, год, между которыми должны быть специальные символы-разделители (например, звездочки. К тому же время и дата должны быть отформатированы в соответствии с принятыми в данной стране правилами. Такое представление — это уже не число, а обыкновенная строка. Форматирование дат происходит с помощью задания специальной форматной строки, а когда такую строку не задают, то форматирование происходит по правилам умолчания. Форматная строка содержит специальные символы форматирования, определяющие, как значение даты станет преобразовываться. 360 Часть II. Приложения Windows Стандартное и пользовательское форматирование Стандартное форматирование состоит в применении набора символов форматирования, представленных в табл. 11.6. Если задано стандартное форматирование даты, а символа форматирования нет в таблице, которая хранится в соответствующем классе, то система выдаст ошибку. Вид результата форматирования (те. строка после форматирования) зависит от региональных установок вашего компьютера, задаваемых через панель управления. Компьютеры с различными региональными установками будут, естественно, выдавать разные результаты форматирования. Таблица Символы форматирования Форматный символ Описание Так задают день месяца. Число, состоящее из одной цифры, не будет иметь впереди нуля dd Так задают день месяца, нов этом случае число, состоящее из одной цифры, будет иметь впереди нуль ddd При таком форматировании станут выдаваться не названия дней недели, а их аббревиатуры dddd При таком форматировании станут выдаваться полные названия дней недели Месяц будет выдаваться в виде числа. Месяц, представленный одной цифрой, не будет иметь впереди нуля Месяц будет выдаваться в виде числа. Месяц, представленный одной цифрой, будет иметь впереди нуль MMM При таком форматировании станут выдаваться не названия месяцев, а их аббревиатуры При таком форматировании будет выдаваться полное название месяца y При таком форматировании будет выдаваться годно без выдачи века. Если год представляется одной цифрой (например, 7 - й год, то передним нуля не будет yy При таком форматировании будет выдаваться годно без выдачи века. Если год представляется одной цифрой, тов выводе передним появится нуль yyyy При таком форматировании будет выдаваться год из четырех цифр, включая век h При таком форматировании выводится время в 12 - часовом формате. Одноразрядное значение времени не будет иметь впереди нуля hh Такой же смысл, что и для h, нос нулем впереди числа При таком форматировании выводится время в 24 - часовом формате. Одноразрядное значение времени не будет иметь впереди нуля Такой же смысл, что и для H, нос нулем впереди числа m Так выводятся минуты. Одноразрядное значение не будет иметь впереди нуля mm Такой же смысл, что и для m, нос нулем впереди числа Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 361 Таблица 11.6 (окончание) Форматный символ Описание Так выводятся секунды. Одноразрядное значение не будет иметь впереди нуля ss Такой же смысл, что и для s, нос нулем впереди числа f Так выводятся доли секунды. Если секунда — это одноразрядное число, то лишние цифры отсекаются ff Так выводятся доли секунды. Если секунда — это двухразрядное число, то лишние цифры отсекаются \ c Здесь "это любой символ. Чтобы вывести обратную косую черту (бэкслэш), надо использовать символы " \\" В табл опущены некоторые специфические форматы. Пример форматирования дат приведен в приложении, текст обработчиков которого показан в листинге 11.17, а форма в режиме дизайна ив режиме исполнения — на рис. 11.76. Рис 11.76. Пример форматирования дат Листинг 11.17 #pragma once namespace My117_2010Форматированиедат { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; 362 Часть II. Приложения Windows Form using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Globalization; для даты /// /// Summary for Form1 /// { public: Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // } protected: /// /// Clean up any resources being used. /// Form1() { if (components) { delete components; } } private: System::Windows::Forms::DateTimePicker^ dateTimePicker1; protected: private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Label^ label2; private: System::Windows::Forms::ListBox^ listBox1; private: System::Windows::Forms::ListBox^ listBox2; private: /// /// Required designer variable. /// System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 363 /// Required method for Designer support — do not modify /// the contents of this method with the code editor. /// void InitializeComponent(void) { this->dateTimePicker1 = (gcnew System::Windows::Forms::DateTimePicker()); this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->label2 = (gcnew System::Windows::Forms::Label()); this->listBox1 = (gcnew System::Windows::Forms::ListBox()); this->listBox2 = (gcnew System::Windows::Forms::ListBox()); this->SuspendLayout(); // // dateTimePicker1 // this->dateTimePicker1->Location = System::Drawing::Point(34, 1); this->dateTimePicker1->Name = L"dateTimePicker1"; this->dateTimePicker1->Size = System::Drawing::Size(127, 20); this->dateTimePicker1->TabIndex = 0; // // button1 // this->button1->Location = System::Drawing::Point(3, 1); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(25, 99); this->button1->TabIndex = 1; this->button1->Text = Выход this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // button2 // this->button2->Location = System::Drawing::Point(34, 26); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(65, 49); this->button2->TabIndex = 2; this->button2->Text = Форматировать дату this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click); // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(66, 108); 364 Часть II. Приложения Windows Form this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(57, 13); this->label1->TabIndex = 3; this->label1->Text = Форматы // // label2 // this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(218, 108); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(157, 13); this->label2->TabIndex = 4; this->label2->Text = Результаты форматирования // // listBox1 // this->listBox1->FormattingEnabled = true; this->listBox1->Location = System::Drawing::Point(12, 124); this->listBox1->Name = L"listBox1"; this->listBox1->Size = System::Drawing::Size(185, 95); this->listBox1->TabIndex = 5; // // listBox2 // this->listBox2->FormattingEnabled = true; this->listBox2->Location = System::Drawing::Point(203, 124); this->listBox2->Name = L"listBox2"; this->listBox2->Size = System::Drawing::Size(199, 95); this->listBox2->TabIndex = 6; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(413, 223); this->Controls->Add(this->listBox2); this->Controls->Add(this->listBox1); this->Controls->Add(this->label2); this->Controls->Add(this->label1); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Controls->Add(this->dateTimePicker1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 365 #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { DateTime ^dt=DateTime(); String ^s; объявлен массив строк с именем format и инициализирован форматами array \"'\"yy"}; dt=this->dateTimePicker1->Value; здесь будет выбранная дата for ( int i = 0; i < format->Length; i++ ) { //CurrentInfo — учет национальных особенностей (см. региональные установки на панели управления) s=dt->ToString( format[ i ], DateTimeFormatInfo::CurrentInfo); перевод даты в строку с одновременным форматированием this->listBox1->Items->Add(format[ i ]); this->listBox2->Items->Add(s); } //for Обработчик }; } Если нужны региональные настройки, тов перечень используемых пространств файла надо добавить строку using namespace System::Globalization; для даты Некоторые сведения о работе с датами При разработке приложений часто приходится сталкиваться с необходимостью работы с датами, а не только с форматированным выводом дат. Приходится заниматься декомпозицией даты (разбиением ее на число, месяц, год) и последующей работой с каждой из ее частей, приходится добавлять к дате дни, месяцы и годы, сравнивать даты, складывать и вычитать их, переводить содержимое строки, в которой записана дата, в тип DateTime (последнее, кстати, выполняет метод Parse(String) ). Работа с датами основывается на использовании элементов класса DateTime . Сожержимое данного класса легко найти в справочной системе среды, выйдя через клавишу DateTime подсвечено, на документацию в Интернете) и набрав в открывшемся окне в его поисковом поле DateTime . Далее показаны несколько методов этого класса AddDays — добавка заданного количества дней к значению даты AddHours — добавка заданного количества часов к значению даты 366 Часть II. Приложения Windows Form AddMilliseconds — добавка заданного количества миллисекунд к значению даты AddMinutes — добавка заданного количества минут к значению даты AddMonths — добавка заданного количества месяцев к значению даты AddSeconds — добавка заданного количества секунд к значению даты AddTicks — добавка заданного количества тиков к значению даты AddYears — добавка заданного количества лет к значению даты Compare — сравнение двух объектов типа DateTime и возврат целого, которое указывает, меньше ли первая дата второй или нет DaysInMonth — возвращает количество дней в месяцев указанном месяце года FromBinary — переводит разрядную величину в тип Остановимся более подробно на вычитании дат. На рис. 11.77 показаны результаты вычитания разных дат и вид формы с компонентами, обеспечивающими эти операции. В листинге 11.18 приведены тексты обработчиков событий этого приложения. Рис 11.77. Операции с датами |