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

От Delphi 4 к Delphi 5 Видимость идентификаторов
Такие элементы программы, как константы, переменные, функции и процедуры, могут использоваться только в области их видимости, которая зависит от того места, в котором определены элементы.
Определение области видимости предполагает такое понятие, как блок. Он состоит из разделов объявлений и следующего за ними составного оператора:
Объявления
begin
операторы
end;
Существует понятие локальных элементов. Если константы, переменные, функции и другие элементы объявлены в головном файле программы, в функции или процедуре, то область их видимости простирается от точки объявления до конца текущего блока, включая все вложенные в него блоки.
Элементы, которые объявлены в разделе interface модуля, видимы во всех модулях, которые используют данный модуль. Такие элементы называются глобальными.
Если элемент объявлен в разделе interface модуля, то область его видимости простирается от точки объявления до конца данного модуля, а также во всех модулях, которые с помощью предложения uses используют данный модуль.
Если элемент объявлен в разделе implementation модуля, но не в блоке какой-то функции или процедуры, то область его видимости простирается от точки объявления до конца раздела implementation, включая все расположенные в этом разделе функции и процедуры.
Когда элемент объявляется в определении класса, т.е. является свойством или методом класса, то область его видимости простирается от точки объявления до конца определения класса, а также в классах-наследниках и в блоках всех методов данного класса и его наследников.
Переменные, объявленные в блоке, не только видны в нем, но и существуют только в нем. Они создаются (т.е. им отводится область памяти) только при передаче управления на данный блок и уничтожаются, когда управление покидает этот блок, поэтому в них нельзя сохранять информацию в промежутках между передачами управления в блок.
Object Pascal определяет несколько стандартных ключевых слов, называемых директивами, которые изменяют видимость элементов, объявленных внутри интерфейса класса.
Определение класса может быть разделено на произвольное количество разделов, каждый из которых начинается с одного из ключевых слов, известных как стандартные директивы:
private, protected, public и published.
Существует четыре стандартных ключевых слова-директивы, относящихся к видимости элементов интерфейса класса.
1. Раздел private (частный) используется для обозначения высшего уровня ограничения видимости элемента в определении класса.
Элементы интерфейса класса, объявленные как private, видны только в пределах модуля, в котором определяется данный класс. При этом из процедур, объявленных внутри класса, к ним можно обращаться непосредственно по имени, а из других процедур — только со ссылкой на объект данного класса. Вне этого модуля private-элементы интерфейса класса не видны и недоступны.
Однако если в одном модуле определяется несколько классов, они видят private-разделы интерфейса друг друга, как если бы те были объявлены public.
2. Раздел protected (защищенный) обозначает частично ограниченную видимость элемента в определении класса.
Элемент из раздела protected класса виден только внутри потомков этого класса.
Получить доступ к защищенному элементу из кода, не принадлежащего защищающему классу, невозможно. Иными словами, вне методов класса, объявившего элемент защищенным, этот элемент не виден.
Однако потомок может быть объявлен и реализован отдельно, и защищенные элементы предшественника будут видны внутри его методов.
3. Раздел public (публичный) обозначает полную видимость элементов.
Элементы класса, объявленные как public, видны в любой точке, в которой виден сам представитель класса.
При этом из объектов того же класса к ним можно обращаться непосредственно по имени, а из других объектов и процедур — только со ссылкой на объект данного класса.
Иными словами, если у вас есть представитель класса, видимый как целое, вам будут видны и его публичные элементы, то есть, вы всегда можете обратиться к public-элементам интерфейса класса, — как из методов этого класса, так и из кода, не относящегося к нему.
4. Раздел published (опубликованный).
Пока что вы можете считать, что published-элементы интерфейса класса — это то же самое, что и public-элементы. Впоследствии вы увидите, что они — нечто большее, чем просто public-элементы, поскольку директива published обеспечивает еще более широкий уровень доступа.
По умолчанию, если вы не задали никакой директивы, элемент в объявлении класса рассматривается как published (то есть он виден и доступен для всех, он даже более доступен, чем public-элемент).
Итак, у классового типа есть четыре возможных раздела, управляющих доступом к его полям и методам. Раздел public объявляет поля и методы, доступ к которым не ограничен — представители класса и производные классы имеют к ним доступ. В разделе protected объявляются поля и методы с некоторыми ограничениями доступа — доступ к ним имеют производные классы. Раздел private содержит поля и методы, доступ к которым сильно ограничен, так как они недоступны для представителей класса и для классов-потомков. Раздел published — почти то же, что и public, но он дает специальную информацию для инспектора объектов.
С учетом вышеизложенного синтаксис объявления класса имеет следующий вид:
type
<имя класса> = Class (<имя класса — родителя> )
public {доступно всем}
<поля, методы, свойства, события>
published {видны в инспекторе объекта и изменяемы}
<поля, свойства>
protected {доступ только потомкам}
<поля, методы, свойства, события>
private {доступ только в модуле}
<поля, методы, свойства, события>
end;
end;

Компонент Chart.

Редактирование диаграммы или графика.
1. Запустите Delphi.
2. Сохраните файл модуля под именем EditingAGraphics_.pas, а файл проекта под именем EditingAGraphics .dpr.
3. Добавьте на форму компонент Chart. Определите для него серию Pie.
4. Поместите на форму три компонента Edit для ввода числовых значений.
5. Поместите на форму компонент Button и, используя событие OnClick, напишите следующий метод обработки:
procedure TForm1.Button1Click(Sender: TObject);
var
A,B,C:Integer;
begin
with Series1 do
begin
{очистка содержимого компонента Chart обязательна, иначе старые данные будут участвовать в формировании диаграммы}
Series1. Clear;
A:=StrToInt(Edit1.Text);
B:=StrToInt(Edit2.Text);
C:=StrToInt(Edit3.Text);
Add( A, 'Класс 5А', clRed ) ;
Add( B, 'Класс 5Б', clBlue ) ;
Add( C, 'Класс 5В', clGreen ) ;
end;
end;

end.
Щелчок по кнопке приведет к созданию круговой диаграммы.
6. Поместите на форму второй компонент Chart. Определите для него серию Line.
7. Поместите на форму кнопку Button2 и запишите следующий программный код:
procedure TForm1.Button2Click(Sender: TObject);
var
I:Integer;
begin
Series2.Clear;
for I:=0 to 100 do begin
Series2.AddXY(0.02*pi*I,cos(0.02*pi*I),'',clRed);
end;
end;
Этот программный код можно включить в команду меню или просто в событие OnCreate формы.
Рассмотрим пример, позволяющий добавлять новые элементы графика в созданный график.
Запишите следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
begin
Series2.Clear;
Series2.Add( 25, '', clTeeColor );
Series2.Add( 50, '', clTeeColor );
Series2.Add( 30, '', clTeeColor );
Series2.Add( 50, '', clTeeColor );
Series2.Add( 40, '', clTeeColor );
Series2.Add( 35, '', clTeeColor );
end;
Добавление нового элемента в график типа Lines можно следующим оператором:
procedure TForm1.Button2Click(Sender: TObject);
begin
Series2.AddXY( 6, 50, 'Barcelona', clBlue );
end;

end.

Если вы будете использовать диаграмму вида Pie, то добавление нового элемента графика возможно следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
begin
Series1.Clear; {Where Series1 is your Bar series}
Series1.Add( 25, 'Barcelona', clTeeColor );
Series1.Add( 50, 'Rome', clTeeColor );
Series1.Add( 30, 'San Francisco', clTeeColor );
Series1.Add( 50, 'New York', clTeeColor );
Series1.Add( 40, 'Los Angeles', clTeeColor );
Series1.Add( 35, 'London', clTeeColor );
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Series1.Add( 33, 'Moscau', clTeeColor );
end;
end.

Рассмотрим типы диаграмм.
Line. График отражает тенденции изменения данных за равные промежутки времени. Компонент позволяет выводить точки и соединительные линии между ними.
Например:
Series1.Clear;
Series1.Add( 100, '1 ый квартал', clTeeColor );
Series1.Add( 125, '2 ой квартал', clTeeColor );
Series1.Add(110, '3 ий квартал', clTeeColor );
Свойство property LineBrush: TBrushStyle; определяет вид линии графика.
По умолчанию установлено bsSolid.
Например:
Series1.LineBrush :=bsHorizontal;
Имеются следующие виды линий: bsVertical, bsFDiagonal, bsCross и т.д.
Свойство property LinePen: TChartPen
определяет, какое перо будет использоваться для прорисовки линии, объединяющей все точки.
Например:
Series1.LinePen.Style := psDot;
Series1.LinePen.Style := psDash;
Series1.LinePen.Style := psSolid;
Свойство
property Stairs : Boolean;
позволяет соединять точки графика в виде лестницы.
Свойство
property InvertedStairs : Boolean;
позволяет инвертировать график функции по отношению к оригиналу.
Bar. Гистограмма показывает изменение данных за определенный период времени и иллюстрирует соотношение отдельных значений данных. Категории располагаются по горизонтали, а значения — по вертикали. Таким образом, уделяется большее внимание изменениям во времени.
Свойство
property BarBrush : TBrush;
определяет вид кисти, заполняющей область диаграммы.
Например
Series1.BarBrush.Style := bsFDiagonal;
Series1.BarBrush.Color := clWhite;
Series1.SeriesColor := clRed;
Свойство
property BarPen : TChartPen;
определяет вывод прямоугольной области диаграмм.
Например
Series1.BarPen.Visible:=False;
Series1.BarPen.Visible:=True;
Свойство
property BarStyle : TBarStyle;
определяет вид элементов диаграммы (прямоугольный, цилиндрический, конусный и т.д.).
Например
Series1.BarStyle := bsPyramid ;
Series1.BarStyle := bsEllipse ;
Series1.BarStyle := bsRectangle ;
Series1.BarStyle := bsArrow ;
Series1.BarStyle := bsCone ;
и т.д.
Свойство
property BarWidth : LongInt;
позволяет устанавливать размеры (ширины) области диаграммы.
Например
Series1.CustomBarWidth := Series1.BarWidth + 5 ;
Свойство
property BarWidthPercent : Integer;
определяет процент от полной используемой ширины области диаграммы. Установка BarWidthPercent: = 100 позволяет устранить промежуток между элементами диаграммы. По умолчанию установлено значение равное 70.
Например
MaxPointsPerPage : LongInt;.
Свойство
property Dark3D : Boolean;
управляет трехмерным режимом диаграммы.
По умолчанию установлено True.
Series1.Dark3D:=False;.
Свойство
property OffsetPercent : Integer;
указывает смещение области диаграммы в процентах от положения, принятого по умолчанию.
Свойство
property YOrigin : Double;
определяет значение оси Y, с которого начинается отображение диаграммы, т.е. не с нуля, как принято по умолчания, а с выбранного вами значения. Вам необходимо, конечно, знать изменения ваших данных по оси Y, чтобы не получить пустые значения.
Например
Series1.YOrigin:=50;.
Horizontal Bar. Линейчатая диаграмма отражает соотношение отдельных компонентов. Категории расположены по горизонтали, а значения — по вертикали, таким образом, уделяется большее внимание сопоставлению значений и меньшее — изменениям во времени.
Линейчатая диаграмма с накоплением показывает вклад отдельных элементов в общую сумму.
Функция
function AddY(Const AYValue: Double; Const AXLabel: String; AColor: TColor): Longint;
добавляет к диаграмме новый пункт в ее конец.
Например
Series1.AddX( 50, '4 ый квартал', clTeeColor);.
Area. Диаграмма с областями подчеркивает величину изменения в течение определенного периода времени, показывая сумму введенных значений.
Она также отображает вклад отдельных значений в общую сумму.
Свойство
property DrawArea : Boolean;
позволяет создавать диаграмму, заполняя ее определенным цветом.
Series1.DrawArea:=False;
Series1.DrawArea:=True;.
Свойство
property MultiArea : TMultiArea
определяет вид отображенной области, когда имеется больше, чем одна диаграмма с тем же самым ParentChart.
Значение по умолчанию — maNone — означает, что все области будут выведены одна позади другой. MaStacked и maStacked100 — режимы, которые выводят каждую область на вершину предыдущей области. MаStacked100 корректирует каждую точку к обычному масштабу оси 0 .. 100.
Point (scatter). Точечная диаграмма отображает взаимосвязь между числовыми значениями в нескольких рядах и представляет две группы чисел в виде одного ряда точек в координатах XY. Эта диаграмма отображает нечетные интервалы (или кластеры) данных и часто используется для представления данных научного характера.
При подготовке данных следует расположить в одной строке или столбце все значения переменной X, а соответствующие значения Y — в смежных строках или столбцах.
Pie. Круговая диаграмма показывает как абсолютную величину каждого элемента ряда данных, так и его вклад в общую сумму. На круговой диаграмме может быть представлен только один ряд данных.
Такую диаграмму рекомендуется использовать, когда необходимо подчеркнуть какой-либо значительный элемент. Для облегчения работы с маленькими долями диаграммы в основной диаграмме их можно объединить в один элемент, а затем разбить в отдельную диаграмму рядом с основной.
Свойство
property ExplodeBiggest :Integer;
позволяет выделить из диаграммы самую большую часть.
Например
Series1.ExplodeBiggest:=2;.
Функция
function AddPie(Const PieValue: Double; Const APieLabel: String; AColor: TColor) : LongInt;
позволяет добавлять новые значения секторов к компоненту.
Например
with Series1 do
begin
AddPie(40, 'Pencil', clRed) ;
AddPie(60, 'Paper', clBlue) ;
AddPie(30, 'Ribbon', clGreen) ;
end;
Shapes. Диаграмма "Форма" полезна для определения или добавления любой дополнительной информации к вашей диаграмме, возможно, во время выполнения в результате получения исключительных данных. Вы можете добавлять текст к любой форме.
Свойства
property X0 : Double;
property Y0 : Double;
property X1 : Double;
property Y1 : Double;
определяют координаты вершины и основания прямоугольной области диаграммы.
Например
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Series1.X0 := 50;
Series1.Y0 := 10;
Series1.X1 := 100
Series1.Y1 := 30;
end;
end.
Производится прорисовка эллипса с соответствующими координатами.
Свойство
property Style : TchartShapeStyle
определяет стиль диаграммы.
TChartShapeStyle = (chasRectangle, chasCircle, chasVertLine, chasHorizLine, chasTriangle, chasInvertTriangle, chasLine, chasDiamond);
Например
Series1.Style:=chasVertLine;.
Fast Line. Эта диаграмма выводит значения только в двух измерениях, но позволяет выводить очень быстро и эффективно данные большого объема из технических и финансовых прикладных программ.
Свойство
property HorizAxis : THorizAxis;
позволяет изменять положение оси.
THorizAxis = (aTopAxis,aBottomAxis);.
Например
Series1.HorizAxis := aTopAxis ;.
Изменение положения вертикальной оси осуществляется следующим образом
Series1.VertAxis := aRightAxis ;.
Свойство
property LinePen : TchartPen
позволяет изменять вид линии.
Например
Series1.LinePen.Style := psDot;.
Свойство
property SeriesColor : TColor
позволяет задавать различные цвета графикам при наличии более одного графика на компоненте, по умолчанию определено clTeeColor.
Например
Series1.SeriesColor := clBlue ;
Series2.SeriesColor := clRed ;
Arrows. Диаграмма в виде стрелок полезна для отображения начальных и конечных пунктов (точек) данных.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
x0,y0,x1,y1 : Double;
begin
Series1.StartXValues.DateTime:=False;
Series1.EndXValues.DateTime:=False;
Series1.Clear;
x0 :=Random(1000);
y0 :=Random(1000);
x1 :=x0 + Random(1000) — 500 ;
y1 :=y0 + Random(1000) — 500 ;
Series1.AddArrow(x0, y0, x1, y1, '', clBlue);
x0 :=Random( 1000 );
y0 :=Random( 1000 );
x1 :=x0 + Random(1000) — 500 ;
y1 :=y0 + Random(1000) — 500 ;
Series1.AddArrow(x0, y0, x1, y1, '', clYellow);
end;
end.
Gantt. Используйте диаграмму Gantt как область для прослеживания продвижения (прогресс) в приложении.
Gantt выводит области, которые имеют начальные и конечные значения, которые могут иметь временной формат.
Рассмотрим пример использования диаграммы Gannt.
procedure TForm1.Button1Click (Sender: TObject);
begin
Series1.AddGantt( EncodeDate( 1958, 3, 18 ), EncodeDate( 2001, 3, 18 ),0,
'Время работы телевизора' );
Series1.AddGantt( EncodeDate( 1998, 3, 31 ), EncodeDate(2001, 3, 18),1,
'время работы пылесоса');
Series1.AddGantt( EncodeDate(1971, 2, 15 ), EncodeDate(2001, 3, 18 ),2,
'Время работы холодильника');
end;

Bubble. Пузырьковая диаграмма является разновидностью точечной диаграммы.
Размер маркера данных указывает значение третьей переменной.
При подготовке данных следует расположить в одной строке или столбце все значения переменной X, а соответствующие значения Y — в смежных строках или столбцах.
procedure TForm1.BitBtn1Click(Sender: TObject);
var t:Longint;
begin
Series1.Clear;
for t:=1 to 100 do
Series1.AddBubble( t,
Random(ChartSamplesMax), { <-- значение y }
ChartSamplesMax/(20+Random(25)), { <--значение радиуса }
'', { <-- подпись значения }
GetDefaultColor(t)); { <-- цвет }

end;

end.
function AddBubble(Const AX,AY,ARadius:Double; Const AXLabel:String; AColor:TColor): Longint;
функция добавляет в конец диаграммы новое значение точку в виде пузырька. Точка имеет координаты, радиус, параметры Label и Color.

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

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



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

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