2 - е упражнение по Delphi 2 Задание Составить программу с формой Form1 вида (рис. 1)Рис. 1гдеLabel1, Label2, Label3 – метки (тип TLabel, инструмент Label ).Edit1, Edit2, Edit3 – поля ввода (тип T Edit, инструмент ).Button1 – командная кнопка (тип TButton, инструмент ).ComboBox1 – раскрывающийся список (тип TcomboBox, инструмент ), под которым (на рисунке не виден) расположен УЭ-т Label4 – метка (тип Tlabel, инструмент Label ), которая при старте программы должна выходить па передний план с символом ‘+’ в заголовке, загораживая УЭ-т ComboBox1 (рис. 2).Рис. 2При старте программы должны также обновляться тексты полей УЭ-тов Edit1, Edit2 и Edit3, как показано на рис. 2.При щелчке на УЭ-те Label4 на передний план должен выйти УЭ ComboBox1, раскрыв который можно выбрать другой знак операции или функцию (рис. 3),Рис. 3после чего список закроется, а на передний план вновь выйдет УЭ с текстом в заголовке в виде выбранного знака операции (рис. 4 – выбрана операция возведения в степень) или функции (рис. 5 – выбрана функция вычисления десятичного логарифма). При выборе функции должны также исчезать УЭ-ты Label1 и Edit1, а также изменяться текст в заголовке УЭ-та Label2. Рис. 4Рис. 5Щелчок на кнопке должен приводить к выполнению вычисления и появлению результата в УЭ-те Edit3.Следует также сделать, чтобы после выполнения любой операции (+ - * / ^) (рис. 6 – вид после возведения в степень)Рис. 6по двойному щелчку на Edit1 (Edit2) текст из Edit3 копировался в Edit1 (в Edit2), текст Edit2 (Edit1) убирался и фокус ввода получал УЭ-т Edit2 (Edit1) (рис. 7),Рис. 7а после вычисления функции (рис. 8 – вид после вычисления lg(4))Рис. 8по двойному щелчку на Edit2 текст из Edit3 копировался в Edit2, текст Edit1 убирался и фокус ввода получал УЭ-т Edit2 (рис. 9).Рис. 92 - Сведения о среде Назначение оконГлавное окно – ввод команд с помощью меню и панелей инструментов.Конструктор формы – создание образа формы с размещенными на ней управляющими элементами (УЭ), а также размещение не визуальных компонентов, используемых, например, для разработки главного или всплывающих меню. Для помещения на форму нового компонента следует щелкнуть на соответствующем значке панели инструментов Палитра компонентов (Component Palette, см. рисунок, вкладки Standard, Additional, Win32,…). Для работы с компонентом в Инспекторе объектов его следует выделить щелчком.Редактор кода – редактирование текста программы. Проводник кода – для быстрого (по двойному щелчку) перехода в тексте программы к ссылке на модуль, к описанию переменной, константы, поля в классе формы или к началу тела подпрограммы метода - обработчика события. Инспектор объектов – задание на вкладке Properties свойств выделенного объекта и создание (двойным щелчком) на вкладке Events для событий объекта новых методов (обработчиков с пустым телом, заполняемым в дальнейшем в Редакторе кода) или назначение (выбором из раскрывающегося списка) событиям объекта уже имеющихся обработчиков.Обозреватель дерева объектов – для выделения объекта, с которым предстоит работать в Инспекторе объектов. Окно сообщений об ошибках, вкладка Messages – содержит сообщения об ошибках и расположении в программе соответствующих операторов (мест), для перехода к которым следует сделать двойной щелчок на сообщении.Окно наблюдения, вкладка Watch List – для отображения в процессе отладки текущих значений переменных или выражений. Появляется по команде Run\Add Watch…. Объединяется с Окном сообщений перетаскиванием на последнее.Конструирование формыДобавить стандартный УЭ на форму – щелкнуть на УЭ на вкладке Standard, щелкнуть на форме в месте вставки УЭ.Удалить УЭ с формы – щелкнуть на нем и нажать клавишу Delete.Изменить значение свойства УЭ-та – выделить УЭ, щелкнуть на свойстве на вкладке Properties в окне Инспектор объектов, ввести или выбрать нужное значение в строке этого свойства.Добавить для УЭ-та обработчик события - выделить УЭ, на вкладке Events в окне Инспектор объектов или сделать двойной щелчок на событии, или щелкнуть на событии и ввести или выбрать нужное значение в его строке.Удалить обработчик события – удалить текст обработчика и его заголовок в описании типа класса формы, а также очистить строку соответствующего события в окне Инспектор объектов.Выполнение и отладка программы Запуск программы – или Run\Run, или кнопка , или F9Выполнить до курсора – Run\Run to Cursor или F4Выполнить строку с заходом в п\п – или Run\Trace Into, или кнопка , или F7Выполнить строку без захода в п\п – или Run\Trace Over, или кнопка , или F8Завершить отладку – Run\Program Reset или Ctrl+F2Отобразить окно наблюдения - Run\Add Watch… или нажать Ctrl+F5, ввести имя переменной или выражение, нажать OK. Появившееся окно Watch List можно отбуксировать к нижней части окна редактора кода и объединить с окном Messages, как показано на рисунке. Чтобы добавить в окно наблюдения новую переменную, можно установить на ней курсор в окне редактора кода, активизировать окно наблюдения, сделать на нем двойной щелчок и нажать кнопку OK.Установить точку останова – щелкнуть в окне редактора кода на сером поле перед строкой, на которой д.б. эта точка (см. рисунок).Убрать точку останова – повторить действия п. 7.^ 3 – Сведения из Паскаля и Delphi для выполнения задания Типы строк ShortString – то же, что и string в Турбо Паскале (от 0 до 255 символов),String - то же, что и string в Турбо Паскале, но длиной от 0 до 2 Гбайт (231),Pchar – строка с нулем (#0) в конце, как в Си, есть и другие типы строк.Строку [Short]String можно привести к типу PChar так: PChar(строка типа [Short]String) и наоборот: String(строка типа PChar).Рекомендуется использовать тип String, но некоторые стандартные функции требуют в качестве параметров тип PChar, и тогда следует применить приведение типов.- TComboBox – раскрывающийся список, объединенный с полем вводаВид с закрытым (раскрытым) списком представлен на рис. 1 (рис. 3).Если свойство Enabled имеет значение True и список закрыт, то поле ввода используется как обычное поле ввода (допускает ввод текста, откликается на события и т.п.), а когда список открыт, щелчком мыши можно выбрать его элемент и она отобразится в поле ввода.Если свойство Enabled имеет значение False, то этот УЭ служит только для отображения текста (не реагирует на нажатия клавиш и кнопок мыши).При проектировании формы список можно создать и заполнить (см. ниже)^ 3 - Выполнение задания После выполнения шагов задания не забывайте запускать программу на выполнение (для контроля результатов) и сохранять введенные добавления и изменения в файлах.^ Создание проекта и макета формы Запустите Delphi 6. При этом автоматически будет создана форма с именем Form1. Если Delphi 6 уже запущена и использовалась для создания другой программы, то следует ввести команду File\New\Application.Сохраните программу в новом подкаталоге Программа 2 рабочего каталога командой File\Save All (Delphi 6 последовательно предложит сохранить программу в файлах Project1.dpr и Unit1.pas. Не меняйте эти имена. В дальнейшем, если Delphi 6 открывается для загрузки программы на редактирование, выбирайте файл Project1.dpr или, после открытия Delphi 6, используйте команду File\Open Project… для этого файла). В процессе работы не забывайте периодически сохранять файлы программы щелчком на кнопке панели инструментов Standard.Щелчком активизируйте окно формы, в диалоге (в окне диалога) Инспектора объектов (Object Inspector) на вкладке Properties щелкните на поле Caption и введите заголовок формы Задание 2.Измените размеры формы мышкой или заданием значений в свойствах Height и Width.Разместите на форме (см. рис.1) в следующем порядке УЭ-ты: Edit1, Edit2, Edit3, Label1, Label2, Label3, Button1, ComboBox1 и Label4, совместив ее с ComboBox1. Задайте Ун-там нужные положения, размеры, заголовки и тексты, как на рис. 1. Если не удается выделить щелчком мыши нужный элемент, то сделать это можно выбором его имени в списке Обозревателя дерева объектов.Выделите УЭ-т ComboBox1, щелкните на кнопке в строке свойства Items Инспектора объектов и введите в открывшемся окне диалога String List Editor тексты строк списка так, как они видны в списке на рис. 3.Программирование Создайте обработчик события создания формы, который будет задавать символ ‘2’ в качестве значений свойства Text УЭ-та Edit1, значение ‘4’ – для УЭ-та Edit2 и значения ‘’ – для УЭ-та Edit2, выполнив следующие действия:Щелкните на форме и затем сделайте двойной щелчок на строке события Increate на вкладке Events в диалоге Object Inspector.В тело обработчика вставьте операторы:Edit1.Text:='2';Edit2.Text:='4';Edit3.Text:='';Создайте для ComboBox1 обработчик события Unclose1 для запоминания выбранного преобразования и вывода на передний план УЭ-та Edit4 с текстом из выбранной строки списка ComboBox:В начале раздела реализации дайте описание переменной d: byte, которая будут использоваться для хранения номера элемента списка, представляющего выбранное преобразование (0 ~ +(сложить), 1 ~ (вычесть), 2 ~ *'(умножить), и т.д.).Сохраните в d индекс выбранного элемента спискаd:=ComboBox1.ItemIndex;Введите код, обеспечивающий при выборе знака операции вид рис. 4 (УЭ-т Label4 содержит знак выбранной операции и загораживает ComboBox1), иначе – вид рис. 5 (УЭ-ты Label1 и Edit1 не отображены, УЭ-т Label2 имеет заголовок Аргумент, УЭ-т Label4 содержит выбранной функции и загораживает ComboBox1): if d in [4,5,7] then begin Edit1.Visible:=False; Label2.Caption:='Аргумент'; Label1.Visible:=False; endelse begin Edit1.Visible:=True; Label2.Caption:='Операнд 2'; Label1.Visible:=True; end;Label4.Caption:=ComboBox1.Items[d];ComboBox1.Visible:=false;Label4.Repaint;Label4.BringToFront;Label4.Visible:=True; Создайте для Label4 обработчик события OnClick, который будет прятать Label4, а ComboBox1 делать видимым и передавать ему фокус: ComboBox1.Visible:=True;Label4.Visible:=False;ComboBox1.SetFocus;Чтобы при выполнении программы размер шрифта для Label4 становился таким, как на рис. 4 и рис. 5, добавьте в обработчик события создания формы операторы и подберите присваиваемые значения:Label4.Font.Height:=; // 22;Label4.Font.Style:=; // [fsBold];Label4.Font.Name:=; // 'Times New Roman';!!! Значения можно подобрать с помощью Инспектора объектов, где для Font.Style и Font.Name представлены все возможные значения, а затем опробовать и программную установку.!!! Описание свойства можно найти так: установить на него курсор \ вызвать локальное меню \ выбрать пункт Find Declaration.Создайте для кнопки ^ Button1 обработчик события OnClick, который будет выполнять двуместные операции над данными из полей Edit1 и Edit2 или вычислять функцию для аргумента из поля Edit2 в зависимости от выбранного преобразования в списке ComboBox1, выводить результат в поле Edit3 и устанавливать на него фокус:Дайте в процедуре описания переменных, которые будут использоваться для преобразований “число строка” при выполнении преобразованийs1, s2, s3: string; r1, r2, r3:extended; k: integer;Добавьте в обработчик операторы преобразования текста из поля ввода Edit2 в число r2, а если в поле не число, то выдачи сообщения об ошибке и выход из обработчика:s2:=Edit2.Text;Val(s2,r2,k);if k0 then begin if d in [0..3,6] then ShowMessage(‘Второй операнд должен быть числом!') else ShowMessage(‘Аргумент должен быть числом!'); exit end;Добавьте далее операторы аналогичной обработки текста из поля ввода Edit1 в число r1, а если в поле не число, то выдачи сообщения об ошибке и выход из обработчика.if d in [0..3,6] then begin s1:=Edit1.Text; Val(s1,r1,k); if k0 then begin ShowMessage(‘Первый операнд должен быть числом!'); exit end; end;Добавьте далее оператор case для выполнения заданного преобразования:case d of 0: r3:=r1+r2; 1: r3:=r1-r2; 2: r3:=r1*r2; 3: if r2=0 then begin ShowMessage('Делитель должен быть отличен то нуля!'); exit end else r3:=r1/r2; 4: r3:=sin(r2); 5: r3:=cos(r2); 6: if r1 ShowMessage('Первый аргумент должен быть больше нуля!'); exit end else if r2>0 then r3:=exp(abs(r2)*ln(r1)) else r3:=1/exp(abs(r2)*ln(r1)); 7: if r2 ShowMessage ('Аргумент должен быть больше нуля!'); exit end else r3:=ln(r2)/ln(10); end{case};s3:=FloatToStr(r3);k:=Pos(',',s3);if k>0 then begin Delete(s3,k,1); Insert('.',s3,k); end;Edit3.Text:=s3;Edit3.SetFocus;Проверьте работу программы.^ Дополнения к заданию Сделайте так, чтобы двойной щелчок на Edit1 приводил к пересылке значения из поля ввода Edit3 в поле ввода Edit1, очистке поля Edit2 и передаче ему фокуса:Edit1.Text :=Edit3.Text;Edit2.Clear;Edit2.SetFocus;Сделайте так, чтобы, когда поле ввода Edit1 отображено, двойной щелчок на Edit2 приводил к пересылке значения из поля ввода Edit3 в поле ввода Edit2, очистке поля Edit1 и передаче ему фокуса, иначе – к пересылке значения из поля ввода Edit3 в поле ввода Edit2 и передаче ему фокуса:Edit2.Text :=Edit3.Text;if Edit1.Visible then begin Edit1.SetFocus; Edit1.Clear; endelse Edit2.SetFocus;Добавьте на форму командные кнопки с цифрами 0..9, символами “минус” , ‘E’, “точка” и сделайте для них общий обработчик щелчка, добавляющий соответствующие символы в позицию курсора последнего из полей Edit1 и Edit2, имевшего фокус.Рекомендации:Используйте в разделе реализации дополнительную переменную для хранения номера последнего из полей Edit1 и Edit2, имевшего фокус, например, var e:1..2; которой при создании формы присваивается значение 1, если при этом фокус устанавливается на Edit1. В обработчиках щелчка этих полей Edit1 и Edit2 этой переменной присваивайте соответствующие значения.Добавьте на форму командную кнопку с заголовком ‘0’ и сделайте следующий обработчик щелчка на ней:procedure TForm1.Button2Click(Sender: TObject);var i:integer;beginif e=1 then begin Edit1.ClearSelection; i:=Edit1.SelStart; Edit1.Text:=Copy(Edit1.Text,1,Edit1.SelStart) +(Sender as TButton).Caption +Copy(Edit1.Text,Edit1.SelStart+1,length(Edit1.Text)); Edit1.SelStart:=i+1; Edit1.SelLength:=0; endelse begin Edit2.ClearSelection; i:=Edit2.SelStart; Edit2.Text:=Copy(Edit2.Text,1,Edit2.SelStart) +(Sender as TButton).Caption +Copy(Edit2.Text,Edit2.SelStart+1,length(Edit2.Text)); Edit2.SelStart:=i+1; Edit2.SelLength:=0; end;end;гдеEdit1.ClearSelection – удаление выделенного текста(Sender as TButton) – предложение рассматривать объект, пославший сообщение, как командную кнопку,Edit1.SelLength – длина выделенного текста (равна 0, если нет выделения текста)Edit1.SelStart – позиция курсора в строке, если Edit1.SelLength = 0, иначе – начала выделенного текста.Обычным копированием размножьте эту кнопку так, чтобы их было достаточно для всех остальных символов, и дайте им соответствующие заголовки (обратите внимание на то, что все эти копии будут вызывать по щелчку один и тот же обработчик).Дайте удобное размещение кнопок на форме.Добавьте на форму две селекторные кнопки с надписями “Радианы” и ”Градусы” и свойству Checked первой из них дайте значение True (вторая автоматически будет иметь значение False). Измените в обработчике кнопки Button1 алгоритм вычисления синуса и косинуса так, чтобы учитывались единицы измерения аргументов (радианы\градусы) в соответствии с установкой селекторных кнопок.4: if RadioButton1.Checked then r3:=sin(r2) else r3:=sin(r2/180*Pi); 5: if RadioButton1.Checked then r3:=cos(r2) else r3:=cos(r2/180*Pi);В результате всех добавлений форма примет примерно такой вид