CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мышление в стиле Visual Basic

Андрей ГОНЧАРОВ ag@ukr.net

(Продолжение, начало см. в МК № 6, 9—10, 19, 25, 27, 29—30, 33, 36—38, 45, 48, 3, 6—7, 12—13, 20 (125, 128—129, 138, 144, 146, 148—149, 152, 155—157, 164, 167, 174, 177—178, 183—184, 191))

Использование ClassBuilder: нет ничего проще

Функции Наборов/Коллекций

Не так давно мною было получено электронное письмо весьма резкого характера от литературного редактора МК Данила Перцова. Он заметил недостаточно доступное изложение некоторых моментов в модуле StyleSheet.cls; в частности, функция Add вызвала у него затруднения в понимании происходящего. Поэтому считаю необходимым рассмотреть подробно функции, генерированные ClassBuilder`ом. Во всяком случае, рассмотрим пошагово написание элементарной программы, работающей с набором объектов; также будут указаны изменения в генерированном Билдером коде, необходимые для функционирования MyComPAd`а. Исходный код доступен на сайте автора: http://www.vb.kiev.ua. Хотя данный подвыпуск «Мышления в стиле Visual Basic» читатель может отнести к разряду «это мы уже проходили», полученная мною почта говорит о том, что «пробелы» у читателя таки имеются: тем более, если он не программист.

Итак, Вы собираетесь создать набор (Коллекцию) заранее подготовленных Объектов. Возможно, Вас более интересует сам набор, нежели эти объекты — тогда у Вас есть выбор:

1. Можно указать, набор каких существующих объектов создается.

2. Можно создать «собираемый» вид объекта «на лету», сразу в диалоге Набора.

Давайте все же начнем с самого насущного: с чего начинается проект? Верно, при запуске IDE без ее перенастроек пользователю выводится диалог действия — можно выбрать тип создаваемого приложения. В данном случае Ваш выбор не имеет принципиального значения. Однако все же советую выбрать Standard EXE, так как такой проект проще всего запустить на выполнение, не отвлекаясь на посторонние задачи — мы с Вами имеем целью освоить утилиту ClassBuilder (Microsoft), входящую в пакет Visual Studio `98. Если же пользователь случайно выставил флажок Never show this dialog in the future, он всегда может возобновить активность такого диалогового приглашения, отыскав в меню Options вкладку Environment и проверив опцию Prompt for Project, как показано на Рис. 1Рис. 1.

Далее — создание собственно классов. Классы рождаются либо «на полном автомате» — используя ClassBuilder, — либо вручную. В последнем случае можно выиграть в лаконичности кода (это, кстати, спорный вопрос: все зависит от Ваших навыков), в первом — выигрыш во времени разработки структуры классов очевиден. Причем, если программа содержит более-менее обширную структуру (возможно, иерархию) классов, использование помощника неизбежно. Так или иначе, нажатие пункта меню Add Class Module (Рис. 2) вызовет окно, как показано на Рис. 3.

В диалоговом окне Add Class Module можно, кроме всего прочего, выбрать существующий файл *.cls, как, например, если бы Вы скачали его с сайта http://www.vb.kiev.ua... :-)). На иллюстрации показан выбор пользователя: мы желаем воспользоваться мастером. Клик по ОК.

Если все прошло успешно (неприятности могут возникнуть «на ровном месте» :-)), пользователь увидит главное окно ClassBuilder`а, — в нашем случае без каких-либо классов, свойств и т. д. — всего этого у нас пока нет. Нажатие второй пиктограммы (первая относится к Объекту, вторая — к Набору), или меню, как показано на рисунке ниже, приведет к появлению приглашения создания класса Collection (Рис. 4).

Рис. 2   Рис. 3   Рис. 4

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

В нашем случае мы выбираем вариант с созданием класса «на лету», в ходе создания набора для этого класса. Если бы мы позаботились о классе MyClass заранее, нам бы пришлось выбрать его из списка существующих в том же диалоговом окне (Рис. 5).

В опциях нового класса можно задать его совсем не обязательные характеристики: описание класса, просмотр которого будет возможен в Object Browser`e, что немаловажно, например, в тех случаях, когда Вы разрабатываете структуру классов (или готовую ActiveX-библиотеку) «левым» программистам/пользователям, не имеющим понятия, что к чему в Вашем приложении. Там же указывается идентификатор контекста для справочной системы: нажатие клавиши F1 вызовет справочную статью про Ваш Объект в IDE Visual Basic 6.0 (создание справочной системы будет рассматриваться позже в цикле статей о VB 6.0) (Рис. 6).

По завершении работы с первичным диалогом Collection Builder у Вас должно получиться нечто вроде этого (Рис. 7).

Рис. 5   Рис. 6   Рис. 7

Теперь мы имеем коллекцию MyCollection, в состав которой будут входить экземпляры класса MyClass. Замечу, что оптимальные названия классам здесь назначать не совсем целесообразно, т. к. значащие имена удобнее использовать непосредственно в коде программы. По МакКинни, именование классов должно быть таким: cMyClass, cMyCollection (см. первые статьи об именовании в VB. Они доступны, опять-таки, на сайте автора). Однако, учитывая тот факт, что созданный далее экземпляр набора в тестовой программе будет носить имя Languages, а экземпляр MyClass — вещь динамическая (в StyleSheet.cls и здесь), строгой системой именования самих классов можно пренебречь.

Свойства (равно как и остальные атрибуты классов) в мастере добавляются путем нажатия соответствующих кнопок (см. подсказки на панели инструментов). Так, мною было добавлено свойство MyStringProperty для «виртуального» класса MyClass. Нажав F2 в окне мастера, можно переименовать уже добавленные свойства класса (Рис. 8). Замечу, что «классические» (встроенные в сам язык) VB-свойства или методы, такие как Add, Remove, Item, не редактируются :-).

Публичное ли это свойство, «дружественное» (практически не играет роли в МайКомПаде) или вообще свойство по умолчанию — зависит от установок в этом диалоге. Там же — атрибуты свойства (для Браузера Объектов). Подобным образом можно пополнить ряд свойств Объекта и иными свойствами разных типов — как встроенных, так и пользовательских (причем, свойствами могут оказаться и Рис. 8классы, т. е. объектные типы!!!).

После того как пользователь завершил разработку структуры классов для приложения, необходимо обновить проект. Для этого в ClassBuilder`е существует меню Update Project (Ctrl+S). Попытка закрытия мастера без нажатия комбинации клавиш или меню приведет к уточнению: «...А не обновить ли проект?» В случае успешного обновления Вы получите автоматически сгенерированный код, который, кстати, с некоторыми изменениями, пригоден к использованию в том же МайКомПаде. Так, были изменены параметры одной из автоматически оформленных функций Add в модуле набора: во-первых, единственный параметр, необходимый для добавления элемента в набор — строковое значение (т. к. у экземпляра класса MyClass — единственное строковое свойство MyStringProperty), а сам Объект MyClass лишен свойства Key: здесь оно не принципиально.

Вот к какому виду я привел код (вариант этого же фрагмента с комментариями — на сайте):

То, что не все в полученном от ClassBuilder`а результате является жизненно важным, очевидно. Первоначальный код показан на рисунке. Как известно, Visual Basic реализует классы по-своему: это не C++, не Java, Делфи или PHP. Любая информация о свойствах хранится в виде локальных переменных (В ActiveX-компонентах типа OCX существует PropertyBag. Простые классы ведут себя по-иному). ClassBuilder их именует как mvar<some_name>, потому как в документации такие переменные называются переменными-членами (Member Variables). Будучи объявленными как локальные (Private), они недоступны извне, однако непосредственно играют роль контейнеров для значений свойств: например, разработанная Вами DLL могла бы иметь свойства MyProperty и mvarMyProperty. Таким образом, жизнь внутри объекта обеспечивается переменными-членами, любое свойство можно прочесть изнутри только из переменной-члена (например, из другой функции/процедуры этого же класса; тогда как обращение к «официальному» свойству вызовет ошибку: MyStringProperty — пустой звук для процедур и функций, прописанных внутри класса-носителя этого свойства — используйте Member Variables). Кстати, ClassBuilder тщательно документирует генерированный код даже по части его использования, так что Рис. 9просмотрев его, нетрудно понять что к чему.

Таким образом, переменная, олицетворяющая собственно набор, должна принять объект как аргумент для Add, стандартной Бейсик-функции наборов. Путем создания временного экземпляра ClassBuilder передает такой объект (Рис. 9).

Примечателен тот факт, что строка Dim objNewMember As New MyClass идентична двум строкам кода, обозначенным желтым фоном.

Не стоит беспокоиться о ресурсах системы (для динамичных приложений): временный объект objNewMember «умирает» с завершением работы Add, поскольку родился вообще внутри этой функции.

Использование

Ничего примечательного в этом приложении нет — оно лишь демонстрирует работу с набором, обращение к элементам которого реализуется через индекс типа Long.

Поскольку Add возвращает значение типа MyClass, нам снова не обойтись без объявления переменной такого рода. Пусть недоумевают посторонние читатели, не имеющие представления о типизации в ЯП, но это так: мы не имеем права сделать это иным образом, хотя...

1. мы можем переделать функцию Add в процедуру, чтоб не объявлять переменные типа <имя_класса>, чтоб не получать подобных контрольных значений, чтобы не контролировать ситуацию;

2. мы можем вообще не прописывать Set Add = ... в конце как результат, и это вынудит нас перейти к пункту 1...

Как же добавить элемент в такой набор? А очень просто... Вот три важнейших шага на пути к реализации задуманного:

1. Определить свойства добавляемого в набор элемента;

2. Собственно добавить элемент согласно существующим правилам VB;

3. В случае успеха привести интерфейс пользователя в соответствующий вид.

Как видите, после первых двух разделов кода Exit Sub предотвращает выполнение последующего (третьего это, естественно, не касается) фрагмента — только в случае «незавершения» (это могут быть как Отмена в диалоге InputBox, так и ошибки в ходе выполнения).

Добавлен ли объект в функции Add, определяется путем проверки: «Объект ли это?» —IsObject.

На заметку: при повторном редактировании структуры объектов текущего проекта ClassBuilder «подхватывает» ранее созданные изменения, корректно их отображая в древовидном окне редактора, однако редактирование текста как в нашем примере вполне может привести к сбоям или неправильной интерпретации структуры, поэтому хотя бы малейшие познания в области иерархических отношений между объектами/классам/экземплярами (а также их свойствами; относительно ограничений областей видимости их свойств, переменных и времен жизни) — обязательны. В противном случае Вам придется неоднократно выполнять ту же работу при помощи различных «мастеров».

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov