[RESUELTO] variables globales o publicas ¿como?
#1
Escrito 18 mayo 2011 - 11:26
Otra de mis novatadas,
¿cómo defino una variable que pueda usar en todo el programa, como por ejemplo nNivelUsuario
He probado a ponerla en el apartado de var en la Unit que luego llama al resto de formularios y sin éxito. Seguro que será fácil hacerlo, pero no encuentro la forma
Gracias una vez más.
Marc Miralles
#2
Escrito 18 mayo 2011 - 11:34
Guenas comunidad:
Otra de mis novatadas,
¿cómo defino una variable que pueda usar en todo el programa, como por ejemplo nNivelUsuario
He probado a ponerla en el apartado de var en la Unit que luego llama al resto de formularios y sin éxito. Seguro que será fácil hacerlo, pero no encuentro la forma
Gracias una vez más.
Marc Miralles
Hola Marc.
Sí, puedes definirla en la sección Public de la Unit principal que abre el resto de formularios.
Si por poner un ejemplo, ese formulario principal se asigna a la variable frmPrincipal, y la Unit se llama Principal. Entonces recuerda que donde quieras usarla tienes que declarar Uses Principal, y para acceder a la variable tienes que direccionarla como : frmPrincipal.nNivelUsuario
NOTA: Yo prefiero poner las variables globales en el DataModule general (donde defino la conexión a la base de datos, y las consultas que se utilizan muy a menudo), pero el funcionamiento es el mismo.
Salut.
#3
Escrito 18 mayo 2011 - 11:41
Otra sana opción, que no deja de ser la misma pero con otro "toque", es la de definir una unidad en la que estén declaradas todas la variables, tipos, procedimientos y/o funciones globales o generales a todo. Luego sólo resta agregar en la sección uses de las unidades interesadas en emplear algo de esta unidad UGlobables, por darle algún nombre.
Saludos,
#4
Escrito 18 mayo 2011 - 11:50
Hola,
Otra sana opción, que no deja de ser la misma pero con otro "toque", es la de definir una unidad en la que estén declaradas todas la variables, tipos, procedimientos y/o funciones globales o generales a todo. Luego sólo resta agregar en la sección uses de las unidades interesadas en emplear algo de esta unidad UGlobables, por darle algún nombre.
Saludos,
Coincido con Delphius, así es como yo lo hago.... y funciona perfectamente bien
Saludox !
#5
Escrito 18 mayo 2011 - 11:57
Hola,
Otra sana opción, que no deja de ser la misma pero con otro "toque", es la de definir una unidad en la que estén declaradas todas la variables, tipos, procedimientos y/o funciones globales o generales a todo. Luego sólo resta agregar en la sección uses de las unidades interesadas en emplear algo de esta unidad UGlobables, por darle algún nombre.
Saludos,
Esto es lo que he hecho, pero la variable pierde su valor de un formulario a otro
Unit funciones; {$mode objfpc} Interface Uses Classes, Sysutils; var cUsuario: string; Implementation End.
y luego en el formulario de acceso:
if Qusuariospassword.Value = txtContrasena.text then begin lblComentariosConexion.Caption:= 'Conexión Establecida: USUARIO ACTIVO: '+ txtUsuario.text; lblComentariosConexion.Caption:= lblComentariosConexion.Caption + ' NIVEL ACCESO: ' + IntToStr(Qusuariosaccesogeneral.Value); // Inicio variables globales usuario. funciones.cUsuario:= Qusuarioslogin.value; //nNivel:= Qusuariosaccesogeneral.value; // Aqui tiene el valor bien asignado!!!! label1.Caption:= funciones. cUsuario; QEmpresas.First; while not QEmpresas.EOF do begin txtEmpresa.Items.Add(Qempresasempresa.Value); QEmpresas.Next; end; txtEmpresa.Enabled:= true; End
y luego en el de pacientes:
procedure TFPacientes.FormCreate(Sender: TObject); var cSQL:string ; begin // Activar datos usuario / Empresa: FPacientes.Caption:= ' UNIVERSE GESTIÓN DE PACIENTES - USUARIO ACTIVO : '+ funciones.cUsuario; // AQUI HA PERDIDO EL VALOR Y DEVUELVE ''
Por supuesto en principal y en pacientes funciones está en el uses
¿alguna otra idea o ayuda? No, si lo que no me pase a mi.......
#6
Escrito 18 mayo 2011 - 12:02
De lo contrario estás sustituyendo su valor en cada formulario...
Saludox !
#7
Escrito 18 mayo 2011 - 12:26
Ahora mismo no se me ocurre donde puedes tener el problema, pero sí se me viene algo a la cabeza, te lo comento.
Salut.
#8
Escrito 18 mayo 2011 - 02:00
Una pregunta: esa variable sólo existe ya en la unidad Funciones ?
De lo contrario estás sustituyendo su valor en cada formulario...
Saludox !
En principio solo debería existir allí, ya que es lógico que si existe en otros formularios sea substituida. De todos modos voy a seguir el código, no sea que esté también en algún otro lugar definida y esto sea lo que me fastidia todo. (no debería estar repetida, pero como en esto de la Informática a veces hay brujas......)
#9
Escrito 18 mayo 2011 - 02:40
El create de tu forma de pacientes no se está ejecutando antes de que la variable tome su valor en el formulario de acceso ???
Saludox !
#10
Escrito 18 mayo 2011 - 02:45
Otra pregunta:
El create de tu forma de pacientes no se está ejecutando antes de que la variable tome su valor en el formulario de acceso ???
Saludox !
YEAAAAA!!!! Diste en el clavo. o sea.... ¿Hay que dar el valor a una variable global antes de crear el form que la va a usar?
Saludos
#11
Escrito 18 mayo 2011 - 03:05
Intenta usando la variable en el OnActivate (existe éste evento en lazarus ? )de tu forma de pacientes y nos cuentas
Saludox !
#12
Escrito 18 mayo 2011 - 03:08
.....
YEAAAAA!!!! Diste en el clavo. o sea.... ¿Hay que dar el valor a una variable global antes de crear el form que la va a usar?
Saludos
Mmmmm, pues más bien la regla sería asignar el valor de la variable antes de usarla no importa en qué momento sea, mientras sea antes de que sea usada... en este caso como te comento, el código donde la estás usando se ejecuta antes de la carga del valor de la variable, es por eso que no lo veías...
Saludox !
#13
Escrito 19 mayo 2011 - 08:50
unit Unit2; {$mode objfpc}{$H+} interface uses Classes, SysUtils; function GetPropiedad:string; procedure SetPropiedad(const value:string); property Propiedad:string read GetPropiedad write SetPropiedad; implementation var prop:string; function GetPropiedad:string; begin Result := prop; end; procedure SetPropiedad(const value:string); begin prop := value; end; end.
#14
Escrito 19 mayo 2011 - 11:10
Si vamos a caso, una baja cohesión y/o un alto acoplamiento es peligroso; como así el tener muchas clases poco o nada relacionadas ó el de tener pocas clases muy relacionadas.Usar variables globales puede ser algo peligroso,
Pero a estos principios de dualidad no podemos evitar... son dos caras de la misma moneda.
Decir que las variables globales son peligrosas, porque si me parece un razonamiento muy endeble.
Serán ta peligrosas como no se las controle o se las use descaradamente.
Es la primera vez que veo eso. ¿Realmente es posible disponer de un property fuera de una clase? Nunca lo he probado ni se me hubiera ocurrido. ¿Realmente compila? ¿A partir de que versión de Delphi y/o Lázarus es posible?no olviden que pueden usar propiedades de unidades asi como se usan las propiedades de las clases:
delphi
unit Unit2; {$mode objfpc}{$H+} interface uses Classes, SysUtils; function GetPropiedad:string; procedure SetPropiedad(const value:string); property Propiedad:string read GetPropiedad write SetPropiedad; implementation var prop:string; function GetPropiedad:string; begin Result := prop; end; procedure SetPropiedad(const value:string); begin prop := value; end; end.
Saludos,
#15
Escrito 20 mayo 2011 - 08:01
Si vamos a caso, una baja cohesión y/o un alto acoplamiento es peligroso; como así el tener muchas clases poco o nada relacionadas ó el de tener pocas clases muy relacionadas.
Pero a estos principios de dualidad no podemos evitar... son dos caras de la misma moneda.
Nadie dijo que no.
Serán ta peligrosas como no se las controle o se las use descaradamente.
Justamente, a traves de propiedades de unidades.
Decir que las variables globales son peligrosas, porque si me parece un razonamiento muy endeble.
Endeble pero cierta, y totalmente evitable.
Es la primera vez que veo eso. ¿Realmente es posible disponer de un property fuera de una clase? Nunca lo he probado ni se me hubiera ocurrido. ¿Realmente compila? ¿A partir de que versión de Delphi y/o Lázarus es posible?
Solo para fpc, creo que desde que uso el fpc, version 0.99 mas o menos.
#16
Escrito 23 mayo 2011 - 11:44
¡Evidentemente!; estoy de acuerdo con Delphius. Todo es relativo, está claro que si creo una variable global que sea 'a' y que la puedo usar para mil cosas distintas es fácil 'cagarla' y que no devuelva el valor que uno se espera, pero si la definición de la variable global es clara p.ej: 'cNombreUsuarioActivo'...... es más difícil asignarle una valor que no le corresponda.
Si vamos a caso, una baja cohesión y/o un alto acoplamiento es peligroso; como así el tener muchas clases poco o nada relacionadas ó el de tener pocas clases muy relacionadas.
Usar variables globales puede ser algo peligroso,
Pero a estos principios de dualidad no podemos evitar... son dos caras de la misma moneda.
Decir que las variables globales son peligrosas, porque si me parece un razonamiento muy endeble.
Serán ta peligrosas como no se las controle o se las use descaradamente.
Así que creo que lo importante es hacer un código claro y con eso se evitan muchos problemas y más aún si son varios los programadores o pueden serlo.
Saludos
Marc Miralles
#17
Escrito 23 mayo 2011 - 11:49
Usar variables globales puede ser algo peligroso, no olviden que pueden usar propiedades de unidades asi como se usan las propiedades de las clases:
delphi
unit Unit2; {$mode objfpc}{$H+} interface uses Classes, SysUtils; function GetPropiedad:string; procedure SetPropiedad(const value:string); property Propiedad:string read GetPropiedad write SetPropiedad; implementation var prop:string; function GetPropiedad:string; begin Result := prop; end; procedure SetPropiedad(const value:string); begin prop := value; end; end.
¡¡¡¡¡LEÑEEEE!!! Cuanto me falta por aprender todavía. SNIF,SNIF!!!!!