| Как написать собственный класс? | Previous Home Next |
| 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; |
| inherited; {Вна?але надо вызвать конструктор класса-родителя} |
| FList:=TStringList.create;{создаем структуры нашего класса} |
| FList.Free;{Разрушаем структуры нашего класса} |
| inherited;{в последнюю о?ередь вызываем деструктор клсса-родителя} |
| 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; |
| TForm1 = class(TForm) |
| Button1: TButton; |
| procedure Button1Click(Sender: TObject); |
| procedure OnError(Sender:TObject; Error: string); |
| 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; |
| showmessage('Error inside class:'+Sender.ClassName+#13#10+Error); |