Формирование квадратных матриц

квадратная 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.Теперь для компонента MainMenu11-й вспомогательной формы установите свойство AutoMerge в true. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что при переходе на 1-ю вспомогательную форму появляется объединенное меню на главной форме с заменами разделов меню главной формы разделами меню 1-й вспомогательной формы, имеющих GroupIndex=2.

19.И, наконец, для головного раздела Формирование прямоугольных матриц и для его разделов установите GroupIndex=1. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что при переходе на 1-ю вспомогательную форму на главной форме появляется объединенное меню со всеми разделами объединяемых меню.

20.В заключение для компонента MainMenu11-й вспомогательной формы установите свойство 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-ю вспомогательную форму.