Hola Al Gonzalez y AzidRain, gracias por la respuesta, acá les pongo el código completo...
Este es el módulo de datos que utilizo como punto de partida.
Código Delphi
[-]
unit dmABM_u;
interface
uses
SysUtils, Classes, FMTBcd, DB, DBClient, Provider, SqlExpr;
type
TdmABM = class(TDataModule)
SQLDataSet1: TSQLDataSet;
SQLDataSet2: TSQLDataSet;
DataSetProvider1: TDataSetProvider;
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
private
public
Accion: Integer;
function Agregar: Boolean;
function Modificar: Boolean;
function Borrar: Boolean;
function Aceptar: Boolean;
function Cancelar: Boolean;
function ChequearAccion: Boolean; virtual;
function _DatosIniciales: Boolean; virtual;
function _cds2cmp: Boolean; virtual;
end;
var
dmABM: TdmABM;
implementation
uses DMConnection_u;
{$R *.dfm}
function TdmABM.Agregar: Boolean;
begin
if self.ChequearAccion = false then
exception.Create('No tiene permiso para esa acción');
if self._DatosIniciales = false then
exception.Create('Error con los datos iniciales');
self.Accion := 1;
result := true;
end;
function TdmABM.Modificar: Boolean;
begin
if self.ChequearAccion = false then
exception.Create('No tiene permiso para esa acción');
if self._cds2cmp = false then
exception.Create('Error en cds2cmp');
self.Accion := 2;
result := true;
end;
function TdmABM.Borrar: Boolean;
begin
result := true;
end;
function TdmABM.Aceptar: Boolean;
begin
result := true;
end;
function TdmABM.Cancelar: Boolean;
begin
result := true;
end;
function TdmABM.ChequearAccion: Boolean;
begin
result := true;
end;
function TdmABM._DatosIniciales: Boolean;
begin
result := true;
end;
function TdmABM._cds2cmp: Boolean;
begin
result := true;
end;
end.
Este es el formulario que utilizo como punto de partida
Código Delphi
[-]
unit frmABM_u;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Gradient, ExtCtrls, _TEdit_u, Grids, DBGrids,
_TDBGrid_u, ToolWin, ActnMan, ActnCtrls, Buttons, ComCtrls, dmABM_u;
type
TfrmABM = class(TForm)
cntTitulo: TPanel;
Gradient1: TGradient;
lblTitulo: TLabel;
MenuLateral: TPanel;
Splitter1: TSplitter;
cntGrilla: TPanel;
SplitterG_DR: TSplitter;
cntDR: TPanel;
PanelGrilla: TPanel;
TGrilla1: _TDBGrid;
txtLocator: _TEdit;
cntDatos: TScrollBox;
GradientDatos: TGradient;
ControlBar1: TControlBar;
ToolBar1: TToolBar;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
b_GrillaDatos: TBitBtn;
BitBtn5: TBitBtn;
b_Agregar: TButton;
b_Modificar: TButton;
b_Borrar: TButton;
b_Confirmar: TButton;
b_Cancelar: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SplitterG_DRMoved(Sender: TObject);
procedure cntGrillaResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure b_GrillaDatosClick(Sender: TObject);
procedure b_AgregarClick(Sender: TObject);
procedure b_ModificarClick(Sender: TObject);
procedure b_BorrarClick(Sender: TObject);
procedure b_ConfirmarClick(Sender: TObject);
procedure b_CancelarClick(Sender: TObject);
private
DRHeight: Integer;
public
DM: TdmABM;
procedure Create2; virtual;
procedure MostrarGrilla;
procedure MostrarDatos;
procedure Agregar;
procedure Modificar;
procedure Borrar;
procedure Confirmar;
procedure Cancelar;
function _cmp2ctrl: Boolean; virtual;
end;
var
frmABM: TfrmABM;
implementation
{$R *.dfm}
procedure TfrmABM.Create2;
begin
end;
procedure TfrmABM.MostrarGrilla;
begin
self.cntGrilla.Visible := true;
self.cntDatos.Visible := false;
self.b_GrillaDatos.Caption := 'Datos';
end;
procedure TfrmABM.MostrarDatos;
begin
self.cntGrilla.Visible := false;
self.cntDatos.Visible := true;
self.b_GrillaDatos.Caption := 'Grilla';
end;
procedure TfrmABM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TfrmABM.SplitterG_DRMoved(Sender: TObject);
begin
DRHeight := cntDR.Height;
end;
procedure TfrmABM.cntGrillaResize(Sender: TObject);
begin
self.PanelGrilla.Height := self.cntGrilla.Height - self.DRHeight;
end;
procedure TfrmABM.FormCreate(Sender: TObject);
begin
self.cntDatos.Align := alClient;
self.GradientDatos.Align := alClient;
self.cntGrilla.Align := alClient;
self.DRHeight := cntDR.Height;
self.cntDR.Align := alBottom;
self.SplitterG_DR.Align := alBottom;
self.PanelGrilla.Align := alClient;
self.MostrarGrilla;
self.Create2;
end;
procedure TfrmABM.BitBtn2Click(Sender: TObject);
begin
self.MenuLateral.Visible := not self.MenuLateral.Visible;
end;
procedure TfrmABM.b_GrillaDatosClick(Sender: TObject);
begin
if self.cntGrilla.Visible = true then
self.MostrarDatos
else
self.MostrarGrilla
;
end;
procedure TfrmABM.Agregar;
begin
if self.DM.Agregar = false then
exception.Create('No se puede agregar');
if self._cmp2ctrl = false then
exception.Create('No se pueden pasar los cmp a los controles');
self.MostrarDatos;
end;
procedure TfrmABM.Modificar;
begin
if self.DM.Modificar = false then
exception.Create('No se puede modificar');
if self._cmp2ctrl = false then
exception.Create('No se pueden pasar los cmp a los controles');
self.MostrarDatos;
end;
procedure TfrmABM.Borrar;
begin
end;
procedure TfrmABM.Confirmar;
begin
end;
procedure TfrmABM.Cancelar;
begin
end;
procedure TfrmABM.b_AgregarClick(Sender: TObject);
begin
self.Agregar;
end;
procedure TfrmABM.b_ModificarClick(Sender: TObject);
begin
self.Modificar;
end;
procedure TfrmABM.b_BorrarClick(Sender: TObject);
begin
self.Borrar;
end;
procedure TfrmABM.b_ConfirmarClick(Sender: TObject);
begin
self.Confirmar;
end;
procedure TfrmABM.b_CancelarClick(Sender: TObject);
begin
self.Cancelar;
end;
function TfrmABM._cmp2ctrl: Boolean;
begin
result := true;
end;
end.
Este es el Módulo de datos de clientes. (Heredado de mdABM)
Código Delphi
[-]
unit dmClientes2_u;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, dmABM_u, FMTBcd, DB, DBClient, Provider, SqlExpr;
type
TdmClientes2 = class(TdmABM)
private
public
cmpIdCliente: Integer;
cmpCodCliente: Integer;
cmpNomCliente: String;
cmpApeCliente: String;
cmpEmpCliente: String;
cmpMosCliente: String;
function ChequearAccion: Boolean; override;
function _DatosIniciales: Boolean; override;
function _cds2cmp: Boolean; override;
end;
var
dmClientes2: TdmClientes2;
implementation
uses DMConnection_u;
{$R *.dfm}
function TdmClientes2.ChequearAccion;
begin
result := true;
end;
function TdmClientes2._cds2cmp: Boolean;
begin
self.cmpIdCliente := self.ClientDataSet1.FieldByName('idCliente').AsInteger;
self.cmpCodCliente := self.ClientDataSet1.FieldByName('CodCliente').AsInteger;
self.cmpNomCliente := self.ClientDataSet1.FieldByName('Nombre').AsString;
self.cmpApeCliente := self.ClientDataSet1.FieldByName('Apellido').AsString;
self.cmpEmpCliente := self.ClientDataSet1.FieldByName('Empresa').AsString;
self.cmpMosCliente := self.ClientDataSet1.FieldByName('Mostrar').AsString;
result := true;
end;
function TdmClientes2._DatosIniciales: Boolean;
begin
result := true;
end;
end.
Y este es el formulario de clientes, heredado de frmABM
Código Delphi
[-]
unit frmClientes2_u;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, frmABM_u, StdCtrls, Gradient, ExtCtrls, _TEdit_u, Grids,
DBGrids, _TDBGrid_u, ToolWin, ActnMan, ActnCtrls, Buttons, ComCtrls,
dmClientes2_u;
type
TfrmClientes2 = class(TfrmABM)
txtCodigo: TEdit;
txtNombre: TEdit;
txtApellido: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
private
public
DM: TDMclientes2;
procedure Create2; override;
function _cmp2ctrl: Boolean; override;
end;
var
frmClientes2: TfrmClientes2;
implementation
{$R *.dfm}
procedure TfrmClientes2.create2;
begin
self.DM := TDMclientes2.Create(self);
self.DM.SQLDataSet1.Active := true;
self.DM.ClientDataSet1.Active := true;
self.TGrilla1.DataSource := self.DM.DataSource1;
end;
function TfrmClientes2._cmp2ctrl: Boolean;
begin
self.txtCodigo.Text := IntToStr(self.DM.cmpCodCliente);
self.txtNombre.Text := self.DM.cmpNomCliente;
self.txtApellido.Text := self.DM.cmpApeCliente;
result := true;
end;
end.
Bueno, como les contaba antes, el error "Access violation" aparece cuando llamo a "Modificar" o "Agregar" desde el formulario. El error aparece en el módulo de datos dmABM, cuando intenta llamar a "ChequearAccion" (es donde despues voy a ingresar código para saber si el usuario actual tiene el permiso necesario).
Les agradezco desde ya por su tiempo.
Saludos, Leandro