Ir al contenido


Foto

[RESUELTO] variables globales o publicas ¿como?


  • Por favor identifícate para responder
16 respuestas en este tema

#1 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 18 mayo 2011 - 11:26

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 :embarrassed:

Gracias una vez más.

Marc Miralles
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

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.
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 18 mayo 2011 - 11:41

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,
  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

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 (y)

Saludox ! :)
  • 0

#5 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

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



delphi
  1. Unit funciones;
  2.  
  3. {$mode objfpc}
  4.  
  5. Interface
  6.  
  7. Uses
  8.   Classes, Sysutils;
  9.  
  10. var
  11. cUsuario: string;
  12.  
  13. Implementation
  14.  
  15. End.



y luego en el formulario de acceso:


delphi
  1. if Qusuariospassword.Value = txtContrasena.text then
  2.               begin
  3.                 lblComentariosConexion.Caption:= 'Conexión Establecida:      USUARIO ACTIVO: '+ txtUsuario.text;
  4.                 lblComentariosConexion.Caption:= lblComentariosConexion.Caption + '          NIVEL ACCESO: ' + IntToStr(Qusuariosaccesogeneral.Value);
  5.  
  6.                 // Inicio variables globales usuario.
  7.                 funciones.cUsuario:= Qusuarioslogin.value;
  8.                 //nNivel:= Qusuariosaccesogeneral.value;
  9.  
  10.               // Aqui tiene el valor bien asignado!!!!
  11.                 label1.Caption:= funciones. cUsuario;
  12.  
  13.                 QEmpresas.First;
  14.                 while not QEmpresas.EOF do
  15.                       begin
  16.                       txtEmpresa.Items.Add(Qempresasempresa.Value);
  17.                       QEmpresas.Next;
  18.                       end;
  19.                 txtEmpresa.Enabled:= true;
  20.               End                     



y luego en el de pacientes:


delphi
  1. procedure TFPacientes.FormCreate(Sender: TObject);
  2. var
  3.   cSQL:string  ;
  4. begin
  5.         // Activar datos usuario / Empresa:
  6.         FPacientes.Caption:= ' UNIVERSE GESTIÓN DE PACIENTES    - USUARIO ACTIVO : '+ funciones.cUsuario;
  7.         // 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....... :shocked:
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 18 mayo 2011 - 12:02

Una pregunta: esa variable sólo existe ya en la unidad Funciones ?


De lo contrario estás sustituyendo su valor en cada formulario...


Saludox ! :)
  • 0

#7 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 18 mayo 2011 - 12:26

En realidad yo también utilizo así las variables globales y nunca he tenido problemas de que me pierdan el valor.

Ahora mismo no se me ocurre donde puedes tener el problema, pero sí se me viene algo a la cabeza, te lo comento.

Salut.
  • 0

#8 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

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......)
  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 18 mayo 2011 - 02:40

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 ! :)
  • 0

#10 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

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


  • 0

#11 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 18 mayo 2011 - 03:05

Así es, el punto es que cuando usas la variable en el formulario de pacientes, aún no tiene el valor, ese se le asigna después, es decir, no lo pierde, simplemente aún no lo tiene...


Intenta usando la variable en el OnActivate (existe éste evento en lazarus ?  ^o| )de tu forma de pacientes y nos cuentas (y)


Saludox ! :)
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

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 ! :)
  • 0

#13 German

German

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 19 mayo 2011 - 08:50

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
  1. unit Unit2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils;
  9.  
  10. function GetPropiedad:string;
  11. procedure SetPropiedad(const value:string);
  12.  
  13. property Propiedad:string read GetPropiedad write SetPropiedad;
  14.  
  15. implementation
  16.  
  17. var
  18.   prop:string;
  19.  
  20. function GetPropiedad:string;
  21. begin
  22.   Result := prop;
  23. end;
  24.  
  25. procedure SetPropiedad(const value:string);
  26. begin
  27.   prop := value;
  28. end;
  29.  
  30. end.



  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 mayo 2011 - 11:10

Usar variables globales puede ser algo peligroso,

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.
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.

no olviden que pueden usar propiedades de unidades asi como se usan las propiedades de las clases:



delphi
  1. unit Unit2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils;
  9.  
  10. function GetPropiedad:string;
  11. procedure SetPropiedad(const value:string);
  12.  
  13. property Propiedad:string read GetPropiedad write SetPropiedad;
  14.  
  15. implementation
  16.  
  17. var
  18.   prop:string;
  19.  
  20. function GetPropiedad:string;
  21. begin
  22.   Result := prop;
  23. end;
  24.  
  25. procedure SetPropiedad(const value:string);
  26. begin
  27.   prop := value;
  28. end;
  29.  
  30. end.



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?

Saludos,
  • 0

#15 German

German

    Member

  • Miembros
  • PipPip
  • 40 mensajes

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.

  • 0

#16 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 23 mayo 2011 - 11:44


Usar variables globales puede ser algo peligroso,

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.
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.

¡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.

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
  • 0

#17 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

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
  1. unit Unit2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils;
  9.  
  10. function GetPropiedad:string;
  11. procedure SetPropiedad(const value:string);
  12.  
  13. property Propiedad:string read GetPropiedad write SetPropiedad;
  14.  
  15. implementation
  16.  
  17. var
  18.   prop:string;
  19.  
  20. function GetPropiedad:string;
  21. begin
  22.   Result := prop;
  23. end;
  24.  
  25. procedure SetPropiedad(const value:string);
  26. begin
  27.   prop := value;
  28. end;
  29.  
  30. end.




¡¡¡¡¡LEÑEEEE!!! Cuanto me falta por aprender todavía. SNIF,SNIF!!!!! :(


  • 0




IP.Board spam blocked by CleanTalk.