Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2010
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Duda con inicialización de variables

Hola Estimados.

Mucho tiempo que no posteaba, ahora retomando un proyecto en delphi me sale la duda con una variable pública que tengo en un formulario.

Este es el código donde seteo esa variable.



Código Delphi [-]
var
v_Id_Ajuste : Integer;
Frm_IngAjuste : TFrm_IngAjuste;
begin
if ZQry_Ajustes.RecordCount > 0 then
begin
v_Id_Ajuste := ZQry_Ajustes.FieldValues['id_ajuste'];
Frm_IngAjuste := TFrm_IngAjuste.Create(nil);
Frm_IngAjuste.f_Id_Ajuste := v_Id_Ajuste;
Frm_IngAjuste.ShowModal ;
end;
end;


Como ven hasta acá todo perfecto. Pero mi duda es al momento que el formulario donde utilizaré esta variable no se inicializa mediante el evento onshow.

Código Delphi [-]

procedure TFrm_IngAjuste.FormShow (Sender: TObject);
begin
LimpiarCampos;
dt_Fecha.Text := vg_fechasys;
Edt_Bodega.Text := vg_nombodega;
ZQry_Ajuste.ParamByName('p_id_ajuste').AsInteger := f_Id_Ajuste;
ZQry_Ajuste.Open;
if ZQry_Ajuste.RecordCount > 0 then
begin
Edt_NroAjuste.Text := IntToStr(f_Id_Ajuste);
Edt_Fecha.Text := ZQry_Ajuste.FieldValues['fecha'];
Edt_Bodega.Text := ZQry_Ajuste.FieldValues['nom_bod'];
ZQry_AjusteDet.ParamByName('p_id_bodega').AsInteger := vg_idbodega;
ZQry_AjusteDet.ParamByName('p_id_ajuste').AsInteger := f_Id_Ajuste;
ZQry_AjusteDet.Active := False;
ZQry_AjusteDet.Active := True;
end;
 
Edt_NroAjuste.Text := IntToStr(f_Id_Ajuste);
end;


La variable f_id_Ajuste que es de tipo integer y publica del formulario llega en 0, sin embargo en el evento onpaint llega con valor.



Qué evento más podría usar, el onpaint no me sirve mucho, lo ideal era el onshow, pero por lo visto no se inicializan en ese momento dicha variables públicas.

Gracias..

Saludos .-
__________________
No todo es como parece ser...
Responder Con Cita
  #2  
Antiguo 31-10-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola lucasart.

Si te interpreto bién y la varible f_id_Ajuste es pública al segundo Form, deberías tener el valor en el Evento OnShow del Form2 ya séa declarada como variable global o en la sección public de Form2.

Hice una prueba simple y obtengo el valor sin problemas. Fijate si el código te orienta en algo.
Form1:
Código Delphi [-]
uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(nil) do
  try
    f_id_Ajuste:= 999;
    ShowModal;
  finally
    Free;
  end;
end;

Form2:
Código Delphi [-]
type
  TForm2 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
  public
     f_id_Ajuste: Integer;
  end;

var
  Form2: TForm2;
  // f_id_Ajuste: Integer ( igual funciona si la situás aca )
implementation {$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
  Caption:= IntToStr(f_id_Ajuste);
end;

Si no malentendí tu planteo, me animaría a decir que el problema está en el procedimiento LimpiarCampos...

Saludos.

Última edición por ecfisa fecha: 31-10-2010 a las 00:34:18.
Responder Con Cita
  #3  
Antiguo 01-11-2010
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Gracias ecfisa por tu respuesta.

El procedimiento LimpiarCampos solo vacia unos par de texbox, creo haber descubierto cual es el problema o mejor dicho cuando sucede.

Olvidé comentarte que ese código funcionaba ok hasta que cambie la propiedad del formulario FormStyle = fsMDIForm. Cuando hice este cambio comenzó a fallar. Lo más extraño es que si dejo tal cual estaba la propiedad FormStyle = fsNormal sigue no funcionando correctamente el evento onShow. y para terminar la curiosidad esta, resulta si vuelvo a crear el evento onShow de nuevo y la propiedad FormStyle = fsNormal el problema ya no aparece.

Amigo ecfisa, tu podrías hacer las pruebas cambiando dicha propiedad a FormStyle = fsMDIForm y ver si te resulta.

Amigo, intenta sin showmodal al momento de llamar al formulario ya que así lo estoy haciendo en este momento, disculpa si el código inicial estaba incorporado.

Gracias...
__________________
No todo es como parece ser...
Responder Con Cita
  #4  
Antiguo 01-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola lucasart.

Si, tenés razón. Al cambiar de SDI a MDI, el segundo form en el evento OnShow, pareciera que no tiene aún el valor asignado ...

Es un comportamiento que yo también desconocía... lo voy a investigar.

Pero hasta que averiguemos alguna manera más elegante de hacerlo, a ver si esto te sirve:

MDIForm:
Código Delphi [-]
uses Unit2, ClipBrd;

procedure TForm1.Mostrar;
var
  i: Integer;
begin
  for i:= 0 to Screen.FormCount -1 do
   if Screen.Forms[i].ClassName = 'TForm2' then
   begin
     Screen.Forms[i].Show;
     Screen.Forms[i].BringToFront;
     Exit;
   end;
   TForm2.Create(nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Numero: Integer;
begin
  Mostrar;
  Numero:= 1234;
  ClipBoard.Clear;
  ClipBoard.SetTextBuf(PChar(IntToStr(Numero)));
end;

MDIChild:
Código Delphi [-]
uses ClipBrd;

procedure TForm2.FormShow(Sender: TObject);
begin
  f_id_Ajuste:= StrToInt(ClipBoard.AsText);
  Caption:= IntToStr(f_id_Ajuste);
end;


Saludos.

Última edición por ecfisa fecha: 01-11-2010 a las 21:05:28.
Responder Con Cita
  #5  
Antiguo 01-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola de nuevo.

Probando con Trace Into a ver por qué OnShow se disparaba en diferente órden que en los Forms SDI, se me ocurrió otra forma de hacerlo:

MDIForm:
Código Delphi [-]
uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TForm2.Mostrar(1234);
end;

MDIChild:
Código Delphi [-]
type
  TForm2 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    f_id_Ajuste: Integer;
  public
    property IDAjuste: Integer read f_id_Ajuste write f_id_Ajuste;
    class procedure Mostrar(Num: Integer);
  end;

var
  Form2: TForm2;

implementation {$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  ...
  ...
  OnShow:= nil;
end;

class procedure TForm2.Mostrar(Num: Integer);
begin
  if not Assigned(Form2) then
    Form2:= Create(nil);
  with Form2 do
  begin
    f_id_Ajuste:= Num;
    OnShow:= FormShow;
    FormShow(nil);
  end;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  Caption:= IntToStr(f_id_Ajuste);
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree;
  Form2:=nil; // por: if Assigned(Form2) ...
end;

Me gusta un poco más que la anterior. Aunque no estoy seguro que sea la mejor forma...

Saludos.

Última edición por ecfisa fecha: 01-11-2010 a las 22:37:27.
Responder Con Cita
  #6  
Antiguo 01-11-2010
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Gracias amigo, tu última solución creo que es lo mejor.

Para ver si entiendo con el código OnShow:= nil;
haces que el evento OnShow se omita, para luego lanzarlo con FormShow(nil). porque todo al parecer resulta que al momento del onshow las variables no se encuentran disponibles cuando el formulario es de tipo fsMDIChild.

Pero me quedan las dudas, será un bug del delphi ?? o quizás lo erroneo es lo que estaba haciendo, pero siguiendo una lógica si uno ya tiene instanciada la clase (create(nil)) esta ya se encuentra totalmente accesible, lo raro es que el evento onshow no se entere de estos valores ni por si acaso.

Gracias estimado, por ahora me parece una solución fantastica, aunque igual que a ti, el por qué de tal comportamiento no me lo explico ya que el evento onpaint si tiene conocimientos de estos valores.

Saludos .-
__________________
No todo es como parece ser...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda en declaracion de variables Paulao Varios 7 24-09-2010 10:25:51
Inicialización de variables booleanas noob Varios 7 16-12-2008 14:34:30
Duda con el ámbito de variables cardomjar Varios 6 16-03-2005 12:45:52
Inicializacion de variables xerkan OOP 3 24-05-2004 16:21:48
Frames y inicialización de variables __cadetill OOP 6 25-11-2003 18:22:54


La franja horaria es GMT +2. Ahora son las 05:26:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi