En esta caso estás pasando un objeto de tipo TfrmForm, pero no una referencia a la clase, que son cosas distintas; Si quieres ejecutar un mérodo de clase (
ExecuteModal), debes pasar la referencia. Otra opción sería pasar el form y ejecutarl por RTTI, pero creo que no es el caso.
Código Delphi
[-]
procedure TfrmMainGeneral.EjecutarForm(pForm: TfrmForm; pNomPantalla: String);
var
lTransActive: Boolean;
begin
lTransActive := False;
if not DMLectura.IBTRead.InTransaction then begin
DMLectura.IBTRead.StartTransaction;
lTransActive := True;
end;
if FSesionUsr.AccesoFormSistema(FSesionUsr.GetSesionIDGrupoUsuario, pNomPantalla) then
pForm.ExecuteModal(Self)
else
MessageDlg(Usuario_sin_permiso, mtInformation, [mbOK], 0);
if lTransActive then
DMLectura.IBTRead.Rollback;
end;
y despues lo que quiero hacer es;
Código Delphi
[-]
EjecutarForm(TfrmVenta, Pant_Ventas);
Lo primero es cambiar:
Código Delphi
[-]
procedure TfrmMainGeneral.EjecutarForm(pForm: TfrmForm; pNomPantalla: String);
procedure TfrmMainGeneral.EjecutarForm(pForm: TfrmFormClass; pNomPantalla: String);
Y en algun sitio (en la sección de
type) definir:
Código Delphi
[-]
TfrmFormClass = class of TfrmForm
TfrmForm = class(TForm)
published
class procedure ExecuteModal(Sender:TForm);
end;
En ese caso la llamada a:
Código Delphi
[-]
EjecutarForm(TfrmVenta, 'Pant_Ventas');
Funcionará, siempre y cuando la clase TfrmVenta derive de TfrmForm,
Código Delphi
[-]
TfrmVenta = class(TfrmForm)
...
No se si me he explicado.
EjecutarForm(TfrmVenta, 'Pant_Ventas');
==> Este procemimiento llega a la línea:
pForm.ExecuteModal(Self)
==>pForm lo hemos pasado como parámetro con un constructor de clase (
TfrmVenta); Revisa esta clase y no tiene el método
ExecuteModal, pero sí su antecesor
TfrmForm. Como lo tiene definido como método de clase, lo ejecuta:
class procedure ExecuteModal(Sender:TForm);
==> Este ,método supongo que crea el form y lo visualiza modal.