Visual Basic
Visual Basic Programming Standards
Объектная модель MSWord
Программирования сложных окон в Visual Basic
Автоматизация приложений Microsoft Office в примерах
Ссылки
RichTextBox
Быстрая сортировка
Быстрая сортировка (quicksort) - рекурсивный алгоритм, который использует подход "разделяй и властвуй". Если сортируемый список больше, чем минимальный заданный размер, процедура быстрой сортировки разбивает его на два подсписка, а затем рекурсивно вызывает себя для сортировки двух подсписков. Можно улучшить производительность быстрой сортировки, если прекратить рекурсию до того, как подсписки уменьшатся до нуля, и использовать для завершения работы сортировку выбором.
Public Sub QuickSort (List() As Long, ByVal min As Long, ByVal max As Long)
Dim m_v As Long
Dim hi As Long
Dim lo As Long
Dim i As Long

    ' Если в списке менее 500 элементов,
    ' завершить его сортировку процедурой SelectionSort.
    If max - min < 500 Then
        SelectionSort List(), min, max
        Exit Sub
    End If

    'Собственно, сортировка
    ' Выбрать разделяющее значение.
    i = Int((max - min + 1) * Rnd + min)
    m_v = List(i)

    ' Переместить его вперед.
    List(i) = List(min)

    lo = min
    hi = max
    Do
        ' Просмотр сверху вниз от hi до значения < m_v.
        Do While List(hi) >= m_v
            hi = hi - 1
            If hi <= lo Then Exit Do
        Loop
        If hi <= lo Then
            List(lo) = m_v
            Exit Do
        End If

        ' Поменять местами значения lo и hi.
        List(lo) = List(hi)

        ' Просмотр снизу вверх от lo до значения >= m_v.
        lo = lo + 1
        Do While List(lo) < m_v
            lo = lo + 1
            If lo >= hi Then Exit Do
        Loop
        If lo >= hi Then
            lo = hi
            List(hi) = m_v
            Exit Do
        End If

        ' Поменять местами значения lo и hi.
        List(hi) = List(lo)
    Loop

    ' Сортировать два подсписка.
    QuickSort List(), min, lo - 1
    QuickSort List(), lo + 1, max
End Sub

Двоичный поиск
Алгоритм двоичного поиска (binary search) сравнивает элемент в середине списка с искомым. Если искомый элемент меньше, чем найденный, то алгоритм продолжает поиск в первой половине списка, если больше - в правой половине. Хотя по своей природе этот алгоритм является рекурсивным, его достаточно просто записать и без применения рекурсии.
Public Function BinarySearch(target As Long) As Long
Dim min As Long
Dim max As Long
Dim middle As Long

    NumSearches = 0

    ' Во время поиска индекс искомого элемента будет находиться
    ' между Min и Max: Min <= target index <= Max
    min = 1
    max = NumItems
    Do While min <= max
        NumSearches = NumSearches + 1
        
        middle = (max + min) / 2
        If target = List(middle) Then    ' Мы нашли искомый элемент!
            BinarySearch = middle
            Exit Function
        ElseIf target < List(middle) Then ' Поиск в левой половине.
            max = middle - 1
        Else                        ' Поиск в правой половине.
            min = middle + 1
        End If
    Loop
    
    ' Если мы оказались здесь, то искомого элемента нет в списке.
    BinarySearch = 0
End Function

Прием сообщений

Прием сообщений в версиях до VB6 был вовсе невозможен с помощью стандартных средств языка. Дело в том, что для этого нужна API-функция SetWindowLong, являющаяся callback-функцией (т.е. она требует передачи ей в качестве одного из параметров указателя на другую функцию), а в Visual Basic невозможно было получить указатель на функцию. С приходом новой версии Visual Basic 6 все изменилось. Теперь VB имеет в своем арсенале оператор AddressOf для получения указателей, но с большими ограничениями: можно получить указатель на функцию расположенную только в стандартном модуле, Вы никогда не сможете получить указатель на объект и т.д. Меня, да и многих других программистов, этот оператор не вполне устраивает, ввиду этих ограничений, а также проблем, связанных с отладкой программы, но лучше такой оператор, чем ничего.

Public OldWndProc as Long 'переменная для хранения указателя на старую оконную процедуру
Public Const GWL_WNDPROC = (-4)

Private Sub Form_Load()
  gWH = Me.hWnd 'дескриптор нашего окна
  OldWndProc = SetWindowLong(gWH, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  SetWindowLong gWH, GWL_WNDPROC, OldWndProc
End Sub

Собственная же процедура WindowProc может, в общем случае, выглядеть так (поместите этот код в стандартный модуль!):

Private Const WM_MENUSELECT = &H11F

Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal_
    wParam As Long, ByVal lParam As Long) As Long
Dim lReturn As Long

  'вначале позволим произвести обработку стандартной оконной процедуре процедуре, а затем сами
  lReturn = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
  Select Case Msg 'проверяем сообщения
    Case WM_MENUSELECT 'если нужное нам, то выполняем некоторые действия (вместо
                       'WM_MENUSELECT может быть любое другое сообщение, константа)
   ...
    ...
  End Select
  WindowProc = lReturn 'вернем значение функции
End Function

Работа с портами
см. http://www.entechtaiwan.com/tools.htm
О работе с LPT-портами и другой аппаратурой в Visual Basic статья
Коды ошибок
Сериализация
Config.vb 
Imports System.Xml.Serialization 
Public Class Config 
  Public text1 As String = ""
  Public text2 As String = "" 
End Class
'экземпляр класса настроек программы
Dim myConfig As New Config
'путь к файлу настроек
Dim myConfigFileName As String = Application.StartupPath & "\config.xml" 
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
  myConfig.text1 = TextBox1.Text
End Sub 
Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
  myConfig.text2 = TextBox2.Text
End Sub 
Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
  'сохраняем текущие настройки
  Dim mySerializer As New XmlSerializer(GetType(Config))
  Dim myWriter As New IO.StreamWriter(myConfigFileName) 
  mySerializer.Serialize(myWriter, myConfig)
  myWriter.Close()
End Sub 
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  'загрузка настроек, если есть
  Dim FI As New IO.FileInfo(myConfigFileName)
  If FI.Exists Then 'если файл существует, читаем его
    Dim mySerializer As New XmlSerializer(GetType(Config))
    Dim myReader As New IO.StreamReader(myConfigFileName)
    myConfig = mySerializer.Deserialize(myReader)
    myReader.Close()
  End If 
  'применяем настройки
  TextBox1.Text = myConfig.text1
  TextBox2.Text = myConfig.text2
End Sub

Hosted by uCoz