От Delphi 4 к Delphi 5 часть 18

От Delphi 4 к Delphi 5
Палитра компонентов.
Страница ActiveX.
Компоненты ActiveX являются "чужими" для Delphi (рисунок 1). Они создаются другими инструментальными средствами разработки программ (например, С ++ или Visual Basic) и внедряются в Delphi с помощью технологии OLE. На странице ActiveX представлены лишь пять компонентов из большого количества, разрабатываемых повсюду в мире производителями программных средств и отдельными программистами. Компоненты страницы ActiveX для Delphi 4 и Delphi 5 одинаковы.
Компонент Chartfx (интерактивный график) дает программистам удобное средство включения в программу интерактивных (диалоговых) диаграмм и графиков.
Компонент VSSpell (спеллер) осуществляет орфографическую проверку правильности написания английских слов.
Компонент FlBook (электронная таблица) позволяет создавать и использовать рабочие книги электронных таблиц, подобно тому, как это делает MS Excel.
Компонент VtChart (мастер диаграмм) обеспечивает средства построения двумерных и трехмерных диаграмм по результатам табличных вычислений.
Компонент Graph (графический сервер) предназначен для включения в программу графических двумерных средств отображения данных.

Методы в Delphi.
Как вы знаете, объект включает в себя данные и код. Код в виде методов, другими словами подпрограмм, присоединенных к объекту, задает поведение объекта. Методы для объекта определенного класса определяют операции, которые могут быть выполнены представителем данного класса. Таким образом, метод — это подпрограмма, которая определена как часть класса и включена внутрь этого класса.
Всего существует шесть разновидностей методов объектов: методы-процедуры, методы-функции, классовые процедуры, классовые функции, конструкторы, деструкторы.
Двойной щелчок левой кнопкой мыши в инспекторе объекта на пустой строке напротив названия интересующего вас события переместит вас в окно Редактора кода, а именно в процедуру обработки этого события. Если в требуемом компоненте эта строка не пустая, то двойной щелчок переместит вас в окно Редактора кода в то место, где находится данный метод. Так вы постоянно делали для создания метода отклика на событие. Несмотря на то, что возможности визуальной части Delphi чрезвычайно богаты, хорошими знаниями программирования может обладать только тот, кто хорошо разбирается в технике ручного написания кода.
Перед тем как рассмотреть методы-процедуры и методы-функции, рассмотрим, что такое процедуры и функции в Delphi.

Подпрограммы.
Большинство программ по размеру довольно большие и содержат от десятков до сотен тысяч операторов. Чтобы облегчить написание приложений, можно передать некоторые задачи подпрограммам.
Подпрограмма — это блок кода с именем, состоящий из заголовка, объявлений и тела, в котором имеется набор исполняемых операторов. Язык программирования Object Pascal предоставляет два различных вида подпрограмм: процедуры и функции.
Подпрограммы — это один из строительных блоков Паскаля, при помощи которых вы можете конструировать приложения.
Процедуры обеспечивают удобные средства разделения исполнимых операторов программ на меньшие части, с которыми удобнее работать. Заголовок процедуры включает в себя имя процедуры и возможный список параметров. Delphi предусматривает два типа размещения заголовков подпрограммы: объявление заголовка в разделе реализации, который появляется вместе с реализацией подпрограммы, и объявление заголовка, который может находиться в разделе интерфейса модуля.
Самый простой способ — это определение заголовка процедуры и тела подпрограммы в начале раздела реализации блока. Так как они размещены в начале программы, то компилятору становится известно об их существовании до того, как они будут вызваны из какой-либо ее части, например:
implementation

{$R *.DFM} procedure Information; begin MessageDlg('Информация', mtInformation,[mbOk],0); end;
 procedure TForm1.Button1Click (Sender: TObject); begin Information; end; end.
Если процедура будет описана после реализации события OnClick, то компилятор выдаст следующее сообщение: [Error] Unit1.pas(28): Undeclared identifier: 'Information' — неопределенный идентификатор. Эту проблему можно решить путем помещения объявления процедуры в начале раздела реализации с последующим ключевым словом forward:

procedure Information; forward;
Такая конструкция подсказывает обращающейся части программы просмотреть программу дальше, чтобы найти определения исполняемых операторов.
Следующий способ сделать процедуру доступной в модуле — это объявление ее в разделе интерфейса:

procedure Information; implementation {$R *.DFM}
Такая конструкция делает процедуру доступной из этого модуля или из любого модуля, использующего данный модуль.
Когда объявление заголовка подпрограммы появляется в первый раз, оно должно быть полным: с именем подпрограммы, параметрами и их типами.
Давайте рассмотрим процесс создания подпрограммы на примере процедуры, которая поможет вам изучить технику написания методов в Delphi.
1. Запустите Delphi. Сохраните файл модуля под именем Methods_.pas, а файл проекта под именем Methods. dpr. Нет никакого функционального различия между модулями, созданными вами в Редакторе кода, и модулями, сгенерированными Delphi автоматически. В любом случае модуль состоит из трех разделов:
— раздел заголовка;
— раздел interface;
— раздел implementation.
В разделе interface описывается все то, что должно быть видимо для других модулей (типы, переменные, классы, константы, процедуры, функции). В разделе implementation помещается код, реализующий классы, процедуры или функции.
В Delphi процедурам и функциям (а следовательно и методам классов) могут передаваться параметры для того, чтобы обеспечить их необходимой для работы информацией. Программа Methods продемонстрирует, как использовать передачу параметров в методы Delphi.
Это приложение позволит вам производить вычисления, а конкретно суммирование чисел, помещенных в компоненты Edit1 и Edit2. Результат суммирования переносится в компоненты Edit3, Memo1, Memo2. После нажатия кнопки с заголовком "EnteringALine" строка из управляющего элемента EditSumma (т.е. Edit3) копируется в управляющие элементы Memo1 и Memo2.

2. После того как вы разместите на форме компоненты Edit1, Edit2, Edit3, Memo1, Memo2, произведите переименование с помощью инспектора объекта (свойство Name) компонента Edit3 в EditSumma. Размещение компонентов на форме показано на рисунке 2. Поместите на форму компонент Button1, и в Object Inspector измените его заголовок (свойство Caption) на "EnteringALine". Компоненты Label1, Label2, Label3 используйте для ввода надписей, определяющих назначение компонентов Edit.

3. После завершения проектирования формы класс TForm1 будет выглядеть следующим образом:

TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Edit1: TEdit; Memo2: TMemo; Edit2: TEdit
; EditSumma: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; end;
4. Следующий шаг состоит в добавлении метода, вызываемого по нажатию пользователем кнопки Button1. Это можно сделать двумя способами:
— перейти в Инспекторе Объектов на страницу Events (предварительно выбрав компонент Button1 на форме), выбрать событие OnClick и дважды щелкнуть мышкой на пустой строчке справа от него;
— просто дважды щелкнуть по компоненту Button1.
Delphi сгенерирует следующую "заготовку":

procedure TForm1.Button1Click (Sender: TObject); begin end;
Цель приложения Methods — научить вас писать процедуры и передавать в них параметры. В частности, программа Methods реагирует на нажатие кнопки Button1 путем вызова процедуры EnteringALine и передачи ей в качестве параметра содержимого строки редактирования EditSumma (EditSumma.Text).

procedure TForm1.Button1Click (Sender: TObject); begin EnteringALine(EditSumma.Text); end;
5. Важно понять, что объект EditSumma является экземпляром класса TEdit и, следовательно, имеет свойство Text. Оно содержит набранный в строке редактирования текст. Как вы уже, наверное, успели заметить, по умолчанию свойство Text содержит значение, совпадающее со значением имени компонента (Name) — в данном случае "EditSumma". Его можете редактировать как в режиме проектирования, так и во время выполнения.

6. Текст, который должен быть отображен в компонентах Memo1, Memo2, передается процедуре EnteringALine как параметр. Чтобы проделать это, просто напишите имя этой процедуры и заключите передаваемый параметр (параметры) в скобки следующим образом:

EnteringALine(EditSumma.Text);.
Заголовок этой процедуры выглядит следующим образом:

procedure TForm1.EnteringALine(NewString: String);
где указано, что передаваемый процедуре параметр NewString должен иметь тип String.
Вспомните, что задача процедуры EnteringALine состоит в копировании содержимого строки редактирования EditSumma в компоненты Memo1, Memo2. Поэтому она должна выглядеть следующим образом:

procedure TForm1.EnteringALine(NewString: String); var I,J,K:Integer; begin I := StrToInt(Edit
1.Text); J :=StrToInt(Edit2.Text); K := I + J; EditSumma.Text :=IntToStr(K); Memo1.Text:=EditSumma.T
ext; Memo2.Text:=EditSumma.Text; end;
Поскольку процедура Entering-ALine не является откликом на какое-либо событие в Delphi, то ее нужно полностью написать "вручную". Простейший способ сделать это — копировать заголовок какой-либо уже имеющейся процедуры, исправить его, а затем дописать необходимый код.

7. Возвратимся еще раз к заголовку процедуры:

procedure TForm1.EnteringALine(NewString: String);.
Он состоит из пяти частей:
— Первая часть — зарезервированное слово "procedure". Оно служит определенным синтаксическим целям, а именно: информирует компилятор о том, что определен синтаксический блок "процедура".
— Вторая часть заголовка — слово "TForm1", которое квалифицирует то обстоятельство, что данная процедура является методом класса TForm1.
— Третья часть заголовка — имя процедуры, вы можете выбрать его любым, по вашему усмотрению. В данном случае названа процедура "EnteringALine".
— Четвертая часть заголовка — параметр, он декларируется внутри скобок и, в свою очередь, состоит из двух частей. Первая часть — имя параметра, вторая часть — его тип, они разделены двоеточием.
— Пятая часть — концевая точка с запятой (;), которая указывает на окончание заголовка (собственно говоря, почти все операторы в Delphi должны заканчиваться точкой с запятой).
Если вы описываете в процедуре более чем один параметр, то нужно разделить их точкой с запятой, например:

procedure Example(Param1: String; Param2: String);
8. После того как вы создали "вручную" заголовок процедуры, являющейся методом класса, вы должны включить его в декларацию класса. Например, путем копирования (еще раз напомню, что для методов, являющихся откликами на события, данное включение производится автоматически):

1. type 2. TForm1 = class(TForm) 3. Button1: TButton; 4. Memo1: TMemo; 5. Edit1: TEdit; 6. Mem
o2: TMemo; 7. Edit2: TEdit; 9. EditSumma: TEdit; 10. Label1: TLabel; 11. Label2: TLabel; 12. Label3:
 TLabel; 13. procedure Button1Click(Sender: TObject); 14. procedure EnteringALine(NewString: String)
; 15. private 16. { Private declarations } 17. public 18. { Public declarations } 19. end;
Четырнадцатый оператор по тексту вставлен "вручную".
В приведенном программном коде нет необходимости оставлять в заголовке метода слово "TForm1", так как оно уже присутствует в описании класса. Результат работы программы показан на рисунке 3.

Компонент ScrollBar.
Этот компонент может использоваться для регулировки значения числового параметра, пробегающего некоторое множество значений (рисунок 4).
Его хорошо использовать для создания приложений, в которых можно изменять числовую величину. В Delphi хорошо продумано управление линейкой прокрутки и есть разнообразные свойства, контролирующие ее поведение.
Линейка прокрутки не существует сама по себе. Она должна быть, в конечном счете, связана с другим управляющим элементом так, чтобы изменения позиции на ней приводили бы к некоторому действию, типа прокручивания изображения или обновления некоторых данных.
Формы или окна могут определять линейки прокрутки как часть оформления своих рамок, которые внутренне связаны с отображающим их окном, а не являются самостоятельными компонентами. Их положение ограничено правым или нижним краями окна, к которому они принадлежат. Автономный компонент, ScrollBar, может появляться в каком угодно месте внутри окна формы.
Имеется два вида линеек прокрутки:
— вертикальная (sbVertical);
— горизонтальная (sbHorizontal).

Свойство Kind компонента ScrollBar служит переключателем между двумя состояниями.
Минимальные и максимальные значения диапазона прокручивания устанавливаются с использованием свойств Min и Max, которые могут принимать значения целого типа Integer в диапазоне от -32768 до +32767.
Свойство Position определяет текущую позицию бегунка линейки прокрутки. Установив начальное значение, указатель принимает заданное положение.
Свойство SmallChange определяет "малый" сдвиг бегунка, т.е. дискретность изменения позиции указателя линейки прокрутки, после нажатия пользователем кнопки, расположенной на конце линейки. Применяется, например, для перемещения на один пиксель после щелчка на кнопках со стрелками на концах бегунка или после нажатия клавиш управления курсором.
Свойство LargeChange определяет "большой" сдвиг бегунка. Оно устанавливает дискретность изменения позиции указателя, когда пользователь щелкает левой кнопкой мыши на серой области внутри линейки прокрутки, расположенной между указателем и кнопкой со стрелкой с каждого конца компонента ScrollBar. Применяется, например, при перемещении на одну страницу и осуществляется по щелчку мыши по поверхности компонента с соответствующей стороны от указателя или после нажатия клавиш PageUp или PageDown.
Событие property OnScroll: TScrollEvent;

TScrollEvent = procedure (Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer) of
 object;
вызывается после каждого изменения положения бегунка.

Обработчик события OnChange применяется, когда происходит изменение значений Max, Min, Position.
Значение ScrollCode определяет вид перемещения бегунка и имеет следующие параметры:
TScrollCode = (scLineUp, scLineDown, scPageUp, scPageDown, scPosition, scTrack, scTop, scBottom, scEndScroll);
scLineUp, scLineDown — на строку вверх, вниз;
scPageUp, scPageDown — на страницу вверх, вниз;
scTrack, scTop — в заданную позицию;
scTop, scBottom — в крайнее верхнее, нижнее положение;
ScEndScrol — извещает об окончании процесса прокрутки.

Рассмотрим пример использования компонента ScrollBar (размещение элементов на форме показано на рисунке 5). Данный пример позволит изменять цвет компонента Shape1 и цвет контура компонента Shape2, используя линейки прокрутки.

1. Запустите Delphi.
2. Сохраните файл модуля под именем ScrollB_.pas, а файл проекта — под именем ScrollB.dpr.
3. Поместите на форму компоненты ScrollBar1, ScrollBar2, ScrollBar3 со страницы Standard палитры компонентов. Свойство Kind для данных компонентов оставьте, принятое по умолчанию sbHorizontal. Используя свойство Name, измените имена, принятые по умолчанию для компонентов ScrollBar на ScrollBarRed, ScrollBarGreen, ScrollBarBlue соответственно.
4. Установите значение свойства Min для этих компонентов, равным 0, а значение свойства Max — равным 255.
5. Поместите на форму компонент Shape1 со страницы Additional, установите для него свойство Shape равным stEllipse. Поместите на форму компонент Shape2, установите для него свойство Shape в инспекторе объекта на StRoundRect.
6. Поместите компоненты Label1, Label2, Label3 на форму и, используя свойство Name, измените их имена на LabelRed, LabelGreen, LabelBlue соответственно.
7. Поместите на форму компоненты TrackBar1, TrackBar2, TrackBar3 со страницы Win32 палитры компонентов.
8. Поместите на форму компоненты Label3, Label4, Label5. Используя свойство Name, измените имена на LabelScrollRed, LabelScrollGreen, LabelScrollBlue соответственно.
Используя событие OnScroll на странице событий инспектора объекта для компонентов ScrollBar и событие OnChange для компонентов TrackBar, напишите в Редакторе кода следующий программный код:

procedure TForm1.ScrollBarRedScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: I
nteger); begin {Свойство Position (положение) говорит о том, как позиционирована линейка прокрутки в
 данный момент времени. Это свойство содержит целую величину. Вы можете манипулировать этим свойство
м из программы, если вам нужно динамически изменять положение линейки прокрутки.} LabelRed.Caption :
= ' Значение красного цвета: ' + IntToStr (ScrollPos); Shape1.Brush.Color := RGB (ScrollBarRed.Posit
ion, ScrollBarGreen.Position, ScrollBarBlue.Position); Shape2.Pen.Color := RGB (ScrollBarRed.Positio
n, ScrollBarGreen.Position, ScrollBarBlue.Position); end; procedure TForm1.ScrollBarGreenScroll(Send
er: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin LabelGreen.Caption := 'Значение
 зеленого цвета: ' + IntToStr(ScrollPos); Shape1.Brush.Color := RGB (ScrollBarRed.Position, ScrollBa
rGreen.Position, ScrollBarBlue.Position); Shape2.Pen.Color := RGB (ScrollBarRed.Position, ScrollBarG
reen.Position, ScrollBarBlue.Position); end; procedure TForm1.ScrollBarBlueScroll(Sender: TObject; S
crollCode: TScrollCode; var ScrollPos: Integer); begin LabelBlue.Caption := 'Значение голубого цвета
: ' + IntToStr(ScrollPos); Shape1.Brush.Color := RGB (ScrollBarRed.Position, ScrollBarGreen.Position
, ScrollBarBlue.Position); Shape2.Pen.Color := RGB (ScrollBarRed.Position, ScrollBarGreen.Position, 
ScrollBarBlue.Position); Shape2.Pen.Width:=5; end; procedure TForm1.TrackBar1 Change(Sender: TObject
); begin LabelScrollRed.Caption := 'Значение LargeChangeRed ' + IntToStr(TrackBar1.Position); Scroll
BarRed.LargeChange := TrackBar1.Position; end; procedure TForm1.TrackBar2 Change(Sender: TObject); b
egin LabelScrollGreen.Caption:='Значение LargeChangeGreen' + IntToStr(TrackBar2.Position); ScrollBar
Green.LargeChange := TrackBar2.Position; end; procedure TForm1.TrackBar3 Change(Sender: TObject); be
gin LabelScrollBlue.Caption := 'Значение LargeChangeBlue ' + IntToStr(TrackBar3.Position); ScrollBar
Blue.LargeChange := TrackBar3.Position; end; end.
Результат работы программы Scroll показан на рисунке 6.

Литература:
1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г.
2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
4. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
5. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО "Издательство Бином". 2000 г.

Владимир Скуратов


(c) компьютерная газета




Компьютерная газета. Статья была опубликована в номере 26 за 2001 год в рубрике программирование :: delphi

©1997-2024 Компьютерная газета