Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 18:52, курсовая работа
Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а Delphi — объектно-ориентированный язык программирования с возможностью доступа к метаданным классов. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Мы будем рассматривать концепцию данных на основе среды версии Delphi 5. Delphi 5 имеет высокую производительность для развития Интернет. Представлено множество новых функций и усовершенствований. Некоторые из них, среди многих других, являются: различные макеты рабочего стола, концепция кадров, параллельное развитие, перевод возможности, более интегрированный отладчик, новые возможности Интернет (XML), базы данных ADO.
Как уже говорилось, значениями указателей являются адреса переменных в памяти, поэтому следовало бы ожидать, что значение одного указателя можно передавать другому. На самом деле это не совсем так. В Object Pascal можно передавать значения только между указателями, связанными с одним и тем же типом данных.
Пример:
var k:^integer;// указали, что будет указывать на тип integer, но пока не куда не указывает
begin
new(k);//
Выделили память под указатель,
k^:=2;// Это операция разыменования указателя, теперь число на которое указывает k будет равным 2;
WriteLn(IntToStr(k^));
dispose(k);// Освободили память из под указателя
ReadLn;
end.
(приложение 13)
Процедурные типы позволяют интерпретировать процедуры и функции как обычные простые значения, которые, например, можно присваивать переменным или передавать в качестве параметров.
Описание процедурного типа похоже на заголовок процедуры или функции, в котором отсутствует имя подпрограммы. В процедурном типе разрешается использовать методы (подпрограммы, объявленные в классах), для методов при их описании указываются слова of object.
Например описание типа TNotifyEvent, который представляет собой тип обработчика многих событий Delphi, например, Оnclick или OnChange.
type TNotifyEvent = procedure (Sender: TObject) of object;
Процедурный тип используется, например, для назначения обработчиков событий, в том числе, в окне Инспектора объектов.
Так, в приводимой ниже строке кода событию Onclick кнопки Buttoni в качестве обработчика назначается процедура Buttoniciick.
Buttoni.OnClick := ButtonlClick;
Эта процедура должна быть предварительно создана и иметь тип, совпадающий с типом TNotifyEvent события OnClick.
Вариантные типы используются для представления значений, которые могут интерпретироваться различными способами. Переменная вариантного типа может содержать значения различных типов и обычно применяется в случаях, когда тип ее значения при компиляции неизвестен или может изменяться в процессе выполнения программы.
Для описания переменной вариантного типа служит ключевое слово variant. Такой переменной можно присваивать значения целочисленных (кроме int64), вещественных, символьных, строковых и логических типов. Все эти типы считаются совместимыми с типом variant, и в случае необходимости компилятор выполняет операцию преобразования типа автоматически.
Пример использования вариантного типа:
var
v1, v2: Variant;
k: integer;
x: real;
begin
k :=10;
v1 :=k;
writeln('v1=' ,v1);
x :=23.17;
v2 :=x;
writeln('v2=' ,v2);
v1 :=x+0.5;
Writeln('v1=' ,v1 ,' ','v2=' , v2);
readln;
end.
(приложение 14)
Здесь вариантной переменной v1 первоначально присваивается целое значение, переменной v2 - вещественное значение. Затем переменной v1 присваивается вещественное значение.
Для вариантной переменной определены два специфических значения, во многом похожие друг на друга:
Вариантную переменную можно интерпретировать так же, как массив значений (вариантный массив). При этом нельзя назначить обычный статический массив вариантной переменной. Вместо этого следует создать массив Variant с помощью одной из двух стандартных функций VarArrayCreate или VarArrayOf.
Например:
var X: Variant;
begin
x:=VarArrayCreate([0, 2], varVariant);
x[0] := 1;
x[1] := 'Good luck';
x[2]:= True;
x[3]:= VarArrayOf([1, 10, 50, 200]);
WriteLn(X[1]); { Good luck }
WriteLn (X[3] [1]); { 10 }
Первая из инструкций в блоке begin создаст вариантный массив (длиной 3) вариантных элементов и назначает его вариантной переменной х. Второй параметр в вызове функции VarArrayCreate определяет базовый тип элеметов массива (в примере вариантный). При вызове стандартной функции VarArrayOf создаётся вариантный массив (из четырех элементов) с набором целочисленных значений, который с помощью инструкции присваивания назначается третьему - элементу вариантного массива х.
Для работы с массивом variant, число элементов которого заранее неизвестно, предназначены следующие функции:
VarlsArray (const V: Variant) : Boolean — проверяет, является ли параметр v массивом типа Variant;
VarArrayLowBound (const A: Variant; Dim: Integer): Integer — возвращает нижнюю границу массива, заданного параметром А, параметр Dim определяет размерность массива;
VarArrayHighBound (const A: Variant; Dim: Integer): Integer — возвращает верхнюю границу массива, заданного параметром А, параметр Dim определяет размерность массива.
Наряду с типом Variant имеется также тип OleVariant; главное различие между ними состоит в следующем. Тип variant содержит только доступные для обработки в текущем приложении типы данных. Тип OleVariant может содержать типы данных, определенные как совместимые с стандартом OLE Automation, который означает, что типы данных могут передаваться между программами в сети без заботы о том, знают ли на другой стороне, как управлять ими.
Классами в Delphi называются специальные типы, которые содержат поля, методы и свойства. Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называются объектами. Важным отличием классов от других типов является то, что объекты класса всегда распределяются в куче, поэтому объект-переменная фактически представляет собой лишь указатель на динамическую область памяти.
Классы — это особое
«изобретение» программистов
Класс — это тип данных, определяемый пользователем. То, что в Delphi имеется множество предопределенных классов не противоречит этому определению — ведь разработчики Delphi тоже пользователи Object Pascal.
Класс должен быть объявлен до того, как будет объявлена хотя бы одна переменная этого класса. Т.е. класс не может объявляться внутри объявления переменной. Класс должен объявляться с областью видимости программа или модуль. Модель классов в Delphi схожа с моделями классов других языков программирования, поэтому рассмотрим лишь основные отличительные особенности.
Объявление класса
Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (опубликованные), private (закрытые), protected (защищенные) и public (открытые). Внутри каждой секции вначале определяются поля, а затем — методы и свойства.
В предыдущих версиях Delphi в объявлении класса могла использоваться секция automated, в которой собирались члены для поддержки технологии OLE Automation. В Delphi 2005 секция automated не используется.
Секции определяют области
видимости элементов описания класса.
Секция public не накладывает ограничений
на область видимости
В Delphi разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой.
Следующий фрагмент кода поясняет различные области видимости:
Unit Unit1;
Interface
uses Controls, Forms;
type
TForml = class(TForm)
Buttonl: TButton; // Эта секция обслуживается Delphi
// Ее элементы доступны всем
private // Эта секция доступна в модуле Unitl
FIntField: Integer;
procedure SetValue(Value: Integer);
function GetValue: Integer;
published // Эта секция доступна в любом модуле
property IntField: read GetValue write SetValue;
protected // Эта секция доступна классам-потомкам
procedure Proc 1;
public // Эта секция доступна в любом модуле
procedure Ргос 2;
end;
var
Forml: TForml;
Implementation
procedure TForml.Procl;
Buttonl.Color := clBtnFace; // Так можно
FIntField := 0; // Так можно
IntField := 0; // Так можно
Procl; // Так можно
Ргос2; // Так можно
end;
begin
Forml.Buttonl.Color : = clBtnFace; // Так можно
Forml.FIntField := 0; // Так можно
Forml.IntField := 0; // Так можно
Forml.Proc1; // Так нельзя!
Forml.Proc2; // Так можно
end.
Unit Unit2;
Interface
uses Controls, Unitl;
type
TForm 2 = class(TForm 1)
Button 2: TButton;
procedure Button2Click(Sender: TObject);
end;
var
Form2: TForm2;
Implementation
procedure TForm2.Button2Click(Sender: TObject);
begin
Buttonl.Color := clBtnFace; // Так можно
FIntField := 0; // Так нельзя!
IntField := 0; // Так можно
Proc 1; // Так можно
Proc 2; // Так можно
end;
begin
Forml.Buttonl.Color := clBtnFace; // Так можно
Forml.FIntField := 0; // Так нельзя!
Forml.IntField := 0; // Так можно
Forml.Proc 1; // Так нельзя!
Forml.Proc 2; // Так можно
end.
При объявлении класса - потомка разрешается перемещать элементы класса из одной области видимости в другую. Для предыдущего примера допустимо такое объявление:
type
TForm2 = class(TForm l)
public
procedure Proc 1;
end;
После этого в модуле Unit2 возможно следующее обращение: Form 2.Proc 1;
После перемещения в секцию private элемент объявления становится невидим потомкам (если потомок, как это обычно бывает, объявляется в другом модуле), и, следовательно, его уже нельзя переместить в другую секцию. Класс может объявляться только в интерфейсной области модуля или в самом начале области реализации. Нельзя определять классы в разделе описаний подпрограмм.
Пример:
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Font.Style:=[fsItalic, fsBold];
Form1.Font.Size:=20;
Form1.Font.Name:='Arial';
Form1.Caption:='Пример';
end;
end.
(приложение 15)
Приведение типов классов
Любой тип - класс относится к так называемым типам с информацией RTTI (RunTime Type Information — информация о типе во время исполнения). Экземпляры таких типов компилятор снабжает дополнительной информацией, позволяющей, в частности, на этапе прогона программы проверить принадлежность экземпляра нужному классу и осуществить его приведение. Для этого используются операторы is и as:
if (AOblect is TMyClass) then
(AObject as TMyClass).IntData := 12345;
Изменения в модели классов Delphi 2005
Для согласования с CLR разработчики Delphi 2005 внесли некоторые изменения в описанную модель классов.
Области видимости strict
CLR трактует области видимости секций private и protected не так, как было описано выше в «Объявление класса»: члены private доступны только внутри класса, а в секции protected — внутри класса и его потомков. Напомню, что в описанной модели эти члены видны также внутри модуля с описанием класса. Для согласования областей видимости введено зарезервированное слово strict (строгий), которое должно предварять объявление секции, например:
unit MyUnit;
uses …;
type
MyClass = class(TObject)
strict private
A: Integer; // Поле доступно только внутри класса
end; // MyClass
…
procedure MyProc; // Это не член класса MyClass!
begin
А := 0 // Ошибка! Процедура не видит поля А
end;
end. // Unit MyUnit
ЗАКЛЮЧЕНИЕ
В данной работе была изучена концепция данных в языке программирования Pascal. Реализация была выполнена в Delphi. В ходе работы было показано,что типы в Pascal играют огромную роль. Связано это с тем, что лежащий в основе Delphi язык Pascal был специально придуман как средство обучения программированию. Поскольку начинающий пользователь легко может допустить ошибку или неточно описать свои действия, компилятор Pascal должен был иметь средства контроля действий подьзователя, чтобы вовремя предостеречь его от последствий неверных действий. Первоначально типы как раз и предназначались для того, чтобы программист явно указывал компилятору, какого размера память нужна ему в программе и что он собирается делать с этой памятью.
Любые данные, т.е. константы, переменные, свойства, значения функций или выражения характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему. Практика применения типов показала их высокую эффективность для защиты программы от случайных ошибок, так что практически во всех современных языках программирования в той или иной степени реализован механизм типов.
В вышеописанной работе показано, что язык Pascal характеризуется разветвленной структурой типов данных. В языке предусмотрен механизм создания новых типов, благодаря чему общее количество используемых в программе типов может быть сколь угодно большим.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Информация о работе Концепция данных в языке Pascal. Реализация Delphi