|
|
Несколько слов от автора:
Здравствуйте. Ловите очередной выпуск.
|
|
2.03.2001 Выпуск N19 Обзор ведет @LEXis
# Приемы с Windows на VB:
| Балуемся с кнопкой "ПУСК" |
# Практикум на примерах:
| Классы в Visual BASIC (Часть 2 - Создание класса) |
# В разделе "вопросы/ответы":
| Ответы на вопросы читателей |
# Рубрика "Объявления"
| Балуемся с кнопкой "ПУСК" |
Вот привожу еще один примерчик.
4 Кнопки с именами по умолчанию
И добавте следующий код:
'----
Option Explicit
Dim hwndChild As Long
Const SW_HIDE = 0
Const SW_SHOW = 5
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWndParent As Long, ByVal hWndChildAfter As Long, _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function EnableWindow Lib "user32" Alias "EnableWindow" _
(ByVal hWnd As Long, ByVal fEnable As Boolean) As Long
Private Declare Function ShowWindow Lib "user32" Alias "ShowWindow" _
(ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Sub Form_Load()
Me.Caption = "Start button"
Command1.Caption = "Hide"
Command2.Caption = "Show"
Command3.Caption = "Enabled"
Command4.Caption = "Disabled"
hwndChild = FindWindowEx(FindWindow("Shell_traywnd", ""), 0, "Button", "")
End Sub
Private Sub Command1_Click()
ShowWindow hwndChild, SW_HIDE
End Sub
Private Sub Command2_Click()
ShowWindow hwndChild, SW_SHOW
End Sub
Private Sub Command3_Click()
EnableWindow hwndChild, True
End Sub
Private Sub Command4_Click()
EnableWindow hwndChild, False
End Sub
'----
| Классы в Visual BASIC (Часть 2 - Создание класса) |
Евгений Февраль 2001
Привет всем!
Итак, приступим к созданию нового класса. Для удобства и быстроты понимания буду приводить в пример Сообчайлер (что это такое смотри в следующем номере).
Для начала определимся, зачем Сообчайлеру вообще нужен какой либо класс. Выше я говорил, что класс - это компонент многократного использования, шаблон. Что у нас в Сообчайлере будет многократно использоваться и иметь при этом свои свойства? Я думаю, это будут почтовые ящики - Box. Их будет много, пользователь будет постоянно добавлять новые, при этом у каждого почтового ящика будут свои свойства. Например Имя почтового ящика, Адрес POP3-сервера, Адрес SMTP-сервера, Пароль на сессию и пр.
Можно было бы сделать это все через массивы. Например, организовать массив имен ящиков, массив адреса POP3, адреса SMTP, массив паролей. Для первого ящика это выглядело бы так:
Name=BoxName(1)
SMTP=SMTPServer(1)
POP3=POP3Server(1)
Pass=Password(1)
И дальше в программе просто использовать эти массивы. Но это жутко неудобно. Во-первых, мы не знаем количество ящиков, которое захочет создать пользователь. Придется каждый раз менять границы массива. Вдобавок придется вводить переменные для хранения максимального числа элементов массива, чтобы мы могли объявлять циклы For I=1 To MaxNumberBoxs. Это лишний расход памяти. А как быть с удалением? Допустим, создал пользователь два ящика и захотел удалить последний. Окей, мы исключаем последний элемент из всех массивов и меняем размер массива с помощью оператора ReDim. А как быть, если он захочет удалить первый ящик? Придется создавать еще по временному массиву на каждый из уже созданных, для их перезаписи без к.л. среднего элемента. Т.е. мы будем создавать временный массив, в который перепишем все элементы, кроме удаляемого, а затем из временного массива переписывать все это дело обратно. Это уже чревато двумя наиболее критичными проблемами: перерас!
ход памяти (свойств-то много!) и увеличение времени быстродействия. Кому наша программа будет нужна, если при работе с десятью ящиками на удалении одного из них она будет тратить порядка минуты и при этом еще и занимать в памяти 20 Мб?
И, пожалуй, самое главное: А ЕСЛИ МЫ ЗАХОТИМ ДОБАВИТЬ НОВОЕ СВОЙСТВО? Для этого необходимо перелопатить весь набранный код. При этом обязательно мы где-то забудем это сделать. Как результат - баги. Время на их исправление. Морока с массивами. Короче я сомневаюсь, что мы вообще сможем в таком случае дописать программу до конца. Просто не хватит терпения. А ведь есть еще и папки (Folder), которые тоже имеют свои свойства… А еще сообщения… Мрачная картина вырисовывается…
НО! Мы можем создать класс (шаблон) clsBox. И по этому шаблону создавать почтовый ящик. Создадим свой первый класс - класс почтового ящика. Можно вручную добавить модуль класса через меню Project/Add Class Module выбрав в появившемся меню Class Module или сделать это с помощью построителя классов, выбрав VB Class Builder в том же меню. Выберем второе, чтобы не удаляться далеко в дебри создания классов.
Вылезет меню построителя классов. Создадим новый класс при помощи меню File\New\Class или просто щелкнув на левой крайней иконке на панели инструментов. Зададим ему имя clsBox. Жмем ОК. Вот и добавили новый класс.
Теперь создадим несколько свойств. Для создания нового свойства щелкните по третьей кнопке на панели инструментов. Назовем это свойство BoxName - в нем будет храниться имя ящика. Выберем в Data Type значение String, т.к. имя ящика это символы. Оставим переключатель на Public Property - в следующих выпусках мы рассмотрим все подробнее. Жмем ОК. Все. Первое свойство готово. Добавим еще несколько свойств: POP3Server, SMTPServer и Password. Тип данных для всех будет String.
Все. Закрываем окно построителя классов. Выскочит окошко с предложением произвести изменения в проекте. Жмем ОК. Все. Класс готов к употреблению.
Для употребления необходимо объявить его в своей программе
Что в переводе означает: объявить Box как новый экземпляр класса clsBox. При этом данный экземпляр класса clsBox будет иметь все только что созданные свойства. Наберите Box и нажмите точку. ВИДИТЕ??? Появился список с перечислением свойств, совсем как для текстового поля!!!! Теперь вы можете оперировать с этими свойствами.
Например, так
Box.BoxName = "Verter"
Debug.Print Box.BoxName
Таким образом, вы можете создать экземпляр для второго ящика:
И использовать:
Box2.POP3Server = "compnet.dgrad.ru"
Debug.Print Box2.POP3Server
Для третьего - Dim Box3 As New clsBox и т.д.
Для уничтожения ящика просто применить Box2 = Nothing
Попробуйте добавить это:
Box2 = Nothing
Debug.Print Box2.POP3Server
У вас произойдет ошибка, ибо мы сперва уничтожили объект под именем Box2.
Но опять же немного неудобно создавать и удалять объекты. Надо самим задавать номер ящика. Необходимо создавать дополнительные переменные, для хранения числа ящиков. Разные имена у объектов… Неудобно.
Чтобы создавать много почтовых ящиков по этому классу с одним именем, необходимо создать коллекцию почтовых ящиков. Это как коллекция марок. Коллекция позволяет создавать множество экземпляров класса с одним именем, каждый из которых будет иметь свои значения свойств. Это наподобие массивов элементов управления, если кто знает. Или те же марки. Их много, но у каждой своя картинка. Так и у нас - почтовых ящиков много, но свойства у всех свои.
Воспользуемся построителем классов. Для создания коллекции нажмем вторую слева кнопку на панели инструменты. Зададим ей имя colBoxes. Выберем справа в окошечке наш класс clsBox, для как базовый для нашей коллекции. Жмем ОК. Все, коллекция готова. Закрываем построитель и соглашаемся с изменениями.
Теперь мы можем создать коллекцию одного экземпляра класса clsBox и работать уже с ней.
Коллекции классов имеют стандартные методы:
Add - для добавления в коллекцию
Remove - для удаления
Item - номер элемента в коллекции
На остальных мы остановимся позже.
Объявим класс и коллекцию:
Dim classBox As New clsBox
Dim Box As New colBoxes
Чтобы добавить новый ящик в коллекцию просто наберите Box, нажмите точку и выберете метод Add из списка. Ну, а дальше выйдет контекстное меню, где будет перечислен порядок ввода свойств.
Box.Add "Verter", "compnet.dgrad.ru", "compnet.dgrad.ru", "password"
Добавим второй ящик
Box.Add "Allin", "mail.ru", "mail.ru", "password"
Третий…
Box.Add "Evgeniy", "chat.ru", "chat.ru", "password"
Теперь посмотрим POP3-сервер для второго ящика. Используем свойство Item.
Debug.Print Box.Item(2).POP3Server
Выведет mail.ru
Удалим второй ящик:
Автоматически коллекция сдвинется на одну позицию. Теперь третий ящик станет вторым и
Debug.Print Box.Item(2).POP3Server
нам выдаст
chat.ru
Теперь у нас два ящика и
Debug.Print Box.Item(3).POP3Server
приведет к ошибке.
Все просто донельзя! И не надо мучаться с массивами!
Ну, пожалуй, на первый раз достаточно. Пишите в группу, если что-нибудь непонятно - будем вместе разбираться. Все дополнения/найденные ошибки/пожелания
присылайте мне.
| Вопрос от @LEXis`a
Здравствуйте,
Как снять изображение с экрана и сразу сохранить его в графический файл? Оченнннь надо. Плиз хелп.
|
|
| Требуются люди
Хочу напомнить, что еще пусты многие вакансии рассылки:
- Рубрика "Рецензия книг"
- Рубрика "Практикум на примерах"
Также можно просто присылать коды.
|
|
Код моей кнопки:
Код моей кнопки:
<!-- SnoozeX Design "PLAY" -->
<a href="http://snoozex.boom.ru" TARGET="_blank"><BR><IMG SRC="http://snoozex.boom.ru/new.gif" WIDTH=88 HEIGHT=31 BORDER=1 ALT="SnoozeX Design"></a>
<!-- SnoozeX Design "END" -->
|
© 2000 - 2001 @LEXis & Design by SnoozeX Design
|
Рассылка является составной частью проекта "СообЧа - СООБщество ЧАйников"
© 2000 - 2001 СообЧа (СООБщество ЧАйников)
|
| |
Спасибо за внимание. Ваш
@LEXis |
|