квадратная 5x5 Alt+A
произвольная
диагональная
треугольная
симметрическая
ортогональная
Отметим, что головные разделы Формирование квадратных матриц, Операции с матрицей вводятся точно так же, как и названия разделов. В разделе квадратная 5x5 Alt+A свойство Default следует установить в true, а в свойство ShortCut («горячие» клавиши) – вписать Alt+A.
4. В указанные ниже разделы введите следующие подразделы:
произвольная | неособенная диагональная | единичная
| особенная | трехдиагональная
| ленточная
треугольная | нижняя | квазидиагональная
| верхняя
симметрическая | общего вида
| положительно определенная
| кососимметрическая
Для этого, не выходя из Конструктора Меню, после выделения нужного раздела щелчком правой кнопкой вызовите контекстное меню и выберите пункт Создать подменю.
Операции с матрицей
вычисление определителя Ctrl+A обращение | вычисление m - нормы
вычисление ранга Ctrl+B | вычисление k – нормы
вычисление следа Ctrl+C | вычисление l - нормы
––––––––––––––––––––––––––––––
транспонирование Ctrl+D
«Горячие» клавиши в разделах под головным разделом Операции с матрицей выбираются в свойстве ShortCut из выпадающего списка. В свойство Caption раздела, следующего за разделом вычисление следа Ctrl+C, введите символ '–‘, чтобы вместо раздела появился разделитель. Для раздела обращение свойство Break установите в mbBreak, а для раздела вычисление m–нормы – в mbBarBreak.
5. Со страницы Стандарт перенесите на форму компонент Memo1. Установите шрифт (Font) Courier, полужирный. С этой же страницы перенесите на форму кнопку Button1, назовите ее ПЕРЕХОД НА 1-Ю ВСПОМОГАТЕЛЬНУЮ ФОРМУ, а в обработчик щелчка на кнопке впишите оператор: Form2->Show();
Этот оператор покажет пользователю окно 1-й вспомогательной формы Form2.
6. В файле Unit1.cpp после определения конструктора поместите следующие объявления и определения (курсив):
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
extern int r[50][50],a[50][50],n,m;
extern AnsiString s[50][50],s1[50];
//---------------------------------------------------------------------------
void form()
{ int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
r[i][j]=random(10);
Form1->Memo1->SetFocus();
Form1->Memo1->Clear();
for(i=0;i<n;i++){
s1[i]="";
for(j=0;j<m;j++){
s[i][j]=" "+IntToStr(r[i][j]);
s1[i]+=s[i][j];}
Form1->Memo1->Lines->Add(s1[i]);}
}
//---------------------------------------------------------------------------
void transp()
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
a[j][i]=r[i][j];
i=n;n=m;m=i;
Form1->Memo1->SetFocus();
Form1->Memo1->Clear();
for(i=0;i<n;i++){
s1[i]="";
for(j=0;j<m;j++){
s[i][j]=" "+IntToStr(a[i][j]);
s1[i]+=s[i][j];}
Form1->Memo1->Lines->Add(s1[i]);}
}
7. В обработчик щелчка на разделе квадратная 5x5 Alt+A впишите:
n=m=5;
form();
8. В обработчик щелчка на подразделе единичная впишите:
n=m=5;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(i==j)r[i][j]=1;
else r[i][j]=0;
Memo1->SetFocus();
Memo1->Clear();
for(i=0;i<n;i++){
s1[i]="";
for(j=0;j<m;j++){
s[i][j]=" "+IntToStr(r[i][j]);
s1[i]+=s[i][j];}
Memo1->Lines->Add(s1[i]);}
9. В обработчик щелчка на разделе транспонирование Ctrl+D впишите:
transp();
10. Командой Файл | Новый | Форма добавьте в проект первую вспомогательную форму Form2 и назовите ее 1-Я ВСПОМОГАТЕЛЬНАЯ ФОРМА. Сохраните файл модуля под именем по умолчанию Unit2. Со страницы Стандарт на форму перенесите компонент MainMenu1, двойным щелчком на нем перейдите в Конструктор Меню (окно Form2-> MainMenu1) и сконструируйте следующее меню:
Формирование прямоугольных матриц Операции с двумя матрицами
заполненная 4x5 сложение
заполненная общего вида вычитание
разреженная умножение
строка объединение по горизонтали
столбец объединение по вертикали
11. Поместите на 1-ю вспомогательную форму кнопку Button1, назовите ее ПЕРЕХОД НА ГЛАВНУЮ ФОРМУ, а в обработчик щелчка на ней впишите оператор:
Form1->Show();
Этот оператор покажет пользователю окно главной формы Form1. Чтобы компилятор понял операторы Form2->Show(); и Form1->Show();
надо в модуль главной формы Unit1.cpp вставить ссылку на заголовочный файл модуля 1-й вспомогательной формы Unit2.h #include “Unit2.h” и в модуль 1-й вспомогательной формы Unit2.cpp вставить ссылку на заголовочный файл модуля главной формы Unit1.h: #include “Unit1.h”.
Примечания. Для перехода из одного модуля в другой пользуйтесь быстрой кнопкой Вид модуля (в самом верхнем ряду кнопок первая слева) или комбинацией клавиш Ctrl+F12. Для перехода с одной формы на другую пользуйтесь быстрой кнопкой Вид формы (в самом верхнем ряду кнопок вторая слева) или комбинацией клавиш Shift+F12. Для перехода с формы на модуль пользуйтесь быстрой кнопкой Переключатель Форма | Модуль (в самом верхнем ряду кнопок третья слева) или клавишей F12.
12. В файле Unit2.cpp после определения конструктора поместите следующие объявления (курсив):
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int r[50][50],a[50][50],n,m;
AnsiString s[50][50],s1[50];
void form();
void transp();
13. В обработчик щелчка на разделе заполненная 4x5 впишите:
n=4; m=5;
form();
14. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что во время выполнения пользователю доступны обе формы.
15. В окне Form2->MainMenu1 Конструктора Меню установите для головного раздела Операции с двумя матрицами и для его разделов GroupIndex =3, RadioItem = true, AutoCheck = true. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что данные разделы стали работать как радиокнопки.
16. Для головного раздела Формирование прямоугольных матриц и для его разделов установите GroupIndex =2, для головного раздела Формирование квадратных матриц и для его разделов и подразделов установите GroupIndex =2, а для головного раздела Операции с матрицей и для его разделов установите GroupIndex =4.
17. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что объединения меню не происходит при переходе на 1-ю вспомогательную форму (тогда она активизируется).
18. Теперь для компонента MainMenu1 1-й вспомогательной формы установите свойство AutoMerge в true. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что при переходе на 1-ю вспомогательную форму появляется объединенное меню на главной форме с заменами разделов меню главной формы разделами меню 1-й вспомогательной формы, имеющих GroupIndex =2.
19. И, наконец, для головного раздела Формирование прямоугольных матриц и для его разделов установите GroupIndex =1. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что при переходе на 1-ю вспомогательную форму на главной форме появляется объединенное меню со всеми разделами объединяемых меню.
20. В заключение для компонента MainMenu1 1-й вспомогательной формы установите свойство AutoMerge в false, введите команду Сохранить все и запуском на выполнение убедитесь в работоспособности приложения.
Перейдем к рассмотрению контекстного всплывающего меню. Это меню привязано к конкретным компонентам. Оно всплывает, если во время, когда данный компонент в фокусе, пользователь щелкнет правой кнопкой мыши. Обычно в контекстное меню включают те команды главного меню, которые в первую очередь могут потребоваться при работе с данным компонентом.
Контекстному меню соответствует компонент PopupMenu. Поскольку в приложении могут быть несколько контекстных меню, то и компонентов PopupMenu может быть несколько. Оконные компоненты: формы, панели, окна редактирования, а также метки и др. имеют свойство PopupMenu, которое по умолчанию пусто, но куда можно поместить имя того компонента PopupMenu, с которым будет связан данный компонент.
Формирование контекстного всплывающего меню производится с помощью Конструктора Меню, вызываемого двойным щелчком на PopupMenu, что совпадает с действиями для главного меню. Однако конструирование контекстного меню можно упростить по сравнению с конструированием главного меню. Поскольку разделы контекстного меню обычно повторяют некоторые разделы уже сформированного главного меню, то можно обойтись копированием соответствующих разделов.
Задание. Сформировать контекстное меню из разделов квадратная 5x5 Alt+A и транспонирование Ctrl+D.
1. На главную форму сохраненного выше проекта со страницы Стандарт перенесите компонент PopupMenu1 и двойным щелчком на нем перейдите в Конструктор Меню (окно Form1-> PopupMenu1). Затем щелкните правой кнопкой мыши и во всплывшем меню выберите команду Выбор меню… В окне Выбор меню выберите MainMenu1 и нажмите ОК.
2. В появившемся главном меню выделите нужный раздел или разделы (при нажатой клавише Shift выделяют разделы в заданном диапазоне, при нажатой клавише Ctrl выделяют совокупность разделов, не являющихся соседними). Затем скопируйте выделенный раздел или разделы в буфер обмена, нажав клавиши Ctrl+C. После этого опять щелкните правой кнопкой мыши, выберите команду Выбор меню… и вернитесь в контекстное меню. Укажите курсором место, в которое нужно вставить скопированный раздел или разделы, и нажмите клавиши чтения из буфера обмена – Ctrl+V. Разделы меню вместе со всеми их свойствами (но не событиями!) будут скопированы в создаваемое контекстное меню. Если же разделы, требуемые для переноса из главного меню в контекстное, находятся под разными заголовками (как в задании), то описанные выше действия необходимо выполнять для каждого раздела.
3. В свойство PopupMenu компонентов Form1 и Memo1 внесите PopupMenu1.
4. В обработчик щелчка на разделе квадратная 5x5 Alt+A впишите: n=m=5;
form();
5. В обработчик щелчка на разделе транспонирование Ctrl+D впишите:
transp();
6. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что контекстное меню появляется при щелчке правой кнопкой мыши как на главной форме, так и на компоненте Memo1.
Компонент HotKey, расположенный на странице Win32, является вспомогательным, обеспечивающим возможность задания самим пользователем «горячих» клавиш, определяющих быстрый доступ к разделам меню. К тому же этот компонент позволяет задать такие сочетания «горячих» клавиш, которые не предусмотрены в выпадающем списке свойства разделов меню ShortCut.
Основное свойство компонента – HotKey, равное по умолчанию комбинации клавиш Alt+A. Это свойство можно прочесть и присвоить свойству ShortCut какого-то раздела меню. Например, оператор
MOpen->ShortCut = HotKey1->HotKey;
присваивает разделу меню с именем MOpen комбинацию клавиш, заданную в компоненте HotKey1.
В заключение рассмотрим пример использования компонента HotKey и настройки «горячих» клавиш для меню на 1-й вспомогательной форме в процессе выполнения приложения.
1. Командой Файл | Новый | Форма добавьте в проект вторую вспомогательную форму Form3 и назовите ее 2-Я ВСПОМОГАТЕЛЬНАЯ ФОРМА – ГОРЯЧИЕ КЛАВИШИ. Сохраните файл модуля под именем по умолчанию – Unit3.
2. На 1-й вспомогательной форме добавьте в меню раздел настройка в головной раздел Формирование прямоугольных матриц. В обработчик команды настройка вставьте оператор
Form3->ShowModal();
Этот оператор покажет пользователю окно 2-й вспомогательной формы как модальное – т.е. пользователь не сможет вернуться в другую форму, пока не закроет 2-ю вспомогательную. Чтобы компилятор понял этот оператор, надо в модуль 1-й вспомогательной формы Unit2.cpp вставить ссылку на заголовочный файл модуля 2-й вспомогательной формы Unit3.h
#include “Unit3.h”.
Поскольку из модуля Unit3.cpp надо будет видеть меню модуля Unit2.cpp, то аналогичным образом введите и обратную связь – свяжите модуль Unit3 с Unit2: #include “Unit2.h”.
3. На 2-ю вспомогательную форму перенесите со страницы Стандарт два списка ListBox, разместив их по горизонтали в верхней части формы, кнопку Button1, поместив ее внизу справа, а со страницы Win32 – компонент HotKey1, поместив его внизу слева. В компоненте HotKey1 сотрите с помощью Инспектора Объектов значение по умолчанию (Alt+A) свойства HotKey. Кнопку назовите OK. Затем со страницы Стандарт перенесите три метки Label. Первую – поместите над первым списком ListBox1 и назовите МЕНЮ, вторую – поместите над вторым списком ListBox2 и назовите РАЗДЕЛ, третью – поместите над HotKey1 и назовите ГОРЯЧИЕ КЛАВИШИ.
В списке ListBox1 будут отображаться головные разделы меню, в ListBox2 – разделы меню, соответствующие выбранному головному разделу. В окне HotKey1 в местопредварительно помещенного туда курсора отобразится сочетание нажатых «горячих» клавиш, соответствующее выбранному разделу. При нажатии кнопки OK будет зафиксирован в меню сделанный пользователем выбор «горячих» клавиш и будет закрыта 2-я вспомогательная форма.
4. Теперь впишите обработчики событий:
void __fastcall TForm3::FormShow(TObject *Sender)
{
/*Загрузка ListBox1 головными разделами меню
при событии OnShow формы Form3 */
ListBox1->Clear();
for(int i=0; i<Form2->MainMenu1->Items->Count; i++)
ListBox1->Items->Add(Form2->MainMenu1->Items->Items[i]->Caption);
ListBox1->ItemIndex=0;
//Обращение к процедуре загрузки ListBox2
ListBox1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::ListBox1Click(TObject *Sender)
{
/* Загрузка ListBox2 разделами меню
MainMenu1->Items->Items[ListBox1->ItemIndex],
выделенного в ListBox1 пользователем и
при событии OnShow формы Form3 головного раздела меню */
ListBox2->Clear();
for(int i=0; i<Form2->MainMenu1->Items->Items[
ListBox1->ItemIndex]->Count; i++)
ListBox2->Items->Add(Form2->MainMenu1->Items->Items[
ListBox1->ItemIndex]->Items[i]->Caption);
ListBox2->ItemIndex=0;
// Обращение к процедуре ListBox2Click
ListBox2Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::ListBox2Click(TObject *Sender)
{
/* Занесение «горячих» клавиш выделенного в ListBox2 раздела
в компонент HotKey1*/
HotKey1->HotKey= Form2->MainMenu1->Items->Items[
ListBox1->ItemIndex]->Items[
ListBox2->ItemIndex]->ShortCut;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
/* Изменение «горячих» клавиш выбранного раздела меню
и закрытие 2-й вспомогательной формы */
Form2->MainMenu1->Items->Items[
ListBox1->ItemIndex]->Items[ListBox2->ItemIndex]->ShortCut
=HotKey1->HotKey;
Close();
}
//---------------------------------------------------------------------------
При событии OnShow формы Form2 происходит загрузка списка ListBox1 головными разделами меню. Цикл загрузки перебирает индексы от нуля до Form2->MainMenu1->Items->Count-1. Свойство Count равно числу головных разделов в меню.
При щелчке пользователя на списке ListBox1 происходит загрузка списка ListBox2. При этом к соответствующим разделам меню осуществляется доступ с помощью выражения Form2->MainMenu1->Items->Items[ ListBox1->ItemIndex]->Items[i]. В этом выражении Form2->MainMenu1->Items->Items[ListBox1->ItemIndex] – головной раздел меню, выбранный пользователем в ListBox1. Каждый такой раздел можно рассматривать как элемент массива меню и в то же время он сам является массивом разделов второго уровня. Поэтому его свойство Items[i] указывает на подраздел с индексом i. В конце данной процедуры вызывается процедура ListBox2Click, загружающая данные в HotKey1.
5. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в правильной работе приложения. При щелчке на разделе настройка откроется 2-я вспомогательная форма. При щелчке пользователя на списке ListBox2 происходит загрузка компонента HotKey1 символами «горячих» клавиш выбранного пользователем раздела. Если раздел не имеет «горячих» клавиш, то в окне HotKey1 отображается текст “ Нет ”. Далее пользователь может войти в окно HotKey1 и нажать сочетание «горячих» клавиш, которое он хочет назначить выбранному им разделу меню. Обработка щелчка на кнопке OK фиксирует это сочетание в разделе меню и закрывает 2-ю вспомогательную форму.