Наиболее популярные ошибки Формы и элементы управления Язык Числа Формы и элементы управления Не прописывайте в коде название и размер фонтов До тех пор, пока вы не имеете на то серьезных причин - используйте стандартные фонты. Они есть у всех, и соответственно программа будет выглядеть примерно одинаково. Если все же это необходимо, постарайтесь выполнить пару следующих рекомендаций: 1) Задавайте фонты в рантайм по Form Load, а не в дизайн тайм в свойствах. 2) Не забывайте использовать ловушки для ошибок 3) Предоставляйте пользователю возможность изменить размер и тип шрифта. Настройки после этого можно созранить в регистри или ini файле для использования в следующей сессии. Кстати, коли мы говорим об ошибках и фонтах, так вот ошибка при попытке выбора неправильного размера шрифта не происходит. Проверить существование размера фонта можно так: Function SetFontSize(obj As Object, FontSize As Integer) As Boolean On Error Resume Next obj.Font.Size = FontSize SetFontSize = (obj.Font.Size = FontSize) End Function Свойство UseMnemonics для связанных Label контролов Если вы используете Label контролы для показа данных из базы данных , рекомендую установить свойство UseMnemonic = False. Если оставить значение по умолчанию (True), значок амперсанд "&" не показывается правильно и Label не реагирует на горячую клавишу. Коварный SetFocus Метод SetFocus таит в себе опасность получения ошибки времени исполнения. Стоит вам попробовать передать фокус контролу, который в данный момент недоступен или вообще невидим, как ошибка не заставит себя ждать. Лучший способ избежать этого: If Text1.Enabled And Text1.Visible Then Text1.SetFocus Ресайзинг и движение формы фиксированного размера Любые действия с минимизированной или максимизированной формой по изменению размера или передвижению вызывает runtime error 384. Всегда проверяйте свой код на наличие дополнительных условий проверки состояния формы или добавляйте On Error хандлер. ' это вызовет ошибку Form1.Move 0, 0 ' А это нет On Error Resume Next Form1.Move 0, 0 ' Это тоже ничего себе If WindowState = vbNormal Then Form1.Move 0, 0 End If Язык Debug.Print работает и в exe Все используют для отладки Debug.Print. Удобно. Только не забывайте убирать или закоментировать эти строчки перед окончательной компиляцией. Дело в том, что в отдельных случаях эта команда может работать и в exe файле. Не верится? Посмотрите пример: Debug.print TestDebug Public Function TestDebug() msgbox "Test Debug" End function Logging события не работают под средой Бэйсика StartLogging и LogEvent методы объекта App работают только в откомпилированном приложении. Это поведение не документировано. Избежать этого можно созданием ActiveX DLL компоненты и включением в нее StartLogging и LogEvent методов, после чего подключив эту компоненту к проекту можно использовать реально работающий логгинг под средой Бэйсика. Некорректное завершение по END оператору Оператор END в откомпилированом проекте - не лучшая идея. Память не осводождается, базы данных не выгружаются, могут остаться открыты спрятанные формы. Если вы испытываете настоятельную необходимость завершить работу программы именно так - позаботьтесь о выгрузке всех форм: Do While Forms.Count > 1 Unload Forms(0) Loop Unload Me End Variant - тип данных по умолчанию Это знает каждый - вариант присваивается переменнолй если она не обьявлена прямо. Однако программирующие на других языках в Бэйсике нередко делают ошибку связанную с возможностью перечисления переменных так: Dim a , b as Integer 'a - variant - надо так: Dim a as Integer , b as Integer Элементы ParamArray могут быть пропущены Когда вы используете ParamArray в процедурах, необходимо помнить, что когда процедура вызывается, иной раз один из аргументов может быть и пропущен. И вам неоходимо заботится о последствиях такой ситуации. Вот пример: Function Max(ParamArray args() As Variant) As Variant Dim result As Variant, index As Integer result = args(LBound(args)) For index = LBound(args) + 1 To UBound(args) If result < args(index) Then result = args(index) Next Max = result End Function Этот пример работает прекрасно, до того, как случится вот такой вызов: Print Max(1, , 3) ' Результатом будет "Type Mismatch" Вот правильный пример: Function Max(ParamArray args() As Variant) As Variant Dim result As Variant, index As Integer For index = LBound(args) To UBound(args) If IsMissing(args(index)) Then ' ignore this argument ElseIf IsEmpty(result) Then ' the first time we set a possible return value result = args(index) ElseIf result < args(index) Then result = args(index) End If Next Max = result End Function IsMissing возвращает False для не Variant аргументов Функция IsMissing всегда возвращает False для не Variant аргумента. Это происходит потому, что IsMissing просто конвертирует этот аргумент в Variant и проверяет VarType значение . Нижеследующий код весьма похож на проявление бага: Sub DoSomething(Optional value As Long) If IsMissing(value) Then ' Этот код никогда не выполняется End If '... End Sub Другая странность в поведении IsMissing - False будет возвращено в случае если значение параметру было присвоено внутри самой процедуры: Sub DoSomething(value1 As String, Optional value2 As Variant) If IsMissing(value2) Then value2 = value1 End If '... If IsMissing(value2 Then ' Этот код никогда не выполняется End If '... End Sub Не включен по умолчанию Option Explicit Не включена по умолчанию опция Option Explicit. Работать без включенной этой команды препроцессору крайне не рекомендуется. Если вы совем не представляете зачем это надо - вы блуждете во тьме, и вам надо почитать хелп. Так что сходити в настройки и посавьте галочку у чекбокса "Require Variable Declarations". Не забудьте только что волшебные слова Option Explicit появяться только в новых модулях проекта. в уже существующие придется добавлять их ручками. Числа Некорректное поведение CInt() Функция CInt() работает неверно . точнее неверно округляет числа CInt(2.4) возвратит 2, а CInt(2.6) =3. Это верно, а теперь внимание - CInt(2.5) = 2, но CInt(3.5) = 4. На середине четные числа округляются до меньшего, а нечетные до большего значения. Не доверяйте автоматическому преобразованию типов Классический пример: Dim a as Integer ,b as Integer ,c as Long A= 100 B=400 C=A*B Почему? Спросите вы. Очень просто - Бэйсик обрабатывает последнюю строку так - а-целое, б - тоже - результат соответственно будет целым. Потом я его преобразую в длинное целое. Правильно будет: C=A* Clng(B)