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

Label lbInput Введите число

Label Label2 Результат

Label lbResult -

Для компонента Edit очистите значение свойства Text (в этом свойстве типа String будет содержаться введенная строка).

4. Добавьте на форму кнопку-выключатель CheckBox и компонент RadioGroup (группу радиокнопок). Эти кнопки используются для установки различных флагов и режимов выполнения задачи. Кнопки-выключатели могут переключаться независимо друг от друга, а в группе радиокнопок включенной может быть только одна из них. Зададим для CheckBox значение свойства Caption - Градусы (аргумент синуса измеряется в градусах, а если кнопка выключена, то в радианах). Для проверки состояния кнопки-выключателя используется свойство Checked: Boolean, возвращающее True, если кнопка включена (помечена), и False в противном случае.

5. Для занесения кнопок в группу радиокнопок нажмем «...» напротив свойства Items компонента RadioGroup1. В раскрывшемся диалоговом окне запишем наименования радиокнопок в три строчки:

Sin

Cos

Tg .

Эти строчки будут содержать названия радиокнопок. В свойство Caption запишем Функция.

Состояние группы радиокнопок проверяется с помощью ее свойства ItemIndex типа Integer. Если ItemIndex равен 0, то включена первая по порядку кнопка, если 1, то 2-я и т.д. Если -1, то ни одна из кнопок не включена.

Форма примет вид рис. 4.

Рис. 4

6. Откомпилируйте приложение. Убедитесь, что с помощью Edit можно вводить и редактировать строки. Однако пока никаких действий с введенной строкой не выполняется.

5. Чтобы вычисления над введенной строкой выполнялись, создайте следующие обработчики событий.

Для события OnClick кнопки btStart:

procedure TMainForm.btStartClick(Sender: TObject);

var x: real; // Введенное значение

s: string;

begin

x:=StrToFloat(Edit1.text); //Преобразование строка-число

if CheckBox1.Checked then

x:=pi*x/180.0; // Перевод в радианы

case RadioGroup1.ItemIndex of // Варианты расчета

0,-1: x:=sin(x);

1: x:=cos(x);

2: x:=sin(x)/cos(x);

end;

//Преобразование число-строка

s:=FloatToStrF(x,ffFixed, 6,3);

// Вывод результата

lbResult.Caption:=S;

end;

Для события OnClick кнопки btExit:

procedure TMainForm.btExitClick(Sender: TObject);

begin

Close;

end;

6. Откомпилируйте и выполните проект. Результат его работы будет иметь следующий вид (рис. 5).

Рис. 5

7. Модифицируем проект. Для выделенного компонента Edit1 найдите в инспекторе объектов событие OnChange, возникающее при изменении текста внутри TEdit, раскройте комбинированный список напротив OnChange и выберите в нем уже созданный обработчик событий bTStartClick. Теперь эта процедура будет вызываться при наступлении события OnChange, следовательно, вычисления будут происходить синхронно с вводимым текстом. Убедитесь в этом, выполнив проект.

Задания. Доработайте проект, предусмотрев обработку ошибок при вводе аргумента, а также обработку ситуации, когда тангенс принимает значение «бесконечность». Найдите на палитре компонентов и используйте другие средства, пригодные для ввода данных.

Указание: используйте специальные средства обработки исключительных ситуаций. Они строятся в виде конструкций:

try

<защищенный блок операторов>

except

<обработка исключения>

end;

Все операторы, располагающиеся между try и except, относятся к защищенному блоку операторов. Если при выполнении любого из них возникнет ошибка, управление будет передано в блок операторов между except и end, но если обработка защищенного блока пройдет без ошибок, блок <обработка исключения> будет проигнорирован и управление будет передано оператору, следующему за end. Более подробно см. в [1].

В блок обработки исключительной ситуации обычно включаются: вызов стандартной подпрограммы, наподобие ShowMessage(‘сообщение’), с помощью которой на экран выводится окно с информацией об ошибке; вызов стандартной подпрограммы Exit, завершающий работу подпрограммы, в котором произошла ошибка; любые другие операторы, необходимые по мнению программиста.

Лабораторная работа № 3. Класс TStrings

Класс TStrings – один из основополагающих классов в Delphi. Работа очень многих компонентов построена на имеющемся в их составе свойстве класса TStrings. Например, это свойство Items у ListBox и RadioGroup, Lines у Memo и т.д. и т.п. Класс TStrings применяется для хранения любых объектов наследников класса TObject и связанных с ними текстовых строк. Свойства класса TStrings называются наборами строк.

TStrings – абстрактный класс. Обратиться к нему можно лишь при «посредничестве» соответствующего компонента. Если необходимо создать экземпляр класса TStrings вне компонентов, используйте объект-потомок TStringList, наследующий свойства и методы TStrings. Например,

var SL: TStringList;

begin

SL := TStringList.create; // Но не SL := TString.create!

SL.add(‘Строка’);

end;

К строкам и объектам, хранящимся в TStrings, можно обратиться с помощью индексированных свойств

property Strings[i: integer]: string; default;

property Object [i: integer]: TObject;

Атрибут default означает, что имя индексированного свойства может быть опущено, например, следующие обращения равнозначны:

ListBox1.items.strings[1]:=’Строка’;

ListBox1.items[1]:=’Строка’;

Для программиста свойство типа TStrings выглядит как обычный массив строк, но индекс в таком массиве находится в диапазоне целых чисел 0 - 32767.

Пример: Items[0]:=’text1’ - записать строку в 1-й элемент набора строк,

Items[1]:=’text2’ - во второй элемент и т.д.

Общее число строк можно определить, обратившись к свойству Count (тип integer) класса TStrings.

Класс TStrings также применяется для хранения пар вида «параметр-значение». При чтении (записи) свойства

property Values[const Name: string]: string;

ищется строка, содержащая подстроку вида Name=значение и возвращается (записывается) значение после символа «=» .

Например, опрератор ListBox1.Items.Values[‘y’]:=1;

приведет к появлению в списке строки y=1.

Основные свойства и методы класса TStrings приведены в таблице.

Property Count: integer;

Число пар строк и объектов.

Function Add(const S: string): integer;

Добавляет строку в конец набора и возвращает присвоенный ей номер.

Function AddObject(const S: string; AObject: Tobject): integer;

Добавляет строку и объект. Возвращает присвоенный паре номер

procedure AddStrings (Strings: TStrings);

Добавляет в конец набора другой набор TSrings.

procedure Clear;

Очищает набор данных и освобождает связанную с ним память.

procedure Delete (I: integer);

Удаляет строку с индексом I.

Function IndexOf (const S: string): integer;

Возвращает номер в наборе строки S. Если она не найдена, функция возвращает -1.

Function Equals (Strings: TStrings): boolean;

Сравнивает набор строк вызвавшего этот метод объекта с набором Strings и возвращает True, если они совпадают.

procedure Move(I1,I2:integer);

Перемещает пару строка–объект с позиции I1 в позицию I2.

procedure Exchange (I1,I2: integer);

Меняет местами пары строка+объект с индексами I1 и I2.

procedure LoadFromFile (const FileName: string);

Загружает набор строк из файла

procedure SaveToFile (const FileName: string);

Сохраняет набор строк в файле

Рассмотрим следующий пример. Создадим приложение, в котором выбранные кнопки «прячутся» в списке ListBox, а при выборе их из списка появляются на прежнем месте. Доступ к содержимому списка происходит через свойство Items типа TStrins. Порядковый номер выбранного элемента списка можно узнать с помощью свойства ItemIndex компонента ListBox. Нумерация начинается с нуля.

1. Разместите на форме три кнопки Button1, Button3, Button3, строку Label и список ListBox1, как это показано на рис. 6.

Рис. 6

2. Создайте обработчик события OnClick для кнопки Button1:

procedure TForm1.Button1Click(Sender: TObject);

begin

(Sender as TControl).visible := False;

ListBox1.Items.AddObject((Sender as TButton).caption, Sender);

end;

Метод AddObject добавляет в список и заголовок кнопки, и саму кнопку.

Свойство Visible позволяет скрывать элемент, не уничтожая его.

3. Назначьте этот обработчик аналогичным событиям других кнопок, как это делалось в п.7 предыдущей лаб.работы.

Комментарий. Параметр Sender типа TObject описан в заголовках процедур-обработчиков событий. Через этот параметр передается ссылка на объект-источник события. Так как Sender относится к классу TObject - абстрактному классу на верху иерархии компонентов Delphi, то в процедуру может быть передан любой компонент (будучи наследником TObject он тоже TObject). Параметр Sender обычно игнорируют, но его необходимо использовать, когда несколько компонентов обращаются к одному и тому же обработчику событий, как в данном примере. Тогда Sender позволяет узнать, кто конкретно этот обработчик вызвал.

Оператор as в примере сообщает компилятору, что объект Sender следует рассматривать как принадлежащий классу «кнопка».

4. Создайте обработчик для события OnClick объекта ListBox1:

procedure TForm1.ListBox1Click(Sender: TObject);

begin

with ListBox1 do

begin

(Items.Objects[ItemIndex] as TButton).visible := true;

Items.Delete(ItemIndex);

end;

end;

При выполнении программа будет иметь следующий вид (рис. 7).

Рис.7

Задание: измените программу, чтобы в список можно было заносить разнородные элементы: кнопки, панели, метки и др. Более подробную информацию об использовании операторов is и as можно получить в [5].

Лабораторная работа № 4

Списки и комбинированные списки. Полосы прокрутки

Списки (компонент ListBox) используются для выбора элемента, комбинированные списки (ComboBox) могут дополнительно отредактировать этот выбранный элемент через свойство Text.

Напишите самостоятельно пример, позволяющий выбирать из списка (и из комбинированного списка) цвет формы. Для изменения цвета формы надо задать свойство формы Color: TColor. Доступные цветовые константы можно посмотреть в свойстве Color в инспекторе объектов.

Примерный эскиз формы:

Рис. 8

Напишите пример, в котором цвет формы задается с использованием стандартной функции RGB:

function RGB (R,G,B: byte): TColor;

Здесь R,G,B – значения интенсивностей красной, зеленой и синей составляющей цвета. Для плавного изменения интенсивностей используйте три компонента ScrollBar (полоса прокрутки). Свойства min, max: integer содержат начальное и конечное значение положения бегунка. Свойство Position – текущее положение бегунка. Цвет должен измениться при наступлении события OnChange компонента ScrollBar в зависимости от значения Position для всех полос прокрутки (три полосы – три цвета).

Лабораторная работа № 5. Создание приложений с несколькими формами

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

1. Разместим еще одну кнопку Button3 с заголовком О программе.

2. Выберем в главном меню Delphi пункт File | New. В появившемся диалоговом окне перейдите на закладку Forms. Появится «галерея шаблонов». Выберите здесь подходящий шаблон, например шаблон About Box, приспособленный для вывода информации о программе. Нажмите OK. В среде разработки Delphi появится дополнительное окно. Видоизмените его, занеся в компоненты TLabel необходимые, на Ваш взгляд, сведения. Запомните название формы (свойство Name) - AboutBox. Сохраните модуль (пункт File | Save As) под именем, например Unit2.

3. Теперь надо созданною форму подключить к основной форме программы. Перейдите на первую (основную) форму. Допишите в список модулей в начале модуля Unit1 основной формы в директиве Uses еще один – написанный нами модуль:

uses Windows, SysUtil, ...,Unit2.

Теперь идентификатор AboutBox станет доступен в модуле Unit1. (Того же можно добиться, используя пункт меню Use Unit).

4. Создайте обработчик события для кнопки «О программе»:

procedure TForm1.Button3Click(Sender: TObject);

begin

AboutBox.ShowModal;//Метод ShowModal изображает

//форму на экране

end;

Комментарий. Здесь Вы можете воспользоваться двумя методами - ShowModal и Show. При использовании первого метода образуется модальное окно. Пока Вы его не закроете, Вы не сможете переключиться ни на одно другое окно. Такие окна удобны для создания диалога, требующего обязательного ответа. При использовании метода Show образуется обычное окно, из которого свободно можно выйти, не закрывая его (эти окна используются, например, при создании справки). Как запрограммировать закрытие окна?

При использовании метода Show обязательно вставьте в обработчик события закрывающей кнопки вызванного окна известный Вам метод Close.

При использовании метода ShowModal либо поступите аналогично, либо задайте через Инспектор объектов для закрывающей окно кнопки свойство ModalResult, равное константе mrOK, mrCancel (по названию кнопки). Главное - не задавать константу ноль, обозначаемую mrNone . Дело в том, что форма закрывается, когда ее одноименное свойство ModalResult принимает ненулевое значение, а при нажатии кнопки автоматически происходит присваивание Form.ModalResult:=Button.ModalResult.

Заметим, что в использованных Вами шаблонах форм свойство ModalResult кнопок заранее установлено ненулевым. Однако можно и не использовать готовые шаблоны, создавая формы выбором меню File | New Form. Тогда о значении ModalResult следует позаботиться.

Вы сейчас создали информационное окно AboutBox. При создании диалоговых окон для ввода исходных данных необходимо, во-первых, разместить на форме диалога необходимые для ввода компоненты и закрывающие кнопки (задав для кнопок свойство ModаlResult) и, во-вторых, проверить, какую кнопку пользователь использовал для ее закрытия, например кнопку OK или Cancel. Последнее легко сделать, т.к. метод ShowModal работает как функция, возвращая значение свойства ModalResult закрывающей кнопки. Примерный фрагмент кода для вызова диалогового окна имеет вид

if Form2.ShowModal =mrOk then

begin

Val (Form2.Edi1.Text, x, code);

...

end;

5. Выполните проект, используя разные методы открытия (ShowModal и Show) и закрытия окна (через Close или ModalResult).

6. Переделайте проект из работы 5, организуя ввод параметров через диалоговое окно.

Замечание. Для создания простых диалоговых окон вполне достаточно использовать следующие стандартные функции (модуль Dialogs):

procedure ShowMessage(const Msg: string);

function MessageDlg(const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint): Word;

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