Концепция данных в языке Pascal. Реализация Delphi

Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 18:52, курсовая работа

Описание работы

Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а Delphi — объектно-ориентированный язык программирования с возможностью доступа к метаданным классов. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Мы будем рассматривать концепцию данных на основе среды версии Delphi 5. Delphi 5 имеет высокую производительность для развития Интернет. Представлено множество новых функций и усовершенствований. Некоторые из них, среди многих других, являются: различные макеты рабочего стола, концепция кадров, параллельное развитие, перевод возможности, более интегрированный отладчик, новые возможности Интернет (XML), базы данных ADO.

Файлы: 1 файл

курсовая.doc

— 903.50 Кб (Скачать файл)

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

Пример:

var k:^integer;// указали, что будет указывать на тип integer, но пока не куда не указывает

begin

new(k);// Выделили память под указатель,  т.е. теперь "к" имеет адрес ячейки в которой содержится число типа integer;

k^:=2;// Это операция разыменования указателя, теперь число на которое указывает k будет равным 2;

WriteLn(IntToStr(k^));

dispose(k);// Освободили память из под указателя

ReadLn;

end.

(приложение 13)

 

  1. ПРОЦЕДУРНЫЕ ТИПЫ

Процедурные типы позволяют интерпретировать процедуры и функции как обычные простые значения, которые, например, можно присваивать переменным или передавать в качестве параметров.

Описание процедурного типа похоже на заголовок процедуры или функции, в котором отсутствует имя подпрограммы. В процедурном типе разрешается использовать методы (подпрограммы, объявленные в классах), для методов при их описании указываются слова of object.

Например описание типа TNotifyEvent, который представляет собой тип обработчика многих событий Delphi, например, Оnclick или OnChange.

type TNotifyEvent = procedure (Sender: TObject) of object;

Процедурный тип используется, например, для назначения обработчиков событий, в том числе, в окне Инспектора объектов.

Так, в приводимой ниже строке кода событию Onclick кнопки Buttoni в качестве обработчика назначается процедура Buttoniciick.

Buttoni.OnClick := ButtonlClick;

Эта процедура должна быть предварительно создана и иметь тип, совпадающий с типом TNotifyEvent события OnClick.

 

  1. ВАРИАНТНЫЙ ТИП

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

Для описания переменной вариантного типа служит ключевое слово 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 присваивается вещественное значение.

Для вариантной переменной определены два специфических значения, во многом похожие друг на друга:

  • Unssigned - назначается переменной при ее описании и указывает, что значение переменной пока не присвоено и не определено;
  • Null - указывает, что переменная содержит значение неопределенного типа или что значение было потеряно.

Вариантную переменную можно интерпретировать так же, как массив значений (вариантный массив). При этом нельзя назначить обычный статический массив вариантной переменной. Вместо этого следует создать массив 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, который означает, что типы данных могут передаваться между программами в сети без заботы о том, знают ли на другой стороне, как управлять ими.

 

  1. КЛАССЫ

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

Классы — это особое «изобретение» программистов для  упрощения разработки сложных программ и улучшения их качества. В основе классов лежат три фундаментальных принципа: инкапсуляция, наследование и полиморфизм.

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

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

Объявление класса

Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (опубликованные), private (закрытые), protected (защищенные) и public (открытые). Внутри каждой секции вначале определяются поля, а затем — методы и свойства.

В предыдущих версиях Delphi в объявлении класса могла использоваться секция automated, в которой собирались члены для поддержки технологии OLE Automation. В Delphi 2005 секция automated не используется.

Секции определяют области  видимости элементов описания класса. Секция public не накладывает ограничений  на область видимости перечисляемых  в ней полей, методов и свойств  — их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (то есть в окне инспектора объектов). Секция published используется только при разработке нестандартных компонентов. Замечу, что среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу после заголовка класса и продолжается до первой объявленной секции. Эта секция — published. Программисту не следует помещать в нее собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: закрытые элементы описания доступны только внутри методов данного класса и в подпрограммах, находящихся в том же модуле, в котором описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам, независимо от того, находятся они в том же модуле или нет.

В 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 характеризуется разветвленной структурой типов данных. В языке предусмотрен механизм создания новых типов, благодаря чему общее количество используемых в программе типов может быть сколь угодно большим.

 

 

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Архангельский А. Я. Программирование в Delphi 7. – Москва: БИНОМ, 2005. – 1152 с.
  2. Фаронов В. В. Delphi 2005 : язык, среда, разработка приложений. – Санкт-Петербург : ПИТЕР, 2005. – 560 с.
  3. Под общ. редакцией А. Д. Хомоненко. Delphi 7. – СПб. : БХВ – Петербург, 2004. – 1216 с.
  4. Эмбер М. Delphi 5:руководство разработчика. – Киев : BHV : Ирина, 2000. – 480 с.
  5. Паченко К.Б . Delphi 5:руководство разработчика. – Москва : Санкт – Петербург : Киев : Вильямс, 2001
  6. Культин Н. Б. Основы программирования в Delphi 7. – Санкт – Петербург : BHV – Санкт – Петербург, 2004. – 608 с.
  7. Тюкачёв Н. А. Программирование в Delphi для начинающих : учебное пособие для студентов вузов. – Санкт – Петербург : BHV – Санкт – Петербург, 2007. – 672 с.
  8. Жуков А. Изучаем Delphi. – Санкт – Петербург : ПИТЕР, 2001. – 352 с.

Информация о работе Концепция данных в языке Pascal. Реализация Delphi