Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Llamado procedimiento desde Form ShowModal (https://www.clubdelphi.com/foros/showthread.php?t=95017)

pockelsm3 12-01-2021 13:24:17

Llamado procedimiento desde Form ShowModal
 
Saludos a todo el foro

mi problema es el siguiente
Tengo un form master detail, llamo a otro formulario en "showmodal" para seleccionar datos especificos y mandarlos al master detail.

el caso es que luego de seleccionar los datos que se requieren, al precionar el boton Aceptar, desde el form showmodal ejecuto un procedimiento que esta en el form master detail, aqui es cuando me da un error en que las propiedades value de los campo de la tabla son inaccesibles.

el form Master Detail es MDIChild, el formulario que abro en showmodal no es MDI, ya que estos no pueden abrirse el showmodal

el procedimiento que ejecuto esta declarado Publico

Código Delphi [-]
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ModificarNCF(pNCF,pFact,CalcT:String;pFecha:TDateTime;DescV,DescPouble);
    procedure AgregarLineasDevolucion(iCode,iName,iAlm,iUnd,iRef,iIGrup:String;iQty,
                   iPrice,iBruto,iDesc,iDescP,iDescVP,iItbis,iNetoouble);
  end;

procedure TfrmSalesReturn.ModificarNCF(pNCF,pFact,CalcT:String;pFecha:TDateTime;DescV,DescPouble);
begin
  DevTableFACTURA.Value := pFact;
  DevTableTAXCALC.Value := CalcT;
  DevTableNCF.Value := pNCF;
  DevTableFLINKFACT.Value := pFecha;
  DevTableDESCVALOR.Value := DescV;
  DevTableDESCPORC.Value := DescP;
  DevTableDESCPORCVALOR.Value := Valor_Porcentaje(DevTableSEBTOTALNETO.Value,DevTableDESCPORC.Value);
end;

Caminante 12-01-2021 14:28:18

Hola

Cita:

Empezado por pockelsm3 (Mensaje 539669)

el caso es que luego de seleccionar los datos que se requieren, al precionar el boton Aceptar, desde el form showmodal ejecuto un procedimiento que esta en el form master detail, aqui es cuando me da un error en que las propiedades value de los campo de la tabla son inaccesibles.

Si te dice que las propiedades que quieres modificar son inaccesibles posiblemente es que no pusiste la unidad del form mdi en la seccion uses de tu ventana modal.

No se si estoy entendiendo bien. No me quedo claro en que form esta el procedimiento que quieres llamar.

Ahora si el metodo es del form mdi y lo llamas despues de que se cierra el form modal puede ser que es que estes destruyendo form antes de leer los valores requeridos.

pockelsm3 12-01-2021 14:51:51

Saludos Caminante, gracias por responderme

Cita:

Empezado por Caminante (Mensaje 539670)
Si te dice que las propiedades que quieres modificar son inaccesibles posiblemente es que no pusiste la unidad del form mdi en la seccion uses de tu ventana modal.

la unidad del form mdi esta declarada en el form showmodal, de lo contrario cuando escriba el procedimiento delphi lo marcaria con linea roja.

Cita:

Empezado por Caminante (Mensaje 539670)
No se si estoy entendiendo bien. No me quedo claro en que form esta el procedimiento que quieres llamar.

el procedimiento que llamo desde el showmodal, se encuentra en el form mdi

Cita:

Empezado por Caminante (Mensaje 539670)
Ahora si el metodo es del form mdi y lo llamas despues de que se cierra el form modal puede ser que es que estes destruyendo form antes de leer los valores requeridos.

en principio lo hacia luego del mandar a cerrar el showmodal, pense que el problema era por lo mismo que mencionas y cambie el llamado antes de mandar a cerrar el showmodal, pero persiste el inconveniente.

este es el codigo de cuando hago el llamado

click al boton
Código Delphi [-]
procedure TfrmDevSelect.btnCargarClick(Sender: TObject);
begin
  CargarDevolucion;
  Close;
end;

donde se llama al procedimiento del mdi
Código Delphi [-]
procedure TfrmDevSelect.CargarDevolucion;
begin
  try
    frmSalesReturn.ModificarNCF(SalesTableNCF.Value,SalesTableFACTURA.Value,SalesTableTAXCALC.Value,
                   SalesTableFECHAREGISTRO.Value,SalesTableDESCVALOR.Value,SalesTableDESCPORC.Value);

    SalesLine.First;

    while not SalesLine.Eof do
       begin
         if ckbAdd.EditValue = 'S' then
            begin
              frmSalesReturn.AgregarLineasDevolucion(SalesLineCODE.Value,SalesLineITEMDESCRIP.Value,SalesLineALMAC  EN.Value,
              SalesLineUNIDADES.Value,SalesLineREFERENCIA.Value,SalesLineTAXGROUP.Value,SalesLineITEMQTY.Value,
              SalesLinePRICE.Value,SalesLineSUBTOTAL.Value,SalesLineDESC.Value,SalesLineDESCPORCENT.Value,
              SalesLineDESCVALORPORCENT.Value,SalesLineITBIS.Value,SalesLineTOTAL.Value);

              SalesLine.Next;
            end
         else SalesLine.Next;
       end;


  except
    AddFallaSistema(Main.Usuario,'frmDevSelect','CargarDevolucion','MErInseLine');
    mensaje(MErInseLine,PWideChar(Application.Title),MB_ICONERROR+MB_OK);
  end;
end;

Caminante 12-01-2021 15:10:33

Bueno podrias probar llamar al procedimiento desde el mismo form, es lo que yo haria:

Código Delphi [-]
FomDialogo:=TFormdialogo.create(nil);
try
if formdialogo.showmodal=mrok then
begin
 //Las acciones pertinentes como llamar a mi procedimiento
end;
finally
formdialogo.free
end;

pockelsm3 12-01-2021 19:45:22

Cita:

Empezado por Caminante (Mensaje 539672)
Bueno podrias probar llamar al procedimiento desde el mismo form, es lo que yo haria:

Código Delphi [-]
FomDialogo:=TFormdialogo.create(nil);
try
if formdialogo.showmodal=mrok then
begin
 //Las acciones pertinentes como llamar a mi procedimiento
end;
finally
formdialogo.free
end;

Es que en el form showmodal, debe de haber interaccion con el usuario, ya que debe de elegir la informacion que desea enviar al form mdi

O es que no estoy entendiendo tu ejemplo.

Caminante 12-01-2021 20:22:10

Bueno no se como es tu formulario modal ni como es que lo ejecutas. Lo normal que hago en un dialogo es tener los botones aceptar y cancelar entonces si se acepta el dialogo puedo hacer las operaciones necesarias.

pockelsm3 12-01-2021 20:50:55

Cita:

Empezado por Caminante (Mensaje 539675)
Bueno no se como es tu formulario modal ni como es que lo ejecutas. Lo normal que hago en un dialogo es tener los botones aceptar y cancelar entonces si se acepta el dialogo puedo hacer las operaciones necesarias.

entiendo que lo hago de una manera sencilla o muy basica

Código Delphi [-]
procedure TfrmSalesReturn.ebtnFacturaPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  inherited;
  if DevTableCUSTCODE.Value <> '' then
     begin
       frmDevSelect := TfrmDevSelect.Create(Application);
       frmDevSelect.FiltrarCliente(DevTableCUSTCODE.Value);
       frmDevSelect.ShowModal;
     end
  else ShowMessage('Debe seleccionar un cliente');
end;

asi es la llamada al form modal, filtro la tabla que esta en el form modal por el cliente que hayan seleccionado posteriormente, para que en el form modal seleccionen la informacion que desean de dicho cliente.

movorack 12-01-2021 23:25:56

Hola, pockelsm3!

Cuando haces el llamado de Form.ShowModal, el formulario se muestra, te permite interactuar con este y al finalizar también permite obtener el resultado la ventana Modal.

Las ventanas Modal pueden devolver una respuesta que representa una acción a tomar en tu aplicación. Entre las mas comunes mrOk y mrCancel que por lo general se muestran como botones de Aceptar y Cancelar. La forma más fácil de asignar esa respuesta está en las mismas propiedades del TButton que elegirás para el Aceptar o el Cancelar.

En el siguiente ejemplo, se evaluará que al presionar el botón llame EjecutarAlgo. Si cierra el formulario o presiona cancelar no hace el llamado de EjecutarAlgo

Código Delphi [-]
procedure Form1.Button1Click(Sender: TObject);
begin
  if frmDevSelect.ShowModal = mrOk then
    EjecutarAlgo;
end;

En el siguiente ejemplo, se validan muchas mas acciones

Código Delphi [-]
procedure Form1.Button1Click(Sender: TObject);
begin
  case frmDevSelect.ShowModal of
    mrOk: EjecutarOk;
    mrYes: EjecutarYes;
    mrNo: EjecutarNo;
  end;
end;

Como recomendación, el formulario modal debe crearse y liberarse de inmediato. Recuperando los valores necesarios antes de liberar el formulario.

Código Delphi [-]
procedure TfrmSalesReturn.ebtnFacturaPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
  var
    frmDevSelect: TfrmDevSelect;
begin
  inherited;
  if DevTableCUSTCODE.Value <> '' then
     begin
       frmDevSelect := TfrmDevSelect.Create(Application);
       try
         frmDevSelect.FiltrarCliente(DevTableCUSTCODE.Value);
         if frmDevSelect.ShowModal = mrOk then
         begin
           //Recuperar los valores desde el formulario modal y realizar las siguientes acciones
         end;
       finally
         frmDevSelect.Free;
       end;
     end
  else ShowMessage('Debe seleccionar un cliente');
end;

pockelsm3 13-01-2021 01:27:33

Cita:

Empezado por movorack (Mensaje 539677)
Hola, pockelsm3!

Cuando haces el llamado de Form.ShowModal, el formulario se muestra, te permite interactuar con este y al finalizar también permite obtener el resultado la ventana Modal.

Las ventanas Modal pueden devolver una respuesta que representa una acción a tomar en tu aplicación. Entre las mas comunes mrOk y mrCancel que por lo general se muestran como botones de Aceptar y Cancelar. La forma más fácil de asignar esa respuesta está en las mismas propiedades del TButton que elegirás para el Aceptar o el Cancelar.

En el siguiente ejemplo, se evaluará que al presionar el botón llame EjecutarAlgo. Si cierra el formulario o presiona cancelar no hace el llamado de EjecutarAlgo

Código Delphi [-]
procedure Form1.Button1Click(Sender: TObject);
begin
  if frmDevSelect.ShowModal = mrOk then
    EjecutarAlgo;
end;

En el siguiente ejemplo, se validan muchas mas acciones

Código Delphi [-]
procedure Form1.Button1Click(Sender: TObject);
begin
  case frmDevSelect.ShowModal of
    mrOk: EjecutarOk;
    mrYes: EjecutarYes;
    mrNo: EjecutarNo;
  end;
end;

Como recomendación, el formulario modal debe crearse y liberarse de inmediato. Recuperando los valores necesarios antes de liberar el formulario.

Código Delphi [-]
procedure TfrmSalesReturn.ebtnFacturaPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
  var
    frmDevSelect: TfrmDevSelect;
begin
  inherited;
  if DevTableCUSTCODE.Value <> '' then
     begin
       frmDevSelect := TfrmDevSelect.Create(Application);
       try
         frmDevSelect.FiltrarCliente(DevTableCUSTCODE.Value);
         if frmDevSelect.ShowModal = mrOk then
         begin
           //Recuperar los valores desde el formulario modal y realizar las siguientes acciones
         end;
       finally
         frmDevSelect.Free;
       end;
     end
  else ShowMessage('Debe seleccionar un cliente');
end;


gracias movorack y caminante por sus recomendaciones y sugerencias

con este ejemplo mas detallado pude solucionar el incoveniente,

muchas gracias muchachos por su gran ayuda :)


La franja horaria es GMT +2. Ahora son las 14:55:44.

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