- •1.Тип данных “класс”. Объекты и классы.
- •Классы и объекты, понятие экземпляра класса, понятие членов класса
- •Виды классов
- •Классы в языке Object Pascal (среда Delphi)
- •2.Методы класса
- •3.Свойства класса и поля. Отличие свойства класса от полей записи.
- •4. Конструктор и деструктор класса.
- •Назначение конструктора
- •Виды конструкторов
- •Конструктор по умолчанию
- •Конструктор копирования
- •Конструктор преобразования
- •Виртуальный конструктор
- •Деструктор в Delphi
- •5.Использование разделов класса public, protected, published.
- •6. Использование наследования при создании класса.
- •Простое наследование
- •Множественное наследование
- •Delphi (Object Pascal)
- •7. Определение инкапсуляции.
- •8. Определение полиморфизма.
- •Примеры
- •В объектно-ориентированных языках
- •9. Динамическое создание объектов на форме с помощью классов.
- •10-13. Классы
- •14-16 StringGrid.
- •17. Процедуры работы с памятью. Приведите примеры.
- •18. Особенности работы процедур GetMem, BlockRead, функция FileSize .
- •19. Особенности работы процедуры new
- •20. Особенности работы процедуры FreeMem.
- •21. Стек. Локальные переменные и стек. Параметры процедуры и стек.
- •22. Списки. Динамическое создание очереди. Приведите примеры.
- •23. Компоненты работы с базами данных Table, Query, dbGrid, DataSource.
- •25. Занесение информации из базы данных в StringGrid.
- •Interface
- •Implementation
- •Implementation
- •26. Иерархические структуры. Деревья.
- •27. Использование компоненты TeeView для построения деревьев.
- •28. Рекурсия. Рекурсивные функции и процедуры. Рекурсия в программировании Функции
- •29. Выдача сообщений и отладка
- •Место отладки в цикле разработки программы
- •Инструменты
- •Инструменты, снижающие потребность в отладке
- •Оператор try...OnException..._try
- •31. Типы файлов. Операторы последовательного метода доступа.
- •32. Особенности обработки текстовых файлов.
- •33. Особенности работы с файлами с помощью прямого метода доступа.(!хз!)
- •34. Организуется диалогового поиска файлов. Компонента OpenDialog.
Примеры
Класс геометрических фигур (эллипс, многоугольник) может иметь методы для геометрических трансформаций (смещение, поворот, масштабирование).
Класс потоков имеет методы для последовательной передачи данных. Потоком может быть информация, вводимая пользователем с терминала, обмен данными по компьютерной сети, файл (если требуется последовательная обработка данных, например, при разборе исходных текстов программ).
В объектно-ориентированных языках
В объектно-ориентированных языках класс является абстрактным типом данных.[Прим. 1] Полиморфизм реализуется с помощью наследования классов и виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный в классе-потомке. Это называется поздним связыванием. [Примером использования может служить обработка массива, содержащего экземпляры как класса-родителя, так и класса-потомка: очевидно, что такой массив может быть объявлен только как массив типа класса-родителя и у объектов массива могут вызываться только методы этого класса, но если в классе-потомке какие-то методы были переопределены, то в режиме исполнения для экземпляров этого класса будут вызваны именно они, а не методы класса-родителя.]
Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования — древовидные или сетевидные.
Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе). Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.
Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников, которые в свою очередь наследуются от одного класса (так называемая «Проблема ромба»): если метод общего предка был переопределён в посредниках, неизвестно, какую реализацию метода должен наследовать общий потомок. Решается эта проблема путём отказа от множественного наследования для классов и разрешением множественного наследования для полностью абстрактных классов (то есть интерфейсов) (C#, Delphi,Java), либо через виртуальное наследование (C++).
9. Динамическое создание объектов на форме с помощью классов.
Статья посвящена динамическому созданию обычных и визуальных объектов, а также наследованию объктов
Задача формулируется следующим образом- дан целочисленный массив содержимого формы:0- combobox,1-spinedit,2-edit,3 и 4-panel,необходимо создать эти различные объекты на форме или на панелях, для удобства доступа к ним. Естественно предложить решение без динамического создания- размещаем объекты на форме, устанавливаем единый обработчик события ( так как формат обработчиков одинаков-один параметр Sender:TObject, то такое возможно), а в свойстве Tag объектов храним его id(не номер типа а номер объекта в массиве), для каждого значения tag исполняем то же код. Однако же если массив двумерный как в редакторе кампаний hi, то сложно использовать этот метод, а если формат размещен в файле, базе данных или присваивается при выполении программы то без динамических объектов не обойтись.
Пример использовался для написания редактора кампаний, когда разные свойства требовали разных объектов, например количество сценариев требовало наличие spinedit,для названия кампании нужен edit,а для имен файлов карт panel, и не простая, а чтобы при клике вызывался opendialog.
Как это делается:
Во первый объявляем саму структуру объектов - у нас будет двумерный массив объектов, двумерный массив подписей к нему, одномерный массив панелей для объектов и также хранится массив количества свойств(для двумерных массивов, например свойств кампании всего 2, а свойств сценариев уже 5).
tcampa_struct=class
num:array[0..2] of array of integer;
p:array[0..2]of TPanel;
l:array[0..2]of array of TLabel;
wc:array[0..2] of array of TWinControl;
constructor Create(Sender:TObject);
destructor Free;
end;
Теперь опишем как создавать объекты. Сначала обратим внимание на TwinControl -это наибольший предок всех,используемых мною, объектов. Для любого объекта в delphi необходимо сделать такое присвоение: object:=TObject.Create(); , то есть создать экземляр класса, далее для визуальных объектов необходимо присвоить родителя object.parent:=hisparent; после этого объект создастся со свойствами по умолчанию, а затем нужно присвоить часть свойств нужным вам значениям. Я изменяю размер и расположение объектов. В зависимости от типа объекта конструкторы разные и вызываются дочерние: wc[i,j]:=TComboBox.Create(p[i]);
constructor tcampa_struct.Create(Sender:TObject);
var i,j:integer;
begin
for i:=0 to 2 do
begin
setlength(num[i],campa_structC[i]);
setlength(l[i],campa_structC[i]);
setlength(wc[i],campa_structC[i]);
end;
num[0,0]:=2;num[0,1]:=1;
num[1,0]:=2;num[1,1]:=3;num[1,2]:=4;num[1,3]:=1;num[1,4]:=1;
num[2,0]:=0;num[2,1]:=0;num[2,2]:=1;num[2,3]:=0;num[2,4]:=1;
for i:=0 to 2 do
begin
p[i]:=TPanel.Create(TComponent(Sender));
p[i].Parent:=TWinControl(Sender);
p[i].Left:=500;
p[i].Width:=340;
p[i].Height:=30*campa_structC[i];
end;
p[0].Top:=60;
p[1].Top:=130;
p[2].Top:=300;
for i:=0 to 2 do
for j:=0 to campa_structC[i]-1 do
begin
l[i,j]:=TLabel.Create(p[i]);
l[i,j].Parent:=p[i];
l[i,j].Left:=2;
l[i,j].Top:=j*30+2;
l[i,j].Height:=28;
l[i,j].Width:=166;
end;
for i:=0 to 2 do
for j:=0 to campa_structC[i]-1 do
begin
case num[i,j] of
0:wc[i,j]:=TComboBox.Create(p[i]);
1:wc[i,j]:=TSpinEdit.Create(p[i]);
2:wc[i,j]:=TEdit.Create(p[i]);
3:wc[i,j]:=TPanel.Create(p[i]);
4:wc[i,j]:=TPanel.Create(p[i]);
end;
wc[i,j].Parent:=p[i];
wc[i,j].Left:=172;
wc[i,j].Top:=j*30;
wc[i,j].Height:=25;
wc[i,j].Width:=166;
end;
l[0,0].Caption:='Название';
l[0,1].Caption:='Количество сценариев';
l[1,0].Caption:='Имя сценария';
l[1,1].Caption:='Имя файла';
l[1,2].Caption:='Имя ИИ файла';
l[1,3].Caption:='Главный игрок';
l[1,4].Caption:='Количество бонусов';
l[2,0].Caption:='Номер';
l[2,1].Caption:='Уточненный номер';
l[2,2].Caption:='Значение';
l[2,3].Caption:='Тип адресата';
l[2,4].Caption:='Номер адресата';
end;
Все создано кроме небольших оговорок необходимо присвоить события и некоторые начальные значение, скажем номер игрока не должен выходить за пределы 1 до 8. События для объектов должны быть тоже объявлены в форме. Вот я вызываю при клике на панель раличные opendialog и пишу имя файла в название.
procedure TFormC1.him_click(Sender:TObject);
begin
if OpenDialogm.Execute then
TPanel(Sender).Caption:=OpenDialogm.FileName;
end;
procedure TFormC1.hiai_click(Sender:TObject);
begin
if OpenDialogAi.Execute then
TPanel(Sender).Caption:=OpenDialogAI.FileName;
end;
При закрытии формы не забываем вызвать деструктор.
destructor tcampa_struct.free();
var i,j:integer;
begin
for i:=0 to 2 do
for j:=0 to campa_structC[i]-1 do
begin
l[i,j].Free;
wc[i,j].Free;
end;
for i:=0 to 2 do
p[i].Free;
end;
Данная процедура в дополнении к конструктору. Обратим внимание на приведение к дочерним типам TcomboBox(Campa_struct.wc[2,3]).
procedure TFormC1.CS_init;
var i,j:integer;
begin
TPanel(Campa_struct.wc[1,1]).OnClick:=him_click;
TPanel(Campa_struct.wc[1,2]).OnClick:=hiai_click;
TSpinEdit(Campa_struct.wc[1,3]).Value:=1;
TSpinEdit(Campa_struct.wc[1,3]).MinValue:=1;
TSpinEdit(Campa_struct.wc[1,3]).MaxValue:=8;
ReadFiles;
TComboBox(Campa_struct.wc[2,3]).Clear;
for i:=0 to 8 do
TComboBox(Campa_struct.wc[2,3]).Items.Add(campa_actors[i]);
TComboBox(Campa_struct.wc[2,3]).OnChange:=Campa_change_actor;
TComboBox(Campa_struct.wc[2,0]).OnChange:=Campa_change_actor2;
end;