Foros del Web » Programación para mayores de 30 ;) » .NET »

Variables globales

Estas en el tema de Variables globales en el foro de .NET en Foros del Web. Hola amigos tengo una duda con el uso de variables globales, estuve leyendo un poco en la web y encuentro que en algunos sitios no ...
  #1 (permalink)  
Antiguo 01/07/2010, 20:47
 
Fecha de Ingreso: abril-2010
Ubicación: Colombia - Barranquilla
Mensajes: 66
Antigüedad: 12 años, 3 meses
Puntos: 0
Variables globales

Hola amigos tengo una duda con el uso de variables globales, estuve leyendo un poco en la web y encuentro que en algunos sitios no recomiendan el uso de variables globales y estoy necesitando realizar lo siguiente:

Tengo en mi proyecto dos formularios

Un formulario de validacion de usuario, nombre y nit.
Un formulario de ingreso de datos a una tabla en mysql

Entonces yo valido si el usuario que va a ingresar los datos existe, eso ya lo hice y funciona el problema esta en que necesito guardar esos dos datos que leo, nombre y nit, para luego usarlos en el otro formulario para eso creo que debo usar variables globales pero necesito que me ayuden para saber si es así o de otra manera.

parece que deberia crear un modulo y declarar las variables pero luego como las trabajo?

Gracias.
  #2 (permalink)  
Antiguo 02/07/2010, 08:24
 
Fecha de Ingreso: febrero-2010
Ubicación: México
Mensajes: 738
Antigüedad: 12 años, 4 meses
Puntos: 37
Respuesta: Variables globales

Hola easolano5

Solamente quieres visualizar esos valores en el otro Form? Los quieres visualizar en TextBox, Label, etc.? Porque de ser asi solo harias esto:

FormValidacion.TextBoxUsuario.Text = FormIngresarDatos.TextBox.Text

Bueno esto si es lo que entendi, de otro modo espero tu respuesta.
  #3 (permalink)  
Antiguo 02/07/2010, 10:11
 
Fecha de Ingreso: abril-2010
Ubicación: Colombia - Barranquilla
Mensajes: 66
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Variables globales

Hola gracias pro responder mira lo que quiero hacer es esto:

Cuando se abra el formulario de validacion, con los textbox: nit.text y llave.text estos dos valores queden guardados en una variable que yo pueda usar más adelante en el otro formulario, para almacenar esos dos valores de los dos textbox en una tabla de la base de datos.
  #4 (permalink)  
Antiguo 02/07/2010, 11:07
kid
 
Fecha de Ingreso: diciembre-2003
Mensajes: 295
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: Variables globales

Me imagino que quieres usar como Cookies pero en una aplicación de escritorio.

Lo primero que se me ocurre es pasarle los valores a controles textbox ocultos.

Yo tengo la misma duda.
  #5 (permalink)  
Antiguo 02/07/2010, 12:18
 
Fecha de Ingreso: febrero-2010
Ubicación: México
Mensajes: 738
Antigüedad: 12 años, 4 meses
Puntos: 37
Respuesta: Variables globales

Bueno nose si sea una buena opción lo que dice kid pero normalmente yo asi lo hago, le paso los valores por ejemplo a Labels ocultos donde yo se que esos valores siempre estaran ahi para cuando los quiera utilizar.
  #6 (permalink)  
Antiguo 02/07/2010, 13:38
 
Fecha de Ingreso: abril-2009
Mensajes: 28
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Variables globales

yo creo que podrias hacer 2 cosas

cuando necesites pasar los valores entre los 2 form cuando hagas el cambio
pasa los los atributos por parametros
o creas una tabla extra en la bd ( que seria una solucino bastante flaite xD)

o si no podrias crear los metodos geters y seters para mantener la informacion dentro de estos metodos
y cuando vallas a restacar los datos simplemente llamas a los metodos con el return y listo
  #7 (permalink)  
Antiguo 03/07/2010, 06:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años, 7 meses
Puntos: 2658
Respuesta: Variables globales

Crea un Module en el proyecto y declara en él todas las variables que serán globales de la aplicación, como Friend.
Algo así:

Código vb.net:
Ver original
  1. Module Modulo1
  2.  
  3.    Friend variableA As Integer
  4.    Friend variableB As String
  5.  
  6. End Module

Debes recordar que sólo puede haber un módulo por proyecto o por Namespace, y que todos los elementos declarados en él (variables o métodos) son accesibles desde cualquier parte de la aplicación, pero que también conservar los valores hasta ser reinicializados.

Ahora bien, si quieres una solución intermedia, lo que podrías hacer es, en el caso que un formulario invoque a otro, crearle propiedades públicas al segundo de modo tal que sea en esas propiedades donde se almacenen los valores, y luego, al cerrarse y antes de un Dispose() simplemente recuperas del formulario hijo los valores que todavía permanecen en él.
Eso sería:
Código vb.net:
Ver original
  1. Dim oVentana As New FormIngresoDatos
  2. oVentana.ShowDialog()
  3. If oVentana.DIalogResult = DialogResult.Aceptar
  4.   varA = oVentana.Texto1
  5.   varB = oVentana.Texto2
  6. End If
Este ejemplo requiere que haya un botón en el segundo formulario que devuelva el valor Aceptar en la propiedad DialogResult de la ventana.
Texto1 y Texto2 son propiedades que podrían escribirse así:
Código vb.net:
Ver original
  1. Public Property Texto1() As String
  2.         Get
  3.             Return variableA
  4.         End Get
  5.         Set(ByVal Value As String)
  6.             variableA = Value
  7.         End Set
  8.     End Property
  9.  
  10.     Public Property Texto2() As String
  11.         Get
  12.             Return variableB
  13.         End Get
  14.         Set(ByVal Value As String)
  15.             variableB = Value
  16.         End Set
  17.     End Property
También en este caso, las variables variableA y variableB son variables locales del segundo formulario.

Al menos de esta forma seguirías respetando el paradigma POO (programación orientada a objetos).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/07/2010 a las 06:31
  #8 (permalink)  
Antiguo 03/07/2010, 12:34
 
Fecha de Ingreso: abril-2010
Ubicación: Colombia - Barranquilla
Mensajes: 66
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Variables globales

mira he tratado de hacerlo pero no funciona, tengo un formulario llamado frIngresaVendedor, por defecto los textbox a llenar estan vacios, hay un boton que dice Abrir ingreso, al presionar ahí se supone que debía usar un inpubox para ingresar un nit de usuario, si ese nit coincidia con uno en la tabla que esta hecha en mysql, pues habilita los textbox.enabled=true.

Intento hacerlo como tu lo tienes y sencillamente no puedo trabajar con los valores del segundo formulario.
  #9 (permalink)  
Antiguo 03/07/2010, 12:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años, 7 meses
Puntos: 2658
Respuesta: Variables globales

Empecemos desde el principio, por si me he perdido de algo: ¿WinForms o WebForms? ¿VB.Net o ASP.Net?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 03/07/2010, 15:21
 
Fecha de Ingreso: abril-2010
Ubicación: Colombia - Barranquilla
Mensajes: 66
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Variables globales

Hola WinForms pero ya lo solucioné en vez de generar un inputbox o abrr otro formulario, prefería con estética meter un par de textbox y un botón para hacer la respectiva validación, suprimí las variables globales que había creado.
  #11 (permalink)  
Antiguo 03/07/2010, 16:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años, 7 meses
Puntos: 2658
Respuesta: Variables globales

Bueno, es una pena que no hayamos profundizado más en el asunto, porque me da la sensación de que has elegido un parche más que una solución.
A mi entender te vas a enfrentar con problemas de este tipo (variables, funciones globales, sobrecargado de propiedades, etc.), en el futuro y tal vez sería más provechoso tratar con las soluciones ahora y no más adelante.
Aún así, me alegro que hayas podido destrabar el proyecto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 06/07/2010, 08:33
kid
 
Fecha de Ingreso: diciembre-2003
Mensajes: 295
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: Variables globales

Mi duda es... porque no usar variables globales? si es una solución válida?

El paso de valores en VB.net lo encuentro fácil... en C# se complica más la cosa.
  #13 (permalink)  
Antiguo 06/07/2010, 09:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años, 7 meses
Puntos: 2658
Respuesta: Variables globales

El uso de variables globales es más un parche que una solución. Se trata de algo fácil de hacer...y fácil de descontrolarse.

Uno de los problemas radica en que cada vez que declaras una variable global estás usando memoria de forma constante, y eventualmente puedes tener problemas de administración de la misma. Cmo C# es heredero de C y C++, el manejo de la memoria es muchísimo más fino, y algunas cosas deben resolverse a mano, y no simplemente dejando que el VS se encargue de todo.
Otro de los problemas de las variables globales está precisamente en su accesibilidad: Como se pueden usar en cualquier parte, es muy fácil perder el control de qué subproceso cambió el estado de la misma, y en ese caso depurar el problema se vuelve una tarea imposible.

Por eso es conveniente no abusar de las mismas, y por eso, precisamente, los programadores avanzados las consideran más un problema que una solución, es decir: un parche.
Usar variables globales donde puedes usar otras cosas no se considera una buena técnica de programación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 08/07/2010, 11:54
kid
 
Fecha de Ingreso: diciembre-2003
Mensajes: 295
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: Variables globales

Como hacer el paso de valores entre formularios con C# entonces? y en caso de que sean MUCHOS valores?
  #15 (permalink)  
Antiguo 08/07/2010, 17:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años, 7 meses
Puntos: 2658
Respuesta: Variables globales

Eso ya te lo respondí más arriba. Los pasos serían:

1) Creas variables locales en el formulario destino (son Private)

2) Agregas a ese formulario propiedades públicas para escribir y leer esos valores desde afuera.

3) Le agregas en el evento de cierre del formulario destino, que el mismo cambie su propiedad DialogResult a OK o Cancel, según el resultado deseado.

4) En la invocación a ese formulario lo llamas usando el método ShowDialog, eso hará que el control del proceso pase al formulario invocado.

5) Cuando se cierre ese formulario, el control del proceso volverá a la línea siguiente al ShowDialog, pero como el objeto que contiene esa ventana aun existe, puedes consultar cual es su propiedad DialogResult y si es OK, sacas los valores obtenidos en ese formulario por medio de las propiedades que le creaste adentro.

Eso es lo que explicaba en ese post. Intenta hacerlo. Al menos intentalo una vez.

Esa es una forma de programar que respeta el paradigma de Orientación a Objetos..., y por consecuencia desperdicia menos memoria y es más segura.

Cita:
y en caso de que sean MUCHOS valores?
En el caso que sean muchos valores tienes dos herramientas: Una fundamenta y otra opcional:
La primera es paciencia. Si no tienes paciencia, no te dediques al desarrollo de software.
La programación requiere mucho tiempo de desarrollo y no hay atajos si quieres hacer bien las cosas. Si tienes que escribir 12.000 líneas de código, no hay forma de evitarlo. Tendrás que escribirlas una a una y con mucha paciencia.
Yo he tenido, en ocasiones, que tirar formularios completos y clases enteras ya terminadas y probadas, simplemente porque me cambiaron un requerimiento del soft, o por darme cuenta que simplemente estaban mal planteadas y que estaba perdiendo tiempo poniendoles parches, en lugar de comenzar desde cero todo de nuevo, lo que me iba a llevar menos tiempo que debuggear malos arreglos.
La otra herramienta es la creatividad. En ocasiones todo se resume a saber cómo empaquetar los datos en objetos más complejos para no tener que hacer mcuhas propiedades.
Un objeto de una clase creada, por ejemplo, que hacer veinte propiedades.
Si tuvieses una clase Cliente, creas entonces una Propiedad ClienteNuevo donde pasas una instancia de ese objeto, y la cargas dentro del formulario hijo. Cuando retomas ese objeto desde afuera, ya viene con todos los datos...
¿Sencillo, ¿no?

Código vb.net:
Ver original
  1. Public Property ClienteNuevo() As Cliente
  2.         Get
  3.             Return varCliente ' varCliente es una variable local de clase Cliente en el form
  4.         End Get
  5.         Set(ByVal Value As Cliente)
  6.             varCliente = Value
  7.         End Set
  8.     End Property

Ejemplo de una clase llamada Cliente:
Código vb.net:
Ver original
  1. Imports Microsoft.VisualBasic
  2. Imports Microsoft.Win32
  3.  
  4. Public Class Cliente
  5.     Inherits Object
  6.  
  7. #Region " Área de variables"
  8.  
  9.     Private apellidoCliente As String
  10.     Private calle As String
  11.     Private ciudad As String
  12.     Private condIva As Int16
  13.     Private cPostal As String
  14.     Private cuit As String
  15.     Private dpto As String
  16.     Private nombreCliente As String
  17.     Private nroCliente As Integer
  18.     Private nroDomicilio As Integer
  19.     Private oEMail As String
  20.     Private piso As Integer
  21.     Private provincia As String
  22.     Private razon_Social As String
  23.     Private telefono As String
  24.  
  25.  
  26. #End Region
  27.  
  28. #Region " Área de propiedades"
  29.  
  30.     Public Property Iva() As Int16
  31.         Get
  32.             Return condIva
  33.         End Get
  34.         Set(ByVal Value As Int16)
  35.             condIva = Value
  36.         End Set
  37.     End Property
  38.  
  39.     Public Property NumCliente() As Integer
  40.         Get
  41.             Return nroCliente
  42.         End Get
  43.         Set(ByVal Value As Integer)
  44.             nroCliente = Value
  45.         End Set
  46.     End Property
  47.  
  48.     Public Property NomCliente() As String
  49.         Get
  50.             Return nombreCliente
  51.         End Get
  52.         Set(ByVal Value As String)
  53.             nombreCliente = Value
  54.         End Set
  55.     End Property
  56.  
  57.     Public Property ApeCliente() As String
  58.         Get
  59.             Return apellidoCliente
  60.         End Get
  61.         Set(ByVal Value As String)
  62.             apellidoCliente = Value
  63.         End Set
  64.     End Property
  65.  
  66.     Public Property CuitCliente() As String
  67.         Get
  68.             Return cuit
  69.         End Get
  70.         Set(ByVal Value As String)
  71.             cuit = Value
  72.         End Set
  73.     End Property
  74.  
  75.     Public Property TelCliente() As String
  76.         Get
  77.             Return telefono
  78.         End Get
  79.         Set(ByVal Value As String)
  80.             telefono = Value
  81.         End Set
  82.     End Property
  83.  
  84.     Public Property CalleCliente() As String
  85.         Get
  86.             Return calle
  87.         End Get
  88.         Set(ByVal Value As String)
  89.             calle = Value
  90.         End Set
  91.     End Property
  92.  
  93.     Public Property NroDomCliente() As Integer
  94.         Get
  95.             Return nroDomicilio
  96.         End Get
  97.         Set(ByVal Value As Integer)
  98.             nroDomicilio = Value
  99.         End Set
  100.     End Property
  101.  
  102.     Public Property DptoCliente() As String
  103.         Get
  104.             Return dpto
  105.         End Get
  106.         Set(ByVal Value As String)
  107.             dpto = Value
  108.         End Set
  109.     End Property
  110.  
  111.     Public Property PisoCliente() As Integer
  112.         Get
  113.             Return piso
  114.         End Get
  115.         Set(ByVal Value As Integer)
  116.             piso = Value
  117.         End Set
  118.     End Property
  119.  
  120.     Public Property CityCliente() As String
  121.         Get
  122.             Return ciudad
  123.         End Get
  124.         Set(ByVal Value As String)
  125.             ciudad = Value
  126.         End Set
  127.     End Property
  128.  
  129.     Public Property CpaCliente() As String
  130.         Get
  131.             Return cPostal
  132.         End Get
  133.         Set(ByVal Value As String)
  134.             cPostal = Value
  135.         End Set
  136.     End Property
  137.  
  138.     Public Property PciaCliente() As String
  139.         Get
  140.             Return provincia
  141.         End Get
  142.         Set(ByVal Value As String)
  143.             provincia = Value
  144.         End Set
  145.     End Property
  146.  
  147.     Public Property RazonSocial() As String
  148.         Get
  149.             Return razon_Social
  150.         End Get
  151.         Set(ByVal Value As String)
  152.             razon_Social = Value
  153.         End Set
  154.     End Property
  155.  
  156.     Public Property eMail() As String
  157.         Get
  158.             Return oEMail
  159.         End Get
  160.         Set(ByVal Value As String)
  161.             oEMail = Value
  162.         End Set
  163.     End Property
  164.  
  165. #End Region
  166.  
  167. End Class
Esas propiedades se usan para cargar la variable varCliente en el formulario destino, por ejemplo
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 08/07/2010 a las 17:29
  #16 (permalink)  
Antiguo 02/08/2010, 12:15
 
Fecha de Ingreso: agosto-2010
Mensajes: 1
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Variables globales

gnzsoloyo

Muy buena aportación, yo recien he enpezado con c# y lo primero que me han dicho es lo que acabas de comentar y esta bien explicado, mas bien no estaria mas con un ejemplo basico seria fenomenal, te comento como anecdota que cuando yo empece se me hacia mas facil con los ssesion pero, los dias pasaban y el sistema crecia y me di cunta que estaba abusando de esa manera y me comentaron y lei sobre variables publicas y es lo que has comentado, es mucho mas limpio, mas profecional etc, etc .. gracias nuevamente

ejemplo:

private string SOCIEDAD = string.Empty;
public string _SOCIEDAD
{
get { return this._SOCIEDAD; }
set { this._SOCIEDAD = value; }
}

nota :
Si alquien puede mejorar esto sería fenomenal y se aportaría mucho a la programación - POO- por que muchos dicen que saben programar pero se olvidan o no entienden de lo mas basico y al final dicen que el .NET no sirve o no es lo recomendado.

Etiquetas: globales, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 18:57.