От Delphi 4 к Delphi 5 часть 19
От Delphi 4 к Delphi 5 Палитра компонентов.
Страница ADO.
Компонент ADO Connection ( ADO связь) обеспечивает связь остальных компонентов с объектом ADO.
Компонент ADOCommand ( ADO команда) служит для передачи в ADO команды на языке DLL.
Компонент ADODataSet ( ADO набор данных) используется для представления данных, полученных другими компонентами-наборами.
Компонент ADOTable ( ADO таблица) представляет данные в табличном формате.
Компонент ADOQuery служит для передачи объекту ADO запроса на языке SQL.
Компонент ADOStoredProc ( ADO хранимая процедура) используется для выполнения процедуры, хранимой в объекте ADO.
Компонент RDSConnection ( RDS связь) служит для публикации данных с помощью Internet Explorer.
Компоненты этой страницы среды Delphi 5 (рисунок 1) позволяют отказаться от использования инструментального средства BDE для доступа к разнообразным базам данных.
Синтаксический контроль в Delphi.
Вполне естественно, что, когда вы пишите программу, то делаете ошибки. Но не беспокойтесь, несмотря на то, что среда Delphi не может совершенно уберечь вас от них, она, несомненно, поможет вам их исправлять.
Как бы ни был хорош этот программный продукт, вам все равно еще нужно писать код, а в процессе его написания не исключены ошибки. Даже лучшие в мире программные продукты могут оказаться парализованными, если программисту не предоставлены средства для прослеживания и исправления их.
Как и все в Delphi располагает к удобному применению, также приятно использовать и интегрированный отладчик. Среда предоставляет все возможности, которые программист ожидает получить от профессионального отладчика, причем для использования этих возможностей не обязательно быть асом программирования. Средства отладки Delphi помогут вам справиться с данной проблемой и сэкономить массу времени и нервов.
Одним из важных качеств этого программного продукта, который делает программирование простым, заключается в том, что весь код для формы содержится в одном Pascal-файле . Это обстоятельство облегчает просмотр программного кода и обнаружение ошибок.
Рассмотрим типичные ошибки, возникающие после написания кода. Их можно разделить на три вида: синтаксические ошибки, ошибки выполнения и логические ошибки.
Когда вы пишете программы на Delphi, опасность составляют синтаксические ошибки, которые часто бывают опечатками.
К ошибкам выполнения относятся любые ошибки, появляющиеся во время исполнения программы.
Логические ошибки - это такие ошибки, которые случаются, когда программа не делает того, что вы хотели, или делает то, чего вы не хотели.
Синтаксические ошибки часто появляются из-за опечаток, допущенных при наборе кода программы. Они возникают также, если вы не знаете точный синтаксис операторов языка Pascal. Программа не будет запущена на выполнение до тех пор, пока вы не устраните все синтаксические ошибки.
Удобным является то, что когда имеется ошибка, Delphi выдает вам о ней сообщение и ставит курсор в то место программы, где она обнаружена. Посмотрим, как это происходит. В качестве примера использована программа Scroll, рассмотренная на занятии 18 (рисунок 2). В данном случае выдано сообщение об отсутствии символа точка с запятой (;), в модуле файла под именем Scroll, курсор установлен на строке 57, с информацией о невозможности компиляции файла Scroll_.pas.
Object Pascal - один из наиболее требовательных языков в отношении синтаксиса. Среда Delphi будет требовать от вас безупречного кода. То есть вам необходимо кропотливо работать, набирать программный код точно. Но для облегчения труда программиста Delphi предоставляет множество синтаксических заготовок. Например, рассмотрите следующий текст начала файла модуля Scroll_.pas, ниже он приведен в сокращенном виде:
unit Scroll_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
ScrollBarRed: TScrollBar;
ScrollBarGreen: TScrollBar;
LabelScrollGreen: TLabel;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
procedure ScrollBarRedScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
…
procedure TrackBar3Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Вы видите, что определение модуля, типы и описание процедур занимает достаточно много места. Если бы вы набирали это сами, то для этого необходимо потратить определенное время, а потом еще возможно исправить ошибки. Для облегчения вашего труда данная часть программы создается Delphi автоматически, что обеспечивает ее синтаксическую правильность.
Чтобы задать конфигурацию среды Delphi для поиска ошибок, необходимо использовать меню Project, далее произвести выбор команды Options. На экране появится диалоговое окно Project Options. Выберите вкладку Compiler (рисунок 3). Установленные опции в разделе Syntax options определят для Delphi, какие типы синтаксических проверок проводить.
Опция Strict Var-strings сообщает компилятору о необходимости сравнивать тип строки, передаваемой процедуре или функции, с объявленным формальным параметром. Если эта опция включена, компилятор выдает сообщение о синтаксической ошибке, когда вы пытаетесь передать функции переменную, тип которой отличается от того, который объявлен в списке формальных параметров. Например, следующая программа вызовет синтаксическую ошибку (опция Strict Var-strings включена). На рисунке 4 показан результат синтаксического контроля:
procedure Prog(var S:String);
begin
S :=' xxxx' ;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string[3] ;
begin
Prog(S);
end;
end.
Вы должны всегда оставлять эту опцию включенной, чтобы быть уверенным в том, что не перепишете область памяти, не относящуюся к объявленному параметру.
Опция Complete Boolean Eval приказывает компилятору генерировать код таким образом, чтобы во время выполнения логические выражения вычислялись полностью. Когда эта опция выключена, компилятор генерирует код, который может "закорачивать" логические выражения, если результат становится известным уже на ранних этапах оценки выражения. В большинстве случаев вы должны оставить ее выключенной, поскольку при этом генерируется более быстрый код. Эта опция не влияет на проверку компилятором синтаксических ошибок.
Опция Extended Syntax разрешает компилятору применять набор расширенных синтаксических правил. Она позволяет вам использовать функцию как оператор, результат функции будет игнорироваться. Более важно то, что эта опция позволяет вам применять переменные типа PChar. Поскольку PChar интенсивно используются, когда вызываются Windows API, вы всегда должны оставлять эту опцию включенной.
Опция Typed @ Operator заставляет компилятор возвращать указатель, тип которого аналогичен операнду операции @ . Например, байтовая переменная вернет указатель на байт. При выключенной опции компилятор всегда возвращает не типизированный указатель. Лучше оставлять эту опцию выключенной, чтобы избежать написания кода, который будет иметь дело с несовместимыми типами указателей.
Опция Open Parameters позволяет компилятору рассматривать любую строку, переданную функции, как открытую строку, или PChar внутри этой функции, не обращая внимания на тип строки, объявленной в качестве формального параметра.
Опция Huge Strings соответствует директиве компилятора $+H. Чтобы устранить ограничения традиционных строк Паскаля, в Delphi введена поддержка длинных строк. Тип AnsiString соответствует новым длинным строкам переменного размера. Они размещаются динамически, а их размер практически не ограничен. В основе этих строк лежит тип AnsiChar. Если опция будет выключена, то это будет соответствовать директиве компилятора $-H. В этом случае вы получите короткую строку, длина которой ограничена 255 символами.
Опция Assignable Typed Constants соответствует директиве компилятора $+J. Используется для совместимости с Delphi 1, разрешая присваивание типизированным константам.
Подпрограммы.
Подпрограммы лежат в основе методики программирования, называемой сокрытием информации. Вы можете упаковать часть функциональных возможностей программы внутри подпрограммы, присвоив ей имя. Впоследствии можете вызывать ее, используя имя, а не переписывать все необходимые операторы. Таким образом, вы скрываете детали того, как эти функциональные возможности реализуются.
Следовательно, вы получаете автономные исполнимые элементы программы. Необходимо знать, что почти все, что касается подпрограмм, применимо к объектным методам, о которых вы узнаете позже. Вы можете рассматривать методы как подпрограммы, которые являются частью объектов.
Object Pascal обеспечивает ряд зарезервированных подпрограмм, известных как Run-Time Library (исполнительная библиотека - RTL ). Библиотека RTL состоит из заранее заготовленных подпрограмм, которые вы можете использовать в своих программах. Примером могут служить подпрограммы sin., cos. и другие. Когда вы используете такую подпрограмму, например sin, которая вычисляет синус угла, вам не нужно знать точно, как вычисляется значение синуса. Подпрограмма делает это за вас автоматически, и вас не должны интересовать детали более низкого уровня. Таким образом, вы в следующий раз не выполняете рутинные операции по составлению программы вычисления синуса угла.
В дополнение к зарезервированным стандартным процедурам Object Pascal позволяет вам создавать свои собственные процедуры.
Параметр или параметры подпрограммы позволяют обратиться в нее извне. Подпрограмма в произвольном случае может иметь много параметров, обычно не более семи. Внутри нее параметр ведет себя просто как переменная. Вы можете использовать подпрограмму в выражениях.
Создание подпрограмм позволяет избежать дублирования кода и обеспечивает возможность его повторного использования. Если вы должны писать почти идентичный код в двух или более местах, всегда выделяйте общий код в отдельную подпрограмму, а затем просто используйте ее всякий раз, когда нужны имеющиеся в ней функциональные возможности.
Если вы реализуете процедуру внутри модуля и хотите, чтобы она была видна вне его, вы должны поместить ее объявление в раздел interface данного модуля. Реализация процедуры должна всегда располагаться в разделе implementation того же модуля. Она не видна вне его, если вы явно не передаете объявление как часть интерфейса.
Если процедура реализована в том же самом модуле, в котором она используется, вы все еще можете нуждаться в отдельном объявлении, чтобы сделать ее видимой другим процедурам в том же модуле.
Каждая подпрограмма должна иметь блок исполнимых операторов, который содержит ноль или более исполнимых операторов, заключенный в операторы begin-end.
Операторы представляют собой фактические инструкции, которые должен выполнить компьютер.
Подпрограммы по праву могут рассматриваться как маленькие программы. Каждая подпрограмма может иметь свои собственные объявления. Они расположены внутри подпрограммы и называются локальными, потому что видимы и доступны только в пределах подпрограммы. На них нельзя ссылаться вне блока реализации подпрограммы.
Подобно тому, как вы объявляете константы, переменные, константы с типом, определенные вами типы и подпрограммы внутри ваших программ и т.д., вы можете объявлять локальные константы, локальные переменные, локальные константы с типом, локальные типы и локальные подпрограммы внутри подпрограммы.
Локальные объявления располагаются внутри блоков реализации подпрограммы, между заголовком и телом. Локальный блок объявлений подпрограммы может быть полностью исключен, что часто и делается.
В Delphi вы можете использовать два вида подпрограмм и, следовательно, два вида заголовков - это процедуры и функции.
Функции не только дают возможность объединить исполнимые операторы и связанные с ними объявления вместе, но также производят возвращение некоторого значения . Вы можете, таким образом, использовать их внутри выражений справа от операции присваивания, как будто это обычные переменные. Простейшим выражением, включающим функцию, является ссылка на одиночную функцию, приводящая к ее активации и оценке.
После того как она выполнена, значение, вычисленное ей, возвращается и может быть использовано внутри выражения, в котором она находится.
Общий синтаксис для простого заголовка функции без параметров следующий:
function Имя: ТипРезультата ; например:
function Name: String;
Заголовок начинается с зарезервированного слова function, за которым следует ее имя.
В тех функциях, в которых не объявляются никакие параметры, за именем следует двоеточие, тип значения, которое она возвращает, и точка с запятой. Таким образом, имеется небольшое отличие от основной структуры.
Тип, возвращаемый функцией, - это идентификатор типа результата, и он может быть почти любым идентификатором типа Object Pascal.
Общий синтаксис для заголовка функции с параметрами следующий:
function Имя(<Список формальных параметров>): ТипРезультата;
Если подпрограмма типа процедуры или функции имеет параметры, то в объявлении заголовка появляется список формальных параметров внутри круглых скобок.
Фактическим параметром подпрограммы или аргументом называется определенное значение, которое передается ей во время выполнения в том месте, которое соответствует формальному параметру. Значение должно иметь тип, соответствующий тому, который был определен, когда объявлялся формальный параметр в заголовке подпрограммы.
Когда вызывается подпрограмма, вы вносите в список фактические параметры в том же самом порядке, в котором объявлены ее формальные параметры подпрограммы.
Каждое индивидуальное объявление параметра состоит из имени (или списка отдельных имен, отделенных запятыми), за которым следует двоеточие и имя типа. Многократные объявления параметров в списке формальных параметров отделены друг от друга точкой с запятой.
Объявление типа параметра подпрограммы играет ту же роль, что и объявление типа переменной: оно позволяет компилятору зарезервировать соответствующее место для хранения значений параметра и дает ему возможность проверять любые нарушения совместимости типа, например, попытки присвоить параметру несовместимое по типу значение, скажем, строку типа String целой переменной.
Рассмотрим пример реализации функции.
Суть примера будет заключаться в рисовании мишени на экране компьютера или внешнего вида экрана индикатора радиолокационной станции. В текстовые редакторы можно вводить координаты X, Y экрана компьютера и значение радиуса максимальной окружности мишени. Система уравнений, которая определяет положение точки, описывающей максимальную окружность, имеет вид:
X = X1 + [R – R cos ά]
Y = Y1 + R*sin ά;
где X, Y - текущие координаты положения точки экрана;
X1, Y1 – координаты верхней точки окружности;
R – значение радиуса окружности.
На рисунке 5 показан результат работы программы Mishen и основные параметры для рисования мишени на экране компьютера.
Поскольку вам необходимо определить возвращаемое функцией значение, то, по крайней мере, один из операторов внутри исполнимого блока должен быть оператором присваивания этого значения либо имени функции, либо специальной переменной Result, имеющей тот же тип, что и результат функции.
Она является псевдонимом имени функции. Присваивание значения переменной Result по действию аналогично присвоению значения функции. Вызов функции означает не только передачу контроля над выполнением программы к исполняемому блоку, но также получение значения, ради вычисления которого она разработана.
Вызов CoordinaneX и CoordinateY производится по их именам строки 35-36, со списком фактических параметров, получаемых из текстовых редакторов. Вычисленные функциями значения возвращаются и используются для рисования на экране компьютера мишени.
Всего в данном примере производится рисование 25 окружностей с шагом в 10 пикселей отстоящих друг от друга. Каждая пятая окружность имеет утолщенный вид.
Если вы добавите кнопку Button2 и запишете для события OnClick следующий оператор:
procedure TForm1.Button2Click(Sender: TObject);
begin
Refresh;
end;
то вы сможете очищать экран компьютера от нарисованного изображения, вводить новые значения и наблюдать работу программы.
Далее представлен программный код предложенного примера:
0,5,10,15,20:Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);.
Перегрузка процедур и функций.
Вы можете объявить более чем одну подпрограмму в той же области программы и с тем же именем. Такое положение называется перегрузкой. Перегруженные программы должны объявляться с директивой перегрузки и иметь различия в списке параметров.
Рассмотрим пример:
function Divide(X, Y: Real): Real; overload;
begin
Result := X/Y;
end;
function Divide(X, Y: Integer): Integer; overload;
begin
Result := X div Y;
end;
Эти декларации создают две функции, одинаково названные Divide, но использующие параметры двух типов. Когда вы вызываете функцию деления, компилятор определяет, какую функцию ввести, определяя фактические параметры. Например, деление (6.0, на 3.0) вызывает первую функцию деления, поскольку аргументы - реальные числа.
Перегруженные программы должны различаться количеством параметров, с которыми они работают, или типами их параметров.
Компонент GroupBox.
Он находится на странице Standard палитры компонентов и позволяет производить группировку связанных управляющих элементов для придания им более организованного вида.
Компонент GroupBox оказывает влияние на взаимодействие пользователя с клавиатурой. Переход в окно группы перемещает фокус на помеченный компонент в группе.
Например, используем компонент RadioButton. Перемещение фокуса в пределах группы осуществляется нажатием клавиш со стрелками, вместо клавиши табуляции (рисунок 6). Выход из любого элемента группы на компонент вне ее осуществляется нажатием клавиши "Табуляция".
Необходимо заметить, что вы должны поместить компонент GroupBox на форму до того, как вы расположите на нем компоненты, например CheckBox, RadioButton, которые должны быть внутри группового элемента. Иначе, компоненты CheckBox, RadioButton не будут перемещаться вместе с компонентом GroupBox, когда вы будете изменять его положение на форме.
Таким образом, во избежание проблем компонент GroupBox, который должен быть "родителем" других компонентов ( Panel, GroupBox, Notebook, StringGrid, ScrollBox и т.д.), нужно помещать на форму до помещения на него его "детей". Если вы все же забыли об этом и поместили "родителя" (например, GroupBox ) на форму после размещения на нем его "потомков" (например, CheckBox и RadioButton ) - не отчаивайтесь! Отметьте все необходимые объекты и копируйте (после чего удалите их) их в буфер обмена с помощью команд меню Edit|Cut . После этого отметьте на форме нужный вам объект ( GroupBox1) и выполните команду меню Edit|Paste . Все выделенные вами ранее объекты будут помещены на форму и их "родителем" будет GroupBox1 . Описанный механизм является стандартным и может быть использован для всех видимых компонентов.
Компонент GroupBox имеет свойство Caption, позволяющее вводить заголовок для группы вложенных элементов, чтобы определить их функциональное назначение.
Литература:
Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г.
Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996г.
В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО "Издательство Бином". 2000 г. Владимир Скуратов
(c) компьютерная газета
Страница ADO.
Компонент ADO Connection ( ADO связь) обеспечивает связь остальных компонентов с объектом ADO.
Компонент ADOCommand ( ADO команда) служит для передачи в ADO команды на языке DLL.
Компонент ADODataSet ( ADO набор данных) используется для представления данных, полученных другими компонентами-наборами.
Компонент ADOTable ( ADO таблица) представляет данные в табличном формате.
Компонент ADOQuery служит для передачи объекту ADO запроса на языке SQL.
Компонент ADOStoredProc ( ADO хранимая процедура) используется для выполнения процедуры, хранимой в объекте ADO.
Компонент RDSConnection ( RDS связь) служит для публикации данных с помощью Internet Explorer.
Компоненты этой страницы среды Delphi 5 (рисунок 1) позволяют отказаться от использования инструментального средства BDE для доступа к разнообразным базам данных.
Синтаксический контроль в Delphi.
Вполне естественно, что, когда вы пишите программу, то делаете ошибки. Но не беспокойтесь, несмотря на то, что среда Delphi не может совершенно уберечь вас от них, она, несомненно, поможет вам их исправлять.
Как бы ни был хорош этот программный продукт, вам все равно еще нужно писать код, а в процессе его написания не исключены ошибки. Даже лучшие в мире программные продукты могут оказаться парализованными, если программисту не предоставлены средства для прослеживания и исправления их.
Как и все в Delphi располагает к удобному применению, также приятно использовать и интегрированный отладчик. Среда предоставляет все возможности, которые программист ожидает получить от профессионального отладчика, причем для использования этих возможностей не обязательно быть асом программирования. Средства отладки Delphi помогут вам справиться с данной проблемой и сэкономить массу времени и нервов.
Одним из важных качеств этого программного продукта, который делает программирование простым, заключается в том, что весь код для формы содержится в одном Pascal-файле . Это обстоятельство облегчает просмотр программного кода и обнаружение ошибок.
Рассмотрим типичные ошибки, возникающие после написания кода. Их можно разделить на три вида: синтаксические ошибки, ошибки выполнения и логические ошибки.
Когда вы пишете программы на Delphi, опасность составляют синтаксические ошибки, которые часто бывают опечатками.
К ошибкам выполнения относятся любые ошибки, появляющиеся во время исполнения программы.
Логические ошибки - это такие ошибки, которые случаются, когда программа не делает того, что вы хотели, или делает то, чего вы не хотели.
Синтаксические ошибки часто появляются из-за опечаток, допущенных при наборе кода программы. Они возникают также, если вы не знаете точный синтаксис операторов языка Pascal. Программа не будет запущена на выполнение до тех пор, пока вы не устраните все синтаксические ошибки.
Удобным является то, что когда имеется ошибка, Delphi выдает вам о ней сообщение и ставит курсор в то место программы, где она обнаружена. Посмотрим, как это происходит. В качестве примера использована программа Scroll, рассмотренная на занятии 18 (рисунок 2). В данном случае выдано сообщение об отсутствии символа точка с запятой (;), в модуле файла под именем Scroll, курсор установлен на строке 57, с информацией о невозможности компиляции файла Scroll_.pas.
Object Pascal - один из наиболее требовательных языков в отношении синтаксиса. Среда Delphi будет требовать от вас безупречного кода. То есть вам необходимо кропотливо работать, набирать программный код точно. Но для облегчения труда программиста Delphi предоставляет множество синтаксических заготовок. Например, рассмотрите следующий текст начала файла модуля Scroll_.pas, ниже он приведен в сокращенном виде:
unit Scroll_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
ScrollBarRed: TScrollBar;
ScrollBarGreen: TScrollBar;
LabelScrollGreen: TLabel;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
procedure ScrollBarRedScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
…
procedure TrackBar3Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Вы видите, что определение модуля, типы и описание процедур занимает достаточно много места. Если бы вы набирали это сами, то для этого необходимо потратить определенное время, а потом еще возможно исправить ошибки. Для облегчения вашего труда данная часть программы создается Delphi автоматически, что обеспечивает ее синтаксическую правильность.
Чтобы задать конфигурацию среды Delphi для поиска ошибок, необходимо использовать меню Project, далее произвести выбор команды Options. На экране появится диалоговое окно Project Options. Выберите вкладку Compiler (рисунок 3). Установленные опции в разделе Syntax options определят для Delphi, какие типы синтаксических проверок проводить.
Опция Strict Var-strings сообщает компилятору о необходимости сравнивать тип строки, передаваемой процедуре или функции, с объявленным формальным параметром. Если эта опция включена, компилятор выдает сообщение о синтаксической ошибке, когда вы пытаетесь передать функции переменную, тип которой отличается от того, который объявлен в списке формальных параметров. Например, следующая программа вызовет синтаксическую ошибку (опция Strict Var-strings включена). На рисунке 4 показан результат синтаксического контроля:
procedure Prog(var S:String);
begin
S :=' xxxx' ;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string[3] ;
begin
Prog(S);
end;
end.
Вы должны всегда оставлять эту опцию включенной, чтобы быть уверенным в том, что не перепишете область памяти, не относящуюся к объявленному параметру.
Опция Complete Boolean Eval приказывает компилятору генерировать код таким образом, чтобы во время выполнения логические выражения вычислялись полностью. Когда эта опция выключена, компилятор генерирует код, который может "закорачивать" логические выражения, если результат становится известным уже на ранних этапах оценки выражения. В большинстве случаев вы должны оставить ее выключенной, поскольку при этом генерируется более быстрый код. Эта опция не влияет на проверку компилятором синтаксических ошибок.
Опция Extended Syntax разрешает компилятору применять набор расширенных синтаксических правил. Она позволяет вам использовать функцию как оператор, результат функции будет игнорироваться. Более важно то, что эта опция позволяет вам применять переменные типа PChar. Поскольку PChar интенсивно используются, когда вызываются Windows API, вы всегда должны оставлять эту опцию включенной.
Опция Typed @ Operator заставляет компилятор возвращать указатель, тип которого аналогичен операнду операции @ . Например, байтовая переменная вернет указатель на байт. При выключенной опции компилятор всегда возвращает не типизированный указатель. Лучше оставлять эту опцию выключенной, чтобы избежать написания кода, который будет иметь дело с несовместимыми типами указателей.
Опция Open Parameters позволяет компилятору рассматривать любую строку, переданную функции, как открытую строку, или PChar внутри этой функции, не обращая внимания на тип строки, объявленной в качестве формального параметра.
Опция Huge Strings соответствует директиве компилятора $+H. Чтобы устранить ограничения традиционных строк Паскаля, в Delphi введена поддержка длинных строк. Тип AnsiString соответствует новым длинным строкам переменного размера. Они размещаются динамически, а их размер практически не ограничен. В основе этих строк лежит тип AnsiChar. Если опция будет выключена, то это будет соответствовать директиве компилятора $-H. В этом случае вы получите короткую строку, длина которой ограничена 255 символами.
Опция Assignable Typed Constants соответствует директиве компилятора $+J. Используется для совместимости с Delphi 1, разрешая присваивание типизированным константам.
Подпрограммы.
Подпрограммы лежат в основе методики программирования, называемой сокрытием информации. Вы можете упаковать часть функциональных возможностей программы внутри подпрограммы, присвоив ей имя. Впоследствии можете вызывать ее, используя имя, а не переписывать все необходимые операторы. Таким образом, вы скрываете детали того, как эти функциональные возможности реализуются.
Следовательно, вы получаете автономные исполнимые элементы программы. Необходимо знать, что почти все, что касается подпрограмм, применимо к объектным методам, о которых вы узнаете позже. Вы можете рассматривать методы как подпрограммы, которые являются частью объектов.
Object Pascal обеспечивает ряд зарезервированных подпрограмм, известных как Run-Time Library (исполнительная библиотека - RTL ). Библиотека RTL состоит из заранее заготовленных подпрограмм, которые вы можете использовать в своих программах. Примером могут служить подпрограммы sin., cos. и другие. Когда вы используете такую подпрограмму, например sin, которая вычисляет синус угла, вам не нужно знать точно, как вычисляется значение синуса. Подпрограмма делает это за вас автоматически, и вас не должны интересовать детали более низкого уровня. Таким образом, вы в следующий раз не выполняете рутинные операции по составлению программы вычисления синуса угла.
В дополнение к зарезервированным стандартным процедурам Object Pascal позволяет вам создавать свои собственные процедуры.
Параметр или параметры подпрограммы позволяют обратиться в нее извне. Подпрограмма в произвольном случае может иметь много параметров, обычно не более семи. Внутри нее параметр ведет себя просто как переменная. Вы можете использовать подпрограмму в выражениях.
Создание подпрограмм позволяет избежать дублирования кода и обеспечивает возможность его повторного использования. Если вы должны писать почти идентичный код в двух или более местах, всегда выделяйте общий код в отдельную подпрограмму, а затем просто используйте ее всякий раз, когда нужны имеющиеся в ней функциональные возможности.
Если вы реализуете процедуру внутри модуля и хотите, чтобы она была видна вне его, вы должны поместить ее объявление в раздел interface данного модуля. Реализация процедуры должна всегда располагаться в разделе implementation того же модуля. Она не видна вне его, если вы явно не передаете объявление как часть интерфейса.
Если процедура реализована в том же самом модуле, в котором она используется, вы все еще можете нуждаться в отдельном объявлении, чтобы сделать ее видимой другим процедурам в том же модуле.
Каждая подпрограмма должна иметь блок исполнимых операторов, который содержит ноль или более исполнимых операторов, заключенный в операторы begin-end.
Операторы представляют собой фактические инструкции, которые должен выполнить компьютер.
Подпрограммы по праву могут рассматриваться как маленькие программы. Каждая подпрограмма может иметь свои собственные объявления. Они расположены внутри подпрограммы и называются локальными, потому что видимы и доступны только в пределах подпрограммы. На них нельзя ссылаться вне блока реализации подпрограммы.
Подобно тому, как вы объявляете константы, переменные, константы с типом, определенные вами типы и подпрограммы внутри ваших программ и т.д., вы можете объявлять локальные константы, локальные переменные, локальные константы с типом, локальные типы и локальные подпрограммы внутри подпрограммы.
Локальные объявления располагаются внутри блоков реализации подпрограммы, между заголовком и телом. Локальный блок объявлений подпрограммы может быть полностью исключен, что часто и делается.
В Delphi вы можете использовать два вида подпрограмм и, следовательно, два вида заголовков - это процедуры и функции.
Функции не только дают возможность объединить исполнимые операторы и связанные с ними объявления вместе, но также производят возвращение некоторого значения . Вы можете, таким образом, использовать их внутри выражений справа от операции присваивания, как будто это обычные переменные. Простейшим выражением, включающим функцию, является ссылка на одиночную функцию, приводящая к ее активации и оценке.
После того как она выполнена, значение, вычисленное ей, возвращается и может быть использовано внутри выражения, в котором она находится.
Общий синтаксис для простого заголовка функции без параметров следующий:
function Имя: ТипРезультата ; например:
function Name: String;
Заголовок начинается с зарезервированного слова function, за которым следует ее имя.
В тех функциях, в которых не объявляются никакие параметры, за именем следует двоеточие, тип значения, которое она возвращает, и точка с запятой. Таким образом, имеется небольшое отличие от основной структуры.
Тип, возвращаемый функцией, - это идентификатор типа результата, и он может быть почти любым идентификатором типа Object Pascal.
Общий синтаксис для заголовка функции с параметрами следующий:
function Имя(<Список формальных параметров>): ТипРезультата;
Если подпрограмма типа процедуры или функции имеет параметры, то в объявлении заголовка появляется список формальных параметров внутри круглых скобок.
Фактическим параметром подпрограммы или аргументом называется определенное значение, которое передается ей во время выполнения в том месте, которое соответствует формальному параметру. Значение должно иметь тип, соответствующий тому, который был определен, когда объявлялся формальный параметр в заголовке подпрограммы.
Когда вызывается подпрограмма, вы вносите в список фактические параметры в том же самом порядке, в котором объявлены ее формальные параметры подпрограммы.
Каждое индивидуальное объявление параметра состоит из имени (или списка отдельных имен, отделенных запятыми), за которым следует двоеточие и имя типа. Многократные объявления параметров в списке формальных параметров отделены друг от друга точкой с запятой.
Объявление типа параметра подпрограммы играет ту же роль, что и объявление типа переменной: оно позволяет компилятору зарезервировать соответствующее место для хранения значений параметра и дает ему возможность проверять любые нарушения совместимости типа, например, попытки присвоить параметру несовместимое по типу значение, скажем, строку типа String целой переменной.
Рассмотрим пример реализации функции.
Суть примера будет заключаться в рисовании мишени на экране компьютера или внешнего вида экрана индикатора радиолокационной станции. В текстовые редакторы можно вводить координаты X, Y экрана компьютера и значение радиуса максимальной окружности мишени. Система уравнений, которая определяет положение точки, описывающей максимальную окружность, имеет вид:
X = X1 + [R – R cos ά]
Y = Y1 + R*sin ά;
где X, Y - текущие координаты положения точки экрана;
X1, Y1 – координаты верхней точки окружности;
R – значение радиуса окружности.
На рисунке 5 показан результат работы программы Mishen и основные параметры для рисования мишени на экране компьютера.
- Запустите Delphi.
- Сохраните файл модуля под именем DartBoard_.pas, а файл проекта под именем DartBoard. dpr.
- Поместите на форму три компонента Edit со страницы Standard палитры компонентов, необходимых для ввода значений координат и радиуса окружности. В компонент Edit1 будете вводить координату Х1, в компонент Edit2 - координату Y1, в компонент Edit3 - радиус максимальной окружности, обрамляющей рисуемую мишень. Используя свойство Text инспектора объекта для данных компонентов, очистите содержимое текстовых редакторов и введите начальные значения координат и радиуса максимальной окружности. Например, X1 = 380, Y1 = 30, R = 250 . Все значения заданы в пикселях.
- Поместите на форму три компонента Label: Label1, Label2, Label3 со страницы Standard палитры компонентов . Используя свойство Caption, введите заголовки для этикеток "Ввод координаты X", "Ввод координаты Y", "Ввод значения радиуса" соответственно .
- Поместите на форму компонент Button со страницы Standard палитры компонентов, используя свойство Caption, введите для него заголовок "Результат" .
- Чтобы реализовать функцию, вы должны ввести последовательность исполняемых операторов, которые составляют тело функции. В данном примере реализованы две функции: CoordinateX и CoordinateY. Программный код раздела implementation представлен ниже. Строка 1 содержит заголовок функции CoordinateX со списком формальных параметров. Строка 12 содержит заголовок функции CoordinateY со списком формальных параметров. Каждая функция имеет блок локальных объявлений строки 2-4, 13-15. Исполнимые блоки функций представлены в строках 5-11, 16-22.
Поскольку вам необходимо определить возвращаемое функцией значение, то, по крайней мере, один из операторов внутри исполнимого блока должен быть оператором присваивания этого значения либо имени функции, либо специальной переменной Result, имеющей тот же тип, что и результат функции.
Она является псевдонимом имени функции. Присваивание значения переменной Result по действию аналогично присвоению значения функции. Вызов функции означает не только передачу контроля над выполнением программы к исполняемому блоку, но также получение значения, ради вычисления которого она разработана.
Вызов CoordinaneX и CoordinateY производится по их именам строки 35-36, со списком фактических параметров, получаемых из текстовых редакторов. Вычисленные функциями значения возвращаются и используются для рисования на экране компьютера мишени.
Всего в данном примере производится рисование 25 окружностей с шагом в 10 пикселей отстоящих друг от друга. Каждая пятая окружность имеет утолщенный вид.
Если вы добавите кнопку Button2 и запишете для события OnClick следующий оператор:
procedure TForm1.Button2Click(Sender: TObject);
begin
Refresh;
end;
то вы сможете очищать экран компьютера от нарисованного изображения, вводить новые значения и наблюдать работу программы.
Далее представлен программный код предложенного примера:
- function СoordinateX(X1:Real;Y1:Real;Radius1:Real;Z:Integer;M:Integer):Integer;
- var
- V:Variant;
- X:Integer;
- begin
- X1:=X1 + (Radius1+Z)*sin(M*pi/180);
- X1:=Int(X1);
- V:=X1;
- X:=V;
- Result:=X;
- end;
- function CoordinateY(X1:Real;Y1:Real;Radius1:Real;Z:Integer;M:Integer):Integer;
- var
- V1:Variant;
- Y:Integer;
- begin
- Y1:=Y1 + (Radius1 - (Radius1+Z)*cos(M*pi/180));
- Y1:=Int(Y1);
- V1:=Y1;
- Y:=V1;
- Result:=Y;
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var
- X1,Y1,Radius1:Real;
- M,H,Z,K, Y2,X2:Integer;
- begin
- X1:=StrToFloat(Edit1.Text);
- Y1:=StrToFloat(Edit2.Text);
- Radius1:=StrToFloat(Edit3.Text);
- for K:=0 to 359 do begin
- for H:=0 to 24 do begin
- M:=K+1;
- Z:=H*(-10);
- X2:=CoordinateX(X1,Y1,Radius1, Z,M);
- Y2:=CoordinateY(X1,Y1,Radius1,Z,M);
- Canvas.Pen.Width:=2;
- Canvas.Pen.Color:=clAqua;
- Canvas.Ellipse(X2+1,Y2+1,X2-1,Y2-1);
- case H of
- 0:Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);
- 5:Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);
- 10:Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);
- 15:Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);
- 20: Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);
- end;
- end;
- end;
- end;
- end.
0,5,10,15,20:Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);.
Перегрузка процедур и функций.
Вы можете объявить более чем одну подпрограмму в той же области программы и с тем же именем. Такое положение называется перегрузкой. Перегруженные программы должны объявляться с директивой перегрузки и иметь различия в списке параметров.
Рассмотрим пример:
function Divide(X, Y: Real): Real; overload;
begin
Result := X/Y;
end;
function Divide(X, Y: Integer): Integer; overload;
begin
Result := X div Y;
end;
Эти декларации создают две функции, одинаково названные Divide, но использующие параметры двух типов. Когда вы вызываете функцию деления, компилятор определяет, какую функцию ввести, определяя фактические параметры. Например, деление (6.0, на 3.0) вызывает первую функцию деления, поскольку аргументы - реальные числа.
Перегруженные программы должны различаться количеством параметров, с которыми они работают, или типами их параметров.
Компонент GroupBox.
Он находится на странице Standard палитры компонентов и позволяет производить группировку связанных управляющих элементов для придания им более организованного вида.
Компонент GroupBox оказывает влияние на взаимодействие пользователя с клавиатурой. Переход в окно группы перемещает фокус на помеченный компонент в группе.
Например, используем компонент RadioButton. Перемещение фокуса в пределах группы осуществляется нажатием клавиш со стрелками, вместо клавиши табуляции (рисунок 6). Выход из любого элемента группы на компонент вне ее осуществляется нажатием клавиши "Табуляция".
Необходимо заметить, что вы должны поместить компонент GroupBox на форму до того, как вы расположите на нем компоненты, например CheckBox, RadioButton, которые должны быть внутри группового элемента. Иначе, компоненты CheckBox, RadioButton не будут перемещаться вместе с компонентом GroupBox, когда вы будете изменять его положение на форме.
Таким образом, во избежание проблем компонент GroupBox, который должен быть "родителем" других компонентов ( Panel, GroupBox, Notebook, StringGrid, ScrollBox и т.д.), нужно помещать на форму до помещения на него его "детей". Если вы все же забыли об этом и поместили "родителя" (например, GroupBox ) на форму после размещения на нем его "потомков" (например, CheckBox и RadioButton ) - не отчаивайтесь! Отметьте все необходимые объекты и копируйте (после чего удалите их) их в буфер обмена с помощью команд меню Edit|Cut . После этого отметьте на форме нужный вам объект ( GroupBox1) и выполните команду меню Edit|Paste . Все выделенные вами ранее объекты будут помещены на форму и их "родителем" будет GroupBox1 . Описанный механизм является стандартным и может быть использован для всех видимых компонентов.
Компонент GroupBox имеет свойство Caption, позволяющее вводить заголовок для группы вложенных элементов, чтобы определить их функциональное назначение.
Литература:
Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г.
Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996г.
В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО "Издательство Бином". 2000 г. Владимир Скуратов
(c) компьютерная газета
Компьютерная газета. Статья была опубликована в номере 27 за 2001 год в рубрике программирование :: delphi