Ir al contenido


Foto

variables globales


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

#1 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 26 mayo 2009 - 10:47

saludos a todos Masters

tengo una duda

tengo lo que creo ( asegun yo ) es una variable global


delphi
  1.   private
  2.     { Private declarations }
  3.   public
  4.  
  5. idcuenta : string;
  6.  
  7.     { Public declarations }
  8.   end;
  9.  
  10. var
  11.   Form1: TForm1;
  12.  
  13. implementation



pero si trato de tomar ese valor desde otra form
me manda nada
:s



delphi
  1. label1.caption:=form1.idcuenta ;




en que estoy mal ???

ya puse el



delphi
  1. implementation
  2.  
  3. uses Unit1;







  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 26 mayo 2009 - 11:11

Hola

A la variable idcuenta le has asignado algun valor antes de mostrar la Form2 ?

Si es así­ muestranos como lo estas haciendo.

Salud OS

  • 0

#3 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 26 mayo 2009 - 11:11

Mas que una variable global, es un miembro publico de la clase TForm1, al parecer todo va bien; muestranos un poco mas del llamado "label1.caption:=form1.idcuenta;" y dónde asignas un valor a form1.idcuenta.
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 26 mayo 2009 - 11:12

:D :D :D

2 segundos bro, 2 segundos hacen la diferencia :p

Salud OS
  • 0

#5 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 26 mayo 2009 - 11:25

el valor lo asigno con
idcuenta:=Zquery1.Fields[0].text ;

luego verifico que este disponible por medio de un
label1.caption:= idcuenta; ( en el form 1)
( mi logica indica que si lo toma en el form 1 lo deferia poner el en form 3 no )


y el

label1.caption:=form1.idcuenta ;
esta en el create de la form3
( procedure TForm3.FormCreate(Sender: TObject); )



  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 mayo 2009 - 11:35

Hola arroyoj,
¿Te aseguraste de que desde el dataset estés extrayendo un valor distinto a nulo? En una de esas, el registro leí­do tiene el campo vací­o.

No estarí­a demás poder ver más del código que tienes. Te agradecerí­a que expusieras el código de las units involucradas.

Saludos,
  • 0

#7 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 26 mayo 2009 - 11:41

Unit 1



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5.  
  6.  
  7. uses
  8.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  9.   Dialogs, StdCtrls, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset,
  10.   ZConnection, Inifiles, ComCtrls, TabNotBk, Grids, Buttons;
  11.  
  12. type
  13.   TForm1 = class(TForm)
  14.     Button1: TButton;
  15.     Edit1: TEdit;
  16.     Button2: TButton;
  17.     ZQuery1: TZQuery;
  18.     Button3: TButton;
  19.     ComboBox1: TComboBox;
  20.     Label31: TLabel;
  21.     Label46: TLabel;
  22.     Label32: TLabel;
  23.     Label47: TLabel;
  24.     Label33: TLabel;
  25.     Label48: TLabel;
  26.     Label34: TLabel;
  27.     Label49: TLabel;
  28.     Label35: TLabel;
  29.     Label50: TLabel;
  30.     Label36: TLabel;
  31.     Label51: TLabel;
  32.     Label37: TLabel;
  33.     Label52: TLabel;
  34.     Label38: TLabel;
  35.     Label53: TLabel;
  36.     Label39: TLabel;
  37.     Label54: TLabel;
  38.     Label40: TLabel;
  39.     Label55: TLabel;
  40.     Label41: TLabel;
  41.     Label56: TLabel;
  42.     Label42: TLabel;
  43.     Label57: TLabel;
  44.     Label43: TLabel;
  45.     Label58: TLabel;
  46.     Label44: TLabel;
  47.     Label59: TLabel;
  48.     Label45: TLabel;
  49.     Label60: TLabel;
  50.     ZConnection1: TZConnection;
  51.     BitBtn1: TBitBtn;
  52.     BitBtn2: TBitBtn;
  53.     Label1: TLabel;
  54.     procedure Button2Click(Sender: TObject);
  55.     procedure Button3Click(Sender: TObject);
  56.     procedure FormCreate(Sender: TObject);
  57.  
  58.     procedure BitBtn1Click(Sender: TObject);
  59.     procedure Button1Click(Sender: TObject);
  60.     procedure BitBtn2Click(Sender: TObject);
  61.  
  62.  
  63.  
  64.   private
  65.     { Private declarations }
  66.   public
  67.  
  68. idcuenta : string;
  69.  
  70.     { Public declarations }
  71.   end;
  72.  
  73. var
  74.   Form1: TForm1;
  75.  
  76. implementation
  77.  
  78. uses unit2, unit3  ;
  79.  
  80.  
  81. {$R *.dfm}
  82.  
  83. procedure TForm1.Button2Click(Sender: TObject);
  84. var trabajador : string ;
  85. begin
  86.  
  87.     IF edit1.text= '' then
  88.       begin
  89.         Application.MessageBox(
  90.         pchar(  'Proporciona el numero de trabajador'),
  91.         pchar('Error'),
  92.         0+48+0)  ;
  93.       end
  94.     ELSE
  95.         begin
  96.         trabajador := edit1.Text;
  97.         ZQuery1.SQL.Text:='SELECT DISTINCT cuenta.nombre, cuenta.no_credito FROM cuenta WHERE cuenta.folio LIKE  "%' +
  98.                             trabajador +
  99.                             '" ORDER BY cuenta.nombre ASC' ;
  100.         Zquery1.Open;
  101.         While not ZQuery1.Eof do
  102.         begin
  103.         ComboBox1.Items.add(ZQuery1.Fields[1].Text );
  104.         ZQuery1.Next ;
  105.         Label48.Caption := (ZQuery1.Fields[0].Text);
  106.         Button2.enabled:=false;
  107.         button3.Enabled:=true;
  108.         end;
  109.         Zquery1.Close ;
  110.         button1.enabled:=false ;
  111.         button2.enabled:= false ;
  112.         button3.enabled:= true  ;
  113.         end
  114. end;
  115.  
  116. procedure TForm1.Button3Click(Sender: TObject);
  117. var trabajador, credito, query : string;
  118. begin
  119. IF Combobox1.text='' then
  120.   Application.MessageBox(
  121.   pchar(  'Selecciona un credito'),
  122.   pchar('Error'),
  123.   0+16+0)
  124. ELSE begin
  125.         Zquery1.close;
  126.         trabajador:=edit1.text;
  127.         credito:=Combobox1.text;
  128.         query := 'SELECT cuenta.id_cuenta, cuenta.folio, cuenta.no_credito, cuenta.nombre, cuenta.rfc,' +
  129.                 'cuenta.colonia, cuenta.domicilio, cuenta.ciudad, cuenta.cp, cuenta.tel_domicilio_1, '+
  130.                 'cuenta.tel_domicilio_2, cuenta.tel_celular, cuenta.comercio, `status`.`status`, saldo.saldo, ' +
  131.                 'cuenta.fecha_1 FROM cuenta Inner Join `status` ON cuenta.id_status = '  +
  132.                 '`status`.id_status Inner Join saldo ON cuenta.id_cuenta = saldo.id_cuenta WHERE cuenta.folio =  "' +
  133.                   trabajador +'" AND cuenta.no_credito =  "' + credito +
  134.                 ' " GROUP BY cuenta.id_cuenta ORDER BY saldo.fecha ASC';
  135.         Zquery1.SQL.Text:= query ;
  136.         Zquery1.Open ;
  137.         if ZQuery1.RecordCount > 0 then
  138.             begin
  139.               idcuenta:=Zquery1.Fields[0].text ;
  140.               label1.caption:= idcuenta;
  141.               label46.caption:=Zquery1.Fields[1].text ;
  142.               label47.caption:=Zquery1.Fields[2].text ;
  143.               label48.caption:=Zquery1.Fields[3].text ;
  144.               label49.caption:=Zquery1.Fields[4].text ;
  145.               label50.caption:=Zquery1.Fields[5].text ;
  146.               label51.caption:=Zquery1.Fields[6].text ;
  147.               label52.caption:=Zquery1.Fields[7].text ;
  148.               label53.caption:=Zquery1.Fields[8].text ;
  149.               label54.caption:=Zquery1.Fields[9].text ;
  150.               label55.caption:=Zquery1.Fields[10].text ;
  151.               label56.caption:=Zquery1.Fields[11].text ;
  152.               label58.caption:=Zquery1.Fields[12].text ;
  153.               label60.caption:=Zquery1.Fields[13].text ;
  154.               label59.caption:=Zquery1.Fields[14].text ;
  155.               label57.caption:=Zquery1.Fields[15].text ;
  156.             end;
  157.     end;
  158.     Zquery1.close ;
  159.     bitbtn1.enabled:= true;
  160. end;
  161.  
  162. procedure TForm1.FormCreate(Sender: TObject);
  163. var capt : string ;
  164. catalog, database, hostname, password, protocol, user : string  ;
  165. inifile: TInifile ;
  166. const saltolinea = #10#13 ;
  167. begin
  168. capt := 'Nueva' + saltolinea + 'Busqueda';
  169. bitbtn1.caption:=capt;
  170. Inifile := TInifile.Create(ExtractFilePath(Application.ExeName)+'mysql.ini');
  171. catalog:=Inifile.ReadString('DB','catalog','');
  172. database:=Inifile.ReadString('DB','database','');
  173. hostname:=Inifile.ReadString('DB','hostname','');
  174. password:=Inifile.ReadString('DB','password','');
  175. protocol:=Inifile.ReadString('DB','protocol','');
  176. user:=Inifile.ReadString('DB','user','');
  177. zconnection1.catalog:= catalog;
  178. zconnection1.database:=database;
  179. zconnection1.hostname:=hostname;
  180. zconnection1.password:=password;
  181. zconnection1.protocol:=protocol;
  182. zconnection1.user:=user;
  183. end;
  184.  
  185.  
  186.  
  187. procedure TForm1.BitBtn1Click(Sender: TObject);
  188. begin
  189. button2.enabled:=true ;
  190. button3.enabled:=false ;
  191. button1.enabled:= true ;
  192. bitbtn1.enabled:= false;
  193. Edit1.text:='';
  194. ComboBox1.items.clear ;
  195. combobox1.text:='' ;
  196. label46.caption :='' ;
  197. label47.caption:='' ;
  198. label48.caption:='' ;
  199. label49.caption:='' ;
  200. label50.caption:='' ;
  201. label51.caption:='' ;
  202. label52.caption:='' ;
  203. label53.caption:='' ;
  204. label54.caption:='' ;
  205. label55.caption:='' ;
  206. label56.caption:='' ;
  207. label57.caption:='' ;
  208. label58.caption:='' ;
  209. label59.caption:='' ;
  210. label60.caption:='' ;
  211. end;
  212.  
  213. procedure TForm1.Button1Click(Sender: TObject);
  214. begin
  215. form2.showmodal
  216. end;
  217.  
  218. procedure TForm1.BitBtn2Click(Sender: TObject);
  219. begin
  220. form3.show
  221. end;
  222.  
  223. end.





Unit 3



delphi
  1. unit Unit3;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, Inifiles, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset,
  8.   ZConnection, Grids, DBGrids, StdCtrls;
  9.  
  10. type
  11.   TForm3 = class(TForm)
  12.     DataSource1: TDataSource;
  13.     DBGrid1: TDBGrid;
  14.     ZConnection1: TZConnection;
  15.     ZQuery1: TZQuery;
  16.     Label1: TLabel;
  17.     procedure FormCreate(Sender: TObject);
  18.   private
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.   end;
  23.  
  24. var
  25.   Form3: TForm3;
  26.  
  27. implementation
  28.  
  29. uses Unit1;
  30.  
  31. {$R *.dfm}
  32.  
  33. procedure TForm3.FormCreate(Sender: TObject);
  34.  
  35. var catalog, database, hostname, password, protocol, user : string  ;
  36. inifile: TInifile ;
  37.  
  38. begin
  39. Inifile := TInifile.Create(ExtractFilePath(Application.ExeName)+'mysql.ini');
  40. catalog:=Inifile.ReadString('DB','catalog','');
  41. database:=Inifile.ReadString('DB','database','');
  42. hostname:=Inifile.ReadString('DB','hostname','');
  43. password:=Inifile.ReadString('DB','password','');
  44. protocol:=Inifile.ReadString('DB','protocol','');
  45. user:=Inifile.ReadString('DB','user','');
  46. zconnection1.catalog:= catalog;
  47. zconnection1.database:=database;
  48. zconnection1.hostname:=hostname;
  49. zconnection1.password:=password;
  50. zconnection1.protocol:=protocol;
  51. zconnection1.user:=user;
  52.  
  53.  
  54. label1.caption:=form1.idcuenta ;
  55.  
  56.  
  57. end;
  58.  
  59. end.



si verifico que el valor de la variable no sea nulo
puse una label en el form 1 que me muestra el valor
precisamente para verificar
y la idea de ponerlo en el unit 3 en un label
es lo mismo
realmente lo quiero para hacer un query
por eso notaran que en el form 3 ya tengo
el conection el query el datasource y el dbgrid

pero mejor primero vreifico que si este pasando el valor corectamente

GRACIAS


  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 26 mayo 2009 - 11:49

Hola

Tres cosas,

1. ¿Estas ejecutando el boton3 antes del BitBtn2 ?
2. ¿Existen datos en la consulta que haces?
3. Usa el evento OnShow de la forma no el evento OnCreate para colocar idcuenta a label1.caption.

Salud OS

PD, me parece que la tercera es la que te va a funcionar, sin dejar de ver los puntos 1 y 2


  • 0

#9 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 26 mayo 2009 - 12:23

ok si
1.- ejecuto primero el boton 3 luego el BitBtn2
2.- si existen datos me los despliega en pantalla y el valos que kiero esta en el label 1
3.-
      asi es uasndo el evento OnShow ya pasa el dato

GRACIAS A TODOS


  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 mayo 2009 - 12:42

Disculpen mi atraso, estaba viendo otros hilos...

Veo que egostar ya se habí­a encargado y dió perfectamente en el clavo.

No estarí­a demás alguna limpieza del código. Algunas que otras instrucciones se pueden reducir.

Saludos,
  • 0

#11 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 26 mayo 2009 - 01:03

Disculpen mi atraso, estaba viendo otros hilos...

Veo que egostar ya se habí­a encargado y dió perfectamente en el clavo.

No estarí­a demás alguna limpieza del código. Algunas que otras instrucciones se pueden reducir.

Saludos,



como cuales master iluminame
  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 mayo 2009 - 01:18

Hola arroyoj,

Y... esos Labelxx.Caption.Text := ''; y esos Labelxx.Caption.Text := zquery.Fields[yy]... se pueden reemplazar por un ciclo for y valiendose de  FindComponents() ir iterando label a label.

Ahorita no tengo Delphi mano, pero recuerdo que algo sobre esto ya se ha dicho en otras ocasiones. Ve lo que si dijo aquí­ y aquí­.

Saludos,
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 26 mayo 2009 - 01:25

Hola

Solo agregar que el uso de los eventos OnCreate y no OnShow es el clásico error de lógica que cometemos los novatos y te explico el porque.

Normalmente acostumbramos a crear proyectos con las opciones predeterminadas de Delphi, donde las formas se auto-crean, por lo tanto cuando utilizas el evento OnCreate de la forma, lo hace solo cuando el proyecto es ejecutado por primera vez y nunca mas, en cambio cuando utilizas el evento OnShow, cada vez que la forma es mostrada realiza la actualización de variables que estas pasando.

Lo ideal es dejar solo la forma principal como Auto-Create y las demas formas que utilices las "mueves" a la sección de formas disponibles, creo que serí­a bueno crear un tutorial para novatos donde se explique a detalle los procedimientos para desarrollar aplicaciones con la creación de formas en tiempo de ejecución.

Quien dijo yo????? :D :D :D

Salud OS


  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 mayo 2009 - 01:32

(...)creo que serí­a bueno crear un tutorial para novatos donde se explique a detalle los procedimientos para desarrollar aplicaciones con la creación de formas en tiempo de ejecución.

Quien dijo yo????? :D :D :D

Salud OS

El chirlo arriba de la nuca se sintió hasta aquí­ amigo.
Ya va jefecito.... espere un tantito... chei :D

Saludos,
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 26 mayo 2009 - 01:35

El chirlo arriba de la nuca se sintió hasta aquí­ amigo.
Ya va jefecito.... espere un tantito... chei :D

Saludos,


Ah que bien, asi me gusta muchachito, ya sabe que tiene el foro de borradores a su disposicion para que no se le olvide nada y lo publique cuando crea que ya quedo perfecto :D

Salud OS
  • 0

#16 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 26 mayo 2009 - 03:38

Para optimizar la parte de los labels, pudieras usar esto para limpiarles el caption



delphi
  1. var i :Integer;
  2.  
  3. begin
  4.   for i := 0 to Form1.ComponentCount - 1 do
  5.   begin
  6.       if Form1.Components[i] is TLabel then
  7.         TLabel(Form1.Components[i]).Caption:='';
  8.   end;
  9.  
  10. end;



Y para asignarle los valores podrias ponerlo tambien en un ciclo, y usar la variable de control en el nombre del label

  • 0

#17 RaCerLokO

RaCerLokO

    Member

  • Miembros
  • PipPip
  • 28 mensajes
  • LocationMexico

Escrito 08 julio 2009 - 04:49

Una pregunta para usar las variables globales deben ser variables de la Forma?, o en que parte del programa deben declararse?
  • 0

#18 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 08 julio 2009 - 07:21

Una pregunta para usar las variables globales deben ser variables de la Forma?, o en que parte del programa deben declararse?


Eso va a depende en gran parte de lo que necesites, las variables globales pueden ser a nivel de cada objeto dentro de la unidad (global para un objeto especifico) por lo cual deben declararse dentro de la parte private o public de dicho objeto

Tambien puedes utilizar variables globales en toda la unit para lo cual esta la seccion VAR que se introduce antes del implemntation.
  • 0

#19 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 julio 2009 - 09:37

Una pregunta para usar las variables globales deben ser variables de la Forma?, o en que parte del programa deben declararse?


Teóricamente, cuando uno hace algo como:



delphi
  1. Unit Unit1;
  2. ...
  3. var Form1: TForm1;
  4.     MiVariable: MiTipo;
  5. ...



Está definiendo una variable local dentro de la unidad Unit1.

Una variable local se convierte en global en cuanto es accedida desde otras unidades (y por tanto es de visibilidad pública).

Cuando uno hace algo como:



delphi
  1. TForm1 = class(TForm)
  2. ....
  3. public
  4.   MiVariable: MiTipo;
  5. end;
  6. ....



Lo que hace es definir un campo o atributo público a la clase TForm1. No se trata de una variable global. Se podrá hacer uso de ésta solamente cuando se tenga un objeto o instancia de dicha clase. Una vez que se libere la instancia u objeto, cualquier intento por hacer uso de MiVariable llevará a una excepción.

Entonces, necesariamente una variable global no debe pertenecer a una forma (mejor dicho, clase descendiente de TForm) sino a una unidad y tener una visibilidad pública.

Si existe o no alguna clase, tipo, o lo que fuese en la unidad en donde se defina la variable es otra cosa.
Hay quienes gustan destinar una unidad UGlobales en donde tienen de forma "suelta" sus variables globales.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.