Урок 4. Переходим к практике.

Delphi

Delphi & SQL

Автор: Сергей Катков salkat@aip.mk.ua

Урок 4. Переходим к практике.

Не надоела теория? Нет? Ну и замечательно. Ведь для чего нужна теория? Для того, чтобы знать, что делать на практике. Вот в предыдущем предложении и показывается, что они друг без друга "ну никак". Вот сегодня мы и перейдем от теории к практике.

Будем считать, что с основами Delphi вы уже знакомы, и знаете, как создать проект. Вот и создадим пустой проект. В нашем первом проекте все будет просто. Даже очень просто. Зато с первого раза все усвоится. Начнем с хрестоматийного примера создания приложения с помощью одной лишь мыши. Да-да, можете придвинуть мышь и отодвинуть клавиатуру - она нам сегодня не понадобится.

Delphi позволяет работать с базами данных посредством нескольких интерфейсов. До 4-й версии это был только BDE (Borland Database Engine), в 5-й появился ADO (ActiveX Data Object) - Microsoft-овский интерфейс, "родной" для Access и его формата *.mdb. В 6-й версии появился интерфейс dbExpress, который сама Borland рекомендует применять к клиент-серверным базам данных на MySQL и др. Начнем рассмотрение всех этих интерфейсов с BDE как наиболее заслуженного и имеющегося во всех версиях. Остальные потом.

Итак, преимущества BDE:

  • поддержка многих форматов. В самом BDE встроена поддержка многих форматов. К тому же BDE автоматически поддерживает все ODBC-драйвера (Open Database Connectivity - еще один интерфейс к базам данных), установленные в вашей операционной системе.
  • дополнение стандартных способов работы полезными функциями. Например, когда сервер возвращает данные в ответ на SQL - запрос, он никому не должен поддерживать возможность передвигаться в обоих направлениях - он обеспечивает движение только вперед. BDE кэширует эти данные и когда вы запросите предыдущую запись, вытащит ее из кэша. Если бы этого не было, вам пришлось бы запрашивать данные с сервера снова, и проскакивать "лишние" предыдущие записи. Только подумайте, как эта возможность облегчает жизнь во многих случаях.
  • хорошая изученность и отлаженность. Все ошибки и особенности работы хорошо известны и вам будет несложно найти описание или получить совет.

Из недостатков я бы отметил необходимость распространения BDE вместе с вашим приложением, что "утяжеляет" инсталляцию на 2-3 дискеты.

Это было лирическое отступление. А сейчас нам понадобятся компоненты со страниц Data Access и Data Controls. На странице Data Access располагаются невизуальные компоненты, предназначенные для подключения к базам данных. Невизуальные - значит при помещении их на форму ничего вы не увидите. То есть увидите, конечно, в режиме разработки, да размер exe-файла увеличится, но данные на форме не появятся. А чтобы они появились, нам понадобятся компоненты со страницы Data Controls.

На станице Data Access расположились такие компоненты как:

  • Table - таблица. Позволяет подключить одну таблицу данных.
  • Query - запрос. Позволяет работать с результатом запроса как с таблицей. С некоторыми ограничениями, правда.
  • Stored Proc - Хранимая процедура. Программа, хранящаяся на сервере, выполняющая на нем какие-то действия и возвращающая значения. Когда вам необходимо обработать несколько больших (а иногда просто огромных) таблиц, и на основании этой обработки получить небольшую табличку или пару чисел, которые и нужны вашей программе - незаменимая вещь. Может вернуть вашей программе, как пару значений, так и целую таблицу.
  • Database, Session. Все таблицы, запросы и все остальное должны работать через компоненты Database и Session. Если вы их не поместите на форму самостоятельно, Delphi создаст их автоматически при запуске программы. Пока оставим их в покое.
  • BatchMove - компонент, который окажется полезным при переносе большого объема данных из одной таблицы в другую. Обычно используется во всяких конвертерах, хотя и не обязательно.
  • UpdateSQL - компонент, который поможет нам преодолеть те ограничения, о который я говорил в пункте про запросы (Query).
  • Nested Table - таблица в таблице. Позволяет сделать вид, что одна таблица - всего лишь значение поля в другой.
  • DataSource - источник данных. Он стоит на первом месте на этой странице компонент. Это подчеркивает его важность. Именно через него и будут работать компоненты со страницы Data Controls. Подробности ниже.

Компоненты Table, Query и подобные могут использоваться самостоятельно. Именно из них видны данные. Если ваша программа должна выполнять какие-то расчеты, ничего не показывая пользователю (до поры), можно обойтись только ими. [an error occurred while processing this directive] Получить данные из них можно, например, так:

A := Table1.FieldByName("Field1").Value;

Или так:

B := Table1Field1.Value;

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

А пока нам важно, что для простого получения данных достаточно одних лишь компонентов типа Table или подобных. А вот для демонстрации их пользователю и для того, чтобы позволить их изменить нам понадобятся компоненты со страницы Data Controls. Но сами по себе они не могут увидеть данные. Для того, чтобы им показать данные нужны:

  1. Компонент, который видит данные, например Table;
  2. Компонент, который показывает данные, например DBGrid;
  3. Мост между ними, а именно компонент DataSource;

Компонентов на странице Data Controls много. Почти все они имеют аналоги на других страницах, и известны вам (аналоги). Например, компонент DBText - просто Label, который данные берет из базы. При этом вы не можете заставить показать нужный вам текст, у него нет не свойства Caption, ни свойства Text. Вместо этого, вам надо поместить значение прямо в базу данных, именно тогда оно будет отображено.

Особенности работы с этими компонентами будут рассмотрены позже. А пока нам достаточно запомнить, что они похожи на уже известные компоненты, но работают через DataSource с невизуальными компонентами.

В общем-то можно обойтись без этих компонентов. Например в событии (подробнее о событиях позже) OnScroll компонента TTable вписав строку

Label1.Caption := Table1Field1.Value;

можно обеспечить показ значения поля обычным компонентом Label. Но для того нам и нужны компоненты Delphi, чтобы не делать много раз одну и ту же работу.

Итак, давайте возьмемся за мышку (клавиатуру отодвинули? ;)) и сделаем что-нибудь, что реально заработает. Найдем страницу компонент Data Access, на ней найдем компонент Table, поместим его на форму. Свяжем его с базой данных DBDEMOS, для чего в свойстве Database этого компонента установим значение DBDEMOS. Эта база - демонстрационная и поставляется вместе с Delphi. В этой базе выберем таблицу animals.dbf, т.е. присвоим это значение свойству TableName. Мы все также пользуемся мышью, все эти значения выбираются из выпадающих списков.

Следующим компонентом, который нам понадобится будет DataSource. Мы ведь собираемся что-то показать пользователю. Итак, установим DataSource на форму, а его свойству DataSet присвоим занчение Table1. Обратите внимание, имя компонента Table, который мы только недавно установили на форму было Table1. В больших проектах лучше давать более осмысленные имена компонентам, но в нашем проекте мы обойдемся и таким. Тем более, что решили обойтись без клавиатуры ;).

Следующие компоненты будут визуальными, со страницы Data Controls. Сначала DBGrid. Установим его на форму, придадим ему нужные размеры. Под нужными каждый понимает то, что ему удобно.

 Для того, чтобы в нашей таблице DBGrid появилась какая-то информация надо присоединить ее к источнику данных (DataSource). Просто установим свойство DataSource равным DataSource1. Если ничего не появилось, посмотрим, активна ли таблица. То есть в свойстве Table1.Active должно стоять true. Так и есть, там стоит false. Ставим true, все работает.

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

Очередной компонент - DBImage. Этот компонент отображает картинку, которая хранится в базе данных. На самом деле, хотя это и не слишком подробно отображено в документации, этот компонент сам позволяет поместить картинку в базу данных. Для этого картинку надо подготовить в каком-нибудь графическом редакторе, затем скопировать в буфер обмена, после чего вставить в DBImage с помощью Ctrl+V или Ctrl+Ins. Установим DataSource этого компонента равным DataSource1 и DataField равным Graphic для того, чтобы он мог отобразить нужную нам картинку.

Последним на сегодня компонентом будет DBMemo. Этот компонент очень похож на обычный компонент Memo, поэтому не будем на нем сильно задерживаться. Установим DataSource этого компонента равным DataSource1 и DataField равным Notes.

Сохраним проект, дадим ему имя на свой вкус, например FirstPractice и запустим его. Если вы все сделали правильно, у вас на экране появится программа, которая умеет просматривать таблицу с рыбами, перемещаться от одной записи к другой, редактировать их, даже работает с рисунками и memo-полями. Без единой строчки кода. Всего за 1 минуту (время, которое вы щелкали мышкой). Не плохо, правда?

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

  • Hints у DBNavigator;
  • Columns у DBGrid; Если список колонок пуст, нажмите Add All Fields в этом маленьком появившемся окошке .
  • Title.Caption у каждой колонки.

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



Опубликовал admin
29 Май, Четверг 2003г.



Программирование для чайников.