Приветствую всех читателей моего блога. Давненько я не появлялся тут, а если быть точным, то совсем давно. Заходил иногда, только если ответить на комментарии.
Теперь же я постараюсь писать более чаще на блог, а самое главное, стараться расписывать те темы, которые Вас интересуют в первую очередь. За последний год, я проанализировал и увидел, что самые популярные статьи и комментарии оставляют именно в статьях по работе с базами данных. А именно: работа с базами Access, MySQL, SQL Server и другие.
Поэтому в ближайшее время я буду отвечать на комментарии статьями по работе с базами данных и добавлю туда еще замечательную базу Oracle. Также я постараюсь стороной не обойти и наш проект по MapWindow GIS , он довольно таки неплохо обновился за последнее время.
Давайте же я расскажу о своих планах, что я хочу в ближайшее время Вам рассказать:
- Имитация подключения к базе данных (это будет в данной статье)
- Работа с Oracle (здесь будет и подключение к БД и выборка данных, добавление, обновление данных и многое другое)
- Работа с транзакциями в MS SQL Server (хотя их можно будет легко применить и для других СУБД)
- Немного поговорим о работе с InterBase/FireBird
- Отвечу на накопившиеся вопросы
- Ну и, конечно же, продолжим разговаривать про MapWindow GIS
У меня многие пользователи спрашивали, как можно сделать подключение к БД в виде бегунка, либо там ProgressBar’a, чтобы пользователь видел, что подключение происходит, если например, отсутствует коннект к базе. То есть, чтобы программа не зависала на время тайм-аута TADOConnection, а что-то пользователю показывало.
Это можно сделать при помощи потоков, но я расскажу более простой для многих способ. Для этих целей нам понадобится:
- GIF-анимация имитации подключения к БД, либо же TProgressBar
- Компонент TRXGifAnimator из библиотеки RXLib, либо же похожий компонент
- Компонент для подключения к БД, я использую ADOConnection, но также подойдут и другие компоненты для доступа к СУДБ, например всякие *DAC.
Вот так выглядит моя форма подключения к БД (режим конструктора):
Для формы я установил следующие свойства (Object Inspector):
- BorderStyle=bsNone
- Position=poScreenCenter
Далее идем разбираться с компонентом TRXGIFAnimator. Для начала нам необходимо соответсвующая анимация. Ее я скачал с сайта Activiti indicators, но в Интернете существует множество других подобных ресурсов, где можно сделать самому любой индикатор загрузки.
Я скачал эту анимацию (gif-файл), в свойстве Image компонента TRXGIFAnimator я загрузил ее, хотя загрузку можете сделать по-своему, и установил свойства Animate в True и AsyncDrawing также в True.
Далее мы идем на форму, где установлен у нас компонент для подключения к БД (в моем случае – это TADOConnection). Сама форма выглядит следующим образом (то есть, если коннект прошел успешно, то появляется сразу данное окно, если коннекта нет в течение тайм-аута, то появляется форма выше):
На ней находится компонент подключения к БД. Самое главное, чтобы у компонента свойство ConnectOptions было установлено в coAsyncConnect, все остальные настройки остаются уже за Вами.
На событие OnShow этой формы пишем код соединения с БД:
procedure TFormLogin.FormShow(Sender: TObject);
begin
try
ADOConnectionServer.Connected:=False;
ADOConnectionServer.ConnectionString:='Provider=SQLOLEDB.1;Password=DDD;Persist Security Info=True;User ID=DDD;Initial Catalog='+Ini.ReadString('SERVER','BASE','')+';Data Source='+Ini.ReadString('SERVER','IP','')+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DDD;Use Encryption for Data=False;Tag with column collation when possible=False';
ADOConnectionServer.Connected:=True;
if ADOConnectionServer.Connected=False then
begin
Application.MessageBox('Ошибка подключения к БД','Внимание!',MB_OK+MB_ICONINFORMATION);
Close;
end;
except
on e:Exception do
begin
Application.MessageBox('Не удается подключиться к БД','Внимание!',MB_OK+MB_ICONINFORMATION);
Close;
end;
end;
end;
То есть, обычное подключение к БД с настройками, которые берутся из Ini-файла. Теперь самое интересное, вызов окна, где изображена наша имитация подключения к БД. Выделяем компонент TADOConnection на форме подключения, переходим во вкладку События (Events), находим событие AfterConnect и на нем пишем следующее:
procedure TFormLogin.ADOConnectionServerAfterConnect(Sender: TObject);
begin
try
if ADOConnectionServer.Connected=True then
FormConnect.Close;
except
on e:Exception do
end;
end;
Затем находим событие BeforeConnect и на нем пишем следующее:
procedure TFormLogin. ADOConnectionServerBeforeConnect(Sender: TObject);
begin
try
if ADOConnectionServer.Connected=False then
FormConnect.Show;
except
on e:Exception do
end;
end;
Расскажу немного, что здесь происходит. Запускается наша главная форма авторизации (у Вас она может быть другая). Далее запускается наша форма с имитацией подключения к БД, если в течение тайм-аута (у меня стоит 30 секунд) появляется коннект, то данная форма закрывается и появляется моя форма авторизации (см. выше), если же в течение 30 секунд коннект не появляется, то выскакивает пользователю сообщения, что не удалось подключиться к БД и по нажатию на кнопку ОК, приложение закрывается.
При этом, когда идет имитация подключения к БД, приложение не зависает, его можно сворачивать/разворачивать, пользователь, таким образом, будет видеть, что приложение действительно что-то делает, а не просто зависло. Давайте же протестируем.
Я в Ini-файле просто поменял IP-адрес сервера на не существующий, в таком случае все 30 секунд должна работать форма с имитацией подключения. Можно просто отключить сервер, все на Ваше усмотрение. Запускаем…
Имитация подключения идет, а после того, как коннект не удалось установить, появилось сообщение:
По нажатию на кнопку ОК, приложение мое закрылось. Вот так можно быстро сделать имитацию подключения к БД. Самое главное, чтобы компонент, который отвечает за подключение, работал в асинхронном режиме.
Вы также можете использовать свои компоненты для подключения, анимации, либо же вместо анимации и вовсе использовать TProgressBar. Сделать так, чтобы он также бесконечно заполнялся, как и данная gif-анимация.
Все тоже самое можно повторить и с использованием потоков, там конечно будет намного лучше это все организовано. Но данный способ мне нравится. Если возникли какие-то вопросы, то обращайтесь. До новых встреч.