Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Formulario (https://www.clubdelphi.com/foros/showthread.php?t=93446)

oscarac 30-09-2018 06:56:43

Formulario
 
1 Archivos Adjunto(s)
buenas noches
tengo un modulo de facturacion donde invoco a la pantalla de ingreso de datos de esta manera

Código Delphi [-]
procedure TfrmEmisionFactura.btnAgregaClick(Sender: TObject);
begin
  p_opcion := 0;
  While p_Opcion = 0 do
  Begin
    frmEmisionFacturaD:= TfrmEmisionFacturaD.Create(nil);
    frmEmisionFacturaD.ShowModal;
  End;
end;

y en el formulario que invoco hay una opcion para agregar articulos y lo invoco de la siguiente manera

Código Delphi [-]
procedure TfrmEmisionFacturaD.btnAgregaClick(Sender: TObject);
begin
  _accion := 0;
  While _Accion = 0 do
  Begin
    CdsDetalle.Append;
    frmEmisionFacturaDDato := TfrmEmisionFacturaDDato.Create(nil);
    frmEmisionFacturaDDato.FormStyle := fsNormal;
    frmEmisionFacturaDDato.Visible := False;
    frmEmisionFacturaDDato.ShowModal;
  End;
end;

cuando ejecuto el programa funciona a la perfeccion la primera vez

luego, cuando grabo la factura se invoca el formulario "frmEmisionFacturaD" (se abre con normalidad)

pero sucede algo curioso, el campo tipo de documento no recibe el foco, hasta que yo presione alguna tecla
y luego cuando quiero agregar productos aparece el mensaje que adjunto.


PERO

si al momento de invocar el formulario "frmEmisionFacturaD" quitandole en el programa el "bucle"

Código Delphi [-]
While p_Opcion = 0 do
  Begin
  end..

no me aparece ningun error


en el destroy agrego lo siguiente en cada uno de los formularios
Código Delphi [-]
frmEmisionFacturaD := nil;
Código Delphi [-]
frmEmisionFacturaDDato := nil;


alguien tiene alfguna idea de lo que sucede?

lucho6007 30-09-2018 15:07:33

Código Delphi [-]
procedure TfrmEmisionFactura.btnAgregaClick(Sender: TObject); begin   p_opcion := 0;   While p_Opcion = 0 do   Begin     frmEmisionFacturaD:= TfrmEmisionFacturaD.Create(nil);     frmEmisionFacturaD.ShowModal;
    frmEmisionFacturaD.Free; 
  End; end;


Te esta factando liberar el formulario, no hace falta poner el nil en el Destroy


Saludos,

oscarac 30-09-2018 20:09:05

Si funciona, gracias
pero he visto que se aplica cuando el formulario es MODAL (ShowModal)
y que en el destroy no puedo usar el form1.free;

la pregunta es...
cuando un formulario no es modal, como lo libero ?

porque cuando hago esto.

Código Delphi [-]
    frmEmisionFacturaD:= TfrmEmisionFacturaD.Create(nil);
    frmEmisionFacturaD.Show;
    frmEmisionFacturaD.Free;

el formulario aparece y al instante desaparece.

Casimiro Notevi 30-09-2018 23:48:18

Cita:

Empezado por oscarac (Mensaje 528710)

frmEmisionFacturaD:= TfrmEmisionFacturaD.Create(nil);
frmEmisionFacturaD.Show; // Lo muestras
frmEmisionFacturaD.Free; // Lo eliminas.

el formulario aparece y al instante desaparece.

Por eso.
;)

CarlosReyesg 01-10-2018 08:01:46

Cita:

Empezado por oscarac (Mensaje 528710)
Si funciona, gracias
pero he visto que se aplica cuando el formulario es MODAL (ShowModal)
y que en el destroy no puedo usar el form1.free;

la pregunta es...
cuando un formulario no es modal, como lo libero ?

porque cuando hago esto.

Código Delphi [-]
    frmEmisionFacturaD:= TfrmEmisionFacturaD.Create(nil);
    frmEmisionFacturaD.Show;
    frmEmisionFacturaD.Free;

el formulario aparece y al instante desaparece.


para llamar un formulario con "Show" tienes que asignar el evento OnClose y asignar la variable "Action" con "caFree"
Código Delphi [-]
  
  frmEmisionFacturaD:= TfrmEmisionFacturaD.Create(nil);
  frmEmisionFacturaD.Show;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Action := caFree;
end;

en el caso de usar "ShowModal" yo lo uso de la siguiente manera
Código Delphi [-]
//Ejemplo 1
Application.CreateForm(TFrmMain, FrmMain); ///Esto es igual a FrmMain := TFrmMain.Create(Application)
   try
      FrmMain.ShowModal;
   finally
      FrmMain.DisposeOf; /// Delphi mayores a XE2
      // FreeAndNil(FrmMain);
   end;

  //Ejemplo 2
   Application.CreateForm(TFrmMain, FrmMain);
   try
      if FrmMain.ShowModal = mrOk then // para usarlo asi tienes que asignar la propiedad "ModalResult"
      begin
         ///////////////////////
         ///   Pones codigo que quieras
      end;
   finally
      FrmMain.DisposeOf;
   end;

oscarac 01-10-2018 21:31:50

me quedo claro, gracias.


La franja horaria es GMT +2. Ahora son las 09:05:34.

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