MS Visual Basic Tips (Советы)
- Использование ASCII кода чувствительно быстрее использования символа например: If Left$(a$, 1) = " " Then и If Asc(a$) = 32 Then. Второе примерно на 40 процентов быстрее
- При частом поиске в массиве, содержание которого не меняется, часто имеет смысл подумать о сортировке. Сортировка обычно - медленное занятие но, кстати сортировка с использованием Hash tables (не знаю как поточнее перевести)может ускорить процесс сортировки на ПОРЯДОК!
- Используйте "\" вместо "/" при делении целых. Избегайте лишних неявных преобразований, т.к. оператор "/" возвращает значение Single. Имейте в виду, что оператор "/" возвращает значение Double, если, по крайней мере, один из элементов имеет тип Double
- При частом поиске в массиве, содержание которого не меняется, часто имеет смысл подумать о сортировке. Сортировка обычно - медленное занятие но, кстати сортировка с использованием Hash tables (не знаю как поточнее перевести)может ускорить процесс сортировки на ПОРЯДОК!
- Используйте "\" вместо "/" при делении целых. Избегайте лишних неявных преобразований, т.к. оператор "/" возвращает значение Single. Имейте в виду, что оператор "/" возвращает значение Double, если, по крайней мере, один из элементов имеет тип Double
- Иногда Вы можете заменить весь If...Else блок более простой операцией Boolean. Например, Вы можете заменить этот код: If x > 0 Then y = 1 Else y = 0 На другой, хотя и весьма загадочный: y = -(x > 0)
- Во избежание ошибок в коде Бейсика используйте Option Explicit
- Во избежания логических хошибок в массивах не используйте корявых Option Base
- Не используйте GoSub...Return, если Вам небезынтересен вопрос “совместимости вверх”
- Для нахождения объявления пользовательской функции выполните правый щелчек мышью на ее имени, затем выберите Definition
- Выполните {drive}:\{Path to VB.exe}\VB.exe /? для дополнительсной информации
- Чтобы процедура или функция выполнялась именно после появления формы на экране, используйте Form_Paint, а не Form_Load
- Директория с установленной Windows определяется также через Replace(Environ$(4), “winbootdir=”)
- Чтобы вернуться к недавно обрабатываемому фрагменту кода, нажмите Ctrl+Shift+F2
- Используйте Me вместо имен формы - это избавит от необходимости коррекции кода после ее переименования
- При присваивании объектам свойств используется кл. слово Set
- Для нахождения позиции последнего встречающегося символа в строке используйте InstrRev
- MsgBox Dir$({Path})=vbNullString скажет, действительно ли директрия пуста
- В MultiSelection-списках удаление элементов следует производить с конца
- For i = List1.ListCount -1 Step -1...Next произведет перебор в списке в обратном направлении
- В наборах последний индекс соответствует количеству, а первый - 1
- Чтобы сделать свойство объекта только для чтения, удалите процедуру Property Let(Set)
- Перед выходом из программы уберите за собой, используя Set {ObjName} = Nothing
- Вместо Dim {VarName} As String в динамическом объявлении используйте VarName$
- Совмещайте Str({AnyNumeric}) c Trim
- Вследствие действия API-функции Ваше окно может оказаться Always-On-Top, и только vbSystemModal сможет вытащить MsgBox поверх такого окна
- SaveSettings сохраняет переменные и их значения
- CallByName интерпретирует код Бейсика
- Чтобы можно было затаскивать папки и файлы извне, установите OLEDrag... в Manual и используйте событие OLEDragDrop, а также объект Data
- Dim в стандартном модуле - не глобальная переменная
- Нажатие на Label, у которого Caption = “&Click me”, переведет фокус к следующему по таб-индексу ЭУ
- Используйте Select Case для выбора вариантов
- Комбинируйте InStr с UCase или LCase в случаях с нечувствительностью к регистру
- В CommonDialogs при выборе файла не забудьте прописать CancelError
- Если программа начинает работу с Sub Main(), Unload Me для формы не завершит приложение
- Используйте FreeFile во избежание ошибок доступа при открытии файлов
- Для рисованных кнопок используйте Click для рабочих процедур, а MouseDown и MouseUp - для внешнего вида конопок (Image, PictureBox)
- StrRev разворачивает строку (в VB 6.0)
- В списках с длинными строками используйте хотя бы ToolTipText для отображения информации
- Блокирование текстового поля без изменения вида возможно только путем помещения его в PictureBox, для которого и задают Enabled
- Для отлова не-Numeric-символов используйте IsNumeric(Chr$(KeyCode)) наряду с KeyCode = 0 в событии KeyPress
- Отмена закрытия формы нажатием на системном “крестике” возможна помещением в процедуру QueryUnload кода: Cancel = 1
- Для выхода из циклов For...Next используйте Exit For
- Для тестирования командной строки используйте диалог “Свойства проекта” и Command Line Aruments
- Перевод длинных строк в IDE VB реализуется с помощью & _
- При объявлении нескольких переменных в одну строку не забудьте указывать для каждой ее тип
- Иногда AutoSize элемента управления Label смотрится нехорошо. Используйте величины TextWidth и TextHeight
- Используйте переменные в защищенных (PasswordChar) текстовых полях: это не позволит отобразить текст через API
- Готовое приложение можно использовать как шаблон., если поместить все компоненты проекта в папку шаблонов
- WithEvents в классе может сократить время написания программы, а также ее объем, если объявить переменные в форме-контейнере. При этом WithEvents должен оперировать именами этих переменных, переданных как свойство класса
- DoEvents позволяет реагировать на действия пользователя в затяжных циклах
- With сокращает доступ к объектам: With Form1.Label1. При этом обращение к свойствам будет таким: .Caption = Now
- Выделение всего текста в полях реализуется установкой свойства SelStart в ноль и SelLength в длину этого поля
- www.vb.kiev.ua - лучшее место для учебы Бейсику
- Помещенная на форму кнопка со свойством Default, равным True, забирает фокус у текстовых полей - используйте таймер и метод SetFocus
- Пиктограмма файлов вашего приложения может отличаться от пиктограммы EXE - достаточно насовать в RES “иконок”, а в Реестре указать другой индекс
- Быстрый ввод текста из файла можео реализовать так: Text1 = Input(LOF(i), i) после оператора Open...
- tapiRequestmakeCall из TAPI32.DLL поможет Вам дозвониться без участия ЭУ Comm
- API-функция ShowCursor с передаваемой ей булевой переменной либо спрячет курсор, либо покажет его
- Свойство PrevInstance объекта App показыает, запущен ли экзепляр данного приложения
- SHAddToRecentDocs из Shell32.dll вносит в список документов ярлык открываемого файла, если имя файла не равно vbNullString
- Var = Shell(“rundll32.exe AppWiz.Cpl, NewLinkHere “ & App.Path & “\”, 1) запустит мастер ярлыков
- Считывание двоичного файла в пару строк кода: FileString = Space(FileLen({Path})) и get 1, FileString
- Var = Shell(“Regedit.exe /s c:\myreg.reg”) экспортирует Реестр в файл
- Бейсик позволяет писать код в одну строку через двоеточие, например, так -
If txtPath = "" Then Beep: txtPath.SetFocus: Exit Sub
- Чтобы добавить символ табуляции в список или текстовое поле, нажмите Ctrl+i
- Бэйсик хранит константы в наипростейшей форме: скажем, константа, несущая единицу, хранится как целое. Если предполагается использование ее для действий с вещественными числами, обьявите ее явно: Const ONE As Double = 1
- Чтение и запись элемента массива всегда медленнее чем доступ к простой переменной. Следовательно, если Вы должны использовать тот же самый элемент массива в цикле неоднократно, Вы должны назначить временную переменную, содержащую этот элемент, и использовать именно ее В циклах повышение производительности может достигать 80 процентов!
- Никогда не используйте For Each на Variant массивах. Обычный For loop с индексом Integer или Long как минимум в двое быстрее. Будет работать быстрее и уменьшится потребление ресурсов, если Вы используете меньшее количество и более простые контроли. Hапример, не используйте маскедит, если Вы можете сделать все с регулярными текстбоксом. По той же самой причине, используйте лэйбл с рамкой вместо строки состояния или текстбокса только для чтения, имиджбокс всесто Тулбокса, маленький scrollbar вместо спинбаттон, и т.д.
- Никогда не используйте For Each на Variant массивах. Обычный For loop с Integer или Long индексом как минимум в двое быстрее.
- Данный код: If x = 0 And y = 0 Then равен этому: If (x Or y) = 0 Then
- При работе с матрицами используя вложенные циклы - внешний цикл должен выполнить итерации на столбцах, а внутренний - итерации на строках. (VB, сохраняет матрицы один столбец после другого) Программа вызывает меньшее количество "листаний"