VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
Delphi и базы данных.
Навороченый пример работы с ADO
:
Logo

Сегодня я возьму базу данных из прошлой статьи и сделаю несколько улучшений в исходнике, чтобы наш пример превратился в полезный и рабочий модуль. В этом примере я реализую поиск с помощью SQL, фильтры и много чего ещё интересного. Короче говоря, пора переходить от маленьких примеров к реальным прогам.

Открой пример из предыдущей статьи и сразу выбери меню View->Project Manager. Перед тобой откроется окно Project Manager в котором перечислены все модули нашего проекта (рисунок 1). У нас пока два модуля:
Logo
Рис 1. Project Manager

  • Unit1 - Модуль главной формы (Form1).
  • Unit2 - Модуль компонентов доступа к данным (DstaModule1).

Отодвинь это окно куда-нибудь в уголок, потому что мы будем очень часто его использовать (я держу это окно в правом-нижнем углу экрана). Дважды щёлкни по Unit2 и перед тобой откроется DataModule2. В прошлом примере я сделал одну ошибку. В настройках ADOConnection я указал полный путь к базе данных. Поэтому, когда ты открывал мой пример у тебя могли посыпатся ошибки, что база не найдёна. Конечно же, потому что ты должен указать новый путь. Чтобы этого небыло, сделаем следующее:

  • Выдели ADOConnection и дважды щёлкни по строке ConnectionString.
  • В появившемся окне нажми кнопку Build, появится окно "Свойства связи с данными".
  • На закладке "Подключение", в строке с именем базы сотри путь, оставь только имя "db1.mdb". В этом случае, база не будет привязана к определённому пути, а будет искатся в текущей директории, т.е. программа и база должны находится в одной диретории.

Такой вариант намного лучше и не зависит от изменения пути расположения проги. Главное, чтобы база была рядом с запукным файлом. Нажимай "ОК", и снова "ОК" и изменяй свойство Connected у ADOConnection в True. Запомни, после этих изменений, все компоненты связанные с ADOConnection1 потеряют связь с базой. Выдели ADOTable1 и поставь свойство Active в true. Вообще, любые изменения в настройках компонентов приводят к потере связи, поэтому за этим нужно регулярно следить.

Я сделал ещё одну ошибку в прошлый раз. Поля Key1 в обоих таблицах ключевые и я назначил им тип "Числовой". В то же время это поле должно быть уникальным. Это заставляет нас вручную вводить в это поле уникальное значение. Сейчас я изменил это поле на тип "Счётчик", чтобы Access сом назначал уникальное число нашему ключу.
Logo
Рис 2.

Теперь изменим свойства ADOTable1. Дважды щёлкни по компоненту ADOTable1. Перед тобой откроется окно настроек полей базы (рис 2). В этом окне перечислены все поля базы. Выделяя любое поле, ты можешь изменить свойства его отображения.

Выдели поле Key1 и установи его свойство Visible в False. Это ключевое поле и пользователю не надо его видеть, поэтому мы отключаем его видимость.

Я ещё уменьшил значение свойства DisplayWidth у полей Файмилия и Имя до 25, чтобы при просмотре базы через DBGrid поля не выглядели такими длинными. DisplayWidth отвечает за видимую ширину поля, но реальная ширина остаётся той же, то есть поле сможет содержать всё то же количество символов.

Теперь я создал событие OnClose для главной формы Form1 и написал там:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 DBGrid1.Columns.SaveToFile(
  ExtractFilePath(Application.ExeName)+'grid.dat');
end;

Этим я сохраняю состояние колонок в файле 'grid.dat', той же директории, где находится программа. Теперь создадим событие OnShow для главной формы и там загрузим состояние колонок:

procedure TForm1.FormShow(Sender: TObject);
begin
 //Если файл настроек существует, то загрузить настройки.
 if FileExists(ExtractFilePath(Application.ExeName)+'grid.dat') then
  DBGrid1.Columns.LoadFromFile(
    ExtractFilePath(Application.ExeName)+'grid.dat');
end;

Теперь пользователь сможет изменять ширину колонок, перемещать их и все изменения сохранятся при следующем запуске. Для перемещения колонки нужно взять заколовок колонки мышкой и перетащить на другое место.
Logo
Рис 3. Фрагмент моей формы.

ВНИМАНИЕ!!! Если ты теперь добавишь, или удалишь какую-нибудь колонку, эти изменения не будут видны, потому что в файле 'grid.dat' ничего об этом не сказано. Чтобы увидить изменения, просто удали файл 'grid.dat' и программа загрузит все текущие данные, а не состояние из файла и после этого сохранит уже то, что надо.

теперь добавим к программе несколько возможностей. Я создал на форме панель с тремя кнопками (рис 3). Первая будет использоватся для задания фильтра, вторая для поиска с помощью SQL и третья выход из программы. По нажатию ктопки фильтр, пользователю будет выдаватся запрос на ввод фамилии. После нажатия кнопки "ОК", мы установим этот фильтр. Давай опишем эти действия на языке Delphi:

procedure TForm1.FilterButtonClick(Sender: TObject);
var
 FilterStr:String;
begin
 //По умолчанию делаем фильтр пустым
 FilterStr:='';
 //Запрашиваем ввод фильтра. 
 if not InputQuery('Задание фильтра', 'Введите Фамилию:', FilterStr) then 
  exit;

 //Если пользователь ничего не ввёл, то удаляем фильтр
 if FilterStr='' then
  DataModule2.ADOTable1.Filtered:=false
 else
  begin
   //Иначе устанавливаем новое значение.
   DataModule2.ADOTable1.Filter:='Фамилия='''+FilterStr+'''';
   DataModule2.ADOTable1.Filtered:=true;
  end;
end;

Обрати внимание, что значение фильтра я устанавливаю в виде 'Фамилия='''+FilterStr+''''; Здесь полно кавычек, потому что нам надо получить строку типа Фамилия='Иванов'. Значение фильтра должно быть в кавычках. Для этого я и использую громадное количество кавычек. Четыре одинарные кавычки прибавят в текст одну, а если мы хотим прибавить кавычку к уже готовому тексту, то нужно использовать три кавычки (например 'Фамилия=''').
Logo
Рис 4. Редактор SQL.

Теперь сделаем поиск с помощью SQL. Для этого добавим в наш DataModule2 компоненты DataSource2 и ADOQuery1. У ADOQuery1 свойство Connection изменим на ADOConnection1. У DataSource2 свойство DataSet изменим на ADOQuery1.

Теперь дважды щёлкай по свойству AQL у ADOQuery1. Перед тобой откроется редактор SQL запроса (рис 4). В этом редакторе напиши следующий запрос:

SELECT *
FROM [Главная таблица]
WHERE Фамилия LIKE :Famil
Logo
Рис 5.

Запрос выбирает все записи из таблицы [Главная таблица], где поле Фамилия равна значению переменной Famil. В SQL, если перед каким-нибудь именем стоит двоеточие, то оно воспринимается, как переменная (только в Delphi). Закрой редактор SQL и выдели компонент ADOQuery1. Свойство Parameters содержит все объявленные тобой переменные в запросе. Щёлкни по нему дважды и ты увидешь окно, как на рис 5. В этом окне уже присутствует наша переменная Famil. Щёлкни по ней и проверь её свойства. В нашем случае, переменная будет хранить в себе фамилию, т.е. она должна быть типа String. Проверь свойство Value -> Type , чтобы оно было Integer. Всё остальное нас пока не интересует, поэтому можно закрывать это окно.

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

procedure TForm1.ToolButton2Click(Sender: TObject);
var
 FindStr:String;
begin
 //Устанавливаем значение строки поиска в пусто
 FindStr:='';
 //Запрашиваем фамилию для поиска
 if not InputQuery('Поиск по таблице', 'Введите Фамилию:', FindStr) then 
   exit;

 //Если пользователь ввёл не пустое значение, то ...
 if FindStr<>'' then
  begin
   //Делаем запрос неактивным (закрываем его, если он уже был открыт)
   DataModule2.ADOQuery1.Active:=true;

   //Устанавливаем нашу SQL переменную :Famil в значение
   //введённое пользователем
   DataModule2.ADOQuery1.Parameters.ParamValues['Famil']:=FindStr;

   //Делаем запрос активным (выполняем его)
   DataModule2.ADOQuery1.Active:=true;

   //Показываем форму с результатом запроса.
   Form3.ShowModal;
  end;
end;
Logo
Рис 6. Форма отображения результата

Для отображения результата запроса я создал ещё одну форму Form3. Форма абсолютно примитивная (рисунок 6). К ней я подключил DataModule2 (Выбрал из меню File->Use Unit). Бросил на форму компонент DBGrid и установил у него свойство DataSource в DataModule2.DataSource2 .

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

 Исходники примера забирай здесь


Design by FMk group ©
Copyright©: Horrific aka Флёнов Михаил ©