От Delphi 4 к Delphi 5 часть 16
От Delphi 4 к Delphi 5 Палитра компонентов.
Страница WIN3.1.
Некоторые из ниже перечисленных компонентов в функциональном плане повторяют компоненты страниц Data Controls и Win32, но отличаются от них внешним представлением (рисунок 1). Компоненты страницы WIN3.1 . обеспечивают совместимость с предшествующими версиями Delphi.
Компонент DBLookupList представляет собой список выбора базы данных.
Компонент DBLookupCombo представляет собой комбинированный список выбора базы данных.
Компонент TabSet (набор закладок), в отличие от компонента TabControl, не может служить контейнером для размещения других компонентов. Поэтому обычно работает совместно с каким-либо компонентом-контейнером (чаще всего с компонентом Notebook ).
Компонент OutLine (дерево выбора) подобен компоненту TreeView страницы Win32, он предназначен для отображения иерархических структур данных (каталогов, например).
Компонент TabbedNotebook (набор панелей с закладками) представляет собой объединение TabSet и Notebook в готовый многостраничный блокнот с закладками. В отличие от TabSet, закладки в TabbedNotebook могут располагаться в несколько рядов.
Компонент Notebook (набор панелей без закладок) представляет собой многостраничный контейнер. Notebook обычно работает в паре с TabSet и предназначен для размещения других компонентов на нескольких перекрывающих друг друга страницах (панелях).
Компонент Header (управляющий заголовок) представляет собой заголовок с множеством колонок (секций), размеры которых регулируются. Каждая секция заголовка может содержать текст или графику.
Компонент FileIistBox (панель выбора файлов) представляет собой панель с именами файлов. Совместно с компонентами DriveComboBox, FilterComboBox, DirectoryListBox может использоваться для создания диалоговых окон доступа к файлам.
Компонент DirectoryListBox (панель выбора каталогов) представляет собой панель с именами каталогов.
Компонент DriveComboBox (панель выбора дисков) представляет собой список выбора с именами доступных дисков.
Компонент FilterComboBox (панель фильтрации файлов) представляет собой список выбора с расширениями файлов.
Форма как класс.
Взглянем на форму Delphi еще раз. Сгенерированная средой, она является экземпляром класса формы. Каждая форма является отдельным классом. Когда вы создаете пустую форму в новом проекте, интегрированная среда Delphi генерирует код, который определяет новый класс, называемый по умолчанию TForm1, являющийся потомком TForm .
Сгенерированный код класса выглядит следующим образом:
type TForm1 = class(TForm) … end;
Объявление класса выглядит просто, но вы уже имеете значительное количество данных и кода, унаследованных от TForm. Если вы посмотрите на окно инспектора объекта, то можете обнаружить несколько свойств, которые определяет даже пустая форма. Эти свойства ведут себя подобно полям данных.
Класс объявляется внутри блока type следующим образом:
type ИмяКласса = class(ИмяРодительского Класса). <Объявления класса> end;
Объявленный класс определяет структуру представителей класса и выбор допустимых операций, которые могут выполняться с представителями этого класса.
Рассмотрим в качестве примера текст модуля программы Drag (занятие 8). Единственное изменение, которое проведем в программе, это изменим имя формы с Form1, принятое по умолчанию, на Dragging.
Сгенерированный код выглядит следующим образом.
implementation
{$R *.DFM}
Итак, как вы видите, форма – это пример класса, особый объект в том смысле, что она соответствует элементу видимого интерфейса и создается в процессе интерактивной работы путем переноса на нее компонентов. Она является классом, подобно любым другим, имеет родителя TForm и определяет несколько полей.
Пустой шаблон класса TDragging был создан Delphi в то время, когда вы затребовали новую форму. Затем содержание класса наполнялось операторами по мере того, как вы добавляли компоненты на нее, вы видите, что все они добавлены в определение класса TDragging сразу после заголовка класса.
Описание этой секции менять нельзя. Она зарезервирована для автоматического генератора кода Delphi. Если возникает необходимость удаления компонентов из этой секции, то необходимо обратиться к Редактору формы и выполнить необходимые действия там. По мере добавления или удаления компонентов на форму, необходимые поля автоматически добавляются к коду или удаляются вами те, которые были ранее добавлены в определение формы.
Разделы private и public в описании класса Delphi оставляет без изменения, и вы можете определить здесь свои собственные элементы.
Таким образом, имеется пример класса с несколькими полями. Эти поля представляют собой компоненты, которые вы добавили к форме. Технически все они – ссылки на объекты, действующие подобно ссылочным переменным, посредством которых вы имеете доступ к компонентам объектов (рисунок 2). GroupBox1, Label1, Label2, Label3, Label4, Label5, Memo1, GroupBox2, Edit1, StatusBar1 – называются полями косвенного доступа, указывающими на другие экземпляры объектов, которыми форма владеет во время выполнения.
Так как Delphi создает описание класса формы, она также берет на себя ответственность по управлению полями во время выполнения программы. Делая класс TDragging наследником TForm, вы получаете гарантию того, что все требуемые действия по инициализации и уничтожению объектов будут происходить автоматически.
Блок описания типов в строках 6 – 28 объявляет внутреннюю структуру экземпляра класса. В дополнение к тем полям и свойствам, которые TDragging унаследовал от своего предка TForm, добавлено несколько новых полей. Таким образом, исходный класс был расширен, а его потомок, Tdragging, требует немного больше памяти, чем он занимал, если бы вы не размещали на форме визуальные компоненты. Теперь экземпляр TDragging содержит дополнительно десять переменных, или полей, определенных в описании класса.
Просто описание формы TDragging не создает ее экземпляров, которые могут быть использованы во время выполнения. Хотя Delphi автоматически объявляет переменную в строке 30, резервируя место для ссылки на экземпляр формы, эта переменная не может быть использована до тех пор, пока что-нибудь не выполнит ее инициализацию. Это "что-нибудь" – оператор, находящийся в основном исходном файле проекта, который создает новый экземпляр формы и присваивает ссылку на него экземпляру переменной TDragging.
Вы можете проверить, что форма действительно создается в основном файле проекта. Для этого необходимо открыть меню Project, из раскрывшегося списка выбрать команду View Source.
В нижней части появившегося файла источника вы увидите следующий код:
begin Application.Initialize; Application.CreateForm(TDragging, Dragging); Application.Run; end.
Оператор CreateForm является гарантией, что экземпляр формы существует и доступен тогда, когда он понадобится вам. Вы можете использовать его для доступа к экземпляру формы после начала работы программы.
Необходимо заметить. Что программа пока ничего не делает. Вы только создали видимую конструкцию для части интерфейса пользователя.
Компонент ListBox.
Иногда вам понадобится окно списка, в котором имеется возможность выбирать больше одного элемента одновременно.
Для этого необходимо переключить значение свойства MultiSelect компонента ListBox на True, чтобы перевести его в режим окна списка с выбором многих элементов (или многократным выбором).
Окна списка с многократным выбором подразделяются на две категории:
— с расширенным выбором (Extended-selection);
— с многократным выбором (Multiple-selection).
Главное отличие поведения компонента ListBox с многократным выбором от расширенного выбора определяется значением свойства ExtendedSelect окна списка.
Окна списка с расширенным выбором позволяют сразу выбрать много элементов из списка, если свойства MultiSelect и ExtendedSelect установлены равными True.
В этом случае возможен выбор как смежных, так и непересекающихся блоков элементов с помощью мыши или клавиатуры:
если нажать левую кнопку мыши на элементе списка и, не отпуская кнопки, перемещать ее по элементам списка, то будет производиться их выделение;
щелчок на элементе при нажатой клавише Shift расширяет выбор, формируя смежный блок из отобранных элементов;
щелчок на элементе при нажатой клавише Ctrl переключает состояние выбора этого элемента и позволяет выбирать отдельные элементы из списка.
Окна с многократным выбором полезны тогда, когда необходимо выбрать несколько элементов из списка, не сгруппированных каким-либо осмысленным способом. Чтобы получить такое окно списка с многократным выбором, необходимо переключить свойство ExtendedSelect на False, а свойство MultiSelect — в True. После запуска программы убедитесь, что расширять выбор уже нет возможности. Выбор или отмена каждого элемента выполняется индивидуально и независимо от других элементов. То есть первый щелчок приводит к выделению элемента, второй щелчок по этому же элементу снимает выделение. Чтобы выделить несколько элементов, необходимо последовательно произвести по ним щелчки левой кнопкой мыши. На рисунке 3 показан результат выбора элементов в списках различного назначения.
Рассмотрим пример, который позволяет использовать компонент ListBox и Button в приложении. Добавьте на форму эти компоненты и напишите программный код, предложенный ниже. Окно списка уже содержит строки, когда появляется форма.
procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin ListBox1.MultiSelect := False; Button1.Caption := 'Строка в начало списка'; for I := 1 to 10 do ListBox1.Items.Add('СТРОКА ' + IntToStr(I)); end; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Move(ListBox1.ItemIndex, 0); end;
Рассмотрим для компонента ListBox некоторые свойства, размещенные на странице Properties инспектора объекта.
Свойство Columns определяет количество колонок элементов в списке. По умолчанию установлено значение 0. В этом случае, если число элементов превышает размеры окна списка, появляется вертикальная полоса прокрутки и список увеличивается вниз. Если установить значение Columns равным 1, то в этом случае, если число элементов превышает размеры окна списка, появляется горизонтальная полоса прокрутки и список увеличивается вправо. В окне списка вы можете видеть только одну колонку. Увеличение значения Columns приводит к увеличению числа видимых колонок, но при этом необходимо учитывать размеры окна списка. Иначе число колонок будет таким, каким вы определили, но видно будет только часть текста в строках.
Свойство Sorted разрешает или отменяет сортировку строк в алфавитном порядке.
Свойство IntegralHeight управляет высотой окна списка. Когда IntegralHeight равно True и свойство Style имеет значение lbOwnerDrawFixed, в окне списка будет отображаться целое число элементов, т.е. не будет элементов с частичным отображением. Если IntegralHeight - False, высота окна списка может устанавливаться в любую величину, что приводит к неполному отображению последнего элемента списка (рисунок 4). Это свойство работает совместно с Columns, установленное в 0 значение.
Для создания следующего примера под названием "Координаты компонентов" добавьте на форму кнопку Button, компонент StatusBar и окно списка ListBox . Установите свойство SimplePanel для компонента StatusBar на странице Properties инспектора объекта в True. Программный код приведен ниже.
Программа работает следующим образом. Щелчок по кнопке приводит к заполнению окна списка именами компонентов, внесенными на форму, причем последний компонент, добавленный к форме, оказывается первым компонентом в списке. Когда вы нажимаете правую кнопку мыши на имени объекта в окне списка, компонентные координаты отображаются в StatusBar. Этот пример можно использовать для точного размещения элементов на форме при проектировании приложения (рисунок 5).
Литература:
Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО "Издательство Бином". 2000 г. Владимир Скуратов
(c) компьютерная газета
Страница WIN3.1.
Некоторые из ниже перечисленных компонентов в функциональном плане повторяют компоненты страниц Data Controls и Win32, но отличаются от них внешним представлением (рисунок 1). Компоненты страницы WIN3.1 . обеспечивают совместимость с предшествующими версиями Delphi.
Компонент DBLookupList представляет собой список выбора базы данных.
Компонент DBLookupCombo представляет собой комбинированный список выбора базы данных.
Компонент TabSet (набор закладок), в отличие от компонента TabControl, не может служить контейнером для размещения других компонентов. Поэтому обычно работает совместно с каким-либо компонентом-контейнером (чаще всего с компонентом Notebook ).
Компонент OutLine (дерево выбора) подобен компоненту TreeView страницы Win32, он предназначен для отображения иерархических структур данных (каталогов, например).
Компонент TabbedNotebook (набор панелей с закладками) представляет собой объединение TabSet и Notebook в готовый многостраничный блокнот с закладками. В отличие от TabSet, закладки в TabbedNotebook могут располагаться в несколько рядов.
Компонент Notebook (набор панелей без закладок) представляет собой многостраничный контейнер. Notebook обычно работает в паре с TabSet и предназначен для размещения других компонентов на нескольких перекрывающих друг друга страницах (панелях).
Компонент Header (управляющий заголовок) представляет собой заголовок с множеством колонок (секций), размеры которых регулируются. Каждая секция заголовка может содержать текст или графику.
Компонент FileIistBox (панель выбора файлов) представляет собой панель с именами файлов. Совместно с компонентами DriveComboBox, FilterComboBox, DirectoryListBox может использоваться для создания диалоговых окон доступа к файлам.
Компонент DirectoryListBox (панель выбора каталогов) представляет собой панель с именами каталогов.
Компонент DriveComboBox (панель выбора дисков) представляет собой список выбора с именами доступных дисков.
Компонент FilterComboBox (панель фильтрации файлов) представляет собой список выбора с расширениями файлов.
Форма как класс.
Взглянем на форму Delphi еще раз. Сгенерированная средой, она является экземпляром класса формы. Каждая форма является отдельным классом. Когда вы создаете пустую форму в новом проекте, интегрированная среда Delphi генерирует код, который определяет новый класс, называемый по умолчанию TForm1, являющийся потомком TForm .
Сгенерированный код класса выглядит следующим образом:
type TForm1 = class(TForm) … end;
Объявление класса выглядит просто, но вы уже имеете значительное количество данных и кода, унаследованных от TForm. Если вы посмотрите на окно инспектора объекта, то можете обнаружить несколько свойств, которые определяет даже пустая форма. Эти свойства ведут себя подобно полям данных.
Класс объявляется внутри блока type следующим образом:
type ИмяКласса = class(ИмяРодительского Класса). <Объявления класса> end;
Объявленный класс определяет структуру представителей класса и выбор допустимых операций, которые могут выполняться с представителями этого класса.
Рассмотрим в качестве примера текст модуля программы Drag (занятие 8). Единственное изменение, которое проведем в программе, это изменим имя формы с Form1, принятое по умолчанию, на Dragging.
Сгенерированный код выглядит следующим образом.
unit Drag_pas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TDragging = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
GroupBox2: TGroupBox;
Edit1: TEdit;
StatusBar1: TStatusBar;
procedure Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure Edit1Enter(Sender: TObject);
procedure Edit1Exit(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Dragging: TDragging;
implementation
{$R *.DFM}
Итак, как вы видите, форма – это пример класса, особый объект в том смысле, что она соответствует элементу видимого интерфейса и создается в процессе интерактивной работы путем переноса на нее компонентов. Она является классом, подобно любым другим, имеет родителя TForm и определяет несколько полей.
Пустой шаблон класса TDragging был создан Delphi в то время, когда вы затребовали новую форму. Затем содержание класса наполнялось операторами по мере того, как вы добавляли компоненты на нее, вы видите, что все они добавлены в определение класса TDragging сразу после заголовка класса.
Описание этой секции менять нельзя. Она зарезервирована для автоматического генератора кода Delphi. Если возникает необходимость удаления компонентов из этой секции, то необходимо обратиться к Редактору формы и выполнить необходимые действия там. По мере добавления или удаления компонентов на форму, необходимые поля автоматически добавляются к коду или удаляются вами те, которые были ранее добавлены в определение формы.
Разделы private и public в описании класса Delphi оставляет без изменения, и вы можете определить здесь свои собственные элементы.
Таким образом, имеется пример класса с несколькими полями. Эти поля представляют собой компоненты, которые вы добавили к форме. Технически все они – ссылки на объекты, действующие подобно ссылочным переменным, посредством которых вы имеете доступ к компонентам объектов (рисунок 2). GroupBox1, Label1, Label2, Label3, Label4, Label5, Memo1, GroupBox2, Edit1, StatusBar1 – называются полями косвенного доступа, указывающими на другие экземпляры объектов, которыми форма владеет во время выполнения.
Так как Delphi создает описание класса формы, она также берет на себя ответственность по управлению полями во время выполнения программы. Делая класс TDragging наследником TForm, вы получаете гарантию того, что все требуемые действия по инициализации и уничтожению объектов будут происходить автоматически.
Блок описания типов в строках 6 – 28 объявляет внутреннюю структуру экземпляра класса. В дополнение к тем полям и свойствам, которые TDragging унаследовал от своего предка TForm, добавлено несколько новых полей. Таким образом, исходный класс был расширен, а его потомок, Tdragging, требует немного больше памяти, чем он занимал, если бы вы не размещали на форме визуальные компоненты. Теперь экземпляр TDragging содержит дополнительно десять переменных, или полей, определенных в описании класса.
Просто описание формы TDragging не создает ее экземпляров, которые могут быть использованы во время выполнения. Хотя Delphi автоматически объявляет переменную в строке 30, резервируя место для ссылки на экземпляр формы, эта переменная не может быть использована до тех пор, пока что-нибудь не выполнит ее инициализацию. Это "что-нибудь" – оператор, находящийся в основном исходном файле проекта, который создает новый экземпляр формы и присваивает ссылку на него экземпляру переменной TDragging.
Вы можете проверить, что форма действительно создается в основном файле проекта. Для этого необходимо открыть меню Project, из раскрывшегося списка выбрать команду View Source.
В нижней части появившегося файла источника вы увидите следующий код:
begin Application.Initialize; Application.CreateForm(TDragging, Dragging); Application.Run; end.
Оператор CreateForm является гарантией, что экземпляр формы существует и доступен тогда, когда он понадобится вам. Вы можете использовать его для доступа к экземпляру формы после начала работы программы.
Необходимо заметить. Что программа пока ничего не делает. Вы только создали видимую конструкцию для части интерфейса пользователя.
Компонент ListBox.
Иногда вам понадобится окно списка, в котором имеется возможность выбирать больше одного элемента одновременно.
Для этого необходимо переключить значение свойства MultiSelect компонента ListBox на True, чтобы перевести его в режим окна списка с выбором многих элементов (или многократным выбором).
Окна списка с многократным выбором подразделяются на две категории:
— с расширенным выбором (Extended-selection);
— с многократным выбором (Multiple-selection).
Главное отличие поведения компонента ListBox с многократным выбором от расширенного выбора определяется значением свойства ExtendedSelect окна списка.
Окна списка с расширенным выбором позволяют сразу выбрать много элементов из списка, если свойства MultiSelect и ExtendedSelect установлены равными True.
В этом случае возможен выбор как смежных, так и непересекающихся блоков элементов с помощью мыши или клавиатуры:
если нажать левую кнопку мыши на элементе списка и, не отпуская кнопки, перемещать ее по элементам списка, то будет производиться их выделение;
щелчок на элементе при нажатой клавише Shift расширяет выбор, формируя смежный блок из отобранных элементов;
щелчок на элементе при нажатой клавише Ctrl переключает состояние выбора этого элемента и позволяет выбирать отдельные элементы из списка.
Окна с многократным выбором полезны тогда, когда необходимо выбрать несколько элементов из списка, не сгруппированных каким-либо осмысленным способом. Чтобы получить такое окно списка с многократным выбором, необходимо переключить свойство ExtendedSelect на False, а свойство MultiSelect — в True. После запуска программы убедитесь, что расширять выбор уже нет возможности. Выбор или отмена каждого элемента выполняется индивидуально и независимо от других элементов. То есть первый щелчок приводит к выделению элемента, второй щелчок по этому же элементу снимает выделение. Чтобы выделить несколько элементов, необходимо последовательно произвести по ним щелчки левой кнопкой мыши. На рисунке 3 показан результат выбора элементов в списках различного назначения.
Рассмотрим пример, который позволяет использовать компонент ListBox и Button в приложении. Добавьте на форму эти компоненты и напишите программный код, предложенный ниже. Окно списка уже содержит строки, когда появляется форма.
procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin ListBox1.MultiSelect := False; Button1.Caption := 'Строка в начало списка'; for I := 1 to 10 do ListBox1.Items.Add('СТРОКА ' + IntToStr(I)); end; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Move(ListBox1.ItemIndex, 0); end;
Рассмотрим для компонента ListBox некоторые свойства, размещенные на странице Properties инспектора объекта.
Свойство Columns определяет количество колонок элементов в списке. По умолчанию установлено значение 0. В этом случае, если число элементов превышает размеры окна списка, появляется вертикальная полоса прокрутки и список увеличивается вниз. Если установить значение Columns равным 1, то в этом случае, если число элементов превышает размеры окна списка, появляется горизонтальная полоса прокрутки и список увеличивается вправо. В окне списка вы можете видеть только одну колонку. Увеличение значения Columns приводит к увеличению числа видимых колонок, но при этом необходимо учитывать размеры окна списка. Иначе число колонок будет таким, каким вы определили, но видно будет только часть текста в строках.
Свойство Sorted разрешает или отменяет сортировку строк в алфавитном порядке.
Свойство IntegralHeight управляет высотой окна списка. Когда IntegralHeight равно True и свойство Style имеет значение lbOwnerDrawFixed, в окне списка будет отображаться целое число элементов, т.е. не будет элементов с частичным отображением. Если IntegralHeight - False, высота окна списка может устанавливаться в любую величину, что приводит к неполному отображению последнего элемента списка (рисунок 4). Это свойство работает совместно с Columns, установленное в 0 значение.
Для создания следующего примера под названием "Координаты компонентов" добавьте на форму кнопку Button, компонент StatusBar и окно списка ListBox . Установите свойство SimplePanel для компонента StatusBar на странице Properties инспектора объекта в True. Программный код приведен ниже.
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 0 to Form1.Comp onentCount-1 do ListBox1.Items.InsertObject(0, Form1.Components[I].Name, Form1.Components[I] as TObj ect); end; procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftStat e; X, Y: Integer); var APoint: TPoint; Index: integer; TheObject: TControl; begin if Button = mbRigh t then begin APoint.X := X; APoint.Y := Y; Index := ListBox1.ItemAtPos(APoint, True); if (ListBox1.I tems.Objects[Index] is TControl) then begin TheObject := (ListBox1.Items.Objects[Index] as TControl) ; StatusBar1.SimpleText := TheObject.Name + ' is at (' + IntToStr(TheObject.Left) + ', ' + IntToStr( TheObject.Top) + ') '; end else Beep; end; end;end.
Программа работает следующим образом. Щелчок по кнопке приводит к заполнению окна списка именами компонентов, внесенными на форму, причем последний компонент, добавленный к форме, оказывается первым компонентом в списке. Когда вы нажимаете правую кнопку мыши на имени объекта в окне списка, компонентные координаты отображаются в StatusBar. Этот пример можно использовать для точного размещения элементов на форме при проектировании приложения (рисунок 5).
Литература:
(c) компьютерная газета
Компьютерная газета. Статья была опубликована в номере 23 за 2001 год в рубрике программирование :: delphi