La Red de Conocimientos Pedagógicos - Conocimientos secundarios - ¡Urgente! Acerca de VB, programación sencilla

¡Urgente! Acerca de VB, programación sencilla

Categoría: Informática

4. Errores comunes y precauciones en matrices

1. Las variables aparecen en subíndices en declaraciones de matrices estáticas

n = InputBox("El límite superior de la matriz de entrada")

Dim a(1 To n) As Integer

2. Subíndice de matriz fuera de límites

El subíndice al que se hace referencia es mayor o menor que el rango de subíndice cuando se declara la matriz.

Dim a(1 To 30) Mientras I sea un número entero

a(1) = 1: a(2) = 1

Para i = 3 A 30

a(i) = a(i - 2) a(i - 1)

Siguiente I

3. Dimensiones de matriz incorrectas

Las dimensiones cuando se declara la matriz no son consistentes con las dimensiones cuando se hace referencia a los elementos de la matriz.

Atenuar a(3, 5) Mientras

a(I)=10

4. Problemas con el uso de la función Aarry

Solo puedes asignar valores a variables Variant o arrays dinámicos.

5. Obtenga los límites superior e inferior de la matriz

Funciones UBound y Lbound

1. Declaración de matriz tenue

A veces, por razones de versatilidad del programa, los usuarios declaran que el límite superior de la matriz está representado por una variable, como se muestra en el siguiente segmento del programa:

n =InputBox("Ingrese el límite superior de la matriz")

Dim a(1 To n)As Integer

Cuando el programa se está ejecutando, aparece el mensaje de error "se requiere expresión constante" se mostrará en la declaración Dim. Es decir, los límites superior e inferior de la matriz declarada en la declaración Dim deben ser constantes y no pueden ser variables.

Para resolver problemas comunes en los programas, uno es declarar la matriz muy grande, lo que desperdicia algo de espacio de almacenamiento y la otra es usar matrices dinámicas y cambiar el ejemplo anterior de la siguiente manera:

Dim a( )Como entero

n=InputBox ("Límite superior de la matriz de entrada")

ReDim a(1 To n) Como entero

2. El subíndice de la matriz está fuera de límites

Se refiere a un elemento de la matriz inexistente, es decir, el subíndice es mayor o menor que el rango del subíndice cuando se declara la matriz. Por ejemplo, para formar una secuencia de Fibonacci con los siguientes 30 términos:

1, 1, 2, 3, 5, 8, 13, 21, 34,…, 317811, 514229, 832040

El segmento de programa correcto es el siguiente:

Dim a(1 To 30) As Long, i

Si For i=3 To 30 se cambia a For i=1 A 30. Cuando el programa se está ejecutando, se mostrará el mensaje de error "subíndice fuera de límites" porque i=l cuando comienza el ciclo, y la declaración del cuerpo del ciclo a(i)=a(i-2) a(i- 1) se ejecuta y el subíndice de la matriz. Tanto i-2 como i-1 son más pequeños que el límite inferior 1.

De manera similar, si el ejemplo anterior: a(i)=a(i-2) la declaración a(i-1) se cambia a: a(i 2)=a(i) a(i 1 ).

Cuando el programa se esté ejecutando, también se mostrará el mensaje de error "Subíndice fuera de límites". En este caso, el subíndice de la matriz es mayor que el límite superior de 30.

3. Dimensiones de matriz incorrectas

Las dimensiones cuando se declara la matriz no son consistentes con las dimensiones cuando se hace referencia a los elementos de la matriz.

Por ejemplo, el siguiente segmento de programa forma y muestra una matriz de 3×5:

Dim a(3, 5) As Long

For i=1 To 3

Para j=1 a 5

a(i)=i*j

Imprimir a(i);"";

Siguiente j

Imprimir

Siguiente i

Cuando el programa ejecuta la instrucción a(i)=i*j, aparece un mensaje de "error de dimensión", porque cuando Dim se declarado, era una matriz bidimensional, un subíndice cuando se hace referencia.

4. Problemas con el uso de la función Array

La función Array puede asignar valores convenientemente a toda la matriz, pero en este momento solo se pueden declarar variables variantes o matrices dinámicas entre paréntesis. El tamaño de la matriz después de la asignación está determinado por el número de asignaciones.

Por ejemplo, si desea asignar los valores 1, 2, 3, 4, 5, 6 y 7 a la matriz a, la Tabla 2.5.1 enumera tres errores y los métodos de asignación correctos correspondientes. .

Tabla 2.5.1 Método de representación de la función Array

Asignación incorrecta de la función Array

Asignación de la función Aarry corregida

Dim a(1 To 8 )

a=Array(1, 2, 3, 4, 5, 6, 7, 8)

Dim a( ) a=Array(1, 2, 3 , 4 , 5, 6, 7)

Atenuar a como entero a=Array(1, 2, 3, 4, 5, 6, 7)

Atenuar a a=Array( 1, 2, 3, 4, 5, 6, 7)

Atenuar a

a()=Array(1, 2, 3, 4, 5, 6, 7)

Dim a a=Array(1, 2, 3, 4, 5, 6, 7)

5. Cómo obtener los límites superior e inferior de una matriz

La función Array puede asignar valores fácilmente a toda la matriz, pero cómo obtener los límites superior e inferior de la matriz en el programa para garantizar que Si los elementos de la matriz a los que se accede están dentro del rango legal, puede usar las funciones UBound y LBound para determinar el acceso a la matriz.

En el ejemplo anterior, si desea imprimir cada valor de una matriz, puede utilizar el siguiente segmento de programa:

For i=Lbound(A) To Ubound(A )

Imprimir un(i)

Siguiente i

6. Asignar valores a matrices

VB6.0 proporciona una nueva función que puede asignar valores a una matriz en su conjunto, lo que facilita las operaciones de asignación de matriz a matriz. Pero no es tan cómodo de usar y tiene muchas limitaciones. El formulario de asignación de matriz es el siguiente:

Nombre de matriz 2 = nombre de matriz 1

Analicemos este formulario: El nombre de matriz 2 aquí en realidad solo se puede declarar cuando se declara la matriz anterior Para las variables variantes, el tamaño, la dimensión y el tipo de la matriz 2 después de la asignación son los mismos que el nombre de la matriz 1, de lo contrario, si se declara como una matriz dinámica o estática, por ejemplo:

Matriz tenue; nombre 2 () o Dim Array nombre 2 (subíndice)

Cuando el programa llega a la declaración de asignación anterior, muestra el mensaje de error "No se puede asignar valor a la matriz".

Por lo tanto, para la seguridad y confiabilidad del programa, se recomienda que los lectores soporten el dolor y usen menos esta nueva función de VB6.0, y usen estructuras de bucle tradicionales para asignar valores a las matrices. . Por este motivo, no lo ampliaremos en el tutorial.

5. Errores comunes y precauciones durante el proceso

1. Problemas de algoritmos de programación

Este capítulo es más difícil de programar, principalmente debido a la dificultad de concebir el algoritmo. Esta es también la etapa más difícil de aprender en programación. La experiencia le dice a todo principiante en programación que no hay atajos, solo lea más, practique más y supere las dificultades.

Antes de usar la computadora, primero debe escribir el programa, analizarlo y verificarlo cuidadosamente para mejorar la eficiencia de la depuración de la computadora. Cada vez que se depura un programa y se pasa por un trabajo duro, se sentirá abrumado por la alegría al final del trabajo duro.

2. Determine si el proceso personalizado es un subproceso o un proceso de función

De hecho, un proceso es una unidad de programa independiente con una determinada función que se puede llamar varias veces. La diferencia entre subproceso y procedimiento de función es que el nombre del subproceso del primero no tiene valor, mientras que el nombre del procedimiento de función del segundo tiene un valor. Si el procedimiento tiene un valor de retorno, se acostumbra utilizar un procedimiento de función; si el procedimiento no tiene valor de retorno, se utiliza un subprocedimiento. Si el procedimiento devuelve varios valores, generalmente se utiliza un subprocedimiento y el resultado. se recupera mediante la combinación de parámetros reales y formales. Por supuesto, también se puede recuperar mediante el nombre del procedimiento de función y los resultados restantes se recuperan mediante la combinación de parámetros reales y formales.

3. Determinación del número y método de transferencia de parámetros formales en un procedimiento

Para los principiantes, el número y método de transferencia de parámetros formales no se pueden determinar al definir un procedimiento.

La función de los parámetros en el proceso es realizar la comunicación de datos entre el proceso y la persona que llama. Por un lado, la persona que llama proporciona el valor inicial para el subproceso o procedimiento de función, que se logra pasando los parámetros reales a los parámetros formales. Por otro lado, el subproceso o procedimiento de función pasa el resultado al. llamador, que se logra pasando la dirección, por lo tanto, la determinación del número de parámetros formales está determinada por los dos aspectos anteriores. Para los principiantes, a menudo les gusta usar todas las variables utilizadas en el cuerpo del procedimiento como parámetros formales, lo que aumenta la carga para la persona que llama y la probabilidad de errores. Algunos principiantes también omiten todos los parámetros formales y no pueden realizar la transferencia de datos. El valor inicial se obtiene de la persona que llama y el resultado del cálculo no se puede pasar a la persona que llama.

En VB, existen dos métodos para combinar parámetros formales y reales: pasar por valor y pasar por dirección. Las diferencias son las siguientes:

(1) En el formulario de definición, el primero agrega la palabra clave ByVal antes del parámetro formal.

(2) En efecto, la transferencia de valor solo puede pasar el valor inicial al proceso desde el mundo exterior, pero el resultado no se puede transferir hacia afuera, mientras que la transferencia de dirección se puede pasar hacia adentro y hacia afuera.

(3) Si el parámetro real es una matriz, un tipo personalizado, una variable de objeto, etc., el parámetro formal solo se puede pasar por dirección.

4. Problemas de correspondencia entre tipos de parámetros reales y formales

En el método de transferencia de direcciones, los tipos de parámetros reales y formales del proceso de llamada deben ser consistentes. Por ejemplo:

El procedimiento de la función se define de la siguiente manera:

Función pública f!(x!)

f=x x

Función final

El programa de llamada principal es el siguiente:

Privme Sub Commandl_Click()

Dim y

y=3

Print f (y)

End Sub

En el ejemplo anterior, la información del parámetro formal.

Al pasar por valor, si es de tipo numérico, el parámetro real pasará el valor al parámetro formal de acuerdo con el tipo del parámetro formal. Por ejemplo:

El proceso de la función se define de la siguiente manera:

Función pública f!(ByVal x)

f=x x

Función final

El programa de llamada principal es el siguiente:

Priva~SubCommandI_Click()

Dim y!

Y=3.4

Print f(y)

End Sub

El resultado que se muestra después de ejecutar el programa es 6.

5. El problema del alcance de las variables

Para las variables locales, cuando se llama al procedimiento, se asigna el espacio de almacenamiento de la variable. Cuando finaliza la llamada al procedimiento, se recupera el espacio de almacenamiento asignado, es decir, se llama. una vez y se inicializa una vez. La variable no es una variable de nivel de formulario que conserva el valor. Cuando se carga el formulario, se asigna el espacio de almacenamiento asignado para la variable. memoria.

Por ejemplo, si desea ingresar varios valores a través del cuadro de texto, presione la tecla Eeter cada vez que ingrese uno hasta que el valor ingresado sea 9999. Cuando se complete la entrada, encuentre el promedio de los números ingresados.

Subtexto privadol_Tecla presionada (tecla Ascii como número entero)

¡Dim sum!, n

Si KeyAscii=13 entonces

Si Val (Texto1)=9999 Entonces

suma=sum/n

Imprimir suma

De lo contrario

Suma=suma Texto1

n=n 1

Texto1=""

Fin si

Fin si

Fin Sub

No hay ningún error de sintaxis en este proceso. Puede ingresar varios números al ejecutar el programa. Sin embargo, cuando se ingresa 9999, el programa muestra un error de "desbordamiento". La razón es que sum yn son variables locales. Cada vez que se presiona una tecla, las variables locales se inicializan a 0, por lo que se producirá el error anterior.

Método de mejora: declarar las variables locales que se conservarán como variables estáticas o como variables de nivel de formulario. Las variables que se conservarán también se pueden declarar como variables a nivel de formulario en la sección de declaración general.

6. El "desbordamiento de pila" ocurre en llamadas recursivas

El proceso de la función recursiva para encontrar factorial es el siguiente:

Public Functionfac(n As Integer)As integer

Si n=1 Entonces

fac=1

De lo contrario

fac=n*fac(n-1)

Finalizar si

Finalizar función

Private Sub Commandl_Click() 'Llama a la función recursiva y muestra fac(5)=120

Imprimir "fac(5)"; )

End Sub

Cuando se llama al programa de llamada, cuando el valor de n es 5, se muestra el resultado 120; cuando el valor de n es -5, aparece el mensaje de error; Se muestra "desbordamiento de espacio de pila".

De hecho, cada vez que se realiza una llamada recursiva, el sistema envía la información del estado actual (parámetros formales, variables locales, dirección de retorno al final de la llamada) a la pila hasta que se cumpla la condición final recursiva. alcanzó. En el ejemplo anterior, cuando n=5, cada llamada recursiva toma los parámetros n-l hasta que la llamada recursiva termina con n=l, y luego los parámetros actuales se extraen continuamente de la pila hasta que la pila está vacía. Cuando n = -5, el parámetro n-1 es -6, empuja la pila y luego llama de forma recursiva, n-1 nunca alcanzará la condición de terminación de n = l, hasta que la pila esté llena y aparecerá un mensaje de error de desbordamiento de la pila. ser generado.

Entonces, al diseñar un proceso recursivo, se debe considerar que existen condiciones de terminación y valores de terminación o ciertas operaciones en el proceso, y cada vez que se realiza una llamada recursiva, los parámetros deben converger en la dirección de terminación, de lo contrario se producirá un desbordamiento de pila.

6. Análisis de errores y dificultades comunes en los controles utilizados habitualmente

1. Omitir nombres de objetos

Un error que los principiantes suelen cometer al diseñar programas VB es omitir nombres de objetos, especialmente cuando se utilizan cuadros de lista. Por ejemplo, Listl.list(Listlndex) es incorrecto si desea hacer referencia al elemento seleccionado actualmente en un cuadro de lista (Lista1).

Incluso si el foco actual está en Listl, VB no cree que Listlndex sea una propiedad de Listl, sino una variable. Entonces el método de referencia correcto es: Listl 1ist(Listl.Listlndex).

2. La propiedad Columnas del cuadro de lista

La propiedad Columnas del cuadro de lista determina si el cuadro de lista se desplaza horizontal o verticalmente y cómo se muestran los elementos de las columnas. Si se desplaza horizontalmente, la propiedad Columnas determina cuántas columnas se muestran, como se muestra en la Tabla 2.7.2. La Figura 2.7.1 es un cuadro de lista que se desplaza horizontalmente y se muestra en dos columnas.

Mientras el programa se está ejecutando, esta propiedad es de solo lectura, es decir, no se puede cambiar un cuadro de lista de varias columnas a un cuadro de lista de una sola columna o un cuadro de lista de una sola columna a uno de varias columnas. cuadro de lista de columnas en tiempo de ejecución.

Tabla 2.7.2 Propiedad de columnas del cuadro de lista

Propiedad de número de columna

0 (valor predeterminado) 1 a n Los elementos están organizados en una columna, y el cuadro de lista Los elementos que se desplazan verticalmente se organizan en varias columnas, primero complete la primera columna y luego complete la segunda columna... El cuadro de lista se desplaza horizontalmente y muestra el número especificado de columnas

3 . Validación a nivel de dominio

La validación a nivel de dominio se refiere a la validación de la entrada de datos en un dominio independiente. En el proceso de validación a nivel de dominio, el contenido de otros campos generales del formulario generalmente no se considera. El momento apropiado para la verificación a nivel de dominio es:

(1) Cuando se ingresa una clave en un dominio, están involucrados eventos de teclado (KeyDown, KeyUp y KeyPress).

(2) Cuando un usuario intenta abandonar un dominio, intervienen el atributo CansesValidate y el evento Validate.

(3) Cuando el contenido de un determinado dominio cambia, el evento Cambio está involucrado.

La propiedad CausesValidation y el evento Validate suelen trabajar juntos.

El atributo CausesValidate determina si se produce el evento Validate. Si la propiedad CausesValidate de un control es False, el evento Validate del control nunca ocurrirá. Si la propiedad CausesValidate del control es Árbol, cuando el foco intenta moverse a (aún no abandonado o antes de salir) otro control cuya propiedad CausesValidate es Verdadera, se produce el evento Validar del control original: Cuando el foco intenta moverse a otra propiedad CausesValidate Cuando el control es Falso, el evento Validar del control original no ocurrirá temporalmente. ¿Cuándo ocurrirá? No ocurrirá hasta que el foco se mueva a un control cuya propiedad CausesValidate sea Verdadera.

Por ejemplo, supongamos que hay un programa como el que se muestra en la Figura 2.7.2. Cuando el foco intenta pasar de Textl a Text2, se produce el evento Validate de Textl. De manera similar, cuando el foco intenta pasar de Text2 a Textl, se produce el evento Validate de Text2. Cuando el foco intenta pasar de Textl a Text3, el evento Validate de TextI no ocurre temporalmente, porque CausesValidate de Text3 es False, y luego, si el foco intenta continuar moviéndose a Text2, ocurre el evento Validate de Textl.

Figura 2.7.2 Atributo CausesValidate y evento Validate

Esta característica del atributo CausesValidate y evento Validate se utiliza a menudo en el programa que se muestra en la Figura 2.7.3. Cuando se ingresan datos no válidos en el cuadro de texto y el usuario no sabe cómo ingresar datos válidos, el usuario a menudo selecciona el comando Ayuda para buscar ayuda o el comando Cancelar para finalizar la entrada de datos. ejecutar el proceso de verificación. Porque si se ejecuta el proceso de verificación y se encuentran datos no válidos, no se puede seleccionar Ayuda o Cancelar y el usuario queda atrapado.

Ahora, siempre que la propiedad CausesValidate del cuadro de texto esté establecida en Verdadero, la propiedad CausesValidate del botón de comando sea Falso y el validador se coloque en el proceso de Validación, el problema se resolverá. De forma predeterminada, la propiedad CausesValidation de todos los controles es Árbol.

Figura 2.7.3 CausasPropiedad Validate y evento Validate del botón de comando

No todos los controles tienen eventos Validate. Sólo los controles que se pueden usar para ingresar datos (como cuadros de texto, casillas de verificación, barras de desplazamiento, etc.) tienen este evento. El proceso del evento Validar es el siguiente:

Privme Sub object_Validate(Cancel As Boolean)

EndSub

Entre ellos, cuando el parámetro Cancelar está configurado. Después de que sea un árbol, el foco no abandonará el objeto.

Si desea cambiar la pregunta 1 del Experimento 7 para usar el evento Validar y el atributo CausesValidation para implementar la verificación de datos, debe tener el siguiente programa.

Sub txtMath_Validate(Cancelar como booleano)

Si Val(txtMath.Text)lt 0 o _

Val(txtMath.Text)gt;

Cancelar=Verdadero

Finalizar si

Finalizar sub

1. La diferencia entre los elementos del menú en la barra de menú en la parte superior del formulario y los elementos del menú en el submenú

Los elementos del menú en la barra de menú en la parte superior del formulario y los elementos del menú en el submenú Ambos están definidos en el editor de menú, pero son diferentes.

(1) Los elementos del menú en la barra de menú en la parte superior del formulario no pueden definir teclas de acceso directo, pero los elementos del menú en el submenú pueden tener teclas de acceso directo.

(2) Cuando haya una letra de tecla de acceso rápido (la letra después de "amp;" en el título del menú), presione la letra de la tecla de acceso rápido Alt para seleccionar el elemento del menú en la barra de menú en la parte superior del formulario. y presione la letra de la tecla de acceso rápido para seleccionar elementos del menú en los submenús (cuando el submenú esté abierto). Cuando el submenú no está abierto, no puede seleccionar el elemento del menú presionando la letra de la tecla de acceso rápido.

(3) Aunque todos los elementos del menú pueden responder al evento Click, los elementos del menú en la barra de menú en la parte superior del formulario no necesitan escribir procedimientos de evento.

2. La configuración de propiedades del cuadro de diálogo común en el programa no funciona

La configuración de propiedades del cuadro de diálogo común en el programa no funciona En la mayoría de los casos, la configuración de propiedades se realiza después de que aparece el cuadro de diálogo. arriba. Por ejemplo, el siguiente código de programa tiene tal problema. El método de corrección es colocar la declaración del cuadro de diálogo emergente al final, es decir, colocar CommonDialogl.Action=l después de todas las declaraciones de configuración de propiedades.

CommonDialog1.Action=1

ConmaonDialog1.FileName="*.Bmp"

CommonDialogl.InitDir="C:\Windows"

CommonDialog1.Filter="Imágenes(*.Bmp)|*.Bmp|Todos los archivos(*.*)|*.*"

CommonDialog1.FilterIndex=1

3 . Los errores de carga ocurren al agregar un formulario existente al proyecto.

Los errores de carga ocurren a menudo al agregar un formulario existente usando el comando "Agregar formulario" en el menú "Proyecto". La mayoría de las veces, esto se debe a que vence. a un conflicto de nombre de formulario.

Por ejemplo, suponiendo que un proyecto llamado Forml esté abierto actualmente, si desea cargar el formulario Forml que pertenece a otro proyecto, definitivamente se producirá un error.

[Nota]

La diferencia entre el nombre del formulario y el nombre del archivo del formulario. En un proyecto, puede haber dos formularios con el mismo nombre de archivo de formulario (distribuidos en diferentes carpetas), pero dos formularios con el mismo nombre no deben aparecer al mismo tiempo.

4. Creación de menús en vivo

Las aplicaciones crean menús en vivo dinámicamente según sea necesario. En VB, un menú común en tiempo real es el menú "Archivo", que muestra los proyectos utilizados recientemente.

Para crear un menú en tiempo real, debe combinar la matriz de control, usar la instrucción Load para crear elementos del menú y usar UnLoad para borrar los elementos del menú.

Pasos para crear un menú en tiempo real:

(1) Cree un elemento de menú de muestra en el editor de menú

Consulte la Tabla 2.8 para conocer la configuración de atributos de el elemento del menú de muestra .4 que se muestra. Establecer Index en 0 indica que el elemento del menú de muestra es un elemento de la matriz de control y su subíndice es 0. La propiedad Nombre del elemento del menú de muestra es obligatoria y servirá como nombre de la matriz de control. A continuación se supone que la matriz se denomina NameArray. Visible se puede establecer en Verdadero y en Falso para indicar que el elemento del menú no es visible inicialmente.

Tabla 2.8.4 Elementos de menú de muestra de menú en tiempo real

Nombre del atributo Título Índice visible

Establezca el valor requerido y puede ser 0 Falso

(2) Utilice la instrucción Load para crear un elemento de menú en el programa

Por ejemplo, Load NameArray(1) crea un nuevo elemento de menú (el subíndice en la matriz de control es 1 y luego establece su propiedad Visible en True y establezca el atributo Caption al mismo tiempo.

El elemento de menú creado dinámicamente hereda la mayoría de los atributos excepto Index, por lo que se deben configurar los atributos Caption y Visible. elemento de menú de muestra en el sistema de menú. La posición determina dónde aparece el nuevo elemento de menú.

(3) Escriba el código para el elemento de menú en tiempo real

Cada elemento de menú en tiempo real. es miembro de la matriz de control y tiene el mismo nombre y *comparte el proceso del evento

El siguiente es un ejemplo de código de elemento de menú en tiempo real:

SubNameArray_Click(Index As). Entero)

Seleccionar índice de caso

p>

Caso 0

MsgBox("¡Se hace clic en NameArmy(0)(elemento de menú de muestra)!")

Caso 1

MsgBox(" ¡Se hace clic en NameArray(1)(el primer elemento del menú en tiempo real)!")

Caso 2

MsgBox("¡Se hace clic en NameArray(2) (el segundo elemento del menú en tiempo real)!")

End Select

End Sub

(4) Eliminar el elemento del menú en tiempo real

Aunque Visible está configurado en Falso, los elementos del menú en tiempo real no se mostrarán mientras el programa se esté ejecutando, pero a veces es necesario destruir los elementos del menú en tiempo real de memoria Por ejemplo, utilice la instrucción UnLoad.

Detalles sobre la creación de un menú en tiempo real. Consulte la Sección 4.3 del tutorial.

5. La propiedad CancelError y el objeto Err del cuadro de diálogo general

Cuando la propiedad CancelError del cuadro de diálogo general es True, siempre que se seleccione el botón "Cancelar", se generará el error número 32755 (cdlCancel), que es decir, la propiedad Número de Err establecida en 32755.

Err es un objeto del sistema de VB, que registra los errores que ocurren durante la ejecución del programa.

Los atributos importantes del objeto Err son Número (atributo predeterminado) y Descripción. Cuando ocurre un error, el productor del error almacena el número de error y la descripción del error en los atributos Número y Descripción respectivamente. Por ejemplo, cuando se selecciona el botón "Cancelar" en un cuadro de diálogo común con la propiedad CancelError establecida en Verdadero, se genera un error y las propiedades Número y Descripción del objeto Err se establecerán en 32755 y "Seleccione 'Cancelar'".

Durante la ejecución del programa es frecuente que se produzcan diversos errores. Consulte la sección 9.6 del tutorial para obtener detalles sobre el manejo de errores.

A continuación se explica cómo finalizar el programa cuando el programa genera un error de cdlCancel.

SubForm_ClickO

CommonDialogl.CancelError=True

En caso de error, Ir a ErrorHandler

CommonDialogl.Action=l

' Declaraciones para procesar archivos

ErrorHandler:

If Err.Number=cdlCancel Then

End

Endlf

Fin Sub

6. Eventos relacionados con el formulario

Los eventos Inicializar y Cargar ocurren secuencialmente cuando el formulario (asumiendo que el formulario no se ha creado en la memoria) se transfiere a la memoria usando la instrucción Load por primera vez. Cuando se usa UnLoad para descargar el formulario de la memoria, los eventos QueryUnLoad y Unload ocurren en secuencia. Cuando se usa la instrucción Set form name = Nothing para desinicializar, ocurre el evento Terminate.

Inicializar es un evento que ocurre cuando se crea el formulario. El evento Inicializar se activa solo una vez durante todo el ciclo de vida del formulario. El usuario puede cargar un formulario en la memoria o eliminarlo de la memoria muchas veces, pero el formulario se crea solo una vez. En otras palabras, el evento Load se activará cuando el formulario se cargue en la memoria mediante la instrucción Load, pero el evento Inicializar no necesariamente se activará.

Después de descargar el formulario con la instrucción UnLoad, si no se usa Set form name = Nothing para desinicializarlo, el evento Inicializar no se activará la próxima vez que se use la instrucción Cargar; de lo contrario, se ejecutará el evento Inicializar. ser causado.

Supongamos que hay dos formularios, Forml y Form2, y los siguientes procedimientos de evento:

'Procedimiento de evento de formulario Forml

Sub Form_Click()

Debug.Print"El evento que ocurre cuando el formulario se carga en la memoria por primera vez:"

Cargar formulario2

Debug.Print"El evento que ocurre cuando el formulario se descarga usando Unload: "

UnloadForm2

Debug.Print "Eventos que ocurren cuando el formulario se carga en la memoria por segunda vez:"

Cargar Form2

Debug.Print "Eventos que ocurren cuando el formulario se descarga con Unload:"

Descargar Form2

Debug.Print "Eventos que ocurren cuando el el formulario se desinicializa con la instrucción Set form name=Nothing:" "

Set Form2=Nothing

Debug.Print "Eventos que ocurren cuando el formulario se carga en la memoria por tercera vez (después de la desinicialización):"

Cargar Form2

End Sub

'Procedimiento de evento de formulario Form2

Sub Form_Initialize()

Debug.Print "Inicializar evento"

End Sub

Sub Form_Lond()

Debug.Pnnt"Cargar evento"

End Sub

Sub Form_QueryUnload (Cancelar como hteger, UnloadMode como entero)

Debug.Print "QueryUnload"

End Sub

Sub Form_Unlond(Cancelar como entero)

Debug.Print"Unload"

End Sub

Sub Form_Terminate()

Depurar. Imprimir "Terminar"

End Sub

Cuando el usuario hace clic en Form1, se muestra la siguiente información en la ventana de depuración:

Eventos que ocurren cuando el formulario se transfiere a la memoria por primera vez:

Evento de inicialización

Evento de carga

Evento que ocurre al descargar un formulario con Descargar:

Descarga de consultas

Descarga

Eventos que ocurren cuando el formulario se carga en memoria por segunda vez:

Evento de carga

Eventos que ocurren cuando el formulario se descarga usando Descargar:

QueryUnload

Descargar

Eventos que ocurren al desinicializar el formulario usando la instrucción Establecer nombre del formulario = Nada:

Terminar

La tercera vez que se desinicializa el formulario (no inicializado Eventos que ocurren al cargar en memoria:

Evento de inicialización

Evento de carga

7. El orden en que ocurren los eventos MouseDown, MOUseUp y C1ick

El evento MouseDown se activa cuando el usuario presiona el botón del mouse en el formulario o control. El evento MouseDown debe ocurrir antes de los eventos MouseUp y C1ick. Sin embargo, el orden en que ocurren los eventos MouseUp y Click depende del objeto en el que se hizo clic.

Cuando el usuario hace clic en una etiqueta, cuadro de texto o formulario, la secuencia es:

(1)MouseDown

(2)MouseUp

(3)Clic

Cuando el usuario hace clic en el botón de comando, la secuencia es:

(1)MouseDown

(2)Clic

(3)MouseUp

Cuando el usuario hace doble clic en la etiqueta o cuadro de texto, la secuencia es:

(1)MouseDown

(2)MOuseUp

(3)Clic

(4)DblCUck

(5)MouseUp

7. Análisis de Errores y dificultades comunes en los documentos

1. Los tres controles del sistema de archivos no pueden estar relacionados

Es decir, cuando la unidad cambia, el cuadro de lista del directorio no puede cambiar en consecuencia o cuando el cuadro de lista del directorio cambia, el cuadro de lista de archivos no puede cambiar en consecuencia; Para asociar tres controles, utilice los siguientes dos procedimientos de eventos:

Private Sub Drivel_Change()

Dirl.Path=Drivel.Drive

End Sub

Sub privado Dirl_Change()

Filel.Path=Dirl.Path

Fin sub

2. Cómo representar el directorio actualmente seleccionado en el cuadro de lista de directorios

Haga doble clic en un elemento del directorio en el cuadro de lista de directorios mientras el programa se está ejecutando, el elemento del directorio se cambiará al directorio actual y el El valor de Diirl se cambiará en consecuencia. Cuando se hace clic en el elemento del directorio para seleccionarlo, el valor de Diirl no cambia. En ocasiones para realizar operaciones relacionadas sobre el elemento del directorio seleccionado, corresponde seleccionar un elemento de la lista en el control ListBox, el cual se expresa de la siguiente manera:

Dirl.List(Dirl.Listlndex)

3. Cuando se utiliza el control del sistema de archivos para abrir un archivo, se muestra el mensaje de error "Archivo no encontrado".

Por ejemplo, la siguiente declaración:

Abrir Filel.Path Filel.File Name para entrada como#1

Cuando el directorio seleccionado es el directorio raíz, la declaración anterior La ejecución es correcta, pero cuando el directorio seleccionado es un subdirectorio, se muestra el mensaje de error "Archivo no encontrado" cuando se ejecuta la declaración anterior.

Entre ellos: Filel.Path representa la ruta seleccionada actualmente, Filel.File Name representa el archivo seleccionado actualmente y juntos representan el identificador del archivo.

Cuando el archivo seleccionado está en el directorio raíz (asumiendo que la unidad es C), el valor de Filel.Path es "C:\1" y asumiendo que el archivo seleccionado se llama "t1.txt". , entonces el valor de Filel.Path Filel.FileName es "C:\t1.txt", que es un identificador de archivo legal.

Cuando el archivo seleccionado está en un subdirectorio (asumiendo que la unidad es C y el subdirectorio es my), el valor de Filel.Path es "C:\my" y el valor de Filel.Path Filel. El nombre del archivo es "C:\my tl.txt", falta un separador "\" entre el subdirectorio y el nombre del archivo.

Para garantizar el funcionamiento normal del programa,

Open Filel.Path Filel.FileNameForlnput As #1 se cambia a:

Dun F$

Si es correcto(Filel.Path, 1)"\" Entonces 'Indica el directorio raíz completo seleccionado

F=Filel.Path Filel.FileName

Else ' Indica el subdirectorio del directorio raíz seleccionado, agregue "\"

F=Filel.Path "\" Filel.FileName

End If

Abra F entre los subdirectorios y el nombre del archivo para entrada como # 1

4. El nombre que se abrirá en la instrucción Open puede ser una constante o una variable de cadena, pero el concepto del usuario no está claro, lo que genera el mensaje de error "Archivo no encontrado".

Por ejemplo, al leer un archivo de el disco, el nombre es " C:\my\t1.txt",

La escritura constante correcta es la siguiente:

Abrir "C:\my\t1.txt" Para entrada como#1 ' Escritura incorrecta Debe haber menos comillas dobles en ambos lados de la constante

O la variable correcta se escribe de la siguiente manera:

Dim F$

F="C:\my\t1.txt"

Abrir F para entrada como #1 ' Escritura incorrecta de la variable F con comillas dobles en ambos lados

5. El archivo no se cerró y luego se abrió, y se muestra el mensaje de error "El archivo se ha abierto".

La siguiente declaración:

Abrir "C:\my\t1.txt " Para entrada como n.º 1

Imprimir F

Abra "C:\my\t1.txt" para entrada como n.º 1

Imprimir "2"; F

Al ejecutar la segunda instrucción Open, se muestra el mensaje de error "El archivo ya está abierto".

6. Cómo leer todos los registros en un archivo aleatorio sin saber el número de registro.

Si no conoce el número de registro y desea leer todos los registros, siempre que sea similar a leer el archivo secuencial, puede usar una estructura de bucle y una declaración Get sin un número de registro. El segmento del programa es el siguiente:

Hacer mientras no sea EOF(1)

Obtener #1, , j

Imprimir j;

Bucle

Archivo aleatorio No es necesario escribir el número de registro al leer o escribir, lo que significa que el siguiente registro se leerá automáticamente al leer y se insertará después del registro actual al escribir.