Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 [ 103 ] 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

Контекст устройства - это совокупность параметров, описывающих условия работы с каким-либо устройством.

Использование контекста устройства позволяет программисту сосредоточиться на выполнении какого-то действия (например, на написании кода для рисования) и избежать имеющих вспомогательное значение операций. Для рисования такими вспомогательными операциями могут быть установленное разрешения экрана, число поддерживаемых данным устройством цветов и т. д. Если вы пишете код для рисования красного прямоугольника, то можете быть уверены, что Windows обеспечит рисование этого объекта с учетом возможностей того устройства, которое выбрано для его отображения, будь то экран, принтер или плоттер.

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

• Система координат, которая может быть представлена такими фиксированными единицами, как сантиметры, дюймы или пикселы, или комбинированными единицами.

• Параметры рисуемой линии (объект Pen) определяют цвет, ширину и стиль линии.

• Параметры закрашивания (объект Brush) определяют цвета, используемые для заполнения фона, и палитру для графических команд.

• Шрифт (объект Font) описывает шрифт, используемый при работе команд вывода данных.

В заключение обсуждения проблем, связанных с использованием функций Windows API, затронем еще один важный вопрос. Он связан с тем, что многие функции Windows API в качестве параметров используют структуры.

При использовании Visual Basic у программиста не появится никаких проблем - это средство разработки поддерживает структуры. Visual FoxPro не поддерживает структур и программисту придется формировать структуру в виде символьной строки. В качестве примера такой работы приведем фрагмент программного кода для соединения с сервером по телефонной линии. Само соединение предварительно создается в специальной утилите внешнего доступа Dial-Up Networking. Windows хранит параметры созданного соединения в регистре. В Visual FoxPro требуемый фрагмент будет выглядеть так:

DECLARE INTEGER RasDial IN rasapi32 ; STRING DialExtetions, ; STRING cPhonebookfile, ; STRING @ cParameters, ;

INTEGER nCallBack, ; STRING cCallBack, ;

STRING @ nConnHandle

nConnHandle = CHR(0)+CHR(0)+CHR(0)+CHR(0)

&& Указатель соединения

cConnName = "RcomPPP" && Имя соединения

cPhone = "2594277"

&& Номер телефона, подключенного к серверу cUserName = "Administrator" && Имя пользователя cPassWord = "AndreyG" && Пароль для соединения cDomain = "" && Имя домена Windows NT * Формируем структуру

cParam = CHR(28)+CHR(4)+CHR(0)+CHR(0)+;

nY = -nY

ENDFOR

= ReleaseDC(pmhand, hmdc)

ELSE

WAIT WINDOW "Нет активного окна"

ENDIF

Запустите обе формы и вы убедитесь, что второй вариант работает в несколько раз быстрее. Для рисования линии средствами Windows API нам пришлось использовать четыре функции. Передаваемые параметры перечислены в строчках комментария после объявления функций.

В этом примере мы используем новое понятие - контекст устройства (device context). Что это такое?



PADR(cConnName+CHR(0), 256+1)+; PADR(CHR(0), 128+1) + ; PADR(CHR(0), 128+1) + ;

PADR(cUserName+CHR(0), 256+1)+; PADR(cPassword+CHR(0), 256+1)+; PADR(cDomain+CHR(0), 15+1)+" "

* Выполняем соединение

nRes = RasDial(NULL, NULL, @cParam, 0, NULL, @nConnHandle)

Равный по функциональности фрагмент, написанный на Visual Basic, будет выглядеть так:

Private nConnHandle As Long, nRes As Long Описываем структуру параметров соединения Private Type DIALPARAMS dwSize As Long

szEntryName(256 + 1) As String szPhoneNumber(128 + 1) As String szCallbackNumber(128 + 1) As String szUserName(256 + 1) As String szPassword(256 + 1) As String szDomain(15 + 1) As String End Type

Private ConnParams As DIALPARAMS

Функция для установки соединения

Private Declare Function RasDialA Lib "rasapi32"

(DialExtetions,

cPhonebookfile,

ByRef Parameters As DIALPARAMS, nCallBack As Long, cCallBack,

ByRef hConnHandle As Long) As Long Присваиваем значения параметрам nRes = 0 nConnHandle = 0

Это значение dwSize устанавливается при внешнем доступе из Windows 95

ConnParams.dwSize = 1052

Наименование соединения в регистре Windows

ConnParams.szEntryName(0) = "R"

ConnParams.szEntryName(1) = "c"

ConnParams.szEntryName(2) = "o"

ConnParams.szEntryName(3) = "m"

ConnParams.szEntryName(4) = "P"

ConnParams.szEntryName(5) = "P"

ConnParams.szEntryName(6) = "P"

ConnParams.szEntryName(7) = Chr(0)

Номер телефона берем из регистра

ConnParams.szPhoneNumber(0) = Chr(0)

ConnParams.szCallbackNumber(0) = Chr(0)

ConnParams.szUserName(0) = "A"

ConnParams.szUserName(1) = Chr(0)

ConnParams.szPassword(0) = Chr(0)

ConnParams.szDomain(0) = Chr(0)

Выполняем соединение

nRes = RasDialA(Null, Null, ConnParams, 0, Null, nConnHandle)

9.2. Конструируем форму

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

В этом параграфе мы более детально разберем процесс проектирования форм для работы с данными при использовании различных СУБД.

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



объекты, реагирующие на события (системные или пользовательские). С помощью этих объектов можно разрабатывать простые и интуитивно понятные интерфейсы пользователя для управления данными.

Несмотря на то, что вы полностью можете описать форму с помощью программирования, как правило, более простым и быстрым способом будет визуальный. При этом Конструктор формы возьмет на себя труд перевода ваших пожеланий на соответствующий язык программирования. Язык, который используется в Visual Basic, а значит, и в Access, в отличие от Visual FoxPro не является объектно-ориентированным, тем не менее он объектный. Таким образом, какой бы путь создания формы вы ни выбрали, работа будет заключаться в создании объектов и обеспечении требуемой функциональности за счет использования их свойств и методов. Большинство свойств позволяют указать действия, которые должны выполниться при наступлении событий, доступных для конкретного объекта. Используя Конструктор формы, с помощью окна Свойства (Properties) мы получаем легкий доступ к любому из свойств и можем описать действия объекта в ответ на события. В коде событий мы можем использовать методы объектов, например, для перемещения на него курсора (придания статуса активного объекта в форме).

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

Формы при работе с данными используют свой набор данных. Организация процесса взаимодействия формы с данными происходит посредством установки свойства RecordSource (Источник данных) и связанных с конкретными полями источника данных объектов. Если вы хотите отображать с помощью элементов управления данные из полей, которые не относятся к источнику данных, то прямое указание в свойстве ControlSource (Данные) ни к чему не приведет. Вам необходимо организовать синхронизацию записей между данными, входящими в источник данных, и данными, не входящими, и, естественно, использовать несвязанное поле для отображения информации, не относящейся к источнику данных. Если вы ничего не поняли из этой фразы, то правильно сделали. Как правило, так не поступают, потому что подобный путь требует сложного и не оправдывающего себя кодирования. Лучший способ - это создание запроса, который одновременно может отобразить данные из нескольких таблиц. Помимо этого используйте подчиненные формы. При этом необходимо иметь поля, по которым вы можете связать данные в основной и подчиненной формах. Еще проще вызывать форму, содержащую нужные вам, но хранящиеся в другом источнике данные, динамически, с помощью реакции на события. Во многих случаях этого более чем достаточно.

Иногда, при решении более сложных задач, когда вам необходимо, чтобы никакие обстоятельства, вплоть до перебоев в энергопитании, не смогли нарушить установленные правила взаимодействий между данными, вам необходимо использовать транзакции. Для использования транзакций в Access необходимо работать с такими наборами данных, создание и доступ к которым осуществляются с помощью методов объектов доступа к данным (DAO).

Опишем форму, которую мы будем создавать в качестве примера.

На основе таблицы Order создается форма для принятия заказа. Ни одно из полей в таблице Order пользователь непосредственно не заполняет. Путем использования комбинированных списков и вызываемых форм он заполняет другие таблицы, при этом автоматически заполняются поля в новой записи таблицы Order . Перед началом редактирования новой записи начинается транзакция.

Поле key order заполняется автоматически, так как имеет тип Счетчик. Поле key salman заполняется именем текущего пользователя приложения (для примера на Access) или выбирается из списка продавцов (для примера на Visual FoxPro). Заказчик выбирается из списка заказчиков по фамилии, имени и адресу или заносится вновь (для примера на Access), при этом необходимо вызвать форму для заполнения данных о заказчике. При вызове формы для заполнения данных о заказчике также начнется транзакция, но не вложенная, а параллельная, так как данные о заказчике будут сохраняться в любом случае, для того чтобы потом "засыпать" его проспектами и приглашениями на презентации новых моделей автомобилей.

После этого, на основе данных, хранящихся в таблице Model, подбирается модель и, если она есть на складе и удовлетворяет заказчика, то заполняется запись в таблице Account. После этого завершается транзакция и запись вносится в таблицу физически.

Создание формы "Прием заказов" на Visual FoxPro

Начнем с систематизации данных о способах создания новой формы в Visual FoxPro. Таких способов достаточно много:



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 [ 103 ] 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146