Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Сетевой адаптер: осваиваем Интернет" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Все, что вы не знали, но хотели бы узнать о Delphi №15
Выпуск №16 Раздел: Язык Программирования Delphi
Подраздел: RTL Delphi (краткий справочник) Вот и подошел к концу раздел Язык Программирования Delphi. И по итогам голосования, хотя и немногочисленного, но почти единогласного, был выбран следующий раздел: Базы данных. Тех, кому это не нравится прошу не расстраиваться и дождаться следующего раздела, а пока довольствоваться базами данных и умножать свои программистские способности.
Внимание: обновлен список возможных разделов! Уважаемый подписчик, О чем будет следующий раздел - решать вам. Варианты: VCL Системные функции и Winapi Базы данных Работа с файловой системой Репортинг, работа с принтером Работа с сетью, Интернетом, протоколами Работа с графикой, мультимедиа NEW! Математика, алгоритмы Форматы
файлов, данных. Конвертация форматов Ваши предложения высылайте на В этом выпуске:
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 Отсекает дробную часть числа.
Класс 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 Многофункциональный класс, предназначенный для хранения текстовых строк и связанных с ними объектов (любых потомков 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, определены дополнительно полезные методы и свойства: 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 — после последнего.
Оформил: 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;
В конструкторах потомков это объявление может перекрываться, но при необходимости вызвать конструктор предка используется оператор 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 Name: string): Boolean; позволяет определить, является ли данный объект того типа, имя которого передано в параметре Name. В случае положительного ответа функция возвращает True. Как известно, программирование для Windows основано на событиях. Каждое приложение и каждый программный объект должны уметь реагировать на сообщение о событиях и, в свою очередь, рассылать сообщения. В выполнении этих операций заключается третья общая для всех объектов функция. Метод procedure Dispatch(var Message); virtual; осуществляет обработку сообщений, поступающих объекту. Он определяет, сможет ли объект обработать сообщение при помощи собственных обработчиков событий. В случае отсутствия таких методов сообщение передается аналогичному методу Dispatch класса-предка (если он есть). Класс TObject имеет предопределенный обработчик событий: procedure DefaultHandler(var Message); virtual; Кроме рассмотренных здесь методов, класс TObject имеет еще несколько методов, которые в основном применяются для взаимодействия объекта со средой разработки. В целом класс TObject может служить для создания на его основе некоторых простых классов для использования в приложениях.
"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: string; dynamic; Он возвращает имя объекта для передачи его в Инспектор объектов. Для взаимодействия с потоками при загрузке и сохранении компонентов предназначен следующий метод: procedure DefineProperties(Filer: TFiler); virtual; Класс TPersistent никогда не используется напрямую, от него порождаются потомки, которые должны уметь передавать другим объектам значения своих свойств, но не являться при этом компонентами.
Оно содержит имя экземпляра компонента, которое используется для идентификации компонента в приложении. Примечание Тип 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 имеет все для использования в качестве предка, для создания собственных невизуальных компонентов.
Класс 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..63] of 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 предназначен для создания на его основе нестандартных оконных элементов управления. Процесс визуализации в нем упрощен за счет использования специального класса TCanvas, инкапсулирующего канву (см. гл. 11). Доступ к канве осуществляется через свойство property Canvas: TCanvas; Отрисовка элемента управления осуществляется методом procedure PaintWindowfDC: HDC); override; после получения сообщения WM_PAINT. Возможности этого класса унаследовали классы TPanel, TGroupBox, TStringGrid и т. д.
Класс TGraphicControl предназначен для создания на его основе визуальных компонентов, не получающих фокус в процессе выполнения приложения. Так как непосредственным предком класса является класс TControl, то потомки TGraphicControl умеют реагировать на управляющие воздействия мышью. Наглядный пример элемента управления, которому не нужно получать фокус, — это компонент TLabel, предназначенный для отображения текста, или компонент Timage, предназначенный для визуализации изображений. Для визуализации элементов управления на основе этого класса используется канва, инкапсулированная в классе TCanvas. Доступ к канве осуществляется через свойство property Canvas: TCanvas; Отрисовка элемента управления осуществляется методом procedure PaintWindow(DC: HDC); override; после получения сообщения WM_PAINT.
Сайт рассылки Здесь Так же можете посетить несколько сайтов для заработка в Интернете: |
В избранное | ||