Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_ПОА_2005_Builder.doc
Скачиваний:
7
Добавлен:
03.05.2019
Размер:
1.26 Mб
Скачать

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

квадратная 5x5 Alt+A

произвольная

диагональная

треугольная

симметрическая

ортогональная

Отметим, что головные разделы Формирование квадратных матриц, Операции с матрицей вводятся точно так же, как и названия разделов. В разделе квадратная 5x5 Alt+A свойство Default следует установить в true, а в свойство ShortCut («горячие» клавиши) – вписать Alt+A.

  1. В указанные ниже разделы введите следующие подразделы:

произвольная | неособенная диагональная | единичная

| особенная | трехдиагональная

| ленточная

треугольная | нижняя | квазидиагональная

| верхняя

симметрическая | общего вида

| положительно определенная

| кососимметрическая

Для этого, не выходя из Конструктора Меню, после выделения нужного раздела щелчком правой кнопкой вызовите контекстное меню и выберите пункт Создать подменю.

Операции с матрицей

вычисление определителя Ctrl+A обращение | вычисление m - нормы

вычисление ранга Ctrl+B | вычисление k – нормы

вычисление следа Ctrl+C | вычисление l - нормы

––––––––––––––––––––––––––––––

транспонирование Ctrl+D

«Горячие» клавиши в разделах под головным разделом Операции с матрицей выбираются в свойстве ShortCut из выпадающего списка. В свойство Caption раздела, следующего за разделом вычисление следа Ctrl+C, введите символ '–‘, чтобы вместо раздела появился разделитель. Для раздела обращение свойство Break установите в mbBreak, а для раздела вычисление m–нормы – в mbBarBreak.

  1. Со страницы Стандарт перенесите на форму компонент Memo1. Установите шрифт (Font) Courier, полужирный. С этой же страницы перенесите на форму кнопку Button1, назовите ее ПЕРЕХОД НА 1-Ю ВСПОМОГАТЕЛЬНУЮ ФОРМУ, а в обработчик щелчка на кнопке впишите оператор: Form2->Show();

Этот оператор покажет пользователю окно 1-й вспомогательной формы Form2.

  1. В файле 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]);}

}

  1. В обработчик щелчка на разделе квадратная 5x5 Alt+A впишите:

n=m=5;

form();

  1. В обработчик щелчка на подразделе единичная впишите:

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]);}

  1. В обработчик щелчка на разделе транспонирование Ctrl+D впишите:

transp();

  1. Командой Файл|Новый|Форма добавьте в проект первую вспомогательную форму Form2 и назовите ее 1-Я ВСПОМОГАТЕЛЬНАЯ ФОРМА. Сохраните файл модуля под именем по умолчанию Unit2. Со страницы Стандарт на форму перенесите компонент MainMenu1, двойным щелчком на нем перейдите в Конструктор Меню (окно Form2-> MainMenu1) и сконструируйте следующее меню:

Формирование прямоугольных матриц Операции с двумя матрицами

заполненная 4x5 сложение

заполненная общего вида вычитание

разреженная умножение

строка объединение по горизонтали

столбец объединение по вертикали

  1. Поместите на 1-ю вспомогательную форму кнопку Button1, назовите ее ПЕРЕХОД НА ГЛАВНУЮ ФОРМУ, а в обработчик щелчка на ней впишите оператор:

Form1->Show();

Этот оператор покажет пользователю окно главной формы Form1. Чтобы компилятор понял операторы Form2->Show(); и Form1->Show();

надо в модуль главной формы Unit1.cpp вставить ссылку на заголовочный файл модуля 1-й вспомогательной формы Unit2.h #includeUnit2.h и в модуль 1-й вспомогательной формы Unit2.cpp вставить ссылку на заголовочный файл модуля главной формы Unit1.h: #includeUnit1.h.

Примечания. Для перехода из одного модуля в другой пользуйтесь быстрой кнопкой Вид модуля (в самом верхнем ряду кнопок первая слева) или комбинацией клавиш Ctrl+F12. Для перехода с одной формы на другую пользуйтесь быстрой кнопкой Вид формы (в самом верхнем ряду кнопок вторая слева) или комбинацией клавиш Shift+F12. Для перехода с формы на модуль пользуйтесь быстрой кнопкой Переключатель Форма|Модуль (в самом верхнем ряду кнопок третья слева) или клавишей F12.

  1. В файле 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();

  1. В обработчик щелчка на разделе заполненная 4x5 впишите:

n=4; m=5;

form();

  1. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что во время выполнения пользователю доступны обе формы.

  2. В окне Form2->MainMenu1 Конструктора Меню установите для головного раздела Операции с двумя матрицами и для его разделов GroupIndex=3, RadioItem=true, AutoCheck=true. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что данные разделы стали работать как радиокнопки.

  3. Для головного раздела Формирование прямоугольных матриц и для его разделов установите GroupIndex=2, для головного раздела Формирование квадратных матриц и для его разделов и подразделов установите GroupIndex=2, а для головного раздела Операции с матрицей и для его разделов установите GroupIndex=4.

  4. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что объединения меню не происходит при переходе на 1-ю вспомогательную форму (тогда она активизируется).

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

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

  7. В заключение для компонента 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();

  1. В обработчик щелчка на разделе транспонирование Ctrl+D впишите:

transp();

  1. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в том, что контекстное меню появляется при щелчке правой кнопкой мыши как на главной форме, так и на компоненте 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: #includeUnit2.h”.

  1. На 2-ю вспомогательную форму перенесите со страницы Стандарт два списка ListBox, разместив их по горизонтали в верхней части формы, кнопку Button1, поместив ее внизу справа, а со страницы Win32 – компонент HotKey1, поместив его внизу слева. В компоненте HotKey1 сотрите с помощью Инспектора Объектов значение по умолчанию (Alt+A) свойства HotKey. Кнопку назовите OK. Затем со страницы Стандарт перенесите три метки Label. Первую – поместите над первым списком ListBox1 и назовите МЕНЮ, вторую – поместите над вторым списком ListBox2 и назовите РАЗДЕЛ, третью – поместите над HotKey1 и назовите ГОРЯЧИЕ КЛАВИШИ.

В списке ListBox1 будут отображаться головные разделы меню, в ListBox2 – разделы меню, соответствующие выбранному головному разделу. В окне HotKey1 в место предварительно помещенного туда курсора отобразится сочетание нажатых «горячих» клавиш, соответствующее выбранному разделу. При нажатии кнопки OK будет зафиксирован в меню сделанный пользователем выбор «горячих» клавиш и будет закрыта 2-я вспомогательная форма.

  1. Теперь впишите обработчики событий:

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.

  1. После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в правильной работе приложения. При щелчке на разделе настройка откроется 2-я вспомогательная форма. При щелчке пользователя на списке ListBox2 происходит загрузка компонента HotKey1 символами «горячих» клавиш выбранного пользователем раздела. Если раздел не имеет «горячих» клавиш, то в окне HotKey1 отображается текст “Нет”. Далее пользователь может войти в окно HotKey1 и нажать сочетание «горячих» клавиш, которое он хочет назначить выбранному им разделу меню. Обработка щелчка на кнопке OK фиксирует это сочетание в разделе меню и закрывает 2-ю вспомогательную форму.

Библиографический список

  1. Архангельский АЯ Программирование в C++Builder 6. – М: ЗАО «Издательство БИНОМ», 2003 – 1152 с – С 209–217.

  2. Шамис В.А. Borland C++ Builder 6. Для профессионалов / В.А. Шамис.− СПб.: Питер, 2003.− 798 с. – С. 290−293, 338–339.

ЛАБОРАТОРНАЯ РАБОТА 8

Отображение хода длительных процессов.

Кнопки, индикаторы, управляющие элементы.

Панели и компоненты внешнего оформления

Компоненты ProgressBar и CGauge

Компоненты ProgressBar со страницы Win32 и Cgauge со страницы Примеры предназначены для отображения хода процессов, занимающих заметное время, например, копирования больших файлов, настройку приложения, установку приложения на компьютере и т.п. Основные свойства этих компонентов различаются лишь именами:

Свойство

Progressbar

Свойство

CGauge

Описание

Max

MaxValue

Максимальное значение позиции (Position, Prog-ress), которое соответствует завершению отобра-жаемого процесса. По умолчанию задается в про-центах − 100

Min

MinValue

Начальное значение позиции (Position, Progress), которое соответствует началу отображаемого про-цесса

Position

Progress

Позиция, которую можно задавать по мере проте-кания процесса, начиная со значения Min или Min-Value в начале процесса, и кончая значением Max или MaxValue в конце. Если минимальное и мак-симальное значения выражены в процентах, то по-зиция − это процент завершенной части процесса

Smooth

Непрерывное (при значении true) или дискретное отображение процесса

Step

Шаг приращения позиции, используемый в методе Steplt. Значение по умолчанию − 10

Orientation

Ориентация шкалы компонента: pbHorizontal − горизонтальная, pbVertical − вертикальная. Если задана pbVertical, то компонент надо вытянуть по вертикали

ForeColor

Цвет заполнения

ShowText

Текстовое отображение процента выполнения на фоне диаграммы

Kind

Тип диаграммы: gkHorizontalBar − горизонталь-ная полоса, gkVerticalBar − вертикальная полоса, gkPie − круговая диаграмма, gkNeedle − сектор-ная диаграмма, gkText − отображение текстом

Отображение хода процесса можно осуществлять, задавая значение позиции − Position в ProgressBar или Progress в CGauge. Например, если полная длительность процесса характеризуется значением целой переменной Count, а выполненная часть − целой переменной Current, то задавать позицию диаграммы в случае, если используются значения минимальной и максимальной позиции по умолчанию (т.е. 0 и 100), можно операторами

ProgressBar1->Position=100*Current/Count;

или

CGauge1->Progress=100*Current/Count;

соответственно для ProgressBar и CGauge.

Можно поступать иначе: задать сначала значение максимальной величины равным Count, а затем в ходе процесса задавать позицию равной Current. Например:

CGauge1->MaxValue=Count;

…………………………………..

CGauge1->Progress=Current;

Компонент ProgressBar имеет два метода, которыми тоже можно воспользоваться для отображения процесса: StepBy(Delta: Integer) − увеличение позиции на заданную величину Delta, и StepItувеличение позиции на один шаг, величина которого задается свойством Step.

Задание 1. Ознакомиться с примерами применения компонентов ProgressBar и CGauge.

  1. Создайте для проекта приложения каталог (папку Windows), запустите C++Builder 6, создайте новый проект и командой Сохранить все сразу сохраните файл модуля и файл проекта под разными именами.

  2. В свойство Caption формы впишите ProgressBar и CGauge. В левой части формы поместите панель Panel1, в свойство Caption которой впишите ProgressBar жирным шрифтом, красного цвета, размером 18.

  3. На панель поместите два компонента ProgressBar. В одном компоненте свойство Smooth задайте равным true, в другом − равным false. Свойство Orientation в одном компоненте задайте равным pbHorizontal, во втором − равным pbVertical. Второй компонент следует вытянуть по вертикали.

  4. В правой части формы сверху разместите метку Label1, в свойство Caption которой впишите CGauge жирным шрифтом, красного цвета, размером 18. На одной вертикали с меткой поместите четыре компонента CGauge, а пятый − слева от четвертого. Свойство Kind задайте соответственно равным gkText, gkHorizontalBar, gkNeedle, gkPie, gkVerticalBar. Свойство ForeColor задайте во всех компонентах по-разному, свойство ShowTextравным true, шрифт Fontжирным, размером 18.

  5. Под панелью разместите кнопку Button1, свойство Caption которой замените на слово ЗАПУСК жирным шрифтом, размером 18. В обработчик щелчка на кнопке впишите (курсив)

void __fastcall TForm1::Button1Click(TObject *Sender)

{

int count=1000;

ProgressBar2->Max=count;

ProgressBar2->Step=1;

for(int i=1;i<=count;i++)

{

ProgressBar1->Position=100*i/count;

ProgressBar2->StepIt();

CGauge1->Progress=100*i/count;

CGauge2->Progress=100*i/count;

CGauge3->Progress=100*i/count;

CGauge4->Progress=100*i/count;

CGauge5->Progress=100*i/count;

for(int j=0;j<100000;j++);

}

}

  1. Сохраните проект и выполните приложение. Нажимая на кнопку ЗАПУСК, убедитесь в работоспособности приложения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]