Diferencia entre revisiones de «TTfvsDBClientFrameCheckList»
(No se muestran 7 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
=Descripción= | =Descripción= | ||
El frame '''TTfvsDBClientFrameCheckList''' (Implementa lista para checkboxes) implementa un frame donde podemos editar una lista de líneas, cada una con un checkbox. Toma una clase definida y la transforma a una lista de checkboxes. Necesita tener el frame de edición definido como se muestra en el ejemplo. | El frame '''TTfvsDBClientFrameCheckList''' (Implementa lista para checkboxes) implementa un frame donde podemos editar una lista de líneas, cada una con un checkbox. Toma una clase definida y la transforma a una lista de checkboxes. | ||
Necesita tener el frame de edición definido como se muestra en el ejemplo. | |||
=[[QUEESESTO/IDENTIDAD|Identidad]]= | =[[QUEESESTO/IDENTIDAD|Identidad]]= | ||
Línea 11: | Línea 13: | ||
=Ejemplo de definición= | =Ejemplo de definición= | ||
=== | ===Vista de la pantalla en runtime=== | ||
Usamos el detalle de [[CONTABILIDAD/GRUPOS DE CUENTAS]] como ejemplo, la pantalla se ve de la siguiente manera: | Usamos el detalle de [[CONTABILIDAD/GRUPOS DE CUENTAS]] como ejemplo, la pantalla se ve de la siguiente manera: | ||
[[Archivo:20250603 1129 CUENTA GRUPO.png|miniaturadeimagen|no|Grupos de cuentas contables.]] | [[Archivo:20250603 1129 CUENTA GRUPO.png|miniaturadeimagen|no|Grupos de cuentas contables.]] | ||
Línea 22: | Línea 24: | ||
! Columna !! Campo físico !! Campo lógico !!Observaciones | ! Columna !! Campo físico !! Campo lógico !!Observaciones | ||
|- | |- | ||
|1||FGRUPO||Grupo||Código de agrupación. | |1||(k) FGRUPO||Grupo||Código de agrupación. | ||
|- | |- | ||
|2||FCUENTA||Cuenta||Código de cuenta asociada a la agrupación. | |2||(k) FCUENTA||Cuenta||Código de cuenta asociada a la agrupación. | ||
|- | |- | ||
|} | |} | ||
(k) identifica a los campos clave de la tabla. | |||
La lista de checks va a aplicar sobre el último campo que sea clave, en este caso el de atributo CUENTA. | |||
===Definición del frame=== | ===Definición del frame=== | ||
Solo necesita '''Instancia 1''': | |||
[[Archivo:20250603 1133 CUENTA GRUPO FRAME.png|miniaturadeimagen|no|Definición del frame.]] | [[Archivo:20250603 1133 CUENTA GRUPO FRAME.png|miniaturadeimagen|no|Definición del frame.]] | ||
Solo | Con estas definiciones el frame transforma la tabla en una lista de checkboxes, marca las que estaban marcadas y finalmente, a pedido del master, arma los registros que hay que aplicar para que la tabla solo contenga los registros que están marcados en la pantalla. | ||
=Declaración= | |||
<pre> | |||
type | |||
TTfvsDBClientFrameCheckList = class(TTfvsDBClientFrame) | |||
Panel1: TPanel; | |||
Panel3: TPanel; | |||
PanelNAVEGADOR: TPanel; | |||
DBNavigator1: TfvsDBNavigator; | |||
Panel2: TPanel; | |||
SpeedButton_OPCIONES: TfvsBotonOpciones; | |||
prxListaCHECKS: TprxListView; | |||
procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean); | |||
private | |||
FADOField: Tfva_campos_item; | |||
FCheckedOffImage: Integer; | |||
FCargarComandosCount: Integer; | |||
FRefreshing: Boolean; | |||
protected | |||
procedure FieldMessage(var Message: TprxADODataSetMessage); message MSG_PRXADODATASETMESSAGE; | |||
procedure CargarComandos; | |||
procedure GuardarCambios(Sender: TObject); | |||
procedure CancelarCambios(Sender: TObject; var aCloseForm: Boolean); | |||
property ADOField: Tfva_campos_item read FADOField write FADOField; | |||
property CheckedOffImage: Integer read FCheckedOffImage write FCheckedOffImage; | |||
property CargarComandosCount: Integer read FCargarComandosCount write FCargarComandosCount; | |||
property Refreshing: Boolean read FRefreshing write FRefreshing; | |||
public | |||
procedure OnFrameShow(Sender: TObject); override; | |||
procedure ClassShow_BuildFrame(Sender: TObject); override; | |||
function ClassShow_AgregarTablaMaster(aTabla: String): Boolean; override; | |||
function ClassShow_AgregarControles: Boolean; override; | |||
function ClassShow_Activate(aActivateDataSet: Boolean): Boolean; override; | |||
procedure ClassShow_Activate_GetFilterCommands(aDataSet: TprxADODataSetEdit); override; | |||
end; | |||
</pre> | |||
=Implementación= | |||
===procedure CargarComandos=== | |||
Carga los comandos para refrescar el contenido del frame, asume que el dataset tiene sus propios datos refrescados. | |||
Primero carga la lista de registros del atributo, en el ejemplo ejecuta: | |||
<pre> | |||
SELECT * FROM CUENTA | |||
</pre> | |||
Después carga los registros de la tabla, en este caso CUENTA_GRUPOD, y marca con tilde los que existan. | |||
===procedure GuardarCambios(Sender: TObject)=== | |||
Guarda los registros correspondientes a los ítems marcados, el procedimiento es: | |||
*Elimina todos los registros de la tabla, con esto se simplifica mucho el grabado. | |||
*Arma registros de inserción para cada elemento marcado. | |||
Solo en el caso de que esta tabla sea el master aplica la transacción, sinó lo hará a través del master. | |||
<pre> | |||
if DataSet.IsTransactionMaster then | |||
begin | |||
DataSet.UpdateBatchXtd; | |||
end; | |||
</pre> | |||
===procedure CancelarCambios(Sender: TObject; var aCloseForm: Boolean)=== | |||
Cancela los cambios pendientes. | |||
===procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean)=== | |||
Procesa los eventos del navegador. | |||
<pre> | |||
if aButton = nbRefresh then | |||
begin | |||
CargarComandosCount := 0; | |||
CargarComandos; | |||
end | |||
else | |||
if aButton = nbEdit then | |||
begin | |||
prxListaCHECKS.CanCheck := True; | |||
prxListaCHECKS.SetFocus; | |||
end | |||
else | |||
if aButton = nbPost then | |||
begin | |||
GuardarCambios(Self); | |||
prxListaCHECKS.CanCheck := False; | |||
end | |||
else | |||
if aButton = nbCancel then | |||
begin | |||
CargarComandos; | |||
CargarComandosCount := 0; | |||
prxListaCHECKS.CanCheck := False; | |||
end; | |||
</pre> | |||
*Si debe refrescar vuelve a cargar los comandos. | |||
*Si debe editar setea el foco en el control de edición con los checks. | |||
*Si debe postear guarda los cambios. | |||
*Si debe cancelar vuelve a cargar los comandos. | |||
===function ClassShow_AgregarControles: Boolean=== | |||
Arma la lista de checks. | |||
=Uso= | |||
Este frame se usa según las condiciones explicadas en el ejemplo al inicio de este artículo. |
Revisión actual - 17:51 3 jun 2025
Descripción
El frame TTfvsDBClientFrameCheckList (Implementa lista para checkboxes) implementa un frame donde podemos editar una lista de líneas, cada una con un checkbox. Toma una clase definida y la transforma a una lista de checkboxes.
Necesita tener el frame de edición definido como se muestra en el ejemplo.
Identidad
- Ancestro: TTfvsDBClientFrame
- Carpeta: C:\DevelopPrx\frames
- Archivo: fvsDBClientFrameCheckList.pas
Ejemplo de definición
Vista de la pantalla en runtime
Usamos el detalle de CONTABILIDAD/GRUPOS DE CUENTAS como ejemplo, la pantalla se ve de la siguiente manera:

El detalle usa este frame, la definición de la clase es:
Lista de campos
Columna | Campo físico | Campo lógico | Observaciones |
---|---|---|---|
1 | (k) FGRUPO | Grupo | Código de agrupación. |
2 | (k) FCUENTA | Cuenta | Código de cuenta asociada a la agrupación. |
(k) identifica a los campos clave de la tabla.
La lista de checks va a aplicar sobre el último campo que sea clave, en este caso el de atributo CUENTA.
Definición del frame
Solo necesita Instancia 1:

Con estas definiciones el frame transforma la tabla en una lista de checkboxes, marca las que estaban marcadas y finalmente, a pedido del master, arma los registros que hay que aplicar para que la tabla solo contenga los registros que están marcados en la pantalla.
Declaración
type TTfvsDBClientFrameCheckList = class(TTfvsDBClientFrame) Panel1: TPanel; Panel3: TPanel; PanelNAVEGADOR: TPanel; DBNavigator1: TfvsDBNavigator; Panel2: TPanel; SpeedButton_OPCIONES: TfvsBotonOpciones; prxListaCHECKS: TprxListView; procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean); private FADOField: Tfva_campos_item; FCheckedOffImage: Integer; FCargarComandosCount: Integer; FRefreshing: Boolean; protected procedure FieldMessage(var Message: TprxADODataSetMessage); message MSG_PRXADODATASETMESSAGE; procedure CargarComandos; procedure GuardarCambios(Sender: TObject); procedure CancelarCambios(Sender: TObject; var aCloseForm: Boolean); property ADOField: Tfva_campos_item read FADOField write FADOField; property CheckedOffImage: Integer read FCheckedOffImage write FCheckedOffImage; property CargarComandosCount: Integer read FCargarComandosCount write FCargarComandosCount; property Refreshing: Boolean read FRefreshing write FRefreshing; public procedure OnFrameShow(Sender: TObject); override; procedure ClassShow_BuildFrame(Sender: TObject); override; function ClassShow_AgregarTablaMaster(aTabla: String): Boolean; override; function ClassShow_AgregarControles: Boolean; override; function ClassShow_Activate(aActivateDataSet: Boolean): Boolean; override; procedure ClassShow_Activate_GetFilterCommands(aDataSet: TprxADODataSetEdit); override; end;
Implementación
procedure CargarComandos
Carga los comandos para refrescar el contenido del frame, asume que el dataset tiene sus propios datos refrescados.
Primero carga la lista de registros del atributo, en el ejemplo ejecuta:
SELECT * FROM CUENTA
Después carga los registros de la tabla, en este caso CUENTA_GRUPOD, y marca con tilde los que existan.
procedure GuardarCambios(Sender: TObject)
Guarda los registros correspondientes a los ítems marcados, el procedimiento es:
- Elimina todos los registros de la tabla, con esto se simplifica mucho el grabado.
- Arma registros de inserción para cada elemento marcado.
Solo en el caso de que esta tabla sea el master aplica la transacción, sinó lo hará a través del master.
if DataSet.IsTransactionMaster then begin DataSet.UpdateBatchXtd; end;
procedure CancelarCambios(Sender: TObject; var aCloseForm: Boolean)
Cancela los cambios pendientes.
Procesa los eventos del navegador.
if aButton = nbRefresh then begin CargarComandosCount := 0; CargarComandos; end else if aButton = nbEdit then begin prxListaCHECKS.CanCheck := True; prxListaCHECKS.SetFocus; end else if aButton = nbPost then begin GuardarCambios(Self); prxListaCHECKS.CanCheck := False; end else if aButton = nbCancel then begin CargarComandos; CargarComandosCount := 0; prxListaCHECKS.CanCheck := False; end;
- Si debe refrescar vuelve a cargar los comandos.
- Si debe editar setea el foco en el control de edición con los checks.
- Si debe postear guarda los cambios.
- Si debe cancelar vuelve a cargar los comandos.
function ClassShow_AgregarControles: Boolean
Arma la lista de checks.
Uso
Este frame se usa según las condiciones explicadas en el ejemplo al inicio de este artículo.