Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методическое пособие для самостоятельных работ.doc
Скачиваний:
22
Добавлен:
16.11.2019
Размер:
2.89 Mб
Скачать

Var tf5:tForm2;

begin

TF5:=TForm2.Create(Self);

TF5.Show;

end;

Рис. 4.5. Взаимодействие окон

В новой форме будут две строки для текста, пункт меню для переноса текста из одной строки в другую и кнопка для закрытия окна. Для обеспечения преобразования меню необходимо:

  1. Активизировать в главной форме Designer Menu (двойным щелчком на его обозначении), выделить пункт меню File и в инспекторе объектов обратим внимание на свойство GroupIndex. По умолчанию оно равно нулю. Это свойство и управляет слиянием меню главного и дочернего окон при открытии последнего. Передвигаемся по пунктам горизонтального меню и присвоим свойству Group Index следующие значения для пунктов меню:

File 10

Window 20

Help 30

Если предполагается видоизменение меню в зависимости от того, какое дочернее окно открыто, то целесообразно уже на стадии создания меню главного окна присвоить этому свойству его пунктов значения с шагом, например 10.

  1. После этого вернемся к новой форме (Form2). Перенесем на нее компоненту Main Menu и создадим единственный пункт меню Control Text со значением свойства Group Index, равным 25. Реализация приведена ниже:

procedure TForm2.ControlText1Click(Sender: TObject);

begin

Edit2.Text:=Edit1.Text;

end;

procedure TForm2.Button1Click(Sender: TObject);

begin

Close;

end;

procedure TForm2.FormClose(Sender: TObject;

var Action: TCloseAction);

begin

Action:=caFree;

end;

Назначение остальных двух процедур ясно из предыдущего изложения. Обращаем внимание на то, что свойство GroupIndex влияет только на взаимодействие пунктов горизонтального меню. При необходимости менять выпадающее меню, оно должно создаваться в подчиненном окне заново, включая и неизменяемые пункты.

4.3. Разработка sdi–приложения

4.3.1. Простое sdi–приложение

SDI–приложение состоит из нескольких независимых окон. Эти окна могут открываться сразу при запуске приложения или создаваться и уничтожаться динамически в ходе его выполнения. Каждое окно может иметь свое меню. Из-за отсутствия главного окна невозможно управлять расположением и/или поведением окон так просто, как это делалось в MDI–приложениях. Управление окнами придется программировать самому автору приложения. Вид экрана при запуске нашего приложения приведен на рис. 4.6.

Рис. 4.6. SDI–приложение

В приложении будут следующие формы:

  • Form1 – для ввода размерности массива и управления приложением в целом (форма создается автоматически).

  • Form2 – для вывода результатов (создается автоматически).

  • Form3 – для ввода элементов массива (форма создается и уничтожается динамически).

  • Окно About (создается автоматически).

Для Form2 в группе свойств BorderIcons свойство biSystemMenu имеет значение False для предотвращения случайного закрытия этой формы.

Вид экрана при открытой Form3 приведен на рис. 4.7.

Рис. 4.7. Открытие формы Form3

В модуле первой формы необходимы следующие дополнительные объявления:

Const

N=10;

M=10;

var

nn1,mm1 :integer;

mas1 :array[1..N,1..M] of integer;

Автоматически открывается только одна форма – первая по порядку. Для открытия второй формы придется в состав ее модуля включить процедуру:

procedure Tform2.FormCreate(Sender: TObject);

begin

form2.Show;

end;

Для открытия окна “О программе” имеется процедура:

procedure TForm1.N3Click(Sender: TObject);

{Реализуется при выборе “О программе”}

begin

AboutBox.ShowModal;

end;

  1. При использовании названий пунктов меню на русском языке Delphi присваивает им имена N1,N2,… которые при желании могут быть изменены (свойство Name).

  2. Модальными называют окна, до закрытия которых все действия заблокируются.

Для присвоения начальных значений переменным при запуске приложения служит процедура:

procedure TForm1.FormCreate(Sender: TObject);

begin

nn1:=1; {Количество строк }

mm1:=1; {Количество столбцов}

end;

Реализация пункта меню “Ввод массива”:

procedure TForm1.N1Click(Sender: TObject);

Var

F3:Tform3;

begin

if (Edit1.Text='')or(Edit2.Text='') then

ShowMessage('Необходимо задать размерность массива')

else

begin

nn1:=StrToInt(Edit1.Text);

mm1:=StrToInt(Edit2.Text);

if (nn1<2)or(nn1>10)or(mm1<2)or(mm1>10) then

ShowMessage('Размерность массива должна быть в интервале от 2 до 10')

else

begin

N1.Enabled:=false; {До закрятия этой формы невозможно }

{создать другой ее экземпляр; соответствующий }

{ пункт меню будет «серым» }

f3:=Tform3.Create(Application);

f3.Show;

end

end;

end;

Рассмотрим реализацию модуля третьей формы. При создании формы:

procedure Tform3.FormCreate(Sender: TObject);

{Эта процедура запускается каждый раз при создании формы}

Var i:byte;

begin

StringGrid1.ColCount:=mm1+1;

{Определим количество столбцов в исходном массиве }

StringGrid1.RowCount:=nn1+1;

{Определим количество строк в исходном массиве }

for i:=1 to nn1 do

StringGrid1.Cells[0,i]:=IntToStr(i);

{Вставим номера строк и столбцов }

for i:=1 to mm1 do

Stringgrid1.Cells[i,0]:=IntToStr(i);

end;

При работе с объектом StringGrid не забудьте изменить его свойство Options – goEditing: по умолчанию false, что означает использование массива только для вывода.

При завершении ввода элементов массива и нажатии кнопки Cancel выполняется процедура (без сохранения введенных значений):

procedure TForm3.Button2Click(Sender: TObject);

begin

{Освободим пункт меню для создания новых форм }

Form1.N2.Enabled:=True;

close;

end;

При завершении ввода элементов массива и нажатии кнопки OK выполняется процедура (с сохранением введенных значений в массиве модуля Form1):

procedure TForm3.Button1Click(Sender: TObject);

Var