Целью шестой лабораторной работы является приобретение опыта работы с рядом стандартных компонент системы Delphi, взаимодействия между ними и разработка простой системы контекстной помощи. Последняя строится с использованием подготавливаемого студентом файла MSWord в формате *.rtf, и инструментального средства Microsoft Help Workshop. Описание основных этапов подготовки файла справки доступно студенту в электронном виде.
Материал Уч. Д1, необходимый для написания работы, –
LES01.htm – LES07.htm, LES10.htm
Материал Уч. Д2, необходимый для написания работы, –
Глава 3, пп. 1-3, Глава 4, пп. 1-2
Перечень основных компонент, необходимых для выполнения работы
TForm, TLabel, TButton, TRadioButton, TListBox, TComboBox, TGroupBox, Ttimer,TOKRightDlg, Timage, TOpenPictureDialog, TFontDialog, TColorDialog, TPagesDlg, TPageControl, TMediaPlayer, TstringGrid, MessageDlg, MessageBox
Пример разработки приложения с минимальной функциональностью.
Ниже приведена программа, обладающая следующей функциональностью. Имеется меню, содержащее пункты – Работа с компонентами и О программе,
Подпункты меню Работа позволяют работать с рядом стандартных компонент системы Delphi, открывая, при необходимости, дополнительную диалоговую (модальную) форму. Компоненты на главной форме приложения взаимно связаны, синхронизация готовности формы (в виде запроса на комплектующие компьютера) осуществляется с использованием проверки при генерации события таймера. Каждый видимый элемент (кроме меню) имеет номер контекстной справки, отсылающий к разделу справочной системы. Диалоговое окно О программе реализовано как отдельный модуль (форма) и (вследствие его простоты) в методичке не показано, но доступно на диске.
// Главная форма приложения
unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Unit2, StdCtrls, ExtCtrls, Unit5, MPlayer;
Type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
ListBox1: TListBox;
ComboBox1: TComboBox;
Label1: TLabel;
Label2: TLabel;
GroupBox1: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
GroupBox2: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Button1: TButton;
Button2: TButton;
CheckBox3: TCheckBox;
Timer1: TTimer;
procedure N11Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N12Click(Sender: TObject);
end;{class}
Var
Form1: TForm1;
Implementation
uses Unit4;
{$R *.dfm}
// Показать элементы формы
procedure ShowChoices;
begin
with Form1 do begin
Label1.Visible:=true; Label2.Visible:=true;
ComboBox1.Visible:=true; ListBox1.Visible:=true;
GroupBox2.Visible:=true; GroupBox1.Visible:=true;
Button1.Visible:=true; Button2.Visible:=true;
end;
end;{proc}
// Спрятать элементы формы
procedure HideChoices;
begin
with Form1 do begin
Label1.Visible:=false; Label2.Visible:=false;
ComboBox1.Visible:=false; ListBox1.Visible:=false;
GroupBox2.Visible:=false; GroupBox1.Visible:=false;
Button1.Visible:=false; Button2.Visible:=false;
end;
end;{proc}
// Запомнить комбинированный список в соответствии с выбором типа процессора
procedure FillComboBox;
begin
with Form1 do begin
if RadioButton1.Checked then begin
// Intel Platform
ComboBox1.Clear;
ComboBox1.AddItem('Pentium II 600Mz',nil);
ComboBox1.AddItem('Celeron 900Mz',nil);
ComboBox1.AddItem('Pentium III 1100Mz',nil);
end else begin
ComboBox1.Clear;
ComboBox1.AddItem('AMD K6 600Mz',nil);
ComboBox1.AddItem('AMD K7 900Mz',nil);
ComboBox1.AddItem('AMD K7 1500Mz',nil);
// AMD platform
end;
end;
end;{proc}
// Выбор пункта меню «О программе»
procedure TForm1.N11Click(Sender: TObject);
begin
Form2:=TForm2.Create(self);
end;{proc}
// Выбор пункта меню «Выход»
procedure TForm1.N10Click(Sender: TObject);
begin
Close;
end; {proc}
// Выбор пункта меню “Cписки”
procedure TForm1.N2Click(Sender: TObject);
begin
ShowChoices;
Label1.Visible:=true;
Label2.Visible:=true;
ListBox1.Enabled:=true;
if(GroupBox2.Enabled) then begin
ComboBox1.Enabled:=true;
end;
Button2.Enabled:=true;
end; {proc}
//Выбор кнопки Cancel на форме
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
MessageDlg('Вы отказались от выбора',
mtInformation, [mbOK], 0);
HideChoices;
ListBox1.Enabled:=false;
ComboBox1.Enabled:=false;
Button1.Enabled:=false;
Label1.Visible:=false;
Label2.Visible:=false;
Button2.Enabled:=false;
GroupBox1.Enabled:=false;
GroupBox2.Enabled:=false;
end; {proc}
//Выбор пункта меню “Кнопки”
procedure TForm1.N4Click(Sender: TObject);
begin
ShowChoices;
Button2.Enabled:=true;
GroupBox1.Enabled:=true;
end; {proc}
// Выбор пункта меню “Радиокнопки”
procedure TForm1.N5Click(Sender: TObject);
begin
ShowChoices;
Button2.Enabled:=true;
if(ListBox1.Enabled) then begin
// пункт меню Списки был выбран ранее
GroupBox2.Enabled:=true;
ComboBox1.Enabled:=true;
end;
RadioButton1.Checked:=true;
FillComboBox;
end; {proc}
// нажатие на радиокнопку Intel
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
FillComboBox;
Form1.ComboBox1.ItemIndex:=0;
end; {proc}
// нажатие на радиокнопку AMD
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
FillComboBox;
Form1.ComboBox1.ItemIndex:=0;
end; {proc}
// проверка готовности заполнения формы
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ((ComboBox1.ItemIndex<>-1) AND
(ListBox1.ItemIndex<>-1) AND
(GroupBox1.Enabled) AND
(GroupBox2.Enabled))
then begin
Button1.Enabled:=True;
end;
end; {proc}
// Обработка нажатия кнопки «Готово»
procedure TForm1.Button1Click(Sender: TObject);
var st: string;
begin
st:= 'Ваш выбор'+#13+#13+
' Процессор '+ComboBox1.Items[ListBox1.ItemIndex]+ #13+
' жесткий диск '+ListBox1.Items[ListBox1.ItemIndex] + #13;
if(CheckBox1.Checked) then begin
st:=st+' Модем'+#13;
end;
if(CheckBox2.Checked) then begin
st:=st+' '+CheckBox2.Caption+#13;
end;
if(CheckBox3.Checked) then begin
st:=st+' '+CheckBox3.Caption+#13;
end;
ShowMessage(st);
HideChoices;
ListBox1.Enabled:=false;
Label1.Visible:=false;
Label2.Visible:=false;
ComboBox1.Enabled:=false;
Button1.Enabled:=false;
Button2.Enabled:=false;
GroupBox1.Enabled:=false;
GroupBox2.Enabled:=false;
end; {proc}
// Пункт меню «Диалоги»
procedure TForm1.N6Click(Sender: TObject);
begin
if OKRightDlg.ShowModal= mrCancel then begin
Beep;
end else begin
end;
end; {proc}
// Пункт меню «Мультимедиа»
procedure TForm1.N8Click(Sender: TObject);
begin
// открыт для работы с плэйером
Timer1.Enabled:=false; //таймер был нужен для синхронизации в части 1
PagesDlg.PageControl1.TabIndex:=0;
PagesDlg.Label1.Visible:=True;
PagesDlg.Label2.Visible:=false;
PagesDlg.Button1.Visible:=false;
PagesDlg.OKBtn.enabled:=true;
if(PagesDlg.ShowModal=1) then begin
// закончился по кнопко ОК
PagesDlg.Label1.Visible:=false;
end else begin
PagesDlg.OKBtn. enabled:=false;
PagesDlg.Label1.Visible:=false;
beep;
// закончился через Cancel или закрытие окна
end;
end; {proc}
// Пункт меню «Таблица»
procedure TForm1.N7Click(Sender: TObject);
begin
// открыт для работы с таблицей
Timer1.Enabled:=false; //таймер был нужен для синхронизации в части 1
PagesDlg.Timer1.Enabled:=True; //таймер нужен для оценки готовности таблицы 1
PagesDlg.PageControl1.TabIndex:=1;
PagesDlg.StringGrid1.Enabled:=true;
PagesDlg.TableClear;
if(PagesDlg.ShowModal=1) then begin
// закончился по кнопко ОК
end else begin
beep;
// закончился через Cancel или закрытие окна
end;
PagesDlg.OKBtn.enabled:=false;
PagesDlg.Timer1.Enabled:=false; //таймер нужен для оценки готовности таблицы 1
end; {proc}
// Выбор пункта меню «Мини Помощь»
procedure TForm1.N12Click(Sender: TObject);
begin
winhelp(Form1.Handle,'project_l2_6.hlp',HELP_CONTEXT,1);
end; {proc}
end. //unit1
// Диалоговая (модальная) форма для стандартных диалогов
unit Unit4;
Interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, Dialogs, ExtDlgs;
Type
TOKRightDlg = class(TForm)
OKBtn: TButton;
CancelBtn: TButton;
Bevel1: TBevel;
OpenPictureDialog1: TOpenPictureDialog;
FontDialog1: TFontDialog;
ColorDialog1: TColorDialog;
Image1: TImage;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;{class}
Var
OKRightDlg: TOKRightDlg;
Implementation
{$R *.dfm}
// Обработка нажатия кнопки диалога выбора картинки
procedure TOKRightDlg.BitBtn1Click(Sender: TObject);
begin
if (OpenPictureDialog1.Execute)then begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
end; {proc}
// Обработка нажатия кнопки диалога выбора фонта
procedure TOKRightDlg.BitBtn2Click(Sender: TObject);
begin
if (FontDialog1.Execute)then begin
BitBtn2.Font:=FontDialog1.Font;
end;
end; {proc}
// Обработка нажатия кнопки диалога выбора цвета
procedure TOKRightDlg.BitBtn3Click(Sender: TObject);
begin
if(ColorDialog1.Execute)then begin
OKRightDlg.Color:=ColorDialog1.Color;
end;
end; {proc}
end. // unit4;
// Диалоговая форма для демонстрации страничного доступа, работы с таблицей и использования медиапроигрывателя.
unit Unit5;
Interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ComCtrls, ExtCtrls, MPlayer, Grids,QDialogs;
Type
TPagesDlg = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
OKBtn: TButton;
CancelBtn: TButton;
StringGrid1: TStringGrid;
MediaPlayer1: TMediaPlayer;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Label3: TLabel;
Timer1: TTimer;
procedure FormActivate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure TableClear;
procedure Timer1Timer(Sender: TObject); //очистка таблицы
private
{ Private declarations }
public
{ Public declarations }
end;
Var
PagesDlg: TPagesDlg;
Implementation
Uses
unit1;
{$R *.dfm}
// Обработка входа в диалоговую форму
procedure TPagesDlg.FormActivate(Sender: TObject);
begin
if (PageControl1.TabIndex=0) then begin
// работа с плеером
StringGrid1.Enabled:=false;
StringGrid1.Visible:=false;
MediaPlayer1.Enabled:=true;
MediaPlayer1.Visible:=true;
MediaPlayer1.Open;
MediaPlayer1.Play;
end else begin
// работа с таблицей
MediaPlayer1.Enabled:=false;
end;
end; {proc}
// Обработка выхода их диалоговой формы
procedure TPagesDlg.FormDeactivate(Sender: TObject);
begin
if (PageControl1.TabIndex=0) then begin
// работа с плеером
MediaPlayer1.Stop;
StringGrid1.Enabled:=true;
StringGrid1.Visible:=true;
end else begin
// работа с таблицей
MediaPlayer1.Enabled:=true;
end;
end; {proc}
// разрешает ввод только цифр и знака минус в поле Таблицы
procedure TPagesDlg.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
#8,'0'..'9': ; //Допустимые коды
#13: begin
// клавиша ввода, переход в следующую колонку
if StringGrid1.Col<StringGrid1.ColCount-1 then begin
StringGrid1.Col:=StringGrid1.Col+1
end else begin
StringGrid1.Col:=0;
StringGrid1.Row:=(StringGrid1.Row+1) mod StringGrid1.RowCount;
// или строку, если последний столбец
end;
end; //#13
'-' :begin
if Length(StringGrid1.Cells[
StringGrid1.Col,StringGrid1.Row])<>0
then Key:=Chr(0); //Игнорируем ввод, если символ не первый
end;
else key:=chr(0); // остальные символы запрещены
end; //case
end; {proc}
// Расчет суммы по нажатию на кнопку
procedure TPagesDlg.Button1Click(Sender: TObject);
var
i,j,summa:integer;
begin
summa:=0;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!! Обработка исключений корректно работает !!!
// !!! только вне среды разработки Delphi !!!
// !!! В среде разработки исключение первым !!!
// !!! перехватывает обработчик среды !!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
try
for i:=0 to StringGrid1.ColCount-1 do begin
for j:=0 to StringGrid1.RowCount-1 do begin
summa:=summa+StrToInt(StringGrid1.Cells[i,j]);
end;
end;
Label3.Caption:=IntToStr(summa);
except
on EConvertError do
ShowMessage('Не сформирована матрица');
end;
end; {proc}
procedure TPagesDlg.TableClear; //очистка таблицы
var
i,j:integer;
begin
for j:=0 to StringGrid1.RowCount-1 do begin
for i:=0 to StringGrid1.ColCount-1 do begin
StringGrid1.Cells[i,j]:='';
end;
end;
end; {proc}
// таймер используется для выставления флага готовности данных в таблице
( включения доступности кнопки ОК)
procedure TPagesDlg.Timer1Timer(Sender: TObject);
var
i,j:integer;
flag:Boolean;
begin
flag:=False;
for i:=0 to StringGrid1.RowCount-1 do begin
for j:=0 to StringGrid1.ColCount-1 do begin
if StringGrid1.Cells[i,j]='' then begin
// есть незаполненный элемент, запретить кнопку ОК;
flag:=True;
end; //if
end; //j
end; //i
if flag then
OKBtn.Enabled:=false
else OKBtn.Enabled:=true;
end; {proc}
end. //unit5
Задание для выполнения студентами
1. Разберитесь с демонстрационной программой, представленной выше.
2. Создайте систему контекстной пмощи для одной из своих ранее выполненных лабораторных работ
ЛИТЕРАТУРА
1. Уч. Д1 Справочная система по DELPHI, каталог /D1
2.Уч. Д2Учебник по Дельфи, каталог /D2
Учебное издание
«Программирование в системе Delphi» |
Методические указания к лабораторным работам для студентов
1 курса физического факультета
Авторы
ГневкоСергей Владимирович
Крылов Георгий Геннадьевич
Шапочкина Ирина Викторовна
В авторской редакции
Ответственный за выпуск Г.Г. Крылов
Белорусский государственный университет.
Лицензия на осуществление издательской деятельности
№ 02330/0056804 от 02.03.2004.
220050, Минск, проспект Независимости, 4.
Отпечатано с оригинала-макета заказчика.