Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   probelas al usar un mismo formulario para abrirlo en dos mas (https://www.clubdelphi.com/foros/showthread.php?t=94458)

LACV 19-02-2020 23:26:45

probelas al usar un mismo formulario para abrirlo en dos mas
 
buena tarde si es posible que me ayudes con un error que tengo ; es que estoy usando un formulario frmproductolist lo abro este formulario se abre desde dos formularios distinto uno es frmsalida y el otro frmentrada desde cualquiera de los dos llamo y abro frmproductoslist con este código

Código Delphi [-]
try
    FrmProductoList := TFrmProductoList.Create(application);
    DModulo.reset_producto;
    FrmProductoList.ShowModal;
  finally
    FrmProductoList.Free;
end;


si se abre desde frmentrada y se realiza el procedimiento coloca los datos en EdtProducto.Text de frmentrada y luego voy a frmsalida y mando a cargar los datos enEdtProducto.Text de frmsalida y me lanza un error;

acces violation at addres 00572eddv modulo . read of addres 20202056

para cargar los datos a los formularios lo hago a si desde frmproductolist

Código Delphi [-]

if Assigned(FrmOrdenEntradaCrud) then
  begin

    ShowMessage('entrada');
    Application.ProcessMessages;
    with FrmOrdenEntradaCrud do
    begin
      cantidad := StrToInt(DModulo.UQuery_Producto.FieldByName('N_existencia')
        .AsString);
      if MessageDlg('Ha seleccionado el producto.' + #13#10 +
        DModulo.UQuery_Producto.FieldByName('Producto').AsString + '',
        mtConfirmation, mbYesNo, 0) = mrYes then
      begin
        // cargamos los datos en el formulario

        EdtProducto.Text := DModulo.UQuery_Producto.FieldByName('Producto')
          .AsString + ' ' + DModulo.UQuery_Producto.FieldByName
          ('Referencia').AsString;

      end
      else
      begin
        ShowMessage('El Producto Seleccionado no Tiene 0 de Existencia');
      end;
    end;

  end;

  if Assigned(FrmSalidaCrud) then
  begin

    ShowMessage('salida');
    Application.ProcessMessages;

    with FrmSalidaCrud do
    begin
      cantidad := StrToInt(DModulo.UQuery_Producto.FieldByName('N_existencia')
        .AsString);
      if cantidad > 0 then
      begin
        // cargamos los datos en el formulario

        EdtProducto.Text := DModulo.UQuery_Producto.FieldByName('Producto')
          .AsString + ' ' + DModulo.UQuery_Producto.FieldByName
          ('Referencia').AsString;

      end
      else
      begin
        ShowMessage('El Producto Seleccionado no Tiene 0 de Existencia');
      end;
    end;

  end;

  // cerramos el formulario
  FrmProductoList.Action.Free;
  FrmProductoList.Close;


aaa y en el evento onclose de frmproductolist estoy agregando este codigo

Código Delphi [-]
Action := caFree;
que error estoy cometiendo; les agradezco de antemano

movorack 19-02-2020 23:55:40

Hola, lo que sucede es que estás liberando el objeto, al intentar acceder nuevamente, se genera el error.

Código Delphi [-]
  Action := caFree; //Esto libera el objeto del formulario al cerrarse

Puedes o crear y liberar el objeto en cada uso

Código Delphi [-]
  FormularioModal := TFormularioModal.Create(Application);
  try
    FormularioModal .ShowModal;
  finally
    FormularioModal.Free;
  end;

kuan-yiu 20-02-2020 08:25:54

Si necesitas acceder a un formulario no puedes cerrarlo (caFree) sino que tienes que ocultarlo (caHide), trabajar con él, mostrarlo cuando lo necesites y cerrarlo definitivamente cuando termines de usarlo.

Neftali [Germán.Estévez] 20-02-2020 08:58:52

Código Delphi [-]
...
try
    FrmProductoList := TFrmProductoList.Create(application);
    DModulo.reset_producto;
    FrmProductoList.ShowModal;
  finally
    FrmProductoList.Free;      (1)
end;
...

  FrmProductoList.Action.Free;   (2)

...

Action := caFree;     (3)

Lo primero que yo haría es ejecutar paso paso la aplicación poner algun breakpoint en esos lugares y ver si "salta" el error. Así sabrás seguro la línea donde falla.

Por lo otro lado comentar estas tres líneas que he marcardo porque son las que pienso que te pueden dar problemas.
(1) Liberas el formulario manualmente con Free. Bien hasta ahí, el problema es que en la (3) utilizar caFree que indica al propietario que haga lo mismo. Por lo tanto estarás intentando liberar el formulario 2 veces. Eso es candidato a un error de "Access Violation".
En este caso en la línea (3) puedes usar un caNone o caFree.

(2) Estás liberando algo que aquí no vemos dónde se crea. Si es algo que has creado tú, bien, si no lo has creado tú de forma expresa, es posible que esté pasando lo mismo que antes; que se esté intentando liberar 2 veces. Por lo tanto si es así vuelve a ser candidato a un "Access violation".


La franja horaria es GMT +2. Ahora son las 23:48:59.

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