Автор работы: Пользователь скрыл имя, 30 Апреля 2015 в 18:39, курсовая работа
Основные цели данного курсового проекта:
1. Разработать АИС по автосалону.
2. Закрепить знания программирования в среде Delphi.
3. Познакомится со всеми этапами создания готового продукта.
Результат проекта – готовый продукт (программа), которую в дальнейшем можно использовать в магазинах специализированных на продаже автомобилей.
ВВЕДЕНИЕ 3
ГЛАВА 1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 4
ГЛАВА 2. ПРАКТИЧЕСКАЯ ЧАСТЬ 20
2.1 Описание внешнего вида пользовательского интерфейса 20
2.2 Форма fDM 21
2.3 Описание программного кода 24
ЗАКЛЮЧЕНИЕ 33
ЛИТЕРАТУРА 34
Во время верификации код проверяется на доступ к разрешенной памяти и вызов только правильно определенных методов. Например, не допускается обращение к полям, которые выходят за отведенные им границы. Дополнительно верификация проверяет правильность генерации машинного кода. Процесс верификации открывает доступ к правильно определенному надежному коду. Если встретился ненадежный код, возбуждается исключение.
CLR обеспечивает инфраструктуру, которая позволяет управлять процессом исполнения машинного кода, а также предоставляет различные службы, которые могут быть использованы во время исполнения. Перед вызовом метода он должен быть скомпилирован в машинные инструкции. Каждый метод, для которого есть CIL-код, должен вначале с помощью JIT-компилятора генерироваться в машинный и затем выполняться. Каждый следующий раз компилятор не вызывается, но используется созданный им код. Этот процесс повторяется до конца прогона.
Во время выполнения управляемый код получает дополнительное обслуживание, такое как сборка мусора, повышенная защита, взаимодействие с неуправляемым кодом, поддержка межъязыковой отладки , улучшение распространения программ и версионного контроля.
Автоматическое управление памятью есть один из сервисов, которые CLR обеспечивает во время управляемого исполнения. Сборка мусора управляет распределением и освобождением памяти. Это избавляет разработчика от необходимости писать соответствующий код. Автоматическое управление памятью решает типичные проблемы, такие как утечка памяти или попытка освободить уже уничтоженный объект.
Когда инициируется новый процесс, для него резервируется непрерывное адресное пространство, называемое управляемой кучей. Управляемая куча поддерживает указатель на следующий распределяемый в памяти объект. Первоначально он указывает на базовый адрес управляемой кучи. Все типы указателей распределяются в управляемой кучи. Когда создается первый указатель, память для ассоциированного с ним типа начинается с базового адреса кучи. При создании следующего указателя, память выделяется непосредственно за первым. Пока адресное пространство доступно, процесс продолжается описанным образом.
Распределение в управляемой куче идет быстрее, чем в неуправляемой. CLR просто наращивает значение указателя кучи, что почти также быстро, как при заталкивании данных в стек. Кроме того, так как новые объекты распределяются в памяти последовательно, приложение обращается к ним быстрее.
Оптимизирующая машина сборщика мусора определяет наилучшее время для удаления мусора. В процессе очистки он удаляет из памяти объекты, которые более не используются приложением. Для этого он исследует корни приложений. Каждое приложение имеет набор корней. Каждый корень либо ссылается на объект в управляемой куче, либо содержит NIL. Корни включают указатели на глобальные и статические объекты, локальные переменные и ссылки на объектные параметры в стеке потока и регистрах процессора. Мусорщик имеет доступ к списку активных корней, которые управляются компилятором времени исполнения и CLR. Используя этот список, он проверяет корни и строит граф, который содержит все объекты, которые порождены от корня.
Объекты, которые не содержит граф, не порождены от корней приложения. Мусорщик удаляет эти объекты из памяти. При этом он оптимизирует состояние управляемой кучи и нужным образом корректирует указатели.
Знакомство с DELPHI 8
Ограниченная поддержка технологии .NET была реализована еще в предыдущей версии Delphi 7 Studio. Однако в этой версии .NET могла и не использоваться. Версия Delphi 8, напротив, не может не использовать эту технологию. Для совместимости с предыдущими версиями в ней используются пространства имен Borland.VCL.XXXX, позволяющие ценой небольших изменений исходного кода в версии 8 компилировать и исполнять программы, написанные в предыдущих версиях. Однако, такая совместимость - мнимая, так как компилятор новой версии порождает инструкции языка СIL, которые могут исполняться только под управлением CLR.
В этом разделе кратко рассматриваются новые возможности Delphi, связанные с переходом на новую технологию .NET.
Для того, чтобы Delphi соответствовал требованиям к языкам, вырабатывающим CIL, была проведена его модификация. В ходе модификации из языка убраны средства, которые не поддерживаются CLR, и добавлены новые.
Это, пожалуй, самая болезненная проблема для совместимости с ранними версиями.
Прежде всего, речь идет об указателях. Указатели считаются небезопасным типом,
так как код, содержащий указатели, нельзя
проверить на безопасность. Запрещена
любая арифметика указателей, а также
обращение к функциям и процедурам New,
Dispose, GetMem, FreeMem и ReallocMem. Вместо концепции
указателей программы должны использовать
два класса из CTS: IntPtr и Marshal. Первый - суть
универсальный платформеннонезависимый
указатель, открывающий доступ к механизму
межплатформенного взаимодействия P/Invoke.
Второй осуществляет маршализацию данн
В следующем примере создается и используется указатель для размещения в нем целого числа.
uses System.Runtime.
var
X: IntPtr;
begin
X := Marshal.AllocHGlobal(SizeOf(
try
Marshal.WriteInt32(X, 123456); // Наполняем его
Caption := IntToStr(Marshal.ReadInt32(X) * 2); // Используем
finally
X.Free;
end
end;
Запрещены типизированные и нет
procedure TForm3.Button1Click(Sender: TObject);
var
A: Real;
k: Integer;
F: TFileStream;
begin
F := TFileStream.Create('data.dat', fmCreate);
try
for k := 1 to 5 do
begin
A := Random;
F.Write(A, SizeOf(Real));
end;
finally
F.Free
end
end;
Записи не могут содержать вариантную часть, но могут - методы (см. ниже).
В .NET Framework используются "широкие" символы (2 байта на символ). В связи с этим небезопасным считается тип PChar, который используется как ссылка на массив однобайтных символов. В то же время формат типов String в Delphi и CTS совпадает.
Поскольку тип PChar в программах Delphi используется, в основном, при обращении в функциям API, вместо PChar следует использовать класс StingBuilder. Следующая программа прочитает заголовок активного окна:
function GetText(Window: HWND;
BufSize: Integer = 1024): String;
var
Buffer: StringBuilder;
begin
Buffer := StringBuilder.Create(BufSize);
GetWindowText(Window, Buffer, Buffer.Capacity);
Result := Buffer.ToString;
end;
Компилятор Delphi отныне не поддерживает встроенный ассемблер и директивы asm.
Запрещено использовать функции прямого доступа к памяти, такие как BlockRead, BlockWrite, GetMem, FreeMem, ReallocMem, а также директиву absolute и функцию addr. Поддерживается операция @ (получение адреса).
Как уже отмечалось, записи не могут иметь вариантных частей, но могут - процедуры и функции. Это в какой-то степени сближает их с классами. Вот пример объявления:
type
MyRec = record
a: Integer;
procedure aProc;
end;
procedure MyRec.aProc;
begin
end;
Несмотря на похожесть, записи, конечно, не классы - в них нет механизмов наследования и полиморфизма.
.NET позволяет интегрировать в единое целое код, написанный на разных языках, в которых используются, в общем случае, разные ключевые слова. Как быть, если в CTS определен класс, совпадающий с ключевым словом? В Delphi для этого можно использовать стандартный прием - составное имя. Например:
var
T: System.Type;
Однако "путь" к классу может быть достаточно длинным, и составное имя окажется громоздким. В этом случае Delphi разрешает перед именем класса ставить символ "&" (амперсанд):
var
T: &Type;
Встретив такое описание, компилятор станет просматривать список доступных модулей в поисках типа Type и найдет его в модуле System.
Существенным изменениям подверглось объявление класса. Дело в том, что Delphi и CLR по-разному трактуют области видимости секций private и protected: в Delphi члены, объявленные в этих секциях, видны всюду в пределах данного модуля. В CLR секция private объявляет члены, доступные только внутри методов класса, а секция protected - члены, доступные потомкам класса. В связи с этим, в Delphi перед названиями секций следует ставить спецификатор class - в этом случае области видимости в Delphi и CLR совпадут:
type
MyClass = class
class private
a: Integer; // Поле видно только в методах класса MyClass
class protected
b: Boolean; // Поле видно только потомкам класса и
//самому классу
end;
Классы можно лишить потомков, а виртуальный метод - возможности перекрытия. Для этого объявление класса сопровождается директивой sealed, а объявление метода - директивой final:
type
NoInst = class
public
procedure NoOverride; dynamic; final;
end sealed; // Класс не может иметь потомков
Приведенный выше пример лишь иллюстрирует синтаксис объявлений и по существу бессмыслен: если класс не имеет потомков, то ни один его метод не может быть перекрыт. Замечу, что следующее объявление ошибочно:
procedure NoOverride; final;
Можно лишить возможности перекрывать
только виртуальные методы, то есть объявленные
с директивами dynamic, virtual и
В данном случае оформление программы производилось добавлением основных элементов как DbGrid, ComboBox и т.д., а присвоение их значение производилось в самом коде.
Рисунок 1. Главная форма
Рисунок 2. Окно добавления авто
Рисунок 3. Окно добавления клиента
Создал модуль данных командой File -> New -> Data Module. В окне инспектора объектов в свойствах формы для свойства Name установил - fDM.
На форму fDM поместил компонент ADOConnection с вкладки ADO. Нажал дважды по компоненту, открылось окно, показанное на рисунке.
Рисунок 4. Подключение базы данных
Нажал кнопку Build, открылось окно:
Рисунок 5. Выбор базы данных
Нажал на кнопку с троеточиями и выбрал свою базу данных, проверил соединение и нажал кнопку ОК для подтверждения.
Для свойства LoginPromt компонента ADOConnection установил значение False.
На форму fDM поместил первый компонент ADOTable с вкладки ADO.
В свойстве Connection установил связь - ADOConnection1, для свойства Name установил значение – TableCartoteka и для свойства TableName выбрал таблицу «Картотека домашней библиотеки».
На форму fDM поместил первый компонент DataSource с вкладки DataAccess. Для свойства DataSet установил значение TableCartoteka и для свойства Name - DSCartoteka.
На форму fDM поместил второй компонент ADOTable с вкладки ADO.
В свойстве Connection установил связь - ADOConnection1, для свойства Name установил значение – TableGenres и для свойства TableName выбрал таблицу «Жанры».
На форму fDM второй первый компонент DataSource с вкладки DataAccess. Для свойства DataSet установил значение TableGenres и для свойства Name – DSGenres.
Выделил две таблицы и в свойстве Active установил значение True.
В результате форма примет следующий вид:
Рисунок 6. Модуль данных
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables, StdCtrls, Mask,
ComCtrls, Menus, DateUtils, jpeg;
type
TForm1 = class(TForm)
Edit2: TEdit;
Edit3: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
DBGrid2: TDBGrid;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
DBGrid3: TDBGrid;