Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по СВП.docx
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
96.59 Кб
Скачать

Исключительная ситуация. Обработка исключительных ситуаций в Delphi Блок try..Finally

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

try

<Оператор> 

<Оператор>

...

finally 

<Оператор>

...

end;

Смысл этой конструкции можно описать одним предложением: операторы, стоящие после finally, выполняются всегда.

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

Важно обратить внимание на такой факт: данная конструкция ничего не делает с самим объектом — исключительной ситуацией. Задача try...finally — только прореагировать на факт нештатного поведения программы и проделать определенные действия. Сама же ИС продолжает "путешествие" и вопрос ее обработки остается на повестке дня.

Блоки защиты ресурсов и обработчики ИС, как и другие блоки, могут быть вложенными. В этом простейшем примере каждый вид ресурсов системы защищается в отдельном блоке:

try

AllocatelstResource;

 try

Allocate2ndResource;

 SolveProblem;

 finally

Free2ndResource; 

end;

 finally

FreelstResource; 

end;

Можно также вкладывать обработчики друг в друга, предусмотрев в каждом специфическую реакцию на ту или иную ошибку:

var i,j,k : Integer;

 begin

i := Round(Random);

j := 1 - i;

try

k := 1 div i; try

k := 1 div j;

 except

On EDivByZero do

ShowMessage('Вариант 1: j=0'); 

end;

 except

On EDivByZero do

ShowMessage('Вариант 2: i=0');

 end;

  end;

Но все же идеально правильный случай — это сочетание блоков двух типов. В один из них помещается общее (освобождение ресурсов в finally), в другой — особенное (конкретная реакция внутри except).

Исключительная ситуация. Обработка исключительных ситуаций в DelphiВызов исключений

Любому, кто писал более или менее сложные программы, интуитивно ясно, что такое обработка исключительных ситуаций (ИС). Всякое взаимодействие с операционной системой на предмет получения ресурсов — места на диске, в памяти, открытие файла — может завершиться неудачно. Любое вычисление может закончиться делением на ноль или переполнением. Дополнительный фактор возникновения исключительных ситуаций содержится в данных, к которым могут обращаться программы. Особенно это актуально в приложениях баз данных.

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

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

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

Динамический массив Примеры объявления и использования.

1. Динамические массивы в Delphi не имеют фиксированного размера . Чтобы объявить такой массив необходимо  записать:

var da_MyArray : array of integer;

Как  видим , мы просто говорим Delphi, что нам нужен одномерный массив типа Integer, а об его размере мы скажем  когда нибудь потом.

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

SetLength(da_MyArray,20);

 

После вызова этой процедуры будет выделена память для 20 элементов массива, которые будут проиндексированы от 0 до 19 (обратите внимание: индексирование начинается с нуля, а не с единицы!). После этого можно работать с динамическим массивом- присваивать ему значения, производить с элементами различные вычисления, вывод на печать и т.д. Например    da_MyArray[0] :=  5 ;    da_MyArray[9] :=  9 ;    da_MyArray[1] :=  da_MyArray[0]+ da_MyArray[9] ; 3. Как только динамический массив был распределен, вы можете передавать массив стандартным функциям Length, High, Low иSizeOf Функция Length возвращает число элементов в динамическом массиве, High возвращает самый высокий индекс массива (то есть Length - 1), Low возвращает 0. В случае с массивом нулевой длины наблюдается интересная ситуация: Highвозвращает -1, а Low - 0, получается, что High  меньше  Low.  :) Функция SizeOf всегда возвращает 4 - длина в байтах  памяти указателя на динамический массив    iHigh   := High (da_MyArray3);    iLow    := Low  (da_MyArray3);

   iLength := Length (da_MyArray3);

   iSizeOf := SizeOf (da_MyArray3);

4. Доступ к данным динамических массивов с помощью низкоуровневых процедур типа ReadFile или WriteFile , или любых других подпрограмм, получающих доступ сразу ко всему массиву, часто выполняется неправильно. Для обычного массива (его часто называют также статическим массивом - в противоположность динамическому массиву) переменная массива тождественна его данным. Для динамического массива это не так - переменная  это указатель. Так что если вы хотите получить доступ к данным динамического массива - вы не должны использовать саму переменную массива, а использовать вместо неё первый элемент массива. правильно  WriteFile(FHandle, da_MyArray02[0], Length(da_MyArray02), dwTemp, nil) неправильно WriteFile(FHandle, da_MyArray02, Length(da_MyArray02), dwTemp, nil) 5. Рассмотрим  пример присваивания динамических массивов одного другому

var

da_A,da_B: array of integer;

begin

SetLength(da_A,2);

SetLength(da_B,2);

da_A[0]:=2;

da_B[0]:=3;

da_A:=da_B;

da_B[0]:=4;

end;

После этих манипуляций da_A[0] равно 4. Дело в том , что  при присвоении da_A:=da_B не происходит копирование т.к. da_A, da_B, это всего лишь указатели на область памяти.

Методы классов ОР. Методы override.

Директива Override определяет метод класса как замена так же названного метода в родительском классе.  Например, Вы могли бы хотеть отменить (заменить) операцию конструктора, чтобы принять во внимание изменения класса, введенные вашим классом. Вы можете только отменить классы определенные как виртуальные (virtual) или динамический (dynamic) (последний вне области основ Delphi).  Только те методы, которые могут быть заметно изменены полученным классом, обычно позволяют сделать так. Если метод отмечен как абстрактный (abstract), так же как и виртуальный (virtual), тогда Вы должны отменить его и осуществить его чтобы он был используемым пользователем вашего класса

Компонентыдиалоги: OpenDialog, SaveDialog

Компоненты OpenDialog и SaveDialog вызывают стандартные диалоги Windows открытия и сохранения файлов.

Открытие соответствующего диалога осуществляется методом Execute. Если в диалоге пользователь нажмет кнопку открыть (Сохранить), диалог закрывается, метод Executeвозвращает true и выбранный файл отображается в свойстве компонента FileName. Если же пользователь отказался от диалога (нажал кнопку отмена или ESC), то метод Executeвозвращает false.  Значение свойства FileNamмоможно задать перед обращением к диалогу. Тогда оно появится в диалоге как значение по умолчанию в окне Имя файла. Таким образом, например, выполнение команды Сохранить как, по которой в файле с выбранным пользователем именем надо сохранить текст окна редактирования Memo1, может иметь вид: SaveDialog1.FileName:=Fname; if SaveDialog1.Execute Then Fname:=OpenDialog1.FileName; Memo1.Lines.SaveToFile(FName); End; В этом коде предлагается, что имя файла хранится в строковой переменной FName. Перед вызовом диалога это имя прередается в него как имя файла по умолчанию, а после выбора пользователем файла его выбор запоминается в той же переменной FName и тест сохраняется в этом файле методом SaveToFile.  Типы искомых файлов, появляющиеся в диалоге в выпадающем списке Тип файла задаются свойством Filter. В процессе проектирования это свойство вызывается нажатием кнопки с многоточием около имени этого свойства в Инспекторе объектов. При этом открывается окно редактора:

В примере задан фильтр для документов Word с расширениями .doc и .rtf. После выхода из окна редактирования фильтров заданный вами шаблон появится в свойстве Filter в виде строки. Свойство InitialDir определяет начальный каталог, который будет открыт в момент начала работы пользователя с диалогом. Свойство DefaultExt определяет значение расширения файла по умолчанию. Если значение этого свойства не задано, пользователь должен указать в диалоге полное имя файла с расширением. Если же задать DefaultExt(например, «txt»), то пользователь может писать в диалоге имя без расширения. В этом случае будет принято заданное расширение. Свойство Title позволяет вам задать заголовок диалогового окна.

Создание собственного компонента Delphi. Динамическое создание компонентов

Динамически создаваемые компоненты - это компоненты, место в памяти под которые выделяется по мере необходимости в процессе работы приложения. Этим они и отличаются от компонентов, которые помещаются на Форму при проектировании приложения. Возможность создавать компоненты динамически это очень большое удобство для программиста. Например, можно создавать в цикле сразу много однотипных компонентов, формируя из них массив, которым в дальнейшем очень просто управлять.    Все компоненты, как объекты, имеют множество свойств, определяющих их работу. При установке компонента на Форму из палитры большинство этих свойств определяются системой Delphi автоматически. При создании динамического компонента программист должен описать и настроить их вручную. Посмотрим, как это делается.    Прежде всего, для появления динамически создаваемого компонента нужно выделить под него место в памяти. Выделением места в памяти компьютера под любой компонент занимается конструктор типа объекта этого компонента - метод Create. Для этого сначала нужно описать переменную нужного типа, а затем для выделения памяти воспользоваться методом Create. Метод Create имеет параметр Owner, определяющий так называемого "владельца" для создаваемого компонента.    Хотя на самом деле владелец нужен не для создания, а для уничтожения компонента. То есть, при уничтожении компонента-владельца происходит автоматическое уничтожение всех компонентов, у которых он указан в качестве владельца.    При обычной установке компонента из палитры система делает владельцем этого компонента Форму. Проще всего поступать так же. Однако можно указать в качестве владельца сам этот компонент, воспользовавшись в качестве параметра ключевым словом Self.    Далее. Когда компонент создан, то есть место в памяти под него выделено, можно задавать значения параметрам этого объекта. Прежде всего, это ещё один компонент, так называемый "родитель". Компонент-родитель будет отвечать за отрисовку нашего динамически создаваемого компонента. Это значит, что новый компонент появится в границах компонента-родителя.    Если компонент-владелец имеет тип TComponent, то есть может быть любым компонентом, то компонент-родитель уже имеет тип TWinControl. То есть это должен быть "оконный" компонент, умеющий принимать и обрабатывать сообщения от системы Windows. Это необходимо, так как компонент должен находиться в некоторой иерархии компонентов, принимающих и передающих сообщения от системы Windows. Нашему динамическому компоненту сообщения будут передаваться через компонент-родитель.    А некоторые компоненты вообще не умеют принимать сообщения от системы, и в процессе работы в этом случае ими также будет управлять компонент-родитель, например, Форма или Панель, на которой они находятся.    Естественно, компонент не может быть родителем для самого себя. Имя компонента-родителя просто присваивается свойству Parent создаваемого динамически компонента.

Исключительная ситуация. Обработка исключительных ситуаций в Delphi. Вложенные блоки try… except и try…finally.

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

Листинг 13.10, Вложенные блоки

 

01.procedure TForml.CreateFormClick(Sender: TObject); begin

02.with TForm.Create(Self) do

03.try

04.try

05.Caption := IntToStr(Top div Tag);

06.except

07.on EDivByZero do Caption := 'Tag = 0';

08.end;

09.ShowModal;

10.finally Free;

11.end;

12.end;

 

Глобальный объект Application отвечает за обработку исключений, не обрабатываемых блоком обработки исключений, который может находиться где-то в приложении. Чтобы изменить обработчик исключений, используемый по умолчанию, мы можем использовать компонент TApplicationEvents. относящийся к категории Additional (Дополнительные).

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

Событие OnException может быть обработано с помощью процедуры типа TExceptionEvent. Процедура, обрабатывающая событие OnException. принимает два параметра: объект Sender и объект Exception.

1.procedure TMainForm.AppEventsException(Sender: TObject; E: Exception);

2.begin

3.end;

В рамках обработчика события OnException вы можете написать код. который будет обрабатывать исключения иным способом, нежели обработчик, используемый по умолчанию, или же оставить обработчик события пустым. Если вы не хотите, чтобы при возникновении исключения что-либо происходило, оставьте обработчик события пустым. В данном случае потребуется написать внутри блока обработчика события только какой-нибудь комментарий, чтобы редактор Code Editor не удалил код обработчика автоматически.

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

Работа с базами данных в Delphi. Понятие базы данных, СУБД, ключа и индекса. Инструменты Delphi для работы с БД.

Помимо поддержки БД в самой среде Delphi, в состав поставки Delphi входит ряд дополнительных инструментов, служащих для обеспечения работы с БД. Прежде всего, это BDE - Borland Database Engine, представляющий собой набор системных библиотек и драйверов, предназначенных для взаимодействия БД и приложений, разрабатываемых в Delphi.Кроме того, имеется рад дополнительных приложений, вызвать которые можно самостоятельно (из программной группы Delphi), или из IDE:

BDE Administrator - утилита для настройки различных параметров BDE, настройки драйверов баз данных, создания и удаления псевдонимов БД. Эта программа так же встраивается в системную панель управления;Database Desktop - программа для создания, просмотра и редактирования отдельных таблиц и запросов;Data Pump - программа для переноса данных между БД;Database Explorer - программа-проводник для иерархического просмотра и редактирования БД. В версиях Enterprise и Architect устанавливается более гибкая и функциональная версия - SQL Explorer;

SQL Monitor - программа для отслеживания прохождения запросов к удаленным серверам БД (только Enterprise и Architect);SQL Builder - приложение для конструирования SQL-запросов (вызывается при обращении к соответствующим компонентам в Delphi IDE, только Enterprise и Architect);InterBase Server - СУБД InterBase, включая клиентскую и серверную части (только Enterprise и Architect);dbExpress - набор драйверов для доступа к SQL-СУБД, включая InterBase, DB2, Oracle, MSSQL и MySQL. В VCL для этих целей используется одноименный набор компонентов.В ранних версиях Delphi вместо dbExpress использовались SQL Links, но, начиная с Delphi 7, эта система считается устаревшей. Как и другие SQL-ориентированные компоненты, dbExpress и SQL Links имеются только в версиях Enterprise и Architect.ПРИМЕЧАНИЕОчевидно, что многие инструменты, прежде всего, ориентированные на использование с промышленными БД, имеются в промышленных же (Enterprise) вариантах поставки Delphi стоимостью около 2-3 тыс. долл. Впрочем, рассмотрение подобных нюансов в этой книге мы опустим, тем более что для рассматриваемых примеров SQL-ориентированные СУБД нам не понадобятся.Помимо перечисленных инструментов, в Delphi имеется множество компонент, имеющих самое непосредственное отношение к базам данных. Прежде всего, это группы Data Access, Data Controls и BDE. К этой же категории относятся группы ADO, InterBase, WebSnap и некоторые другие, однако все их рассматривать не представляется ни возможным, ни необходимым.Таким образом, в состав Delphi входит все необходимое для того, чтобы создавать как локальные, так и промышленные - если рассматривать соответствующий вариант поставки Delphi - базы данных.ВНИМАНИЕСледует учитывать, что используемые драйвера СУБД, равно как и BDE в обязательном порядке должны присутствовать на тех ПК, на которых будет выполняться разрабатываемое приложение БД.Помимо средств, входящих в поставку Delphi необходимо упомянуть и о технологиях, имеющихся для этих целей в Windows. Так, механизм доступа к данным ADO, основанный на COM обеспечивает универсальный механизм доступа к данным из приложений. Использование ADO позволяет отказаться от установки BDE и поставки дополнительных библиотек на ПК конечного пользователя разрабатываемого приложения БД. Ряд компонент, в частности, компоненты из групп dbExpress и InterBase так же позволяют работать с БД в обход BDE. Однако отказ от BDE и использование специализированных компонентов автоматически увеличивает сложность разработки приложений баз данных, поскольку BDE по отношению к различным СУБД, как и VCL по отношению Windows API, сглаживает многие острые углы, проявляющиеся при работе с БД.

Работа с базами данных в Delphi. Технологии доступа к БД в Delphi. Общие сведения. Архитектура приложений БД

Приложение баз данных, как следует уже из его названия, предназначено для взаимодействия с некоторым источником данных — базой данных (БД). Взаимодействие подразумевает получение данных, их представление в определенном формате для просмотра пользователем, редактирование в соответствии с реализованными в программе бизнес- алгоритмами и возврат обработанных данных обратно в базу данных.

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

Как известно, базы данных обслуживаются специальными программами — системами управления базами данных (СУБД), которые делятся на локальные, преимущественно однопользовательские, предназначенные для настольных приложений, и серверные — сетевые (часто удаленные), многопользовательские, функционирующие на выделенных компьютерах — серверах. Главный критерий такой классификации — объем базы данных и средняя нагрузка на СУБД.

Тем не менее, несмотря на разнообразие реализаций, общая архитектура приложения баз данных остается неизменной.

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

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

Механизм внутреннего представления данных является ядром приложения баз данных. Он обеспечивает хранение полученных данных в приложении и предоставляет их по запросу других частей приложения.

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

Бизнес-логика приложения представляет собой набор реализованных в программе алгоритмов обработки данных.

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

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

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

В Delphi 7 реализовано достаточно большое число разнообразных технологий доступа к данным (они рассматриваются далее в этой книге). Но последовательность операций при конструировании приложений баз данных остается почти одинаковой. И в работе используются по сути одни и те же компоненты, доработанные для применения с той или иной технологией доступа к данным.

В этой главе рассматриваются общие подходы к разработке приложений баз данных в Delphi, базовые классы и механизмы, которые не изменятся, выберите ли вы для вашего приложения Borland Database Engine (BDE), Microsoft ActiveX Data Objects (ADO) или dbExpress.

Работа с базами данных в Delphi. Компонент DataSource: назначение, свойства, события

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

Для настройки свойств компонента необходимо выполнить следующие действия.

1. Связать набор данных и компонент TDataSource. Для этого используется свойство DataSet компонента TDataSource, доступное через Инспектор объектов. Это указатель на экземпляр компонента доступа к данным. В списке этого свойства в Инспекторе объектов перечислены все доступные компоненты наборов данных.

2. Переименовать компонент. Это не обязательное действие. Тем не менее желательно присваивать компонентам осмысленные имена, соответствующие названиям связанных наборов данных. Обычно название компонента комбинирует имя набора данных (например OrdSource или dsOrders).

В приложении DemoDBApp компонент countrysource связан с компонентом CountryTable. Поэтому свойство DataSet имеет значение CountryTable.

 Примечание

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

Компонент TDataSource имеет ряд полезных свойств и методов. Итак, связывание с компонентом набора данных выполняет свойство

property DataSet: TDataSet;

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

type TDataSetState = (dslnactive, dsBrowse, dsEdit, dslnsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc); property State: TDataSetState;

При помощи свойства

property Enabled: Boolean;

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

Свойство

property AutoEdit: Boolean;

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

Аналогично, метод

procedure Edit;

переводит связанный набор данных в режим редактирования.

Метод

function IsLinkedTo(DataSet: TDataSet): Boolean;

возвращает значение True, если компонент, указанный в параметре DataSet, действительно связан с данным компонентом TDataSource.

Метод-обработчик

type TDataChangeEvent = procedure(Sender: TObject; Field: TField)

of object;

property OnDataChange: TDataChangeEvent;

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

Метод-обработчик

property OnUpdateData: TNotifyEvent;

вызывается перед сохранением изменений в базе данных. Метод-обработчик

property OnStateChange: TNotifyEvent;

вызывается при изменении состояния связанного набора данных

Работа с базами данных в Delphi. Компоненты отображения и управления данными. Основные свойства этих компонентов

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

Компоненты отображения данных должны быть связаны с компонентом TDataSource и через него с компонентом набора данных. Для этого используется их свойство DataSource. Оно присутствует во всех компонентах отображения данных.Большинство компонентов предназначены для представления данных из одного единственного поля. В таких компонентах имеется еще одно свойство DataField, которое определяет поле связанного набора данных, отображаемое в компоненте.Особое значение для приложений баз данных играет компонент TOBGrid, который представляет данные в виде таблицы. В столбцах таблицы размещаются поля набора данных, а в строках — записи. Для этого компонента не имеет смысла определять конкретное поле, но можно задать настраиваемый набор колонок, а для каждой из них определить поле набора данных. (Подробнее о визуальных компонентах отображения данных см. гл. 15.)

Таким образом, для каждого визуального компонента отображения данных необходимо выполнить следующие операции:1. Связать компонент отображения данных и компонент TDataSource. Для этого используется свойство Datasource, которое должно указывать на экземпляр требуемого компонента TDataSource. Один компонент отображения данных можно связать только с одним компонентом TDataSource. Необходимый компонент можно выбрать в списке свойств в Инспекторе объектов.

2. Задать поле данных. Для этого используется свойство DataField типа TFields. В нем необходимо указать имя поля связанного набора данных. После задания свойства Datasource поле можно выбрать из списка. Этот этап применяется только для компонентов, отображающих единственное поле.Отдельное место среди компонентов отображения данных занимает компонент TDBNavigator. Он предназначен для перемещения по записям набора данных.

В приложении DemoDBApp использованы компоненты TDBGrid, TDBNavigator и TDBEdit (

Все три компонента отображения данных связаны с компонентом CountrySource типа TDataSource при помощи свойства DataSource.

Компонент TDBEdit отображает данные из поля capital (столица государства) и позволяет редактировать их.

Компонент TDBGrid показывает набор данных целиком, данные в ячейках можно редактировать.

Компонент TDBNavigator позволяет перемещаться по записям набора данных CountryTable. При этом результат заметен во всех подключенных к набору данных компонентах отображения данных.

Динамически подключаемые библиотеки (DLL). Структура файла DLL

Динамические библиотеки (DLL, Dynamic Link Library) играют важную роль в функционировании ОС Windows и прикладных программ. Они представляют собой файлы с откомпилированным исполняемым кодом, который используется приложениями и другими DLL. Реализация многих функций ОС вынесена в динамические библиотеки, которые используются по мере необходимости, обеспечивая тем самым экономию адресного пространства. DLL загружается в память только тогда, когда к ней обращается какой-либо процесс.

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

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

Динамическая библиотека может использоваться несколькими приложениями, при этом не обязательно, чтобы все они были созданы при помощи одного языка программирования.

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

Применение динамических библиотек позволяет добиться ряда преимуществ:

 уменьшается размер исполняемого файла приложения и занимаемые им ресурсы;

 функции DLL могут использовать несколько процессов одновременно;

 управление динамическими библиотеками возлагается на операционную систему;

 внесение изменений в DLL не требует перекомпиляции всего проекта; 

 одну DLL могут использовать программы, написанные на разных языках.

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

Потоки и их использование в Delphi. Класс THeard: основные свойства, методы. Создание многопоточного приложения в Delphi.