Компоненты Delphi


Delphi

Pascal

Ссылки


Поиск

Гостевая



Класс 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; Упаковывает список, сдвигая элементы к началу на пустующие места.

Наконец, если приведенных методов почему-либо недостаточно, то свойство
(RC; property List: pPointerList;
pPointerList = ^TPointerList;
TPointerList = array[0..65520 div SizeOf(Pointer)] of Pointer;
возвращает указатель непосредственно на список указателен ((ко) означает, что свойство доступно только для чтения).
2Л3.2. Класс TStrings
Многофункциональный класс, предназначенный для хранения текстовых строк и связанных с ними объектов (любых потомков TObject). TStrings - абстрактный класс; он только описывает методы работы с наборами строк и сопутствующих им объектов, но как именно они хранятся, на его уровне не определено. Его потомки очень многочисленны; они играют основную роль в компонентах-списках (TListBox, TComboBox), редакторе (TMemo) и других. Так что вам чаще всего придется иметь дело с TStrings как со свойством одного из компонентов. В дальнейшем экземпляры этого класса и порожденных от него классов мы-будем называть наборами строк. Для создания собственных наборов строк вне компонентов предназначен потомок TStrings - TStringList, который будет рассмотрен ниже.
К строкам и объектам соответственно можно получить доступ через свойства:
property Strings[Index: Integer]: string;
property Objects[Index: Integer]: TObject;
Первое из них является векторным свойством, принимаемым по умолчанию. Общее количество пар в списке равно значению свойства:
(Ro'l 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: T'Persisier-t l ; Уничтожает прежнее содержимое набора и подставляет вместо него Source, если источник имеет тип TStrings. В противном случае возникает исключительная ситуация EConvertError.

При этом метод
function GetText: PChar;
выгружает строки в единый массив, где они разделены парами символов CR/LF; в конце такого массива ставится нулевой байт. Размер массива не может превышать 65520 байт; поэтому строки выгружаются до тех пор, пока их суммарная длина не превосходит этого значения.
Метод
procedure SetText(Text: PChar);
читает строки из массива Text. Строки в массиве должны быть отделены друг от друга парой символов CR/LF; допускается и один символ LF (16-ричный код $ОА). Символы с кодами 0, $lA(<Ctrl>+<Z>) воспринимаются как конец текста. При этом прежнее содержимое набора уничтожается.
2.13.3. Класс 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;
(Ro) 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;
2.14. Справочник по функциям Delphi
В этом разделе мы приведем справочную информацию по функциям, имеющимся в библиотеке времени выполнения Delphi. Они сгруппированы по областям применения. Не рассматриваются:
o функции, содержащиеся в модуле SYSTEM и составляющие неотъемлемую часть самого языка Паскаль. Они не изменялись фирмой Borland уже на протяжении многих версий, и приводить их здесь нет необходимости;
o некоторые функции, относящиеся к тем или иным компонентам и описанные в главе 3 вместе с ними.
Большинство упомянутых здесь функций сосредоточено в модуле SYSUTILS. Для функции, которая относится к другому модулю, приведено его имя.
2.14.1. Функции работы со строками
В Delphi вынужденно уживаются два стандарта работы со строковыми данными. Первый из них, когда длина строки записывается в ее первом байте, традиционен для Паскаля. Ему соответствует тип данных string. Другой подразумевает, что строка заканчивается нулевым символом. Такие строки имеют тип PChar и применяются в основном при обращении к функциям API Windows.
Естественно, для выполнения операций со строками этих типов нужно предусмотреть два различных набора функций, которые и описаны ниже.
Первая таблица содержит функции для работы с типом string. Все перечисленные в ней функции находятся в модуле SYSUTILS.

function NewStrtconst S: String): PString; Создает копию строки S и возвращает указатель на нее.
procedure DisposeStr(P: PString) ; Уничтожает строку, на которую указывает Р.
procedure AssignStr(var P: PString; const S: strings- Уничтожает строку, на которую указывает Р и затем присваивает ему адрес созданной копии строки S.
procedure AppendStrfvar Dest: string; const S: string); Добавляет строку S в конец строки Dest.
function Uppercase(const S: string): string; Преобразует символы 'a'..'z' в строке S к верхнему регистру.
function LowerCase(const S: string): string; Преобразует символы 'A'..'Z' в строке S к нижнему регистру.
function CompareStr(const SI, S2: string): Integer; Сравнивает две строки S1 и S2 с учетом регистра символов. Возвращаемое значение равно 0 в случае равенства строк или разности кодов пары первых несовпадающих символов.
function CompareText(const SI, S2: string): Integer; Сравнивает две строки без учета регистра символов.
function AnsiUpperCase(const S: string): string; Преобразует символы в строке к верхнему регистру с учетом языкового драйвера.
function AnsiLowerCase(const S: string) : string; Преобразует символы в строке к нижнему регистру с учетом языкового драйвера.
function AnsiCompareStr(const SI, S2: string): Integer; Сравнивает две строки с использованием языкового драйвера и с учетом регистра символов.
function AnsiCompareText(const SI, S2 : string) : Integer; Сравнивает две строки с использованием языкового драйвера и без учета регистра символов.
function IsValidldent(const Ident: string): Boolean; Возвращает True, если строка Ident может служить идентификатором в программе на Object Pascal (т. е. содержит только буквы и цифры, причем первый символ - буква).
function IntToStr(Value: Longint): string; Преобразует целое число в строку.
function IntToHex(Value: Longint; Digits: Integer): s t r ing ; Преобразует целое число в строку с его шестнадцатиричным представлением.
function StrToInt(const S: string): Longint; Преобразует строку в целое число. При ошибке возникает исключительная ситуация EConvertError.

function StrToIntDef(const S: string; Default; Longint): Longint ; Работает как StrToInt, но при ошибке возвращает значение Default.
function LoadStr(Ident: Word) : string; Загружает строку с индексом Ident из ресурсов приложения.
function FmtLoadStr(Ident: Word; const Args: array of const): string; Загружает строку с индексом Ident из ресурсов приложения с форматированием (см. описание функции Format).

Следующая таблица содержит функции для работы со строками типа PChar (также находятся в модуле SYSUTILS):
function StrLIComp(Strl, Str2: PChar; MaxLen: Cardinal) : Integer; Работает как StrLComp, но без учета регистра символов.
function StrScantStr: PChar; Chr: Char) : PChar; Отыскивает первое вхождение символа Chr в строку Str и возвращает указатель на него или nil в случае отстутствия.
function StrRScanfStr: PChar; Chr: Char) : PChar; Работает как StrScan, но отыскивается последнее вхождение Chr.
function StrPos(Strl, Str2: PChar) : PChar; Отыскивает первое вхождение строки Str2 в строку Strl и возвращает указатель на нее или nil в случае отстутствия.
function StrUpperfStr: PChar) : PChar; Преобразует строку к верхнему регистру.
function StrLower(Str: PChar): PChar; Преобразует строку к нижнему регистру.
function StrPaslStr: PChar): String; Преобразует строку Str в строку типа string.
function StrAlloc(Size: Cardinal): PChar; Размещает в куче памяти новую строку размером Size и возвращает указатель на нее.
function StrBufSize(Str: PChar): Cardinal; Возвращает размер блока памяти, выделенного для строки при помощи функции StrAlloc.
function StrNewfStr: PChar): PChar ; Размещает в куче памяти копню строки Str и возвращает указатель на нее.
procedure StrDispose(Str: PChar); Уничтожает строку, размещенную при помощи StrAlloc или StrNew.

function StrLenfStr: PChar): Возвращает число символов в строке Str (без учета завершающего нулевого).
function StrEndfStr: PChar): PChar; Возвращает указатель на завершающий нулевой символ строки Str.
function StrMove(Dest, Source: PChar; Count: Cardinal): PChar; Копирует из строки Source в строку Dest ровно Count символов, причем строки могут перекрываться.
function StrCopy(Dest, Source: PChar): PChar; Копирует Source в Dest и возвращает указатель на Dest.
function StrECopy(Dest, Source: PChar): PChar; Копирует Source в Dest и возвращает указатель на завершающий символ Dest.
function StrLCopy(Dest, Source: PChar; MaxLen: Cardinal): PChar; Работает как StrCopy, но копирует не более MaxLen символов.
function StrPCopy(Dest: PChar; const Source: String): PChar; Копирует строку Source (типа string) в Dest и возвращает указатель на Dest.
function StrPLCopy(Dest: PChar; const Source: string; MaxLen: Cardinal): PChar; Работает как StrPCopy, но копирует не более MaxLen символов.
function StrCat(Dest, Source: PChar): PChar; Дописывает Source к концу Dest и возвращает указатель на Dest.
function StrLCatfDest, Source: PChar; MaxLen: Cardinal) : PChar; Работает как StrCat, но копирует не более MaxLen-StrLen(Dest) символов.
function StrCoirip(Strl, Str2: PChar): Integer; Сравнивает две строки (посимвольно). Возвращает значение: <0 - при Strl <Str2, 0 - при Strl =Str2, >0 - при Strl >Str2.
function StrIComp(Strl, Str2: PChar): Integer; Работает как StrComp, но без учета регистра символов.
function StrLComp(Strl, Str2: PChar; MaxLen: Cardinal): Integer; Работает как StrComp, но сравнение происходит на протяжении не более чем MaxLen символов.

Функции работы с файлами
Эта часть библиотеки претерпела изменения в Delphi. К функциям, которые работали с файлом через файловую переменную, добавились функции, работающие с дескриптором файла. Они рассматривают файл как двоичный; с текстовыми файлами нужно работать "по старинке".
Файловые функции, описанные в модуле SYSUTILS, приведены в таблице:
function File0pen(const FileName: string; Mode: Word) : Integer; Открывает существующий FileName файл в режиме Mode (см. примеч. 1). Значение, возвращаемое в случае успеха, - дескриптор открытого файла. В противном случае - код ошибки DOS.
function FileCreate(const PileName: string): Integer; Создает файл с именем FileName. Возвращает то же, что и FileOpen.
function FileRead(Handle: Integer; var Buffer; Count: Longint): Longint; Считывает из файла с дескриптором Handle Count байт в буфер Buffer. Возвращает число реально прочитанных байт или -1 при ошибке.

function FileWrite(Handle: Integer; const Buffer; Записывает в файл с дескриптором Handle Count байт из буфера Buffer. Возвращает число реально записанных байт или -1 при ошибке.
function FileSeek(Handle: Integer; Offset: Longint; Origin: Integer): Longint; Позиционирует файл с дескриптором Handle в новое положение. При Origin = 1,2,3 положение смещается на Offset байт от начала файла, текущей позиции и конца файла соответственно. Возвращает новое положение или -1 при ошибке.
procedure FileClose(Handle: Закрывает файл с дескриптором Handle.
function FileAge(const Возвращает значения даты и времени создания файла или -1, если файл не существует.
function FileExists(const Возвращает True если файл FileName существует к найден.
function FindFirst(const Path: string; Attr: Integer; var SearchRec: TSearchRec): Integer; Ищет первый файл, удовлетворяющий маске поиска, заданной в Path и с атрибутами Attr (см. примеч. 2). В случае успеха заполняет запись SearchRec (см. примеч. 3) и возвращает 0, иначе возвращает код ошибки DOS.
function FindNext(var SearchRec: TSearchRec): Integer; Продолжает процесс поиска файлов, удовлетворяющих маске поиска. Параметр SearchRec должен быть заполнен при помощи FindFirst. Возвращает 0, если очередной файл найден, или код ошибки DOS. Изменяет SearchRec.
procedure FindClose(var Завершает процесс поиска файлов, удовлетворяющих маске поиска.
function FileQetDate(Handle: Integer) : Longint; Возвращает время создания файла с дескриптором Handle (в формате DOS) или -1, если дескриптор недействителен.
procedureFileSetDate(Handle: Integer; Устанавливает время создания файла с дескриптором Handle (в формате DOS).
function FileGetAttr(const FileName: string): Integer; Возвращает атрибуты (см. примеч. 2) файла с именем FileName или код ошибки DOS, если файл не найден.
function FileSetAttrtconst FileName: string; Attr: Устанавливает атрибуты файла с именем FileName.
function DeleteFile(const Уничтожает файл с именем FileName и в случае успеха возвращает True.
function RenameFile(const OldName, NewName: string): Boolean; Переименовывает файл с именем OldName в NewName и возвращает True в случае успеха.


function ChangeFileExt(const FileName, Extension: string): string; Изменяет расширение в имени файла FileName на Extension и возвращает новое значение FileName. Имя файла не изменяется.
function ExtractFilePath(const FileName: string): string; Извлекает из строки с полным именем файла FileName часть, содержащую путь к нему.
function ExtractFileName(const FileName: string): string; Извлекает из строки с полным именем файла FileName часть, содержащую его имя и расширение.
function ExtractFileExt(const FileName: string): string; Извлекает из строки с полным именем файла FileName часть, содержащую его расширение.
function ExpandFileName(const FileName: string): string; Возвращает полное имя файла FileName, добавляя при необходимости путь к нему и переводя все символы в верхний регистр.
function FileSearch(const Name, DirList: string): strings- Производит поиск файла с именем Name в группе каталогов, заданных параметром DirList. Имена каталогов должны отделяться друг от друга точкой с запятой. Возвращает в случае успеха полное имя файла или пустую строку, если файл не найден.
function DiskFree(Drive: Byte): Longint; Возвращает количество в байтах свободного места на заданном диске. Значение параметра Drive: 0 - для текущего диска, 1 - для А, 2 - для В и т. д. Если параметр неверен, функция возвращает -1.
function DiskSize(Drive: Byte): Longint; Возвращает размер диска Drive в байтах. Параметр Drive означает то же, что и в DiskFree.
function FileDateToDateTime(FileDate: Longint): TDateTime; Преобразует дату и время в формате DOS в принятый в Delphi формат TDateTime.
function DateTimeToFileDate(DateTime: TDateTime): Longint; Преобразует дату и время из формата TDateTime в формат DOS.

Примечания:
1. Допустимы следующие режимы открытия файлов:
*
Режим Значение Что означает
fmOpenRead $0000 Открыть только для чтения.
fmOpenWrite $0001 Открыть только для записи.
fmOpenReadWrite $0002 Открыть для чтения и записи.
fmShareCompat $0000 Обеспечить совместимость со старой моделью доступа к файлам.

Режим Значение Что означает
fmShareExclusive $0010 Запретить другим доступ к файлу.
fmShareDenyWrite $0020 Запретить другим запись в файл.
fmShareDenyRead $0030 Запретить другим чтение файла.
fmShareDenyNone $0040 Разрешить другим все виды доступа.

2. Файлы могут иметь следующие атрибуты:
faReadOnly = $01;
faHidden = $02;
faSysFile = $04;
faVolumeID = $08;
faDirectory = $10;
faArchive = $20;
faAnyFile = $3F;
3. Формат структуры TSearchRec таков:
TSearchRec = record
Fill: array[1..21] of Byte;
Attr: Byte;
Time: Longint;
Size: Longint;
Name: string[12] ;
end;
Приведем типовой вариант организации групповой обработки файлов при помощи функций FindFirst, FindNext и FindClose. В нем в список добавляются имя и длина всех файлов в каталоге с именем CADELPHI:
var SearchRec: TSearchRec;
I : Integer;
List : TStringList;
begin
List := TStringList.Create;
I := FindFirst('c:\delphi\*.*', faAnyFile, SearchRec);
while I = 0 do begin
List.Add(Format (' File %s has length %d bytes ', [SearchRec.Name, SearchRec.Size])) ;
I := FindNext(SearchRec);
end;
FindClose(SearchRec) ;
List.Free;
end;
При поиске файла наиболее вероятным является код ошибки -18 (файл не найден).
Процедура FindClose не делает ничего в 16-разрядной версии Delphi, однако будет играть роль в 32-разрядной. Употреблять ее следует из соображений переносимости приложений.
4 Ряд "старых" функций переименованы: это связано с появлением одноименных методов у объектов. Теперь вместо Assign следует употреблять AssignFile, вместо Close - CloseFile. Старые имена поддерживаются ддя совместимости, но могут вызвать проблемы при одновременном употреблении с именами методов.
2.14.3. Функции форматирования строк
Еще со времен языка FORTRAN у программистов появилась необходимость форматировать строки, направляемые на устройства вывода. Требовался легкий способ для того, чтобы не просто преобразовать число в строку, но также объединить эту строку с другими и включить ее в состав целого предложения.
В Delphi существует группа функций форматирования строк. Их рассмотрение начнем с наиболее часто встречающегося представителя - функции Format:
function Format (const Format: string; const Args: array of const) : string;
Первым параметром функции выступает форматирующая строка. Это - обычная текстовая строка, но в ней на нужных местах стоят специальные символы, которые определяют, какие и как туда будут подставлены параметры.
Второй параметр функции Format называется списком аргументов. Он и содержит "вставляемые" в форматирующую строку параметры. Обратите внимение, что этот открытый массив имеет тип array of const. и в нем может передаваться переменное число разнотипных параметров. Например, после выполнения
S := FormatC Product %s , version %d.%d', [ 'Borland Delphi' , 1, 0]);
строке S будет присвоено o Product Borland Delphi , version 1.0'. Рассмотрим подробнее правила, по которьм составляется форматирующая строка.
"Специальные" места в ней называются спецификаторами формата и представляют собой следующие конструкции
"%" [index":"] ["-"I [width] ["."prec] type
где обозначены:
o символ -%", с которого начинаются все спецификаторы формата (обязательный);
o поле индекса аргумента [ index " : " ] (необязательное);
o признак выравнивания по левому краю ["-"I (необязательный);
o поле ширины [width] (необязательное);
o поле точности [ - . - prec ] (необязательное);
o символ типа преобразования type (обязательный).
Каждый спецификатор формата соответствует как минимум одному из элементов списка аргументов и определяет, как именно рассматривать его и преобразовывать в строку.
Функция Format поддерживает следующие символы типа преобразования:
Символ Тип Что означает
d Десятичный Элемент должен быть целым числом и преобразуется в строку десятичных цифр. Если при символе есть поле точности, то в выходной строке будет минимум ргес цифр; если при преобразовании числа их потребуется меньше, то строка дополняется слева нулями.
х Шестнадцатиричный Как тип d, но элемент преобразуется в строку шестнадцатиричных цифр.
е Научный Элемент должен быть числом с плавающей точкой. Он преобразуется к нормализованному виду -d.dddE+ddd. Перед десятичной точкой всегда находится одна цифра (при необходимости, с минусом). После символа "Е" идет показатель степени, имеющий знак и состоящий не менее чем из 3 цифр. Общее число символов в представлении числа определяется полем ргес (по умолчанию 15).
f Фиксированный Элемент должен быть числом с плавающей точкой. Он преобразуется к виду -ddd.ddd. Поле ргес означает количество цифр после десятичной точки (по умолчанию 2).
д Обобщенный Элемент должен быть числом с плавающей точкой. Он преобразуется к одному из двух вышеперечисленных видов - выбирается тот, который обеспечивает более короткую запись. Если требуемое число цифр слева от десятичной точки меньше значения поля ширины и само число больше 10" , применяется фиксированный тип. Удаляются все впереди идущие нули, десятичная точка (при возможности), а также символы, разделяющие строку на группы по три цифры.
п m Числовой Денежный Совпадает с типом f за исключением того, что после каждой группы из трех цифр ставятся разделительные символы:d,ddd, ddd.ddd....Элемент должен быть числом с плавающей точкой, отражающей денежную сумму. Способ ее представления зависит от значений глобальных констант, определенных в модуле SYSUTILS (см. ниже). В свою очередь, они зависят от настройки Windows на обозначения, принятые в данной стране.
Р Указатель Элемент должен быть указателем. На выходе он будет представлять из себя строку шестнадцатиричных цифр видаХХХХ: YYYY, где ХХХХ - селектор, YYYY - смещение.
s Строка Элемент может иметь тип string, PChar или быть отдельным символом (Char). Эта строка (или символ) вставляются вместо спецификатора формата. Если присутствует поле ргес и длина строки больше его значения, то она усекается.

Примечания:
1. Форматирующие символы можно задавать как в верхнем, так и в нижнем регистрах.
2. Тип преобразования m (денежный) тесно связан с правилами представления, принятыми в конкретной стране. Для этого в модуле SYSUTILS определены значения ряда типизированных констант, начальные значения которых берутся из секции [Inti] файла WIN.INI. Вы можете изменять их значения в соответствии с вашими потребностями:
Имя и тип Что означает
CurrencyString: string[7]; Символ (или символы), добавляемые к строке с представлением денежной суммы и обозначающие национальную денежную единицу. Это может быть, например, '$', 'DM' или 'руб'.
CurrencyFormat: Byte; Определяет способ добавления знака денежной единицы к строке. Число 1 будет преобразовано так в зависимости от значения этого параметра: '$!' при 0; '1$' при 1; '$ Г при 2; '1 $' при 3.
NegCurrFormat: Byte; Определяет способ добавления знака денежной единицы и минуса к строке в том случае, если происходит преобразование отрицательного числа (к положительным числам отношения не имеет). Число -1 будет преобразовано так в зависимости от значения этого параметра: '($!)' при 0; '-$!' при 1; '$-1' при 2; '$!-' при 3; '(!$)' при 4; '-!$' при 5; 'i-$' при 6; '!$-' при 7; '-1 $' при 8; '-$ Г при 9; '$ 1-' при 10.
CurrencyDecimals: Byte; Число знаков после запятой в представлении денежных сумм. Например, число 10.15 при разных значениях этого параметра отобразится так: '$10' при 0, '$10.15' при 2, '$10.1500' при 4.
ThousandSeparator: Char; Символ, разделяющий строку на группы по три цифры справа налево (разделитель тысяч). Применяется, в частности, в типе преобразования п.
DecimalSeparator: Char; Символ, отделяющий дробную часть числа от целой.

Мы закончили рассмотрение символа типа преобразования. Рассмотрим остальные составные части спецификатора формата.
Поле ширины устанавливает минимально допустимое количество символов в преобразованной строке. Это означает, что если она короче, чем задано в этом поле, то происходит добавление пробелов до требуемого количества. По умолчанию пробелы добавляются спереди (выравнивание по правому краю), но признак выравнивания по левому краю ("-"; он должен стоять перед полем ширины) позволяет выравнивать строку по-иному.
Поле индекса позволяет динамически изменить последовательность извлечения аргументов из массива. Обычно аргументы извлекаются последовательно, по мере их востребования спецификаторами формата. Поле индекса означает, что следующим нужно извлечь аргумент с данным индексом. Пользуясь индексом, одни и те же аргументы могут быть использованы многократно. Например, вызов Format ( ' %s %s %0 : s %s ', [ 'Yes', 'No' ] ) Даст на выходе строку 'Yes No Yes No'.
Поле точности играет разную роль в зависимости от того, с каким типом преобразования применяется. Его особенности приведены вместе с описанием типа (с теми из них, где оно имеет смысл).
Поля индекса, ширины и точности могут быть заданы напрямую или косвенно. Первый способ подразумевает явное указание значения поля (например, ' %10 . 5f '). Для косвенного задания значений нужно в соответствующих местах цифры заменить звездочками (например, '%*.*f'). В этом случае вместо звездочек будут подставлены следующие значения из списка аргументов (они обязательно должны быть целыми числами). Например, выражение
Format('Value is %*.*',[10,5, 2.718]);
эквивалентно:
Format('Value is %10.5',[2.718]);
Как уже упоминалось, наиболее употребимой функцией из группы форматирующих является Format, которая работает со строками типа string и максимально освобождает программиста от рутинной работы. Другие функции используют то же ядро и правила преобразования, но отличаются параметрами:
procedure FmtStr(var Result: string; const Format: string; const Args: array of const); To же, что и Format, но оформлено в виде процедуры. Результат преобразования возвращается в параметре Result.
function StrFmt(Buffer, Format: PChar; const Args: array of const): PChar; Форматирующая строка должна находиться в параметре Format, а результирующая помещается в буфер Buffer (он должен иметь нужную длину). Функция возвращает указатель на Buffer.
function StrLFmt(Buffer: PChar; MaxLen: Cardinal; Format: PChar; const Args: array of const) : PChar; Работает как StrFmt, но длина результирующей строки не будет превышать MaxLen символов.
function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const) : Cardinal; Форматирующая строка находится в буфере Format длиной FmtLen, a результирующая - в буфере Buffer длиной BufLen. Функция возвращает число реально помещенных в Buffer символов, причем оно всегда меньше или равно BufLen.

Функции преобразования чисел с плавающей точкой
Преобразование числа с плавающей точкой (далее в этом разделе просто числа) в текстовую строку и обратно всегда было достаточно сложной задачей. Для ее решения в Delphi есть функции сразу трех уровней сложности.
Первый - самый простой - представлен функцией FloatToStr:
function FloatToStr oo-oo-alue : Extended): string;
Число, заданное параметром Value, преобразуется в возвращаемую функцией строку. Формат преобразования соответствует типу преобразования g функции Format, причем длина выходной строки принимается равной 15 символам.
Больше возможностей для управления форматом вывода дает функция:
function PloatToStrF(Value: Extended; Format:
TFloatFormat; Precision, Digits: Integer): string;
Здесь Value - преобразуемое значение, Format - один из предопределенных форматов. Хотя этот параметр имеет тип TFloatFormat, он имеет очень много общего с типами преобразований в функции Format (ссылки на них есть в предлагаемой таблице). Параметр Precision задает общее число символов в выходной строке и не должен превышать 7 для фактического параметра типа Single, 15 - для Double и 18 - для Extended. Digits - это параметр, интерпретируемый в зависимости от значения параметра Format:
ffExponent Научный формат, соответствует типу е. Precision задает общее число символов, Digits - число знаков в показателе экспоненты {0-4).
ffFixed Формат с фиксированной точкой; соответствует типу f. Precision задает общее число символов, Digits - число знаков после запятой (0-18). Если значение Precision мало для представления числа, используется научный формат.
ffGeneral Обобщенный формат, соответствует типу д (см. описание функции Format).
ffNumber Отличается от fTFixed наличием символов-разделителей тысяч (см. тип преобразования п).
ffCurrency Соответствует типу преобразования т. Параметр Digits задает число символов после десятичной точки в выходной строке (0-18).

В случае, когда в функцию переданы значения Value, соответствующие особым случаям сопроцессора ("не-число", плюс и минус бесконечность), она возвращает соответственно строки 'NAN', 'INF' и '-INF'.
Наконец, возможность полного управления форматом предоставляет функция FormatFloat:
function FormatFloat(const Format: string; Value: Extended): string;
Она преобразует число в строку в соответствии со спецификатором формата, содержащимся в параметре Format. Правила его задания следующие:
0 Поле для цифры. Если форматируемая величина имеет в этой позиции цифру, то вставляется она, в противном случае вставляется 0.
# Поле для цифры. Если форматируемая величина имеет в этой позиции цифру, то вставляется она, в противном случае ничего не вставляется.

Поле для десятичной точки. Сюда вставляется символ, определенный константой DecimalSeparator.
; Поле для разделителя тысяч. Оно означает, что группы по три цифры, считая влево от десятичной точки, будут разделяться специальным символом (он задан константой ThousandSeparator). Местоположение поля может быть произвольным.
Е+, Е-, е+, е- Признаки представления числа в научном формате. Появление любого из этих аргументов означает, что число будет преобразовано с характеристикой и мантиссой. Вставка нулей после такого аргумента позволяет определить ширину мантиссы. Разница между Е+, е+ и Е-, е-в том, что в первых двух случаях ставится "+" при выводе положительных чисел.
'хх' "хх" Символы, заключенные в обычные или двойные кавычки, напрямую включаются в выходную строку.
; Разделяет спецификаторы формата для положительных, отрицательных и нулевых чисел.

Примечания:
1. Число всегда округляется до той точности, которую позволяет заданное программистом количество полей для размещения цифр ('0' и '#').
2. Если у преобразуемого числа слева от десятичной точки получается больше значащих цифр, чем задано полей для их размещения, то цифры все равно добавляются в строку. Если полей недостаточно справа от точки, происходит округление.
3. Символ ';' позволяет задать три разных формата вывода для чисел с разным знаком. При различном количестве форматов они применяются следующим образом:
o один: применяется для всех чисел;
o два: первый применяется для чисел, больших или равных нулю, второй - для отрицательных;
o три: первьш применяется для положительных, второй - для отрицательных чисел, третий - для нуля.
Если форматы для отрицательных чисел или нуля пусты, применяется формат для положительных чисел.
Если пуст формат для положительных чисел или спецификатор формата вообще не задан (пустая строка), то числа форматируются согласно обобщенному формату (как в функции FloatToStr). Такое форматирование применяется также в случае, если число значащих цифр слева от десятичной точки превысило 18 и не задан научный формат.
Применение спецификатора иллюстрируется в таблице на примере преобразования четырех чисел:
Спецификатор 1234 -1234 0.5 0
0 1234 -1234 1 0
0.00 1234.00 -1234.00 0.50 0.00
#.## 1234 -1234 .5
#.##0.00 1,234.00 -1,234.00 0.50 0.00
#,##0.00;(#,##0.00) 1,234.00 (1,234.00) 0.50 0.00
#,##0.00;;Zero 1,234.00 -1,234.00 0.50 Zero
О.ОООЕ+00 1.234Е+03 -1.234Е+03 5.000Е-01 О.ОООЕ+00
#.###Е-0 1.234ЕЗ -1.234ЕЗ 5Е-1 ОЕО

Две следующие функции применяют те же правила, что и рассмотренные выше функции, но отличаются параметрами:
function FloatToText(Buffer: PChar; Value: Extended; Format: TFloatFormat; Precision, Digits: Integer) : Integer; Соответствует FloatToStrF, но выходная строка помещается в буфер Buffer (без начальной длины!), а число символов в ней возвращается самой функцией.
function FloatToTextFmt(Buffer: PChar; Value: Extended; Format: PChar): Integer; Соответствует FormatFloat, но выходная строка помещается в буфер Buffer (без начальной длины!), а число символов в ней возвращается самой функцией.

Наконец, процедура:
procedure FloatToDecimal(var Result: TFloatRec; Value: Extended; Precision, Decimals: Integer); Производит подготовительный анализ преобразуемого числа, занося в поля записи Result различные его характеристики.

Перейдем к рассмотрению функций преобразования текстовой строки в число. Их две - соответственно для строк типа string и PChar:
function StrToPloat(const S: string): Extended;
function TextToFloat(Buffer: PChar; var Value: Extended): Boolean;
Общие правила для передаваемой в функцию строки таковы:
o допускаются как научный, так и фиксированный форматы;
o в качестве десятичной точки должен выступать символ, который содержится в DecimalSeparator;
o не допускаются символы-разделители тысяч (ThousandSeparator), а также символы обозначения денежньк единиц.
В случае ошибки преобразования функция StrToFloat генерирует исключительную ситуацию EConvertError, a TextToFloat - возвращает значение False.
Функции работы с датами и временем
В Delphi для хранения дать! и (или) времени предусмотрен формат TDateTime, представляющий собой, на самом деле, обычное число с плавающей точкой.
При этом дата представляется целой частью числа, а время - дробной. Преимущество этого подхода в том, что теперь дать! и времена можно корректно складывать и вычитать, например:
var StartTime: tDateTime;
procedure TFormI.PormCreate(Sender: TObject);
begin
StartTime := Now;
end;
procedure TFormI.FormClick(Sender: TObject);
begin
Labell.Caption := 'Co времени запуска прошло' +
DateTimeToStr(Now - StartTime);
end;
Функции этой группы приведены в таблице:
function EncodeDate(Year, Month, Day: Word): TDateTime; Преобразует дату, заданную раздельно годом, месяцем и днем, в формат TDateTime. Если они выходят за допустимые пределы, возникает ИС EConvertError.
procedure DecodeDatefDate: TDateTime; var Year, Month, Day: Word); Преобразует дату в виде TDateTime к раздельным составляющим: году, месяцу и дню.
function EncodeTimefHour, Min, Sec, MSec: Word):TDateTime; Преобразует значение времени, заданное часом, минутой, секундой и миллисекундой в формат TDateTime.
procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word) ; Преобразует значение времени в формате TDateTime в раздельные составляющие: час, минуту, секунду и миллисекунду.
function DayOfWeektDate: TDateTime): Integer; Возвращает номер текущего дня недели от 1 (воскресенье) до 7 (суббота).
function Date: TDateTime; Возвращает текущую дату.
function Time: TDateTime; Возвращает текущее время.
function Now: TDateTime; Возвращает текущие дату и время.
function DateToStr(Date: TDateTime): string; Преобразует дату Date в текстовую строку.
function TimeToStr(Time: TDateTime): string; Преобразует время из типа TDateTime в текстовую строку.
function DateTimeToStr(DateTime: TDateTime): string; Преобразует дату и время из типа TDateTime в текстовую строку.

function StrToDatefconst S: string): TDateTime; Преобразует текстовую строку в дату типа TDateTime. Строка должна содержать два или три числа, разделенных символом, содержащимся в DateSeparator. Формат даты в строке определяется в соответствии со значением переменной ShortDateFormat.
function StrToTime(const S: string): TDateTime; Преобразует текстовую строку S в значение времени. Должен использоваться формат HH:NN:SS, где SS - может принимать значения 'AM' или ТМ', иначе означает секунды. Если необходимо получать время в 24-х часовой шкале, то элемент SS формата опускается. Если преобразование невозможно, возникает ИС EConvertError.
functionStrToDateTime(const S: string): TDateTime; Преобразует текстовую строку S в дату и время в формате MM/DD/YY HH:NN:SS (элемент SS см. выше).
function FormatDateTime(const Format: string; DateTime: TdateTime): string; Преобразует дату и время из типа TDateTime в текстовую строку, используя формат, задаваемый параметром Format (см. примеч. 1).
procedure DateTimeToStringfvar Result: string; const Format: string; DateTime: TDateTime); Преобразует дату и время типа TDateTime в строку Result, используя формат, передаваемый параметром Format (см. примеч. 1).

Примечания:
1. Правила задания спецификатора формата для даты и времени отличаются от рассмотренных выше. В первую очередь надо иметь в виду то, что функции вроде FormatDateTime оперируют над одним значением TDateTime, а спецификаторы формата извлекают из него те или иные составные части. При этом могут использоваться:
с Отображает дату, используя формат ShortDateFormat, затем отображается время в формате LongTimeFormat. Время не отображается, если дробная часть переменной DateTime нулевая.
d Отображает число месяца без нуля в левом разряде (1-31).
dd Отображает число месяца с нулем в левом разряде (01-31).
ddd Отображает день недели в соответствии с сокращенными именами из переменной ShortDayNames.
dddd Отображает день недели в соответствии с полными именами из переменной LongDayNames.
ddddd Отображает дату в соответствии с форматом ShortDateFormat.
dddddd Отображает дату в соответствии с форматом LongDateFormat.
m Отображает месяц как число без нуля в левом разряде (1-12).
mm Отображает месяц как число с нулем в левом разряде (01-12).

irirnm Отображает месяц в соответствии с сокращенными именами из переменной ShortMonthNames.
П1ГПГПП1 Отображает месяц в соответствии с полными именами из переменной Long MonthN am es.
УУ Отображает год двумя цифрами.
УУУУ Отображает год четырьмя цифрами.
h Отображает час как число без нуля в левом разряде (0-23).
hh Отображает час как число с нулем в левом разряде (00-23).
n Отображает минуты как число без нуля в левом разряде (0-59).
nn Отображает минуты как число с нулем в левом разряде (00-59).
s Отображает секунды как число без нуля в левом разряде (0-59).
ss Отображает секунды как число с нулем в левом разряде (00-59).
t Отображает время в соответствии с форматом ShortTimeFormat.
tt Отображает время в соответствии с форматом LongTimeFormat.
am/pin Отображает время в 12-часовой шкале. 'AM' означает часы до полудня, 'РМ' - часы после полудня.
arnpm Отображает время в 12-часовой шкале. При этом для времени до полудня отображается содержимое переменной TimeAMString, а после полудня - TimePMString.
a/p Отображает время в 12-часовой шкале, 'а' означает часы до полудня, 'р' - часы после полудня.
/ Отображает символ - разделитель даты, содержащийся в переменной DataSeparator.
Отображает символ - разделитель времени, содержащийся в переменной TimeSeparator.
'XX'/'XX' Символы, заключаемые в простые или двойные кавычки, отображаются как есть и не подвергаются форматированию.

Например, результатом вызова функции с параметрами
FormatDateTime (' "Совещание состоится в" dddd, dirrmim, yyyy, ' + ' "в" hh:nn', StrToDateTime('12/31/95 23:55')) ;
будет строка 'Совещание состоится в среду, 31 декабря 1995 в 23:55' (естественно, если вы переопределили значения элементов массива LongMonth-Names).
2. Спецификаторы am/pm, ampm, a/p используются вместе со спецификаторами h и hh.
3. Спецификаторы могут быть указаны как в верхнем, так и в нижнем регистрах символов - это не играет роли.
4. Начальные значения всех используемых при форматировании даты и времени переменных берутся из секции [inti] файла WIN.INI.
2Л4.6. Функции для работы с памятью
Для работы с памятью Delphi предоставляет следующие функции:
function AllocMemfSize: Cardinal): Pointer; SYSUTILS Выделяет блок памяти размером Size и возвращает указатель на него. Выделенная память обнуляется.
function ReAllocMem(P: Pointer; CurSize, NewSize: Cardinal): Pointer; SYSUTILS Изменяет размер блока памяти размером CurSize, на который указывает Р. Если удается выделить блок размером NewSize, функция возвращает указатель на него. Содержимое старого блока переносится в новый. При этом, если CurSize>NewSize, часть содержимого отбрасывается, а если CurSize<NewSize, то остаток свободного места заполняется нулями.
function MemAlloc(Size: Longint): Pointer; GRAPHICS Выделяет блок размером Size. Если он меньше 64К, память выделяется в куче памяти Delphi, в противном случае - глобальная.

Память, выделенная при помощи этих функций, может быть освобождена при помощи функции FreeMem.
У компонента же определение конструктора на удивление лаконично, но в нем присутствует указатель на Owner:
constructor Create(AOwner: TComponent);
Ответ прост: Owner - тот объект, который при создании вызывает конструкторы всех объектов, владельцем которых он является, а при уничтожении - их деструкторы. Таким образом, поместив при разработке компонент на форму, вы можете не заботиться о его создании и уничтожении в программе. Все свойства таких компонентов и все связи между ними запоминаются в файле формы .DFM и при запуске приложения создаются вновь автоматически.
Деструктор компонента
destructor Destroy;
уничтожает все дочерние компоненты (вызывая их деструкторы) и вычеркивает себя из списка компонента-владельца.
Конструкторы нужно вызывать только для тех компонентов, которые создаются вами во время исполнения. При этом они получат владельца и явный вызов деструктора не понадобится. Практически все конструкторы и деструкторы описанных ниже компонентов имеют тот же вид, что приводится здесь. Поэтому в дальнейшем их описания опущены, где это возможно.
Принадлежащие компоненты оформлены в виде списка, доступного через свойство Components. В классе TComponent предусмотрен набор методов и свойств для управления этим списком:
property Components[Index: Integer]: TComponent; Возвращает указатель на компонент с индексом в списке Index.
property ComponentCount: Integer;function FindComponent(const AName: string): TComponent; Возвращает число компонентов в списке.
Возвращает ссылку на компонент-потомок с заданным именем.
procedure InsertComponent(AComponent: TComponent) ;procedure Rerr.oveCornponent (AComponent: TComponent) ; Вставляет компонент в конец списка.
Удаляет компонент из списка.
procedure DestroyComponents; Удаляет все компоненты из списка.

Изменять владельца компонента во время исполнения можно, но без особой необходимости не нужно. Дело в том, что используемый для этого метод RemoveComponent не только вычеркивает компонент из списка, но и обнуляет указатель на него в соответствующем поле владельца. Например, если во время визуального проектирования вы поместили на форму кнопку Buttoni, а затем во время выполнения изменили ее владельца, то все обращения к ней в программе как к Buttoni стали недействительны.
Рассмотрим другие свойства компонента. Он может находиться в одном из множества следующих состояний:
property ComponentState: TCornponentState;
TComponentState = set of (csLoading, csReading, csWriting, csDestroying, csDesigning) ;
Эти состояния используются средой во время визуального проектирования, при загрузке/выгрузке компонентов из файлов ресурсов. Во время исполнения приложения множество состояний пусто. Лишь метод
procedure Destroying;
устанавливает в состоянии компонента флаг csDestroying и вызывает аналогичный метод у всех потомков из списка. Он также используется в деструкторе компонента.
Свойство Designlnfo относится к стадии разработки (конструирования) приложения:
property Designlnfo: Longint;
В нем хранятся координаты верхнего левого угла компонента во время разработки.
Элементы управления
Потомком TComponent является класс TControl - элемент управления Windows. Все то, что видит (или может увидеть) пользователь в клиентской области вашей формы во время выполнения, порождено от класса TControl (клиентская область - вся рабочая поверхность окна Windows, исключая заголовок, полосу м