img
00:00
imgDRKB online - Как написать собственный класс?
imgimgimg
  Общие вопросы
  Delphi IDE, компиллятор, отладчик, редактор
  Язык программирования Дельфи
  Общие вопросы
  Объектное ориентирование
  Сущность ООП
  Разработка компонентов и классов
  Как написать собственный класс?
  Как заставить код компонента работать только в дизайне?
  Создание компонент в Delphi
  Пособие по написанию своих компонентов
  Простой пример разработки собственного компонента
  Методы
  Свойства
  События
  Self
  Sender
  Разные вопросы
  Работа со строками
  Работа с датами и временем
  Работа с числами
  Работа с битами
  Работа с массивами
  Работа с указателями, память
  Множества, записи и перечисляемые типы
  RTTI и другие трюки с информацией о классах, модулях и т.п.
  Взаимодействие с другими языками
  Threads
  Работа с коллекциями
  RTL Delphi (краткий справочник)
  Базовые классы
  Скрипты, компилляторы и связанные с ними вопросы
  Вокруг и около Паскаля или другие компилляторы Дельфи/Паскаль
  VCL
  Системные функции и WinAPI
  Базы данных
  Работа с файловой системой
  Репортинг, работа с принтером
  Работа с сетью, интернетом, протоколами
  Работа с графикой и мультимедиа
  Математика, алгоритмы
  Форматы файлов, данных. Конвертация форматов
  ActiveX, COM, DCOM, MIDAS, CORBA, интерфейсы, OLE, DDE
  Разработка приложений
  Kylix
  Delphi.Net
  Развлечения
  
  [drkb=89] Комментариев: 0 
Как написать собственный класс?

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

delphi
unit Unit2;
{©Drkb v.3(2007): www.drkb.ru,
®Vit (Vitaly Nevzorov) - nevzorov@yahoo.com}


interface

Uses classes, Sysutils;

{Нам нужен процедурный тип для создания собственного события. Собственно - это описание процедуры которая должна будет исполнятся при каких-нибудь обстоятельствах}

Type
  TError = procedure(Sender:TObject; Error: string) of object;

{Описание нашего класса, мы его наследуем от TObject, потому ?то нам практи?ески не нужна
никакия функциональность предков}

Type TStatistic=Class(TObject)
private {здесь описываются только внутренние переменные и процедуры - "для служебного пользования"}
{Описание полей, т.е. переменных которые работают только внутри класса, "снаружи" они не
доступны.}

FList:TStringList;
FPrecision: byte;
{Тоже переменная - для определения события}
FonError: TError;
{функция - будет использоваться только внутри класса, "снаружи" напрямую не доступна}
function GetCount: integer;
public {Описанное здесь доступно для пользователя класса}
{Конструктор - метод создания класса, имеет смысл его описывать только если он делает
?то-то специфи?еское - например нам надо будет создать переменную FList. В противном слу?ае
его описание можно опустить - будет работать конструктор родительского класса}

Constructor Create;
{Деструктор - метод разрушения класса}
Destructor Destroy; override;
{Описание методов - собственно методы мало ?ем отли?аются от процедур}
Procedure AddValue(Value:String);
Procedure Clear;
Function Solve:real;
{Описание свойств. Обратите внимание само свойство не способно хранить никакую информацию, это
только указатель на внутренюю струкруру. Например для хранения свойства Precision используется
переменная FPrecision. А для ?тение свойства Count используется функция GetCount}

Property Precision:byte read FPrecision write FPrecision;
Property Count:integer read GetCount;
{Описание событий. ?то такое событие? - Это указатель на процедуру. Сам класс реализации этой процедуры
не знает. Классу известно только заголовок процедуры, вы в коде программы будете писать реализацию
процедуры, а класс только в нужный момент передаст ей управление, используя указатель onError}

Property onError:TError read FonError write FonError;
end;

implementation

{ TStatistic }

constructor TStatistic.Create;
begin
inherited; {Вна?але надо вызвать конструктор класса-родителя}
FList:=TStringList.create;{создаем структуры нашего класса}
end;

destructor TStatistic.Destroy;
begin
FList.Free;{Разрушаем структуры нашего класса}
inherited;{в последнюю о?ередь вызываем деструктор клсса-родителя}
end;

procedure TStatistic.AddValue(Value: String);
begin
  FList.add(Value); {Примерно так мы реализуем метод}
end;

procedure TStatistic.Clear;
begin
  FList.clear;
end;

function TStatistic.GetCount: integer;
begin
  Result:=FList.count+1;
end;

function TStatistic.Solve: real;
  var i:integer;
begin
result:=0;
for i:=0 to FList.count-1 do
begin
try
  result:=result+(Sqr(strtofloat(FList[i])));
except
{интересная конструкция. "on e:exception do" - мы "отлавливаем" ошибку как переменную "e".
Эта переменная имеет о?ень полезное свойство e.message - оно содержит описание ошибки. Далее
следует вызов события. Вна?але мы проверяем использует ли пользователь событие:
"if Assigned(FOnError) then", если использует то вызываем его процедуру: FOnError, с параметрами:
self - зарезервированная переменная - указатель на экземпляр нашего класса, e.message - описание
ошибки}

on e:exception do
if Assigned(FOnError) then FOnError(Self, e.message);
end;
end;
end;

end.

Вот пример использования этого класса:

unit Unit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure OnError(Sender:TObject; Error: string);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
  var Statistic:TStatistic;
begin
Statistic:=TStatistic.create;
Statistic.onError:=onError;
Statistic.AddValue('123423');
Statistic.AddValue('123423');
showmessage(floattostr(Statistic.solve));
Statistic.Clear;
Statistic.AddValue('123423');
Statistic.AddValue('12ssss3');
showmessage(floattostr(Statistic.solve));
Statistic.Free;
end;

procedure TForm1.OnError(Sender: TObject; Error: string);
begin
showmessage('Error inside class:'+Sender.ClassName+#13#10+Error);
end;

end.




@Drkb::00092
Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Взято с Vingrad.ru http://forum.vingrad.ru
Количество статей: 4366
 
Вход
Имя:
Пароль:
Запомнить
Регистрация Забыли пароль?
Мини-чат :)
Необходима регистрация
Архив мини-чата
23-05-2020 16:32
SturmVladik
Всем приффки :-)
08-05-2020 06:21
DartKane
Сюда бы ещё добавить либо виджет записки, либо ярлык на рабочем столе)
01-05-2020 08:45
DartKane
Я так понимаю - DeskClock 3 развиваться не будет?
01-05-2020 08:32
DartKane
Однако драсте)
30-04-2020 22:20
antonn
Безобразие! smiley
29-04-2020 17:55
Programmer
3 месяца и 10 дней сюда никто не писал...
19-01-2020 10:47
Programmer
уже подросток
19-01-2020 10:47
Programmer
13 лет этому сайту
19-01-2020 10:45
Programmer
уже 2020
14-01-2020 05:12
Xyu
Кароч дарова
Статистика
 СегодняВсего
Посетителей4782299158
Запросов21611330831126
Online
Пользователей0
Гостей73
imgimgimgimg
 
img
     00:00