Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
Скачать 17.38 Mb.
|
Листинг 11.1811. Компоненты, создающие интерфейс между пользователем и приложением 367 System::DateTime date1 = System::DateTime( 2010, 6, 3, 22, 15, 0 ); System::DateTime date2 = System::DateTime( 2010, 12, 6, 13, 2, 0 ); Это один из конструкторов класса DateTime, инициализирующий экземпляр класса значениями (год, месяц, число, часы, минуты, секунды System::DateTime date3 = System::DateTime( 2010, 10, 12, 8, 42, 0 ); // diff1 (разность) равна 185 дней, 14 часов, 47 минут. // Класс TimeSpan задает интервал времени. У него есть свои события и методы System::TimeSpan diff1 = date2.Subtract( date1 ); this->listBox1->Items->Add(date2.ToString()); this->listBox2->Items->Add(date1.ToString()); this->listBox3->Items->Add(diff1.ToString()); // date4 получается 17:55:00 System::DateTime date4 = date3.Subtract( diff1 ); this->listBox1->Items->Add(date3.ToString()); this->listBox2->Items->Add(diff1.ToString()); this->listBox3->Items->Add(date4.ToString()); // diff2 (разность) равна 55 дней, 4 часа, 20 минут. System::TimeSpan diff2 = date2 — date3; this->listBox1->Items->Add(date2.ToString()); this->listBox2->Items->Add(date3.ToString()); this->listBox3->Items->Add(diff2.ToString()); // date5 получается 17:55:00 System::DateTime date5 = date1 — diff2; this->listBox1->Items->Add(date1.ToString()); this->listBox2->Items->Add(diff2.ToString()); this->listBox3->Items->Add(date5.ToString()); } Теперь посмотрим, как работают некоторые методы работы с датами. На рис. 11.77 показаны результаты сложения дат и вид формы с компонентами, обеспечивающими эти операции. К первому слагаемому добавлялось построчно количество дней, месяцев и лет. Проверялись методы Add() , AddDays() , AddMonths() , В листинге 11.19 приведен текст программы этого приложения. Листинг 11.19 #pragma once namespace AddDate2011 { using namespace System; using namespace System::ComponentModel; 11. Компоненты, создающие интерфейс между пользователем и приложением 369 #pragma region Windows Form Designer generated code /// /// Required method for Designer support — do not modify /// the contents of this method with the code editor. /// { 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->label3 = (gcnew System::Windows::Forms::Label()); this->listBox1 = (gcnew System::Windows::Forms::ListBox()); this->listBox2 = (gcnew System::Windows::Forms::ListBox()); this->listBox3 = (gcnew System::Windows::Forms::ListBox()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 13); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = Пуск this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this,&Form1::button1_Click); // // button2 // this->button2->Location = System::Drawing::Point(387, 12); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 1; 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(13, 56); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(102, 17); this->label1->TabIndex = 2; this->label1->Text = е слагаемое 11. Компоненты, создающие интерфейс между пользователем и приложением 371 this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(498, 174); this->Controls->Add(this->listBox3); this->Controls->Add(this->listBox2); this->Controls->Add(this->listBox1); this->Controls->Add(this->label3); this->Controls->Add(this->label2); this->Controls->Add(this->label1); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = Сложение дат this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { String ^s; Метод Add()- добавляет интервал времени к данной дате Интервал задается данными класса TimeSpan: запускают один из его конструкторов, который и задает добавку в днях к данному экземпляру даты Здесь подсчитывается, какой день недели будет, если к текущей дате добавить 36 дней System::DateTime today = System::DateTime::Now; текущая дата System::TimeSpan duration( 36, 0, 0, 0 ); Конструктор придает начальные значения членам класса задаются количество дней, часы, минуты, секунды. Фактически это структура й элемент — интервал времени в днях, й элемент — интервал времени в часах и т. д. Мы станем использовать интервал "количество дней System::DateTime answer = today.Add( duration ); Эта функция добавляет данные структуры duration к данным структуры даты s=answer.ToString("dddd",DateTimeFormatInfo::CurrentInfo); 11. Компоненты, создающие интерфейс между пользователем и приложением 373 this->listBox1->Items->Add(s); запись го слагаемого в ListBox s=d2.ToString(); this->listBox2->Items->Add(s); запись го слагаемого в ListBox } }; } На рис 11.77 последние две строки результата получились странными, потому что второе слагаемое — это уже не дни, а месяцы и годы. Компонент Компонент находится в списке All Windows Forms палитры компонентов. Он позволяет построить набор страниц, которые друг друга перекрывают на экране и которые можно перелистывать. Но главная их ценность в том, что на эти страницы, находящиеся в рамках одной формы, где размещен сам компонент TabControl , можно помещать другие компоненты, тем самым расширяя возможности формы. Например, вы должны разработать приложение по управлению кадрами предприятия. Все компоненты, обеспечивающие решение этой проблемы, можно разместить водной форме, нона разных страницах компонента TabControl , который достаточно поместить в форму. На каждой странице вы можете разместить по одному справочнику и организовать на ней ведение справочника, на других страницах можете разместить элементы управления для получения аналитических таблиц и т. д. Чтобы переключаться между страницами, достаточно щелкнуть мышью на любой из них. Вид компонента в форме с раскрытым диалоговым окном TabControl Tasks показан на рис. 11.78. Рис 11.78. Вид компонента TabControl в форме Самым важным свойством TabControl является свойство TabPages , которое содержит отдельные страницы. Каждая вкладка — это отдельный объект TabPage со своими свойствами, методами и событиями. Когда вы переключаетесь с одной страницы на другую, щелкая мышью на вкладке, возникает событие Click для объекта Часть II. Приложения Windows Как задавать страницы Поместите компонент TabControl в форму и откройте его диалоговое окно TabControl Tasks (см. рис. 11.78). Там есть две опции, позволяющие добавлять или удалять страницы. Перемещаться поуже сформированным страницам можно посредством щелчка мышью на вкладке каждой страницы. Если страницы не умещаются в поле компонента, то автоматически формируются кнопки прокрутки. Если вам неудобно работать с кнопками прокрутки, ивы хотите видеть все страницы сразу, тогда задайте значение свойства MultiLine равным true , — получите желаемый результат. Если случится, что не все вкладки в многостраничном режиме появляются, то следует установить свойство Width (ширина) для компонента TabControl на такое значение, чтобы ширина самого компонента была больше, чем ширина всех его вкладок. На вкладке можно поместить пиктограмму. Для чего это делается При эксплуатации приложения пользователям бывает некомфортно каждый раз вчитываться в название страницы на вкладке. Легче всего запоминается пиктограмма, на которую следует нажимать в необходимых случаях. Чтобы создать вкладки с пиктограммами, нужно в форму поместить компонент ImageList , задать в нем пиктограммы (их надо заранее заготовить в соответствующих файлах с расширением icon средствами Photoshop или другого инструмента, затем установить свойство ImageList компонента TabControl (привязать компонент ImageList через это свойство к компоненту TabControl ). Тогда все пиктограммы, находящиеся в списке компонента imageList , будут видны и на вкладках компонента Теперь следует активизировать нужную вкладку и ее свойство ImageIndex установить на индекс подходящей пиктограммы (когда вы откроете выпадающий список свойства вкладки ImageIndex , в нем будут видны все пиктограммы со значениями их индексов (номеров. При активизации вкладки могут возникнуть проблемы не всегда удается (из-за неопытности начинающего) переключаться с активного компонента на соответствующую вкладку TabPage . Если вы просто щелкните на вкладке, станет активным весь компонент TabControl . Если вы щелкните в поле страницы, которую открывает данная вкладка, то станет активной именно страница, те. объект TabPage . Вот сего свойствами и надо будет работать для задания пиктограммы на вкладке. Расположение вкладок в компоненте TabControl можно менять помещать их сверху, снизу, слева и справа. Достаточно выбрать соответствующее значение свойства Alignment компонента TabControl из выпадающего списка. Надо твердо помнить, что TabControl и TabPage (его составная часть) — это все-таки два разных объекта, которые можно по-своему настраивать с помощью их собственных свойств и методов. Все, что относится ко всем страницам, находится в TabControl . Все, что относится к отдельной странице, регулируется через компонент Вы можете изменить форму вкладок (не надо путать вкладку, как заголовок страницы, и вкладку в более широком смысле — в смысле страницы блокнота 11. Компоненты, создающие интерфейс между пользователем и приложением 375 TabControl ). Для этого нужно воспользоваться свойством Appearance компонента TabControl — все вкладки могут одновременно изменять форму, а для отдельной вкладки это не имеет места (поскольку изменяется значение свойства главного компонента — родителя. Заголовки могут иметь три формы нормальную, в виде кнопок, в виде таких же кнопок, но разделенных между собой вертикальными полосами. Перечень свойств TabControl , отображенных в окне Properties, показан на рис. 11.79. Рис 11.79. Перечень свойств Мы задавали страницы компонента TabControl , используя его диалоговое окно, которое открывается кнопкой в правом верхнем углу активного компонента. Однако более удобный способ задания страниц — это воспользоваться его свойством TabPages . Если нажать кнопку с многоточием в поле этого свойства, то откроется знакомое нам по изучению предыдущих компонентов диалоговое окно для работы со страницами (рис. 11.80). Здесь можно не только добавлять, удалять, менять местами страницы, но также сразу устанавливать их основные свойства, не обращаясь кокну. Обратите внимание и наследующие два свойства SelectedIndex — свойство, которое содержит номер активной страницы (если ему присвоить целое значение, то страница с соответствующим номером (отсчет 11. Компоненты, создающие интерфейс между пользователем и приложением 377 Рис 11.81. Демонстрация работы метода активизации страниц Листинг 11.20 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if(i== 0) { this->tabControl1->SelectTab(i+1); i=1; } else { this->tabControl1->SelectTab(i-1); i=0; } } Переменная i объявлена как int i : private: /// /// Required designer variable. int i; Некоторые свойства страницы Каждая страница компонента TabControl представляет собой отдельный объект — экземпляр класса TabPage со своими свойствами, методами и событиями. Перечень некоторых свойств страницы, отображенных в окне |