ЛАБОРАТОРНЫЕ РАБОТЫ: ТЕОРИЯ И ЗАДАНИЯ

1.Текстовые компоненты Label, Edit, Memo. Кнопка Button

1.1. Метка Label

Иерархия:

TObject <- TPersistent <- TComponent <- TControl <-

<-TGraphicControl <- TCustomLabel

Страница Палитры Компонентов: Standard.

Назначение

Метки предназначены для размещения на экране текстовой информации, содержащей различные пояснения, названия, заголовки и т. д.

Метки в Delphi являются экземплярами класса TLabel. Класс TLabel является потомком класса TCustomLabel, в котором опре­делены основные характеристики меток. Этот класс является непосредственным потом­ком класса TGraphicControl и, поэтому, реагирует только на события от мыши.

Отметим следующие свойства класса TCustomLabel.

type TAlignment = (taLeftJustify, taRightJustify, taCenter);

property Alignment: TAlignment;

свойство определяет выравнивание текста в компоненте. Оно может принимать сле­дующие значения:

taLeftJustify

выравнивание по левому краю;

taRightJustify

вы­равнивание по правому краю;

taCenter

выравнивание по центру.

По умолчанию про­исходит выравнивание по левому краю.

property AutoSize: Boolean;

если значение свойства равно True, то будет автоматически изменяться ширина и высота метки в соответствии с размещенным в ней текстом.

type TTextLayOut = (tlTop, tlCenter, tlBottom);

property LayOut: TTextLayOut;

Свойство определяет положение текста метки по вертикали:

tlTop

расположен в верхней части;

tlCenter

расположен в центре;

tlBottom

расположен в низу.

property Transparent: Boolean;

Если свойство имеет значение True, то фон метки будет прозрачным по отношению к другим компонентам. По умолчанию имеет значение False.

property WordWrap: Boolean;

если свойство имеет значение True, то после заполнения текущей строки будет происходить перенос текста на новую строку. По умолчанию имеет значение False. Для вывода многострочных надписей нужно задать AutoSize = False, WordWrap = True и далее установить подходящие размеры метки.

Метка Label может отображать длинную текстовую строку своего свойства Caption в виде нескольких строк. Если это нужно, то надо установить в свойстве AutoSize значение False, далее задать увеличенные размеры метки и поместить в WordWrap значение True. Однако для отображения действительно многострочного текста нужно воспользоваться имеющимися в Delphi специальными компонентами TMemo и TRichEdit.

Основным для метки является свойство Caption, наследуемое от класса TControl. Именно сюда помещается текст, который будет выводиться на экран.

Метка обрабатывает все события, связанные с использованием мыши и перетаскива­нием компонентов. Событием по умолчанию для метки является событие OnClick.

1.2. Класс TCustomEdit

Назначение

В Delphi имеется несколько компонентов, позволяющих с помощью клавиатуры вво­дить в программу и редактировать разнообразную символьную информацию. Все они об­ладают такими возможностями, как выделение, копирование, удаление, вставка фрагмен­тов, скроллинг текста, в том случае, когда он не умещается в окне и т. д. Из всего набора редакторов мы рассмотрим строку ввода класса TEdit и редактор текста класса ТМеmо.

Большинство стандартных редакторов являются потомками класса TCustomEdit. Класс TCustomEdit, который является потомком класса TWinControl, содержит ряд характери­стик, общих для всех текстовых редакторов. Наиболее важными являются следующие свойства:

property AutoSelect: Boolean;

если свойство имеет значение True (значение по умолчанию), текст будет выделять­ся при активизации редактора.

property AutoSize: Boolean;

если свойство имеет значение True, то будет автоматически изменяться высота ре­дактора в соответствии с размером шрифта.

type TFormBorderStyle = (bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin);

TBorderStyle = bsNone..bsSingle;

property BorderStyle: TBorderStyle;

определяет вид границы редактора: bsSingle одинарная граница, bsNone нет гра­ницы. По умолчанию редактор имеет одинарную границу.

type TEditCharCase = (ecNormal, ecUpperCase, ecLowerCase);

property CharCase: TEditCharCase;

определяет вид букв текста: ecUpperCase прописные, ecLowerCase строчные, ecNormal смешанные.

property MaxLength: Integer;

определяет максимальное число символов, которое можно поместить в редактор. Если значение свойства равно нулю (используется по умолчанию), то в редактор можно поместить произвольное число символов.

property PasswordChar: Char;

задает символ, который будет отображаться вместо реально вводимых символов в редакторе. Такое поведение редактора может пригодиться, если в программе требу­ется использование пароля. Если значением свойства является символ с кодом 0 (зна­чение по умолчанию), то вводимые символы отображаются без преобразования.

property ReadOnly: Boolean;

Если свойство имеет значение True, то текст предназначен только для чтения, т. е. из­менять текст нельзя. По умолчанию имеет значение False.

В классе TCustomEdit имеется ряд методов, реализующих функции редактирования:

НЕ нашли? Не то? Что вы ищете?

procedure Clear; virtual;

удаляет весь текст, помещенный в редактор.

procedure ClearSelection;

удаляет выделенный фрагмент текста.

procedure CopyToClipboard;

копирует выделенный фрагмент текста в буфер Clipboard.

procedure CutToClipboard;

удаляет из текста выделенный фрагмент и помещает его в буфер Clipboard.

procedure PasteFromClipboard;

копирует текст из буфера Clipboard в позицию курсора редактора.

procedure SelectAll;

выделяет весь текст, содержащийся в редакторе.

У большинства редакторов имеются встроенные локальные меню, позволяющие выполнять следующие команды:

Undo

отмена последней выполненной операции в тексте;

Cut

вырезать выделенный фрагмент с помещением его в буфер обмена;

Сору

скопировать выделенный фрагмент в буфер обмена;

Paste

поместить фрагмент из буфера обмена в текст, в позицию курсора;

Delete

удалить выделенный фрагмент;

Select All

выделить весь текст.

1.3. Строка ввода Edit

Иерархия:

TObject <- TPersistent <- TComponent <- TControl <- TWinControl

<- TCustomEdit

Страница Палитры Компонентов: Standard.

Назначение

Строка ввода Edit, являющаяся экземпляром класса TEdit, позволяет вводить и редакти­ровать одну строку текста.

Класс TEdit - непосредственный потомок класса TCustomEdit и наследует все его характеристики. Основным свойством строки ввода является свойство Text:

type TCaption = string;

property Text : TCaption;

содержит символьную строку в редакторе Edit.

Символьная строка может быть помещена в свойство либо на этапе конструирования формы, либо во время выполнения программы. Чаще всего редактор используется для ввода информации. В этом случае на этапе конструирования формы в свойство Text можно поместить пустую строку, а на этапе выполнения программы извлекать из него введен­ные значения. Если вводятся символьные представления числовых данных, то в дальней­шем они должны быть преобразованы при помощи соответствующих подпрограмм пре­образования типа.

Поскольку строка ввода является оконным элементом управления, то она обрабаты­вает все события от мыши и клавиатуры, события, связанные с перетаскиванием, активи­зацией и снятием активизации, а также событие OnChange:

property OnChange: TNotifyEvent;

возникает при изменении текста строки ввода. Является событием по умолчанию для строки ввода класса TEdit.

1.4. Текстовый редактор Memo

Иерархия:

TObject <- TPersistent <- TComponent <- TControl <- TWinControl

<-TCustomEdit <- TCustomMemo

Страница Палитры Компонентов: Standard.

Назначение

Текстовый редактор Memo может содержать в отличие от строки ввода Edit не одну, а любое число строк.

Редактор Memo является экземпляром класса ТМеmо. В свою очередь класс ТМеmо порожден непосредственно от класса TCustomMemo, в котором определены основные характеристики многострочных текстовых редакторов.

Отметим следующие свойства класса TCustomMemo:

property Lines: TStrings;

свойство классового типа TStrings. Задает список строк, помещенных в редактор.

Класс TStrings будет рассмотрен в следующем пункте.

type TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth);

property ScrollBars : TScrollStyle;

Задает наличие линеек скроллинга:

ssNome

нет линеек,

ssHorizontal

только горизонтальная линейка,

ssVertical

только вертикальная линейка,

ssBoth

обе линейки.

property WantReturns: Boolean;

определяет действие клавиши Enter. Если свойство равно True, то при нажатии на клавишу Enter происходит переход на новую строку текста. В противном случае фо­кус ввода передается форме, а переход на новую строку в тексте осуществляется нажатием комбинации клавиш Ctrl+Enter.

Так же, как и строка ввода Edit, многострочный текстовый редактор Memo обраба­тывает все события от мыши и клавиатуры, события, связанные с перетаскиванием, активизацией и снятием активизации, а также событие OnChange, которое является собы­тием по умолчанию.

1.5. Класс TStrings

TStrings - непосредственный потомок класса TPersistent и является абстрактным клас­сом. Объекты этого класса представляют собой списки строк. С каждой строкой может быть связан некоторый объект, например рисунок или пиктограмма. Если со строкой не свя­зан никакой объект, то указатель на него равен nil.

Назначение

Класс TStrings является классом общего назначения и используется для определения свойств соответствующего типа (списков строк) во многих ком­понентах Delphi.

Рассмотрим основные свойства класса TStrings:

property Count: Integer;

определяет число элементов в списке.

property Objects[Index: Integer]: TObject;

определяет указатель на объект, ассоциированный со строкой с индексом Index.

property Strings[Index: Integer]: string;

определяет строку списка с индексом Index. Индекс первой строки - 0.

property Text: string;

содержит все строки списка, включая разделители символы возврата каретки и пе­ревода строки (#13#10).

Основные методы, определенные в классе TStrings:

function Add(const S: string):

Integer; virtual;

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

function AddObject(const S: string; AObject: TObject): Integer;

virtual;

добавляет строку S и связанный с ней объект AObject в список и возвращает индекс строки и объекта в списке.

procedure AddStrings(Strings: TStrings); virtual;

добавляет список другого объекта Strings класса TStrings к текущему списку.

procedure BeginUpdate;

фиксирует начало обновления списка. При этом временно прекращаются перерисов­ки на экране.

procedure Clear; virtual; abstract;

удаляет все строки и указатели на объекты из списка.

procedure Delete(Index: Integer); virtual; abstract;

удаляет из списка элемент с индексом Index.

procedure EndUpdate;

фиксирует завершение обновления списка и при необходимости сортирует строки.

procedure Exchange(Index1, Index2: Integer); virtual;

меняет местами два элемента списка с индексами Index1 и Index2.

procedure Insert(Index: Integer; const S: string); virtual;

abstract;

вставляет в список строку S под индексом Index.

procedure InsertObject(Index: Integer; const S: string;

AObject: TObject);

вставляет в список строку S и объект AObject под индексом Index.

procedure LoadFromFile

(const FileName: string); virtual;

загружает список из файла с именем FileName.

procedure Move(CurIndex, Newlndex: Integer); virtual;

перемещает элемент списка из позиции CurIndex в позицию NewIndex.

procedure SaveToFile(

const FileName: string); virtual;

помещает список в файл с именем FileName.

1.6. Кнопка Button

Иерархия:

TObiect <- TPersistent <- TComponent <- TControl <- TWinControl

<- TButtonControl

Страница Палитры Компонентов: Standard.

Назначение

Основное назначение кнопки - формирование события при нажатии на нее. Кнопка может быть размещена в любом месте формы, где есть необходимость выполнить ка­кие-либо действия при ее нажатии. Кнопка Button является экземпляром класса TButton, предками которого являются классы TButtonControl и TWinControl. Это означает, что кнопка Button представляет собой оконный элемент управления.

В классе TButton добавлены следующие свойства:

property Cancel: Boolean;

если свойство имеет значение True, то нажатие на клавишу Esc будет эквивалентно нажатию на данную кнопку.

property Default: Boolean;

если свойство имеет значение True, то нажатие на клавишу Enter будет эквивалентно нажатию на данную кнопку, если какая-либо другая кнопка не находится в фокусе ввода.

type TModalResult = Low(Integer)..High(Integer);

property ModalResult : TModalResult;

Свойство, используемое при закрытии модальных окон (модальное окно - это окно, во время работы которого невозможен доступ к другим окнам данного приложения). Для обычных окон значение этого свойства должно быть равно mrNone.

В классе TButton определен метод Click:

procedure Click; override;

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

Особенностью кнопки класса TButton является то, что она не обладает свойством Color и цвет фона для нее определяется операционной системой Windows.

Кнопка класса TButton обрабатывает все события, определенные для оконного эле­мента управления. Событием по умолчанию для кнопки является событие OnClick.

Пример использования компонентов Label, Edit, Memo и Button

Пример 1.1. Задание - Составить программу, вычисляющую корни квадратного уравнения

а2 * х2 + а1 * х + а0=0

с произвольными коэффициентами (a2 ≠0).

Решение

1.  Создадим папку D:\MyProject\Text (можно любую другую).

2.  Откроем новое приложение с помощью команды главного меню File | New
Application.

3.  На форме Form1 разместим следующие компоненты: четыре метки Label, три компонента Edit, один редактор Memo и две кнопки Button

Все компоненты берем со страницы Standard Палитры Компонентов.

4. Свойству Caption метки Label1 зададим значение:

Введите коэффициенты квадратного уравне­ния

А2 * Х^2+А1 * Х+А0 = 0

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

AutoSize - False,

WordWrap - True,

Alignment - taCenter.

Размеры метки и ее местоположение можно отрегулировать вручную.

Перейдем в свойство Font и щелкнем по кнопке с тремя точками. В появившемся окне изменим размер шрифта с 8 на 10. Нажмем ОК.

5.  Для меток Label2, Label3 и Label4 установим свойство Caption равным ‘А0 = ‘, ‘ А1 = ‘ и ‘ А2 = ‘ соответственно.

6.  Для компонентов Edit1, Edit2 и Edit3 установим значение свойства Text равным пустой строке.

7.  Для компонента Memo1 выберем свойство Lines и щелкнем по кнопке с тремя
точками. В появившемся окне Stringlist editor удалим строку ‘Memо1’. Нажмем ОК.

8.  Кнопкам Button1 и Button2 установим свойство Caption равным ‘Решение’ и ‘Очистить’ соответственно.

9.  Двойным щелчком активизируем кнопку Решение и для обработчика события
OnClick вставим следующие строки:

procedure TForm1.Button1Click(Sender: TObject);

var a0, a1, a2, d, x1, x2 : double;

begin

a0 := StrToFloat(Edit1.Text);

al := StrToFloat(Edit2.Text);

a2 := StrToFloat(Edit3.Text);

d := a1*a1-4*a2*a0;

if d>=0 then begin

xl := (-a1+sqrt(d))/(2*a2);

x2 := (-a1-sqrt(d))/(2*a2);

Memo1.Lines. Add(‘Результат:’);

Memo1.Lines. Add(‘x1 = ’+ FloatToStrF(x1,ffGeneral,7,2));

Memo1.Lines. Add(‘x2 = ’+ FloatToStrF(x2,ffGeneral,7,2));

end

else

Memo1.Lines. Add(‘Решений нет:’);

end;

10. Нажмем клавишу F12 и вернемся в форму. Двойным щелчком активизиру­ем кнопку «Очистить» и в обработчик события OnClick вставим строку

Memo1.Clear;

11.Сохраним проект в папке D:\MyProject\Text и запустим приложе­ние на выполнение, используя функци­ональную клавишу F9 или кнопку «зелёный треугольник». Для решения квадратного уравнения введем коэффи­циенты и нажмем кнопку Решение. Для очистки окна редактора нажмем кнопку «Очистить»

Полный текст сформированного модуля Unit1.pas

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Label1 : TLabel;

Label2 : TLabel;

Label3 : TLabel;

Label4 : TLabel;

Edit1 : TEdit;

Edit2 : TEdit;

Edit3 : TEdit;

Memo1 : TMemo;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation {$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var a0,a1,a2,d, x1,x2 : double;

begin

a0 := StrToFloat(Edit1.Text);

a1 := StrToFloat(Edit2.Text);

a2 := StrToFloat(Edit3.Text);

d := a1*a1-4*a2*a0;

if d>=0 then begin

x1 := (-a1+sqrt(d))/(2*a2);

x2 := (-a1-sqrt(d))/(2*a2);

Memo1.Lines. Add(‘Результат:’);

Memo1.Lines. Add(‘x1 =’+ FloatToStrF(x1, ffGeneral,7,2));

Memo1.Lines. Add(‘x2 =’+ FloatToStrF(x2, ffGeneral,7,2));

end

else

Memo1.Lines. Add(‘Решений нет:’);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Memo1.Clear;

end;

end.