Анимация
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

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

9.1. Инструментарий разработчика

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

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

9.3. Разработка управляющего меню

Разработка меню в Visual FoxPro Разработка меню в Access

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

При работе с современными средствами разработки приложений программист с самого начала окунается в проблемы построения интерфейса. Также и мы, обсуждая проблемы работы с данными, не могли не коснуться этих проблем. В этой главе мы как бы подведем итог обсуждаемым ранее вопросам под привычным лозунгом Microsoft "Putting It All Together!" -"Объединим все вместе!"

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

9.1. Инструментарий разработчика

В третьей главе мы уже рассматривали визуальный инструментарий для разработки пользовательского интерфейса. Все три пакета для построения пользовательских программ (Visual FoxPro, Visual Basic и Access) имеют соответствующие средства, выполненные в виде Конструкторов и Мастеров. Если в Visual Basic и Access основным визуальным инструментарием для построения пользовательского интерфейса следует считать Конструктор формы, то в Visual FoxPro сюда следует отнести и Конструктор класса, который может эффективно использоваться для разработки многократно используемых элементов от отдельных объектов до целых форм.

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

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

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

Windows API - это интерфейс, позволяющий прикладной программе использовать функции, встроенные в операционную систему.

При использовании функций Windows API программист может реализовать следующие преимущества :

• Повышение скорости работы. В большинстве случаев функции, встроенные в ОС,

обеспечивают более высокую скорость выполнения операций, чем встроенные функции Visual FoxPro или Visual Basic. В первую очередь это касается выполнения графических операций.



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

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

В то же время мы рекомендуем использовать Windows API только в крайнем случае и при необходимости повышения скорости работы программы, так как здесь программисту приходится сталкиваться с более сложными программными конструкциями. Это, естественно, требует времени на освоение, так как те сложные задачи, которые были скрыты от программиста при использовании любимого языка программирования высокого уровня с приставкой Visual, теперь придется решать самому. При этом учтите, что Microsoft до сих не выпустила хорошего руководства или четко структурированного файла контекстной помощи по Windows API и вам придется долго блуждать среди многих сотен функций с мудреными названиями. С профессиональными версиями Visual FoxPro (только на CD-ROM) и Visual Basic поставляется файл со справочными сведениями по Windows API, но он содержит синтаксис для программирования на языке Си.

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

В Visual Basic она имеет следующий синтаксис:

[Public Private] Declare Function FunctionName Lib "LibraryName" [Alias " AliasName" ] [([ParamList])][As ParamType]

В Visual FoxPro при том же составе параметров синтаксис команды выглядит чуть иначе:

DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName] [cParamType1 [@] ParamName1,cParamType2 [@] ParamName2, ...]

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

• Сведения о функции определяются ее именем FunctionName, заданном в библиотеке DLL. Имя функции следует указывать с соблюдением регистра! Если функция возвращает какое-либо значение, перед ее именем следует указать тип возвращаемого значения cFunctionType. Вероятно, здесь уместно напомнить, что в Visual Basic объявление Public используется для обеспечения доступа к функции из всех процедур, раположенных во всех модулях. Объявление Private обеспечивает доступ к функции только внутри данного модуля.

• Имя библиотеки DLL Windows LibraryName, содержащей требуемую функцию. Если вы хотите использовать функцию, входящую в API Windows, то здесь достаточно написать WIN32API, что автоматически обеспечит поиск функции в одном из следующих файлов:

KERNEL32.DLL, GDI32.DLL, USER32.DLL, MPR.DLL или ADVAPI32. DLL.

• Псевдоним имени функции для использования в Visual FoxPro или в Visual Basic. Его удобно использовать для сокращения слишком длинного названия функции или при угрозе совпадения имени функции с зарезервированным словом.

• Список передаваемых параметров включает обозначение типа и имени параметров, передаваемых из приложения в функцию DLL Windows. Знак @ после типа параметра показывает, что он будет передаваться по ссылке, а не по значению. Имя параметра никак не используется ни приложением, ни функцией DLL и может применяться в команде только в информационных целях. Если функция DLL требует в качестве аргумента передачи нулевого указателя (null pointer), то его следует передавать как целое число по значению.

Для передачи параметров в Visual Basic следует использовать следующий синтаксис: [Optional][ByVal ByRef][ParamArray] varname[( )][As ParamType]



Тип параметра

Integer

По значению

Помещает в стек вызовов 16-битовое значение.

Long Помещает в стек

вызовов 32-битовое значение. Этот адрес стек. обеспечивает ссылку на 32-битовое значение параметра.

String Преобразует строку символов в формат, принятый в С, с нулевым (CHR(0)) символом в конце. Помещает 32-битовыйый адрес этой строки в стек.

По ссылке

Помещает в стек вызовов 32-битовый адрес. Этот адрес обеспечивает ссылку на 16-битовое значение параметра.

Помещает 32-битовый адрес в

Помещает 32-битовый указатель в стек.

Помимо правильного использования параметров, довольно важным при использовании функций DLL является применение указателя.

Указатель (handle) - это число, уникально идентифицирующее объект.

Среда Windows поддерживает очень много объектов различного типа. Это разнообразные окна, блоки памяти, меню, шрифты, палитры и т. д. Допустим, вы хотите нарисовать голубую линию; тогда вы должны создать объект "голубой карандаш". Функция Windows API CreatePen() вернет указатель на этот "карандаш", который вы затем можете использовать для рисования. Когда вы закончите работу, этот объект можно убрать, передав указатель в функцию DestroyObject().

Рассмотрим несколько примеров для демонстрации возможностей Windows API. Начнем с таких задач, которые невозможно выполнить стандартными средствами.

Давайте посмотрим, как сделать в Visual FoxPro список, в котором будут появляться все устройства, доступные на данном компьютере. При этом для дисководов гибких дисков должна проверяться их готовность к работе (наличие дискеты). Этот список лучше всего оформить в виде класса. Тогда при добавлении его в форму мы сразу получим требуемый элемент управления.

Список доступных логических устройств для данного компьютера мы можем получить с помощью следующей функции API Windows (в синтаксисе C, как приведено в файле WIN32API.HLP):

DWORD GetLogicalDriveStrings (DWORD nSufferLength, LPTSTR IpBuffer);

Эта функция возвращает список доступных устройств в виде строки символов. Тип устройства можно определить с помощью функции

UINT GetDriveType (LPCTSTR IpRootPathName);

Эта функция возвращает одно из следующих значений:

0 - тип устройства не определен;

Опции ByVal или ByRef определяют, что параметр будет передан по значению или по ссылке. В следующей таблице показано, к каким результатам приведет передача параметров по значению или по ссылке различного типа :



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