progress-barПриветствую всех читателей моего блога. Давненько я не появлялся тут, а если быть точным, то совсем давно. Заходил иногда, только если ответить на комментарии.

Теперь же я постараюсь писать более чаще на блог, а самое главное, стараться расписывать те темы, которые Вас интересуют в первую очередь. За последний год, я проанализировал и увидел, что самые популярные статьи и комментарии оставляют именно в статьях по работе с базами данных. А именно: работа с базами 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 секунд должна работать форма с имитацией подключения. Можно просто отключить сервер, все на Ваше усмотрение. Запускаем…

test

Имитация подключения идет, а после того, как коннект не удалось установить, появилось сообщение:

message_info

По нажатию на кнопку ОК, приложение мое закрылось. Вот так можно быстро сделать имитацию подключения к БД. Самое главное, чтобы компонент, который отвечает за подключение, работал в асинхронном режиме.

Вы также можете использовать свои компоненты для подключения, анимации, либо же вместо анимации и вовсе использовать TProgressBar. Сделать так, чтобы он также бесконечно заполнялся, как и данная gif-анимация.

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

Метки: , , , , ,

Оставить комментарий

Вы можете использовать следующие теги:

*