Справочник по компонентам Delphi. Часть 3

ОГЛАВЛЕНИЕ

Использование интерфейса OLE

Значение, которое придается сегодня внедрению интерфейса OLE, трудно пере­оценить. Фирма Microsoft извещает о том, что на получение логотипа "Windows 95 Compatible" будут сертифицированы только те приложения, ко­торые имеют средства работы с OLE.

Разъяснять суть механизмов OLE с точки зрения пользователя здесь не имеет смысла; кратко опишем их с точки зрения программиста.

В создаваемый вами документ могут быть добавлены данные, созданные другим приложением: формулы, таблицы, графические файлы и т. п. Такие данные, рассматриваемые вместе с приложением, которое умеет их обрабаты­вать, будем называть объектом OLE, а такое приложение — сервером OLE. Дословный перевод аббревиатуры OLE означает "внедренные и связанные объекты". Разница между внедрением и связыванием состоит в том, где и как размещаются данные, представляющие объект. Внедренный объект хранится в самом документе и является его составной частью. Для связанного объекта хранится только ссылка на данные, которые могут находиться в другом до­кументе или в другой части этого документа. Каждый из способов имеет свои достоинства и недостатки. Наличие внедрен­ных объектов увеличивает размер документа, зато он обладает переносимостью, и несколько пользователей могут работать с ним одновременно. Когда объект связан, то он занимает гораздо меньше места, но такой документ нужно переносить вместе с данными, на которые он ссылается. Каждое изменение данных влечет за собой изменение во всех объектах, которые ссылаются на эти данные.

Возможности реализации OLE в рассматриваемой версии Delphi ограничены только поддержкой приема объектов. Тем, кто хочет создавать серверы OLE, придется подождать выпуска 32-разрядной версии Delphi, где возможности этого программного интерфейса будут реализованы в большей мере. В VCL имеется специальный компонент-контейнер, в который можно помещать данные OLE. Вставлять объекты в контейнер можно как на стадии разработки приложения, так и на стадии его выполнения. Здесь будет рассмотрен только последний вариант.


 

Компонент TOLEContainer

TObject->TPersistent -> TComponent->TControl -> TWinControl -> •>TCustomControl -> TOLEContainer

Модуль TOCTRL

Страница Палитры компонентов System

Загрузить объект OLE в контейнер можно тремя путями:
  • созданием нового объекта или связыванием с уже существующим через вызов диалога InsertOLEObjectDIg;
  • "перетаскиванием" объекта из сервера OLE в форму, содержащую контей­нер, с помощью Drag&Drop;
  • помещением объекта из буфера обмена (посредством вызова диалога PasteSpecialDIg).

Общим является то, что во всех трех способах формируется поначалу опре­деленная структура данных (типа BOLEInitInfo). Она является "визитной карточкой" сервера OLE и его данных. Как только значение указателя на нее присваивается свойству контейнера

property PInitInfo: Pointer;

происходит процесс внедрения или связывания объекта. При этом может произойти активизация сервера. Несколько примеров использования этого свойства рассмотрено ниже.

Сразу после присвоения значения свойству контейнера PInitInfo потребность в созданной структуре отпадает. Ее можно уничтожить при помощи процедуры:

procedure ReleaseOLEInitInfо(PInitInfo: Pointer);

Контейнер, однако, продолжает хранить содержащуюся в этой структуре информацию. Для доступа к ней нужно воспользоваться свойством:

 property Initlnfo: BOLEInitInfo; 

Тип BOLEInitInfo не документирован Borland и его описание здесь не приводится.

Ниже будут подробнее рассмотрены все три варианта загрузки объекта OLE в контейнер.


 

Создание нового объекта

Этот способ применяется, когда вы хотите добавить к приложению данные из уже существующего файла, снабдив их возможностями одного из серверов OLE, который "умеет" с этими данными работать. Данные можно внедрить или связать. Можно также внедрить новый (пустой) объект, в этом случае сразу будет вызван сервер. В основе этого способа лежит вызов функции:

 function InsertOLEObjectDIg(Form: TForm; HelpContext: THelpContext; var PInitInfo: Pointer): Boolean; 

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

procedure TFormI-BitBtnIClick(Sender: Tobject); 
var
    Thelnfo : Pointer;
begin
    if InsertOLEObjectDIg(Self, 0, Thelnfo) then
    begin
        OLEContainerI.PInitInfo := Thelnfo;
        ReleaseOLEInitInfо(Thelnfo);
    end;
end;

Регистрация форматов

Два других способа получения данных OLE — через буфер обмена или по­средством "перетаскивания" — требуют выполнения предварительных опе­раций.

Для того чтобы форма могла играть роль получателя данных, нужно сделать следующее:

  1. Объявить ее как приемник объектов OLE.
  2. Связать с ней список форматов буфера обмена, получение которых будет поддерживаться.

Обе этих задачи решает вызов функции:

 procedure RegisterFormAsOLEDropTarget(Form: TForm; const Fmts: array of BOLEFormat); 

Здесь Form — регистрируемая форма, Fmts — массив форматов. Каждый элемент массива форматов является записью типа:

BOLEFormat = Record 
    fmtid: Word;
    fmCName: array [0.. 31] of char;
    fmtResultName: array[0..31] of char;
    fmtMedium: BOLEMedium;
    fmtIsLinkable: Bool;
end;

Поля записи имеют следующее назначение:

  • fmtid — идентификатор формата буфера обмена. Это может быть как стандартный формат (CF_TEXT, CF_BITMAP и др.), так и специальный формат для объектов OLE. В этом случае он должен быть зарегистрирован при помощи функции RegisterClipboardFormat (см. пример ниже);
  • fmtName — имя, которое появится в списке форматов диалога PasteSpecialDIg;
  • fmtResultName — имя формата, которое появится в комментариях внутри этого диалога. Например, если значение fmtResultName равно "Bitmap", то пользователь получит примерно следующий комментарий: "Inserts the contents of the Clipboard into your document as Bitmap";
  • fmtIsLinkable — показывает, могут ли данные в этом формате играть роль связанных объектов.
  • fmtMedium — константа, идентифицирующая тип данных в буфере обмена. Связана со значением поля fmtid следующим образом:
BOLEMEDSTREAM Связанные объекты OLE.
BOLEMEDSTORAGE Внедренные объекты OLE.
BOLEMEDMFPICT Метафайлы (CF.METAFILEPICT).
BOLEMEDGDI Графические данные (CF BITMAP, CF SYLK, CF DIP, CF TIFF, CF DIB, CF PALETTE, CF PENDATA, CFJUFF, CFWAVE).
BOLEMEDHGLOBAL Все прочие данные.

Специально для вычисления значения поля fmtMedium по формату данных предусмотрена функция:

function BOLEMediumCalc(frntid: Word): BOLEMedium;

Заполнить требуемый массив можно, например, так:

var 
    FEmbedClipFmt, FLinkClipFmt: Word;
    Fmts: array[0..2] of BOLEFormat;

FEmbedClipFmt := RegisterClipboardFormat('Embedded Object');
FLinkClipFmt := RegisterClipboardFormat('Link Source');
Fmts[0].fmtid := FEmbedClipFmt;
Fmts[0].fmtMedium := BOLEMediumCalc(FEmbedClipFmt);
Fmts[0].fmtIsLinkable := False;
StrPCopy (Fmts[0].fmtName, '%s');
StrPCopy (Fmts[0].fmtResultName, '%s');
Fmts[l].fmtid := FLinkClipFmt;
Fmts[l].fmtMedium := BOLEMediumCalc(FLinkClipFmt);
Fmts[1].fmtIsLinkable := True;
StrPCopy (Fmts[1].fmtName, '%s');
StrPCopy (Fmts[1].fmtResultName, '%s');
Fmts[2].fmtid := CF_BITMAP;
Fmts[2].fmtMedium := BOLEMediumCalc(CF_BITMAP);
Fmts[2].fmtIsLinkable := False;
StrPCopy (Fmts[2].fmtName, 'Bitmap');
StrPCopy (Fmts[2].fmtResultName, 'Device-dependent Bitmap');
RegisterFormAsOLEDropTarget(Self, Fmts);

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

 function OLEFormat(AFmtId: Word; AName, AResultName: String; AIsLinkable: Bool): BOLEFormat; 

Она заполняет структуру типа BOLEFormat переданными ей параметрами и возвращает указатель на нее. Приведенный выше фрагмент кода можно пре­образовать так:

 FEmbedClipFmt := RegisterClipboardFormat С Embedded Object'); 
FLinkClipFmt := RegisterClipboardFormat ('Link Source');
RegisterFormAsOLEDropTarget (Self, [OLEFormat (PEmbedClipFmt, '%s', '%s', FALSE), OLEFormat (PLinkClipFmt, '%s', '%s', TRUE)]);

Для тех случаев, когда регистрацию формы и установку списка возможных форматов нужно произвести раздельно, предусмотрены процедуры:

 procedure RegisterFormAsOLEDropTgt(Form: TForm); 
procedure SetFormOLEDropFormats(Form: TForm; const Fmts: array of BOLEFormat);

В паре они делают то же, что и RegisterFormAsOLEDropTarget. Для очистки списка форматов можно воспользоваться процедурой:

 procedure ClearForrnOLEDropFormats(Form: TForm); 


"Перетаскивание" объектов OLE

Форма может принимать данные, направляемые серверами OLE при помощи интерфейса Drag&Drop. Обратите внимание, что этот случай представляет собой исключение из общего правила, разрешающего "перетаскивать" объекты только в пределах одной формы.

Возможность работы Drag&Drop с OLE реализована, например, в приложениях из пакета Microsoft Office, однако, далеко не все серверы OLE 2.0 ее под­держивают.

Получение данных путем "перетаскивания"

Для получения данных путем "перетаскивания" нужно, во-первых, зарегистрировать форму при помощи ReisterFormAsOLEDropTarget. Во-вто­рых, для формы нужно создать обработчик события OnDragDrop (будьте внимательны: именно для формы, а не для контейнера!). При "перетаскивании" данных OLE этот обработчик получает в параметре Source объект специаль­ного класса TOLEDropNotify:

TOLEDropNotify = class(TObject) 
public
    procedure Setlnfo(Form: TForm; Rect: TRect; Info: BOLEInitInfo);
    property DropPorm: TForm;
    property DropRect: TRect;
    property DataPormat: Word;
    property DataHandle: THandle;
    property PInitInfo: Pointer;
end;

Его свойства приведены в таблице:

property DropForm: TForm;Определяет форму, в которую перемещены данные. Значение обычно равно Self.
(Ro) property DropRect: TRect;Определяет прямоугольник, в который производилось перемещение. Обычно стяги­вается в точку, где была отпущена кнопка мыши.
(Ro) property DataFormat: Word;Определяет формат перемещенных данных. (Ro) property DataHandle: THandle;   Содержит дескриптор перемещенных данных.
(Ro) property pinitinfo: pointer;Содержит указатель на структуру для инициализации.

Сброшенные данные могут как представлять объект OLE, так и иметь один из обычных форматов. Логическая взаимосвязь между тремя последними свой­ствами такая:
  • если получен объект OLE, то в параметре DataFormat возвращается зна­чение -1. В этом случает дескриптор DataHandle недействителен, смысл имеет только свойство PInitInfo;
  • если получены данные в одном из обычных форматов, то свойство DataFormat содержит идентификатор этого формата, DataHandle — дескриптор соответствующих данных, a PInitInfo имеет значение nil.

Один из примеров обработчиков события OnDragDrop выглядит так:

procedure TFormI.OLEContainerlDragDropfSender, Source: TObject; X, Y: Integer); 
begin
    if Source is TOLEDropNotify then
        with Source as TOLEDropNotify do
        begin
            if (DataFormat = CF_TEXT) then
            begin
                Labell.Caption := StrPas(GlobalLock(DataHandle));
                GlobalUnlock(DataHandle);
                GlobalFree(DataHandle);
            end
            else if DataFormat = Word(-l) then
                OLEContainerI.PInitInfo := TOLEDropNotify(Source).PInitInfo;
        end;
end;

Обратите внимание, что в этом примере полученную структуру PInitInfo не нужно освобождать при помощи ReleaseOLEInitInfo.


 

Вставка объектов OLE из буфера обмена

Вставку реализует специальный диалог, вызываемый функцией:

 function PasteSpecialDlg(Form: TForm; const Fmts: array of BOLEFormat; HelpContext: THelpContext; var Format: Word; var Handle: THandle; var PInitInfo: Pointer): Boolean; 

Параметры этой функции означают следующее:

  • Form — принимающая данные форма;
  • Fmts — список поддерживаемых форматов данных;
  • HelpContext — контекст системы помощи для диалога (в файле с расширением .HLP, связанном с приложением). Если этот параметр имеет значение 0, то кнопка Help будет отсутствовать;

Функция присваивает значения трем параметрам:

  • Format — выбранный пользователем формат (из доступных в диалоге);
  • Handle — дескриптор данных;
  • PInitInfo — указатель на структуру данных инициализации. Функция возвращает True, если пользователь нажал в диалоге кнопку ОК или клавишу <Enter>.
Логическая взаимосвязь между значениями Format, Handle и PInitInfo такая:
  • если пользователь решил присоединить или встроить имеющийся в буфере обмена объект, то в параметре Format возвращается значение -1. В этом случает дескриптор недействителен, а смысл имеет только параметр PTnitTnfo:
  • если вставляются имеющиеся в буфере обмена данные одного из обычных форматов, то параметр Format содержит его идентификатор, Handle — дескриптор соответствующих данных, a PInitInfo равен nil.

Перед тем, как вызывать PasteSpecialDIg, нужно убедиться в целесообразности этого, вызвав функцию:

 function PasteSpecialEnabledfForm: TForm; const Pints: array of BOLEFormat): Boolean; 

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

Посмотрите на приведенный ниже пример использования вызова диалога PasteSpecialDIg:

procedure TFormI.PasteItemClick(Sender: TObject); 
var
    DataFormat: Word;
    DataHandle: THandle;
    Thelnfo: Pointer;
begin
    if PasteSpecialEnabledfSelf, Pints) then
        if PasteSpecialDIg(Formi, Fmts, 0, DataFormat, DataHandle, Thelnfo) then
            if DataFormat = Word(-l) then
            begin
                OLEContainerl.PInitInfo := Thelnfo;
                ReleaseOLEInitInfo(Thelnfo);
            end
            else if DataFormat in [CP_BITMAP, CF_METAPILEPICT] then
                Image1.Picture.Assign(Clipboard) ;
end;

Если вы хотите ограничиться вставкой из буфера обмена только объектов OLE, возможно значительно упростить описанный выше механизм. Функции

 function PasteSpecialOLEDIg(Form: TForm; HelpContext: THelpContext; var PInitInfo: Pointer): Boolean; 
function PasteSpecialOLEEnabled(Form: TForm): Boolean;

являются полными аналогами PasteSpecialDIg и PasteSpecialEnabled — но толь­ко в части, касающейся OLE. Список зарегистрированных форматов по-преж­нему необходим, но в нем будут играть роль только форматы для связанного и внедренного объектов.

Пример вызова диалога PasteSpecialOLEDIg короче предыдущего:

procedure TFormI.PasteitemClick(Sender: TObject); 
var
    Thelnfo: Pointer;
begin
    if PasteSpecialOLEEnabled(Self, Fmts) then
        if PasteSpecialOLEDIg(Formi, 0, Thelnfo) then
        begin
            OLEContainerl.PInitInfo := Thelnfo;
            ReleaseOLEInitInfo(Thelnfo);
        end;
end;

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

Если в контейнере содержится связанный объект, то его состояние можно проверить и изменить, вызвав соответствующий диалог из функции:

 procedure LinksDig(Form: TForm; HelpContext: THelpContext); 

Если связанного объекта нет, то вызов LinksDig не имеет смысла. Убедитесь в целесообразности при помощи функции:

 function LinksDlgEnabled(Form: TForm): Boolean; 

Свойства контейнера Проверить наличие объекта OLE в контейнере позволяет метод:

function OLEObjAllocated: Boolean; 

Свойство

(Pb) property AutoSize: Boolean; 

означает, что контейнер автоматически принимает размер помещенного в него объекта OLE. Играет роль оно только в момент внедрения (связывания).

После того, как в контейнер загружен объект OLE, его можно идентифицировать при помощи свойств:

 (Pb) property ObjClass: String; (Pb) property ObjDoc: String; (Pb) property Objitem: String; 

Свойство ObjClass представляет собой имя (класс) объектов, поддерживаемых данным сервером OLE, например "Документ Microsoft Word 6.0", "Visio 3.0 Drawing" или "Paintbrush Picture".

Свойства ObjDoc и Objitem применяются только для связанных объектов. Первое свойство представляет собой имя документа (зачастую имя файла), а второе — имя его части (если контейнер связан только с частью документа, например, с фрагментом изображения). Вы можете увидеть значения ObjDoc и Objitem в диалоге LinksDig: они разделяются восклицательным знаком и в паре составляют имя связи.

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

Редактирование внедренных объектов возможно как в отдельном окне, созда­ваемом сервером, так и прямо в содержащем его документе ("по месту"). Последняя возможность предусмотрена спецификацией OLE 2.0; при этом могут заменяться главное меню и строка состояния формы.

Контейнер OLE в VCL поддерживает работу с серверами обеих спецификаций. Если же по каким-либо причинам активизация сервера "по месту" нежелатель­на, то установка в False свойства

 (Pb) property AllowInPlace: Boolean; 

позволяет ее запретить. Поскольку загрузка сервера "по месту" подразумевает изменение главного меню, то оно должно быть у приложения, содержащего форму с контейнером.


 

Активизация загруженного объекта OLE

Загруженный объект OLE можно активизировать (то есть вызвать его сервер) тремя способами:

(Рb) property AutoActivate: TAutoActivate;
TAutoActivate = (aaManual, aaGetFocus, aaDoubleClick) ;

Типичным способом (принятым по умолчанию) является двойной щелчок (aaDoubleClick). При установленном aaGetFocus активизация происходит при получении объектом фокуса ввода. Наконец, aaManual обязывает активизировать объект OLE установкой в True одного из свойств:

 property Active: Boolean; property InPlaceActive: Boolean; 

Различие между ними в том, что второе (по возможности) осуществляет активизацию "по месту".

Запуск и работа сервера OLE может быть длительным процессом. На время, пока объект загружается в сервер, в контейнере устанавливается флаг:

 (Ro) property InActivation: Boolean; 

После того, как сервер OLE полностью активизировался, происходит событие

(Рb) property OnActivate: TNotifyEvent;

и устанавливается в True свойство:

property Modified: Boolean ; 

Если при этом вы снова переключитесь на приложение Delphi, то увидите, что на время работы сервера клиентская область контейнера заштриховывается.

Свойство

(Рb) property Zoom: TZoomFactor;
TZoomFactor = (z025,z050,zlOO,zl50,z200);

показывает, с каким масштабом отображаются объекты OLE внутри контей­нера (при этом размеры самого контейнера остаются неизменными; если при увеличении часть изображения объекта выходит за границы контейнера, она отсекается).

Взаимодействие сервера OLE со строкой состояния осуществляется посредством обработки событий:

 property OnStatusLineEvent: TStatusLineEvent;
TStatusLineEvent = procedure(Sender: TObject; Msg: String) of object;

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

Инициировать это событие можно также при помощи процедуры:

 procedure DoStatusLineMsg (Msg :String); 

Контейнер может выгружать/загружать содержимое в поток и буфер обмена:

procedure LoadFromFile(const FileName: strings-procedure LoadFromStream(Stream: TStream);
procedure SaveToFile(const FileName: strings-procedure SaveToSCream(Stream: TStream);
procedure CopyToCUpboard (Clear : Boolean);

Параметр Clear в последней процедуре означает необходимость очистки пре­дыдущего содержимого.

TOLEContainer является оконным элементом управления и поддерживает все соответствующие возможности: обработку сообщений от мыши и клавиатуры, фокус ввода, интерфейс Drag&Drop и т. п.

Наконец, в TOLEContainer есть "выходы" на элементы внутреннего устройства интерфейса OLE. Использование этих возможностей не документировано, и более подробное их обсуждение имеет смысл отложить до выхода следующей версии продукта. Здесь мы их только перечислим:

 function GetContainer: TIBCont; 
property Storage: IStorage;
property Site: TIBSite;
property Part: IBPart;
property PartRect: TRect;
procedure DeleteSite;
procedure DeleteStorage;


Меню OLE

У каждой формы есть свойство ObjectMenuItem. Оно ссылается на пункт меню, который специально выделяется для того, чтобы сервер OLE мог модифицировать его, разместив на этом месте свое подменю. Каждый сервер может производить над данными те или иные операции; их перечень отража­ются в подменю. Оно может быть проанализировано с помощью методов, имеющихся у контейнера:

 function GetObjectMenultemCount: Integer; function GetObjectMenuItem(Index: Integer): string; 

Первая функция возвращает число пунктов в подменю, а вторая — имя за­данного пункта. Например, при вставке документа русской версии Microsoft Word первыми двумя будут "Редактировать" и "Открыть". Последними двумя пунктами в добавляемом меню всегда являются разделитель и пункт "Convert...", служащий для преобразования типа объекта OLE. Вы можете определить контекст помощи, предназначенный для этого диалога:

(Рb) property ConvertDlgHelp: THelpContext;

Вызвав функцию GetObjectMenuItem с параметром -1, можно получить имя самого подменю, например, "Paintbrush Picture Object" или "Документ Word".

Действия сервера, связанные с нужным пунктом меню, можно инициировать из программы путем вызова метода:

 procedure ObjectMenuAction(Index: Integer); 

Подменю становится доступным при получении фокуса компонентом TOLEContainer и блокируется при его утере. Также устанавливает состояние меню метод:

procedure ActivateObjMenuItem(Activate: Boolean);   Форма и ее свойства


 

Форма (TForm) 

Последним в этом разделе будет рассмотрен самый важный, особый компо­нент — форма. Форма в Delphi — это синоним окна. В библиотеках для Windows (MFC, OWL) существуют отдельные классы для каждой важной разновидности окон — диалогового окна, клиентских и дочерних окон MDI и так далее. Разработчики VCL пошли по новому пути, объединив в одном классе свойства и методы всех этих разновидностей. Специализация при этом все равно осталась — она определяется свойством:

(Рb) property FormStyle: TFormStyle;
TFormStyle = [fsNoririal, fsMDIChild, fsMDIForm, fsStayOnTop);
  • fsNormal — обычное окно;
  • fsMDIChild — дочернее окно приложения MDI;
  • fsMDIForm — главное окно MDI;
  • fsStayOnTop — окно, остающееся поверх других даже в неактивном со­стоянии. (В данном случае это касается только других окон приложения).

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

У TForm есть методы, которые имеют смысл только для некоторых из стилей FormStyle. Рассмотрим сначала общие свойства и методы формы, а затем — специфические.

Набор пиктограмм в заголовке окна описывается свойством:

 (Рb) property Borderlcons: TBorderIcons;
TBorderIcon = (biSystemMenu, biMiniinize, biMaximize);
TBorderIcons = set of TBorderIcon;

По умолчанию у обычной формы имеются все три пиктограммы — для вызова системного меню, разворачивания и сворачивают окна.

Обрамление формы задается свойством:

 (Pb) property BorderStyle: TFormBorderStyle;
TFormBorderStyle = (bsNone, bsSingle, bsSizeable, bsDialog);

Помимо двух стандартных стилей обрамления (bsNone и bsSingle) у формы есть еще два своих типа (bsSizeable и bsDialog). Эти возможности стандартны для Windows. Особенности реализации здесь заключаются в том, что стиль обрамления может изменяться в процессе выполнения программы.

Каждое окно может находиться в одном из состояний — нормальном, свер­нутом (минимизированном) и развернутом (максимизированном), что опреде­ляется свойством:

property WindowState: TWindowState;
TWindowState = [wsNormal, wsMinimized, wsMaximized);

Значение этого свойства можно изменить как на этапе разработки, так и во время исполнения.

Окно в свернутом состоянии на экране отображается значком формы, который задается в свойстве:

 (Pb) property Icon: TIcon; 

Значок главной формы приложения идентифицирует само приложение в TaskManager Windows 3.11 и Windows NT или TaskBar Windows 95. Если он не определен, то используется значок приложения (объекта Application).

Каждая форма может иметь главное и всплывающее меню. Главное меню определяется свойством:

 (Рb) property Menu: TMainMenu; 

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

Всплывающее меню формы представлено свойством:

 (Pb) property PopupMenu: TPopupMenu; 

Форма может содержать объекты OLE. Для этого она должна быть зарегистрирована в качестве их приемника. Свойство

 property DropTarget: Boolean; 

устанавливает, может ли форма быть приемником объектов OLE. Для разме­щения подменю возможностей сервера OLE можно выделить отдельный пункт:

 (Pb) property ObjectMenuItem: TMenuItem; 

Этот пункт будет активизироваться при получении фокуса компонентом TOLEContainer.


 

Создание формы

Правила создания форм на этапе выполнения задаются в опциях проекта (страница Forms). Все формы, которые вы включили в состав приложения на этапе визуального проектирования, могут быть автоматически созданы при его запуске, для этого их имена должны находиться в списке Auto-Create Forms. Все прочие формы (список Available Forms) нужно создавать самосто­ятельно, вызвав конструктор Create или метод Application.CreateForm.

Самым первьм событием, которое возникает при создании формы, является:

 (Pb) property OnCreate: TNotifyEvent; 

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

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

Для показа и активизации прочих форм необходимо вызвать одну из мето­дов — Show или ShowModal. Последний используется только для модальных форм, работа с которыми описана ниже. При вызове метода

 procedure Show; 

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

(Рb) property OnShow: TNotifyEvent;

При этом форма получает то положение и размеры, которые задаются зна­чениями свойства:

property Position: TPosition; 
TPosition= (poDesigned, poDefault, poDefaultPosOnly, poDefaultSizeOnly, poScreenCenter);
  • poDefault - принять положение и размеры, определенные средой Windows по умолчанию;
  • poDefaultPosOnly - принять только положение, определенное средой Windows по умолчанию; poDefaultSizeOnly   — принять только размеры, определенные средой Windows по умолчанию;
  • poScreenCenter - разместить окно по центру экрана (при этом размеры будут равны половине ширины и высоты экрана в пикселах, а для дочерней формы MDI — половине соответствующих размеров клиентского окна);
  • poDesigned - принять те значения положения и размеров, которые были определены во время разработки приложения.

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

 (Pb) property OnPaint: TNotifyEvent; 

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

 (Ro) property Canvas: TCanvas; 

Обработчик события OnPaint вызывается до того, как начнется отрисовка всех компонентов, принадлежащих форме. Поэтому нарисованное в нем может по­служить фоном. Пример:

procedure TFormI.FormCreate(Sender: TObject); 
begin
    gr := TBitmap.Create;
    gr.LoadFromFile('c:\delphi\iinages\splash\256color\chemical.bmp');
end;

procedure TFormI.FormPaint(Sender: TObject);
begin
    Canvas.Draw(0,0,gr);
end;

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

(Pb) property OnActivate: TNotifyEvent;

Узнать, активна ли форма, можно путем обращения к ее свойству:

(Ro) property Active: Boolean;

При активизации формы ей посылается сообщение о настройке ее размеров (WM_SIZE). После того, как размеры изменены, возникает событие

(Pb) property OnResize: TNotifyEvent;

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

procedure TFormI.FormResize(Sender: TObject); 
var
    i,w,h : integer;
begin
    if WindowState=wsNorinal then
        with DrawGridI do
        begin
            w := (ClientWidth - ColCount*GridLineWidth) div ColCount;
            if w < 1 then w := 1;
            h := (ClientHeight - RowCount*GridLineWidth) div RowCount;
            if h < 1 then h := 1;
            for i := 0 to ColCount-1 do
                ColWidths[i] := w;
            for i := 0 to RowCount-1 do
                RowHeights [i] := h;
            Inc(w, GridLineWidth);
            Inc(h, GridLineWidth);
            if (ClientWidth <> w * ColCount) or (ClientHeight oh* RowCount) then
            begin
                Forml.ClientWidth := w * ColCount + 2*GridLineWidth;
                Forml.ClientHeight := h * RowCount + 2*GridLineWidth;
            end;
        end;
end;

Здесь нужно обратить внимание на два момента. Во-первых, изменение раз­меров внутри обработчика OnResize влечет за собой как минимум один новый вызов этого события, поэтому возможны неоднократные перерисовки и изме­нения размеров. Во-вторых, чтобы этот процесс рано или поздно остановился, нужно ввести условия, при достижении которых размеры изменяться не будут, иначе наступит зацикливание.

После изменения размеров вновь возникает событие OnPaint.

Разумеется, описанные выше события (OnPaint, OnActivate и OnShow) возникают не только при инициализации формы, а и, к примеру, при каждом переключении между приложениями или формами в приложении. Последние два действия имеют парные события, возникающие при утере фокуса или исчезновении формы с экрана:

 (pb) property OnDeactivate: TNotifyEvent; 
(Pb) property OnHide: TNotifyEvent;

Метод

procedure Hide; 

дает возможность сделать форму невидимой (изменяет свойство Visible). Во всех случаях, когда форма становится невидимой, возникает событие OnHide.

С помощью пары методов Show/Hide обычно управляют из главной формы показом прочих форм. Будьте внимательны! При вызове Hide для главной формы подумайте о том, каким путем вы собираетесь после этого снова визуализировать ее.

Основной способ, используемый для закрытия формы — это вызов метода:

 procedure Close; 

В первую очередь внутри Close вызывается метод:

function CloseQuery: Boolean;


Закрытие формы 

Для закрытия формы необходимо, чтобы он вернул True. Этот метод — прямой аналог метода CanClose в библиотеке OWL. Для проверки на воз­можность закрытия он вызывает обработчик события:

 (Pb) property OnCloseQuery: TCloseQueryEvent; 
TCloseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;

Здесь вы должны проверить возможность закрытия формы и вернуть нужное значение в параметре CanClose (который изначально имеет значение True). Например:

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin
    if Memo1.Modified then
        case MessageDlg('Save text?', mtWarning, mbYesNoCancel, 0) of
            mrYes: Memol.Lines.SaveToFile('MYTEXT.TXT ');
            mrCancel: CanClose := False;
        end;
end;

Таким образом, если обработчик события OnCloseQuery не описан, возвраща­ется True (форму можно закрыть).

Для форм стиля fsMDIForm (родительских окон MDI) сначала должны за­крываться все дочерние формы (вызываются их методы CloseQuery). Если хотя бы одна из них возвращает False, метод тут же возвращает False, и обработчик события OnCloseQuery закрываемой родительской формы управления не полу­чает.

Затем метод Close вызывает обработчик следующего события

(Pb) property OnClose: TCloseEvent;
TCloseEvent = procedure(Sender: TObject; var Action : TCloseAction) of object;
TCloseAction = (caNone, caHide, caFree, caMinimize);

что позволяет определить дальнейшую реакцию. Дело в том, что закрытие можно реализовать различными способами, в зависимости от значения пара­метра Action:

  • caNone — не делать ничего;
  • caHide — сделать форму невидимой (скрыть);
  • caMinimize — свернуть форму в значок;
  • caFree — уничтожить форму, вызвав ее деструктор.

Перед вызовом OnClose в параметр Action засылается значение caHide. Ис­ключение составляют дочерние формы MDI, для которых засылается значение caMinimize или caNone в зависимости от возможности их сворачивания.

Если обработчик вернул значение caNone, форма не закрывается. Таким путем можно продублировать OnCloseQuery.

При закрытии главной формы приложения любое отличное от caNone значение вызывает завершение приложения. Для формы, не являющейся главной, зна­чения caHide и caMinimize позволяют соответственно скрыть и свернуть ее в значок. Выбор значения caFree влечет за собой вызов деструктора путем обращения к методу:

 procedure Release; 

Последним при уничтожении формы инициализируется событие:

 (Pb) property OnDestroy: TNotifyEvent; 

Это событие является парным по отношению к OnCreate; обработчик его вызывается в деструкторе формы. Здесь программист может предумотреть необходимые действия при уничтожении формы, к примеру, записать значения в файл JNI.


 

Модальные формы

Компонент TForm в VCL объединяет в себе свойства и может играть роль как главного окна программы, так и диалогового (модального) окна. Чтобы форма работала в качестве диалога, вместо метода Show нужно вызвать метод:

 function ShowModal: Integer; 

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

 (Rb) property ModalResult: TModalResult; 

не изменит своего значения, первоначально нулевого. Напомним, что это свой­ство формы меняется непосредственно с помощью некоторых видов принад­лежащих ей кнопок (см. раздел "Кнопки"). Если для модальной формы прог­раммистом вызывается метод Close, то ее единственным действием является то, что свойству ModalResult присваивается значение mrCancel (без вызовов OnCloseQuery и OnClose).

Как только получено ненулевое значение ModalResult, вызьшается метод:

 procedure CloseModal; 

Его роль такая же, как у Close для обычной формы: сначала вызов CloseQuery, затем — генерация события OnClose. Установив в параметре Action этого события значение caNone, можно обнулить ModalResult и тем самым воспре­пятствовать закрытию. В противном случае форма деактивизируется и делается невидимой.

Этот набор методов неприменим к дочерним формам MDI (со стилем fsMDIChild).


Управление дочерними элементами

Если вы хотите передать фокус одной из форм проекта, используйте метод этой формы:

 procedure SetFocus; 

Форма при этом обязана быть видимой и активной (Enabled), иначе создается исключительная ситуация EInvalidOperation.

Два метода отвечают за передачу фокуса между визуальными компонентами в составе формы. Метод

 procedure FocusControl(Control: TWinControl); 

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

 procedure DefocusControl(Control: TWinControl; Removing: Boolean); 

отбирает его. Параметр Removing, равный True, означает, что элемент при этом должен передать фокус своему родительскому элементу. Напомним, что для элементов в эти моменты генерируются события OnEnter и OnExit. Имеющий фокус элемент определяется свойством:

 property ActiveControl: TWinControl; 

Оно может принимать значение nil, если фокус имеет сама форма. В компоненте TForm доступен еще один метод, по предназначению сходный с FocusControl:

function SetFocusedControl(Control: TWinControl): Boolean;

Этот метод вызывается внутри многих компонентов (находящихся вне модуля FORMS) при получении фокуса ввода — именно поэтому он находится в секции public. Программисту не стоит его использовать, т. к. он не доку­ментирован.

Форма относится к компонентам с возможностью прокрутки содержимого клиентской области. К полосам прокрутки можно обратиться как к отдельным объектам с помощью свойств:

(pb) property HorzScrollBar;
(Pb) property VertScrollBar;

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

 (Pb) property AutoScroll; 

установлено в значение True. Следующий метод помещает элемент управления AControl в видимую часть клиентской области:

procedure ScrollInView(AControl: TControl);

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

Форма имеет возможность перехватить ввод от клавиатуры, предназначенный имеющему фокус элементу управления. Установка свойства

 (Pb) property KeyPreview: Boolean; 

в True означает, что поступающие от клавиатуры сообщения будут сначала поступать форме, и только затем — элементу. Пример использования этой возможности приведен в разделе "Обработка событий от мыши и клавиатуры".

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

 (Pb) property PixelsPerInch: Integer; 

Вы можете присвоить этому свойству любое значение, превышающее 36, либо 0.

При ненулевом значении этого свойства во время создания форма и все ее элементы масштабируются в некоторой пропорции. Эта пропорция равна отно­шению числа точек на дюйм на экране в данный момент к этому же числу во время разработки. Если же PixelsPerInch = 0, никакого масштабирования не производится.

Чтобы не изменять PixelsPerInch напрямую, разработчики предусмотрели дру­гое — обобщающее — свойство:

 (Pb) property Scaled: Boolean; 

При установке Scaled в False PixelsPerInch обнуляется, в True — получает новое значение, равное числу точек на дюйм на экране в текущем видеорежиме.

Нужно учитывать, что если вы хотите сделать приложение, независимое от разрешения экрана, то значение свойства Position у всех его форм должно отличаться от poDesigned — иначе они будут появляться в разных местах (в том числе и за пределами экрана).

Внешний вид формы и ее составных частей можно отобразить не только на экране. Метод

 function GetForrnImage: TBitmap; 

возвращает "моментальный снимок" формы — битовую карту с ее изобра­жением. Печать на принтере изображения формы, полученного при помощи GetFormImage, осуществляется методом:

 procedure Print; 

Полученное изображение передается объекту TPrinter (см. ниже), при этом его масштабирование производится в соответствии со значением свойства:

 (Pb) property PrintScale: TPrintScale;
TPrintScale = (poNone, poProportional, poPrintToFit) ;
  • poNone — отсутствует;
  • poProportional — производится изменение масштаба в пропорции, равной соотношению точек на дюйм у формы и принтера;
  • poPrintToFit — аналогично предыдущему, но осуществляется приведение размера изображения к размеру листа.


 

Свойства форм MDI

На базе TForm можно создавать специфические виды форм. Перечисленные ниже свойства и методы работают только в главных окнах приложений MDI.

(ро) property ClientHandle: HWND;
Содержит дескриптор клиентского окна (для главного окна MDI).
procedure Cascade; Располагает дочерние формы MDI каскадом.
procedure Tilet;
Располагает дочерние формы MDI мозаикой. Стиль определяется свой­ством TileMode.
property TileMode: TTileMode;
TTileMode = (tbHorizontal, tbVertical);
 Определяет стиль расположения дочер­них форм — вертикальный или горизон­тальный.
procedure Next; Передает фокус следующей форме в списке дочерних форм.
procedure Previous;
Передает фокус предыдущей форме в списке дочерних форм.
 property ActiveMDIChild: TForm; Содержит указатель на активную дочер­нюю форму.
(Ro) property MDIChildren[I: Integer]: TForm;Определяет количество дочерних форм.
(Pb) property WindowMenu: TMenuItem;Указывает на тот пункт меню, к которому достраивается список имен дочерних форм.


Функции из модуля FORMS

В модуле FORMS (где описан класс) содержится также ряд функций. Они важны для понимания взаимодействия форм формы и ее дочерних компонентов.

function GetParentForm(Control: TControl) : TForm;Возвращает указатель на форму, которой принадлежит элемент управления Control.
function ValidParentForm(Control: TControL): TForm;Делает то же, что и предыдущая функция, при этом, если форма не найдена, возникает исключительная ситуация EInvalidOperation.
function DisableTaskWindows(ActiveWindow: HWnd) : Pointer;Переводит в неактивное состояние все окна, кроме ActiveWindow. Эта функция возвращает копию исходного списка окон (TaskWindowList).
procedure EnableTaskWindows(WindowList: Pointer);Используется в паре с предыдущей функцией. Получив созданный ею список окон, переведенных в неактивное состо­яние, EnableTaskWindows активизирует все окна (через вызов функции API EnableWindow) и очищает список. Такой прием необходим при создании модальных окон и управлении ими, например, внутри метода MessageBox.
function AllocateHWnd(Method: TWndMethod) : HWND;Создает экземпляр окна вспомогательного класса TPUtilWindow (не путать с классом как понятием объектно-ориентированного программирования), обработчиком сооб­щений у которого служит метод Method.
procedure DeallocateHWnd(Wnd: HWND) ;Уничтожает созданный предыдущей функ­цией экземпляр окна.
function IsAccel(VK: Word; const Str: string): Boolean;Проверяет, является ли символ VK аксе­лератором для текстовой строки Str. Функция возвращает True, если в строке содержится сочетание & ' VK '.
function KeysToShiftState(Keys: Word) : TShiftState;Преобразует флаги состояния клавиатуры и кнопок мыши из типа MKSHIFT, MKLBUTTON в принятый в Delphi тип TShiftState.
function KeyDataToShiftState(KeyData: Longint): TShiftState;Производит аналогичное преобразование из виртуальных кодов клавиш Windows (например, типа VKSHIFT).

 

Приложение и среда его выполнения

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

Помимо форм и принадлежащих им компонентов, "действующими лицами" для приложения служат несколько других важных объектов. К ним относятся дисплей Screen (класс TScreen), принтер Printer (класс TPrinter) и буфер обмена (класс TClipboard). Все они являются глобальными: именно на их использо­вание рассчитаны различные методы многих компонентов. Создание этих объектов происходит автоматически при запуске приложения, поэтому ни при каких обстоятельствах программистом не должны создаваться другие их эк­земпляры.

Для хранения параметров приложения вы можете создать объекты, соответст­вующие файлам инициализации (TIniFile).

 

Объект Application

 TApplication = class(TComponent) 

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

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

К информационным могут быть отнесены следующие свойства:

property Title: string; Имя приложения. Под этим именем оно отображается в TaskManager, TaskBar и т. п. По умолчанию равно имени проекта.
(Ro) property ExeName: string;Имя файла с расширением .ЕХЕ, содержащего приложение (то же самое имя возвращает функция ParamStr(0)).
property Icon: TIcon; Значок приложения. Первоначально, при за­пуске, значок загружается из ресурса с именем MAINICON в файле ресурсов проекта.

Теперь рассмотрим методы и свойства в последовательности, соответствующей "жизненному циклу" приложения. При запуске на выполнение Application сна­чала создает и инициализирует формы приложения при помощи метода: procedure CreateForm(FormClass: TFormClass; var Reference); Параметр Reference будет указывать на созданный экземпляр формы класса FormClass.

С обращений к этому методу начинается код, содержащийся в файле с расширением .DPR; при этом в нем создаются только те формы, которые содержатся в списке Auto-Create Forms в опциях проекта. Метод работает таким образом, что в случае, если указатель на главную форму равен nil, то созданная форма становится главной. Из этого следует, что главной всегда будет первая из создаваемых форм. Указатель на нее описан в свойстве:

 (Ro) property MainForm: TForm; 

Здесь нужно сделать специальную оговорку. Помимо главной и других форм у приложения есть еще одно — невидимое — окно. Именно оно является по-настоящему главным и именно в нем обрабатываются все сообщения Windows, управляющие состоянием приложения. Его дескриптор доступен в свойстве:

 property Handle: HWnd; 

После создания всех форм метод

 procedure Run; 

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

procedure TApplication.Run;
begin
    AddExitProc(DoneApplication);
    if FMainForm = nil then
    begin
        FMainForm.Visible := True;
        repeat
            HandleMessage
        until Terminated;
    end;
end;

Вызываемый в нем метод

procedure HandleMessage; 

извлекает следующее сообщение из очереди и передает его на обработку сле­дующим образом:

 procedure TApplication.HandleMessage; begin if not ProcessMessage then Idle; end; 

Метод ProcessMessage ищет нужный обработчик сообщения и передает ему управление. Назначение метода Idle поясняется ниже.

О поступлении сообщения оповещает вызов обработчика события:

 property OnMessage: TMessageEvent;
TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;

Используя обработку OnMessage, программист может переопределить обра­ботку любого (или любых) сообщений (кроме WM_QUIT и сообщений системы оперативной подсказки). Для этого, выполнив внутри метода необходимые действия, в параметре Handled нужно вернуть True. Тогда сообщение не поступит в функцию окна приложения. Необходимо быть крайне осторожным, подменяя системные обработчики сообщений.

Существует другой способ перехвата сообщений. Для этого нужно написать метод, имеющий следующий rim

 TWindowHook = function (var Message: TMessage): Boolean of object; 

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

 procedure HookMainWindowfHook: TWindowHook); 

Если одна из процедур-перехватчиков типа TWindowHook в цепочке вернет True, это будет означать, что сообщение обработано.

Когда необходимость в перехвате сообщений отпадет, созданный вами метод нужно исключить из списка при помощи вызова метода:

 procedure UnhookMainWindow(Hook: TWindowHook); 

Если сообщений в очереди нет, то может быть выполнена "фоновая" работа, предусмотренная программистом. Для этого нужен обработчик события, ко­торое генерируется в этой ситуации внутри метода Idle в HandleMessage:

 property Onldle: TIdleEvent;
TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;

Обработчик должен вернуть признак потребности в последующих событиях Onldle в булевом параметре Done. Если "все сделано" и он присваивает Done значение True, то приложение переходит в режим ожидания сообщения и обработчик не вызывается до возникновения следующей ситуации отсутствия сообщений в очереди. Если возвращается значение False, метод будет вызы­ваться все время при отсутствии сообщений.

Пример обработки сообщений OnMessage и Onldle имеется на дискете (название проекта MOVLINES). Их использует программа сохранения экрана, которая вызывается системой по истечении некоторого времени, в обработчике Onldle она рисует на экране линии и прекращает работу, когда обработчик OnMessage получает сообщение от мыши или клавиатуры.

Как видно из приведенного кода метода Run, сообщения обрабатываются вплоть до установки флага:

 (Ro) property Terminated: Boolean; 

Такой флаг устанавливается при получении собщения WM_QUIT. Используя его, можно вставить свои действия на завершающем этапе (после окончания обработки сообщений перед вызовом деструктора Application). Свойство это доступно только для чтения, поэтому завершить приложение можно, вызвав метод

 procedure Terminate; 

который и посылает сообщение WM_QUIT. Для обработки сообщений пред­назначен также метод

procedure ProcessMessages; 

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

 procedure TApplication.ProcessMessages; begin while ProcessMessage do; end; 

Одна или более форм приложения могут иметь статус fsStayOnTop, то есть постоянно находятся поверх других форм (не имеющих этого статуса). Для того, чтобы на время отключить его действие, применяется пара методов:

 procedure Normal!zeTopMosts;

— отключает статус;

procedure RestoreTopMosts; 

— восстанавливает его.

Эти методы могут быть полезными, когда необходимо вывести информацию поверх формы со статусом fsStayOnTop. В самом объекте Application они вызываются соответственно при деактивизации/актнвизации приложения, сво-рачивании/разворачивании главной формы.

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

 property OnActivate: TNotifyEvent; property OnDeactivate: TNotifyEvent; 

Текущее состояние активности можно узнать в свойстве:

 property Active: Boolean; 

События, возникающие соответственно при сворачивании и восстановлении главной формы приложения, также относятся к объекту Application:

 property OnMinimize: TNotifyEvent; property OnRestore: TNotifyEvent; 

Для программного выполнения таких операций есть два метода:

 procedure Minimize; 
procedure Restore;

У Application есть метод:

procedure BringToFront; 

У формы также есть метод с этим названием, который показывает форму поверх остальных и активизирует ее. Отличие этих методов в том, что Form. BringToFront активизирует вызвавшую его форму, а метод Application.BringToFront — ту форму, которая была активна последней.

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

 procedure HandleException(Sender: TObject); 

Стандартная обработка подразумевает вызов метода

 procedure ShowException(E: Exception); 

который отображает диалоговое окно с именем приложения в заголовке и сообщением об ошибке (содержащемся в параметре — объекте Е класса Exception).

Стандартную обработку можно перекрыть (во всех случаях, кроме обработки исключительной ситуации EAbort), определив обработчик события:

 property OnException: TExceptionEvent;
TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;

Целый ряд методов управляет системой помощи. Для ее нормального функционирования в первую очередь необходимо, чтобы было определено имя файла помощи в свойстве:

 property HelpPile: string; 

Если оно определено, то вызов помощи можно осуществить тремя видами запросов, которьм соответствуют методы:

function HelpContext(Context:Осуществляет вызов помощи по заданному контексту.
function HelpJump(const JumpID: string): Boolean-Осуществляет вызов помощи для контекстной строки JumpID. Например, вызов Application.HelpJump('HelpJump ') даст подсказку по этой функции.
function HelpConunand (Command: Word; Data: Longint): Boolean;Посылает системе помощи команду Command с параметром Data. Для описания типов команд см. справку по процедурам WinHelp API Windows.

Все функции возвращают True, если файл Help определен, и произошел вызов приложения WinHelp.

Если вы хотите перехватить обращение к справочной системе, то необходимо написать обработчик события:

 property OnHelp: THelpEvent; 
THelpEvent = function(Command: Word; Data: Longint; var CallHelp: Boolean): Boolean of object;

В нем вы можете предусмотреть предоставление собственной помощи пользо­вателю. Результат True функции означает успех (помощь предоставлена). Если после обработки события по-прежнему нужно вызвать систему помощи Windows (через WinHelp), то в параметре CallHelp нужно вернуть True.

Метод

function MessageBox(Text, Caption: PChar; Flags: Word): Integer; 

содержит вызов стандартного диалогового окна с тем же названием и назна­чением.

Если вы хотите использовать в составе Delphi и вызывать из форм приложения диалог, созданный с помощью других средств программирования, то дескриптор такого диалога должен быть присвоен свойству:

 property DialogHandle: HWnd; 

Подробные правила работы с этим свойством описаны в документации раз­работчика компонентов Delphi.

Наконец, упомянем о системе оперативной подсказки. У приложения имеется собственный текст подсказки, определяемый свойством:

 property Hint: string; 

В отличие от подсказок для других компонентов, он не отображается при остановке мыши. Его содержимое обычно передается строке состояния.

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

 property OnHint: TNotifyEvent; 
property ShowHint: Boolean;
property HintPause: Integer;
property OnShowHint: TShowHintEvent;
property HintColor: TColor;
procedure CancelHint;  


 

Объект Clipboard

 TClipboard = class(TPersistent) 

Объект TClipboard представляет программисту интерфейс с буфером обмена (Clipboard) Windows. При включении в проект модуля CLIPBRD этот гло­бальный объект создается автоматически и доступен приложению в течение всего цикла.

Методы открытия и закрытия буфера обмена

 procedure Open; procedure Close; 

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

Очистка содержимого буфера (для всех форматов) производится вызовом ме­тода:

 procedure Clear; 

О доступных форматах можно узнать, пользуясь следующими свойствами и методами:

 (Ro) property FormatCount: Integer; 

— содержит число форматов в буфере на данный момент;

 (Ro) property Formats[Index: Integer]: Word; 

— содержит их полный список. Функция

 function HasFormat(Format: Word): Boolean; 

проверяет, содержится ли в данный момент формат Format.

Волею разработчиков различаются способы обмена графической и текстовой информацией через буфер обмена. Рассмотрим их независимо.

Через вызов метода

procedure Assign(Source: TPersistent); 

в буфер обмена помещаются данные классов TGraphic, точнее, его потомков — классов TBitmap (формат CF.BITMAP) и TMetaffle (CF.METAFILEPICT). Данные класса TIcon не имеют своего формата и с TClipboard несовместимы.

Допустимо и обратное: в TClipboard есть специальные (скрытые) методы для присваивания содержимого объектам классов TPicture, TBitmap и TMetafile. Допустимы выражения вида:

MyImage.Picture.Assign(Clipboard) ;

Для работы с текстом предназначены методы:

 function GetTextBuf(Buffer: PChar; BufSize: Integer): Integer; 

— читает текст из буфера обмена в буфер Buffer, длина которого ограничена значением BufSize. Функция возвращает истинную длину прочитанного текста;

 procedure SetTextBuf(Buffer: PChar);

— помещает текст из Buffer в буфер обмена в формате CF_TEXT; Свойство property AsText: string;

соответствует содержимому буфера обмена в текстовом формате    CF_TEXT

(приведенному к типу string). При отстутствии там   данных этого формата возвращается пустая строка.

Методы

function GetAsHandle(Format: Word): THandle;
procedure SetAsHandle(Format: Word; Value: THandle);

соответственно читают и пишут данные в буфер в заданном формате Format. При чтении возвращается дескриптор находящихся в буфере данных (или О при отсутствии). Для дальнейшего использования эти данные должны быть скопированы. При записи данные, передаваемые в параметре Value, в даль­нейшем должны быть уничтожены системой (а не программой пользователя).

Два метода предназначены для обмена компонентами через буфер обмена (в специально зарегистрированном формате CF_COMPONENT):

 function GetComponent(Owner, Parent: TComponent): TComponent; 
procedure SetComponent(Component: TComponent);

Они используются составными частями среды Delphi.

 

Компонент TScreen

 TScreen = class(TComponent); 

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

Курсор приложения, общий для всех форм, доступен через свойство:

 property Cursor: TCursor; 

Часто приходится включать "песочные часы" на время выполнения длительной операции. Лучше всего это сделать следующим образом:

 Screen.Cursor := crHourglass; 
try
    (Calculations...}
finally
    Screen.Cursor := crDefault;
end;

Возвращает дескриптор курсора с индексом Indexсвойство:

 property Cursors[Index: Integer]: HCURSOR; 

Няпомшм, что шщексы зарегистрированных курсоров лежат в диапазоне от -17 (crSQLWait) до 0 (crDefault).

Рассмотренный ниже фрагмент кода при инициализации формы заносит имена всех зарегистрированных в системе курсоров в список ListBoxl. Затем, при выборе элемента списка, устанавливается соответствующий ему курсор.

procedure TFormI.FormCreate(Sender: TObject); 
type
    TGetStrPunc = function(const Value: string): Integer of object;
var
    CursorNames: TStringList;
    AddValue: TGetStrPunc;
begin
    CursorNames := TStringList.Create;
    AddValue := CursorNames.Add;
    GetCursorValues(TGetStrProc(AddValue));
    ListBoxl.Items.Assign(CursorNames);
end;

procedure TFormI-ListBoxlClick(Sender: TObject);
begin
    Screen.Cursor := StringToCursor(ListBoxl.Items[ListBoxl.Itemlndex]);
end;

Имена всех установленных в системе шрифтов помещаются в список, опреде-ленньш в свойстве:

(Ro) property Fonts: TStrings; 

Компонент сообщает неизменяемые свойства экрана (в данном видеорежиме). Его размеры в пикселах определены в свойствах:

(ro)property Height: Integer;
(Ro) property Width: Integer;

Число точек на дюйм дисплея содержится в свойстве:

 (Ro) property PixelsPerInch: Integer; 

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

 property Forms[Index: Integer]: TForm; 
property FormCount: Integer;

Нужно иметь в виду, что в списке указаны только формы, открытые приложением, а не все окна системы.

Следующие два свойства указывают на активную в данный момент форму и ее активный элемент управления:

 (Ro) property ActiveControl: TWinControl;
(ro)property ActiveForm: TForm;

При их изменении генерируются соответственно события:

 property OnActiveControlChange: TNotifyEvent; 
property OnActiveFormChange: TNotifyEvent;  

Файлы инициализации

TIniFile = class(TObject)

Этот класс — надстройка над файлом инициализации (его расширение .INI) и процедурами чтения и записи в него значений разных типов. Обратите внимание, что все читаемые и записываемые строки имеют тип string (а не pChar, как в стандартном API Windows).

Конструктор класса

constructor Create(const FileName: string); 

создает объект, соответствующий файлу инициализации с именем FileName. В дальнейшем оно доступно через свойство:

 (Ro) property FileName: string; 

Файл инициализации состоит из строк вида "параметр=значение". Такие строки сведены в секции; имена секций заключаются в квадратные скобки.

Методы класса, посредством которых осуществляется работа с файлом, приве­дены в таблице:

function ReadString(const Section, Ident, Default: string): string;

Возвращает строку из секции Section, являющуюся значением параметра Ident. При отсутствии секции или параметра возвращается строка Default.

procedure WriteString(const Section, Ident, Default: string); Записывает (или перезаписывает) в секцию Section строку Ident=Value.
function Readlnteger(const Section, Ident: string; Default: Longint): Longint; Возвращает значение параметра Ident из секции Section, преобразованное в целое число. В случае любых ошибок возвра­щается значение Default.
 function ReadBool(const Section, Ident: string; Default: Boolean): Boolean;Работает как Readlnteger, но преобразует значение параметра в булеву переменную.
 procedure Writelnteger(const Section, Ident: string; Value: Longint); Преобразует Value в строку и записывает его в качестве значения Ident в секции Section.
 procedure WriteBool(const Section, Ident: string; Value: Boolean); Работает, как Writelnteger, но преобразует булево значение Value к виду '0'/"Г.
 procedure ReadSection(const Section: string; Strings: TStrings) ; Считывает в набор строк Strings секцию с именем Section. Максимальная длина секции — 8191 байт.

procedure ReadSectionValues(const Section: string; Strings: TStrings) ;

Считывает из секции Section в набор строк Strings только значения параметров.
 procedure EraseSection(const Section: string);  Удаляет всю секцию с именем Section.


Печать данных из приложения

Практически каждое приложение, работающее в Windows, имеет набор воз­можностей, позволяющих печатать те или иные данные. В состав Delphi вклю­чен специальный модуль — PRINTERS, в котором описан класс TPrinter, инкап­сулирующий интерфейс печати Windows.

 TPrinter = class(TObject) 

Свойства и методы этого класса позволяют разработчику реализовать доста­точно широкий набор возможностей для печати из приложения. Экземпляр объекта TPrinter с именем Printer создается автоматически при запуске приложения, если в его состав включен соответствующий модуль.

Обычно перед началом печати какого-либо документа из приложения необ­ходимо проверить и при необходимости переустановить стандартные парамет­ры. Этот процесс может быть как автоматическим (проверка и переопределение по умолчанию из программы), так и интерактивным (при помощи стандартных диалоговых окон PrintDialog и PrintSetupDialog).

Информацию обо всех инсталлированных в системе принтерах содержит список свойства:

 (Ro) property Printers: TStrings; 

Свойство доступно только при вьшолнении приложения. Информация о том, какой принтер из списка является текущим, содержится в свойстве:

 property Printerlndex: Integer; 

Оно возвращает порядковый номер принтера в списке. Значение -1 использу­ется для идентификации принтера, установленного по умолчанию.

Метод

procedure GetPrinter(ADevice, ADriver, APort: PChar; var ADeviceMode: THandle); 

возвращает параметры текущего принтера, используя для его идентификации значение свойства Printerlndex.

Метод

procedure SetPrinter(ADevice, ADriver, APort: PChar; ADeviceMode: THandle); 

проверяет, инсталлирован ли в системе принтер с заданными параметрами. В случае успеха этот принтер становится текущим, в случае неудачи инсталлируется новый принтер. Использование этих двух методов не рекомен­дуется справочным руководством, так как по мнению разработчиков вполне достаточно свойств Printers и Printerlndex. Авторы также рекомендуют приме­нять эти методы только подготовленньм разработчикам, если им необходимо работать с драйверами принтеров.

Свойство

(Ro) property Fonts: TStrings; 

содержит список шрифтов, поддерживаемых текущим принтером. Свойство доступно только при вьшолнении приложения.

Расположение листа бумаги определяется свойством:

 property Orientation: TPrinterOrientation;
TPrinterOrientation = (poPortrait, poLandscape) ;

Свойство доступно только при выполнении приложения. Высоту и ширину листа бумаги содержат свойства:

 (Ro) property PageHeight: Integer; 
(Ro) property PageWidth: Integer;

Свойство

property Title: string; 

содержит текстовую строку, которая используется для идентификации процесса печати (работы) в списке Диспетчера печати Windows.

Дескриптор принтера, с которым связан объект TPrinter, возвращается в свой­стве:

 (Ro) property Handle: HDC; 

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

 (Ro) property Canvas: TCanvas; 

При использовании канвы необходимо проверить используемый принтер на предмет поддержки графики. Свойство доступно только при выполнении приложения.

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

procedure BeginDoc; Начинает печать документа.
procedure EndDoc; Завершает печать документа.
(Ro) property Printing: Boolean;
Определяет состояние процесса. Возвращает True во время печати.
 procedure Abort; Используется для прерывания печати.
(Ro) property Aborted: Boolean;Устанавливается в True, если печать прервана.
procedure NewPage; Отменяет печать текущей страницы и начинает распечатку следующей. При этом значение свойства PageNumber увеличивается на единицу.
(Ro) property PageNumber: Integer;Содержит номер печатаемой страницы. Обращение к нему имеет смысл только в процессе печати документа.

В модуле PRINTERS описан метод

procedure AssignPrn(var F: Text); 

который связывает текстовую файловую переменную с текущим принтером, что позволяет направлять на принтер текстовые данные, используя традиционные процедуры Write и Writeln. При печати используется шрифт, определенный в канве объекта TPrinter. Следующий пример распечатывает

содержимое многострочного редактора PrintMemo при нажатии кнопки printBtn:

procedure PrintForm.PrintBtnClick(Sender: TObject); 
var
    PrnTxt: System.Text;
    i: Integer;
begin
    AssignPrn(PrnTxt);
    Rewrite(PrnTxt);
    for i := 0 to PrintMemo.Lines.Count - 1 do
        Writeln (PrnTxt, PrintMemo.Lines [ i ]);
    CloseFile(PrnTxt);
end;

Для печати графики необходимо передать требуемый графический объект (изображение, график, фигуру) в канву объекта Printer. В следующем примере при нажатии кнопки PrintBfcn печатается изображение из компо­нента Printlmage:

procedure PrintForm.PrintBtnClick(Sender: TObject); 
begin
    with Printer do
    begin
        BeginDoc;
        Canvas.Draw(0, 0, Printlmage.Picture.Graphic);
        EndDoc;
    end;
end;

При необходимости пропорции распечатываемого графического объекта можно скорректировать при помощи свойства формы-контейнера PrintScale.

 

Компонент TSession

 TObject -> TPersistent->TConiponent->TSession 

Модуль DB

В Палитре компонентов отсутствует

Осуществляет общее управление процессом связывания базы данных с приложением. Он отсутствует в Палитре компонентов Delphi и создается ав­томатически при выполнении приложения, при этом ему присваивается имя Session. Объект обладает рядом методов, которые позволяют получать и использовать информацию о связях с базой данных. Все свойства объекта доступны только при выполнении приложения и в режиме "Только для чтения". Исключение составляют свойства KeepConnections, NetFileDir и PrivateDir, зна­чения которых можно изменять.

Свойства компонента

(property DatabaseCount: Integer;Определяет число экземпляров компонента TDatabase, используемых в приложении в настоящее время.
property Databases[Index: Integer]: TDatabase;Содержит список всех экземпляров компонента TDatabase, использующихся в приложении в настоящее время.
(Ro) property Handle: HDBISES;
Дескриптор компонента, используется для организации прямого доступа к функциям API BDE.
 property KespConnections: Boolean; Определяет режим соединения с базой данных. В значении True соединение будет поддерживаться до завершения приложения или до вызова метода DropConnection. В значении False соединение прерывается сразу после закрытия всех наборов данных текущей базы.
(Ro) property Locale: TLocale; TLocale = Pointer;Содержит информацию о языковом драйвере BDE.
property NetFileDir: String; Определяет каталог, содержащий сетевой файл управления BDE — PDOXUSRS.NET, предназначенный для соединения с таблицами Paradox.
property PrivateDir: String; Определяет каталог, хранящий временные файлы.

Методы компонента

procedure AddPassword(const Password: String);Позволяет задать пароль для доступа к таблицам Paradox.
procedure CloseDatabase(Database: TDatabase) ;Закрывает компонент TDatabase, иден­тифицируемый по параметру Database.
procedure DropConnections; Прерывает все соединения с неактивными базами данных (не имеющими открытых приложением наборов данных).
function FindDatabase(const DatabaseName: String): TDatabase;Проводит поиск компонента базы данных в списке свойства Databases по имени, которое задается параметром метода. Возвращает указатель на экземпляр компонента TDatabase.
procedure GetAliasNames(List: TStrings);Очищает список, передаваемый в параметре List метода и заполняет его именами всех определенных в BDE псевдонимов.
procedure GetAliasParams(const AliasName: String; List: TStrings);Очищает и заполняет список List параметрами псевдонима, задаваемого параметром AliasName.
procedure GetDatabaseNames(List: TStrings) ;Возвращает список List имен всех баз данных, определенных в BDE и приложении.
procedure GetDriverNames(List: TStrings) ;Очищает и заполняет список List, передаваемый параметром метода, именами всех установленных в BDE драйверов.
procedure GetDriverParams(const DriverName: String; List: TStrings) ;Очищает и заполняет список параметрами драйвера BDE. Параметр DriverName задает имя драйвера, параметр List определяет список.
function GetPassword: Boolean;Показывает стандартный диалог ввода пароля. Возвращает True при нажа­тии кнопки ОК и False при нажатии Cancel.

procedure GetTableNames(const DatabaseName, Pattern: String; Extensions, SystemTables: Boolean; List: TStrings) ;

Очищает список List и заполняет его именами всех таблиц базы данных, имя которой определяется параметром DatabaseName. Параметр Pattern задает шаблон отбора имен таблиц. Параметр Extensions в состоянии True позволяет добавлять к именам таблиц расширения файлов. Параметр SystemTables в состоянии True позволяет добавлять к списку системные таблицы серверов SQL.
procedure GetStoredProcNames(const TStrings) ;Заполняет список List именами всех хранимых процедур для SQL-сервера, задаваемого параметром DatabaseName.
function OpenDatabase(const DatabaseName: String): TDatabase;Открывает существующий компонент TDatabase или создает новый, используя параметр метода DatabaseName. Возвращает указатель на экземпляр компонента.
procedure RemovePasswordfconst Password: String);Удаляет пароль, определяемый параметром Password метода для таблиц Paradox


 

Компонент TDatabase

TObject -> TPersistent->TComponent -> TDatabase

Модуль DB

Страница Палитры компонентов DataAccess

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

  • установление постоянной связи с базой данных;
  • задание параметров сервера;
  • создание локальных псевдонимов BDE;
  • управление транзакциями. 

Свойства компонента

(Pb) property AliasName: TSymbolStr; TSymbolStr = String[DBIMAXNAMELEN] ; DBIMAXNAMELEN = 31;Имя псевдонима, заданного утилитой конфигурации BDE. Значение этого свойства обнуляется при установке свойства DriverName. Используется для связывания с определенным сервером.
(pb) property Connected: Boolean;Управляет процессом соединения компонента с базой данных. В состоянии True разрешает соединение и открытие таблиц. Работает совместно со свойством Keep Connection.
(Pb) property DatabaseName: TFileName; TFileName: String[79];Задает псевдоним присоединяемой базы данных для приложения, который может использоваться компонентами наборов данных (TTable, TQuery) и отображается в их свойстве DatabaseName.
(Ro) property DatasetCount: Integer;Отражает число компонентов наборов данных, используемых невизуальным компонентом TDatabase.
(Ro) property Datasets[Index: Integer]: TDBDataset;Массив указателей на экземпляры компонентов присоединенных наборов данных.
(Pb) property DriverName: TSymbolStr;Имя используемого приложением драйвера BDE. Это свойство обнуляется при определении свойства AliasName.
(ro)property Handle: HDBIDB; Указатель на базу данных, используется для прямого вызова функции API BDE.
(Ro) property IsSQLBased: Boolean;Отражает тип используемого драйвера, зависит от свойства DriverName. Состояние True разрешает использование любого драйвера, кроме STANDARD.
(Pb) property KeepConnection: Boolean;В значении True задает постоянное соединение с базой данных даже при отсутствии открытых наборов данных. При выключенном свойстве для регистрации на сервере необходимо пользоваться свойством Connected для каждого открытия таблицы.
(Ro) property Locale: TLocale;Определяет используемый компонентом языковый драйвер. Позволяет осуществлять прямой доступ к API BDE.
(Pb) property LoginPrompt: Boolean;В стандартном значении True определяет, что при установке соединения с базой данных будет появляться диалоговое окно регистрации пользователя. В значении False регистрационные сведения должны содержаться в полях свойства Params.
(Pb) property Params: TStrings;Содержит параметры, необходимые для подключения к базам данных. По умолчанию это значение свойства устанавливается в соответствие с информацией утилиты конфигурации BDE.
property Temporary: Boolean;Определяет способ создания компонента. True означает, что компонент создается только при открытии таблицы и будет уничтожен при ее закрытии. Если затем свойство установить в False, то компонент будет сохранен. Если при создании компонента свойство было установлено в False, то переопределение в True будет означать уничтожение компонента после закрытия последней таблицы.
(Pb) property Translsolation: TTransIeolation;Определяет уровень изоляции транзакции и используется SQL-сервером. Значение tiDirtyRead разрешает транзакции читать незавершенные изменения, проведенные другой транзакцией; tiReadCommit открывает доступ к изменениям после завершения транзакции; tiRepeatableRead полностью изолирует транзакцию.

Методы компонента

procedure Close; Отсоединяет все связанные с ним компоненты TTable TQuery и TStoredProc.
procedure CloseDatasets; Отсоединяет все дочерние компоненты класса TDataSet, но сам компонент остается открытым.
procedure Commit; Фиксирует все изменения, проведенные транзакцией. Этот метод можно исполь­зовать только при наличии связи с базой данных.
procedure Open; Соединяет компонент с сервером или BDE в случае использования СУБД Paradox или dBase.
procedure Rollback; Отменяет все действия, совершенные транзакцией, то есть запрещает ее фиксацию.
procedure StartTransaction; Начинает выполнение транзакции, используя уровень изоляции из свойства Translsolation. Этот метод рекомендуется использовать только при наличии связи с базой данных.
 

Компонент TDataSource

 TObject -> TPersistent -> TComponent -> TDataSource 

Модуль DB

Страница Палитры компонентов DataAccess

Является связующим звеном между наборами данных, представленных компо­нентами TTable, TQuery и TStoredProc, и визуальными компонентами отобра­жения и управления данными. Каждый набор данных должен иметь по меньшей

мере один компонент TDataSource, так как TTable и TQuery устанавливают соединение с базой данных через BDE, но не умеют отображать полученную информацию в формах приложения. Визуальные компоненты отображают дан­ные, но не имеют представления о структуре передаваемых таблиц. Именно это противоречие устраняет компонент TDataSource. Кроме этого, он приме­няется для связывания таблиц или запросов при построении односвязных форм в Эксперте форм баз данных.

Свойства компонента

(Pb) property AutoEdit: Boolean;Разрешает или запрещает изменение дан­ных визуальными компонентами, связан­ными с TDataSource. В предопределенном состоянии — True, запись разрешена.
(РЙ property Dataset: TDataSet;Определяет связанные компоненты TTable, TQuery и TStoredProc.
(Pb) property Enabled: Boolean;Определяет, проводить ли модификацию записей связанной таблицы в визуальных компонентах при изменении текущей записи.
(Ro) property State: TDataSetState;Задает текущее состояние для связанного компонента набора данных. Это свойство должно быть установлено в соответствие со свойством State связанного компонента набора данных. Возможные значения: dsBrowse, dsCalcField, dsEdit, dslnactive, dslnsert, dsSetKey. При свойстве Enabled в значении False или не определенном значении свойства Dataset свойство State должно устанавливаться в значение dslnactive. Подробно возможные состояния описываются в конце раздела.

Обработчики событий

(Pb) property OnDataChange: TDataChangeEvent ; TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;Вызывается при обработке сообщения визуальных компонентов отображения и управления данными о любых изменениях или при переопределении свойства State в любое состояние из dslnactive. Передаваемый параметр Field определяет измененное поле, при модификации нескольких полей (записи) одновременно устанавливается в nil.
(Pb) property OnStateChange: TNotifyEvent;Вызывается при изменении свойства State.
(Pb) property OnUpdateData: TNotifyEvent;Реагирует на методы Post и UpdateData (см. ниже) компонентов наборов данных и передает сообщение визуальным компонентам отображения и управления данными о необходимости изменения соответствующих полей.

Методы компонента

procedure Edit; Предназначена только для вызова аналогичного метода компонента набора данных. Используется при свойствах AutoEdit = True и State = dsBrowse.


 

Компонент TTable

TObject ->TPersistent ->TCoinponent ->TDataSet -> TDBDataSet -> TTable 

Модуль DBTABLES

Страница Палитры компонентов DataAccess

Играет важную роль в приложениях, работающих с базами данных. Он пред­назначен для соединения таблиц баз данных через BDE с приложением (ком­понентом TDataSource). Через него идет и обратная связь. С одним компо­нентом TTable может быть связано несколько TDataSource, но обратное не­верно. TTable имеет мощный набор свойств и методов для управления набором данных.

Свойства компонента

(Pb) property Active: Boolean;Регулирует доступ к данным. При значении True открывает набор данных и устанав­ливает его в состояние Browse, в противном случае устанавливается состояние Inactive.
 (Pb) property AutoCalcField: Boolean; Определяет вызов обработчика события OnCalcField. В значении True метод вы­зывается всегда при редактировании полей.
(Ro) property BOF: Boolean; (Ro)
Сообщает о нахождении курсора в первой записи набора данных.
 property CanModify: Boolean; Устанавливает возможность изменения дан­ных.
(Ro) property Database: TDatabase;Идентифицирует компонент TDatabase, связанный с TTable.
(Pb) property DatabaseName: TFil-Name;Определяет доступ к базе данных. Может задаваться в виде псевдонима BDE, пути к файлам, специфического псевдонима приложения.
(Ro) property DBHandle: HDBIDB;
Определяет дескриптор базы данных, необходимый, в частности, для организации вызова функций API BDE из приложения.
 (Ro) property DBLocale: TLocale; Задает языковый драйвер для BDE.
(Bg property EOF: Boolean;Сообщает о нахождении курсора в последней записи набора данных.
(Pb) property Exclusive: Boolean;Используется для установки полного контроля над открываемой таблицей и предотвращения доступа к ней других пользователей. Перед работой с этим свойством необходимо задать свойству Active значение False. При попытке открытия уже используемой другими таблицы с Exclusive = True возникает исключительная ситуация. Свойство полезно при создании приложений для систем, использующих разделяемые файлы.
(Rо) property FieldCount: Integer; Сообщает о числе колонок таблицы, используется визуальными компонентами отображения данных.
Wo) property FieldDefs: TFieldDefs;Содержит информацию о каждом объекте TFieldDef (см. ниже), связанном с компонентом таблицы.
(Ro) property Fields[Index: Integer]: TField;Позволяет получить информацию о полях таблицы.
(ro)property Handle: HDBICur; Дескриптор компонента, позволяет получить доступ к функциям API BDE.
(Ro) property IndexDefs: TIndexDefs;Позволяет получить информацию обо всех используемых компонентом индексах. Перед использованием свойства необходимо вызывать метод Update объекта TIndexDefs для обновления данных.
(Ro) property IndexFieldCount: Integer;Означает число действительных полей для текущего индекса.
(Pb) property IndexFieldNames: String;Используется SQL-сервером для иден­тификации полей, являющихся индексами. Имена полей разделяются точкой с запятой и не должны содержать более 255 символов. Здесь могут быть описаны не только физи­ческие индексы (хранимые в индексных файлах), но и создаваемые на время выпол­нения приложения.
(Pb) property IndexName: String;Определяет вторичный индекс. Установка свойства приводит к обнулению свойства IndexFieldNames.
(Ro) property IndexFields[Index: Integer] ^Fields-Содержит информацию обо всех полях текущего индекса.
property KeyExclusive: Boolean;Определяет, исключать ли из рассмотрения возвращаемые функциями сортировки и поиска записи. Значение по умолчанию — False. Для методов SetRangeStart и SetRangeEnd определяет включающие или исключающие границы диапазона значений. Для методов GoToNearest и FindNearest определяет место нахождения курсора.
 property KeyFieldCount: Integer;  Определяет число ключевых полей для поиска.
(Ro) property Locale: TLocale;Идентификатор языкового драйвера для BDE.
(Pb) property MasterFields: String;
Задает имена полей для связи подчиненной таблицы с главной таблицей. При необхо­димости определить несколько полей, их имена разделяются точкой с запятой. При изменении номеров записей в главной табли­це, значения в полях используются для выборки записей из подчиненной таблицы.
 TDataSource; Определяет компонент TDataSource, который представляет главную таблицу.
(Ro) property Modified: Boolean;  Показывает, проводились ли изменения в полях записи с момента открытия таблицы или вызова методов Post или Cancel.
property Readonly: Boolean;Устанавливает режим "Только для чтения". Перед использованием необходимо установить свойство Active в False.
(Ro) property RecordCount: Longint;Отображает число записей в наборе данных.
(Ro) property State: TDataSetSCate;
Показывает текущее состояние набора данных (см. аналогичное свойство компонента TDataSource). Значение этого свойства важно при использовании многих методов компонента.
(Pb) property TableName: TFileName; Содержит имя таблицы, используемой ком­понентом.
(Pb) property TableType: TTableType;Определяет тип используемой таблицы в соответствии с расширением файла (режим Default) или типом TTableType, который содержит следующие значения: ttDefault, “Paradox, “DBase, “ASCII.
(Pb) property UpdateMode: TUpdateMode;

Определяет способ обновления данных при работе с базами SQL и задает поля, которые используются для поиска записи в базе. Возможны следующие значения: Where All — использует все поля; WhereKeyOnly — использует только ключевые поля; WhereChanged — использует ключевые и измененные поля записи. Наиболее жестким, предпочтительным и надежным является режим WhereAll (устанавливается по умолчанию).


 

Обработчики событий TTable

Делятся на две большие группы: вызываемые до (Before) и после (After) методов Open, Insert, Edit, Post, Delete, Cancel и Close. Информацию об этих группах можно получить, используя справочную систему Delphi. Кроме этого сущест­вуют еще два обработчика:

 property OnCalcFields: TDataSetNotifyEvent ; TDataSetNotifyEvent = procedure (DataSet: TDataSet) of object;Используется для определения значений вычисляемых полей и вызывается при чтении записи из базы. При свойстве AutoCalcFields = True этот обработчик вызывается при изменении значений невычисляемых полей, если установлено состояние EdsEdit или Edslnsert. При выполнении процедуры набор данных должен находиться в состоянии CalcFields.
property OnNewRecord: TDataSetNotifyEvent;Реагирует на добавление в набор данных новой записи. Позволяет редактиро­вать новые записи без изменения свойства Modified,

Методы компонента

procedure Addlndex(const Name, Fields: String; Options: TIndexOptions); TIndexOptions = set of (ixPrimary, ixUnique, ixDescending, ixNonMaintained, ixCaseInsensitive);Создает новый индекс для компонента. Параметры: Name — название индекса, Fields — поля индекса, Options — опции типа TIndexOptions (см. примеч. 1).
procedure ApplyRange; Проводит фильтрацию записей таблицы. Подмножество отбора определяется методами SetRangeStart и SetRangeEnd или EditRangeStart и EditRangeEnd.
procedure Append; Предназначена для включения в таблицу новых записей. Метод позиционирует курсор в конец набора, переводит его в состояние Insert и открывает новую пустую запись.
procedure AppendRecord(const Values: array of const) ;Добавляет к таблице новую непустую запись, данные для полей определяются параметром Values. Порядок следования сохраняется. Если число элементов параметра меньше числа полей, то оставшиеся поля устанавливаются в NULL. Типы элементов пара­метра Values должны совпадать с типами полей.
function BatchMove(ASource: TDataSet; AMode: TBatchMode): Longint;Добавляет, удаляет, копирует или обновляет группы записей. Параметры: ASource задает источник записи, AMode — используемый режим. Режим определяется типом TBatchMode: batAppend, batUpdate, batAppendUpdate, batDelete, batCopy. Функция возвращает число обработанных записей.
procedure Cancel; Переводит набор данных в состояние dsBrowse и отменяет любые изменения для текущей записи.
procedure CancelRange; Отменяет фильтрацию записей таблицы, задаваемую функциями ApplyRange и SetRange.
procedure CheckBrowseMode; Производит проверку открытия набора данных и отсутствия предполагаемых изменений. Если набор данных закрыт, выводится соответствующее сообщение об ошибке. Если компонент находится в состоянии dsEdit, dslnsert или dsSetKey, то вызывается метод Post для передачи в базу данных любых накопленных изменений.
procedure ClearFields; Возвращает всем полям текущей записи исходные значения. Набор данных должен находиться в состоянии dsEdit.
 procedure Delete;Удаляет из таблицы текущую запись, устанавливая курсор на последующую.
procedure CreateTable;

Создает новую пустую таблицу. Перед вызовом метода необходимо установить необходимые значения свойств DatabaseName, TableName, TableType, FieldDefs и IndexDefs.

 procedure CursorPosChanged; Используется для передачи сообщения компоненту TDataSet об изменении положения курсора функциями API BDE. Эта процедура используется при определенном свойстве Handle.
procedure DeleteTable; Уничтожает таблицу, определяемую свойствами DatabaseName, TableName, TableType.
procedure DisableControls; Временно приостанавливает соединение набора данных со всеми связанными компонентами TDataSource. В результате прерывается связь с визуальными компонентами. Существует метод обратного действия — EnableControls.
procedure EditKey; Предназначена для корректировки содержимого буфера ключей поиска. Используется только для .поиска на многих полях после вызова метода SetKey. Для перемещения в найденное поле используется метод GotoKey. He очищает буфер ключей поиска после использования.
procedure EditRangeEnd;

Позволяет переопределить порядок отбора записей, установленный методом SetRangeEnd. Модифи­цируется набор ключей конца последовательности. Новый порядок может быть реализован методом ApplyRange. Для таблиц Paradox и dBase метод применим только для индексированных полей, а для баз SQL — для всех колонок, определенных свойством IndexFieldNames.

procedure EditRangeStart; Действует аналогично предыдущему методу, изменяя значение начального ключа.
procedure EmptyTable; Уничтожает все записи таблицы, которая определяется свойствами DatabaseName, TableName и TableType. Для открытой таблицы должно быть включено свойство Exclusive.
procedure EnableControls; Восстанавливает соединение со всеми компонентами TDataSource, связанными с данным компонентом и временно отключенными методом DisableControls.
function FieldByName(const FieldName: String): TField;Возвращает ссылку на экземпляр объекта TField и удобна для работы с конкретным полем. Ее использование не нарушает структуры таблицы, в отличие от применения свойства Fields. Параметром FieldName передается название поля.
function FindField(const FieldName: String): TField;Возвращает ссылку на экземпляр объекта TField, используя имя, передаваемое параметром PieldName. Не изменяет структуру таблицы. В случае отсутствия заданного поля возвращает nil.
function FindKey(const KeyValues: array of const): Boolean;Предназначен для поиска записи по индексу. Параметр KeyValues задает список полей индекса. Метод устанавливает набор данных в состояние SetKey. В случае успеха функция возвращает True и перемещает курсор на наиденную запись, в случае неудачи возвращается False.
procedure FindNearest(const KeyValues: array of const);Находит запись, индекс которой больше или равен заданному параметром KeyValues. Курсор перемещается на найденную запись. Для поиска могут использоваться только строковые поля. По умолчанию используются первичные индексы, задание необходимых значений свойств IndexFieldNames или IndexName позволяет проводить поиск по другим индексам. Для таблиц Paradox и dBase метод применим только к индексированным полям, а для баз SQL — ко всем полям, определенным свойством IndexFieldNames.
procedure First; Устанавливает курсор на первую запись текущего расположения записей набора данных. На результат влияет применение метода SetRangeStart.
procedure FreeBookmark(Bookmark: TBookmark) ; TBookmark = Pointer;Освобождает системные ресурсы, используемые методом GetBookmark. Параметр Bookmark задает идентификатор используемой закладки.
function GetBookmark: TBookmark;Устанавливает закладку на текущей записи, к ней можно вернуться в любой момент при помощи метода GotoBookmark. Возвращает указатель на экземпляр закладки типа TBookmark. Все установ­ленные закладки уничтожаются при закрытии табли­цы или изменении индексов.
procedure GetFieldNames(List TStrings) ;Записывает имена полей набора данных в параметр List.
 procedure GetIndexNames(List TStrings) ; Записывает все индексы набора данных в параметр List.
 procedure GotoBookmark(Bookmark: TBookmark) ; Позиционирует курсор на записи, которой соот­ветствует закладка, указатель на которую передается в параметре Bookmark.
procedure GotoCurrent(Table: TTable);Используется для совмещения курсоров двух экземпляров компонента, которые используют одну и ту же таблицу. Изменяется положение курсора того компонента, который задан параметром Table. Для выполнения метода необходима идентичность свойств DatabaseName и TableName обоих экземпляров компонента.
function GotoKey: Boolean; Перемещает курсор на запись, определяемую ключом. Возвращает True в случае успешного поиска. Используется совместно с методами SetKey или EditKey. Если для ключа используется несколько полей, то их число необходимо задать свойством KeyFieldCount.
procedure GotoNearest;  Используется для перехода к записи, чей индекс равен пли больше значения свойства IndexField. Поиск проводится с первой записи. Используется совместно с методами SetKey и EditKey.
procedure Insert; Переводит набор данных в состояние Insert и вставляет на месте курсора новую пустую запись. При наличии в таблице индексов метод размещает новую запись в соответствие с ними.
 procedure InsertRecord(const Values: array of const); Добавляет в набор данных новую запись, заполняя ее поля значениями, передаваемыми параметром Values. Число величин в параметре может быть меньше, чем полей в таблице, в этом случае недостающие значения будут интерпретироваться как пустые. Типы данных должны совпадать. При наличии в таблице индексов метод размещает новую запись в соответствие с ними.
procedure Last;  Перемещает курсор на последнюю запись текущего порядка расположения записей. На результат влияет использование метода SetRangeEnd.
procedure MoveBy(Distance: Integer) ;

Перемещает курсор на число записей, задаваемое параметром Distance. При положительном значении параметра перемещение осуществляется по направлению к концу'таблицы.

 procedure Next;  Перемещает курсор на одну запись к концу таблицы.
procedure Open; Открывает набор данных, находящийся в состоянии Browse. Аналогичным действием обладает свойство Active = Тruе.
procedure Post; Производит передачу текущей записи в базу данных. Результат зависит от состояния набора данных (см. свойство State): в Edit запись модифицируется, в Insert запись вставляется или добавляется в конец таблицы, в SetKey измененные поля помещаются в буфер ключа поиска и для набора данных устанавливается состояние Browse. Метод вызывается автоматически при перемещениях по таблице при помощи методов First, Last, Next, Prior, MoveBy, если набор данных находится в состояниях Edit или Insert. Post вызывается также для методов Append, AppendRecord, Insert, InsertRecord, если есть данные, нуждающиеся в обновлении. Если метод не может записать данные в базу, то набор данных устанавливается в состояние Edit.
procedure Prior; Перемещает курсор на одну строку к началу таблицы.
procedure Refresh; Обновляет набор данных, читая информацию из базы данных. Применение метода может вызвать противоречие с текущим набором данных компонента, так как не все проведенные приложением изменения могут быть переданы в базу или другие пользователи могут изменить используемую таблицу.
procedure SetFields(const Values: array of const) ;Изменяет значения полей таблицы, используя массив данных, передаваемый параметром Values. Для успешного применения метода необходимо установить набор данных в состояние Edit. При значении Values = nil, поля устанавливаются в предопределенные значения.
procedure SetKey; Устанавливает для набора данных состояние SetKey (см. свойство State), которое позволяет осуществлять поиск записей по задаваемым в буфере ключей поиска значениям. Буфер представляет собой набор полей, связанных с табличными ключевыми полями. Метод отличается от процедуры EditKey тем, что уничтожает старое содержимое буфера.
procedure SetRange(const StartValues, EndValues: array of const);Объединяет методы SetRangeStart, SetRangeEnd, ApplyRange и используется для переупорядочивания данных. Параметр StartValues используется для определения начального индексного ключа, а массив EndValues для конечных ключей. В таблицах баз Paradox и dBase метод применим только для индексированных полей, а в SQL — для всех колонок, определенных свойством IndexFieldNames.
procedure SetRangeEnd; Задает набор ключей конца последовательности для последующей фильтрации записей таблицы. Метод очищает набор ранее определенных ключей. Резуль­тат используется методом ApplyRange. В таблицах баз Paradox и dBase метод применим только для индексированных полей, а в SQL — для всех колонок, определенных свойством IndexFieldNames.
procedure SetRangeStart;  Устанавливает курсор BDE в положение текущего курсора компонента. Задает набор ключей начала последовательности. В остальном аналогичен предыдущему методу.
procedure UpdateRecord; Автоматически вызывается после применения метода Post и сообщает всем связанным компонентам TDataSource о факте изменения исходной таблицы в базе данных для последующей передачи изменений визуальным компонентам отображения данных.


 

Компонент TQuery

TObject ->TPersistent -> TComponent -> TDataSet -> TDBDataSet -> TQuery 

Модуль DBTABLES

Страница Палитры компонентов DataAccess

Используется приложением для связи с SQL-серверами через BDE, открывает доступ к использованию языка SQL для создания запросов с целью получения данных от SQL-сервера. Компонент незаменим при построении приложений клиент/сервер. Передает данные визуальным компонентам через связанный ком­понент TDataSource. TTable и TQuery имеют много общих свойств, обра­ботчиков событий и методов, поэтому ниже будут описаны только уникальные инструменты компонента.

Свойства компонента

(Ro) property Params: TParams ;Представляет собой массив экземпляров объекта TParam и определяет характеристики всех параметров запроса.
 (Wf property Local: Boolean;  Принимает значение True, если связанная с компонентом таблица принадлежит локальным базам Paradox или dBase. False устанавливается в случае использования таблиц SQL-сервера.
 (Ro) property ParamCount: Word; Отражает число записей, содержащихся в массиве свойства Params, т. е. количество параметров, содержащихся в запросе.
property Prepared: Boolean; В значении True сообщает о вызове метода Prepare. Перед изменением свойства необходимо закрыть набор данных (Active = False).
(р1э) property RequestLive: boolean;Для результата запроса устанавливает режим "Только для чтения" при значении False. В True разрешает режим обновления набора данных только в случае использования ограниченного синтаксиса запросов. В противном случае, при использовании локального SQL, устанавливается режим "Только для чтения".
(Pb) property SQL: TStrings; Содержит текст запроса SQL, который будет выполнен при вызове методов Open или ExecSQL. При предполагаемом использовании метода Open перед изменением свойства необходимо закрыть набор данных (метод Close). Для изменения свойства при выполнении приложения, необходимо использовать методы Clear (уничтожение предыдущего состояния) и Add (новое состояние) объекта TSrings. Для загрузки готового запроса из файла используйте метод LoadFromFile.
(fio) property StmtHandle: HDBIStmt;Позволяет компоненту получить прямой доступ к функциям API BDE, использующим результаты запросов.
(Ro) property Text: PChar; Содержит запрос SQL, передаваемый BDE.
(Pb) property UniDirectional: Boolean;При значении True разрешает перемещение по набору данных результатов запроса только вперед. Этот режим позволяет экономить системные ресурсы, так как не проводится кэширование данных. По умолчанию установлено в False.

Ограничения синтаксиса для запросов к локальным Paradox и dBase:
  • используются запросы только к одной таблице;
  • нельзя использовать ORDER BY; • запрещены функции AVG и SUM;
  • запрещены вычисляемые поля (запрет распространяется только на запросы, в самом компоненте такие поля разрешены);
  • WHERE разрешается использовать только для сравнения имен колонок и скалярных констант;
  • допускаются операторы сравнения LIKE,>,<,>=,<=.

Обработчики событий

У компонентов TQuery и TTable полностью совпадают.

Методы компонента

procedure ExecSQL; Выполняет запрос, содержащийся в свойстве SQL. Этот метод используется при наличии в запросе предложений INSERT, UPDATE, DELETE или любых-предложений Data Definition Language.
procedure ExecNonQuery;Выполняет запрос, если он предусмат­ривает возвращение результата (использу­ется предложение SELECT), в противном случае используется метод ExecSQL.
function ParamByName(const Value: String): TParam;Возвращает элемент свойства Params, используя параметр Value.
procedure Prepare; Посылает запрос в BDE для проверки синтаксиса и оптимизации. Использование метода необязательно, но очень полезно для динамических запросов, которые выполняются неоднократно, так как в противном случае подготовка запроса будет выполняться автоматически каждый раз.
procedure UnPrepare; Устанавливает свойство Prepared в False. В этом случае запрос (свойство SQL) будет транслирован еще раз перед передачей на сервер. При этом сервер получает сообще­ние о возможности освободить ресурсы, связанные с проверкой запроса, так как новый запрос будет отправлен перед вызовом методов ExecSQL или Open.

 

Компонент TStoredProc

TObject -> TPersistent -> TCornponent -> TDataSet -> TDBDataSet -> TStoredProc 

Модуль DBTABLES

Страница Палитры компонентов DataAccess

Позволяет приложению использовать хранимые процедуры сервера базы дан­ных. Хранимые процедуры являются разновидностью метаданных и могут возвращать как единичные записи, так и наборы данных. TStoredProc имеет

много общего с другими дочерними компонентами объекта TDataSet, поэтому ниже будут описаны только уникальные свойства и методы компонента, все общие параметры рассматриваются выше.

Свойства компонента

(РЬ) property Overload: Word;Предназначено для использования пакетов хранимых процедур серверов Oracle. Означает порядковый номер используемой перезагружаемой хранимой процедуры. Значение по умолчанию — 0.
(Pb) property ParamBindMode: TTParamBindMode; TParamBindMode = (pbByName, pbByNumber) ;Определяет, каким образом элементы массива свойства Params будут связаны с параметрами хранимой процедуры. Значение pbByName подразумевает расположение параметров по именам; pbByNumber располагает параметры в порядке их определения в хранимой процедуре.
(Ro) property ParamCount:Word;Определяет общее число передаваемых и получаемых параметров хранимой процедуры.
(Pb) property Params: TParams;Содержит массив параметров хранимой процедуры.
property Prepared: Boolean; В значении True инициирует процесс оптимизации хранимой процедуры на сервере. Аналогично по действию методу Prepare. При значении False работает как метод UnPrepare.
(Pb) property StoredProcName: String;Определяет имя хранимой процедуры на сервере.

Обработчики событий

У компонентов TQuery, TTable и TStoredProc полностью совпадают.

Методы компонента

procedure CopyParams(Value: TParams) ;Копирует всю информацию о параметрах хранимой процедуры в параметр Value.
function DescriptionsAvailable: Boolean;Возвращает True, если в передаваемых хранимой процедуре параметрах содержится вся необходимая серверу информация. В случае недостатка данных возвращается False.
procedure ExecProc; Выполняет хранимую процедуру. Используется при ожидаемом возвраще­нии одной записи в результате.
procedure GetResults; Используется только для получения результата выполнения хранимой процедуры сервера SyBase, так как сервер возвращает результат только после достижения курсором последней записи набора данных.
procedure Open; Выполняет хранимую процедуру. Используется при ожидаемом возвращении группы записей в качестве результата.
procedure Prepare;
Проводит подготовку выполнения хранимой процедуры на сервере.
 procedure UnPrepare; Передает серверу сообщение об отказе от использования хранимой процедуры и о необходимости освободить занимаемые ею ресурсы.


 

Компонент TReport

 TObject -> TPersistent -> TComponent -> TReport 

Модуль REPORT

Страница Палитры компонентов DataAccess

Позволяет включать в состав разрабатываемого приложения отчеты, генерируемые утилитой ReportSmith и управлять его работой во время вы­полнения приложения.

Свойства компонента

(Pb) property AutoUnload: Boolean;Управляет процессом завершения генерации отчета. При значении True ReportSmith выгружается из памяти после генерации отчета.
property Component Index: Integer;Содержит порядковый номер компонента в списке компонентов.
property EndPage: Word; Определяет номер последней страницы отчета для печати (по умолчанию 9999).
(Pb) property InitialValues: TStrings;Задает список строк, используемых отчетом.
(Pb) property MaxRecords: Word; Задает число записей, используемых для генерации отчета.
(рb) property Preview: Boolean;Задает способ просмотра отчета. При значении True отчет отображается на экране монитора, в противном случае печатается.
(Pb) property PrintCopies: Word;Задает число копий отчета для печати (по умолчанию 1).
(ro)property ReportHandle: HWND; Определяет дескриптор ReportSmith.
(Pb) property ReportDir: String;Содержит маршрут доступа к создаваемым отчетам.
(Pb) property ReportName: String;Определяет имя выполняемого отчета.
(Pb) property StarCPage: Word;Задает номер страницы отчета, с которой начинается печать.
(Ro) property VersionMajor: Integer;Содержит старший порядок номера версии ReportSmith (например, VersionMajor = 2 для версии 2.5).
(Ro) property VersionMinor: Integer;Содержит младший порядок номера версии ReportSmith.

Методы компонента

function CloseApplication(ShowDialogs: Boolean): Boolean;Завершает выполнение утилиты ReportSmith, используя сообщения DDE. Возвращает True при получении сообщения об успешном завершении работы. Параметр ShowDialogs разрешает или запрещает показ диалогового окна сохранения текущего отчета.
function CloseReport(ShowDialogs: Boolean): Boolean;Управляет завершением процесса создания отчета, используя сообщения DDE. Возвращает True в случае успеха. Параметр ShowDialogs разрешает или запрещает показ диалогового окна сохранения текущего отчета.
function Connect(ServerType: Word; const ServerName, UserName, Password, DatabaseName: String): Boolean;Выполняет связывание отчета и базы данных, используя диалог регистрации ReportSmith.
function Print: Boolean; Управляет печатью отчета, используя сообщения DDE. Возвращает True в случае успеха.
function RecalcReport: Boolean;Заново генерирует и печатает отчет, используя результаты работы метода SetVariable. Для связи с ReportSmith используются сообщения DDE. Возвращает True в случае успеха.
procedure Run; Загружает ReportSmith, генерирует и печатает отчет.
function RunMacro(Macro: PChar): Boolean-Выполняет макрокоманду ReportBasic, определяемую параметром Macro. Используются сообщения DDE. Возвращает True в случае успеха.
function SetVariable(const Name, Value: String): Boolean;Переопределяет параметры отчета. Параметр Name определяет имя отчета, Value задает новые параметры отчета. Используются сообщения DDE. Возвращает True в случае успеха.
function SetVariableLines(const Name: String; Value: TStrings): Boolean;Отличается от предыдущей тем, что SetVariable требует задания значения свойства ReportName.


 

Компонент TBatchMove

 TObject -> TPersistent -> TComponent -> TBatchMove 

Модуль DBTABLES

Страница Палитры компонентов DataAccess

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

Свойства компонента

property AbortOnKeyViol: Boolean;В состоянии True прерывает выполнение метода Execute при возникновении оши­бок. При значении False все некорректные ключи помещаются в специальную таб­лицу.
(Pb) property AbortOnProblem: Boolean;В состоянии True прерывает выполнение метода Execute при попытке удаления записей источника во время их передачи приемнику. В состоянии False информация о таких ситуациях сохраняется в специ­альной таблице.
property ChangedCount: Longint ;Определяет число записей помещенных в таблицу, определяемую свойством ChangedTableName.
(Pb) property ChangedTableName: TFileName;'Задает имя создаваемой локальной таблицы в формате Paradox, в которую помещаются записи приемника, изменяемые при выполнении групповых операций.
(РЙ property Destination: TTable;Определяет компонент TTable, который будет выступать приемником групповых операций.
(Ro) property KeyViolCount: Longint;Задает число записей приемника, при операциях с которыми возникли критические ситуации.
(Pb) property KeyViolTableName: TFileName;

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

property Mappings: TStrings;Определяет порядок связывания полей таблиц источника и приемника и содержит список имен полей. Для связывания поля источника с полем приемника свойству присваивается имя поля источника. Поля разных типов преобразуются наилучшим возможным способом, однако таких способов может и не существовать и тогда генерируется сообщение об ошибке.
(Pb) property Mode: TBatchMode; TBatchMode = (batAppend, batUpdate, batAppendUpdate, batDelete, batCopy) ;Задает режим использования групповых операций TBatchMode.
(Ro) property MovedCount: Longint ;Содержит общее число операций, выполненных методом Execute, включая конфликтные.
(Ro) property ProblemCount: Longint;Отражает число записей которые не были добавлены в таблицу приемника из-за несоответствия ширины полей.
(Pb) property ProblemTableName: TFileName;Задает имя таблицы, в которой разме­щаются записи, не попавшие в таблицу приемника из-за несовпадения ширины полей.
(Pb) property RecordCount: TFileName;Используется для управления числом перемещаемых записей. При нулевом значении процесс начинается с первой записи источника, в противном случае с текущей записи.
(Pb) property Source: TDataSet;Содержит имя компонента TTable или TQuery, служащего источником данных.
(Pb) property Transliterate: Boolean;В значении True разрешает трансляции между локальными источником и приемником.

Методы компонента

procedure Execute; Выполняет групповую операцию в соответствие с заданными свойствами компонента.


 

Компонент TField

TObject -> TPersistent -> TComponent -> TField 

Модуль DB

В Палитре компонентов отсутствует

Предназначен для работы с полями таблиц баз данных. Отсутствует в Палитре компонентов, так как является абстрактным компонентом и выступает предком для ряда типизированных компонентов (см. рис. 4.17), которые наследуют все базовые свойства и методы для работы с полями. Объекты-наследники авто­матически создаются для каждого используемого приложением поля при вы­полнении приложения. Эти компоненты создаются динамически в случае опре­деления значения True для свойства Active компонентов TTable и TQuery. Компонент TField играет важную роль для приложений, работающих с базами данных, так как предоставляет возможность прямого доступа к полям таблиц. Каждый компонент содержит не только сведения о типе данных, наборе зна­чений и т. п., но и предоставляет информацию, которая используется визу­альными компонентами отображения данных. В процессе разработки работа с компонентами TField осуществляется при помощи Редактора полей.

Свойства компонента

property Alignment: TAlignment;Содержит способ выравнивания (см. главы 1, 2) компонента и используется визуальными компонентами TDBGrid и TDBEdit.
property AsBoolean: Boolean- Содержит значение для TBooleanField. Для TStringField возвращает True, если поле начинается с символов Y,y,T,t (Yes, yes, True, true).
property AsDateTime: TDataTime;Содержит значение для TDateTimeField или TTimeField. Для TStringField проводит конвертацию.
property AsFloat: Double; Содержит значение для TFloatField, TBCDField, TCurrencyField. Для TStringField проводит конвертацию.
property Aslnteger: Longing- Содержит значение для TIntegerField, TSmallintField, TWordField. Для TStringField проводит конвертацию.
property AsString: String; Содержит значение для TStringField. Для TBCDField, TFloatField, TCurrencyField, TDateTimeField, TTimeField, TIntegerField, TSmallintField, TWordField проводит конвертацию. Для TBooleanField возвращает True, если текст начинается с символов Y,y,T,t. Для TMemoField, TGraphicField, TBIobField, TBytesField, TVarBytesField используется только для чтения и возвращает строки "Memo", "Graphic", "Blob", "Bytes", "VarBytes".
(Pb) property Calculated: Boolean;Содержит True, если поле вычисляемое.
(Ro) property CariModify: Boolean;Определяет возможность изменения характеристик поля.
property DataSet: TDataSet; Идентифицирует набор данных поля.
property DataSize: Word; Содержит число байт, необходимое для размещения компонента в памяти.
property DataType: TFieldType; TFieldType = (ft Unknown, ftString, ftSmallint, ftlnteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic) ;Определяет тип данных поля.
property DisplayLabel: String;Содержит заголовок поля, используемый компонентом TDBGrid.
(Ro) property DisplayName: PString;Содержит имя поля. Используется аналогично свойствам DisplayLabel или FieldName других компонентов.
property DisplayText: String; Содержит символьное представление значения поля, используемое визуальными компонентами в состоянии Edit.
property DisplayWidth: Integer;Отражает ширину в символах поля, используемого компонентом TDBGrid.
property EditMask: String; Служит для создания шаблона, ограни­чивающего данные, выводимые в поле. Маска состоит из трех секции, разделяемых точкой с запятой. Первая содержит тело маски. Вторая содержит символ, определя­ющий, будут ли буквенные символы маски сохраняться как часть данных (0 — не со­храняются, 1 — сохраняются). Третья содержит символ, определяющий пробел для маски.
(Ro) property EditMaskPtr: PString;Является указателем на строку свойства EditMask.
(Pb) property FieldName: String;Содержит имя, которое поле имеет в таблице базы данных.
(Re) property FieldNo: Integer;Порядковый номер компонента в наборе данных.
(Pk) property Index: Integer;Номер компонента в массиве свойства Fields набора данных. Изменение значения этого свойства приводит к изменению расположения поля в наборе данных.
(Ro) property IsIndexField: Boolean;В состоянии True означает, что поле индексировано.
(Ro) property IsNull: Boolean;Находится в состоянии True, если текущее поле пустое.
(Pb) property Readonly: Boolean;Определяет режим редактирования текущего поля. Значение True определяет режим "Только для чтения".
(№) property Required: Boolean;В значении True означает, что поле обязательно должно быть не пустым.
property Size: Word; Определяет размер поля, размещаемого в наборе данных.
property Text: String; Содержит символьное представление значения текущего поля в режиме Edit, используется визуальными компонентами отображения данных.
(Pb) property Visible: Boolean;Определяет режим отображения компонента.

Обработчики событий

(Pb) property OnChange: TFieldNotifyEvent ; TFieldNotifyEvent = procedure(Sender: TField! of object;Реагирует на изменение значений полей компонента. Если поле связано с визуальным компонентом отображения данных, то обработчик вызывается только при попытке изменить текущую запись.
(Pb) property OnGetText: TFieldGetTextEvent ; TFieldGetTextEvent = procedure(Sender: TField; var Text: String; DisplayText: Boolean) of object;Обрабатывает обращение к свойствам DisplayText и Text. Обработчик работает с DisplayText при использовании режима просмотра и Text при режиме редак­тирования.
(Pb) property OnSetText: TFieldSetTextEvent; TFieldSetTextEvent = procedure(Sender: TField; const Text: String) of object;Используется при переопределении зна­чения свойства Text.
(Pb) property OnValidate: TFieldNotifyEvent;Реагирует на редактирование содер­жимого компонента. Обработчик вызыва­ется для визуальных компонентов отобра­жения данных только при попытке измене­ния записи.

Методы компонента

procedure Assign(Source: TPersistent); override;Копирует данные из одного компонента в другой, при этом должны быть корректно определены свойства DataType и Size. Параметр Source определяет поле — источник данных. Свойство DataSize источника должно иметь значение не больше 255.
procedure AssignValue(const Value: 'TVarRec) ;Устанавливает значение поля в соответствие с параметром метода Value, используя для преобразования данных свойства AsBoolean, Aslnteger, AsFloat, AsString, в зависимости от типа данных.
procedure Clear; virtual; Обнуляет набор значений поля.
procedure FocusControl; Устанавливает фокус формы на первый связанный с TField компонент отображения данных.
function GetData(Buffer:Pointer): BooleanПомещает в буфер данные поля без преобразований. Для определения размера буфера можно использовать свойство DataSize. Возвращает False в случае отсутствия данных.
function IsValidChar(InputChar: Char) : Boolean; virtualИспользуется для определения корректности символа, введенного в поле, результат зависит от типа данных поля. Применяется компонентами отображения данных.
procedure SetData(Buffer: Pointer);Записывает в поле данные из буфера без преобразования. Размер буфера определяется свойством DataSize.

 

Объект TFieldDef

 TObject -> TPersistent -> TComponent -> TField -> TFieldDef

Модуль DB

В Палитре компонентов отсутствует

Автоматически создается для каждого поля (ячейки) каждой записи набора данных и отражает свойства этого поля. Любой компонент TField (см. выше) объединяет соответствующие объекты TFieldDef. Однако, не все TField имеют связанные объекты TFieldDef, примером тому являются вычисляемые поля. Список всех объектов TFieldDef, используемых набором данных, содержится в объекте TFieldDefs.

Свойства объекта

(Ro) property DataType: TFieldType;Содержит тип физического поля.
(r(^ property FieldClass: TFieldClass; TFieldClass s class of TField;Определяет тип связанного компонента типа TField.
(Ro) property FieldNo: Integer;Номер физического поля, используемый BDE.
(Ro) property Required: Boolean;В состоянии True означает, что для поля требуется определить значение.
(Ro) property Size: Word; Содержит размер объекта.

Методы объекта

function CreateFieldfOwner: TComponent): TField;Возвращает экземпляр связываемого объекта типа TField. Параметр Owner передает методу ссылку на набор данных.


Важнейшие типы данных

И в конце раздела рассмотрим некоторые типы данных, используемые ком­понентами доступа к данньм.

TIndexOptions = set of (ixPrimary, ixUnigue, ixDescending, ixNonMaintained, ixCaseInsensitive).

Данное множество используется при создании новых индексов свойством Addlndex компонента TTable.

TDataSetState = (dslnactive, dsBrowse, dsEdit, dslnsert, dsSetKey, dsCalcFields).

Данное множество используется свойством State компонентов TDataSource, TTable, TQuery и TStoredProc и определяет состояние компонента.

  • dslnactive — для компонента TDataSource означает отсутствие связанного набора данных (таблицы) или выключенное свойство Enable, для компо­нента TTable устанавливает свойство Active в False. Компонент в этом состоянии не может отвечать на запросы о передаче данных.
  • dsBrowse — исходное состояние для компонента, имеющего открытый набор данных без накопленных изменений.
  • dsEdit — определяет для компонента возможность редактирования записей.
  • dslnsert — разрешает компоненту добавлять новые записи в связанный набор данных.
  • dsSetKey — определяется для компонентов, проводящих поиск в наборе данных по ключам.
  • dsCalcFields — предусмотрено для компонентов, имеющих вычисляемые поля, и устанавливается при работе с ними.

Компоненты отображения данных и управления данными

Рассматриваемые в этом разделе компоненты предназначены для построения пользовательского интерфейса приложений Delphi, работающих с базами дан­ных. Размещаются они на странице Data Controls Палитры компонентов. Многие из них наследуют свойства стандартных управляющих элементов, но есть и предназначенные исключительно для работы с базами данных. Их основная задача заключается в отображении данных наиболее удобным для пользователя способом, а также реализация возможностей по редактированию данных и их передаче для последующего обновления набора данных. Компо­ненты, рассматриваемые здесь, являются заключительным звеном в цепочке компонентов, реализующих механизм работы приложения с базами данных (см. рис. 4.4).

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

В Delphi существует возможность просмотра данных в компонентах непосред­ственно в процессе отладки приложения, при условии наличия активной связи с базой данных. В этом режиме очень удобно проверять правильность работы компонентов с необходимыми типами данных и эргономичность создаваемого интерфейса. Работать с записями и полями связанного набора данных можно при посредстве Редактора полей. Единственное, чего нельзя делать в таком режиме — это изменять исходные данные.

В этом разделе собрана справочная информация обо всех компонентах отоб­ражения и управления данными. В описаниях компонентов приводятся сведения только о тех свойствах и методах, которые важны с точки зрения работы с базами данных, все прочие элементы стандартны и реализуют простейшие интерфейсные свойства. При необходимости информацию о них можно получить в разделах третьей главы, посвященных стандартным визуальным компонентам для построения пользовательского интерфейса. Кроме этого, некоторые рассматриваемые свойства и методы могут присутствовать у не­скольких компонентов, поэтому их описание приводится только один раз в первом по порядку компоненте. Например, свойства DataSource, Enabled, FieldCount и Fields принадлежат сразу нескольким из двенадцати рассматрива­емых компонентов, их описание приводится в компоненте TDBGrid. Следует отметить, что все перечисленные свойства играют важную роль в управлении отображаемыми данными.


 

Компонент TDBGrid

TObject -> TPersistent -> TCo:mponent -> TControl ->TWinControl ->  TCustomControl ->TCustomGrid -> TCustoinDBGrid -> TDBGrid 

Модуль DBGRIDS

Страница Палитры компонентов DataControls

Предназначен для просмотра и редактирования всех записей связанного с ним набора данных в развернутом виде. Данные структурированы в табличном формате, представление полей и расположение колонок зависит от значений свойств компонентов типа TField набора данных.

Свойства компонента

(Pb) property DataSource: TDataSource;Определяет источник получения данных. Содержит имя экземпляра компонента TDataSource, через который передается набор данных.
(Pb) property Enabled: Boolean; Определяет режим отображения данных. В значении True любые изменения связанных с компонентом данных будут отражаться в TDBGrid. Свойство устанавливается в False при необходимости совершить большую последовательность действий (например, последовательное перемещение по записям), визуализация которых замедлит выполнение операции.
(Ro) property FieldCount: Integer; Содержит число полей связанного с компонентом набора данных, которые будут отображаться в компоненте.
(Ro) property Fields[Index: Integer]: TField;Возвращает указатель на объект типа TField из числа полей, содержащихся в наборе данных. Для идентификации используется параметр Index, определяющий порядковый номер элемента массива и соответствующее ему поле.
property SelectedField: TField;Идентифицирует поле, которое помечено курсором в панели компонента.
property Selectedlndex: Integer;Возвращает порядковый номер текущего поля в отображаемом компонентом наборе данных. Используется для идентификации поля в свойстве Fields. Нумерация начинается с нуля.

Обработчики событии

(Pb) property OnColEnter: TNotifyEvent;Вызывается при перемещении курсора клавишей <Tab> в поле или при щелчке мыши в любой ячейке компонента.
(Pb) property OnColExit: TNotifyEvent;Вызывается при перемещении курсора из поля при помощи клавиши <ТаЬ> или при щелчке мыши в любой ячейке компонента вне поля.

 

Компонент TDBNavigator

 TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> TCustomControl -> TCustomPanel -> TDBNavigator 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

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

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

Свойства компонента

(РЬ) property ConfirmDelete: Boolean;В значении True предопределяет применение диалогового окна под­тверждения удаления записи при нажатии кнопки "Удалить" Навигатора баз данных.
(Pb) property VisibleButtons: TButtonSet; TButtonSet = set of TNavigateBtn; TNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast, nblnsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh) ;Содержит множество идентификаторов кнопок Навигатора, которые будут использоваться компонентом при работе приложения. По умолчанию работо­способны все кнопки. Идентификаторы кнопок представлены в приведенной таблице.


 

Компонент TDBText

TObject -> TPersistent -> TComponent -> TControl -> TGraphicControl -> TCustomLabel -> TDBText 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Позволяет отображать содержимое поля текущей записи связанного набора данных. Ближайший аналог в VCL — компонент TLabel, поэтому TDBText не предоставляет возможность изменять отображаемое поле. Все изменения данных в соответствующем поле текущей записи оперативно отражаются в компоненте. Компонент не имеет свойств или методов, которые бы не были рассмотрены выше.

 

Компонент TDBEdit

 TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> TCustornEdit ->  TCustomMaskEdit -> TDBEdit 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Предназначен для отображения и редактирования заданного поля текущей записи набора данных. Наследует многие свойства и методы компонента TEdit. Редактирование данных возможно при следующих значениях свойств связан­ного компонента TDataSource: State = dsEdit; CanModify = True.

Свойство компонента

(Ro) property IsMasked: Boolean;Определяет использование шаблона при редактировании данных.

Методы компонента

procedure ValidateEdit; Проверяет модифицированный текст на соответствие шаблону. В случае обнаружения ошибки выводит соответствующее сообщение.


Компонент TDBMemo

 TObject -> TPersistent -> TCoinponent -> TControl -> TWinControl -> TCustomEdit ->  TCustomMemo -> TDBMemo 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Предназначен для отображения и редактирования многострочных данных, включая данные типа BLOB и является модификацией компонента TMemo для работы с базами данных. Компонент работает с полем текущей запи­си связанного набора данных. Необходимое поле определяется свойством DataField.

Свойства компонента

(Pb) property AutoDisplay: Boolean;В значении True определяет режим автоматического обновления данных типа BLOB в компоненте при их изменении в базе данных. В значении False необходимо предусмотреть использование методов обновления данных.

Методы компонента

procedure LoadMemo; Загружает данные типа BLOB для использования компонентом.

 

Компонент TDBImage

TObject -> TPersistent -> TCoinponent -> TControl -> TWinControl  -> TCustomContro1 -> TDBImage 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Позволяет приложению использовать изображения, которые хранятся в полях типа BLOB связанного набора данных. Компонент преобразует изображение в формат DIB для внутреннего использования. Редактирование изображения возможно при посредстве операций работы с буфером обмена.

Свойства компонента

(Pb) property AutoDisplay: Boolean;В значении True определяет режим автоматического обновления графических данных в полях типа BLOBв компоненте при их изменении в базе данных. Отключение свойства используется для ускорения просмотра изображения в компоненте.

Методы компонента

procedure LoadPicture; Загружает изображение, определенное свойством Picture, для использования компонентом.

 

Компонент TDBListBox

 TObject -> TPersistent -> TCoinponent -> TControl -> TWinControl -> TCustomListBox -> TDBListBox 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Является модификацией для работы с базами данных компонента TListBox, у которого он позаимствовал все основные свойства и методы. Позволяет редактировать связанное поле текущей записи набора данных путем выбора возможного значения из списка. Список заполняется при помощи свойства Items. Компонент не имеет свойств или методов, которые бы не были рас­смотрены выше.

 

Компонент TDBComboBox

 TObject -> TPersistent -> TCoinponent -> TControl -> TWinControl -> TCustomComboBox -> TDBComboBox 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Представляет из себя комбинацию компонентов TDBEdit и TDBListBox, объединяя поле редактирования и список выбора. Модификация значения свя­занного поля текущей записи набора данных осуществляется путем выбора существующего значения из списка или набором нового значения в поле ввода. Компонент не имеет свойств или методов, которые бы не были рассмотрены выше.

 

Компонент TDBCheckBox

 TObject -> TPersistent -> TCoiriponent -> TControl -> TWinControl -> TButtonControl -> TCustornCheckBox -> TDBCheckBox 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Используется для отслеживания фиксированных значений связываемого поля текущей записи и является потомком стандартного компонента TCheckBox. Компонент может находиться в помеченном или непомеченном состоянии. Если значение связанного поля не совпадает со свойствами ValueChecked и ValueUnchecked одновременно, то компонент находится в неактивном состо­янии.

Свойства компонента

(Рb) property ValueChecked: String;Содержит контрольные значения для связанного с компонентом поля. Может содержать как единичные значения, так и

точкой с запятой. Если значение поля совпадает со значением свойства ValueChecked, то компонент помечается.

(Pb) property ValueUnchecked: String;Содержит значения, совпадение которых со значением связанного поля переводит компонент в непомеченное состояние.

 

Компонент TDBRadioGroup

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> TCustomControl -> TCustoinGroupBox -> TCustomRadioGroup -> TDBRadioGroup 

Модуль DBCTRLS

Страница Палитры компонентов DataControls

Является аналогом компонента TRadioGroup стандартного интерфейса. Поз­воляет определять для связанного с компонентом поля текущей записи одно из нескольких возможных значений.

Свойства компонента

property Value: String; Содержит значение связанного с радиокнопкой поля текущей записи.
(Pb) property Values: TStrings;Задает множество дополнительных вариантов значений для связанного поля. Например, для радиокнопки "True" подходят значения "True", "Т", "t" связанного поля, если свойство содержит элементы "Т" и "t".

 

Компонент TDBLookupList

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> TCustomControl -> TCustomGrid -> TCustoinDBGrid -> TDBLookupList 

Модуль DBLOOKUP

Страница Палитры компонентов DataControls

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

Подробно применение компонента рассматривается в разделе "Создание приложений для работы с локальными базами данных" этой главы.

Свойства компонента

property DataField: String;Определяет поле набора данных DataSource, по которому осуществляется межтабличная связь с набором данных LookupSource в компоненте.
(pb) property DataSource: TDataSource;Задает набор данных, в котором осуществляется перемещение по записям и который должен отображаться вне компонента (другими компонентами).
property Display Value: String;Содержит текущее значение поля LookupDisplay.
(Pb) property LookupDisplay: String;Определяет отображаемое в списке компонента имя поля набора данных LookupSource. При необходимости задать несколько колонок для разделения имен
(Pb) property LookupField: String;Определяет имя поля, через которое осуществляется межтабличная связь. Оно может не совпадать с именем поля в свойстве DataField, но оба поля должны быть одного типа.
(Pb) property LookupSource: TDataSource;Идентифицирует набор данных, поле или поля которого отображаются в списке компоненета.
(Pb) property Options: TDBLookupListOptions; TDBLookupListOption = (loColLines, loRowLines, loTitles); TDBLookupListOptions = set of TDBLookupLis tOpt ion;Определяет способы разделения полей и записей в списке. Может содержать различные комбинации из трех значений: loColLines разграничивает поля линиями, loRowLines разграничивает строки линиями, loTitles выделяет имена полей в виде заголовков.
property Value: String; Содержит текущее значение поля DataField.


Компонент TDBLookupCombo

 TObject -> TPersistent -> TCornponent -> TControl -> TWinControl -> TCustoniEdit -> TDBLookupCombo 

Модуль DBLOOKUP

Страница Палитры компонентов DataControls

Интегрирует свойства компонентов TDBComboBox и TDBLookupUst, создавая комбинированный список.

Методы компонента

procedure closeUp;
Открывает и закрывает список просмотра компонента.