Программирование >>  Разработка пользовательского интерфейса 

1 ... 101 102 103 [ 104 ] 105 106 107 ... 147


* Пытаемся найти NUL файл в загрузочной области

* указанного устройства

lDriveState = FILE(cDrive + \NUL )

IF .NOT. lDiskError

IF lDriveState

lDriveOk = .t.

ELSE

lDriveOk = .f.

ENDIF ELSE

lDriveOk = .f.

ENDIF

* Восстанавливаем прежний обработчик ошибок IF .NOT. EMPTY(lOldError)

ON ERROR DO (lOldError) ELSE

ON ERROR ENDIF

* Восстанавливаем реакцию на ошибки ОС nRestState = SetErrorMode(nOldErrorState) RETURN lDriveOk

После этого класс списка можно помещать в любой требуемой форме.

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

Сначала создадим форму, в которой будем выводить зигзагообразную линию средствами Visual FoxPro (используя метод Line). Для этого в методе Paint формы запишем следующий код:

nY = 1

FOR nX = 5 TO 375 STEP 5 ThisForm.Line(nX, nY*100)

nY = -nY ENDFOR

Теперь попробуем такую же линию нарисовать средствами Windows API. В методе Paint второй формы запишем:

*** Возвращает указатель на контекст указанного окна

DECLARE INTEGER GetDC IN WIN32API INTEGER

* HWND Указатель окна

*** Стирает контекст указанного окна

DECLARE INTEGER ReleaseDC IN WIN32API INTEGER, INTEGER

* HWND Указатель окна

* HDC Указатель контекста устройства

*** Рисует линию с текущей позиции до указанных координат

DECLARE INTEGER LineTo IN WIN32API INTEGER, INTEGER, INTEGER

* HDC Указатель контекста устройства

* int nXEnd x-координата конечной точки линии

* int nYEnd y-координата конечной точки линии *** Обновляет текущее положение указанной точки

DECLARE INTEGER MoveToEx IN WIN32API INTEGER, INTEGER, INTEGER, STRING

* HDC Указатель контекста устройства

* int X x-координата нового текущего положения

* int Y y-координата нового текущего положения

* LPPOINT адрес предыдущего положения (NULL in FoxPro)

*** Функция GetFocus не имеет параметров и возвращает HWND активного окна DECLARE INTEGER GetFocus IN WIN32API

mynull = .NULL.

pmhand = GetFocus()

IF pmhand<<>>0 && Если есть открытое активное окно hmdc = GetDC(pmhand) = MoveToEx(hmdc, 0, 0, mynull)

nY = 1

FOR nX = 5 TO 375 STEP 5 = LineTo(hmdc, nX, nY*100)



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

Использование контекста устройства позволяет программисту сосредоточиться на выполнении какого-то действия (например, на написании кода для рисования) и избежать имеющих вспомогательное значение операций. Для рисования такими вспомогательными операциями могут быть установленное разрешения экрана, число поддерживаемых данным устройством цветов и т. д. Если вы пишете код для рисования красного прямоугольника, то можете быть уверены, что 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. Конструируем форму

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

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

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



1 ... 101 102 103 [ 104 ] 105 106 107 ... 147

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика