CONVENCIONES DE NOMENCLATURA PARA VISUAL BASIC

Resumen
Es una buena idea establecer convenciones de nomenclatura para el código de Visual Basic. Este artículo proporciona las convenciones de nomenclatura utilizadas por Microsoft Consulting Services (MCS). Este documento es un superconjunto de las convenciones de codificación de Visual Basic que se encuentra en Visual Basic "Guía del programador". Nota: Los controles de terceros mencionados en este artículo están fabricados por proveedores independientes de Microsoft. Microsoft no otorga ninguna garantía, implícita o de otro tipo, respecto al rendimiento de estos controles o confiabilidad.

Desarrollo
Convenciones de nomenclatura ayudan a los programadores de Visual Basic:

    

estandarizar la estructura, codificación de estilo y la lógica de una aplicación. crear código precisa, legible y inequívoca el origen. ser coherente con otras convenciones de lenguaje (lo que es más importante, la Guía de programadores de Visual Basic y notación húngara de Windows de C estándar). ser eficiente de un tamaño de cadena y punto de vista mano de obra, permitiendo así una mayor oportunidad de más y más completo nombres de objeto. Defina los requisitos mínimos necesarios para realizar la anterior.

Establecer las opciones de entorno
Utilice Option Explicit. Declarar las variables todo para guardar el tiempo de programación reduciendo el número de errores causados por errores tipográficos (por ejemplo, aUserNameTmp frente a sUserNameTmp frente a sUserNameTemp). En el cuadro de diálogo Opciones de entorno, establezca la declaración de variable requerida en Sí. La instrucción Option Explicit requiere declarar todas las variables en el programa de Visual Basic. Guardar archivos como texto ASCII. Guardar formulario (.frm) y módulo (.BAS) archivos como texto ASCII para facilitar el uso de sistemas de control de versiones y minimizar los daños que pueden deberse a daños en el disco. Además, puede:

realizar análisis externo de su código de Visual Basic Para que guarde siempre los archivos como texto ASCII, desde el cuadro de diálogo Opciones de entorno de Visual Basic, establezca la opción Guardar como formato predeterminado a texto.

   

utilizar su propio editor utilizar herramientas automatizadas, tales como grep crear herramientas CASE o generación de código para Visual Basic

Objeto convenciones de nomenclatura para objetos estándar
Las siguientes tablas definen los prefijos de nombre de objeto estándar de MCS. Estos prefijos son coherentes con los documentados en la Guía de programadores de Visual Basic.

Prefix Object Type Example ------------------------------------------------------ani Animation button aniMailBox bed Pen Bedit bedFirstName cbo Combo box and drop down list box cboEnglish chk Checkbox chkReadOnly clp Picture clip clpToolbar cmd (3d) Command button (3D) cmdOk (cmd3dOk) com Communications comFax ctr Control (when specific type unknown) ctrCurrent dat Data control datBiblio dir Directory list box dirSource dlg Common dialog control dlgFileOpen

drv fil frm fra (3d) gau gpb gra grd hed hsb img ink key lbl lin lst mdi mpm mps mci mnu opt (3d) ole out pic pnl3d rpt shp spn txt tmr vsb Drive list box File list box Form Frame (3d) Gauge Group push button Graph Grid Pen Hedit Horizontal scroll bar Image Pen Ink Keyboard key status Label Line List box MDI child form MAPI message MAPI session MCI Menu Option Button (3d) OLE control Outline control Picture 3d Panel Report control Shape controls Spin control Text Box Timer Vertical scroll bar drvTarget filSource frmEntry fraStyle (fra3dStyle) gauStatus gpbChannel graRevenue grdPrices hedSignature hsbVolume imgIcon inkMap keyCaps lblHelpMessage linVertical lstPolicyCodes mdiNote mpmSentMessage mpsSession mciVideo mnuFileOpen optRed (opt3dRed) oleWorksheet outOrgChart picVGA pnl3d rptQtr1Earnings shpCircle spnPages txtLastName tmrAlarm vsbRate Objeto convención de nomenclatura para objetos de base de datos Prefix Object Type Example -----------------------------------------db ODBC Database dbAccounts ds ODBC Dynaset object dsSalesByRegion fdc Field collection fdcCustomer fd Field object fdAddress ix Index object ixAge ixc Index collection ixcNewAge qd QueryDef object qdSalesByRegion qry (suffix) Query (see NOTE) SalesByRegionQry ss Snapshot object ssForecast tb Table object tbCustomer td TableDef object tdCustomers Nota: Utilizar un sufijo para consultas permite que cada consulta para ordenarse con su tabla asociada en diálogos de Microsoft Access (Agregar tabla. lista de tablas instantáneas). Convenciones de nomenclatura de menú .

Como resultado. Normalmente también se añadirán al prefijo de una abreviatura de minúscula para el fabricante. Sin embargo. los nombres de control de menú Documente claramente los elementos de menú al que están conectados. Convenciones de nomenclatura para otros controles Para controles nuevos no enumerados anteriormente. una instancia del control creada desde el marco 3D podría Visual Basic Professional utiliza un prefijo de fra3d para evitar confusiones sobre qué control realmente se utiliza. Un botón de comando desde MicroHelp podría utilizar cmdm para diferenciarlo en el botón de comando estándar (cmd).Contents File. necesita un conjunto de convenciones de nomenclatura diferente para estos controles.Send.Open Format. Variable y prefijos de nombre de función: Prefix Converged Variable Use Data Type Suffix -------------------------------------------------------------------------b bln Boolean Integer % c cur Currency .64 bit Double # signed quantity dt dat Date and Time Variant e err Error .) son desaconsejado. Por ejemplo: Menu Caption Sequence Help.Las aplicaciones utilizan con frecuencia una abundancia de controles de menú.Fax File. iGetRecordNext <body> Describes the variable. Estos prefijos se deben utilizar con todas las variables y nombres de función. Por ejemplo. iGetNameFirst <qualifier> Denotes a derivative of the variable. Los prefijos de control de menú deben extenderse más allá de la etiqueta inicial mnu agregando un prefijo adicional para cada nivel de anidamiento. con el título de menú final al final de la cadena de nombre. que proporciona el prefijo utilizado para el control. como un cuadro de lista mejorada. todos los miembros de un grupo menú determinado se muestran junto a entre sí en el objeto desplegable cuadros de lista (de la ventana de código y la ventana de propiedades). iGetNameLast <suffix> The optional Visual Basic type character.Send. etc.Email Menu Handler Name mnuHelpContents mnuFileOpen mnuFormatCharacter mnuFileSendFax mnuFileSendEmail cuando se utiliza esta convención. Para los controles derivados. Uso de sufijos básicos antiguos (como % & #. el nombre completo del control y el nombre del proveedor de software: Prefix cmdm Control Type Command Button Vendor MicroHelp Variable y el nombre de rutina Los nombres de variable y función tienen la siguiente estructura: <prefix><body><qualifier><suffix> Part Description Example -------------------------------------------------------------------------<prefix> Describes the use and scope of the variable. iGetRecordNext% prefijos: Las siguientes tablas definen prefijos de nombre de variable y función que se basan en notación húngara C para Windows. intente idear un prefijo de tres caracteres único. es más importante que desactive que al ceñirse a tres caracteres. Además.64 bits Currency @ d dbl Double . Controles de terceros Cada control de terceros utilizado en una aplicación debe enumerarse en sección de comentario de información general de la aplicación. amplían los prefijos anteriores por lo que no hay confusión sobre el control que realmente se utiliza.Character File.

32 bit signed quantity Number/Counter String Unsigned . sGetLastName) este ejercicio . Es probable que estos prefijos se convertirá en el futuro en los estándares de Microsoft en algún momento. Además.32 bit signed floating point Handle Index Long . Aunque los sufijos de tipo Visual Basic lo indican el tipo de datos de una variable. Aunque poner el calificador después de que el cuerpo del nombre puede parecer un poco complicado (como en sGetNameFirst. asegúrese de que sean coherentes en toda la aplicación. los nombres de función deben comenzar con un verbo. sGetNameLast en lugar de sGetFirstName. los nombres de variables mayor de 32 caracteres pueden difíciles de leer en pantallas VGA. En estos casos.un identificador para la interfaz de comunicaciones Indique cada uno de estos nombres de variables a un programador algo muy diferente.16 bit unsigned quantity User-defined type Variant Array Single ! Integer Integer Long Integer String Long % % & % $ & Variant Nota: los valores de la columna Converged representan los esfuerzos para reunir los estándares de nomenclatura para Visual Basic. el bono entre los programadores C y programadores que utilizan Visual Basic será mucho más fuerte como el impulso de ganancias C++ del sistema de desarrollo. se recomiendan mantener las longitudes de nombre razonable abreviaturas estándar. Además. En general. utilice calificadores estándar para etiquetar las variables derivadas y rutinas. Cambiar aleatoriamente entre número y número dentro de un proyecto se conducir a confusión innecesario. El cuerpo de variable y nombres de rutina El cuerpo de una variable o el nombre de rutina debe utilizar mayúsculas y minúsculas mezcladas y debe ser tan largo como sea necesario para describir su finalidad.A flag definir el éxito de la última operación de envío hSend . Prefijos del ámbito como g y m también reducen el problema de contención de nombre especialmente en proyectos de varios programadores. Éstos son algunos ejemplos: iSend . como InitNameArray o CloseDialog. Visual Basic para aplicaciones y Access Basic. Esta transición dará como resultado muchos programadores de Visual Basic mover a C para la primera vez y muchos programadores con frecuencia mover hacia delante y hacia atrás entre ambos entornos. Esta información se pierde cuando el nombre de la variable se reduce a enviar %.f sng h i l n s u lng int str vnt a udt vnt Float/Single . Al utilizar abreviaturas. Ámbito y prefijos de uso: Prefix g m st (no prefix) v r Description Global Local to module or form Static variable Non-static variable. Calificadores de variable y nombres de rutina Variables relacionadas y rutinas suelen utilizarse para administrar y manipular un objeto común.representa un recuento del número de mensajes enviados bSend . no explican lo que se utiliza una variable o función para o cómo se puede obtener acceso a él. Notación húngara es también muy utilizado por los programadores de C de Windows y hace referencia continuamente en la documentación del producto de Microsoft y en libros de programación del sector. prefix local to procedure Variable passed by value (local to a routine) Variable passed by reference (local to a routine) notación húngara es tan valioso en Visual Basic como en C. Para términos utilizados con frecuencia o largos.

Src Source. Para los nombres de constantes. Frequently used in comparison and transfer routines. Tmp A "scratch" variable whose scope is highly localized within the code. Prev Previous element in a set. Often used in conjunction with Source. s. rvntSub As Variant) ' If rvntOrg = Null. siguen las mismas reglas como variables. Por ejemplo: <mnUSER_LIST_MAX gsNEW_LINE ' Max entry limit for User list (integer value. Last Last element of a set. prefijos como i. Muchas bases de datos permiten NULL como un valor válido para un campo. agregar un prefijo al nombre de variable para el tipo de referencia. Sin embargo. lo que el lógica y la estructura de la aplicación sea más fácil de entender el orden. Min Minimum value in a set. Max Maximum value in a set.ayudará a listas de estos nombres juntos en la rutina de editor de Visual Basic. Por ejemplo: Type CUSTOMER_TYPE sName As String sState As String * 2 lID as Long End Type cuando declara una variable de instancia de un usuario define el tipo. g y m puede ser muy útil para comprender el valor y el ámbito de una constante. Next Next element in a set. ' local to module) ' New Line character string (global to entire ' application) Tipo de datos Variant Si sabe que una variable siempre almacenar datos de un tipo determinado. El código necesita distinguir entre NULL. 0 (cero). replace the Null with rvntSub If IsNull(rvntOrg) Then rvntOrg = rvntSub End Sub . Dst Destination. The value of a Tmp variable is usually only valid across a set of contiguous statements within a single procedure. mensajes. En la tabla siguiente se definen los calificadores comunes y su significado estándar: Qualifier Description (follows Body) -------------------------------------------------------------------------First First element of a set. Cur Current element in a set. Tipos definidos por el usuario Declarar tipos de definido por el usuario en mayúsculas con _TYPE anexado al final del nombre del símbolo. Por ejemplo: Sub ConvertNulls(rvntOrg As Variant. y "" (cadena vacía). Muchas veces. Visual Basic puede controlar los datos más eficazmente si declara una variable de ese tipo. Por ejemplo: Dim custNew as CUSTOMER_TYPE Constantes de nomenclatura El cuerpo de los nombres de constantes debe ser UPPER_CASE con caracteres de subrayado (_) entre palabras. DDE u OLE. Save Used to preserve another variable that must be reset later. Aunque constantes estándar de Visual Basic no incluyen información húngaro. el tipo de datos variant puede ser muy útil al trabajar con bases de datos. estos tipos de operaciones pueden utilizar una rutina de servicio genérico no es necesario conocer el tipo de datos que recibe para procesar o pasar en los datos.

open file. El código de formato Dado que muchos programadores utilizan todavía muestra VGA. El propio código y los comentarios en línea o locales necesarios se describen la implementación. depurar y mantener si las rutinas de conversión de tipo de Visual Basic se utilizaron en su lugar. file. comentarios erróneos.0111? + vnt1 ' Does vntResult = 21. rutinas y algoritmos. and so on and the affect it has (only if this is not obvious) cada declaración de variable no trivial debe incluir un comentario de en línea que describe el uso de la variable está declarada.01 or 1110. cuadros de diálogo. por lo que esta sección de información general sólo se necesita proporcionar información sobre los módulos y los archivos más importantes o los archivos que no mostrar la ventana proyecto. Returns Explanation of value returned for functions. enumerar objetos de datos principal. inmobiliaria de pantalla debe se ahorra tanto como sea posible pero permitiendo formato para reflejar la estructura lógica y el anidamiento de código. Parámetros pasados a una rutina deben ser descritos cuando sus funciones no son obvias y cuando la rutina espera los parámetros en un intervalo específico. Las variables. Por ejemplo: vnt1 = "10. las sangrías de anidamiento debe ser dos a cuatro espacios.01" : vntResult = vnt1 vntResult = vnt2 vntResult = vnt1 vntResult = vnt3 vntResult = vnt2 vntResult = vnt3 vnt2 = 11 : vnt3 = "11" : vnt4 = "x4" + vnt2 ' Does vntResult = 21. Esta descripción debería describir no los detalles de implementación (cómo lo hace) porque estos suelen cambian a lo largo del tiempo.01 or 10. como archivos de base de datos o de inicialización (ini). Función devolver valores y variables globales que han cambiado por la rutina (especialmente a través de los parámetros de referencia) también deben describirse al principio de cada rutina. base de datos y archivo de dependencias del sistema y así sucesivamente deben ser incluida al principio del módulo . controles y rutinas deben tener un nombre lo suficientemente claro para que comentarios en línea sólo es necesario para detalles de implementación complejas o no intuitivo. lo trabajo de mantenimiento de comentario innecesarios o peor aún. control. son algunos inconvenientes al uso de variantes. Effects List of each effected external variable. basada en ficha.0111? + vnt1 ' Does vntResult = 21. Instrucciones de código que utilizan variantes a veces pueden ser ambiguas para el programador. Una descripción de información general de la aplicación.01 or 10.01? + vnt3 ' Does vntResult = 21.el sin embargo. Por ejemplo: iVar1 = 5 + val(sVar2) vntVar1 = 5 + vntVar2 Comentarios del código ' use this (explicit conversion) ' not this (implicit conversion) Todos los procedimientos y funciones deben comenzar con un breve comentario que describe las características funcionales de la rutina (lo que hace).01? + vnt4 ' Does vntResult = 11x4 or ERROR? + vnt4 ' Does vntResult = 11x4 or ERROR? los ejemplos anteriores sería mucho menos ambiguo y fáciles de leer.01 or 1110. Menos de dos espacios no muestra suficientemente . Nota: La ventana de proyecto intrínsecamente describe la lista de archivos en un proyecto. Comentario del encabezado rutina deben buscar bloques como este (consulte la sección siguiente "Formato el código" para obtener un ejemplo): Section Comment Description -------------------------------------------------------------------------Purpose What the routine does (not how). Más de cuatro espacios innecesarios y puede hacer que las instrucciones que se oculta o trunca accidentalmente. Inputs Each non-obvious parameter on a separate line with in-line comments Assumes List of each non-obvious external variable. control. Bloque estándar. and so on.BAS que contiene declaraciones de constante genéricas del proyecto Visual Basic.

utilizamos una sangría de espacio de tres. sub.01 ' vntResult = 10. return -1. con cada bloque anidado aplica sangría a una ficha adicional. Por ejemplo: ************************************************************************** 'Purpose: Locate first occurrence of a specified user in UserList array. '************************************************************************** 'VB3Line: Enter the following lines as one line Function iFindUser (rasUserList() As String. Variables globales pueden cree máquinas de estado enormemente complejos y realice la lógica de una aplicación extremadamente difíciles de entender. Con un signo más (+) con valores no numéricos. Constantes genéricos de Visual Basic como el reloj de ARENA deben agruparse en un solo módulo (VB_STD. Variables en Visual Basic pueden tener el siguiente ámbito: Scope Variable Declared In: Visibility -------------------------------------------------------------------------Procedure-level Event procedure.FRM. 'Inputs: rasUserList(): the list of users to be searched ' rsTargetUser: the name of the user to search for 'Returns: the index of the first occurrence of the rsTargetUser ' in the rasUserList array. Utilice el cuadro de diálogo Opciones de entorno para establecer el ancho de la ficha predeterminado. Declarations section of a form Visible in every Module-level or code module (. Operadores Siempre utilice una y comercial (&) al concatenar cadenas y el signo más (+) cuando se trabaja con valores numéricos. rsTargetUser as String) _ As Integer Dim i As Integer ' loop counter Dim bFound As Integer ' target found flag iFindUser = -1 i = 0 While i <= Ubound(rasUserList) and Not bFound If rasUserList(i) = rsTargetUser Then bFound = True iFindUser = i End If Wend End Function variables y constantes no genéricas deben estar agrupadas por función en lugar de por va a dividir desactivar áreas aisladas o archivos especiales.0111 Siempre se deben definir las variables con el ámbito más pequeño posible. En Microsoft Knowledge Base. Las instrucciones de nivel más altos que siga el comentario de introducción deben ser una ficha con sangría.anidamiento lógica. Por ejemplo: vntVar1 = vntVar2 = vntResult vntResult Ámbito "10. .BAS) procedure in the form or code module Global Declarations section of a code Always visible . puede causar problemas cuando funciona en las dos variantes. Variables globales también que la reutilización y mantenimiento de su código mucho más difícil. or Visible in the function procedure in which it is declared Form-level.01" 11 = vntVar1 + vntVar2 = vntVar1 & vntVar2 ' vntResult = 21. El comentario de introducción funcional de una rutina debe ser un espacio de sangría. If target user not found.BAS) para mantenerlos independiente de las declaraciones de específicos de la aplicación.

Puede que desee almacenar información en propiedad de etiqueta del control. a menos que explícitamente desee cambiar el valor del argumento pasado. Si debe utilizar variables globales. Variables globales que se utilizan en las rutinas deben identificarse en el área comentario general en el principio de la rutina.VBX Chart Chart chtm MicroHelp chtmChart MHGR200. colocar todos los controles y código necesario para realizar tareas del cuadro de diálogo en un solo formulario.VBX Button Button DB_Command cmdp Pioneer cmdpCommandButton QEVBDBF.VBX .property. es conveniente declarar todas ellas en un solo módulo y agruparlos por función.VBX Callback Callback calm MicroHelp calmCallback MHAD200.VBX List Box (Dir) SSDir dirs Sheridan dirsDirList SS3D2.VBX Button (multiple) Button Command cmim MicroHelp cmimCommandButton MHEN200. Escribir código modular siempre que sea posible. Asignar el módulo de un nombre significativo que indique su propósito.VBX Button Command cmdm MicroHelp cmdmCommandButton MHEN200. implícita o de otro tipo.VBX Check Box DB_Check chkp Pioneer chkpCheckBox QEVBDBF. Por ejemplo. procedimientos y funciones globales sólo deben trabajar con objetos que se pasan a ellos. con respecto al rendimiento o confiabilidad de estos productos. lo que puede tener acceso global mediante la sintaxis form.VBX Button (icon) CardDeck CardDeck crdm MicroHelp crdmCard MHGR200. sólo utilizar variables globales cuando no hay ninguna manera otro conveniente compartir datos entre formularios. Microsoft no otorga ninguna garantía. La tabla siguiente muestra caracteres de prefijo nombre de proveedor estándar de terceros para utilizarse con los prefijos de control: Vendor Abbv ------------------------MicroHelp (VBTools) Pioneer Software Crescent Software Sheridan Software Other (Misc) m p c s o la tabla siguiente muestra los prefijos de control de terceros estándar: Control Control Abbr Vendor Example VBX File Type Name Name -------------------------------------------------------------------------Alarm Alarm almm MicroHelp almmAlarm MHTI200.BAS.VBX Button (Group) Command cmgm MicroHelp cmgmBtton MHGR200. Esto ayuda a mantener el código de la aplicación organizado en componentes útiles y reduce su sobrecarga de tiempo de ejecución. como GLOBAL. pasar argumentos a subrutinas y funciones mediante ByVal.BAS.module (.VBX Dice Dice dicm MicroHelp dicmDice MHGR200.VBX Combo Box DB_Combo cbop Pioneer cbopComboBox QEVBDBF. Con la excepción de variables (que no deben pasarse). using Global keyword) en una aplicación de Visual Basic.VBX Clock Clock clkm MicroHelp clkmClock MHTI200. Además. Controles de terceros Nota: Los productos que se describen a continuación están fabricados por proveedores independientes de Microsoft.object.VBX Combo Box SSCombo cbos Sheridan cbosComboBox SS3D2. si la aplicación muestra un cuadro de diálogo.VBX Animate Animate anim MicroHelp animAnimate MHTI200.

VBX MHGR200.VBX MHEN200.VBX QEVBDBF.VBX MHAD200.VBX Fuente: http://support.VBX MHEN200.VBX QEVBDBF.VBX MHAD200.VBX MHPR200.VBX MHGR200.VBX MHEN200.VBX MHEN200.VBX QEVBDBF.VBX XYGRAPH.VBX QEVBDBF.VBX SS3D2.VBX ??? SS3D3.VBX MHGR200.com/kb/110264/es .VBX ??? MHEN200.VBX ??? MHGR200.VBX SS3D2.microsoft.VBX MHAD200.List Box (Drv) List Box (File) List Box (File) Flip Scroll Bar Gauge Graph Grid Scroll Bar Scroll Bar Graph Invisible List Box Key State Label Line List Box List Box MDI Child Menu Marque Picture Picture Picture Property Vwr Option (Group) Slider Button (Spin) Spreadsheet Picture Screen Saver Switcher List Box Timer ToolBar List Box Input Box Input Box Scroll Bar Scroll Bar SSDrive drvs Sheridan File List film MicroHelp SSFile fils Sheridan Flip flpm MicroHelp Form Scroll fsrm MicroHelp Gauge gagm MicroHelp Graph gpho Other Q_Grid grdp Pioneer Horizontal hsbm MicroHelp Scroll Bar DB_HScroll hsbp Pioneer Histo hstm MicroHelp Invisible invm MicroHelp Icon Tag itgm MicroHelp Key State kstm MicroHelp Label (3d) lblm MicroHelp Line linm MicroHelp DB_List lstp Pioneer SSList lsts Sheridan MDI Control mdcm MicroHelp SSMenu mnus Sheridan Marque mrqm MicroHelp OddPic odpm MicroHelp Picture picm MicroHelp DB_Picture picp Pioneer Property pvrm MicroHelp Viewer DB_RadioGroup radp Pioneer Slider sldm MicroHelp Spinner spnm MicroHelp Spreadsheet sprm MicroHelp Stretcher strm MicroHelp Screen Saver svrm MicroHelp Switcher swtm MicroHelp Tag tagm MicroHelp Timer tmrm MicroHelp ToolBar tolm MicroHelp Tree trem MicroHelp Input (Text) txtm MicroHelp DB_Text txtp Pioneer Vertical vsbm MicroHelp Scroll Bar DB_VScroll vsbp Pioneer drvsDriveList filmFileList filsFileList flpmButton fsrmFormScroll gagmGauge gphoGraph grdpGrid hsbmScroll hsbpScroll hstmHistograph invmInvisible itgmListBox kstmKeyState lblmLabel linmLine lstpListBox lstsListBox mdcmMDIChild mnusMenu mrqmMarque odpmPicture picmPicture picpPicture pvrmPropertyViewer radqRadioGroup sldmSlider spnmSpinner sprmSpreadsheet strmStretcher svrmSaver swtmSwitcher tagmListBox tmrmTimer tolmToolBar tremTree inpmText txtpText vsbmScroll vsbpScroll SS3D2.VBX MHTI200.VBX MHEN200.VBX MHTI200.VBX QEVBDBF.VBX QEVBDBF.VBX MHAD200.VBX QEVBDBF.VBX MHEN200.VBX MHEN200.VBX MHTI200.VBX MHGR200.VBX MHGR200.VBX MHTI200.VB MHGR200.VBX MHEN200.

Sign up to vote on this title
UsefulNot useful