Simplificar y abreviar código de formulario para optimizarlo 1

Es una pregunta para Sveinbjorn El Rojo
Me gustaría simplificar un código que tengo construído y que me planteaba la posibilidad de hacer lo mismo pero con menos líneas sin repetir innecesariamente las mismas expresiones. En los dos códigos hay un denominador común que se repite... ".locked = true"
CÓDIGO
Cuando abro un formulario quiero que todos los campos estén bloqueados para no poder modificarlos al entrar en ellos a no ser que pulse un botón... El form está vinculado a los campos de la tabla "Libros":
Me.Numero_Registro.Locked = true
Me.Titulo.locked = true
Me.Autor.locked = true
Me.Editorial.locked = true
Me.Año.locked = true
Me.Idioma.locked = true
Me.Tomo.locked = true
Me.Coleccion = true
Me.Tipo_Documento = True
Me.Categoria.locked = true
Me.Materia.locked = true
Me.Submateria.locked = true
Me.Tejuelo.locked = true
Me.Activo.locked = true
Me.Signatura.locked = true
Me.Armario.locked = true

La propiedad .AllowEdits del formulario, no me sirve porque no quiero bloquear todos los controles del formulario (combos, etiquetas, controles vinculados a campos de tabla, etc.) sino solo los campos.

Me pregunto si no se podría agrupar en un solo .Locked = True los 16 campos que indico en mi pregunta, pero solo los campos o mejor dicho solo los controles asociados a los campos de la tabla "Libros" a la que hace referencia el formulario.
La idea es que al entrar en el form quiero los campos bloqueados para que nadie por error los edite y si se quieren editar tengan que pulsar un botón "Modificar" para desbloquearlos.

2 respuestas

Respuesta
1

Depro: Ya veo que la pregunta la diriges a Sveinbjorn, y seguro que el te contestará, pero dado que a mi me sale la pregunta sugerida por el sistema te comento mi punto de vista.

Para todos los controles TextBox, como en éste caso yo los identificaría con unas letras iniciales únicas, por ejemplo TxtAño, TxtArmario ... etc.

Después donde tienes todo ese código yo pondría.

Dim Ctrl As Access.Control

For Each Ctrl In Me.Controls
If Left(Ctrl.Name,3) =  "Txt" Then
Ctrl.Locked = True
End If
Next Ctrl

y para desbloquearlos igual pero Ctrl.Locked = False

Mis saludos y Feliz año >> Jacinto

Qué buenísima idea Jacinto

De esta manera que me dices puedo bloquear solo los controles que necesito sin tener que bloquear todos los textbox, sino solo los que contienen esas letras iniciales únicas que añadiré.

Es fantástico... realmente me has evitado tener que escribir muchísimas más líneas innesarias. GRACIAS

¿Podrías darme tu opinión también en la pregunta "simplificar código para optimizarlo y agrupar not isnull?

y por supuesto FELIZ AÑO!!!

Depro: He leido la pregunta que me comentas y a mi modo de ver la simplificación debe venir del planteamiento original, y me explico.

Veo que son muchos Controles implicados y quizá algunos no haría falta sondearlos si en Origen tuvieran un Valor Predeterminado o el valor requerido en Si.

Me aventuro aún desconociendo el tema, pero como ejemplo si se están entrando datos de una Obra y no se conoce el Autor, en la Tabla de Origen, (y en el Control), puede tener como valor predeterminado >> Desconocido o Pendiente de Comprobar etc.

No siendo así, coincido con Sveinjorn en su respuesta. Saludos >> Jacinto

Respuesta
1

Puedes usar un bucle para recorrer los distintos controles y bloquear los de un tipo determinado. Sería algo así:

Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
ctl.Locked=True
End If
Next ctl

Esto te bloquearía todos los textbox, combobox y listbox de tu formulario.

Un saludo.


Un nuevo foro de Access, no dudes en pasarte: http://nksvaccessolutions.com/Foro/ 

Antes que nada... FELIZ AÑO Sveinbjorn El Rojo!!!

El problema que tengo es que no quiero bloquear todos los textbox sino solo algunos, en realidad solo los textbox asociados a los campos de la tabla "Libros" a la que está vinculada el formulario.

Se podría hacer para que solo se bloquearan algunos textbox y no todos sin tener que repetir en cada textbox lo de .locked true

Me imagino que usando una función función a la que le pasaría el parámetro (el true o el false) y así aplicara el valor a cada uno de los objetos implicados.

Podrías indicarme cómo sería la función si es posible

Ya me dices y muchas gracias por la ayuda

A ver si nos aclaramos... primero dices:

Cuando abro un formulario quiero que todos los campos estén bloqueados para no poder modificarlos al entrar en ellos a no ser que pulse un botón...

Y ahora que no los quieres bloquear todos... XD

Sí, se podría hacer si le añades un prefijo o sufijo concreto a los que quieres bloquear y modificas el código anterior. Si por ejemplo a los que quieres bloquear les añades al final del nombre _lck, el código sería:

Public Sub Bloqueado(elEstado As Boolean)
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.Name LIKE "*_lck" Then
ctl.Locked=elEstado
End If
Next ctl
End Sub

Cuando los quieras bloquear pones:

Bloqueado True

y para desbloquearlos:

Bloqueado False

Hola Sveinbjorn

Cuando decía: "Cuando abro un formulario quiero que todos los campos estén bloqueados para no poder modificarlos al entrar en ellos a no ser que pulse un botón..."

Me refería a todos los textbox asociados a los campos de la tabla "Libros" con la que está vinculada el form, y me refería con lo de campos a TODOS los campos de la tabla "Libros" y no a todos los textbox del form, solo a aquéllos asociados a los campos de la tabla.

No todos los textbox que aparecen en el formulario tienen como origen del control los campos de la tabla "Libros". Fallo mío por no detallarlo bien.

La verdad es que no me expliqué muy bien, disculpa, a veces uno escribe rápido y no se explica correctamente.

En todo caso tu respuesta como siempre es perfecta.

Muchisimas gracias

Nada que disculpar, pero como ves, el primer código te sirve para bloquear todos los controles de un tipo (o varios), mientras que la segunda sólo los que especifiques. Ten en cuenta, al hacer las preguntas, que nosotros no tenemos la BD y no podemos saber, por ejemplo que controles dependen de una tabla si no lo indicas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas