2008-11-11 2 views
4

Мне поручена модификация проекта VB6. Ничего невероятно серьезного, добавив пару форм и исправляя несколько ошибок по большей части. В проекте используется SQL Server (если это имеет какое-либо значение).Подборка проекта VB6 для парня, не являющегося VB6

Мой фон в программировании был VB/C# .NET, PHP, C++ и в основном MySQL, хотя я использовал SQL Server в гораздо меньших масштабах. Какой совет вы можете дать мне или ресурсы для программирования VB6. Прошло несколько лет с тех пор, как я сделал какую-либо работу VB .NET, и хотя я могу читать код VB6 и понимать, что происходит, я не уверен, насколько хорошо я смогу начать писать и/или изменяя без возможности сломать что-либо.

Какой совет могут предложить другие? Любые ресурсы и/или истории были бы замечательными. Не стесняйтесь вкладывать вещи, которые вы можете почувствовать, но я забыл упомянуть.

Спасибо!

+0

Я действительно хочу ответить на это, потому что я провел первые 6 лет моей карьеры в VB до того, как .NET вышел. Это было так долго, хотя с тех пор как я работал в VB6, я ничего не могу запомнить. Я чувствую к вам хотя и надеюсь, что вам не придется работать в нем очень долго. – 2008-11-11 21:25:37

+0

Отличная книга о том, как сделать vb6 хорошо: http://www.amazon.com/Programming-Distributed-Applications-Microsoft-Visual/dp/073561010X – 2010-04-07 19:08:44

ответ

7

Не использовать "При ошибке возобновления следующего" пожалуйста.

+0

еще одна - худшая «языковая функция» ... – 2008-11-11 21:50:16

+0

или («содрогните») заявление «Стоп». – dkretz 2008-11-11 22:18:56

+0

Я любил использовать «Конец» в крайнем случае. – MusiGenesis 2008-11-11 22:21:04

14

Возможно, он уже есть, но убедитесь, что Option Explicit находится в верхней части всех файлов. Он заставляет объявление переменной и уменьшает вероятность опечатки, непреднамеренно создавая переменную «на лету».

+0

Я знаком с Option Explicit от VBScript и VB .NET. Тем не менее, я уже просмотрел некоторые источники, и они могли бы, а также бросить переменную область из окна. – 2008-11-11 22:32:52

+1

Ваш единственный совет, который можно взять без соли. Остальное колеблется от балони до чистой токсичности. : -/ – 2008-11-11 23:01:41

+0

Ну, в зависимости от того, насколько плоха база кода, включение опции Explicit может мгновенно означать огромную работу, которую нужно просто скомпилировать. Фактически, единственные люди, которые не ввели это в первую очередь, - это люди, которые создали все беспорядки VB. – MusiGenesis 2008-11-11 23:46:43

13

VB6 имеет неисправную систему - на самом деле он имеет две системы типов, которые не полностью совместимы. Архитектурно, VB4-6 представляют собой довольно тонкую оболочку поверх COM и используют систему типа COM. Предыдущие версии VB имели собственную систему типов, которая была своего рода перекрестком между традиционными BASIC и C. Эти два не могут быть свободно перемешаны и сопоставлены.

Наследование отсутствует и нет реальной обработки исключений, поэтому ожидайте написать много шаблонов кода для обработки ошибок и повторения функций базовой формы снова и снова. Именно здесь VB получает свою репутацию в области разработки программного обеспечения для вырезания и вставки.

Некоторые из типов, которые вы можете объявить в VB, не являются «совместимыми с автоматизацией», что означает, что они не могут быть сериализованы по границе COM или сохранены в варианте (подробнее об этом позже). Эти типы относятся к периодам до VB4-6, когда VB не поддерживает COM. Один из этих типов - это запись (типа c struct), чье имя ускользает от меня, поэтому расширяемая коллекция или ассоциативный массив структур (что естественно, что можно сделать) невозможно. Определение класса (см. Ниже) возможно, но несколько неуклюжие.

VB не поддерживает многопоточность, и обходные пути для этого имеют много ошибок. Первый из них потенциально может вас укусить, если вы делаете 3-уровневое развитие с использованием MTS или COM +. Создание модуля VB фактически создает одиночный COM-объект за кулисами. Это будет жить в собственной однопоточной квартире. Квартиры - это, по сути, облегченные серверы COM с механизмом сериализации/десериализации (называемым Message Pump), где вызовы становятся сериализованными и поставленными в очередь для одного потока. Если вы сделаете (на его поверхности) разумную вещь и попытаетесь модулизовать свой код, вы создадите горячие точки в вашем среднем ярусе. Решение: больше вырезать и вставить.

Второй основной вопрос заключается в том, что сборка мусора COM является довольно простой - простой механизм подсчета ссылок. Это означает, что COM-компоненты, которые сбой или по какой-то причине не убирают после себя утечку памяти. Помните, как VB6 представляет собой тонкий слой поверх COM? Эта жесткая связь означает, что вы должны быть достаточно осторожны при использовании кода управления UI, который содержит ссылки на элементы управления, автоматизацию OLE для внешних приложений (например, Excel) или что-то еще, что устанавливает ссылки. VB неплохо делает скрытые вещи за вашей спиной и не знает, когда убираться после себя. Он также является источником круговых ссылок, созданных за кулисами.Получите это неправильно, и это приведет к утечке ресурсов - вам нужно быть осторожным.

Другой важный вариант - варианты. Лучшее описание, которое я видел для типа Variant, - это «таблица электронных таблиц». Это может вызвать довольно много вреда, особенно Variant Arrays. Многие API будут работать только с вариантами или иметь случайные части, которые используют варианты (Excel делает это много), поэтому вы не всегда сможете их избежать. Если вы сериализуете содержимое через границы COM (например, несколько отключенных наборов записей), вы скоро научитесь ненавидеть Variant Arrays.

Возможно, вы обнаружите, что система типа VB настолько сломана, что самый простой способ поддерживать нетривиально сложную структуру данных - это делать библиотеку, которая кодирует ее в строке и, по существу, сериализует и де-сериализует ее. Сложные структуры данных в приложении VB6 почти не запускаются.

Наконец, после использования инструментария GUI для VB6 вы узнаете, насколько команда WinForms узнала о ошибках команды VB6.

Несмотря на то, что он был прост в использовании и прост в использовании, создание нетривиального приложения в VB без создания беспорядка было намного сложнее, чем казалось из-за всех архитектурных недостатков и небольших ошибок. Это довольно хороший пример Law of Leaky Abstractions. Спольского.

Appleman's Developing COM/ActiveX Components in Visual BASIC 6 имеет неплохую обработку входов и выходов взаимодействия COM с VB6. Он также неплохо поступил на Win32 and VB programming..

P.S. (спасибо, что напомнил мне Даок), если вы обнаружите, что кто-то использовал On Error Resume Next, у вас есть мое разрешение на head-butt.

2

Скорее используйте on error resume next, чем on error goto X, но ВСЕГДА улавливайте ошибки сразу, а затем сбросите обработку ошибок.

Пример:

... 
On Error Resume Next 
oDbConn.Open sDbConnString 
Select Case Err.Number 
    Case &H80004005 
    MsgBox "Cannot connect to SQL-server, check your settings." 
    frmSettings.Show 
    Exit Sub 
    Case Else 
    ShowErrorAndQuit Err 
End Select 
On Error Goto 0 
... 
1

Люди, которые размещены здесь и сказал, что «On Error Resume Next» является худшей чертой языка когда-либо мертвы неправильно.

Худший язык был «On Error Resume». Поверь мне в этом.

Для нарушенных VB Вкл. Ошибка Возобновление Следующий означает, что «что-то пошло не так, на следующую строку». On Error Resume означает, что «что-то пошло не так, лучше повторите попытку снова и снова, снова и снова и ...».

1

Лично мне нравится On Error goto ErrorHandler, с обработчиком ошибок в нижней части каждой функции.

Помните, что никогда не следует включать круглые скобки при вызове метода, если вы не посмотрите на его возвращаемое значение. Легко уйти от этого по методам с одним аргументом, но иногда он укусит вас, так как передача (переменная) равна , а не такая же, как и переменная.

Люди, пишущие VB, не были уверены, предпочитают ли они 0-индексированные массивы или 1-индексированные массивы. Вы можете использовать UBound/LBound, чтобы проверить, где начинается и заканчивается массив.

Не используйте «textcomparison» для преобразования корпуса. Сравнение строк как текста делает больше, чем просто игнорировать случай. Просто конвертируйте одну или обе строки в верхний регистр.

Проекты-> Свойства-> Удалить информацию о неиспользуемых элементах управления ActiveX необходимо отключить, если вы вызываете их во время выполнения.

Инструменты-> Редактор-> Автоматическая проверка синтаксиса. Если вы не привыкли к этому, возможно, отключите его.

Инструменты-> Редактор-> Требовать декларацию переменных. На.

Инструменты-> Окружающая среда-> Когда начинается программа-> Сохранить изменения. Если это отключено, ваша программа не будет сохранена, даже если вы ее запустите.

Использование Run-> Start With Full Compile, Not Run-> Start, чтобы запустить ваш код.

0

Не используйте On Error Resume Next, если это действительно необходимо (есть некоторые уникальные случаи, такие как окончательная очистка после обработки ошибок или проверка наличия элемента коллекции VB, но обычно вам это не нужно внутри тела функции).

Осуществить правильную обработку ошибок, не следует использовать более чем одну точки выхода, не используйте If-Then однострочечники, использование Ca El блок, не используйте Subs - что-то вроде следующей очень простой функции skeletion:

Private Function MyFunc() As Boolean 
    On Error Goto ErrHandler 

    ''some code here 
    If SomeBadExitConditionIsSet Then 
     GoTo FuncExit 
    End If 

    ''some more code here 
    MyFunc = True 

FuncExit: 
    ''kill error handling to avoid error cycling 
    On Error Resume Next 
    ''cleanup code here - you need to check Err.Number after critical operations! 
    ''single exit point 
    Exit Function 

ErrHandler: 
    ''you can insert local specific error processing here, do not forget save Err.Number etc 
    ''there is possibility to raise errors to caller function, 
    ''but in this function we do not do that 
    Select Case MyGlobalErrHandler(Err.Number, Err.Description) 
     Case eRetry 
      Resume ''this is useful while debugging - good place to "Set Next Statement" 
     Case eIgnore 
      Resume Next 
     Case eCancel 
      Resume FuncExit 
     Case Else 
      Resume FuncExit 
    Select End 
End Function 
8

Поскольку я нарезал зубы на Visual Basic (резюме говорит VB3-6 10+ лет), я попытаюсь ответить на ваш вопрос с чем-то другим, кроме «При ошибке возобновить дальше», отстой (что он делает, я найду его повсюду, иначе ты не будешь, что хуже). Вот некоторые вещи, которые вы можете сделать:

  1. Когда вы берете на себя проект VB, самая сложная вещь, как правило, просто заключается в том, чтобы скомпилировать ее на вашей машине. Это часто происходит из-за неработающих ссылок на вещи, которые были установлены на машине оригинального разработчика, но не на вашем (a.k.a. «DLL Hell»). Вы можете только надеяться, что установщики все еще существуют где-то, или если вы не всегда можете прибегать к отбрасыванию DLL и OCX в системный каталог (не забудьте зарегистрировать их). Иногда DLL Hell происходит от нарушенных внутренних ссылок. Разработчики VB обычно любили разделить приложения на как можно больше различных компонентных проектов. Часто многие или все проблемы совместимости исчезают, когда вы просто объединяете все в один проклятый проект, это должно было быть в первую очередь.
  2. Как только все скомпилируется, вы на 99%. Большинство распространенных проблем, упомянутых в сообщениях здесь, - это те проблемы, которые проявляются в приложении сразу. Если приложение, которое вы наследуете, является простым и надежным приложением, которое все эти годы набирало тишину (это произошло в VB), вы, вероятно, будете в порядке.
  3. После того, как приложение было скомпилировано и работает с IDE (я думаю, именно так оно и было вызвано), вы можете начать экспериментировать с небольшими изменениями здесь и там.
  4. Задайте свои проблемы здесь. Приятно вспоминать прошлое.

Что касается Visual Basic в целом, я бы сказал, не верю в анти-шумиху. Это был язык, который допускал хороший код или плохой код, как и любой другой. И помните, что все ужасные программисты VB теперь ужасные программисты на C#.

6

Если ваше приложение использует проекты ActiveX DLL, то вы убедитесь, что это положение, чтобы минимизировать DLL Hell

  • Установите DLL в BinaryCompatibility.
  • Убедитесь, что у вас есть совместимый каталог .
  • Поместите DLL последней версии в .
  • Укажите двоичный файл Совместимость с этой DLL.
  • Убедитесь, что ваши EXE и DLL компилируют в его каталог проектов.
  • Запустите EXE из его проекта , когда вы тестируете. Этот способ будет использовать библиотеку DLL, которую вы скомпилировали.
  • Вам необходимо написать полезную программу, так что Вы можете компилировать каждый проект в любом порядке. Компилятор VB6 можно запустить из командной строки.
  • Проверьте свою настройку с помощью виртуального ПК или другого компьютера.

Несмотря на отсутствие наследования, вы обнаружите, что VB6 может реализовать множество общих объектно-ориентированных шаблонов проектирования. Если вы посмотрите в «Шаблоны проектирования», «Элементы многоразового объектно-ориентированного программного обеспечения», вы увидите, что большинство шаблонов включает реализацию интерфейса, а не наследование поведения. Они рассказывают об этой проблеме, начиная со страницы 16.

Строго типизированные коллекции не имеют прямой реализации. Вы пишете коллекцию со всем, включая свойство readonly Item. Когда вы закончите, вам нужно нажать {F2} и открыть браузер объектов. Найдите класс коллекции, который вы создали, и щелкните правой кнопкой мыши элемент.

Вам нужно будет

  • Выберите Свойства
  • Нажмите кнопку Дополнительно
  • Изменения процедуры идентификатор по умолчанию

Тогда Item станет свойством по умолчанию и сильно типа коллекции будет действовать так, как ожидалось.

Чтобы включить использование For Each на класс коллекции вам нужно будет добавить

Public Property Get NewEnum() As IUnknown 
    Set NewEnum = mCol.[_NewEnum] 
End Property 

С mCol быть имя частной коллекции переменной

снова использовать обозреватель объектов и правой нажмите NewEnum.

Вам нужно будет

  • Выберите Свойства
  • Нажмите кнопку Дополнительно
  • Изменение процедуры ID до -4

Помните, что Integer является 16-битной и Лонг 32 -немного. Я рекомендую объявлять большинство целых переменных как Long. Назад в тот день, который имел значение для скорости и памяти, но с сегодняшними компьютерами лучше использовать Long и не беспокоиться о превышении пределов.

Как и в другом месте, используйте Option Explicit.

Visual BASIC 6 очень хорош при неявном преобразовании типов. Если вы хотите быть уверенным, у вас есть функции преобразования Cxxx.

Вариант лучше, чем объект .NET при работе с разнообразными типами объектов, включая классы. Вы можете найти это полезным, если вам нужно создать пользовательскую форму, связанную с базой данных, и пользователь может выбрать, какую таблицу использовать для этой формы. Использование Variant упрощает работу с тем, что поля имеют разные типы для разных таблиц.

Visual Basic 6 может использоваться для создания многоуровневых приложений. Формы могут реализовывать такие интерфейсы, как классы.

Помните, что элементы управления ActiveX запускаются при компиляции и редактировании формы. Это может вызвать все виды странности, если вы не знаете об этом. Это особенно проблематично, если у вас есть собственные элементы управления ActiveX.

2

Общая мудрость при объявлении объектов заключалась в том, чтобы избежать использования «Dim myObj As New MyClass». Вместо этого используйте «Dim myObj As MyClass» и явно создавайте экземпляр объекта при необходимости с помощью «Set myObj = New MyClass». Первый метод не создает экземпляр объекта, когда встречается «Dim», но автоматически выполняет его при первом обращении к одному из свойств или методов объекта. Для выполнения этого потребовалось некоторое дополнительное накладное время, поскольку оно должно проверять, существует ли объект перед каждой ссылкой свойства/метода. Кроме того, были некоторые другие причудливые побочные эффекты этого метода объявления объекта. Например, если myObj установлен в Nothing, а программа встречает другую ссылку на него, автоматически создается новый экземпляр. Скорее всего, если эта ситуация произойдет, что-то не так с вашей программой, но не будет сгенерирована ошибка, указывающая на то, что ваш объект не существует, что может привести к некоторым трудностям для отслеживания ошибок. Как правило, лучше явно создавать и уничтожать экземпляр объекта самостоятельно, используя синтаксис «Set = New». Сторонники синтаксиса «Dim As New» обычно цитируют лучшую читаемость, но потенциальные ловушки могут иногда вас поймать.

Смежные вопросы