...
...

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

От Delphi 4 к Delphi 5 Область видимости идентификаторов.
Программа, которую строит Delphi в процессе проектирования пользователем приложения, основывается на модульном принципе. Головная программа состоит из объявления списка используемых модулей и операторов, которые создают объекты тех форм, которые вы определили, а также из операторов, запускающих приложение.
Принцип модульности и принцип скрытия информации позволяет внутри любого модуля производить изменения, не затрагивая головной программы и отдельных модулей.
Объекты или компоненты вы помещаете на форму, для каждой формы Delphi создает отдельный модуль для написания программного кода по управлению компонентами.
Рассмотрим структуру головной программы:
program Project1;
uses
{Здесь перечисляются модули, загружаемые программой. Первый модуль Forms системный. Форма с именем Form1 и модуль с именем Unit1 создаются пользователем. Помещаемое в скобки имя формы является комментарием}
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES} — это директива компилятора.
{Вы можете здесь помещать описания каких-то констант, переменных, функций, процедур}
begin
Application.Initialize; {инициализация приложения}
Application.CreateForm (TForm1,Form1);{создание объектов форм}
Application.Run;{выполнение приложения}
end.
Но возможно наличия модуля без формы. Именно в модулях осуществляется программирование задачи, где в обработчиках событий форм (объектов и компонентов) вы помещаете алгоритм обработки.
Головную программу лучше не перегружать дополнительным кодом. Если вам необходимо ввести настройки, которые должны осуществляться в начале приложения, то помещайте их в отдельный модуль. Причем этот модуль может быть не связан с какой-либо формой. Чтобы его создать, необходимо выполнить команду File/New и в диалоговом окне выбрать пиктограмму Unit.
Рассмотрим текст модуля с комментариями, поясняющими, куда и что в программный код можно добавлять. Текст модуля состоит из двух основных разделов interface — открытый раздел модуля, и implementation — реализация модуля.
unit Unit1;
{Открытый интерфейс модуля}
interface
{Список подключаемых модулей}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
{Объявление класса формы}
type
TForm1 = class(TForm)
procedure FormCreate(Sen-der: TObject);
private
{Private declarations}
{Закрытый раздел класса. Используется для обозначения высшего уровня ограничения видимости элемента в определении класса. Элементы интерфейса класса, объявленные здесь, видны в пределах модуля, в котором определяется данный класс. Если в одном модуле определяется несколько классов, то они "видят" privat — раздел интерфейса друг друга, как если бы были объявлены public. Здесь могут помещаться объявления переменных, функций и процедур, включаемых в класс формы, но не доступных для других модулей}
public
{Public declarations}
{Открытый раздел класса. Элементы класса, объявленные в этом разделе, видны в любой точке, в которой виден сам представитель класса (т.е. вы можете обратиться к public — элементам интерфейса класса — как из методов класса, так и из кода, не относящегося к нему. Здесь могут помещаться объявления переменных, функций и процедур, включаемых в класс формы и доступных для других модулей}
end;
{Здесь помещаются объявления типов, констант, переменных, функций и процедур, к которым возможен доступ из других модулей, но которые не включаются в класс формы}
var
Form1: TForm1;

implementation
{Раздел реализации модуля}
{$R *.DFM}
{Здесь помещаются предложения uses, объявления типов, констант, переменных, к которым не возможен доступ из других модулей. Объявленные в разделе interface функции и процедуры должны быть реализованы здесь, также возможна реализация дополнительных, не объявленных ранее функций и процедур}
Рассмотрим пример, определяющий видимость элементов программы: функции и переменных в разделе interface и implementation.
Элементы, которые объявляются в разделе interface модуля вне описания типа, видимы и доступны внутри данного модуля и из внешних модулей.
Элементы, которые объявляются в разделе implementation, видимы и доступны внутри данного модуля, но не доступны из внешних модулей.
Рассмотрим пример для данного случая.
Его основная цель состоит в следующем. Создадим приложение, которое позволит рисовать прямоугольный треугольник в созданной метрической системе координат X, Y. Вы сможете рассчитывать значения тригонометрических функций острого угла. В приложении произведем преобразования координатной области экрана в метрическую систему координат любой выбранной точки экрана (в положительной области системы координат).
А теперь немного теории.
Решение всяких треугольников, в конечном счете, сводится к решению прямоугольных треугольников. В прямоугольном же треугольнике ABC отношение двух его сторон, например, отношение катета а к гипотенузе с, всецело зависит от величины одного из острых углов, например А. Отношения различных пар сторон треугольника и называются тригонометрическими функциями его острого угла. По отношению к углу А эти функции получают следующие названия и обозначения.
Приступим к созданию приложения.
1. Запустите Delphi.
2. Сохраните файл модуля под именем Trigonometry_.pas, а файл проекта под именем Trigonometry.dpr.
3. Для решения поставленной задачи построим новую систему координат отличную от системы координат области экрана компьютера.
4. Для отображения новой системы координат используем взаимодействие с генератором графики внутри Windows, известным как GDI (Grapic Device Interface — интерфейс графического устройства). GDI — это набор подпрограмм для вывода графики и связанных с ними структур данных, которые дают возможность приложениям отображать информацию визуально. Для создания графического вывода из программы Delphi вам нужно взаимодействовать с объектом Canvas.
Программный код показан ниже.
var
Form1: TForm1;
{Функция доступна для данного модуля и других модулей}
function SCTCgX(X,Y:Real): Real;
implementation

{$R *.DFM}
uses unit2;
var
A,A11:String;
Line,A1,B1:Real; {Line — гипотенуза, A1,B1 — катеты}
V1,V2,V11,V22:Variant;
X1,X2,Y1,Y2:Integer;
F1,F2,F3,F4:Extended;
{Описанные переменные доступны только внутри данного модуля}
function SCTCgX(X,Y:Real): Real;
{функция расчета углов}
begin
Result:=X/Y;
end;
procedure TForm1.FormPaint (Sender: TObject);
var
I,J:Integer;
begin
{Ось Y новой системы координат}
Canvas.Pen.Color:=clRed;
Canvas.Pen.Width:=2;
Canvas.MoveTo(100,50);
Canvas.LineTo(100,500);
{Стрелка по координате Y}
Canvas.MoveTo(100,50);
Canvas.LineTo(106,100);
Canvas.MoveTo(94,100);
Canvas.LineTo(100,50);
{Ось X новой системы координат}
Canvas.MoveTo(100,500);
Canvas.LineTo(750,500);
{Стрелка по координате X}
Canvas.MoveTo(750,500);
Canvas.LineTo(700,494);
Canvas.MoveTo(750,500);
Canvas.LineTo(700,506);
{Линии масштаба по оси Y}
for I:=1 to 16 do begin
Canvas.MoveTo(95,500-I*25);
Canvas.LineTo(105,500-I*25);
end;
{Линии масштаба по оси X}
for J:=1 to 24 do begin
Canvas.MoveTo(100 + J*25,505);
Canvas.LineTo(100 + J*25,495);
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{нажатие левой кнопки мыши приводит к началу формирования гипотенузы}
begin
A:=IntToStr(Y);
Y1:=Y;
V1:=A;
{формулы расчета новой системы координат}
V1:=ABS(V1-600+100)/2.5;
V2:=ABS(X-100)/2.5;
X1:=X;
Edit1.Text:=IntToStr(V2);
Edit2.Text:=IntToStr(V1);
end;
procedure TForm1.FormMouseUp (Sender: TObject; Button: TMo useButton;
Shift: TShiftState; X, Y: In teger);
{отпускание левой кнопки мыши приводит к отображению гипотенузы}
begin
A11:=IntToStr(Y);
Y2:=Y;
{формулы расчета новой системы координат}
V11:=A11;
V11:=ABS(V11-600+100)/2.5;
V22:=ABS(X-100)/2.5;
X2:=X;
Edit3.Text:=IntToStr(V22);
Edit4.Text:=IntToStr(V11);
Canvas.Pen.Color:=clBlue;
Canvas.MoveTo(X1,Y1);
Canvas.LineTo(X2,Y2);
end;
procedure TForm1.Button1 Click(Sender: TObject);
begin
{Стирание нарисованной линии, обнуление текстовых редакторов}
Refresh;
Edit1.Text:='0';
Edit2.Text:='0';
Edit3.Text:='0';
Edit4.Text:='0';
Edit5.Text:='0';
Edit6.Text:='0';
Edit7.Text:='0';

end;

procedure TForm1.Button2 Click(Sender: TObject);
begin
{расчет гипотенузы}
Edit6.Text:=Edit2.Text;
Edit7.Text:=Edit3.Text;
A1:=StrToFloat(Edit7.Text);
B1:=StrToFloat(Edit6.Text);
Line:=SQRT((A1*A1)+(B1*B1));
Edit5.Text:=FloatToStr(Line);
{формирование координат букв вершин углов треугольника А и В}
Canvas.TextOut(V2+75,Y1—5,'A');
Canvas.TextOut(X2+5,Y2+5,'B');
end;

procedure TForm1.Button3 Click (Sender: TObject);
begin
{расчет значений углов}
F1:=SCTCgX(A1,Line);
Edit8.Text:=FloatToStr(F1);
F2:=SCTCgX(B1,Line);
Edit9.Text:=FloatToStr(F2);
F3:=SCTCgX(A1,B1);
Edit10.Text:=FloatToStr(F3);
F4:=SCTCgX(B1,A1);
Edit11.Text:=FloatToStr(F4);

end;

end.
В данном приложении, чтобы проверить доступность функции function SCTCgX(X,Y:Real):Real;, из других модулей добавим в приложение вторую форму и соответствующий код для первого и второго модуля.
procedure TForm1.Button4 Click (Sender: TObject);
begin
Form2.Show;
end;
var
Form2: TForm2;
implementation
uses VievEl_;
{$R *.DFM}
procedure TForm2.Button1 Click (Sender: TObject);
var
A:Real;
begin
A:=SCTCgX(3,4);
Edit1.Text:=FloatToStr(A);
end;
end.
Таким образом, можно убедиться, что функция используется успешно и во втором модуле.

Компонент Chart.
Он расположен на странице Additional палитры компонентов. С его помощью возможно построение различных графиков и диаграмм.
Поместите на форму компонент Chart. Произведите по нему двойной щелчок. Откроется редактор диаграмм на странице Chart. Эта страница имеет несколько закладок. Используя закладку Series, произведите щелчок по кнопке Add для добавления серии. Откроется диалоговое окно, в котором вы можете выбрать необходимую диаграмму или график. Выберите диаграмму Pie, которая представляет собой круговую диаграмму.
Вызов редактора Edit Chart возможен также с помощью вспомогательного меню, вызываемого щелчком правой кнопки мыши на компоненте Chart. Чтобы отобразить данные в компоненте, необходимо создать, как минимум, одну серию — для этого следует в окне редактора нажать кнопку Add и выбрать подходящий тип графика. После закрытия редактора компонент будет содержать примерный вид графика. Конечно, его реальный вид зависит от фактических данных, которые создаются в программе и добавляются к серии с помощью методов AddX, AddY, AddXY объекта TChartSeries (получить доступ к нужной серии можно с помощью индексированного свойства SeriesList — первая созданная серия имеет индекс 0, вторая 1 и т.д.).
Редактор диаграмм предназначен для того, чтобы помочь вам быстро создавать и изменять вид диаграммы. Редактор может вызываться во время выполнения программы, с использованием метода EditChart.
Имеется два основных раздела редактора диаграммы: страница Chart и страница Series.
Используя страницу Series, вы можете добавлять различные типы диаграмм.
Используя страницу General (общие), вы можете изменять масштаб изображения, готовить график к печати, предварительно просмотрев его. Возможен экспорт в различные файлы.
Страница Axis (оси) дает возможность производить надписи осей и т.д.
Страница Titles определяет заголовок диаграммы и нижний колонтитул.
Страница Legend определяет список обозначений диаграммы или вообще позволяет убрать его.
Страница Panel определяет цветовую гамму тыловой части диаграммы.
Страницы Pages определяет число точек на странице диаграмм.
Страница Walls (стенки) определяет цветовую гамму и размер стенок диаграммы.
Страница 3D дает возможность изменить внешний вид диаграммы: наклон, сдвиг и т.д.
Рассмотрим свойства компонента Chart.
Свойство AllowPanning (возможность прокручивания), для сформированного вами графика, имеется возможность прокручивать его часть во время выполнения с помощью нажатия правой кнопки мыши. Справа от имени свойства в окне имеются значения:
PmBoth позволяет производить прокрутку в обоих направлениях;
PmHorizontal позволяет производить прокрутку только в горизонтальном направлении;
PmNone запрещает прокрутку;
PmVertical позволяет производить прокрутку только в вертикальном направлении.
Свойство AllowZoom дает возможность изменять во время выполнения масштаб изображения с помощью выделения фрагментов курсором мыши.
Свойство Title определяет заголовок диаграммы. Двойной щелчок по кнопке с тремя точками открывает диалоговое окно, позволяющее изменять заголовок диаграммы или графика.
Здесь вы можете выбрать размер шрифта, его цвет, задать цвет фона, его окантовку.
Свойство Foot определяет подпись под диаграммой. Текст подписи можно осуществить через свойство Text. Для этого в диалоговом окне произведите переключение Title на Foot. Здесь вы также можете изменить размер и цвет шрифта, другие атрибуты.
Свойство Frame определяет рамку вокруг диаграммы.
Свойство Legend представляет собой список обозначений на диаграмме или графике.
Свойства MarginLeft, MarginRight, MarginTop, MarginBottom определяют значения левого, правого, верхнего и нижнего полей компонента Chart.
Свойства BottomAxis, LeftAxis, RightAxis определяют характеристики соответственно верхней, левой и правой осей. Задание этих свойств имеет смысл для графиков и некоторых типов диаграмм.
Свойства LeftWall, BottomWall, BackWall определяют характеристики соответственно левой, нижней и задней грани области трехмерного отображения графика.
Свойство SeriesList определяет список данных, отображаемых в компоненте.
Свойство View3D разрешает или запрещает трехмерное отображение диаграммы.
Свойство View3Doptions определяет характеристики трехмерного отображения.
Свойство Chart3DPercent определяет масштаб трехмерного отображения, например толщину диаграммы и ширину лент графика.
Рассмотрим пример отображения графика.
1. Запустите Delphi.
2. Поместите на форму компонент Chart. Двойным щелчком по компоненту откройте редактор. Используя страницу Series, а на ней кнопку Add, добавьте график под именем Bar или любой другой подходящий под ваши данные.
3. Используя событие OnActivate, запишите следующий программный код:
procedure TForm1.FormActivate(Sender: TObject);
var
K:Integer;
begin
for K:=0 to 20 do
Chart1.SeriesList[0].AddXY(K,sin(K*pi/10),'',clRed);
end;
Вы получите график функции Sin(X), который можно исследовать.
Рассмотрим еще один пример.
Добавьте на форму кнопку Button, компонент Chart. Двойным щелчком по компоненту откройте редактор. Используя страницу Series, а на ней кнопку Add, добавьте график под именем Pie. Напишите следующий программный код:
procedure TForm1.Button1 Click(Sender: TObject);
begin
with Series1 do
begin
Add(40, 'Pencil', clRed);
Add(60, 'Paper', clBlue);
Add(30, 'Ribbon', clGreen);
end;
end;

end.
В результате работы программы появится круговая диаграмма.

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


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

полезные ссылки
IP камеры видеонаблюдения