Отправляет email-рассылки с помощью сервиса Sendsay

Visual Basic FAQ

  Все выпуски  

Visual Basic FAQ #1 [11.07.2005]


Информационный Канал Subscribe.Ru

Visual Basic
FAQ
#1 Сегодня в номере:
С первенцем! ∙  Совет никогда не помешает ∙  Чат своими руками
О пользе стандартизации ∙  Узнаем о компьютере все!
ShellAPI :: SHBrowseForFolder
11.07.2005

С первенцем!

Мои поздравления с первым выпуском рассылки!

> Немного общего с оформлением сайта ATI Technologies у оформления моей рассылки? Вам наверное показалось... Я вообще только когда все сделал сообразил, что занимаюсь плагиатом. Ничего, ATI я не думаю, что подаст за это в суд. А в следующем номере придумаю что-нибудь другое...

> Скоро открою еще одну рассылку - Windows F1 - Помощь по установке и настройке "окошек". Рекомендую всем тем, кто любит Винду и жить без нее не может и кого сама Винда терпеть не может и постоянно действует на нервы (мне она уже все нервы попортила!)

Вот он - перед Вами - первый выпуск нашей рассылки

Здравствуйте, уважаемые подписчики и просто читатели нашей рассылки. Поздравляю всех Вас с первым номером еженедельного VBFAQ! Надеюсь, что материалы нашей рассылки будут полезны широкому кругу читателей. Прошу Вас принимать активное участие в формировании содержания рассылки, высказывая свое мнение по поводу тех или иных материалов, предлагая свои идеи и задавая интересные вопросы по теме, ответить на которые я всегда рад! Все Ваши комментарии, предложения и вопросы прошу отправлять мне по почте: dreamlight freemail.uz

Итак, вкратце об этой рассылке... Visual Basic - самый популярный язык программирования в мире, благодаря своей простоте, но просто только на первый взгляд, если не касаться различных аспектов программирования под Windows. Так вот цель этой рассылки помочь начинающим VB программерам освоить все детали программирования на Visual Basic, а более продвинутым - дать ответы на интересующие их вопросы и обратить их внимание на некоторые тонкости работы в среде. Visual Basic FAQ - это не только ответы на часто задаваемые вопросы по программированию на Visual Basic, но и интересные обзоры, статьи, полезные советы, новости, и многое другое. Так в каждом выпуске я обязательно расскажу Вам об одной из Win32API функций, незаменимых в составлении программ под Windows. Также мы будем говорить и об основах программирования, о том как и по какому принципу работает тот или иной код. И конечно ответы на наиболее интересные вопросы от читателей ждут Вас в каждом номере рассылки.

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

Еще рекомендую зайти на наш сайт по адресу: www.dreamlight.h15.ru, где есть страничка программирования на Visual Basic и поделиться своими мыслями на нашем форуме.

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

Спасибо за внимание!

Совет никогда не помешает

В этой рубрике я хочу поделиться с Вами полезными советами по программированию и работе со средой

Полезные советы

  • Уже неоднократно встречавшийся, но кто-то может не знает... Чтобы изменить значение булевской переменной на противоположное: A=Not A
  • Используйте уже готовые значения арифметических операций - это увеличит скорость выполнения программы: Например: если вы используете в программе факториалы - не нужно нагружать компьютер арифметическими действиями - занесите в память программы готовые значения: F(5)=120:F(6)=720:...:F(10)=3628800: и т.д. и используйте: F=F(i)
  • Чтобы сделать многострочный MsgBox используйте константу переноса строки: Chr(13)+Chr(10) или vbNewLine или vbCrLf
  • Для перехвата событий нажатия клавиш у элементов управления, типа TextBox формой измените свойство KeyPreview=True
  • Для сравнения символьных строк по содержанию, а не по байтам, т.е "А"="а", либо переведите обе строки или в нижний регистр (LCASE) или в верхний (UCASE), если вы собираетесь использовать другой тип сравнения в другом месте программы. Если же вы будете использовать только сравнение по содержанию лучше будет поставить в самом начале кода опцию Option Compare Text.
  • Если то, что вы нарисовали на форме или PictureBox, посредством PaintPicture и старых добрых Line и Circle, стирается при закрытии этой области другим окном, установите свойство формы AutoRedraw=True
  • Чтобы изменить ширину и стиль линий, выводимых Line, ознакомьтесь с параметрами DrawWidth и DrawStyle соответственно. Для прямоугольников и эллипсов стиль и цвет заливки определяется параметрами FillStyle и FillColor соответственно.
  • Чтобы нарисовать эллипс или дугу используйте процедуру Circle:
    Circle (x, y), радиус, цвет, начало дуги, конец дуги, фактор сжатия.
    - x и y - координаты центра
    - с радиусом и цветом все понятно, я думаю
    - начало и конец дуги выражаются в радианах от 0 до 2*pi (надеюсь тригонометрию все проходили), например 5*pi/4 и 7*pi/4, где const pi=3.1415926
    - и наконец фактор сжатия применяется для рисования эллипсов. Чтобы понять, что это такое мысленно возьмите окружность и проведите два перпендикулярных диаметра, горизонтально и вертикально. Так вот фактор сжатия-есть результат отношения вертикального к горизонтальному. Проще говоря: поделите диаметр вертикальный на диаметр горизонтальный нужного вам эллипса и получите эту величину. Отсюда вытекает то, что по умолчанию этот параметр равен 1 (для круга). Если > 1 эллипс будет вытянут вертикально, и наоборот - если < 1 - горизонтально.
  • Почему-то разработчики среды ввели совсем неудобную единицу измерения длины во всех визуальных объектах Visual Basic под названием Twip. Не знаю зачем это: то ли для большей точности ( 15 Twip = 1Pixel , но именно пиксел - минимальная единица экрана ) , то ли просто для понта? Но числа получаются большие и неудобные в визуальном представлении. К счастью это можно исправить, кроме размера формы - он все равно будет показываться в Twip'ах. Измените ScaleMode должным образом. А если нужен размер формы в пикселах воспользуйтесь параметрами ScaleHeight и ScaleWidth.

Чат своими руками

В этой статье я расскажу Вам об ActiveX компоненте Microsoft Windows Sockets и примерах его применения

 

Анекдот в тему

Умирает программист. Попадает в рай - мученик, как никак. Там ему архангел Гавриил (с Богом программистам разговаривать не положено, не по рангу им это) и говорит:
- Спрашивай, чего хочешь, на любой вопрос отвечу. Такая вот золотая рыбка с крыльями.
Программист сразу просит показать небесный сервак. Приводит его Гавриил в серверную, включает экран.
Смотрит, смотрит программист, а потом как заорет:
- Да это же винда!
- Ну да, а ты чего хотел, Нетварь, что ли?
- И пятый сиквел сервер базой данных?
- Ясное дело.
- А софт на каком-нибудь бэйсике написан?
- Не на каком-нибудь, а на вижуал.
- Так оно всё, небось, глюкует страшно?
- А ты думал, вы от хорошей жизни по восемь часов в сутки дрыхнете? Это мы по ночам перегружаемся.

Создание сетевых программ с помощью Windows Sockets

Мало кто знает, что в Visual Basic'е есть такой контрол, позволяющий обмениваться информацией по сети. И сегодня я Вам расскажу о нем. В качестве примера использования я приведу простенькую программу для обмена сообщениями. А доработать ее Вы сможете сами.

Прежде всего создайте новый проект и добавьте ActiveX под названием Microsoft WinSock Control. Слева в панели инструментов должен появится значок с двумя компьютерами, объединенными сетью.

Итак начнем... Winsock поддерживает соединения по TCP и UDP протоколу. Различия этих протоколов в том, что TCP более надежен, т.к. при соединении или отправке высылает подтверждение. Мы будем использовать именно его. Поместите два таких компонента на форму: один будет выступать в роли Сервера, т.е. прослушивать порт, а второй - в роли Клиента, осуществляющего соединение. Выберите любой номер порта больше 1000, например - 12345 и назначьте это значение обеим контролам в параметре LocalPort - для сервера и RemotePort - для клиента. Добавьте 2 TextBox'a (txtName - здесь будет находится имя или IP адрес компьютера, txtMessage - для текста сообщения),2 кнопки (cmdSend - для отправки сообщения и cmdConnect - для подключения к удаленному компьютеру) и один лейбл в качестве строки состояния (lblStat). Теперь можем приступить к написанию кода

Для начала поставим ServerSocket на прослушивание порта:

Private Sub Form_Load()
   ServerSocket.Listen
End Sub

Теперь Сервер занимается прослушкой порта, и если кто-то захочет подключиться...

Private Sub ServerSocket_ConnectionRequest(ByVal requestID As Long)
   'Если уже есть активное соединение закрываем его
   If ClientSocket.State <> sckClosed Then ClientSocket.Close
   'Подтверждаем запрос на соединение и устанавливаем связь
   ClientSocket.Accept requestID
   lblStat = "Connected to: " + ClientSocket.RemoteHost + " (" + ClientSocket.RemoteHostIP + ")"
End Sub

А чтобы подконнектиться самим пишем следующий код:

Private Sub cmdConnect_Click()
   If ClientSocket.State <> sckClosed Then ClientSocket.Close
   'Вызываем процедуру соединения с компьютером, имя или адрес которого указан в txtName
   ClientSocket.Connect txtName.Text
End Sub

После того как подключились нужно отправить данные. Займемся этим:

'Процедура отправки данных
Private Sub cmdSend_Click()
   If ClientSocket.State <> sckConnected Then Exit Sub
   'Отправляем текст, введенный в txtMessage
   ClientSocket.SendData txtMessage.Text
End Sub

'Процедура получения данных
Private Sub ClientSocket_DataArrival(ByVal bytesTotal As Long)
   Dim t As String
   'Записываем текст из буфера в переменную t
   ClientSocket.GetData t, vbString, bytesTotal
   'Выводим на экран сообщение
   MsgBox t
End Sub

Для большей информативности добавим оповещение в строке состояния при отключении связи и при успешном соединении:

Private Sub ClientSocket_Close()
   lblStat = "Not connected"
   ClientSocket.Close
End Sub

Private Sub ClientSocket_Connect()
   lblStat = "Connected to: " + ClientSocket.RemoteHost + " (" + ClientSocket.RemoteHostIP + ")"
End Sub

И не забудьте при выходе из программы разорвать соединение:

Private Sub Form_Unload()
   ClientSocket.Close
   ServerSocket.Close
End Sub

Вот и все... Откомпилируйте и запустите на двух разных машинах в сети. Введите на одном компьютере адрес или имя другого, нажмите кнопку Connect, наберите к примеру Hello, World! и нажмите кнопку Send. на втором компьютере должно всплыть сообщение с этим текстом. Если у Вас нет сети рекомендую программу VMware Workstation - она создает виртуальную машину и виртуальную компьютерную сеть.

Вы можете доработать эту программу и сделать из нее что-угодно: чат, какой-нибудь сетевой инструмент. Удачи! Не забудьте сделать обработку ошибок!

О пользе стандартизации

В этой статье я расскажу об одном из способов сделать код понятным

О пользе стандартизации

Стандарты не зря придумывали многие годы. Ведь то что сделал один человек не всегда может быть понятным другому. Так и с исходным кодом. Если вы напишете весь код в одну строчку, вы и сами потом не разберетесь в нем.

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

Еще одна стандартная вещь в Visual Basic'е - это классы. Создавайте классы для сложных структур вашего кода. Это очистит код от посторонних команд и тоже сделает его понятным как для вас, так и для других.

Для визуальных элементов управления создавайте ActiveX контролы, а не пытайтесь облегчить программу используя то, что под руками, наваливая на форму множество контролов. Например вместо использования PictureBox'ов создайте ImageList или еще лучше массив классов StdPicture. Это освободит форму от ненужных контролов.

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

Функции, выполняющие действия одной тематики объединяйте в отдельные модули. Так Вам будет проще потом их найти. Например все Declare's можно и даже нужно убрать в отдельный модуль. Они не будут Вам мешаться в будущем.

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

Помните: программы легче отлаживать, тогда когда вы понимаете исходный код. Где легче найти иголку? В большом стоге сена или в маленьких, но разложенных по порядку кучках? Так и ощибку легче найти в программе, разложенной на множество упорядоченных функций.

Узнаем о компьютере все...

Здесь я раскажу Вам о замечательной системе, присутствующей в Windows XP

Windows Management Instrumentation

В Windows, начиная с 2000-го появился очень удобный системный интерфейс управления компьютером - WMI. Именно его мы и будем сегодня рассматривать.

WMI - это системный класс, доступный из любого языка программирования: будь то С или VB. С WMI можно работать даже из VBScript'а

Более подробную информацию Вы можете найти в MSDN. Купите его на дисках, рекомендую! Или можно зайти на сайт MSDN в интернете: www.msdn.microsoft.com или русскоязычный www.microsoft.com/rus/msdn

Приступим... В качестве примера приведу программу, которая выводит информацию о процессорах, установленных в системе

Public Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)

Public Type SYSTEM_INFO
      dwOemID As Long
      dwPageSize As Long
      lpMinimumApplicationAddress As Long
      lpMaximumApplicationAddress As Long
      dwActiveProcessorMask As Long
      dwNumberOfProcessors As Long
      dwProcessorType As Long
      dwAllocationGranularity As Long
      wProcessorLevel As Integer
      wProcessorRevision As Integer
      wProcessorArchitecture As Integer
      wReserved As Integer
End Type

Private Sub GetProcessorInfo()
Dim si as SYSTEM_INFO
      GetSystemInfo(si)

   'Для начала смотрим сколько процессоров в системе
   msg = msg + "Number of Processors: " + CStr(si.dwNumberOfProcessors) + vbCrLf

   For i = 0 To si.dwNumberOfProcessors - 1
   'Создаем класс процессора
      Set objproc = GetObject("winmgmts:root\cimv2:win32_processor='cpu" + CStr(i) + "'")

   'И получаем информацию...
      msg = msg + vbCrLf + "Name: CPU" + CStr(i) + vbCrLf
      msg = msg + "Brand: " + Trim(objproc.Name) + vbCrLf
      msg = msg + "Manufacturer: " + Trim(objproc.Manufacturer) + vbCrLf
      msg = msg + "Description: " + Trim(objproc.Caption) + vbCrLf
      msg = msg + "ID: " + objproc.ProcessorId + vbCrLf
      msg = msg + "Current Speed: " + CStr(objproc.CurrentClockSpeed) + " Mhz" + vbCrLf
      msg = msg + "Max Speed: " + CStr(objproc.MaxClockSpeed) + " Mhz" + vbCrLf
      msg = msg + "L2 Cache: " + CStr(objproc.L2CacheSize) + " Kbytes (" + CStr(objproc.L2CacheSpeed) + " Mhz)" + vbCrLf
      msg = msg + "Architecture:"

      If objproc.Architecture = 0 Then
         msg = msg + "x86"
      ElseIf objproc.Architecture = 6 Then
         msg = msg + "ia64"
      Else
         msg = msg + "unknown"
      End If
      msg = msg + vbCrLf
   Next
   Msgbox msg, vbOkOnly, "Processor Information"
End Sub

Впрочем для выделения отдельных элементов из множеств можно было бы применить такой метод:

Set CPUS = GetObject("Winmgmts:").InstancesOf("Win32_Processor")

For Each CPU In CPUS
   'Нужно только проверить существует ли класс...
   If Not IsNull(CPU.CurrentClockSpeed) Then

      ....

   End If
Next

Вот и все... Более подробно о всех классах и инстанциях этой системы Вы можете посмотреть в документации MicroSoft Developer Network.

Справочник WinAPI32

В этом разделе я буду рассказывать вам об интегрированных в Windows функциях

ShellAPI :: SHBrowseForFolder

Функция вызова диалога выбора папки.
Файл заголовка: shlobj.h
Библиотека: shell32.dll
Поддержка: Win95/NT и выше

Public Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolderA" (lpbi As BROWSEINFO) As Long

  • lpbi As BROWSEINFO
    Единственный параметр должен передавать структуру BROWSEINFO с заполненными значениями

Public Type BROWSEINFO
   hWndOwner As Long
   pIDLRoot As Long
   pszDisplayName As String
   lpszTitle As String
   ulFlags As Long
   lpfnCallback As Long
   lParam As Long
   iImage As Long
End Type

  • hWndOwner As Long
    Хендл родительского окна для диалога.
  • pIDLRoot As Long
    Указатель на список идентификаторов элементов (структура ITEMIDLIST) определяющих нахождение корневых папок диалога выбора. Только выбранные папки и их вложенные элементы будут показаны при выборе папки. Если значение равно 0 в качестве корневой директории будет использовано указанное в параметре ulFlags именное пространство.
  • pszDisplayName As String
    Текстовый буфер, который получит текст, содержащий название выбранной папки. Размер буфера должен быть равен MAX_PATH

    Public Const MAX_PATH As Long = 260

  • lpszTitle As String
    Параметр, содержащий текст, который будет отображаться в диалоге над деревом папок. Этот текст можно использовать для пояснения или передачи инструкций пользователю.
  • ulFlags As Long
    Параметр, определяющий типы папок, которые будут показаны в диалоге, наравне с другими опциями. Этот параметр может быть объединением любых из этих констант:
    Public Const BIF_RETURNONLYFSDIRS As Long = 1
       'Возврат только физических папок

    Public Const BIF_DONTGOBELOWDOMAIN As Long = 2
       'Не отображает общие папки на доменах сети

    Public Const BIF_STATUSTEXT As Long = 4
       'Отображает строку состояния

    Public Const BIF_RETURNFSANCESTORS As Long = 8
       'Возврат только родительских элементов (у которых есть подэлементы)

    Public Const BIF_BROWSEFORCOMPUTER As Long = &H1000
       'Возврат только элементов, являющихся компьютерами сети

    Public Const BIF_BROWSEFORPRINTER As Long = &H2000
       'Возврат только принтеров

    Public Const BIF_BROWSEINCLUDEFILES As Long = &H4000
       'Показ файлов (98/2k)
  • lpfnCallback As Long
    Адрес функции, которую будет вызывать диалог при событии. При нулевом значении такой функции не будет. Для большей информации см. BrowseCallbackProc в MSDN
  • lParam As Long
    При использовании Callback функции значение этого параметра передается в указанную функцию
  • iImage As Long
    Переменная, получающая значение значка выбранной папки. Значение представлено как индекс системного списка значков.

Пример использования:

Public Function BrowseDialog(Title As String, InitDir As String, Flags As Long, OwnerHwnd As Long) As String
   Dim pidl As Long, pos As Long
   Dim bi As BROWSEINFO

   bi.hWndOwner = OwnerHwnd
   bi.lpszTitle = Title
   bi.ulFlags = Flags
   bi.pidlRoot = SHSimpleIDListFromPath(InitDir)

   pidl = SHBrowseForFolder(bi)
   'Получение из идентификатора пути к выбранной папке или файлу
   path = String$(MAX_PATH, 0)
   If SHGetPathFromIDList(ByVal pidl, ByVal path) Then
      pos = InStr(path, Chr$(0))
      wpBrowseDialog = Left(path, pos - 1)
   End If
   Call CoTaskMemFree(pidl)    'Освобождаем память
End Function

Happy End

Надеюсь и у Вас все в порядке...

И здесь про VB...

vbrussian.com

Спасибо за внимание!

Спасибо за внимание, проявленное к нашей рассылке. Я рад, если вам было интересно.

Все комментарии, вопросы и пожелания прошу отправить письмом на адрес электронной почты: dreamlight freemail.uz. Не забудьте зайти на наш сайт в Интернете: www.dreamlight.h15.ru.

Если Вам нравится наша рассылка и Вы хотите ее поддержать, можете перечислить немного денежных средств WebMoney на счета:
USD Z029498797307
RUR R179920724119
EUR E257883132079

Ведущий рассылки: < dim@ >
Mailto: tash-dim@freemail.uz
ICQ: 289-575-313

Origin: VB не глючный, глючат программы, написанные на VB!

  Copyright© Dreamlight Development Group 2005
По всем интересующим вас вопросам обращайтесь на адрес электронной почты: dreamlight@freemail.uz

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.dltvbfaq
Отписаться
Вспомнить пароль

В избранное