Информатика21-22. Методические указания по курсу Информатика Пятигорск 2020 Лабораторная работа 1
Скачать 4.27 Mb.
|
type colors = (red, white, blue); Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер О, второе - 1 и т. д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа word и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями 0, 1 и т. д. Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. Пусть, например, заданы такие перечисляемые типы: type colors = (black, red, white); ordenal= (one, two, three) ; days = (Monday, Tuesday, Wednesday); С точки зрения мощности и внутреннего представления все три типа эквивалентны: Ord(black)=0, ... , Ord(white)=2, Ord(one)=0, ... , Ord(three)=2, Ord(Monday)=0, ... , Ord(Wednesday)=2. Однако если определены переменные var col : colors; num : ordenal; day : days ; то допустимы операторы col := black; num := Succ(two); day := Pred(Tuesday); но недопустимы col := one; day := black; Как уже упоминалось, между значениями перечисляемого типа и множеством целых чисел существует однозначное соответствие, задаваемое функцией Ord(X). В Object Pascal допускается и обратное преобразование: любое выражение типа Word можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощности этого типа. Такое преобразование достигается применением автоматически объявляемой функции с'именем перечисляемого типа. Например, для рассмотренного выше объявления типов эквивалентны следующие присваивания: col := black; col := colors (0) ; Разумеется, присваивание col := 0; будет недопустимым, т. к. перечисляемому типу нельзя присвоить целое значение. Переменные любого перечисляемого типа можно объявлять без предварительного описания этого типа, например: var col: (black, white, green); Тип-диапазон. Тип-диапазон есть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона. Тип-диапазон задается границами своих значений внутри базового типа: <мин.знач.>..<макс.знач.> Здесь <мин. знач. > - минимальное значение типа-диапазона; <макс. знач. > - максимальное его значение. Например: type digit = '0'..'9'; dig2 = 48 .. 57; Тип-диапазон не обязательно описывать в разделе type, а можно указывать непосредственно при объявлении переменной, например: var date : 1. .31; month: 1..12; Ichr : 'А'..'Z'; При определении типа-диапазона нужно руководствоваться следующими правилами: два символа “..” рассматриваются как один символ, поэтому жду ними недопустимы пробелы; левая граница диапазона не должна превышать его правую границу. Тип-диапазон наследует все свойства своего базового типа, но с ограничениями, связанными с его меньшей мощностью. В частности, если определена переменная type days = (то,tu,we,th,fr,sa,su); WeekEnd = sa .. su; var w : WeekEnd; begin w := sa; end; to ord(w) вернет значение 5, в то время как pred(W) приведет к ошибке. В стандартную библиотеку Object Pascal включены две функции, поддерживающие работу с типами-диапазонами: High(X) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная х; Low (X) - возвращает минимальное значение типа-диапазона. 2.1.2. Вещественные типы В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа. Таблица 2.4. Вещественные типы
В предыдущих версиях Delphi 1...3 тип Real занимал 6 байт и имел диапазон значений от2, 9*10-39 до 1,7*1038. В версиях 4 и 5 этот тип эквивалентен типу Double. Если требуется (в целях совместимости) использовать 6-байтньш Real, нужно указать директиву компилятора {SREALCOMPATIBILITY ON}. Мантисса m имеет длину от 23 (для single) до 63 (для Extended) двоичных разрядов, что и обеспечивает точность 7...8 для single и 19...20 для Extended десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой). Отметим, что арифметический сопроцессор всегда обрабатывает числа в формате Extended, а три других вещественных типа в этом случае получаются простым усечением результатов до нужных размеров и применяются в основном для экономии памяти. Например, если “машинное эпсилон” вычисляется с помощью такой программы: type RealType = Real; var Epsilon : RealType; begin Epsilon := 1; while l+Eps4.1on/2 > 1 do Epsilon := Epsilon/2; IbOutput.Caption := FloatToStr(Epsilon) end; то независимо от объявления типа RealType (он может быть single, Real, Double или Extended) на печать будет выдан результат 1.08420217248550Е-0019 что соответствует типу Extended. Происходит это по той причине, что все операнды вещественного выражения 1+Epsilon/2 в операторе while перед вычислением автоматически преобразуются к типу Extended. Чтобы получить правильный результат, программу необходимо изменить следующим образом: type RealType = Real; var Epsilon, Epsl : RealType; begin Epsilon := 1; repeat Epsilon := Epsilon/2; Epsl := 1 + Epsilon until Epsl = 1; IbOutput.Caption := FloatToStr(2*Epsilon) end. Особое положение в Object Pascal занимают типы comp и Currency, которые трактуются как вещественные числа с дробными частями фиксированной длины: в comp дробная часть имеет длину 0 разрядов, т. е. просто отсутствует, в currency длина дробной части -4 десятичных разряда. Фактически оба типа определяют большое целое число со знаком, сохраняющее 19...20 значащих десятичных цифр (во внутреннем представлении они занимают 8 смежных байт). В то же время в выражениях comp и currency полностью совместимы с любыми другими вещественными типами: над ними определены все вещественные операции, они могут использоваться как аргументы математических функций и т. д. Наиболее подходящей областью применения этих типов являются бухгалтерские расчеты. Для работы с вещественными данными могут использоваться встроенные математические функции, представленные в табл. 7.5. В этой таблице Real означает любой вещественный тип, integer - любой целый тип. Таблица 2.5. Стандартные математические функции Object Pascal
На заметку Генератор псевдо случайных чисел представляет собой функцию которая берет некоторое целое число, называемое базовым, изменяет, его разряды По определенному алгоритму и выдает новое число результат. Одновременно с этим новое число становится базовым.прД следующем обращении к функций; и т. д. (Так как алгоритм процедуры не меняется: в ходе ее работы, числа называются псевдослучайна ми.) В системном модуле System, который автоматически доступен любой программе, базовое число хранится в переменной с именеД RandSeek и всегда имеет начальное значение.О. :Это означает, последовательном обращении к Random в разных, программах (или при нескольких прогонах одной программы) будет всегда вь1лапа'оД на и, та же прследовательность псевдослучайных чисел. НапримёД при; следующём обрабЬтчике bbRunCl.i.ck окно, нашей .учебной программы будет иметь вид, показанный на рис. 2.2: procedure TfinExaniple.bbRunCliak(Sender:TObject); var S,3S: String;. begin S=''; for k :=1 to 300 do SS := IntToStr (Random (1000)) while Length(SS)<3 do if k mod 2С=0 then begin S : = '' ; end end end; (В программе выводятся 300 псевдослучайных чисел, которые группируются в строки по 20 чисел и дополняются ведущими нулями, если число имеет меньше трех цифр.) Если вы захотите повторить программу, вы получите точно такую же последовательность чисел, что н на рис. 2.2. С помощью процедуры Randomize в переменную RandSeek помещается численное значение системного времени, что привёдет к генерации, другой последовательности. Обращение к этой процедуре нужно сделать в самом начале обработчика. Рис. 2.2. Последовательность псевдослучайных чисел Начиная с версии 2 в Delphi включен модуль Match, который существенно расширяет перечисленный в табл. 7.5 набор встроенных математических функций. Особенностью реализации содержащихся в нем почти 70 функций и процедур является их оптимизация для работы с арифметическим сопроцессором класса Pentium, так что все они производят необходимые вычисления за рекордно малое время. 2.1.3. Тип дата-время Тип дата-время определяется стандартным идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Во внутреннем представлении он занимает 8 байт и подобно currency представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной - время. Дата определяется как количество суток, прошедших с 30 декабря 1899 года, а время - как часть суток, прошедших с 0 часов, так что значение 36444,837 соответствует дате 11.10.1999 и времени 20:05. Количество суток может быть и отрицательным, однако значения меньшие -693594 (соответствует дате 00.00.0000 от Рождества Христова) игнорируются функциями преобразования даты к строковому типу. Над данными типа TDateTime определены те же операции, что и над вещественными числами, а в выражениях этого типа могут участвовать константы и переменные целого и вещественного типов. Для работы с датой и временем используются подпрограммы, перечисленные в табл. 2.6. Таблица 2.6. Подпрограммы для работы с датой и временем
Более полный перечень функций преобразования даты и времени в строку символов и обратно указан в п. 2.3.1. Поскольку тип TDateTime совместим с форматом вещественных чисел, можно без труда определить дату, отстоящую от заданной на сколько-то дней вперед или назад: для этого достаточно соответственно прибавить к заданной дате или отнять от нее нужное целое число. Например, оператор IbOutput.Caption := DateToStr(Date + 21); поместит в метку IbOutput дату, соответствующую текущей дате плюс 3 недели. Чуть сложнее с исчислением времени. Например, чтобы добавить к текущему времени полтора часа, следует использовать выражение Time + StrToTime('1:30') ИЛИ Time+1.5/24 С помощью показанного ниже обработчика bbRunciick учебной программы вы сможете ввести в строке ввода любое вещественное число и посмотреть его интерпретацию как значение типа TDateTime: procedure TfmExample.bbRunClick(Sender: TObject) ; {Показывает вещественное число, введенное в строке edinput,в формате даты-времени} var k: Double; begin //Преобразуем строковый ввод в вещественное число try k := StrToFloat(edinput.Text); except ShowMessage('Ошибка записи вещественного числа'); edinput.SelectAll ; Exit end; //Показываем результат как дату-время IbOutput. Caption := ForrnatDateTime ('dd.mm.yyyy hh:mm:ss', k); // Возвращаемфокусвводав edinput edinput.SetFocus ; end; Структурные типы Тип «Массив» Массивы содержат фиксированное число элементов одного типа. Для доступа к элементам массива используются индексы. Массив может иметь неограниченное число размерностей. Все элементы массива имеют один и тот же тип элементов - базовый тип. Базовым типом может быть любой из порядковых типов, диапазон которых не превышает 2 Гбайта. Например, для объявления одномерного массива S, состоящего из 10 элементов целого типа: var S: array [1..10] of integer; Двумерный массив целых чисел S1 размерностью 10х10 может быть объявлен одним из следующих способов: var S1: array [1..10] of array [1..10] of integer; или в более компактной форме: var S1: array [1..10,1..10] of integer; Тип «Запись» Тип «запись» содержит установленное число элементов или полей, которые могут быть разных типов. В описании записи указывается идентификатор, который именует поле, и тип каждого поля. Например, описание нового типа элементов, который является записью: type Student = record Name: string; Family: string; Year: integer; end; Тип «Класс» Тип «класс» является структурой, состоящей из фиксированного числа компонентов. Каждый компонент класса является либо полем, содержащим данные строго определённого типа, либо методом (процедурой или функцией). В Delphi используются огромное число стандартных классов, каждый из которых содержит разнообразные методы. Программист может и сам разрабатывать новые нестандартные классы, определять поля, методы для решения прикладных задач. Методика разработки и использования в программах нестандартных классах - тема отдельного разговора. Тип «Множество» Это математический термин, и он применим в данном случае, так как этот тип представляет именно множество, и над ним можно производить все те же действия, что и над множествами. Диапазон значений множества представляет собой мощность множества для определённого порядкового типа (базового типа). Каждое возможное значение множества является подмножеством возможных значений базового типа. В Pascal количество значений базового типа не должно превышать 256, и порядковые значения верхней и нижней границы базового типа не должны превышать диапазона от 0 до 255. В силу этого базовый тип множества не может быть коротким целым (Shortint), целым (Integer), длинным целым (Longint) или словом (Word). Переменная для множества может принимать как все значения множества, так и ни одного. Множество можно создать так: type TIntSet = set of 1 .. 250; Тип «Файл» Использование файловых переменных является одной из важнейших задач при создании прикладных программ и технология их использования будет рассмотрена позднее. Создание интерфейса программы. Интерфейс программы - совокупность элементов, позволяющих пользователю программы управлять её работой, а также получать требуемые результаты. Фактически, пользовательский интерфейс - это канал, по которому осуществляется взаимодействие пользователя и программы. Почему есть необходимость вообще говорить о программном интерфейсе? Дело в том, что исходя из самой идеи, программа пишется для пользователя, для удовлетворения его потребностей. В итоге же часто получается, что программист пишет программу «для себя», т.е. никому больше она не нужна, потому что кроме автора этой программы понять ее мало кто смог. И можно, конечно, доказывать, что алгоритм программы гениальный, и, что код работает очень быстро, занимает меньше места по сравнению с аналогичными программами, но эти моменты будут интересовать только программистов, потому что будут понятны только им и только ими будут оценены должным образом. Пользователь же предъявляет совершенно иные требования, чем программист, так как смотрит на код снаружи, а не изнутри. И, соответственно, большей популярностью будет пользоваться та программа, прежде всего, с которой пользователи нашли общий язык, остальные же параметры интересуют пользователей во вторую очередь. В основе работы любой диалоговой программы лежит взаимодействие пользователя и программы через её интерфейс. При этом пользователь программы различными способами вводит или выбирает данные, а программа обрабатывает эти данные и возвращает результат в различных видах - текстовом, табличном, графическом и других. Для этих целей в любой современной визуальной системе программирования есть множество компонент для размещения и использования в интерфейсной части программы. Рассмотрим несколько основных компонентов: текстовую надпись Label, поле для ввода Edit, кнопка Button, списки ListBox и ComboBox. Текстовая надпись Label При оформлении интерфейса программы необходимы надписи различного вида. Для этого можно использовать объект Label - надпись. Свойства класса TLabel
Однострочное поле ввода и редактирования - Edit. Компоненты класса TEdit представляют собой однострочное текстовое поле для редактирования. Основное свойство компонента Text - содержит отображаемую в поле строку. Это свойство используется для ввода и вывода данных в поля Edit. Очень важно! Для вычислений необходимо использовать переменные, относящиеся к числовому типу. Особенностью Delphi (и многих других визуальных систем программирования) является то, что данные, введённые в поля Edit, изначально относятся к символьным данным. Для выполнения математических действий с ними как с числами вначале необходимо преобразовать их из символьных в числовые, а затем выполнять действия с числовыми переменными. Вначале введённые значения в поля Edit необходимо присвоить строковым переменным, преобразовать их в числовое значение (целое или вещественное) и только потом выполнять с полученными числовыми переменными вычисления. Аналогично, полученное числовое значение перед выводом в поле Edit необходимо преобразовать в символьное значение. Для этого используются функции присвоения и преобразования. Для присвоения значения поля Edit1 символьной переменной S используется функция: S := EditLText; Для преобразования символьного значения переменной S в целочисленное значение X используется функция: X := StrToInt (S); Для преобразования символьного значения переменной S в вещественное значение X используется функция: X := StrToFloat(S); Для обратного преобразования используется аналогичные функции: S := IntToStr (X); S := FloatToStr (X); Для вывода значения символьной переменной S в поле Edit используется функция: Edit1.Text := S; Многострочное поле ввода и редактирования - Memo. Используется в программах для вывода или ввода большого объёма информации, чаще всего в несколько строк. Примером может быть ввод и отображение полного почтового адреса в адресных книгах. Многие свойства данного компонента аналогичны соответствующим свойствам других компонентов. Главное свойство - Lines - хранит текст. Текст представляет собой пронумерованный набор строк (нумерация начинается с нуля). Содержимое поля может быть задано через Инспектор объектов (свойство Lines), введено при прогоне программы, сформировано динамически (данный способ будет рассмотрен при работе с циклами). Свойства компонента TMemo
Остальные свойства данного компонента будут рассмотрены позднее. Кнопка - Button Один из основных элементов управления в программах. Связанный с кнопкой алгоритм управления реализуется в процедуре OnClick. Основные свойства этого компонента аналогичны соответствующим свойствам других компонентов. Надпись на кнопке создаётся с использованием свойства Caption. Компонент UpDown - счётчик предназначен для пошагового регулирования числовой величины. Он имеет пару кнопок, с помощью которых величина наращивается или уменьшается. Сам по себе этот элемент не имеет возможности что-либо менять, а обычно его связывают с текстовым полем Edit, которое отображает регулируемую величину. Связанный компонент называется компаньоном. Сам компонент UpDown находится во вкладке Win32 Свойства компонента UpDown
Для создания счётчика в окно проекта добавляется два компонента - Edit и UpDown. Для присоединения к компоненту UpDown поля Edit в свойствах первого необходимо открыть свойство Associate и выбрать из списка компонент-компаньон. Полученный объект и есть счётчик в том виде, как мы его привыкли видеть и использовать во всех приложениях Windows. Группировка компонентов с использованием фреймов. Фреймы (англ. frame - рамка) - это контейнер для объединения в одну логическую группу нескольких компонентов. В проектах с простым интерфейсом, где количество компонентов невелико, группировать компоненты нет необходимости. Однако в проектах, где используются компоненты, относящиеся к различным логическим группам, наиболее удобным средством размещения и управления свойствами компонентов являются фреймы. Примером использования фреймов во многих приложениях являются панели инструментов. Добавление фрейма в проект происходит в два этапа: меню File -- New -- Other -- в диалоговом окне New Items в категории Delphi Files выбрать компонент Frame. При этом фрейм создаётся в проекте, но не отображается. • окно (форму) проекта фрейм добавляется с использованием визуального компонента Frame в Палитре компонентов Standard. При первой попытке добавления из Палитры компонентов раздела Standard компонента Frame в форму, система Delphi выдаёт сообщение о том, что в проекте нет созданных фреймов и предлагает путь к созданию фреймов. В дальнейшем в проект можно добавлять аналогично несколько фреймов. Однако после создания фрейма с помощью меню его необходимо добавить в форму из Палитры компонентов Standard. Для каждого нового фрейма будет создан отдельный модуль (unit) и форма для добавления в него компонентов. В этом случае фрейм является контейнером для нескольких компонентов, управление которыми выполняется не в отдельности, а всем фреймом в целом. Например, изменение положение фрейма. В этом случае все компоненты фрейма являются его дочерними компонентами. Практическая часть. Ход работы. Задание 1. Создание интерфейса программы. Создать новый проект. Для окна проекта в Инспекторе объектов задать следующие свойства: Размер формы: ширина - 600 пикселей, высота - 600 пикселей. Заголовок формы - Лабораторная работа № 2. В форму добавить ещё три надписи с текстом: Количество, Цена, Стоимость. Добавить три текстовых поля Edit для дальнейшего использования их для ввода числовых значений количества, цены товара и вывода стоимости. Разместить их под соответствующими заголовками. Для этих полей свойство Text сделать пустым. Значение данного свойства - это тот текст, который автоматически отображается при прогоне программы. Размер каждого из полей задать графически. Добавить в форму две кнопки - объект Button. Для одной из них в свойство Caption ввести Расчёт, для другой - Выход из программы. Размеры и положение кнопок задать произвольно. Интерфейс программы на этом этапе конструирования может иметь следующий вид: Создание кода программы. 1. Логика работы программы такова, что после ввода числовых значений в поля Количество и Цена при щелчке по кнопке Расчёт программа должна рассчитать стоимость товара по формуле [Стоимость] = [Количество] * [Цена] и полученное значение вывести в поле Стоимость. 2. Для выполнения всех этих действий необходимо для кнопки Расчёт (Buttonl) создать процедуру по событию OnClick. Для этого выделить объект Buttonl и в Инспекторе объектов во вкладке Events (События) дважды щёлкнуть в строке события OnClick. Будет создана процедура следующего вида: procedure TForm1.Button1Click(Sender: TObject); begin end; Для передачи в программу введённых в поля Количество и Цена данных, а затем для вывода в поле Стоимость необходимо использовать в процедуре три переменных строкового типа. Например, KolS, CenaS, StoimS - символ S в конце имени каждой переменной условно обозначает, что данные переменные относятся к строковому типу. Для преобразования этих строковых переменных в числовые необходимо использовать в программе ещё три переменных числового формата. Для определённости выберем целочисленные. (Вычисления будем выполнять с целым количеством и ценой, представленной целым числом.). Переменные KolInt, CenaInt, StoimInt - целочисленные. Переменные должны быть объявлены после заголовка процедуры перед телом процедуры. Например, procedure TForm1.Button1Click(Sender: TObject); var //Строковые переменные для количества, цены и стоимости KolS, CenaS, StoimS: string; //Целочисленные переменные для количества, цены и стоимости KolInt, CenaInt, StoimInt: integer; 5. В основной части процедуры необходимо последовательно из полей с ценой и количеством введённые значения присвоить соответствующим символьным переменным, преобразовать в числа, выполнит вычисления и преобразовать результат в символьное значение. Затем его вывести в соответствующее поле. begin //Считываем из поля Количество введённые данные как строковое значение KolS := Edit1.Text; //Считываем из поля Цена введённые данные как строковое значение CenaS:= Edit2.Text; Затем полученные значения преобразовать в числовые значения. //Преобразуем символьные значения в целочисленные KolInt := StrToInt(KolS); CenaInt := StrToInt(CenaS); После преобразования можно вычислять значение стоимости товара в виде целого числа. //Вычисляем стоимость по формуле StoimInt := KolInt * CenaInt; Но перед выводом полученного числового значения в поле Стоимость его необходимо преобразовать в символьное: //Полученное числовое значение стоимости преобразуем в символьное StoimS := IntToStr(StoimInt); Для вывода символьного значения в поле Стоимости его значение необходимо присвоить свойству Text соответствующего поля. //Символьное значение выводим в поле Стоимость Edit3.Text := StoimS; end; 6. Для выхода из программы можно использовать стандартные средства окна проекта, а можно для этого запрограммировать соответствующую кнопку Выход. Для этой кнопки необходимо создать процедуру на событие OnClick, а код процедуры будет содержать только одну единственную команду - метод формы Close. Процедура будет иметь вид: procedure TForm1.Button2Click(Sender: TObject); begin FormLClose; end; 7. Для проверки работоспособности программы сохраните проект под именем Lab3 в отдельную папку и запустите программу на выполнение. Убедитесь, что программа корректно работает в случае ввода в поля Количество и Цена целых чисел. Задание 2. Интерфейс. В окно созданного проекта добавить текстовый заголовок Задание 2. Управление интерфейсом. Добавить два текстовых однострочных поля Edit и два компонента UpDown. В свойствах компонентов UpDown указать, с каким текстовым полем будет работать этот компонент. Кроме того, для ограничения диапазона ввода в счётчиках в свойствах компонентов UpDown задать минимальное значение (Min) равное 600 и максимальное значение (Max) равное 800. На данном этапе конструирования интерфейс приложения может иметь вид: Программный код 3. Логика работы заключается в том, что при использовании счётчика ширины и высоты формы в компоненте Edit происходит изменение значения. В зависимости от заданного значения размеры окна должны меняться. Для написания программного кода в каждом из полей Edit, привязанных к счётчику, необходимо использовать событие onChange. Например, для поля Edit4 со значением ширины окна процедура может иметь следующий вид: begin forml.Width := StrToInt(Edit4.Text); end; При этом ввести программный код необходимо только в 3-й строке этой процедуры. Создать процедуру изменения высоты окна предлагается ввести самостоятельно по аналогии с предыдущим примером. Задание 3. Интерфейс. l. Добавить в проект фрейм и вставить его в форму (окно) проекта. При добавлении визуального компонента Frame из Палитры компонентов автоматически создаётся новый модуль и форма для него. В форму созданного фрейма (она отобразится в отдельной вкладке) добавить компоненты: текстовая надпись Label, однострочное поле для ввода и редактирования Edit, кнопку Button и многострочное поле Memo. В компонентах Label и Button задать свойство Caption. В поле Edit в свойстве Text удалить всё содержимое. В поле Memo для удаления стандартного текста в Инспекторе объектов необходимо открыть свойство Lines. Именно это свойство позволяет управлять содержимым поля Memo и с помощью Инспектора объектов и программным путём. На данном этапе проектирования интерфейс фрейма может иметь следующий вид: 2. Для добавления фрейма с его компонентами в окно проекта в палитре компонентов в разделе Standard необходимо выбрать визуальный компонент Frame и в диалоговом окне Select frame to insert выбрать имя нужного фрейма. После вставки фрейма в окно приложения положение фрейма, его размер, а также положение и размер компонентов, вставленных в него как в контейнер, можно задавать как угодно. Интерфейс программы на этом этапе работы может иметь следующий вид : Программный код. 3. Логика работы программы должна быть такова, что после ввода в поле Edit требуемых данных, пользователь должен нажать кнопку Добавить после чего введённый текст добавляется в многострочное поле Memo, а содержимое поля Edit автоматически очищается. Для кнопки Button необходимо создать процедуру по событию onClick. В этой процедуре введены в поле Edit текст преобразовывать в другой вид данных нет необходимости, поэтому можно в разделе переменных объявить имя одной строковой переменной. Раздел переменных может иметь следующий вид: var s: string; В теле процедуры программный код может иметь следующий вид: //процедура обработки текстовых данных. s:=Frame31.Edit1.Text; Frame31.Memo1.Lines.Add(s); Frame31.Edit1.Text := ''; Переменной s присваивается значение текстового поля Edit, но так как это поле вставлено не в форму непосредственно, в фрейм, то вначале перед именем поля Edit1 указано имя фрейма Frame31 (это имя фрейма в данном примере!). Для вывода текста в поле Memo1 используется его свойство Lines, а для него ещё и метод Add. Для очистки поля Edit1 после добавления текста в многострочное поле используется пустое значение. И в каждом случае перед именем компонента необходимо указать имя его родительского контейнера Frame31. |