PDA

Ver la Versión Completa : Llamado procedimiento desde Form ShowModal


pockelsm3
12-01-2021, 13:24:17
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


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



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


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.


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


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

procedure TfrmDevSelect.btnCargarClick(Sender: TObject);
begin
CargarDevolucion;
Close;
end;

donde se llama al procedimiento del mdi

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:

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
Bueno podrias probar llamar al procedimiento desde el mismo form, es lo que yo haria:

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
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


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 (http://docwiki.embarcadero.com/CodeExamples/Sydney/en/ShowModal_(Delphi)), 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 (http://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Controls.TModalResult) que representa una acción a tomar en tu aplicación. Entre las mas comunes mrOk y mrCancel (http://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Controls.TModalResult) 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


procedure Form1.Button1Click(Sender: TObject);
begin
if frmDevSelect.ShowModal = mrOk then
EjecutarAlgo;
end;


En el siguiente ejemplo, se validan muchas mas acciones


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.


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
Hola, pockelsm3!

Cuando haces el llamado de Form.ShowModal (http://docwiki.embarcadero.com/CodeExamples/Sydney/en/ShowModal_(Delphi)), 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 (http://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Controls.TModalResult) que representa una acción a tomar en tu aplicación. Entre las mas comunes mrOk y mrCancel (http://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Controls.TModalResult) 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


procedure Form1.Button1Click(Sender: TObject);
begin
if frmDevSelect.ShowModal = mrOk then
EjecutarAlgo;
end;


En el siguiente ejemplo, se validan muchas mas acciones


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.


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 :)