Беседа о компонентах для ввода-вывода текста и о свойствах, общих для многих компонентов
Как пользоваться встроенной справкой Делфи
Во встроенной справке Делфи содержится достаточно полная информация. К сожалению, на английском. Аналогичная русская справка распространяется (платно, около 300р) известным автором учебников А.Я. Архангельским:
( см на сайте )
При помощи встроенной справки Делфи легко найти список свойств какого-либо объекта.
Даже для незнающих английский эта справка полезна, в ней можно (хотя и не всегда) найти примеры,
иллюстрирующие применение того или иного свойства или метода. Есть несколько способов добраться до справки (на примере компонента Label):
- Если на форме есть компонент Label, то в окне редактора можно найти его описание: Label1: TLabel; если его нет - можно написать (где-нибудь): { TLabel }
Поставим ТЕКСТОВЫЙ курсор на TLabel и нажмем F1. Появится окошко, в котором нужно выбрать TLabel (VCL Reference). Появится справочное окно для TLabel.
- 2-й способ. Пусть мы видим в окне инспектора объектов свойства Label1.
Чтобы получить справку о свойстве Cursor (например), выделите строку Cursor и нажмите F1. Появится окно, в котором нужно выбрать (VCL Reference). Появится окно справки для свойства Cursor. Кстати, здесь есть пример. Чтобы его увидеть, щелкните ссылку "Delphi example". В примере описано, как добавить к проекту самодельный курсор. Для перевода можно применить, например, TranslateIt.
- 3-й способ. На панели компонентов (с которой перетаскиваем) выделить компонент и нажать F1. Далее - аналогично.
Все, что изложено ниже, получено из справочной системы.
Компонент Label (класс TLabel)
Показывает текст, присвоенный свойству Caption, но не позволяет его редактировать.
Можно организовать многострочный показ, если присвоить св-ву WordWrap значение true (это можно сделать в инспекторе объектов), а св-ву AutoSize - false. Большинство свойств (как и у других компонентов) программист оставляет без внимания, надеясь что им присвоены подходящие значения по умолчанию. Чаще всего используется только Caption.
Св-ву FocusControl можно присвоить объект, способный получать фокус ввода (например,
класса TEdit или TMemo, TListBox ) и пользоваться горячими клавишами для передачи фокуса этим объектам. Например, разместим около окошка Edit2 надпись Label1, заполним Label1.Caption
текстом: Ф&амилия а свойство Label1.FocusControl = Edit2 (выбор из списка в инспекторе).
При работе откомпилированной программы буква a в слове Фамилия будет подчеркнутой, а если нажать Alt а, то курсор ввода перейдет на Edit2 и можно будет вводить фамилию.
Рассмотрим на примере Label те св-ва и обрабатываемые события, которые есть у многих компонентов.
Свойства (Properties)
property
Caption: TCaption
А что такое TCaption ?
type TCaption = type string; - т е это просто строка (содержит текст - цепочку символов).
property
Alignment: TAlignment; узнаем, что такое TAlignment:
type TAlignment = (taLeftJustify, taRightJustify, taCenter);
т е это перечисляемый тип, знакомый по Паскалю. Возможные значения перечилены в скобках и означают: левое, правое, центральное. Т е текст внутри прямоугольного окна Label можно прижать влево, вправо или центрировать.
property
AutoSize: Boolean; если = True, размеры окна Label автоматически подстраиваются под длину текста. (Так установлено по умолчанию).
property
FocusControl: TWinControl; - описано
выше в тексте
property
Transparent: Boolean; - если = True, фон окна Label прозрачный.
property
WordWrap: Boolean; - если = true, то слова, выходящие за правую границу окна
автоматически переносятся на новую строку.
property
Canvas: TCanvas; Используя это св-во, можно рисовать в окне Label, вставлять картинки из буфера обмена, потока, файла.
Однако рассматрим это позже.
property
Anchors: TAnchors; т е якоря.
type TAnchors = set of TAnchorKind;
type TAnchorKind = (akTop, akLeft, akRight, akBottom);
По умолчанию Anchors = [akTop, akLeft], где akTop означает, что при изменении размеров окна-хозяина этого Label будет автоматически поддерживаться расстояние до верхней кромки
окна-хозяина. Аналогично, akLeft автоматически поддерживает расстояние до левой кромки
окна-хозяина. Иногда удобнее поддерживать расстояние до правой и нижней кромки окна-хозяина
(например, формы). Так, если Label или кнопка Button установлены около правой и нижней кромки
формы, то нужно установить (в инспекторе объектов) Anchors = [akRight, akBottom]. Тогда эта
Label или Button будет "следить" за правым нижним углом формы при изменении размеров формы.
Если установить Anchors = [akTop, akLeft, akRight, akBottom], то Label будет растягиваться-сжиматься при изменении размеров формы. Заодно подчеркнем, что type TAnchors -
множество, а TAnchorKind - перечисляемый тип, т е не зря их ввели еще в Паскаль.
property
Color: TColor; а что такое TColor? Вроде бы, яно - цвет. Но заглянем в справку:
type TColor = -$7FFFFFFF-1..$7FFFFFFF; - т е это некоторый тип-диапазон целочисленных значений. Цвет кодируется числом. Это ясно. В Делфи есть много констант для популярных цветов: clWhite, clBlue,
clButtonFace и т п. Вы можете в программе распечатать значения этих констант, только зачем?
Здесь важно, что это цвет фона окошка Label, а не цвет символов текста.
property
Cursor: TCursor; где:
type TCursor = -32768..32767; имеются константы для популярных курсоров:
crArrow = -2 - стрелка (обычный курсор)
crCross = -3 - крест
crHourGlass = -11 - песочные часы и т д.
Если присвоить Label.Cursor := crHourGlass, то при наведении курсора на эту Label курсор примет вид песочных часов, что обычно есть признак: подождиите немного.
property
Enabled: Boolean; если Enabled = false, то объект недоступен. Он изображается тусклым цветом,
и недоступен (не работает).
property
Font: TFont; очень важное св-во: шрифт, которым выводится текст. Шрифт - объект, т е
у него есть свои свойства, из которых отметим:
- Charset - кодировка. рекомендуется RUSSIAN_CHARSET. По умолчанию: DEFAULT_CHARSET, это менее надежно.
- Color - цвет,
- Name - имя, например, Arial, Courier New и т п
- Size - размер шрифта в точках (обычный для windows: 10,12, и т п)
- Style:TFontStyles;
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut); т е жирный, наклонный, подчеркнуый,
перечеркнутый
TFontStyles = set of TFontStyle;
property
Height: Integer; - высота окна видимого объекта (например, Label) в пикселах т е точках экрана.
property
Hint: string; - это текст подсказки, который появляется при наведении курсора на
данный объект (но должно выполняться .ShowHint = true (см ниже))
property
Left: Integer; координата (расстояние от левого края объекта до левого края окна-хозяина)
property
ParentFont: Boolean; - если = true, то объект имееет тот же шрифт, что и родительское окно. Например, Label, установленная на форму, наследует шрифт формы.
Аналогично: ParentColor, ParentShowHint.
property
PopupMenu: TPopupMenu; Используя это св-во, можно присоединить к объекту всплывающее меню, т е меню, всплывающее при правом щелчке по объекту. Меню содается отдельно (перетаскивается с палитры компонентов. Но об этом позже).
property
ShowHint: Boolean; - если = true, то при наведении курсора на объект всплывает (через ... секунд) подсказка .hint (см выше).
property
Top: Integer; координата (расстояние от верхнего края объекта до верхнего края окна-хозяина)
property
Visible: Boolean; - если = false, то объект не виден.
property
Width: Integer; - ширина окна видимого объекта (например, Label) в пикселах т е точках экрана.
property
Owner: TComponent; - объект, который заботится о создании и освобождении (удалении) данного объекта.
property
Parent: TWinControl; - объект, внутри которого размещен данный объект (обычно это форма или группирующий элемент).
События (Events), для которых программист может назначит процедуру обработки, т е задать какие-то действия, которые программа выполнит при наступлении этого события
property
OnMouseEnter: TNotifyEvent; - когда курсор "наезжает" на объект.
( type TNotifyEvent = procedure (Sender: TObject) of object; )
property
OnMouseLeave: TNotifyEvent; - когда курсор покидает объект.
property OnClick: TNotifyEvent; - мышиный щелчок по объекту.
Пример обработки такого события (объект - кнопка Button) см
TForm1.btnCalcClick TForm1.btnDixotClick в первом проекте (
дихотомия).
property
OnContextPopup: TContextPopupEvent; - правый щелчок на объекте.
type TContextPopupEvent = procedure(Sender: TObject; MousePos: TPoint, var Handled: Boolean) of object;
property
OnDblClick: TNotifyEvent; - двойной мышиный щелчок по объекту.
property
OnMouseDown: TMouseEvent; - нажата кнопка мыши.
type TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
где:
type TMouseButton = (mbLeft, mbRight, mbMiddle); т е можно узнать, какая кнопка нажата.
type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble); т е можно распознать нажатие клавиш Shift, Alt, Ctrl, мышиных клавиш и двойной щелчок.
X,Y - координаты курсора (мышиного)
и т д.
Компонент Edit (класс TEdit)
Это небольшой текстовый редактор, окно которого применяется для ввода данных.
Откроем окно справки для Edit. Щелкнув по ссылке Hierarchy, мы увидим всех предков этого компонента, но эти сведения не очень нужны. Далее можно щелкнуть ссылку Properties, увидеть список свойств (и ужаснуться: как их много !). В этом списке выделено: у какого предка впервые появляется свойство, но это для нас сейчас не важно. Количество св-в не должно
нас пугать по двум причинам:
1. Большинство св-в начинающие могут не использовать.
2. Все свойства имеют значения по умолчанию. Эти значения можно не изменять, т е не обращать на них внимания.
Некоторые свойства компонента Edit
Займемся только часто используемыми св-вами, причем теми, которые отсутствуют у Label. Щелкнув св-во в списке, получим справку о нем.
- property Text: TCaption; т е string - строка. Когда мы вписываем текст в окошко Edit, этот текст сохраняется св-вом Text.
- property ReadOnly: Boolean; если = true, текст в окошке нельзя редактировать, т е значение св-ва Text во время работы проекта пользователь не может изменить.
- property PasswordChar: Char; - если отлично от #0, то этим символом в окошке заменяются введенные символы. Обычно используется, чтобы скрыть пароль.
Часто используемые (настраиваемые) свойства показаны в инспекторе объектов и обычно там же и настраиваются (т е на этапе разработки, хотя могут изменяться и программно, во время работы, путем присваивания новых значений - как обычным переменным)
Некоторые события, на которые может реагировать Edit
Некоторые методы компонента Edit
Вспомним, что метод - это просто подпрограмма, являющаяся частью структуры объекта.
- procedure SetFocus; virtual; - программно передает фокус этому Edit. Например, если при выполнении какой-то продпрограммы встретится оператор Edit2.SetFocus, то Edit2 получит фокус ввода. Используется для автоматической (программной) передачи фокуса нужным окошкам. - есть пример.
- procedure Hide; - делает это окошко невидимым. Например: Edit3.Hide - прячет окно Edit3.
- procedure Show; - делает это окошко видимым. Интересно, что Hide и Show просто изменяют значение свойства Visible
Компонент StaticText (класс TStaticText)
Похож на Label. Но не имеет св-ва WordWrap. Если AutoSize установить в false, то текст, выходящий
за правую рамку окна, переносит на следующую строку. Имеет возможность настраивать внешний вид
рамки изменением св-ва
property BorderStyle: TStaticBorderStyle; где:
type TStaticBorderStyle = (sbsNone, sbsSingle, sbsSunken);
где sbsSunken - утопленное окно.
Отображаемый текст хранится в свойстве Caption.
Многострочные компоненты (Memo, ListBox, ComboBox)
Многострочные компоненты используют для хранения списка строк класс TStrings, поэтому вначале рассмотрим TStrings.
Класс TStrings
TStrings имеет св-ва и методы для:
- Добавления строк (в конец списка или после указанной строки),
- Удаления строк (по заданному номеру),
- Перестановки строк,
- Доступа к строке, расположенной в заданной позиции,
- Чтения списка строк из и записи этого списка в файл или поток.
- Связывания объекта с каждой строкой списка,
- Представления строк в виде списка пар: имя - значение.
У компонента Memo есть св-во Lines класса TStrings, а у компонентов
ListBox ComboBox - св-во Items класса TStrings. Сам класс TStrings является абстрактным, т к в нем не реализованы многие методы. Поэтому нельзя создавать объекты класса TStrings. Используются только потомки TStrings.
Некоторые свойства класса TStrings
- property Count: Integer; - число строк в списке,
- property Strings[Index: Integer]: string; - отдельная строка. Индекс верхней строки = 0,
а самой нижней = Count - 1,
- property Objects[Index: Integer]: TObject; - отдельный объект, присоединенный к строке №
Index. Перед удалением строки или списка нужно удалять объект (т е строка не является владельцем (owner) объекта). Присоединять объект можно либо присвоением Objects[I] := <объект> либо методами InsertObject, AddObject
- property Text: string; - все строки списка в виде единой строки. Строки списка разделены
символами #13#10,
- property Names[Index: Integer]: string; - если список представляет собой список пар
Name <символ-разделитель> Value, то Names[i] - (i+1)-е значение Name (счет с нуля). Иными словами, это часть (i+1)-й строки списка, расположенная левее <символа-разделителя>.
- property Values[const Name: string]: string; - Values[i] - это правая часть
(правее <символа-разделителя>) строки списка, левая часть которой есть Name.
Некоторые методы класса TStrings
- procedure Append(const S: string); - добавляет строку S в конец списка,
- procedure Clear; virtual; abstract; - очищает список строк и удаляет ссылки на присоединенные
объекты,
- procedure Assign(Source: TPersistent); override; - заполняет список строк строками источника
Source, присоединенные объекты копируются.
- procedure Delete(Index: Integer); virtual; abstract; - потомки используют Delete(Index) для удаления строки номер Index из списка (для первой строки Index=0). Ссылка на присоединенный объект тоже удаляется.
- 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) virtual; - вставляет объект AObject и строку S в список. Объект AObject должен быть создан ранее. Фактически
AObject есть указатель. Index - порядковый номер вставленной строки в списке (отсчет с нуля).
- procedure LoadFromFile(const FileName: string); virtual; - загружает список строк из файла FileName.
- procedure SaveToFile(const FileName: string); virtual; - сохраняет список строк в файле FileName. Каждая строка списка сохраняется как строка текстового файла.
- procedure SetCapacity(NewCapacity: Integer); virtual; - потомки используют этот метод для изменения св-ва Capacity - т е емкости списка (количество строк, которые может хранить список).
(Обычно емкость списка достаточна и SetCapacity не используется).
Компонент Memo (класс TMemo)
Компонент предназначен для хранения, редактирования, показа в окне, чтения из и записи в
файл или поток многострочного длинного текста (в Win9* - не более 64 Кб). Может владеть полосами скроллинга (прокрутки): вертикальной и горизонтальной.
Некоторые свойства класса TMemo:
- property Lines: TStrings; - который описан выше.
- property WordWrap: Boolean; - если = true, то текст, выходящий за правую границу окошка, переносится на следующую строку. В этом случае должен отсутствовать горизонт. скроллинг.
По умолчанию = true.
- property ReadOnly: Boolean; - если = true, то юзер не может редактировать текст в окошке.
По умолчанию - false.
- property Text: TCaption; - все строки списка в виде единой строки.
Некоторые методы класса TMemo:
- procedure Append(const Text: WideString); - добавляет строку Text в конец существующего текста. Обычно для этого используют Memo.Lines.Append(S);
- procedure Clear; virtual; - удаляет весь текст. ( Присваивает Memo.text := '';)
Объекты класса TMemo реагируют на те же события, что и Edit
Компонент ListBox (класс TListBox)
Предназначен для хранения списка строк, выделения (выбора), удаления и добавления отдельной строки списка.
Некоторые свойства класса TListBox:
- property Columns: Integer; - количество колонок в окне списка.
- property Count: Integer; - количество строк (Items) в списке.
- property ItemIndex: Integer; - № выбранной (выделенной) строки (отсчет номеров с нуля).
- property Items: TStrings; - класс описан выше.
- property MultiSelect: Boolean; - если = true, то можно выделять несколько строк.
- property SelCount: Integer; - количество выделенных строк (если MultiSelect=true)
- property Selected[Index: Integer]: Boolean; - если Selected[I] = true, то строка с номером I выделена (отсчет номеров с нуля).
- property Sorted: Boolean; - если = true, то вставляемые и добавляемые строки
ставятся по алфавиту. Если Listbox.style = lbVirtual или = lbVirtualOwnerDraw, сортировка не производится.
- property Style: TListBoxStyle; где
type TListBoxStyle = (lbStandard, lbOwnerDrawFixed, lbOwnerDrawVariable, lbVirtual, lbVirtualOwnerDraw); - уточняйте сами или напишите, если нужно.
Некоторые методы класса TListBox:
- procedure AddItem(Item: String; AObject: TObject); - добавляет в конец списка строку Item и
объект AObject.
- procedure Clear; - очищает список. Употреблять ListBox.Clear правильнее чем
ListBox.Items.Clear.
- procedure ClearSelection; - отменяет выделение всех выделенных строк. При этом строка, выделенная последней получает фокус, хотя и становится невыделенной.
- procedure DeleteSelected; override; - удаляет выделенные строки.
- function ItemAtPos(Pos: TPoint; Existing: Boolean): Integer; - возвращает индекс
(т е № ) строки, которой принадлежит заданная точка Pos. Если Existing=true, то функция возвращает -1 , когда для заданной точки нет строки (не существует). В противном случае - возвращает индекс последней строки + 1.
- function ItemRect(Item: Integer): TRect; - возвращает прямоугольник (TRect), который ограничивает заданую индексом строку.
Компонент ComboBox (класс TComboBox)
Сочетает в себе Edit и выпадающий список строк, в котором можно выбрать одну строку.
Выбранная строка заносится в окошко редактора
Некоторые свойства класса TComboBox:
(Пояснения см TListBox)
- property Sorted: Boolean;
- property ItemIndex: Integer;
- property Items: TStrings;
Некоторые методы класса TComboBox:
(Пояснения см TListBox)
- procedure AddItem(Item: String; AObject: TObject);
- procedure Clear; override;
- procedure ClearSelection; override
- procedure DeleteSelected; override
- function Focused: Boolean; override; - если = true, то ComboBox имеет фокус.