Онлайн учебник по дизайну Руководство по раскрутке сайтов Шаблоны Программирование на VB Главная
Программирование на Visual Basic

Уроки создания сайта в видеоформате
кредит под залог недвижимости
возбудители
Раскрутка сайтов
кредит под залог недвижимости
адрес сайта http://smonews.ru

     16. УМЕНЬШИТЬ РАЗМЕР КОДА, ИСПОЛЬЗУЯ ОПЕРАТОРЫ IIF И SWITCH

Часто бывает целесообразным заменить блок If...Then...Else более компактной функцией Iif:

возвращает большую из двух сравниваемых величин
maxValue = IIf(first >= second,first, second) Switch - редко используемая функция, даже в тех многочисленных случаях,
когда она более полезна нежели длиннющий блок If...ElseIf: ' надо узнать, х полижительный, отрицательный, или равен 0?
Заметим, что значение последней проверки всегда True, так как три условия являются взаимно исключающими и избыточными.
 


Print Switch(x < 0, "negative", x > 0, _
        "positive", True, "Null")


    17. УСКОРЬТЕ ВАШ КОД ИСПОЛЬЗОВАНИЕМ CHOOSE

Вы можете использовать  Choose там, где можно заменить массив или построить таблицы результатов, на стадии компиляции (compile-time), вместо того,
чтобы делать это на стадии выполнения (run time).
Например, если Вам надо знать значения факториалов чисел от 1 до 10, попробуйте следующий пример
(Choose производит выбор факториала из набора имеющихся значений всесто того,
чтобы высчитывать факториал каждый раз заново):

Function Factorial(number As Integer) _
        As Long
Factorial = Choose(number, 1, 2, 6, _
        24, 120, 720, 5040, 40320, _
        362880, 3628800)
End Function


    18. GOSUBS РАБОТАЮТ МЕДЛЕННО В ОТКОМПИЛИРОВАННЫХ ПРОГРАММАХ

Поскольку использование GoSubs относится к неструктурированному стилю программирования, то многие программисты стараются избегать его.
Если Вы компилируете Вашу VB5 аппликуху в native code, у Вас появится еще одна причина избегать этот оператор, поскольку вызовы через GoSubs
могут происходить в пять раз медленнее, чем вызовы обычной процедуры или функции.

    19. «ARRAY» - ОТНЫНЕ ЭТО ОШИБОЧНОЕ ИМЯ ДЛЯ ПЕРЕМЕННЫХ

Часто используете имя "array" для переменных, Вам придется пересмотреть Ваш код при переносе его под VB5.
Это слово является теперь зарезервированным (reserved keyword) и не может быть использовано в качестве имени переменной.
Вы можете легко переделать Ваш код при помощи команды Replace в IDE VB5, не забудьте при этом черкнуть "Find whole words only".  

    20. ЗАПУСК AUTOMATION MANAGER КАК HIDDEN ЗАДАЧИ

Если Вы мспользуете OLE Remote Automation, Вы должны заранее запустить Automation Manager на
сервере до того как случится первая OLE remote
communication. По умолчанию, это приложение visible, но Вы
можете его спрятать, чтобы оно не мозолило глаза
на таскбаре Чикаги. Для этого создайте ярлык для
Automation Manager, который бы включал в командной строке
переключатель /Hidden:
C:\Windows\System\AutMgr32.Exe /Hidden. С другой стороны, Вы можете поменять значение
соответствующего ключа в регистре. Для более
полной инфы, см. Статью Q138067 in the Microsoft Knowledge Base.

    21. ПРОБЛЕМЫ СО ВСПЛЫВАЮЩИМИ МЕНЮ

Если Вы используете
всплывающие меню (popup menus) в Ваших прогах, то
опасайтесь бага, имеющегося в VB4 16/32 и VB5. Если у
Вас есть две формы и одна из них вызывает вторую
модальную через всплывающее меню, то из этой
второй модальной Вы не сможете вызвать ни одного
всплывающего меню, сколько бы их на ней ни было.
Чтобы пофиксить это дело, используйте таймер на
первой форме. Вместо показа второй формы из
всплывающего меню по событию Click, активизируйте
таймер так, чтобы он показал эту вторую форму
через несколько миллисекунд. Для более полной
инфы, см. Статью Q167839 in the Microsoft Knowledge Base.
 

    22.ИСПОЛЬЗОВАНИЕ КОЛЛЕКЦИИ ДЛЯ ОТФИЛЬТРОВЫВАНИЯ ДУБЛИРОВАННЫХ ЗНАЧЕНИЙ


Этот код иллюстрирует, как использовать
коллекции (Collection) для генерации уникального
набора величин из набора, содержащего дубликаты.
В этом примере, сканируется массив строк и
сортируются все уникальные с использованием
list-box контрола:

Sub Remove_Duplicates(arr() As String)
        Dim i As Long
        Dim RawData As String
        Dim DataValues As New Collection

        On Error Resume Next
        ' это вставлено для игнорирования ошибки 457 - Duplicate key
        For i = LBound(arr) To UBound(arr)
                RawData = arr(i)
                DataValues.Add RawData, RawData
                ' Если Run-time error 457 случилась, то повторяющееся значение игнорируется
        Next
        On Error GoTo 0

        ' Сохранение в List Box
        ' (свойство Sorted выставлено True)
        lstSortedData.Clear
        For Each DataValue In DataValues
                lstSortedData.AddItem DataValue
        Next
End Sub

    23. СОЗДАНИЕ «УДАЛЕННО КОНТРОЛИРУЕМЫХ» ФОРМ

Иногда требуется
котролировать одну форму, когда фокус находится
на другой. Например, жмём «ОК» на форме А,
надо сделать resize на форме В. Итак, на каждой
форме, которую надо «удаленно
контролировать», делаем невидимый text box, назовем
его TextCommand, в событии Change которого находится
следующий код:

Sub TextCommand_Change ()
        Dim msg as string
        msg = Trim$(Me.TextCommand.Text)
        If Len(msg) = 0 Then Exit Sub

        Select Case msg
                Case "COMMAND_RESIZE"
                        Call MyFormResize
                Case "COMMAND_REPAINT"
                        Call MyFormPaint
                ...
        End Select
        Me.TextCommand = ""
End Sub

Вы можете удаленно контролировать форму, засылая соответствующее значение в ее TextCommand:
Sub Command1_Click ()
        formB.TextCommand = "COMMAND_RESIZE"
        DoEvents
End Sub

Этот код можно использовать для отсылки мессагов из MDI формы к потомкам:
Dim f As Form
Set f = Me.ActiveForm
f.TextCommand = "COMMAND_RESIZE"
Если Вы сидите под VB4 или VB5, Вы можете также использовать Public-свойства и методы формы.


    24. ЗАПИСЬ ТЕКУЩЕЙ ПОЗИЦИИ И РАЗМЕРА ФОРМЫ ПРИ ПОМОЩИ SAVESETTING


Функции SaveSetting и GetSetting облегчают написание
сеттингов в аппликухах. Эти две функции
восстанавливают и запоминают текущие позиции формы:

Public Sub FormPosition_Get(F As Form)
' Считывает позицию формы F из
' ini/reg файла и соответственно
' позиционирует форму
Dim buf As String
Dim l As Integer, t As Integer
Dim h As Integer, w As Integer
Dim pos As Integer

buf = GetSetting(app.EXEName, _
        "FormPosition", F.Tag, "")
If buf = "" Then
        ' defaults для центрирования фромы
        F.Move (Screen.Width - F.Width) \ _
                2, (Screen.Height - F.Height) \ 2
Else
        ' выделить l,t,w,h и выставить форму
        pos = InStr(buf, ",")
        l = CInt(Left(buf, pos - 1))
        buf = Mid(buf, pos + 1)
        pos = InStr(buf, ",")
        t = CInt(Left(buf, pos - 1))
        buf = Mid(buf, pos + 1)
        pos = InStr(buf, ",")
        w = CInt(Left(buf, pos - 1))
        h = CInt(Mid(buf, pos + 1))
        F.Move l, t, w, h
End If
End Sub

Public Sub FormPosition_Put(F As Form)
' Пишет op,left,height и
' width позиции формы F в reg/ini файл аппликухи
Dim buf As String
buf = F.left & "," & F.top & "," & _
        F.Width & "," & F.Height
SaveSetting app.EXEName,_
        "FormPosition", F.Tag, buf
End Sub
Вам следует поместить эти процедуры в модуль и вызывать их из событий Load и Unload форм.
Вы должны написать имя формы в ее свойство Tag, чтобы эти процедуры работали корректно

Sub Form_Load()
        FormPosition_Get Me
End Sub
Sub Form_Unload()
        FormPosition_Put Me
End Sub


    25. ЭФФЕКТИВНОЕ ИСПОЛЬЗОВАНИЕ ВНУТРЕННИХ VB КОНСТАНТ

Есть советы по использованию числовых
значений вместо соответствующих VB констант.
Например, Вы можете вывести message box, используя
числовые константы:

rc = MsgBox(msg, 4 + 32 + 256, "Confirm Delete")
Но не легче ли прочесть следующее?

rc = MsgBox(msg, vbYesNo + vbQuestion _
        + vbDefaultButton2, _
        "Confirm Delete")
Вы можете использовать следующие константы для check box:

        VbUnchecked =0
        VbChecked =1
        VbGrayed =2
Также полезно знать строковые константы вместо соответствующих chr$(символы ASCII):

vbTab instead of Chr$(9)
        vbCr instead of Chr$(13)
        vbLf instead of Chr$(10)
        vbCrLf instead of Chr$(13)+Chr$(10)

    26. ПРОЦЕДУРЫ, РАБОТАЮЩИЕ С ГРУППАМИ КОНТРОЛОВ

Вы можете использовать почти
забытую возможность VB иметь процедуру или
функцию, работающую с неограниченным числом
аргументов, что может быть полезно при работе с
множеством контролов. Например, Вы можете
enable/disable группу контролов одним вызовом
процедуры:

EnableAll True, Text1, Text2, _
        Command1, Command2
Эта процедура проходит по всем контролам, передаваемым в качестве аргументов:

Sub EnableAll(Enabled As Boolean, _
        ParamArray objs() As Variant)
                Dim obj As Variant
                For Each obj In objs
                        obj.Enabled = Enabled
                Next obj
End Sub

    27. ЗАШИФРОВАННЫЕ ПАРОЛИ

Следующие две функции легко и
эффективно шифрут/дешифруют текстовый пароль.
Функции имеют два аргумента: число от 1 до 10 чтобы
сдвигать позицию символа ASCII в пароле, и
собственно строка пароля. Функция EncryptPassword
проходит через каждый символ строки DecryptedPassword,
проверяет символ на четность/нечетность, и
сдвигает его вверх/вниз согласно параметру Number.
Эту делает зашифрованную строку нечитабельной.
Зашифрованный пароль «укатывается» затем
оператором XOR, который еще более запутывает
строку. Я ограничил параметр Number числом 10,
поскольку мне не надо делать проверку на
«неправильные» символы ASCII. Функция DecryptPassword
повторяет в обратном порядке процесс шифрования,
применяя XOR, а затем сдвиг.

Function EncryptPassword(Number As _
        Byte, DecryptedPassword As String)
Dim Password As String, Counter As Byte
Dim Temp As Integer

Counter = 1
Do Until Counter = _
        Len(DecryptedPassword) + 1
        Temp = Asc(Mid(DecryptedPassword, _
                Counter, 1))
        If Counter Mod 2 = 0 Then
                'see if even
                Temp = Temp - Number
        Else
                Temp = Temp + Number
        End If
        Temp = Temp Xor (10 - Number)
        Password = Password & Chr$(Temp)
        Counter = Counter + 1
Loop
EncryptPassword = Password
End Function

Function DecryptPassword(Number As _
        Byte, EncryptedPassword As String)
Dim Password As String, Counter As Byte
Dim Temp As Integer

Counter = 1
Do Until Counter = _
        Len(EncryptedPassword) + 1
        Temp = Asc(Mid(EncryptedPassword, _
                Counter, 1)) Xor (10 - Number)
        If Counter Mod 2 = 0 Then 'see if even
                Temp = Temp + Number
        Else
                Temp = Temp - Number
        End If
        Password = Password & Chr$(Temp)
        Counter = Counter + 1
Loop
DecryptPassword = Password
End Function

  назад

Хостинг от uCoz