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

От Delphi 4 к Delphi 5 Палитра компонентов.
Страница INTERBASE.

Эта страница введена в версии Delphi 5. На ней располагаются (рисунок 1) компоненты, поддерживающие технологию Interbase Express (IBX), которая позволяет клиентским программам взаимодействовать с сервером Interbase v.5.5 без помощи BDE.
Компонент IBTable (IBX таблица) аналог компонента Table на странице Data Access.
Компонент IBQuery (IBX запрос) аналог компонента Query на странице Data Access.
Компонент IBStoredProc (IBX хранимая процедура) аналог компонента StoredProc на странице Data Access.
Компонент IBDatabase (IBX база данных) аналог компонента Database на странице Data Acces.
Компонент IBTransaction (IBX транзакция) обеспечивает гибкий доступ к мощным транзакционным возможностям Interbase.
Компонент IBUpdateSQL (IBX обновляемый запрос) аналог компонента UpdateSQL на странице Data Access.
Компонент IBDataSet (IBX набор данных) служит для представления данных, созданных другими компонентами или полученных из файла.
Компонент IBSQL (IBX прямой запрос) используется для максимально быстрого получения данных без их отображения визуальными компонентами.
Компонент IBDatabaseInfo (IBX информация о данных) предоставляет вспомогательную информацию о текущей базе данных.
Компонент IBSQLMonitor осуществляет программный мониторинг SQL-запросов.
Компонент IBEvents (IBX событие) информирует программу о наступлении нужного события в базе данных.

Синтаксический контроль.
Для того чтобы облегчить чтение и написание программного кода, Редактор кода Delphi имеет свойство, которое называется выделение синтаксиса цветом. В зависимости от того, какое значение имеют набираемые слова программного кода, имеется возможность отображать их разными цветами.
По умолчанию ключевые слова выглядят полужирными, строки и комментарии имеют различные цвета. Это дает возможность вам отличать зарезервированные слова от комментариев и т.д.
У вас есть возможность произвести настройку подсветки синтаксиса на свой вкус. Для этого необходимо воспользоваться меню Delphi. Произведите выбор раздела Tools -> Emvironment Options -> Color.
Диалоговое окно Color позволит вам выбрать цвет и шрифт по вашему усмотрению для синтаксического контроля (рису-
нок 2).
Опция Color SpeedSetting позволяет вам быстро конфигурировать фон диалогового окна Редактора кода с возможностью просмотра образца, который показывает, как будут выглядеть установленные вами параметры.
В окне Element вы можете выбрать последовательно опции, определяющие фон диалогового окна Редактора кода, комментариев, зарезервированных слов, идентификаторов, символов и т.д., а для перечисленных элементов — цвет, шрифт. Для выбора цвета используются чекбоксы. Палитра цвета (FG) ForeGround соответствует выбору цвета переднего плана, а палитра цвета (BG) BackGround — избранного кодового элемента.
Выбор одного и того же цвета для переднего плана и фона не рекомендуется.
Чтобы выбрать цвет с использованием клавиатуры, необходимо:
1. использовать клавиши со стрелками;
2. нажать клавишу F, чтобы выбрать цвет переднего плана, или клавишу B, чтобы выбрать цвет фона.
Чекбоксы текстовых атрибутов определяют выбор формата для кодового элемента. Формат для текста предусматривает выбор полужирного шрифта, курсива или подчеркивание. По умолчанию используются цвета, установленные системой. Таким образом, вы можете настроить диалоговое окно Редактора кода по своему усмотрению, чтобы была возможность легче ориентироваться для определения ошибок, осуществляя набор программного кода.
Так как затронут вопрос, связанный с разделом Tools, рассмотрим конфигурацию данного раздела. Работая со средой Delphi, возможно, вам потребуется обращение к другим приложениям Windows. Доступ к ним закрыт окнами Delphi, но есть возможность расположить пиктограммы приложений Windows в нижней видимой части. Если вы используете полноэкранный режим для диалоговых окон Delphi (т.е. растянув диалоговые окна инспектора объекта, Редактора кода, формы), то доступ к приложениям возможен только после свертывания диалоговых окон Delphi. В этом случае вам поможет меню команды Tools. Для его конфигурации, т.е. для осуществления доступа к приложениям Windows, необходимо выбрать в данном меню команду Configure Tools. Перед вами появится диалоговое окно Tool Options, которое уже содержит приложения, введенные по умолчанию. Выбрав команду Add, вы можете добавить необходимые приложения, в этом вам поможет диалоговое окно Tool Properties. Безошибочный выбор поможет осуществить кнопка Browse, открывающая диалоговое окно Select Transfer Item для выбора исполняемых файлов (рисунок 3).


Таким образом, выбранные приложения появятся в меню команды Tools, что позволит осуществить вам доступ к ним, не закрывая диалоговые окна Delphi.
Большую помощь во время написания кода оказывает Code Insight — Знаток кода. Для того чтобы настроить Code Insight, необходимо выбрать команду в меню Delphi Tools, далее выбрать команду Environment Options. В открывшемся диалоговом окне выберите вкладку Code Insight (рисунок 4).
Опции автоматического выполнения различных функций имеют следующее назначение:
Code Completion — завершение кода, предоставляет подсказку в виде списка свойств, методов, событий, относящихся к данному компоненту;
Code Parameters — подсказка параметров функций, процедур, методов;
Tooltip Expression Evaluation — оценка выражений во время останова или пошагового выполнения приложения во время его отладки;
Tooltip Symbol Insight — подсказка определений идентификаторов, над которыми перемещается курсор мыши.
Все эти опции включены по умолчанию. Некоторые из них на начальном этапе оказывают неоценимую помощь. Но автоматическое выполнение опции Code Completion иногда приводит к невольным ошибкам, подставляя в ваш программный код неправильные свойства или методы. Автоматическое выполнение данной опции можно отключить, нажав сочетание клавиш Ctrl+пробел.
Задержка автоматического срабатывания Code Insight устанавливается использованием ползунка Delay. Если в течение данного времени вы не осуществили ввод программного кода, появляется подсказка.
Раздел Code Templates содержит список шаблонов типичных структур языка Object Pascal, подсказки по которым предлагает Code Insight. После выделения названия и краткого описания одного из шаблонов в списке в нижнем окне можно увидеть предлагаемый программный код заготовки (рисунок 5).
Кнопка Edit позволяет изменять имя и краткое описание шаблона. Текст его можно изменять, не нажимая этой кнопки, а переводом курсора в нижнее окно с кодом шаблона. Кнопка Delete позволяет удалить шаблон из списка. Кнопка Add позволяет добавить в список новый шаблон.
В процессе написания программного кода происходит работа Знатока кода (рисунок 6).

Классовые процедуры и классовые функции.
В языке Object Pascal вы можете объявлять классовые методы. Наиболее важное отличие обычных методов класса от классовых методов заключается в том, что для вызова классового метода вам не требуется действительный представитель класса.
Классовые процедуры концептуально более близки к обычным самостоятельным процедурам, чем методы-процедуры. Для вызова их не требуется экземпляр объекта. Эти процедуры объявляются как часть класса и вызываются с использованием ссылки на класс, а не на представителя этого класса.
Классовые функции аналогично классовым процедурам не требуют представителей класса. Классовые методы объявляются в точности так же, как и обычные методы, но только перед их объявлением ставится зарезервированное слово class.
Синтаксис объявления классовой процедуры.
Общий синтаксис объявления классовой процедуры имеет вид:
type
ИмяКласса = class(ИмяРодителя)
...
class procedure ИмяМетода(<Список параметров>);
...
end;
Примеры:
type
TDataList = class(TPersistent)
...
class procedure FreeAll;
class procedure SetDelimiter(ASynbol: Char);
...
end;
Синтаксис объявления классовой функции.

Общий синтаксис объявления классовой функции имеет вид:
type
ИмяКласса = class(ИмяРодителя)
...
class function ИмяМетода(<Список параметров>): ВозвращаемыйТип;
...
end;
Примеры:
Type
TClientWindow = class(TWindow)
...
class function Numlnstances;
class function DefaultCaption: String;
class function DefaultWidth: Integer;
...
end;

В классе можно одновременно объявлять несколько классовых методов — как классовых процедур, так и классовых функций.
Каждое объявление классовой процедуры внутри описания класса начинается с зарезервированного слова class, за которым следуют зарезервированное слово procedure и имя метода. Каждое объявление классовой функции начинается с зарезервированного слова class, за которым следуют зарезервированное слово function и имя метода. В обоих случаях остальная часть объявления классовых методов должна соответствовать тем же правилам, что и для обычных методов-процедур и методов-функций соответственно.
Большая часть того, что касается реализации самостоятельных подпрограмм, применима также и к методам. Между самостоятельными подпрограммами и методами существует важное различие, заключающееся в способе доступа к данным представителя класса.
Для того чтобы самостоятельные подпрограммы могли работать с элементами данных, эти данные должны быть переданы подпрограммам предпочтительно в виде параметров.

Самостоятельные подпрограммы имеют доступ к любым данным, объявленным глобально в модуле или программе, в которых эти подпрограммы определяются, а также ко всем глобальным данным других модулей, перечисленных в списке uses.
Реализациям обычных (то есть, не являющихся классовыми) методов доступны не только все те данные, которые были бы доступны подпрограмме. Методы также имеют неявный доступ к полям того представителя класса, который был использован в их вызове.
Это подобно тому, что как будто каждому методу при вызове передается дополнительный параметр, указывающий на использовавшийся при вызове экземпляр объекта, и внутри метода стоит неявный оператор with, заключающий в себя все тело метода. И так оно и есть на самом деле.
Несмотря на то, что вы не видите этого дополнительного параметра, который называется Self, в определении метода он в нем неявно присутствует. Этот дополнительный параметр Self имеет тот же тип, что и класс, в котором определен метод.
Все тело метода заключено в неявный оператор with Self do, который предоставляет методу доступ к полям, свойствам и другим методам данного представителя класса.
Неявный оператор with действует примерно следующим образом:

begin
with Self do begin
(Код метода)
end;
end;

Внешний блок begin-end представляет собой основной блок метода. Расположенный внутри него оператор with настраивает контекст для доступа к полям объекта.
Поскольку параметр Self неявно присутствует внутри метода, большую часть времени не будет возникать нужды явно ссылаться на него. Представитель класса, использованного в вызове, неявно доступен, контекст для доступа к нему подготовлен, так что вы можете непосредственно ссылаться на поля объекта, не используя при этом никаких префиксов.
Хотя никто и не запрещает вам использовать префикс Self при доступе к полям объекта внутри метода, но обычно в этом нет необходимости. Внутри метода и так подразумевается использование префикса Self, так что вы можете просто напрямую ссылаться на поля объекта, как если бы это были локальные переменные.
Однако изредка возникают ситуации, когда вам приходится явно использовать параметр Self. В частности, этот параметр может вам понадобиться для разрешения конфликтов идентификаторов внутри метода.
Для того чтобы разрешить конфликт имен с помощью параметра Self, например, чтобы одновременно работать и с локальной переменной, и с полем объекта, имена которых совпадают, вам нужно поставить перед именем поля объекта префикс Self с точкой (например, Self.FTitle).
Большая разница между обычными методами и классовыми методами состоит в том, что у классовых методов отсутствует неявный параметр Self.
Поскольку классовые методы можно вызывать, как используя экземпляр класса, так и ссылаясь непосредственно на сам класс (то есть, не ссылаясь на какого-либо конкретного его представителя), классовый метод не может иметь доступ к полям представителя класса. Внутри классового метода отсутствует неявный параметр Self, значит, отсутствует и возможность использовать его поля.
Так как в классовых методах отсутствует Self, они по существу ничем не отличаются от самостоятельных подпрограмм. Классовые методы — это лишь удобная возможность указать, что метод логически относится к данному классу.

Реализация классового метода очень проста. Вы должны придерживаться тех же правил, что и для обычных методов, за исключением того, что заголовок реализации должен начинаться с зарезервированного слова class.
Единственное обстоятельство, о котором вы не должны забывать, — это тот факт, что внутри классового метода у вас нет доступа к полям объекта даже в том случае, когда для вызова этого метода используется действительный представитель класса. Попытка сослаться на какое-либо поле объекта приведет к синтаксической ошибке при трансляции. Говоря другими словами, просто обращайтесь с реализацией классового метода так, как будто вы пишете самостоятельную подпрограмму.
Реализация классовой процедуры должна располагаться в разделе implementation модуля, либо в программе или библиотеке, до основного блока begin-end, то есть в том же блоке кода, в котором размещаются обычные методы. Реализация начинается с зарезервированного слова class, за которым следуют зарезервированное слово procedure и полное имя метода.
Реализация классовой функции начинается с зарезервированного слова class, за которым следуют зарезервированное слово function, полное имя метода и такая же, как и для обычных методов, остальная часть заголовка (объявления). Внутри реализации у вас нет доступа к полям представителя класса, но вы можете использовать любые данные, которые были бы доступны в этом же контексте самостоятельной функции.
Как всегда, в функции должен быть хотя бы один оператор, присваивающий ей либо предопределенной переменной Result возвращаемое значение.

Компонент Panel, компонент SpeedButton.
Построение инструментальной линейки.
Вначале рассмотрим свойства компонента SpeedButton.
Свойство AllowAllUp, установленное в True, определяет для кнопок положение, когда они могут находиться в отжатом состоянии.
Свойство GroupIndex позволяет задавать группу кнопок, работающих согласованно.
Свойство Down, установленное в True, определяет положение: кнопка нажата, иначе кнопка отжата.
Свойство Caption определяет заголовок кнопки.
Свойство Clyph позволяет отображать картинку на кнопке.
Свойство Layout определяет положение картинки относительно текста.
Свойство Margin определяет расстояние от границы, т.е. края кнопки до картинки. Если оно равно -1, то картинка вместе с текстом центрируются на кнопке.
Свойство NumClyphs определяет количество образов кнопки на картинке Clyph. Среда Delphi отображает один из образов в зависимости от состояния кнопки.
Свойство Spacing определяет расстояние от картинки до текста. Если оно равно -1, то текст центрируется между картинкой и границей кнопки.
Компонент SpeedButton предназначен для того, чтобы облегчить разработку инструментальных линеек. Для данной кнопки возможно размещение на лицевой части пиктограммы. Можно поместить на данную кнопку несколько пиктограмм поочередно, и менять местами их размещение на кнопке во время работы программы. Кнопками SpeedButton можно воспользоваться для имитации радиокнопок в инструментальных линейках. Это достигается установлением свойства GroupIndex в ненулевое значение.

Установив свойство AllowAllUp в True и используя свойство GroupIndex, можно разрешить кнопкам всем вместе находиться в ненажатом состоянии — в противоположность случаю, когда одна из кнопок должна быть обязательно нажата.
Рассмотрим порядок помещения пиктограммы на кнопку SpeedButton.
Для того чтобы поместить пиктограмму на кнопку, ее необходимо вначале изготовить. В этом вам окажет помощь Image Editor. Для его вызова необходимо выбрать раздел Tools меню Delphi, далее выбрать команду Image Editor и произвести по ней двойной щелчок. Перед вами откроется диалоговое окно Редактора пиктограмм (изображений).

В данном Редакторе вы можете последовательно создавать пиктограммы, которые в дальнейшем поместите на лицевую часть кнопки. На рисунке 7 показан процесс создания пиктограммы для кнопки, щелчком левой кнопкой мыши по которой происходит выравнивание текста по центру.
Для создания пиктограмм и внедрения их на лицевую часть кнопок SpeedButton необходимо открыть Редактор пиктограмм, выбрать команду меню File, далее команда New, Bitmap File (bmp). Перед вами откроется диалоговое окно Bitmap Properties, где вы должны установить размеры для вашей будущей пиктограммы (для нашего случая установите размеры 20*20). Используя инструментальные средства Редактора, приступайте к созданию рисунка. После создания рисунка сохраните его, используя команду File, далее Save As..., в выбранной папке. Для внедрения пиктограммы на лицевую часть кнопки SpeedButton воспользуйтесь в инспекторе объекта страницей Properties для выделенной кнопки. Найдите свойство Clyph, щелкните дважды справа от данного свойства по кнопке с тремя точками. Откроется диалоговое окно Picture Editor. Щелкнув по кнопке Load, вы сможете отыскать сохраненный файл; щелкнув по кнопке Ok, рисунок появится на лицевой части кнопки. Поступая таким образом, создайте пиктограммы для кнопок примера ToolBar, рассмотренного на занятии 20 (см. КГ №28 (320) от 31.07.01). На рисунке 8 показано новое изображение кнопок.

Таким образом, каждая кнопка имеет свое собственное изображение или значок. Модифицируя пример ToolBar, можно добавить меню с элементами, которые могут использоваться для отключения некоторых быстрых кнопок, а также для того, чтобы скрыть всю инструментальную линейку. Добавив в пример Toolbar меню, создайте команду, чтобы скрыть всю инструментальную линейку:

procedure TForm1.Visible1Click(Sender: TObject);
begin
{скройте или выведите на экран инструментальную линейку, пометив галочкой элемент меню}
Panel1.Visible:= not Panel1.Visible;
Visible1.Checked:= not Visible1.Checked;
end;

Этот код переключает значение двух логических свойств: одно свойство, чтобы выполнить требуемое действие, и второе, чтобы добавить или удалить галочку около элемента меню. В следующей команде представлены также два аналогичных оператора, которые используются для отключения или включения конкретных быстрых кнопок:
procedure TForm1.DisableSound1Click(Sender: TObject);

begin
{отключите или включите кнопку и установите галочку в меню для сигнальной кнопки}
SpeedButtonNote.Enabled:= not SpeedButtonNote.Enabled;
DisableSoundl.Checked:= not DisableSoundl.Checked;
end;

Аналогичным образом можно написать программный код для других быстрых кнопок. Когда вы будете отключать одну из быстрых кнопок, то Delphi автоматически рисует затененную версию растрового изображения.

Добавление всплывающих подсказок в инструментальную линейку.
Другим элементом, который является распространенным в инструментальных линейках, является всплывающая подсказка (называемая также парящий текст) — текст, который кратко описывает быструю кнопку под изображением курсора. Этот текст обычно выводится на экран в окне желтого цвета, после того как курсор мыши остается неподвижным над кнопкой в течение некоторого времени.
Для добавления всплывающих подсказок в инструментальную линейку приложения просто устанавливают значение свойства ShowHints панели, которая используется как инструментальная линейка в значение равное True. Вы можете добавить непосредственно конкретный текст для всплывающей подсказки инструментальной линейки, используя свойство Hint инспектора объекта для выделенного компонента. На рисунке 9 показана всплывающая подсказка для панели.

Устанавливая таким образом для каждой кнопки всплывающую подсказку, ваше приложение приобретет информационный вид. Вы можете выполнить действие, позволяющее иметь другую подсказку, в том случае, когда кнопка нажата, добавив две строки программы в метод SpeedButtonBigClick, чтобы изменять всплывающую подсказку, когда изменяется состояние кнопки:

procedure TForm1.SpeedButtonBigClick(Sender: TObject);
begin
if SpeedButtonBig.Down then begin
Label1.Font.Size: = 24;
SpeedButtonBig.Hint:= 'Увеличенный размер шрифта';
end
else
begin
Label1.Font.Size:= 12;
SpeedButtonBig.Hint:= 'Уменьшенный размер шрифта';
end;
end;

Как вы видите, для добавления всплывающих подсказок потребовалась малая часть программного кода. Текст всплывающей подсказки изменяется в зависимости от состояния быстрой кнопки — нажата кнопка или нет.
Так же, как были добавлены всплывающие подсказки в инструментальную линейку приложения, вы можете добавить всплывающие подсказки в формы или в компоненты формы.

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

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


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




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

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