OOП
.pdf
|
|
исунок 3 Использование элемента управления Panel |
|
|||
|
окно редактора ri hTextBox |
Туда же, кроме результата, будет выводиться дата и время |
||||
âыполнения каждой операции. |
для кнопки сложения: |
|
||||
|
|
Обработчик события |
|
|
||
private: System::Void plus Cli k(System::Obje t^ |
sender, System::EventArgs^ e) |
|||||
{ |
a |
a,b, |
|
first- |
|
|
|
doubleSys em::Convert::ToDouble(se ond>Text);- |
|
|
|||
} |
result1=a+b; ->AppendText(fi |
->Text+" + "+s ond->Text+" = "+System::Convert::ToString( ) |
||||
+" \t"+System::Convert::ToString(System::DateTime::Now)+"\n"); |
AppendText. |
|||||
Для добавления строки текста в т кстовый редактор используется |
||||||
Обратите внимание, что для |
сложения стро овых |
еременных (напр мер, first->Text и |
||||
se ond->Text) используется операция +. Та же исïользована ункц ункция |
|
|||||
System::DateTime::Now, которая выводит текущий момент времени. |
|
|||||
|
|
Обработчики событий Cli k остальных кнопок выглядят аналогично. |
||||
|
|
|
|
10 |
|
|
2.3 Меню, кнопки быстрого доступа |
стандартные окна диалога |
|
|
||||
меню: главнСтандартìåíþ,ûéрасполагаемоеинтер ейс Windowsâ âå õíåé- |
ñòðî |
îêíà,предполагаети контекстныеналичиеèëèäâóõвсплываю•типов |
|||||
ùèå ìåíþ, |
при нажатии правойприложениякнопê ìûøè, |
которых зав сит |
|||||
от того, над каким э ементом управлен я произ шло событие жатия кнопки мышè. |
. |
||||||
В нашемпоявляющиесяпри ожении мы создадèм главное меню, содерж щее пункты File и |
|
||||||
Пункт File будет содержать элементы New, Save, Save as...,содержаниеOpen... Exit. ПунктEdit |
|||||||
будет содержать элементы Cut, Copy, Paste. |
|
|
|
|
|
||
Для созда ия строки глав ого меню предназначен элеме т MenuStrip, его н обхо• |
|||||||
димо разместить |
на орме. Измените значение свойства Name (íапример, пусть элåìåíò |
||||||
называется mainmenu). Выделите его |
дважды кликните мышью, чтобы открыть кон• |
||||||
структор главного ме ю. введите названия всех пунктов как для меню File, так и для |
|||||||
меню Edit. При создании пунктов помните, чт : |
быструю клавишу для обра• |
||||||
амперсанд (&) в названии пункта меню |
|
||||||
щения к этому пункту (например, для имениопределяетпунк а \E&xit это будет комбинация |
|||||||
[Alt -X); |
|
|
|
|
|
|
|
если после выбора пункта меню будет открыто окно диалога, то после имени пункта |
|||||||
ставится многоточие (например, для пункта Save as...); |
|
|
|
||||
горизонтальная линия, разделяющая группы пунктов, получается, если в качестве |
|||||||
имени пункта задать знак минус (-). |
|
|
|
|
|
||
Измените свойство Name у всех созданных пунктов: для пункта Open пусть Name=mainopen, |
|||||||
для пункта Save пусть Name=mainsave |
ò.ä. |
|
|
|
|
|
|
Для каждого пункта меню (за исключением пункта Exit) необходимо создать за• |
|||||||
головок ункции обработчика события Cli k (двойной щелчок мышкой по имени пункта |
|||||||
или из списка событий, как указано выше). |
|
|
|
|
|
||
В первую очередь определим ункц ю, обрабатывающую событие Cli k для пунк• |
|||||||
а Exit. Выше уже была дана ункция, приводящ |
к закрытию |
ïðè |
íàæà• |
||||
ии на кнопку. Поскольку калькулятор разрабатыв |
ется последовательно,приложениякнопка Exit |
||||||
ункция для ее работы уже присутствуют. |
Среда разработки позволяе к любому со• |
||||||
бытию привязать уже существующую ункцию. Это приводит к то |
ó, ÷òî îäíà |
òà |
|
ункция будет вызываться при обращении сразу к нескольким элеìентам приложения. В данном случае, одна и та же ункция будет выполняться как при нажатии на кнопку 11
Exit, так и при нажатии на пункт Exit главного меню. Для того, чтобы связать унк• |
||||||
перейдитеöèþ, |
списку событийприложение,. В списсобытиемсобытийCliнайдитеk пунктасобытиеìåíþCliExitk ,èвыделитенапротивåãîâ ïó• |
|||||
ñòîé ñòðî å |
|
списке доступ ых ункций выберите нужную ункцию (в первом примере |
||||
простогозакрывающуюалькулятора |
íазывалась exit Cli k). |
|
||||
Edit. |
|
На следующем |
онаэт пе создадим обработчики событий Cli k для пунктов меню |
|||
1) |
Измените свойство Enabled пункта Paste на значение false, чтобы этот пункт по |
|||||
|
умолчанию не был доступен для использования при пустом бу ере обмена. |
|||||
2) Пункт Copy |
|
|
||||
|
private: |
System::Void main opy_Cli k(System::Obje t^ sender, System::EventArgs^ e) |
||||
|
{ |
result1->Copy(); |
|
|||
|
} |
mainpaste->Enabled=true; |
|
|||
|
здесь в первой строке содержимое из элемента result1 (элемент ri hTextBox) помо• |
|||||
|
щью ункции Copy копируется бу ер |
во второй строке изменятся свойство |
||||
|
Enabled для пункта Paste главного менюобмена,значение true, поскольку теперь бу ер |
|||||
|
обмена не пуст. |
|
|
|||
3) Пункт Cut |
|
|
||||
|
private: |
System::Void main ut_Cli k(System::Obje t^ sender, System::EventArgs^ e) |
||||
|
{ |
result1->Cut(); |
|
|||
|
} |
mainpaste->Enabled=true; |
|
|||
|
обработчик события ан логичен предыдущему, только содержимое из редактора |
|||||
|
result1 не копируется, а вырезается в бу ер обмена. |
|||||
4) Пункт Paste |
|
|
||||
|
private: |
System::Void mainpaste_Cli k(System::Obje t^ sender, System::EventArgs^ e) |
||||
|
{ |
|
|
|
12 |
|
} |
|
result1->Paste(); |
|
|
|
|
|
||
здесь содержимое бу ера обмена при помощи ункции Paste вставляется в окно |
|||||||||
редактора result1. |
|
|
äëÿ |
меню File необходимо |
|||||
|
Ïðåæ |
÷åì ñîçä âàòü |
|
|
|||||
д бавить станäартные диалоги открытобработчикисохранения айлов элементы OpenFileDialog |
|||||||||
и SaveFileDialog. Затем для упрощенèÿ |
работысобытийайламипунктовкласс Form1 нужно добавить |
||||||||
новую |
строковую переменную, хранящую имя айла: |
|
|
||||||
private: System::String^ MyFileName; |
|
|
|
|
|||||
После этого обработчик события для пункта Open для открытия текстового айла к окне |
|||||||||
редактора result1 |
|
|
|
|
|
|
|||
private: |
System::Void mainopen_Cli k(System::Obje t^ sender, System::EventArgs^ e) |
||||||||
if(MyFileName=="") |
|
|
|
|
|
|
|||
{MyFileName="log.txt"; |
|
|
|
|
|
||||
}openF leDialog1->F leName = MyF leName; |
|
|
|
||||||
if(this |
open |
|
D alog1->ShowD alog() == System::Windows::Forms::DialogResult::OK) |
||||||
{ |
|
|
|
|
->FileName); |
|
|
|
|
resu t1->LoadFile(op nFi |
|
|
|
||||||
MyFileName = openFileDialeDialog1->FileName; |
|
|
|
||||||
}} |
|
|
|
|
|
|
извест о ли имя айла: если пользо• |
||
Здесь в первой условной конструкции п |
|
||||||||
ватель еще не задал имя айла для открытияоверяется,(т. . переме ная MyFileName равна пустой |
|||||||||
|
|
то этой переменной присваивается по умолчанию значение log.txt. Затем проис• |
|||||||
х дит вызов диалогового окна для открытия айла openfileDdialog1, свойству FileName |
|||||||||
торого присвоено значение переменной MyFileName. Это имя будет игурировать в |
ñòðî•ëþ |
||||||||
строке),открытия айла диалогового окна. Пользователь может изменить это значение |
|||||||||
бое другое (например, если требуется открыть айл, имя которого отлич от значения |
|||||||||
log.txt, которое используется по умолчанию). Следующая условная конструкция |
ïðî• |
веряет, что диалоговое окно было закрыто путем нажатия на кнопку [OK , поскольку в 13
окнаеýòñÿ,îì (òслучаето. переменной. имясвойствоокрываемогоMyFileNameDialogResultайла,присваиваетсяуказанноепринимаетв значениестроке диалоговогосвойстваOK. Åñëè FileNameýòîîêíà),условиедиалоговогосодержимоевыполня• |
||||||||
айла загружается |
(при п мощи ункции LoadFile) в окно редактора result1. |
|||||||
|
|
Обработчик |
события |
Cli k для пункта New должен сохранять в айл текущее |
||||
|
|
å |
êí редактора |
а затем очищать |
одержимое этого окна в том случае, если |
|||
|
|
было изменено. Еñли же содержимое окна редактора после |
||||||
последнег сîхра ения не изменялось, то окно редактора очищается без сохранения его |
||||||||
содержимîãî. Ôóíкция будет следующей: |
|
|
|
|||||
private: System::Void mainnew Cli k(System::Obje t^ sender, System::EventArgs^ e) |
||||||||
{ |
|
resu t1->Modified) |
|
|
|
|
||
|
if(MyFileName=="") |
|
|
|
|
|
||
|
{ |
|
|
|
|
|
|
|
|
MyFileName="log.txt"; |
|
|
|
|
|||
|
} |
|
->FileName = this->MyFileName; |
|
||||
|
if(saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) |
|||||||
|
{ |
SaveF le(s veFileDialog1->FileName); |
|
|||||
|
resu t1->Modif ed=f lse; |
|
|
|
|
|||
|
MyFileName = |
saveFileDialog1->FileName; |
|
|
|
|||
}} |
|
|
|
|
|
|
|
|
}result1->Clear(); |
|
|
|
|
|
|||
Первое условие предназначено для проверки того, было ли изменено содержимое окна |
||||||||
дактора result1. Ес и свойство Modified окна |
редактора |
значение true, то выполре• |
||||||
няются оператора теëа условной конструкции. Основная час ь тела условн й конструкции |
||||||||
аналогична телу ункции mainopen Cli k, которая рассмоимеетрена выше, тîлько в данном |
||||||||
случае содержим |
текстового окна |
|
в айл при помощи ункции SaveFile. |
|||||
После того, как содержимое редакторасохраняетсяено, значение свойства Modified изменяется |
||||||||
на значение false. Последний оператор ункции очищает окно редактора result1 при |
||||||||
помощи ункции Clear. |
|
14 |
|
|
ìîå îêíàФункциятекстовогоäëÿредактораобраб тки событияайл, причем,Cli k ïðèунктапервомSaveвызоведолжна ункциисохранятьдолжносодержи•âîç• |
||||
ник ть диалоговое окно для вода имени айла, в котором будет хр ниться соде жимое |
||||
редактора, при последующих вызовах содержимое окна будет автоматически сохранятся |
||||
в этот же айл. Функция будет следующей: |
|
|||
private: System::Void mainsave_Cli k(System::Obje t^ sender, System::EventArgs^ e) |
||||
{if(MyFileName=="") |
|
|
|
|
{ |
|
|
|
|
MyFileName="log.txt"; |
|
|
||
|
->FileName = MyFileName; |
|
||
if(saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) |
||||
{ |
SaveF le(this->saveFileDialog1->FileName); |
|
||
resu t1->Modif ed = false; |
|
|
||
MyFileName = this->saveFileDialog1->FileName; |
|
|||
} |
|
|
|
|
el |
|
|
|
|
result1->Modified = false; |
|
|
||
{ |
SaveF le(MyFi eName); |
|
|
|
}} |
|
|
|
else) выполняется при первом |
Здесь первая часть условной конструкции (до |
||||
вызове ункци , когда имя айла еще не задано,оператораторая (после оператора else) |
||||
при последующèх. Обратите внимание, что и в том, |
â другом случае после сохранения |
|||
содержимого окна редактора свойство Modif ed изменяет свое значение на false. |
||||
|
Функция для |
|
события Cli k пункта меню Save as... отличается от |
|
обраб ки пункта Save |
обработкитем, ч диалоговое окно для ввода имени айла возникает всякий |
|||
раз, когда ункция вызывается: |
|
|
||
private: System::Void mainsaveas_Cli k(System::Obje t^ sender, System::EventArgs^ e) |
||||
{if(MyFileName=="") |
|
15 |
|
{ |
|
|
|
|
|
|
|
|
|
|
MyFileName="log.txt"; |
|
|
|
|
|
|
||||
} |
|
|
->FileName = this->MyFileName; |
|
|
|||||
if(saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) |
||||||||||
{ |
SaveF |
|
|
|
->FileName); |
|
|
|||
resu t1->Modif ed = false; |
|
|
|
|
|
|||||
MyFileName = |
le(saveFileDialog1->FileName; |
|
|
|
|
|||||
}} |
|
|
|
|
|
|
|
|
|
|
Как видн , в теле ун ции отсутствует часть условной конструкции оператором else. |
||||||||||
|
После |
òîãî, êàê созданы все ункции главное |
полностью ункционально, |
|||||||
можно добавлять на орму контекстное всплывающее меню и кнопки быстрого доступа. |
||||||||||
|
Контекстные меню р ализуются при помощи элемента ContextMenuStrip: добавь• |
|||||||||
те на орму два таких элемента. Первое конт кстное меню будет по ункциональности |
||||||||||
совпадать с меню File. Второе контекстное |
ìåíþ |
будет реализовывать те же ункции, |
||||||||
что и меню Edit. После добавления измените |
|
|
переменной Name у обоих меню: |
|||||||
для меню типа File укажите Name= ontextfile,значениедля меню типа Edit Name= ontextedit. |
||||||||||
Пусть также первое |
онтекстное меню будет привязано к орме: оно будет возникать при |
|||||||||
щелчке правой |
кнопкой мыши в любом месте ормы. Для того, чтобы о уществить та• |
|||||||||
кую привязку, |
|
ыделите орму и |
|
|
ñïè |
свойств ормы. В списке свойс |
||||
найдите свойстâо ContextMenuStripперейдитев списке досткупных контекстных меню выберите |
||||||||||
ìåíþ ontextfile |
Аналогичным образом привяжите второе контекстное меню к окну |
|||||||||
редактора result1. |
После этого можно в каждое меню добавить нужные пункты. В меню |
|||||||||
ontextfile должны быть пункты Op n, New, Save, Save as..., Exit. В меню ontextedit |
||||||||||
д лжны быть пункты Copy, Cut, Paste. Значение переме ной Name для этих пунктов мож• |
||||||||||
íî оставить без изменения. Для пункта Paste задайте зíачение свойства Enabled равное |
||||||||||
false. |
Чтобы меню было нкциональным, достаточно |
событию Cli k каждого пункта |
||||||||
привязать уже существующóю соответствующую ункцию так же, как это было сделано |
||||||||||
выше для пункта Exit главного меню. Например, выделите пункт Open контекстного меню |
||||||||||
ontextfile и перейдите сп ску событий для этого пункта. Найдите событие Cli k |
||||||||||
укажите в строке имя |
óíêöèи mainopen_Cli k, которая была создана для открытия |
|||||||||
|
|
|
|
|
|
16 |
|
|
|
айла. Аналогично необходимо сделать для остальных пунктов меню. |
|||||||
|
В обработчики событий для пунктов Copy и Cut добавьте строку: |
||||||
pasteToolStripMenuItem->Enabled=true; |
|
|
|||||
д я того, чтобы действие Paste было доступно только после совершения операции Copy |
|||||||
èëи Cut.Па ель кнопок быстрого доступа реализуется при помощи элемента ToolStrip, ко• |
|||||||
торый |
нужно добав |
ь на орму. Задайте для него значение переменной Name=fastbuttons. |
|||||
После этого выделите эле |
|
т ToolStrip и вызовите для него контекстное всплываю• |
|||||
щее меню. В появившемся |
меню выбер е пункт Insert standart items. После этого на |
||||||
панели кнопок быстрого доступа появится набор стандартных кнопок. Оставьте кнопки |
|||||||
для операций Open, New, Save, Cut, Copy, Paste. Для кнопки Paste установите свойство |
|||||||
Enabled=false. |
для обработки событий Cli k для каждого пункта задайте в спи ке со• |
||||||
|
Функц |
||||||
бытий, указав имена |
уже существующих, как это было сделано для пунктов контекстного |
||||||
ìåíþ. |
В обработчики событий операций Cut и Copy добавьте строку: |
||||||
pasteToolStripBut on->Enabled=true; |
|
|
|||||
чтобы кнопка Paste |
|
кнопок быстрого доступа была доступна только после исполь• |
|||||
зования операций CutпанелиCopy. |
|
|
|
||||
|
2.4 Отображение текущего времени в строке статуса |
||||||
|
Строка статуса создается при помощи |
управления StripStatus. Содер• |
|||||
жимое строки состояния при этом выводится вэлементазна е свойства Text метки |
|||||||
toolStripStatusLabel1, которая создается по умол÷анию при добавлении элемента управ• |
|||||||
ления на орму. Измените значение переменн й Name этой метки на statuslabel. |
|||||||
|
Чтобы |
строке состояния отображалîсь текущ е знач |
ие времени, |
||||
орму добавить элемент управления Timer. Значение перемåííîé Name áó åò ïî óìîë• |
|||||||
нач нию равно timer1. Для элемента управления Timer существует только однонеобходимос бытие |
|||||||
Ti k, которое |
ыполняется каждый раз, когда истекает интервал таймера, заданный |
||||||
начением |
âа Interval. Для того, чтобы ункция для о |
события Ti k вы• |
|||||
çывалась разсвойст1 секунду, значение свойства Interval должно áы ь равно 1000. При этом |
|||||||
свойство Enabled элемента timer1 должно иметь значение trueработки, .е. таймер должен быть |
|||||||
активным. |
|
|
|
17 |
|
|
|
|
|
Таким образом, для того, чт бы раз в секунду в строке состояния калькулятора |
|||
обновлялись показания часов, необходимо написать обработчик события Ti k элемента |
||||||
timer1 следующим образом: |
|
|||||
priva e: System::Void timer1_Ti k(System::Obje t^ sender, System::EventArgs^ e) |
||||||
{ |
statuslabel->Text=System::Convert::ToString(System::DateTime::Now); |
|||||
} |
||||||
Здесь 1 раз в секунду (что определяется интервалом Interval=1000 таймера timer1) в |
||||||
свойство Text строки состояния |
значение ункции System::Da eTime::Now, |
|||||
которое |
|
предварительно преобразовановыводитсястроку при помощи метода ToString класса |
||||
Convert. |
|
управления Windows Forms |
||||
|
|
|
3.1Элементывыбора |
|
||
|
|
|
С помощью элементов Che kBoxможно создавать набо ы независимых переклю• |
|||
ч телей. Одновременно может быть выбрано любое число пеðеключателей. Поведение |
||||||
êàждого элемента определяется его свойствами: |
||||||
|
1) Text текстовая метка элемента; |
|
||||
|
2) |
|
|
|
ed признак выбора элемента; |
|
|
3) Che kState состояние переключателя: |
|||||
|
|
|
|
|
Che ked выбран (д ), |
|
|
|
|
U he ked не выбран (нет), |
|
||
|
|
Indeterminate состояние неизвестно; |
||||
|
4) Appearan e определяет орму появления компонента (в виде обычного лажка |
|||||
|
|
или в виде кнопки); |
|
5) ThreeState задает поддержку двух (ThreeState = false)
или трех (ThreeState = true) состояний. Если значение ThreeState установлено Indeterminateв true, то свойство; Che ked всегда возвращает true для состояний Che ked или
18
7)6) CheFlatStylekAlign определяетсвойство, |
стиль появленияот рыть выпадающий список, где можно вы• |
|||||||
|
брать схему размещения |
позволяющеелажка поле компонента;. |
|
|
|
|
||
|
3.2 Компонент календарь DateTimePi ker и класс DateTime |
|
||||||
|
Компонент DateTimePi ker находится в списке Common Controls палитры компо• |
|||||||
нентов и позволяет пользователю выбирать необходимую дату или время |
отображать |
|||||||
их на орме. Свойство Format определяет характер отображаемой |
ин ормации: |
|||||||
1) Long длинный ормат отображения даты в виде dd MMMM yyyy (например, |
||||||||
|
12 апреля 2007 г.); |
|
|
|
|
|
|
|
2) Short ê |
откий ормат отображения даты в виде dd.MM.yyyy (например, 12.04.2007); |
|||||||
3) |
Time ормат отображения времени; |
|
|
|
|
|||
4) |
Custom |
пользовательскийми, принятыми |
ормат отображения даты или времени, строка ормата |
|||||
|
с правил |
среде р зработки (см. раздел 3.3). |
|
|
||||
|
при этом задается свойстве CustomFormat элемента DateTimePi ker в соответствии |
|||||||
При выборе даты или |
(это задается в свойстве Format) компонент может пред• |
|||||||
ставляться в двух ормах:временивиде рямоугольного поля, в котором высвечивается дата |
||||||||
или время, и в виде выпадающего сïиска с датами. |
хранится как значение его |
|||||||
|
Выбранная с помощью DateTimePi ker дата или |
|||||||
свойства Value, откуда ее можно брать (или присваивать)времярежиме исполнения приложе• |
||||||||
íèÿ. |
3.3 |
è |
|
орматирование даты |
времени |
|||
|
Ñòàí |
орма ированиепользовательскоесостоит применении набора симв лов |
||||||
рования, преСтандартноеставленных в таблице 1. Åñëè çàä íî |
|
орматирование ормати•даты, |
||||||
мвола орматирования нет в таблице, которая хрстандартн ответствующем классе, то |
||||||||
вания) зависит от региональных |
установок вашего компьютера, строказадав емых чер з панель |
|||||||
ñèстема выдаст ошибку. Вид рез льтата орматировàíèòñÿ(ò. |
. |
|
после орматиро• |
|||||
управления. Компьютеры с различными региональными установками будут, |
естественно, |
|||||||
выдавать разные результаты орматирования. |
|
|
|
|
||||
|
|
|
|
19 |
|
|
|
|