Ver Mensaje Individual
  #6  
Antiguo 11-07-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Reputación: 21
AzidRain Va camino a la fama
Finalmente conseguí que funcionara el modelado como lo había concebido, aunque creo que todavía puede mejorarse y obviamente no es nada del otro mundo.

Es un modelo simple para manejar una tabla o query que represente un catálogo, es decir, esas formas que muestran en un grid todos los registros de la tabla. Este tipo de ventanas son muy comunes en programas administrativos y en uno que estoy haciendo requiero hacer lo mismo muchísimas veces, cambiando solamente el catálogo en cuestión.

Asi que para armar un catálogo completo necesitamos:

1.- Controlador de Grid (o grilla)
2.- Una vista (forma) principal (la que tiene el grid)
3.- Una vista (forma) para editar un registro (que es la misma para cambiarlo)
4.- Un modelo (tabla) que representa los datos a visualizar

En clases es así:
1.- TdxGridControlador
2.- TdxGridForm
3.- TdxDialogForm
4.- TZquery + TDataSource [+ TUpdateSQL si usamos un query multitablas]

TdxGridView se vé así:
[IMG] http://img133.imageshack.us/img133/4645/dxgridht4.jpg [/IMG]

y TdxDialogForm se vé así:



Pues bien la cosa es así:

Tenemos una clase TdxControlador que es la clase base para construir diferentes tipos de controladores simples. De ahi derivé TdxGridControlador que es un controlador especializado en manejar un grid y hacer las famosas Altas-Bajas-Modificaciones, esta sería su declaración:

Código Delphi [-]

TAuxForma = Class of TTdxDialogForm;

TdxGridControlador = class(TdxControlador)
Public
TablaDatos:TDataset;

constructor Create( ClaseForma : TClassForm);override;
procedure OnNuevoRegistro(sender:TObject);virtual;abstract;
procedure OnCambiarRegistro(sender:TObject);virtual; abstract;
procedure OnBorrarRegistro(sender:TObject);virtual;

procedure OnBotonOk(sender:TObject); override;
procedure OnBotonCancel(sender:TObject);override;



protected
Procedure EnNuevo(aForm:TAuxForma);virtual;
Procedure EnEdita(aForm:TAuxForma);virtual;

end;

Como podemos ver se trata prácticamente de enventos, que serán disparados de acuerdo con el diseño de que se trate. Tanto OnNuevoRegistro como OnCambiaRegistro son métodos abstractos por lo que hay que definir que queremos que pase en cada caso. Por su parte OnBotonOk y OnBotonCancel son métodos que se ejecutan cuando aparecen los diálogos para un nuevo registro (TdxDialogForm) o para cambiarlo.

Para utilizar todo este andamiaje, veamos un ejemplo para una tabla Empleados, hacemos lo siguiente:

1.- Crear el query en un datamodule y prepararlo como se requiera, aquí podemos incluir condiciones para nuevos campos, chequeo de índices, etc. lo que normalmente se hace.

2.- Crear la vista principal derivando una nueva forma de TdxGridForm y ajustamos los valores del Grid (en mi caso ocupo mis amadas DevExpress pero con un grid normal funciona igual) para utilizar el query que creamos anteriormente (databinding). Es importante ver que este query contiene un TActionList que ya está preparado para trabajar con el controlador por lo que no hay que tocar nada de eventos. Se llamara TFCatEmpleados:


3.- Creamos la vista o vistas para Agregar o editar un registro, colocamos los controles que necesitemos y hacemos nuevamente databinding con la misma query.Se llamará TFNuevoEmpleado.:



4.- Finalmente preparamos el controlador derivando una nueva clase a partir de TdxGridControlador, únicamente tenemos que indicarle de que clase son las formas que utilizaremos para la edición de registros.

Código Delphi [-]

Type
TCEmpleados = class(TdxGridControlador)

Procedure CierraForma(sender:TObject);

{*** Eventos para la vista principal ***}

procedure OnNuevoRegistro(sender:TObject);override;
procedure OnCambiarRegistro(sender:TObject);override;


end;

implementation

{ TCEmpleados }

procedure TCEmpleados.CierraForma(sender: TObject);
begin

end;

procedure TCEmpleados.OnCambiarRegistro(sender: TObject);

begin
EnEdita(TFNuevoEmpleado);
end;

procedure TCEmpleados.OnNuevoRegistro(sender: TObject);
Begin
EnNuevo(TFNuevoEmpleado);
end;

end.

implementation

end.

5.- En la parte del programa donde vamos a utilizar este andamiaje preparamos todo y lo ejecutamos:

Código Delphi [-]

procedure TMainForm.AEmpleadosExecute(Sender: TObject);
var cE: TCEmpleados;

begin
{Crear el controlador y pasarle la vista principal}

cE := TCEmpleados.create( TFCatEmpleados );
ce.TablaDatos.Open;
Datos.ZPuestos.Open; //Tabla auxiliar para los puestos
Try
ce.MuestraVistaPrincipal;
Finally
Datos.ZPuestos.Close;
ce.TablaDatos.Close;
ce.Free;

end;

end;
Y obtenemos esto:

Al hacer click por ejemplo en Editar, obtendremos:


Igualmente con nuevo. El botón de borrar por defecto lo único que hace es preguntar si se está seguro y borrar el registro actual.

Asi de simple, no hay que hacer nada adicional, claro si se de desea se pueden extender más las clases y agregar más cosas, pero así como está me sirve y me mantiene un orden más o menos adecuado en lo que voy haciendo.

Y claro...no es el hilo negro eh...que conste.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita