Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Все, что вы не знали, но хотели бы узнать о Delphi №15


Выпуск №16

Раздел: Язык Программирования Delphi

Подраздел: RTL Delphi (краткий справочник)
 

Вот и подошел к концу раздел Язык Программирования Delphi. И по итогам голосования, хотя и немногочисленного, но почти единогласного, был выбран следующий раздел: Базы данных.

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

 

Внимание: обновлен список возможных разделов!

Уважаемый подписчик,

О чем будет следующий раздел - решать вам.

Варианты:

VCL

Системные функции и Winapi

Базы данных

Работа с файловой системой

Репортинг, работа с принтером

Работа с сетью, Интернетом, протоколами

Работа с графикой, мультимедиа

NEW!

Математика, алгоритмы

Форматы файлов, данных. Конвертация форматов
ActiveX, COM, DCOM, MIDAS, CORBA, интерфейсы, OLE, DDE
Разработка приложений
Kylix
 

Ваши предложения высылайте на

formyreferal@rambler.ru

В этом выпуске:

Math - математика, статистика, финансы
Арифметика
Тригонометрические функции и процедуры
Функции и процедуры для финансовых вычислени
TList
TStrings и TStringList
TStream
TObject
TComponent
TPersistent
TControl
TWinControl
TCustomControl
TGraphicControl

 

Math - математика, статистика, финансы  


Тригонгометрические функции:

function ArcCos(X: Extended): Extended;
function ArcSin(X: Extended): Extended;
function ArcTan2(Y, X: Extended): Extended; Арктангенс X/Y возвращает угол в квадранте
procedure SinCos(Theta: Extended; var Sin, Cos: Extended) register; возвращает сразу и синус и косинус, вычисления в 2 раза быстрее чем Sin, Cos по отдельности
function Tan(X: Extended): Extended;
function Cotan(X: Extended): Extended;
function Hypot(X, Y: Extended): Extended; Возвращает значение гипотенузы по катетам

Конвертация углов

function DegToRad(Degrees: Extended): Extended;
function RadToDeg(Radians: Extended): Extended;
function GradToRad(Grads: Extended): Extended;
function RadToGrad(Radians: Extended): Extended;
function CycleToRad(Cycles: Extended): Extended;
function RadToCycle(Radians: Extended): Extended;

Гиперболические функции

function Cosh(X: Extended): Extended;
function Sinh(X: Extended): Extended;
function Tanh(X: Extended): Extended;
function ArcCosh(X: Extended): Extended;
function ArcSinh(X: Extended): Extended;
function ArcTanh(X: Extended): Extended;

Логарифмы, экспоненты и возведение в степень

function LnXP1(X: Extended): Extended; - натуральный логариф x+1 (для более высокой точности при x близких к нулю)
function Log10(X: Extended): Extended; - десятичный логарифм
function Log2(X: Extended): Extended; - логарифм по основанию 2
function LogN(Base, X: Extended): Extended; - логарифм по произвольному основанию
function IntPower(Base: Extended; Exponent: Integer): Extended register;
function Power(Base, Exponent: Extended): Extended;

Разные функции

procedure Frexp(X: Extended; var Mantissa: Extended; var Exponent: Integer) register; - возвращает мантису и экспоненту
function Ldexp(X: Extended; P: Integer): Extended register; - возвращает X*2**P
function Ceil(X: Extended):Integer; - округляет до ближайшего большего целого
function Floor(X: Extended): Integer; - округляет до ближайшего меньшего целого
function Poly(X: Extended; const Coefficients: array of Double): Extended; вычисление полинома

Статистические функции

function Mean(const Data: array of Double): Extended; среднее арифметическое
function Sum(const Data: array of Double): Extended register; сумма ряда
function SumInt(const Data: array of Integer): Integer register; сумма ряда целых чисел
function SumOfSquares(const Data: array of Double): Extended; сумма квадратов
procedure SumsAndSquares(const Data: array of Double; var Sum, SumOfSquares: Extended) register; сумма и сумма квадратов одной функцией
function MinValue(const Data: array of Double): Double; минимальное значение в ряду
function MinIntValue(const Data: array of Integer): Integer; минимальное значение в ряду целых
function Min(A,B) минимальное значение из 2х чисел (overload функции для Integer, Int64, Single, Double, Extended)
function MaxValue(const Data: array of Double): Double;
function MaxIntValue(const Data: array of Integer): Integer;
function Max(A,B);
function StdDev(const Data: array of Double): Extended; стандартное отклонение
procedure MeanAndStdDev(const Data: array of Double; var Mean, StdDev: Extended); - среднее арифметическое и стандартное отклонение
function PopnStdDev(const Data: array of Double): Extended; распределение стандартного отклонения (Population Standard Deviation)
function Variance(const Data: array of Double): Extended;
function PopnVariance(const Data: array of Double): Extended; (Population Variance)
function TotalVariance(const Data: array of Double): Extended;
function Norm(const Data: array of Double): Extended; среднее квадратичное (Sqrt(SumOfSquares))
procedure MomentSkewKurtosis(const Data: array of Double;
var M1, M2, M3, M4, Skew, Kurtosis: Extended); основные статистические моменты
function RandG(Mean, StdDev: Extended): Extended; - случайные числа с Гауссовским распределением

Финансовые функции

function DoubleDecliningBalance(Cost, Salvage: Extended; Life, Period: Integer): Extended;
function FutureValue(Rate: Extended; NPeriods: Integer; Payment, PresentValue: Extended; PaymentTime: TPaymentTime): Extended;
function InterestPayment(Rate: Extended; Period, NPeriods: Integer; PresentValue,
FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
function InterestRate(NPeriods: Integer;
Payment, PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
function InternalRateOfReturn(Guess: Extended;
const CashFlows: array of Double): Extended;
function NumberOfPeriods(Rate, Payment, PresentValue, FutureValue: Extended;
PaymentTime: TPaymentTime): Extended;
function NetPresentValue(Rate: Extended; const CashFlows: array of Double;
PaymentTime: TPaymentTime): Extended;
function Payment(Rate: Extended; NPeriods: Integer;
PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
function PeriodPayment(Rate: Extended; Period, NPeriods: Integer;
PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
function PresentValue(Rate: Extended; NPeriods: Integer;
Payment, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
function SLNDepreciation(Cost, Salvage: Extended; Life: Integer): Extended;
function SYDDepreciation(Cost, Salvage: Extended; Life, Period: Integer): Extended;

 
Арифметика  

Abs   Возвращает абсолютное значение аргумента.   
Ceil   Округляет значение аргумента в большую сторону.   
Exp   Вычисляет значение ex.   
Floor   Округляет значение аргумента в меньшую сторону.   
Frac   Возвращает дробную часть аргумента.   
Frexp   Возвращает мантиссу и экспоненту аргумента.   
Int   Возвращает целую часть аргумента.   
IntPower   Возводит аргумент X в целочисленную степень Y.   
Ldexp   Вычисляет X*2Y.   
Ln   Вычисляет натуральный логарифм ln(x).   
LnXP1   Вычисляет натуральный логарифм ln(x+1).   
Log10   Вычисляет десятичный логарифм.   
Log2   Вычисляет логарифм аргумента по основанию 2.   
LogN   Вычисляет логарифм аргумента по основанию N.   
Max   Возвращает большее из двух чисел.   
Min   Возвращает меньшее из двух чисел.   
Pi   Возвращает значение числа Пи.   
Poly   Вычисляет однородный полином.   
Power   Возводит X в степень Y.   
Round   Округляет число к ближайшему целому.   
Sqr   Вычисляет квадрат аргумента Х.   
Sqrt   Вычисляет квадратный корень аргумента Х.   
Trunc   Отсекает дробную часть числа.   
Тригонометрические функции и процедуры  


ArcCos   Вычисляет арккосинус аргумента.
ArcCosh    Вычисляет гиперболический арккосинус аргумента.
ArcSin       Вычисляет арксинус аргумента.
ArcSinh    Вычисляет гиперболический арксинус аргумента.
ArcTan    Вычисляет арктангенс аргумента.
ArcTan2    Вычисляет arctg(Y/X).
ArcTanh    Вычисляет гиперболический арктангенс аргумента.
Cos       Вычисляет косинус аргумента.
Cosh       Вычисляет гиперболический косинус аргумента.
Cotan       Вычисляет котангенс аргумента.
Hypot       Вычисляет длину гипотенузы прямоугольного треугольника.
Sin       Вычисляет синус аргумента.
SinCos    Вычисляет одновременно синус и косинус аргумента.
Sinh       Вычисляет гиперболический синус аргумента.
Tan       Вычисляет тангенс аргумента.
Tanh       Вычисляет гиперболический тангенс аргумента.

Преобразование тригонометрических единиц измерений

CycleToRad   Преобразовывает значение аргумента из циклов в радианы.   
DegToRad   Преобразовывает значение аргумента из градусов в радианы.   
GradToRad   Преобразовывает значение аргумента из десятичных градусов (grad) в радианы.   
RadToCycle   Преобразовывает значение аргумента из радианов в циклы.   
RadToDeg   Преобразовывает значение аргумента из радианов в градусы.   
RadToGrad   Преобразовывает значение аргумента из радианов в десятичные градусы (grad).   
 

Функции и процедуры для финансовых вычислений  


DoubleDecliningBalance Вычисляет амортизационные отчисления на определенном этапе.
FutureValue       Вычисляет значение вклада через определенный период времени.
InterestPayment    Вычисляет процентную ставку кредита.
InterestRate       Вычисляет процентную ставку инвестиций.
InternalRateOfReturn    Вычисляет внутреннюю ставку дохода от инвестиций.
NetPresentValue    Вычисляет текущее значение платежа, используя массив с расчетными значениями.
NumberOfPeriods    Вычисляет количество этапов необходимое для погашения кредита.
Payment       Вычисляет полную сумму погашения кредита на отдельном этапе.
PeriodPayment    Вычисляет необходимую сумму выплат основной части (без процентов) кредита на определенном этапе.
PresentValue       Определяет текущее значение вклада.
SLNDepreciation    Вычисляет сумму амортизационных отчислений по методу равномерной амортизации.
SYDDepreciation    Вычисляет сумму амортизационных отчислений по методу ускоренной амортизации.
 

TList  

Класс TList
 

Класс TList — универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются — эта обязанность лежит на программисте.

Приведем доступные ему методы и свойства класса:

property Items[Index: Integer]: Pointer;   Возвращает указатель на содержимое элемента списка с индексом Index. Это свойство является векторным свойством, принимаемым по умолчанию, и его имя можно при записи опускать.   

property Count: Integer;   Определяет число элементов в списке.   

property Capacity: Integer;   Определяет максимальное число элементов в списке. Оно может изменяться как явно — пользователем, так и при добавлении элементов в список, в том случае, когда Count>=Capacity. Максимальная емкость списка — 16380 элементов.   

Управляют списком следующие методы:

function Add(Item: Pointer): Integer;
   Добавляет в конец списка элемент, который будет равен Item (т. е. указывать на те же данные).   

function Remove(Item: Pointer): Integer;   Удаляет из списка элемент, который равен Item.   

procedure Insert(Index: Integer; Item: Pointer) ;   Вставляет элемент, равный Item, перед элементом с индексом Index.   

procedure Delete(Index: Integer);   Удаляет из списка элемент с индексом Index.   

procedure Clear;   Очищает список, устанавливая величины Count и Capacity в 0.   

procedure Exchange(Indexl, Index2: Integer);   Меняет местами элементы списка с индексами Indexl и Index2.   

function Expand: TList;   При соблюдении равенства Count=Capacity расширяет список. При емкости списка менее пяти элементов, он по умолчанию расширяется на четыре элемента, при пяти-восьми — на восемь, более восьми — на шестнадцать.   

function First: Pointer; function Last: Pointer;   Возвращают значения первого п последнего (с индексом Count-1) элементов списка соответственно.   

function IndexOf(Item: Pointer): Integer;   Возвращает индекс элемента, равного Item.   

procedure Move(CurIndex, Newlndex: Integer) ;   Перемещает элемент списка с положения Curlndex в положение Newlndex.   

procedure Pack;   Упаковывает список, сдвигая элементы к началу на пустующие места.   

Наконец, если приведенных методов почему-либо недостаточно, то свойство
property List: pPointerList;
pPointerList = ^TPointerList;
TPointerList = array[0..65520 div SizeOf(Pointer)] of Pointer;
возвращает указатель непосредственно на список указателен ((ко) означает, что свойство доступно только для чтения).
 
TStrings и TStringList  

Класс TStrings
 


Многофункциональный класс, предназначенный для хранения текстовых строк и связанных с ними объектов (любых потомков TObject). TStrings — абстрактный класс; он только описывает методы работы с наборами строк и сопутствующих им объектов, но как именно они хранятся, на его уровне не определено. Его потомки очень многочисленны; они играют основную роль в компонентах-списках (TListBox, TComboBox), редакторе (TMemo) и других. Так что вам чаще всего придется иметь дело с TStrings как со свойством одного из компонентов. В дальнейшем экземпляры этого класса и порожденных от него классов мы-будем называть наборами строк. Для создания собственных наборов строк вне компонентов предназначен потомок TStrings — TStringList, который будет рассмотрен ниже.

К строкам и объектам соответственно можно получить доступ через свойства:

property Strings[Index: Integer]: string;

property Objects[Index: Integer]: TObject;

Первое из них является векторным свойством, принимаемым по умолчанию. Общее количество пар в списке равно значению свойства:

property Count: Integer;

Класс TStrings также предназначен для хранения пар вида 'параметр=значение', например, в файлах инициализации (.INI). Эту возможность реализует следующее свойство:

property Values[const Name: string]: string;

При обращении к этому свойству для чтения ищется строка, содержащая подстроку (параметр) Name и символ '='. Если она найдена, возвращается то, что находится в этой строке после '='. Если нет, ValuesfName] равно пустой строке. При записи: если строка, содержащая параметр Name, найдена — ее значение после '=' заменяется новым значением, если нет — строка добавляется. Если существующему параметру присваивается пустая строка (Valu-es[Name] := ";), то он удаляется из набора строк.

Методы класса

procedure BeginUpdate; procedure EndUpdate;   Пара процедур, которые устанавливают и сбрасывают флаг обновления набора. Между ними, для ускорения работы, нужно заключать все операции по копированию, удалению и т. д. большого количества элементов.   

procedure Clear;   Осуществляет полную очистку набора.   

procedure Insert(Index: Integer; const S: string);   Вставляет строку S под индексом Index.   

procedure Delete(Index: Integer);   Удаляет строку с индексом Index.   

function IndexOf(const S: string): Integer;   Возвращает индекс (номер в наборе) строки S. Если она не найдена, функция возвращает -1.   

function IndexOfObject(AObject: TObject): Integer;   Возвращает индекс объекта в наборе. В случае неудачи возвращает -1.   

function Equals(Strings: TStrings): Boolean;   Сравнивает строки вызвавшего его объекта со строками объекта Strings и возвращает True в случае равенства (сравниваются число строк и все строки попарно).   

function Add(const S: string): Integer-   Добавляет строку S в конец набора и в случае успеха возвращает присвоенный ей индекс (он должен быть равен значению Count до добавления строки).   

function AddObject(const S: string; AObject: TObject): Integer;   Добавляет строку в паре с объектом. Возвращает то же, что и метод Add.   

procedure Exchange(Indexl, Index2: Integer);   Меняет местами пары строка+объект с индексами Indexl и Index2.   

procedure Move(Curlndex, Newlndex: Integer);   Перемещает пару строка+объект с позиции Curlndex в позицию Newlndex.   

procedure InsertObject(Index: Integer; const S: string; AObject: TObject);   Вставляет объект AObject и соответствующую ему строку S в набор под индексом Index.   

Шесть методов предназначены для экспорта/импорта наборов строк:

а) в поток:
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);

б) в файл (создавая поток и вызывая два предыдущих метода):
procedure LoadFrornFile (const FileName: strings-procedure SaveToFile(const FileName: string);

в) в данные в формате текстового редактора
(подряд расположенные строки, оканчивающиеся парой символов CR/LF (16-ричные коды SOD/SOA)).

procedure AddScrings(Strings: TStrings);   Добавляет в конец набора другой набор Strings.   
procedure Assign(Source: TPersistent);   Уничтожает прежнее содержимое набора и подставляет вместо него Source, если источник имеет тип TStrings. В противном случае возникает исключительная ситуация EConvertError.   

При этом метод
function GetText: PChar;
выгружает строки в единый массив, где они разделены парами символов CR/LF; в конце такого массива ставится нулевой байт. Размер массива не может превышать 65520 байт; поэтому строки выгружаются до тех пор, пока их суммарная длина не превосходит этого значения.

Метод
procedure SetText(Text: PChar);
читает строки из массива Text. Строки в массиве должны быть отделены друг от друга парой символов CR/LF; допускается и один символ LF (16-ричный код $ОА). Символы с кодами 0, $lA(<Ctrl>+<Z>) воспринимаются как конец текста. При этом прежнее содержимое набора уничтожается.

 

Класс TStringlist
 

Этот класс объединяет в себе свойства TStrings и TList простейшим способом — указатель на объект и соответствующая строка объединяются в запись, указатель на которую хранится в списке. В классе переопределены многие виртуальные методы TStrings: Add, Clear, Delete, Exchange, IndexOf, Insert; он является полностью функциональным и вы можете создавать экземпляры TStringList в своей программе для работы с наборами строк и объектов (помимо тех, которые уже есть в компонентах).

Кроме унаследованных от TStrings, определены дополнительно полезные методы и свойства:

function Find(const S: string; var Index: Integer): Boolean;   Метод ищет в наборе строку S и в случае успеха возвращает результат True, а в параметре Index — ее индекс.   

property Sorted: Boolean;   Свойство — признак отсортированности элементов (сортировка осуществляется через посимвольное сравнение строк). Установка Sort := True вызывает процедуру сортировки, которую можно вызвать и явно при помощи метода:   

procedure Sort;   Попытка добавить или вставить элемент в отсортированный список вызывает исключительную ситуацию EListError; в этом случае до выполнения действия свойству Sorted нужно присвоить значение False.   

property Duplicates: TDuplicates; TDuplicates = (duplgnore, dupAccept, dupError);   Свойство определяет, что происходит при попытке добавить в список дубликат уже имеющейся строки: duplgnore — добавление игнорируется (отклоняется); dupError — добавление приводит к созданию исключительной ситуации EListError; dupAccept — одинаковые строки разрешены. В этом случае при поиске в неотсортированном списке не определено, которая из строк будет найдена первой.   

property OnChange: TNotifyEvent; property OnChanging: TNotifyEvent;   Два свойства, предусмотренные для определения пользователем своей реакции на изменение данных. Событие OnChanging вызывается во многих рассмотренных выше методах до внесения первого изменения, OnChange — после последнего.   

 
TStream  

 


Класс TStream не нов для библиотек фирмы Borland; он и его потомки называются потоками. Со времен появления в библиотеке Turbo Vision он не претерпел существенных изменений, но теперь потоки стали обязательными составными частями там, где нужно прочитать или передать во внешний источник какую-либо информацию.
TStream "является абстрактной моделью совокупности данных, обладающей двумя свойствами — длиной Size и положением текущего элемента Position:

property Position: Longint;


property Size: Longint;

От TStream порождены дочерние объекты, позволяющие пользоваться метафорой потока при работе с файлами, блоками памяти и т. п. Так, в модуле CLASSES описаны классы TMemoryStream и TFileStream.
Данные потока можно читать или записывать, используя предоставляемый буфер, или копировать из другого потока. Эта возможность реализована методами:

function Read(var Buffer; Count: Longint): Longint;virtual; abstract;

function Writetconst Buffer; Count: Longint): Longint;virtual; abstract;

Метод
function Seek(0ffset: Longint; Origin: Word): Longint;virtual; abstract;

позиционирует поток. В зависимости от значения параметра Origin новая позиция выбирается так:
О — новая позиция равна Offset;
1 —текущая позиция смещается на Offset байт;
2 — новая позиция находится на Offset байт от конца потока.

Методы
procedure ReadBuffer(var Buffer; Count: Longint);
procedure WriteBuffer(const Buffer; Count: Longint);
представляют собой оболочки над Read/Write, вызывающие в случае неудачи операции исключительные ситуации EReadError/EWriteError.

Метод
function CopyFromfSource: TStream; Count: Longint): Longint;
дописывает к потоку Count байт из потока Source, начиная с его текущей позиции. Если значение Count равно нулю, то дописывается весь поток Source с его начала.
Основным отличием реализации TStream в VCL является введение ряда методов, обеспечивающих чтение и запись компонентов в потоки. Они полезны на уровне разработчика новых компонентов и здесь подробно не рассматриваются:

function ReadComponent(Instance: TComponent): TComponent;
function ReadComponentRes(Instance: TComponent): TComponent;
procedure WriteComponent(Instance: TComponent);
procedure WriteComponentRes (const ResName: string;Instance: TComponent);
procedure ReadResHeader;
 

Несколько функций для TStream  


Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch


These are three utility functions to write strings to a TStream. 
Nothing fancy, but I just ended up coding this repeatedly so 
I made these functions. }



Hier sind einige TStreaam Hilfsfunktionen um strings 
in einen TStream zu schreiben. 
}



unit ClassUtils;

interface

uses
  SysUtils,
  Classes;

{: Write a string to the stream 
  @param Stream is the TStream to write to. 
  @param s is the string to write 
  @returns the number of bytes written. }

function Writestring(_Stream: TStream; const _s: string): Integer;

{: Write a string to the stream appending CRLF 
  @param Stream is the TStream to write to. 
  @param s is the string to write 
  @returns the number of bytes written. }

function WritestringLn(_Stream: TStream; const _s: string): Integer;

{: Write formatted data to the stream appending CRLF 
  @param Stream is the TStream to write to. 
  @param Format is a format string as used in sysutils.format 
  @param Args is an array of const as used in sysutils.format 
  @returns the number of bytes written. }

function WriteFmtLn(_Stream: TStream; const _Format: string;
  _Args: array of const): Integer;

implementation

function Writestring(_Stream: TStream; const _s: string): Integer;
begin
  Result := _Stream.Write(PChar(_s)^, Length(_s));
end;

function WritestringLn(_Stream: TStream; const _s: string): Integer;
begin
  Result := Writestring(_Stream, _s);
  Result := Result + Writestring(_Stream, #13#10);
end;

function WriteFmtLn(_Stream: TStream; const _Format: string;
  _Args: array of const): Integer;
begin
  Result := WritestringLn(_Stream, Format(_Format, _Args));
end;

 
TObject  


Класс TObject

Класс TObject является родоначальником всей иерархии использующихся в Delphi классов VCL. Он реализует функции, которые обязательно будет выполнять любой объект, который может быть создан в среде разработки. Учитывая гигантское разнообразие возможных областей применения объектов в процессе создания приложений, можно сказать, что круг общих для всех классов операций весьма невелик.

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

Указатель на экземпляр объекта передается в переменную объектного типа, которая в дальнейшем будет идентифицировать объект в программном коде приложения. В приведенном выше фрагменте кода переменная объектного типа someList объявлена как экземпляр типа TStrings. При создании экземпляра этого типа конструктор Create возвращает в переменную SomeList указатель на выделенную для нового объекта область памяти. Для этого применяется метод Newinstance, который вызывается в конструкторе автоматически:

class function Newinstance: TObject; virtual;

Объект класса TObject обеспечивает выполнение этого процесса для любого порожденного от него объекта. А уже внутри конструктора, который унаследован от класса TObject, можно предусмотреть инициализацию переменных и выполнение дополнительных операций. Объявление конструктора выглядит следующим образом:

constructor Create; 

В конструкторах потомков это объявление может перекрываться, но при необходимости вызвать конструктор предка используется оператор inherited:

constructor TSomeObject.Create;  
begin  
inherited Create; 
... 
end

Для уничтожения экземпляра объекта в классе TObject предназначены методы Destroy и Free:

destructor Destroy; virtual;  
procedure Free; 


Как видно из объявления, настоящим деструктором является метод Destroy. Он обеспечивает освобождение всех занимаемых экземпляром объекта ресурсов. Обычно при создании новых классов деструктор всегда перекрывается для того, чтобы корректно завершить работу с данными.

Примечание

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

При уничтожении объектов рекомендуется вместо деструктора использовать метод Free, который просто вызывает деструктор, но перед этим проверяет, чтобы указатель на экземпляр объекта был не пустым (не был равен Nil). Это позволяет избежать серьезных ошибок.

Если объект является владельцем других объектов (например, форма владеет всеми размещенными на ней компонентами), то его метод Free автоматически вызовет эти же методы для всех объектов. Поэтому при закрытии формы разработчик избавлен от необходимости заботиться об уничтожении всех компонентов.

Для освобождения занимаемой объектом памяти деструктор автоматически Вызывает метод Freelnstance:

procedure Freelnstance; virtual

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

class function Classlnfo: Pointer; 

возвращает указатель на таблицу информации времени выполнения (RTTI). Эта информация используется в среде разработки и в приложении.

class function ClassName: ShortString;

возвращает имя типа объекта, которое может быть использовано для идентификации. Например, один метод-обработчик щелчка на кнопке может работать с несколькими типами компонентов кнопок:

procedure TForml.BitBtnlClick(Sender: TObject); 
begin  
  if Sender is TBitBtn then TBitBtn(Sender).Enabled := False; 
  if Sender is TSpeedButton then TSpeedButton(Sender).Down := True; 
end

Метод

class function ClassNamels(const Namestring): Boolean; 

позволяет определить, является ли данный объект того типа, имя которого передано в параметре Name. В случае положительного ответа функция возвращает True.

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

Метод

procedure Dispatch(var Message); virtual

осуществляет обработку сообщений, поступающих объекту. Он определяет, сможет ли объект обработать сообщение при помощи собственных обработчиков событий. В случае отсутствия таких методов сообщение передается аналогичному методу Dispatch класса-предка (если он есть).

Класс TObject имеет предопределенный обработчик событий:

procedure DefaultHandler(var Message); virtual

Кроме рассмотренных здесь методов, класс TObject имеет еще несколько методов, которые в основном применяются для взаимодействия объекта со средой разработки.

В целом класс TObject может служить для создания на его основе некоторых простых классов для использования в приложениях.
 

TPersistent  

"Persistent" в переводе с английского означает "устойчивый", "постоянный". Что же такого постоянного в одноименном классе? Ответ таков: виртуальный метод

procedure
 Assign(Source: TPersistent); 

Этот важнейший метод осуществляет копирование содержимого одного объекта (source) в другой (self, т. е. в объект, вызвавший метод Assign). При этом объект-получатель остается самим собой, чего нельзя достигнуть, используя простое присваивание переменных объектного типа:

FirstObject := SecondObject; 

Ведь в этом случае указатель на одну область адресного пространства, содержащую экземпляр класса (объект), замещается указателем на другую область адресного пространства, содержащую другой объект.

Метод Assign позволяет продублировать объект — присвоить одному объекту значения всех свойств другого. При этом объекты не обязательно должны быть одного и того же класса; более того, они не обязательно должны находиться в отношениях "родитель-потомок". Данный метод тем и хорош, что позволяет полиморфное присвоение. Конструкция

Clipboard.Assign(Picture); 

позволяет скопировать содержимое картинки Picture в папку обмена Windows (объект clipboard). Какова здесь логика? Известно, что в папку обмена можно поместить растровую картинку, текст, метафайл, мультимедийные данные и т. п. Метод Assign класса TClipboard переписан таким образом, чтобы обеспечить присвоение (т. е. реальное перемещение в папку обмена) всех этих данных.

procedure TCiipboard.Assign(Source: TPersistent); 
begin 
  if Source is TPicture then 
    AssignPicture(TPicture(Source))  
  else 
    if Source is TGraphic then 
      AssignGraphic(TGraphic(Source)) 
    else  
      inherited Assign(Source); 
end

Для обеспечения взаимодействия потомков класса TPersistent со средой разработки предназначен метод

function GetNamePath: stringdynamic

Он возвращает имя объекта для передачи его в Инспектор объектов.

Для взаимодействия с потоками при загрузке и сохранении компонентов предназначен следующий метод:

procedure DefineProperties(Filer: TFiler); virtual

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

 


Класс TComponent является предком всех компонентов VCL. Он используется в качестве основы для создания невизуальных компонентов и реализует основные механизмы, которые обеспечивают функционирование любого компонента. В нем появляются первые свойства, которые отображаются в Инспекторе объектов. Это свойство

property Name: TComponentName; 

Оно содержит имя экземпляра компонента, которое используется для идентификации компонента в приложении.

Примечание

Тип TComponentName представляет собой обычную строку:

type TComponentName = type string

Свойство

property Tag: Longint; 

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

Для компонентов существует своя иерархия, поэтому в классе введен механизм учета и управления компонентами, для которых данный компонент является владельцем. Свойства и методы, которые отвечают за управление, приведены в табл. 2.1.

Таблица 2.1. Свойства и методы для управления списком компонентов

Свойство (метод)
Описание

property Components [Index: Integer]: TComponent ; 
Содержит индексированный список указателей всех компонентов, для которых данный компонент является владельцем (owner)

property ComponentCount : Integer; 
Число подчиненных компонентов

property Owner: TComponent; 
Указывается, какой компонент является владельцем данного

property Componentlndex: Integer; 
Индекс данного компонента в списке владельца

procedure InsertComponent (AComponent : TComponent) ;
Вставляет компонент AComponent в список

procedure RemoveComponent (AComponent : TComponent}; 
Удаляет компонент AComponent из списка

procedure FindComponent (AName: string): TComponent; 
Осуществляет поиск компонента по имени AName

procedure DestroyComponents; 
Предназначен для уничтожения всех компонентов, подчиненных данному


Очень важное свойство

type TComponentState = set of (csLoading, csReading, csWriting, csDestroying, csDesigning, csAncestor, csllpdating, csFixups, csFreeNotification, cslnline, csDesignlnstance); property ComponentState: TComponentState; 

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

Таблица 2.2. Возможные состояния компонента

csLoading
Устанавливается при загрузке компонента из потока

csReading
Устанавливается при чтении значений свойств из потока

csWriting
Устанавливается при записи значений свойств в поток

csDestroying
Устанавливается при уничтожении компонента

csDesigning
Состояние разработки. Устанавливается при работе с формой во время разработки

csAncestor
Устанавливается при переносе компонента на форму. Для перехода в это состояние должно быть уже установлено состояние csDesigning

csUpdating
Устанавливается при изменении значений свойств и отображения результата на форме-владельце. Для перехода в это состояние должно быть уже установлено состояние csAncestor

CsFixups
Устанавливается, если компонент связан с компонентом другой формы, которая еще не загружена в среду разработки

csFreeNotification
Если это состояние устанавливается, другие компоненты, связанные с данным, уведомляются о его уничтожении

cslnline
Определяет компонент верхнего уровня в иерархии. Используется для обозначения корневого объекта в разворачивающихся свойствах

csDesignlnstance
Определяет корневой компонент на этапе разработки


Для обеспечения работы механизма действий (см. гл. 8) предназначен

метод

function ExecuteAction(Action: TBasicAction): Boolean; dynamic

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

На уровне класса TComponent обеспечена поддержка СОМ-интерфейсов IUnknown и IDispatch.

Через свойство

property ComObject: IUnknown; 

вы можете обеспечить применение методов этих интерфейсов.

Таким образом, класс TComponent имеет все для использования в качестве предка, для создания собственных невизуальных компонентов.

 

TControl  


Класс TControi является базовым для всех визуальных компонентов и инкапсулирует механизмы отображения компонента на экране. В нем используется множество новых свойств и методов. Недаром в Delphi в Инспекторе объектов появилась категоризация методов и свойств (рис. 2.2). Большинство из них вводятся как раз в классах TControl и TWinControl.


 

TWinControl  

Класс TWinControl обеспечивает создание и использование оконных элементов управления (см. выше). Напомним, что оконный элемент управления имеет системный дескриптор окна hwnd. Однако оконными элементами являются не только формы и диалоги, но и большинство стандартных элементов управления.

Новые механизмы, инкапсулированные в классе, обеспечивают выполнение характерных для оконных элементов функций: прием и передачу фокуса, отклик на действия мышью и ввод с клавиатуры и т. д. Рассмотрим основные свойства и методы класса.

Дескриптор окна содержится в свойстве

property
 Handle: HWND; 

При создании оконного элемента управления вызывается метод

procedure CreateParams(var Params: TCreateParams); virtual

который заполняет структуру TCreateParams необходимыми значениями:

type 
TCreateParams = record  
  Caption: PChar; 
  Style: DWORD; 
  ExStyle: DWORD; 
  X, Y: Integer; 
  Width, Height: Integer; 
  WndParent: HWND; 
  Param: Pointer 
  WindowClass: TWndClass; 
  WinClassName: array[0..63of Char; 
end

Для создания дескриптора окна для элемента управления используется метод

procedure CreateHandle; virtual

Операционная система создает дескриптор окна только вместе с самим окном. Поэтому метод CreateHandle только создает окно, а для присваивания свойству Handle значения дескриптора окна вызывает метод createwnd.

Для передачи фокуса между элементами управления на одной форме часто используется клавиша <Таb>. Порядок перемещения фокуса между элементами определяется свойством

type TTabOrder = -1..32767;  
property TabOrder: TTabOrder; 

В первую очередь фокус передается компоненту с минимальным значением свойства. Далее — по возрастанию значения. При переносе компонента на форму это значение задается автоматически в соответствии с числом компонентов на форме.

Компонент можно заставить не откликаться на клавишу <Таb>. Для этого свойству

property TabStop: Boolean; 

необходимо присвоить значение False.

Для передачи фокуса прямо элементу управления применяется метод

procedure SetFocus; virtual

Чтобы узнать, имеет ли элемент управления фокус, в настоящее время используется метод

function Focused: Boolean; dynamic

Все оконные элементы имеют рамку по контуру (впрочем, она может быть не видна). Ее параметры задаются группой свойств:

property BevelEdges: TBevelEdges;  
задает, какие стороны входят в рамку;

property Bevellnner: TBevelCut; property BevelOuter: TBevelCut; 
задают внешний вид рамки;

property BevelKind: TBevelKind; 
определяет стиль рамки;

property BevelWidth: TBevelWidth; 
задает размер рамки.

Свойство

property Brush: TBrush;

определяет параметры кисти (цвет и заполнение), которой рисуется фон элемента.

Оконный элемент может содержать другие компоненты. Для управления ими применяется индексированный список указателей, представляющих свойство

property Controls[Index: Integer]: TControl; 

Общее число дочерних элементов управления содержится в свойстве

property ControlCount: Integer; 

Внешний вид оконного элемента определяется свойством

property Ctl3D: Boolean 

При значении True элемент управления имеет трехмерный вид. Иначе элемент выглядит плоским.

Для вызова темы контекстной помощи для конкретного элемента управления предназначено свойство

type THelpContext = -MaxLonglnt..MaxLonglnt; 

property HelpContext: THelpContext; 


Значение свойства должно соответствовать номеру темы в файле помощи.

В классе TwinControl добавлена возможность использования редакторов способа ввода (Input Method Editor, IME). Такие редакторы позволяют приспособить стандартную раскладку клавиатуры для символьных языков для ввода нестандартных символов (иероглифов и т. д.). Редакторы IMЕ представляют собой специально устанавливаемое в операционной системе программное обеспечение (ПО). Имя такого редактора задается в свойстве ImeName. Режим работы редактора определяется свойством ImeMode.

В классе TwinControl добавлено еще несколько методов-обработчиков событий, обеспечивающих реакцию на ввод с клавиатуры, получение и потерю фокуса.


 
TCustomControl  

Класс TCustomControl предназначен для создания на его основе нестандартных оконных элементов управления. Процесс визуализации в нем упрощен за счет использования специального класса TCanvas, инкапсулирующего канву (см. гл. 11).

Доступ к канве осуществляется через свойство

property
 Canvas: TCanvas; 

Отрисовка элемента управления осуществляется методом

procedure PaintWindowfDC: HDC); override

после получения сообщения WM_PAINT.

Возможности этого класса унаследовали классы TPanel, TGroupBox, TStringGrid и т. д.


 
TGraphicControl  


Класс TGraphicControl предназначен для создания на его основе визуальных компонентов, не получающих фокус в процессе выполнения приложения. Так как непосредственным предком класса является класс TControl, то потомки TGraphicControl умеют реагировать на управляющие воздействия мышью.

Наглядный пример элемента управления, которому не нужно получать фокус, — это компонент TLabel, предназначенный для отображения текста, или компонент Timage, предназначенный для визуализации изображений.

Для визуализации элементов управления на основе этого класса используется канва, инкапсулированная в классе TCanvas.

Доступ к канве осуществляется через свойство

property
 Canvas: TCanvas; 

Отрисовка элемента управления осуществляется методом

procedure PaintWindow(DC: HDC); override

после получения сообщения WM_PAINT.

 

 

Сайт рассылки Здесь

Так же можете посетить несколько сайтов для заработка в Интернете:

Hit&Host

 

Raskrutim.ru

 

WmSearch

 


В избранное