LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 60. Материалы для начинающих (7 урок)

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         26.01.2007
Автор:      Парусников Алексей
Сайт:        http://www.accessoft.ru под редакцией с http://www.leadersoft.ru/
Новые материалы: спец. эффекты
На сайте AccesSoft публикуются статьи, посвященые вопросам, связанным с разработкой и продвижением приложений Access. Вы так же можете ознакомиться с готовыми программами, получить исходный код, купить программу, связаться с автором для решения вопроса о доработке программы под Ваши требования.



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

Спец. эффекты в Access.

 

     В этой статье рассмотрим простой пример, как сделать свое приложение Access более привлекательным. Речь конечно же пойдет о спец. эффектах. В ранее выпущенной статье «Автолинковка (автоприсоединение) таблиц при открытии приложения» уже показывался спец. эффект дефрагментация формы при закрытии – форма «рассыпалась на части». Сейчас рассмотрим процесс открытия приложения, и попробуем его «перехватить» и запустить анимированную заставку. В качестве последней будет выступать презентация PowerPoint.
     Сначала создадим саму заставку. Открываем PowerPoint, и выбираем в меню «Общие шаблоны» понравившиеся. Я, например, выбрал «Океан». Выделяем «Заголовок слайда» и пишем свой текст. Аналогично «Подзаголовок слайда». Форматирование такое же, как и Word. Теперь сделаем анимацию. Для этого выделяем текст, к которому хотим применить анимацию, и выбираем Показ слайдов – Настройка анимации – Добавить эффект. Далее, думаю, нет смысла объяснять. Осталось теперь только сохранить все это как презентацию (.pps) – например «Заставка.pps». Для запуска из Access полученного «шедевра» воспользуемся технологией ActiveX.

     Технология ActiveX обеспечивает взаимодействие приложений – Автоматизацию (Automation), при которой одно приложение управляет работой другого. Чтобы начать работу с ActiveX – объектом, нужно объявить соответствующую переменную, создать сам объект и связать переменную с объектом. Одним из способов выполнения этой работы является использование спецификатора New в операторе объявления переменных:


      Dim <имя переменной> As New <имя приложения.имя класса>


     Однако более универсальным способом создания ActiveX – объектов является вызов специальных функций CreateObject и GetObject.
Как правило, вызов этих функций помещается в правую часть оператора Set. В результате его выполнения объектное выражение возвращает ссылку на созданный объект, которая становится значением переменной. Синтаксис функции CreateObject:


     CreateObject (“Имя_приложения.Имя_класса”)


     Функция GetObject имеет дополнительный параметр путь, который задает полный путь к файлу, содержащему ActiveX – объект.
Создадим пустую форму frmHide и создадим в ней процедуру открытие формы:

     Private Sub Form_Open(Cancel As Integer)
     Dim ppApp As Object
          Set ppApp = CreateObject("Powerpoint.Application")
          ppApp.Visible = True
          ppApp.Presentations.Open CurrentProject.Path & "\Заставка.pps"
     End Sub

     Как видно, полный путь к файлу презентации был получен при помощи CurrentProject.Path и имени файла. Если теперь запустить эту процедуру, то она в свою очередь запустит Powerpoint, а он покажет нам нашу заставку «Заставка.pps». Так как нам нужно, чтобы запуск происходил при открытии приложения, то запустим ее самым простым способом – через указания имени стартовой формы, в нашем случае это будет frmHide: Сервис – Параметры запуска – Вывод формы/страницы – frmHide. Заодно уберем все галочки, кроме «контекстные меню по умолчанию» - этим мы скроем почти все стандартные меню Access и само окно приложения, чтобы не мешало. Напомню, кто не знает: чтобы самому добраться до формы для редактирования (отобразить окно Access) нужно запускать приложение, удерживая Shift. Это так называемая «защита от дурака» в простейшем исполнении. Под «дураками» подразумеваются любопытные пользователи, которым интересно, что «внутри» программы, а так же наивные разработчики, думающие таким образом провести пользователей, и закрыть им доступ к окну Access. Shift уже давно не для кого не секрет, а вот чтобы нельзя было открыть при помощи Shift существует… «защита от Shift» – специальные программные модули, препятствующие этому, которые разумеется можно взломать другими программными модулями, которые чаще всего так и называют: «Взлом защиты от Shift». И тут уже все будет зависеть от уровня разработчиков: чей модуль "хитрее", тот и выиграл. Впрочем, мы отвлеклись, речь то ведь у нас была о запуске презентации Powerpoint.
     Итак, стартовую форму указали, окно Access свернули. Запускаем приложение. Появляется заставка, идет анимация и…все. Дело в том, что в здесь не хватает еще одного важного момента: так управление было передано Powerpoint, то теперь нужно из Powerpoint запустить Access! Можно создать аналогичную процедуру в Powerpoint, ведь там тоже, как и во всех офисных приложениях, поддерживается VBA. Но мы поступим по другому: пусть Access закроет Powerpoint и запустит вторую стартовую форму (теперь уже "настоящую стартовую"). Для этого воспользуемся свойством формы Таймер и создадим еще одну процедуру в форме frmHide:

     Private Sub Form_Timer()
     Dim ppApp As Object
          Set ppApp = CreateObject("Powerpoint.Application")
          If ppApp.Visible = True Then
               ppApp.Quit
               DoCmd.Close acForm, Me.Form.Name
               DoCmd.OpenForm "frmStart"
          End If
     End Sub

     Как видно, через нее закрывается приложение Powerpoint (ppApp.Quit), закрывается сама форма frmHide (потому я ее и назвал Hide) и открывается настоящая стартовая форма приложения – frmStart. Событие Таймер происходит с заданным интервалом (мс). Он задается в конструкторе формы frmHide – Интервал таймера. Я поставил 4500. Этого хватает для «прогона» анимации.

Как все это работает «вживую», Вы можете скачать по этой ссылке...


Ответы на вопросы
Вопрос 1. В процедуре VBA создается один временный перекрестный запрос с помощью Openrecordset. Можно ли создать другой временный запрос, отбирающий данные из первого (результатом должен быть запрос на объединение первого запроса с итоговой строкой). Решить проблему через хранимые запросы не удается - в первом запросе используется сложный динамический критерий отбора, реализуемый только в VBA.
  Ответ. Наверное, лучше всего сохранять результаты запроса во временной таблице. Потом при выходе из программы ее удалять.
Вопрос 2. Добрый день, Admin!
acbShutDown = acb_apiExitWindowsEx(EWX_SHUTDOWN, 0). С помощью этой функции компьютер должен выключаться. Возможно она работает на Windows 2000 и более ранних версия, но на Windows XP она не работает. Что необходимо дописать чтобы эта функция работала на Windows XP?
P.S. Но функция смены пользователя на Windows XP работает.
acbLogOff = acb_apiExitWindowsEx(EWX_LOGOFF, 0)
  Ответ. Вот пример, который работает. http://www.mvps.org/access/api/api0016.htm
Вопрос 3. Подскажите, пожалуйста. Ломается база. Пытаюсь её восстановить, но почему-то не работает следующая строка.
DBEngine.RepairDatabase "edudate.mdb" Появляется сообщение, что операция не поддерживается для объектов этого типа. Заранее благодарен.
  Ответ. В меню есть функция восстановления базы данных, непонятно зачем ее восстанавливать из VBA. Если она постоянно "разрушается", то надо искать причину этого, а не пытаться восстанавливать ее программно.

Вопрос 4. Добрый день. Подскажите пожалуста как програмным кодом форматировать поле... В форме есть три поля 1. Date 2.Time 3. DateTime Me.DateTime = date+Time Выходит: 04.07.200617:51:33
А мне необходимо :20060704175133

  Ответ. Debug.Print Format(Me.DateTime, "yyyy") & Format(Me.DateTime, "mm") ...
Вопрос 5. Добрый день, Admin! С помощью какого кода я могу скопировать значения из поля1 в буфер обмена для последующей вставки?
  Ответ. Можно использовать ключи для имитации действия клавиатуры SendKeys "{F2}", True - выделяет поле SendKeys "^X", True - копирует в буфер