Variables de referencia y objetos en otro lugar en un formulario

Estoy tratando de pasar un objeto de equipo a un objeto de formulario y luego usar ese objeto de equipo en un evento de clic desde un botón en el formulario. Pero no sé cómo hacer una referencia adecuada del objeto del equipo dentro del evento del botón.

Configuré la nueva instancia de formulario usando:

Public Sub New(ByRef thisEquip As classEquipment) Me.InitializeComponent() Me.Text = thisEquip.equipName & " Tests" End Sub 

y configure el evento de clic de botón como este:

 Private Sub btnUpdateAndClose_Click(sender As Object, e As EventArgs) Handles btnUpdateAndClose.Click Call updateTestList(thisEquip) End Sub 

Pero el objeto ‘thisEquip’ no es reconocido. Creo que esto se debe a que el remitente es el botón y no el formulario en sí. Sin embargo, no sé cómo hacer referencia al objeto del equipo desde el formulario.

El scope depende de dónde se declara una variable. Es posible que haya perdido algo que roza el enlace: cada resumen del nivel de scope incluye la frase en la que se declara .

Ahora mira a tu constructor:

 Public Sub New(ByRef thisEquip As classEquipment) 

thisEquip se declara como un argumento para el constructor. Por lo tanto, solo existe en ese procedimiento. El hecho de que el procedimiento sea en una forma o que thisEquip se mencione en la forma (o módulo o cualquier otra cosa) es incidental. Si bien es cierto que el constructor es especial de varias maneras, en materia de Scope , es solo otro procedimiento.

Alcance del nivel de formulario

Para guardar una referencia para usar en otro lugar:

 Public Class Form1 ' declare a variable to hold the reference Private myEquip As classEquipment ' declare an array Private myImgs As Image() Public Sub New(ByRef thisEquip As classEquipment) InitializeComponent() ... myEquip = thisEquip ' assign param to the var ' assign array of images to the Form level var ' via a temp array myImgs = New Image() {My.Resources.add, My.Resources.ballblack, My.Resources.ballblue, My.Resources.ballgreen} End Sub 

Declarado a nivel de formulario, tiene scope de nivel de forma / clase. Ahora puede hacer referencia a myEquip o myImgs en cualquier lugar del formulario. No use Dim cuando simplemente esté asignando algo a un objeto de nivel de formulario; se creará una nueva variable local, pero con un nombre idéntico.


Otros niveles comunes de scope:

Nivel de procedimiento Alcance

 Private myFoo as Int32 Private Sub DoSomething() Dim myBar As String myBar = "Ziggy" ... Dim myFoo As Int32 = 7 End Sub 

Esto se llama más comúnmente scope local . Estoy usando el nivel de procedimiento porque compara y contrasta mejor con los otros términos.

myBar se declara en el método DoSomething , por lo que tiene scope de nivel de procedimiento, solo existe en ese método. Intentar usarlo en otro lugar resultará en un error. Esto es similar al ejemplo de constructor anterior, con la diferencia principal de que el objeto thisEquip se pasó como un parámetro en lugar de declararse localmente.

Esto lleva a algunos a confundirse: el Dim myFoo en el método declara (¡crea!) Una nueva variable myFoo única que no tiene relación con la variable de nivel Forma / Clase del mismo nombre. La versión local ensombrece a la otra. Parte de la confusión de esto parece ser que algunos piensan que necesitan (re) usar Dim para poder usar una variable. Tu no.


Alcance del nivel de bloque

Directamente desde MSDN:

 If n < 1291 Then Dim cube As Integer cube = n ^ 3 End If 

Un buen número de sentencias de VB crean un ámbito de bloque ( For Each / Next , If / End If y Using / End Using ). Las variables declaradas dentro de un Bloque, tienen un scope limitado a ese bloque. Básicamente, (casi) cualquier cosa que resulte en sangría crea un Alcance de Bloque.

 Private Sub ..... Dim cube As Int32 If n < 1291 Then cube = n ^ 3 End If 

Ahora, el cube se puede usar en cualquier otro lugar del procedimiento: su scope ha cambiado de Bloque a Local.

Para obtener más detalles, consulte MSDN:
- Ámbito en Visual Basic
- Tipos de valores frente a tipos de referencia