Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 33.


VBNet VBMania
Голосование:

Ваш голос отсылается по E-mail владельцу сайта, после чего голоса анализируются и на отдельной странице выводятся результаты.

Subscribe.Ru увеличило максимальный размер рассылки до 100 кб. В связи с этим вопрос:
Какого размера Вы хотели бы получать рассылку?

Менее 20 кб
От 20 до 40 кб
От 40 до 60 кб
От 60 до 80 кб
Выше 80 кб


В какой день (дни) недели Вы хотели бы получать рассылку "Visual Basic: новости сайтов, советы, примеры кодов."?
Понедельник
Вторник
Среда
Четверг
Пятница
Суббота
Воскресение


С какой периодичностью Вы хотели бы получать рассылку "Visual Basic: новости сайтов, советы, примеры кодов."?
Каждый день
2 раза в неделю
Раз в неделю
Раз в две недели
Раз в месяц
Реже


Результаты голосования
Рассылки Subscribe.Ru
Мир программирования на Visual BASIC 5.0 и HTML.


Рассылки Subscribe.Ru
Старые игры

Доска почёта:

Sergey Y. Tkachev
Кононенко Роман
Kirill
Sergey Sapozhnikov
Sobic

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • Snoozex Design
  • Господа!!! читайте MSDN!!!

    Несколько слов от автора:

       Поздравляю всех с натупающим праздником! Читайте!


    Содержание выпуска




    Книги

    Visual Basic 6. Специальный справочник

    Это издание поможет читателю освоить инструменты и средства Visual Basic. Здесь вы найдете описание элементов языка, библиотечных функций, SQL-операторов, элементов управления. Особое внимание уделено различным мастерам, предназначенным для решения стандартных задач. В каждой главе содержится информация по созданию приложения определенной направленности: пошаговое описание операций, синтаксис необходимых операторов и подробно разобранные примеры. Для облегчения поиска можно воспользоваться алфавитным указателем, размещенным в конце книги. Предлагаемый справочник будет полезен не только пользователям, активно работающим с Visual Basic 6, но и начинающим программистам, желающим перейти к профессиональной разработке приложений с наименьшими затратами времени.


    Автор: Карпов Борис
    Издательство: Питер
    Год издания: 2000
    Кол-во страниц: 416
    Стоимость: 84 р.
    Формат: 84x108/32
    Переплёт: мягкий

    Visual Basic 6.0 для приложений

    В книге приведены справочные сведения по программированию на языке Visual Basic 6.0 для приложений (VBA 6.0) в рамках Microsoft Office 2000. Подробно описаны объекты, их свойства и методы, операторы, функции, типы данных. Отдельная глава посвящена проектированию меню, панелей и форм. Описание иллюстрировано примерами. Сведения структурированы по приложениям, входящим в состав Microsoft Office 2000: Word, Excel, PowerPoint, Access. Предметный указатель позволяет быстро найти необходимую информацию.


    Автор: Гюнтер Штайнер
    Издательство: Лаборатория Базовых Знаний
    Год издания: 2000
    Кол-во страниц: 832
    Стоимость: 88 р.
    Формат: 70x100/32
    Переплёт: твёрдый

    Visual Basic 6.0, Visual Basic for Applications 6.0

    Книга является систематизированным справочником по всем элементам языка программирования Visual Basic (VВ), входящим, как в автономную версию VB, так и в основные реализации Visual Basic for Applications. Помимо тех официальных сведений, которые можно найти в документации и в справочной системе, книга содержит конкретные примеры, рекомендации и маленькие хитрости программиста, а также поправки к справочной системе, которая, увы, не без ошибок. Книга предназначена для всех специалистов, занимающихся разработкой приложений с применением Visual Basic for Applications.


    Автор: Король В
    Издательство: КУДИЦ - ОБРАЗ
    Год издания: 2000
    Кол-во страниц: 448
    Стоимость: 129 р.
    Формат: 70х100/16
    Переплёт: мягкий

    Visual Basic 6.0. Наиболее полное руководство для профессиональной работы в среде Visual Basic 6.0

    Язык программирования Visual Basic - мощный инструмент разработки приложений для 32 - разрядных систем Windows 95 и Windows NT. В книге рассматриваются как фундаментальные понятия и темы: от установки продукта на компьютер пользователя и описания интегрированной среды разработки до изложения основ техники программирования на Visual Basic , так и сложные вопросы, адресованные профессиональным программистам: создание интерфейса пользователя, применение стандартных элементов управления, в том числе и для работы с базами данных, программирование компонентов ActiveX, описание технологии OLE drag - and - drop, объектная модель FSO, функции работы с файлами, отладка и оптимизация программ, локализация и распространение готовых приложений.


    Автор: нет данных
    Издательство: BHV - Санкт - Петербург
    Год издания: 2000
    Кол-во страниц: 992
    Стоимость: 217 р.
    Формат: 70х100/16
    Переплёт: мягкий

    Visual Basic 6.0. Практика использования

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


    Автор: Титаренко Григорий
    Издательство: BHV - Киев
    Год издания: 2001
    Кол-во страниц: 416
    Стоимость: 96 р.
    Формат: 60x90/16
    Переплёт: твёрдый


    Остальные книги о VB можно найти
    здесь.

    наверх


    Получить размер директории

    Пример 1 основан на применении FileSystemObject. Для использования этого примера установите ссылку на Microsoft Scripting Runtime через меню Project | References.

    'Пример 1

    Dim FSys As New FileSystemObject
    Private Sub Command1_Click()
    'Не забудьте указать свою директорию для проверки примера
    Set qn = FSys.GetFolder("D:\2\attributes\")
    MsgBox "Размер папки " & qn.Size / 1024 & " килобайт"
    End Sub

    'Пример 2

    Const MAX_PATH = 260
    Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
    End Type
    Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
    End Type
    Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

    Public Function SizeOf(ByVal DirPath As String) As Double
    Dim hFind As Long
    Dim fdata As WIN32_FIND_DATA
    Dim dblSize As Double
    Dim sName As String
    Dim x As Long
    On Error Resume Next
    x = GetAttr(DirPath)
    If Err Then SizeOf = 0: Exit Function
    If (x And vbDirectory) = vbDirectory Then
    dblSize = 0
    Err.Clear
    sName = Dir$(EndSlash(DirPath) & "*.*", vbSystem Or vbHidden Or vbDirectory)
    If Err.Number = 0 Then
    hFind = FindFirstFile(EndSlash(DirPath) & "*.*", fdata)
    If hFind = 0 Then Exit Function
    Do
    If (fdata.dwFileAttributes And vbDirectory) = vbDirectory Then
    sName = Left$(fdata.cFileName, InStr(fdata.cFileName, vbNullChar) - 1)
    If sName <> "." And sName <> ".." Then
    dblSize = dblSize + SizeOf(EndSlash(DirPath) & sName)
    End If
    Else
    dblSize = dblSize + fdata.nFileSizeHigh * 65536 + fdata.nFileSizeLow
    End If
    DoEvents
    Loop While FindNextFile(hFind, fdata) <> 0
    hFind = FindClose(hFind)
    End If
    Else
    On Error Resume Next
    dblSize = FileLen(DirPath)
    End If
    SizeOf = dblSize
    End Function
    Private Function EndSlash(ByVal PathIn As String) As String
    If Right$(PathIn, 1) = "\" Then
    EndSlash = PathIn
    Else
    EndSlash = PathIn & "\"
    End If
    End Function

    Private Sub Form_Load()
    'Замените 'D:\Basic' той директорией, размер которой хотите узнать
    MsgBox SizeOf("D:\Basic") / 1000000
    End Sub

    наверх


    Три пути создания папки

    Разместите на форме элемент CommandButton

    '1 ВАРИАНТ

    Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
    End Type
    Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long
    Public Sub CreateNewDirectory(NewDirectory As String)
    Dim sDirTest As String
    Dim SecAttrib As SECURITY_ATTRIBUTES
    Dim bSuccess As Boolean
    Dim sPath As String
    Dim iCounter As Integer
    Dim sTempDir As String
    iFlag = 0
    sPath = NewDirectory
    If Right(sPath, Len(sPath)) <> "\" Then
    sPath = sPath & "\"
    End If
    iCounter = 1
    Do Until InStr(iCounter, sPath, "\") = 0
    iCounter = InStr(iCounter, sPath, "\")
    sTempDir = Left(sPath, iCounter)
    sDirTest = Dir(sTempDir)
    iCounter = iCounter + 1
    'create directory
    SecAttrib.lpSecurityDescriptor = &O0
    SecAttrib.bInheritHandle = False
    SecAttrib.nLength = Len(SecAttrib)
    bSuccess = CreateDirectory(sTempDir, SecAttrib)
    Loop
    End Sub

    Private Sub Form_Load()
    Call CreateNewDirectory("c:\123\456\789\")
    End Sub

    '2 ВАРИАНТ


    Private Declare Function MakeSureDirectoryPathExists Lib "IMAGEHLP.DLL" (ByVal DirPath As String) As Long
    Sub CreateFolder(ByVal DestPath As String)
    If Right(DestPath, 1) <> "\" Then DestPath = DestPath & "\"
    If MakeSureDirectoryPathExists(DestPath) = 0 Then
    MsgBox "Ошибка в создании папки: " & DestPath
    End If
    End Sub
    Public Function FileName(FilePath As String)
    Dim strArray() As String
    strArray = Split(FilePath, "\")
    FileName = strArray(UBound(strArray))
    End Function
    Private Sub Form_Load()
    CreateFolder ("c:\123\456\789")
    End Sub

    '3 ВАРИАНТ


    Private Sub Command1_Click()
    On Error GoTo errorfolder:
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CreateFolder "c:\new_folder"
    errorfolder:
    If Err = 58 Then MsgBox "File already exists"
    Exit Sub
    End Sub

    наверх


    Как проверить, существует ли директория?

    Иногда необходимо проверить, существует ли папка. Данная функция возвращает True - если папка существует, и False - если такой папки на компьютере нет. В данную функцию передается строковая переменная, содержащая полный путь к директории(папке).

    Public Function FolderExists(ByVal strPathName As String) As Boolean
    Dim DirectoryFound As String
    Const errPathNotFound As Integer = 76
    On Error GoTo 0
    DirectoryFound = Dir(strPathName, vbDirectory)
    If (Len(DirectoryFound) = 0 Or Err = errPathNotFound) Then
    FolderExists = False
    Else
    FolderExists = True
    End If
    End Function
    Private Sub Command1_Click()
    'MsgBox FolderExists("D:\Basic")
    If FolderExists("D:\Basic\Module1") = False Then
    MsgBox "Такая папка не существует"
    Else
    MsgBox "Такая папка существует"
    End If
    End Sub

    наверх


    Функция удаления директории со всем содержимым

    Private Sub Form_Load()
    'замените путь 'D:\vbcode1\Category\_vti_cnf' на ваш
    x = DelTree("D:\vbcode1\Category\_vti_cnf")
    Select Case x
    Case 0: MsgBox "Deleted"
    Case -1: MsgBox "Invalid Directory"
    Case Else: MsgBox "An Error was occured"
    End Select
    End Sub

    Function DelTree(ByVal strDir As String) As Long
    Dim x As Long
    Dim intAttr As Integer
    Dim strAllDirs As String
    Dim strFile As String
    DelTree = -1
    On Error Resume Next
    strDir = Trim$(strDir)
    If Len(strDir) = 0 Then Exit Function
    If Right$(strDir, 1) = "\" Then strDir = Left$(strDir, Len(strDir) - 1)
    If InStr(strDir, "\") = 0 Then Exit Function
    intAttr = GetAttr(strDir)
    If (intAttr And vbDirectory) = 0 Then Exit Function
    strFile = Dir$(strDir & "\*.*", vbSystem Or vbDirectory Or vbHidden)
    Do While Len(strFile)
    If strFile <> "." And strFile <> ".." Then
    intAttr = GetAttr(strDir & "\" & strFile)
    If (intAttr And vbDirectory) Then
    strAllDirs = strAllDirs & strFile & Chr$(0)
    Else
    If intAttr <> vbNormal Then
    SetAttr strDir & "\" & strFile, vbNormal
    If Err Then DelTree = Err: Exit Function
    End If
    Kill strDir & "\" & strFile
    If Err Then DelTree = Err: Exit Function
    End If
    End If
    strFile = Dir$
    Loop
    Do While Len(strAllDirs)
    x = InStr(strAllDirs, Chr$(0))
    strFile = Left$(strAllDirs, x - 1)
    strAllDirs = Mid$(strAllDirs, x + 1)
    x = DelTree(strDir & "\" & strFile)
    If x Then DelTree = x: Exit Function
    Loop
    RmDir strDir
    If Err Then
    DelTree = Err
    Else
    DelTree = 0
    End If
    End Function

    наверх


    Установить папку, открываемую "по умолчанию"

    Копаясь как-то в библиотеке kernel32.dll, наткнулся на API-функцию SetCurrentDirectory. Некоторое время я думал, как можно использовать эту функцию, и вот вам небольшой пример. Наверняка, эту функцию можно использовать и еще как-то, вот тут-то и открывается простор для вашей деятельности.

    Как всегда в моих примерах, не забудьте расположить на форме элемент CommandButton.

    Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
    Private Sub Command1_Click()
    SetCurrentDirectory ("d:\1")
    Dim FN As Integer
    FN = FreeFile
    Dim FName As String
    'Использование функции SetCurrentDirectory позволяет не вводить полный путь файла.
    'Без использования функции SetCurrentDirectory следующая строчка выглядела бы как:
    'Open "D:\1\1.txt" For Input As #FN
    Open "1.txt" For Input As #FN
    ddd = Input(LOF(FN), #FN)
    Close #FN
    MsgBox ddd
    'Module1.ShowOpen
    End Sub

    наверх


    Мои программы

    BalloonMessage for MS Agent

       BalloonMessage for Microsoft Agent реализует диалог программы с пользователем, используя при этом технологию Microsoft Agent. OCX реализует три типа диалоговых окон: InputBox, MsgBox и MsgLabels.

    Автор: Шатрыкин Иван. Соавтор: Павел Сурменок.

    наверх


    Вопрос/Ответ

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Вопросы:


    Автор вопроса:
    Rafis

    Ответ ожидается по этому адресу

       Подскажите мне, пожалуйста, как определить попал ли элемент упр. в границы другого эл.упр. Допустим shape задел другой shape, причём оба shape-а движутся.Лучше без определения Left и top.


    Автор вопроса: Павел

    Ответ ожидается по этому адресу

       Не могу разобраться с сетью!!

    Как получить список машин в сети?
    И как пересылать данные через WinSoket если он все время обьединяет переменные при частой передаче пакетов или что можно использовать вместо него? Я видел не мало программ для управления сетевой машиной которые не требовали установки Client-а на удаленной машине, может кто нибудь подскажит в чем прикол или лудьше скинет исходничек?

    !! Если можно подскажите хорошую литературу и где ее можно найти?


    Автор вопроса: Вадим Александрович Ярошенко

    Ответ ожидается по этому адресу

       Подскажите, как работать с БД Betrive.




    Ответы:


    Вопрос:

       как расположить несколько чисел в порядке воярастания?

    Ответ:

    Автор ответа: Кривокрисенко Артём

    Можно сделать это следующим образом (данный код необходимо разместить в любом модуле)

    Option Explicit

    ' Этот тип данных можно было не создавать,
    ' но я не нашёл другого способа делать ссылки на
    ' массив
    ' В этом случае можно ссылаться на массив по
    ' индексу переменной SArr

    Private Type SortArray
         A() As Double
    End Type
    Dim SArr(1 To 2) As SortArray

    Public Sub Sort(SortArr() As Double, ReadyArr() As Double)
    ' Данные берутся из массива SortArr и помещаются
    ' в массив ReadyArr

         ReDim SArr(1).A(UBound(SortArr)) 'Главный массив
         ReDim SArr(2).A(UBound(SortArr)) 'Временный массив

         Dim int1 As Integer
         Dim int2 As Integer
         For int1 = 1 To 2
             For int2 = 0 To UBound(SortArr)
                 SArr(int1).A(int2) = SortArr(int2)
             Next int2
         Next int1
    ' Сначала временный и главный массивы содержат
    ' одинаковые данные
         JoinSort 0, UBound(SortArr), 1, 2 'Сортируем
         For int2 = 0 To UBound(SArr(1).A)
             ReadyArr(int2) = SArr(1).A(int2)
         Next int2
    End Sub

    Private Sub JoinSort(p As Integer, r As Integer, _
                 arr1 As Integer, arr2 As Integer)
         Dim Q As Integer
    ' p-начало сортируемого массива
    ' r-его конец
    ' arr1 и arr2 - это ссылки на главный
    ' и временный массивы
    ' Q-середина массива

    ' Если массив состоит из одного элемента
    ' или он пустой, выходим
         If p >= r Then Exit Sub

    ' Находим середину массива
         Q = Int((p + r) / 2)
    ' Сортируем левую часть
         JoinSort p, Q, arr2, arr1

    ' Сортируем правую часть
         JoinSort Q + 1, r, arr2, arr1

    ' Объединяем обе части
         SortCon p, Q, r, arr2, arr1

    End Sub

    Private Sub SortCon(p As Integer, Q As Integer, r As Integer, _
             arr As Integer, Result As Integer)
    'p-начало сортируемого массива
    'Q-середина сортируемого массива
    'r-конец сортируемого массива
    'arr-ссылка на массив с данными
    'Result-ссылка на массив, куда будут помещены данные

         Dim i As Integer, j As Integer, k As Integer
         i = p 'индекс, следящий за левой частью
         j = Q + 1 'индекс, следящий за правой частью
         k = p 'индекс, следящий за позицией в массиве-приёмнике

    ' Пока одна из частей не закончилась
         While i <= Q And j <= r

    ' Если значение в левой части меньше
             If SArr(arr).A(i) < SArr(arr).A(j) Then

    ' помещаем его в массив-приёмник
    ' и увеличиваем левый индекс на 1
                 SArr(Result).A(k) = SArr(arr).A(i)
                 i = i + 1

    ' иначе помещаем в массив-приёмник правое значение
    ' и увеличиваем правый индекс на 1
             Else
                 SArr(Result).A(k) = SArr(arr).A(j)
                 j = j + 1
             End If

    ' увеличиваем на 1 индекс массива-приёмника
             k = k + 1
         Wend

    ' Здесь одна из частей закончилась.
    ' Просто переписываем значения из оставшейся части
    ' в массив-приёмеик

    ' Если остались данные в левом массиве
         While i <= Q

    ' переписываем их, увеличивая каждый раз левый индекс
    ' и индекс массива-приёмника
             SArr(Result).A(k) = SArr(arr).A(i)
             i = i + 1
             k = k + 1
         Wend

    ' иначе проделываем тоже самое с провой частью
         While j <= r
             SArr(Result).A(k) = SArr(arr).A(j)
             j = j + 1
             k = k + 1
         Wend
    End Sub


    Можете заполнить эту форму, либо отослать вопрос СЮДА

    Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел