Diferencia entre revisiones de «TTfvsDBClientFrameScrollBox»
Sin resumen de edición |
|||
(No se muestran 5 ediciones intermedias del mismo usuario) | |||
Línea 9: | Línea 9: | ||
*Archivo: fvsDBClientFrameScrollBox.pas | *Archivo: fvsDBClientFrameScrollBox.pas | ||
=Ejemplo de definición= | |||
===Frame en diseño=== | ===Frame en diseño=== | ||
[[Archivo:20250603 1425 SCROLLBOX FRAME DISEÑO.png|miniaturadeimagen|no|Frame en diseño.]] | [[Archivo:20250603 1425 SCROLLBOX FRAME DISEÑO.png|miniaturadeimagen|no|Frame en diseño.]] | ||
Línea 27: | Línea 28: | ||
[[Archivo:20250603 1441 SCROLLBOX FRAME AGREGAR BREAK.png|miniaturadeimagen|no|Agregar el atributo BREAK al grupo.]] | [[Archivo:20250603 1441 SCROLLBOX FRAME AGREGAR BREAK.png|miniaturadeimagen|no|Agregar el atributo BREAK al grupo.]] | ||
Ahora vemos la misma pantalla, pero con los dos paneles: | Ahora vemos la misma pantalla, pero con los dos paneles y el splitter separando ambos (se nota el cursor indicando el separador justo entre ambos paneles): | ||
[[Archivo:20250603 1443 SCROLLBOX FRAME DOS PANELES.png|miniaturadeimagen|no|Frame con dos paneles.]] | [[Archivo:20250603 1443 SCROLLBOX FRAME DOS PANELES.png|miniaturadeimagen|no|Frame con dos paneles.]] | ||
El comando '''BREAK''' abre el panel a derecha, solo lo hace una vez por lo que si más de un campo tiene el comando el panel se abre solo con el primero. | |||
===Definición del frame=== | |||
No es necesario definir este frame durante el diseño de las clases ya que es la opción por defecto. | |||
=Declaración= | |||
<pre> | |||
type | |||
TTfvsDBClientFrameScrollBox = class(TTfvsDBClientFrame) | |||
Panel1: TPanel; | |||
PanelNAVEGADOR: TPanel; | |||
DBNavigator1: TfvsDBNavigator; | |||
Bevel1: TBevel; | |||
Panel2: TPanel; | |||
PanelIZQUIERDO: TPanel; | |||
PanelDERECHO: TPanel; | |||
Splitter1: TSplitter; | |||
prxScrollBoxIZQUIERDO: TprxScrollBox; | |||
prxScrollBoxDERECHO: TprxScrollBox; | |||
Panel3: TPanel; | |||
SpeedButton_OPCIONES: TfvsBotonOpciones; | |||
Action_INSERT: TAction; | |||
Action_EDIT: TAction; | |||
Action_POST: TAction; | |||
Action_CANCEL: TAction; | |||
Action_DELETE: TAction; | |||
procedure Panel1Resize(Sender: TObject); | |||
procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean); | |||
procedure SpeedButton_OPCIONESGetPopupOptions(Sender: TComponent; aPopupMenu: TprxPopupMenu); | |||
procedure TestCommandsClick(Sender: TObject); | |||
procedure Action_BotonOpcionesVisibleExecute(Sender: TObject); | |||
procedure Action_INSERT_Execute(Sender: TObject); | |||
procedure Action_EDIT_Execute(Sender: TObject); | |||
procedure Action_POST_Execute(Sender: TObject); | |||
procedure Action_CANCEL_Execute(Sender: TObject); | |||
procedure Action_DELETE_Execute(Sender: TObject); | |||
private | |||
FUsaPanelDERECHO: Boolean; | |||
FMasterClass: TfvsClass; | |||
protected | |||
procedure SetUsaPanelDERECHO(aValue: Boolean); | |||
function GetUsaPanelDERECHO: Boolean; | |||
procedure SetDataSet(aValue: TprxADODataSetEdit); override; | |||
property MasterClass: TfvsClass read FMasterClass write FMasterClass; | |||
public | |||
constructor Create(AOwner: TComponent); override; | |||
destructor Destroy; override; | |||
procedure OnFrameShow(Sender: TObject); override; | |||
function AgregarControles(aDataSet: TprxADODataSetEdit; aTableName: String): Integer; 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 OnExecute_INSERT(var aHandled: Boolean); override; | |||
procedure OnExecute_EDIT(var aHandled: Boolean); override; | |||
procedure OnExecute_POST(var aHandled: Boolean); override; | |||
procedure OnExecute_CANCEL(var aHandled: Boolean); override; | |||
procedure OnExecute_DELETE(var aHandled: Boolean); override; | |||
procedure OnExecute_REFRESH(var aHandled: Boolean); override; | |||
property UsaPanelDERECHO: Boolean read GetUsaPanelDERECHO write SetUsaPanelDERECHO; | |||
end; | |||
</pre> | |||
=Implementación= | |||
===procedure OnFrameShow(Sender: TObject)=== | |||
Al mostrar el frame arma los controles que corresponden al panel izquierdo, si también debe usar el panel derecho arma esos controles también. | |||
===procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean)=== | |||
Ejecutado por el navegador | |||
*nbInsert es la inserción y ejecuta OnExecute_INSERT. | |||
*nbDelete es la eliminación y ejecuta OnExecute_DELETE. | |||
*nbEdit es la edición y ejecuta OnExecute_EDIT. | |||
*nbPost es el posteo de los cambios y ejecuta OnExecute_POST. | |||
*nbCancel es la cancelación de la operación corriente (inserción o edición) y ejecuta OnExecute_CANCEL. | |||
===procedure SpeedButton_OPCIONESGetPopupOptions(Sender: TComponent; aPopupMenu: TprxPopupMenu)=== | |||
Arma el menú popup del botón de opciones: | |||
*Agrega la opción de '''Opciones de la clase''' (ver [[DEV AUXILIARES/OPCIONES|OPCIONES]]: Opciones de menú objetos). | |||
*Agrega la opción de '''Orígenes''' (ver [[DEV AUXILIARES/ORIGEN|ORIGENES]]: Orígenes de datos). | |||
*Agrega la opción de relaciones. | |||
*Agrega la opción de archivos adjuntos (ver [[COMPROBANTES/ADJUNTOS]]). | |||
*Si el dataset tiene detalles habilita esa opción. | |||
*Habilita la opción de seguimiento marcada como obsoleta. | |||
*Habilita el menú de impresión. | |||
===function ClassShow_AgregarControles: Boolean=== | |||
Agrega los controles del dataset, si se encuentra con un '''BREAK''' habilita el panel derecho (y el splitter). No los agrega directamente a los paneles, sino que los guarda en un array interno, uno para el panel izquierdo y otro para el derecho. El armado visual se hace en '''OnFrameShow'''. | |||
===procedure Action_INSERT_Execute(Sender: TObject)=== | |||
Llamado desde el INSERT del navegador, llama a OnExecute_INSERT. | |||
===procedure OnExecute_INSERT(var aHandled: Boolean)=== | |||
Ejecuta la operación de inserción, controla que esté disponible con: | |||
<pre> | |||
if DataSet.State = dsBrowse then | |||
begin | |||
if DataSet.CanInsertXtd then | |||
DataSet.InsertXtd(Self); | |||
end; | |||
</pre> | |||
===procedure Action_EDIT_Execute(Sender: TObject)=== | |||
Llamado desde el EDIT del navegador, llama a OnExecute_EDIT. | |||
===procedure OnExecute_EDIT(var aHandled: Boolean)=== | |||
Ejecuta la operación de edición, controla que esté disponible con: | |||
<pre> | |||
if DataSet.State = dsBrowse then | |||
begin | |||
if DataSet.CanEditXtd then | |||
DataSet.EditXtd(Self); | |||
end; | |||
</pre> | |||
===procedure Action_POST_Execute(Sender: TObject)=== | |||
Llamado desde el POST del navegador, llama a OnExecute_POST. | |||
===procedure OnExecute_POST(var aHandled: Boolean)=== | |||
Ejecuta la operación de posteo: | |||
<pre> | |||
if (DataSet.State = dsInsert) or (DataSet.State = dsEdit) then | |||
begin | |||
DataSet.PostXtd(Self); | |||
if DataSet.IsTransactionMaster then | |||
begin | |||
DataSet.UpdateBatchXtd; | |||
if DataSet is TprxADODataSetMaster then | |||
TprxADODataSetMaster(DataSet).RefreshXtd | |||
else | |||
DataSet.Refresh; | |||
end; | |||
if DataSet is TprxADODataSetDetail then | |||
CloseForm(TTfvsFrame_CloseForm_ModalResult_mrOk) | |||
else | |||
if DataSet is TprxADODataSetMaster then | |||
begin | |||
if TprxADODataSetMaster(DataSet).KeepFormOpen = False then | |||
CloseForm(TTfvsFrame_CloseForm_ModalResult_mrOk); | |||
end; | |||
end; | |||
</pre> | |||
*Antes que nada llama al PostXtd. | |||
*Si es el master llama a UpdateBatchXtd para grabar la transacción. | |||
*Si es un detalle simplemente cierra el form para volver a su grilla. | |||
===procedure Action_CANCEL_Execute(Sender: TObject)=== | |||
Llamado por el CANCEL del navegador, ejecuta OnExecute_CANCEL. | |||
===procedure OnExecute_CANCEL(var aHandled: Boolean)=== | |||
Llama al CancelXtd del dataset, y posteriormente cierra el form. | |||
===procedure Action_DELETE_Execute(Sender: TObject)=== | |||
Llamado por el DELETE del navegador, ejecuta OnExecute_DELETE. | |||
===procedure OnExecute_DELETE(var aHandled: Boolean)=== | |||
Elimina un registro, antes verifica que la operación esté disponible. | |||
<pre> | |||
if DataSet.State = dsBrowse then | |||
begin | |||
if DataSet.CanDeleteXtd(True) then | |||
begin | |||
DataSet.DeleteXtd(Self); | |||
if DataSet.IsTransactionMaster then | |||
begin | |||
DataSet.UpdateBatchXtd; | |||
if DataSet is TprxADODataSetMaster then | |||
TprxADODataSetMaster(DataSet).RefreshXtd | |||
else | |||
DataSet.Refresh; | |||
end; | |||
end; | |||
end; | |||
</pre> | |||
===procedure OnExecute_REFRESH(var aHandled: Boolean)=== | |||
Refresca los datos, solo llama al ancestro. | |||
=Uso= | |||
Este frame es la opción por defecto para las clases defindas usando: | |||
*[[DEV CLASES|Clases (prxclases)]]. | |||
*[[DEV CLASES/CAMPOS|Clases, campos (prxcampos)]]. |
Revisión actual - 20:18 3 jun 2025
Descripción
El frame TTfvsDBClientFrameScrollBox (Implementa scrollbox para agregar controles de edición.) implementa dos paneles separados por un TSplitter vertical que es un control visual que permite cambiar el tamaño de esos paneles. El splitter puede moverse con el mouse para que los paneles se agranden o achiquen según hacia donde se mueva.
Identidad
- Ancestro: TTfvsDBClientFrame
- Carpeta: C:\DevelopPrx\frames
- Archivo: fvsDBClientFrameScrollBox.pas
Ejemplo de definición
Frame en diseño

- Navegador permite navegar entre los registros del dataset, cambiar el estado (inserción, edición, etc) y se activará según el dataset. Está contenido dentro de un panel horizontal que ocupa todo el ancho del frame.
- TScrollbox izquierdo es el panel visible por defecto, al panel se le agregan controles de edición. Si éstos ocuparan más que la altura del panel aparecerán barras de desplazamiento (scroll bars).
- TScrollbox derecho por defecto no está visible, pero si alguno de los campos contiene el prefijo BREAK en su definición entonces este panel se hace visible y contendrá los siguientes campos. Del mismo modo que el panel a izquierda, si los controles agregados superaran la altura del panel aparecerán barras de desplazamiento.
- Splitter divide ambos paneles y permite correrlo hacia la izquierda o derecha para cambiar el ancho de los paneles.
Ver Panel para mayores detalles sobre el posicionamiento de un control en un frame.
Frame con un solo panel
Este frame corresponde a la tabla de ARTICULOS y tiene un solo panel.

Frame con dos paneles
Para ver el mismo frame con dos paneles primero tenemos que agregar el atributo BREAK al campo selección:

Ahora vemos la misma pantalla, pero con los dos paneles y el splitter separando ambos (se nota el cursor indicando el separador justo entre ambos paneles):

El comando BREAK abre el panel a derecha, solo lo hace una vez por lo que si más de un campo tiene el comando el panel se abre solo con el primero.
Definición del frame
No es necesario definir este frame durante el diseño de las clases ya que es la opción por defecto.
Declaración
type TTfvsDBClientFrameScrollBox = class(TTfvsDBClientFrame) Panel1: TPanel; PanelNAVEGADOR: TPanel; DBNavigator1: TfvsDBNavigator; Bevel1: TBevel; Panel2: TPanel; PanelIZQUIERDO: TPanel; PanelDERECHO: TPanel; Splitter1: TSplitter; prxScrollBoxIZQUIERDO: TprxScrollBox; prxScrollBoxDERECHO: TprxScrollBox; Panel3: TPanel; SpeedButton_OPCIONES: TfvsBotonOpciones; Action_INSERT: TAction; Action_EDIT: TAction; Action_POST: TAction; Action_CANCEL: TAction; Action_DELETE: TAction; procedure Panel1Resize(Sender: TObject); procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean); procedure SpeedButton_OPCIONESGetPopupOptions(Sender: TComponent; aPopupMenu: TprxPopupMenu); procedure TestCommandsClick(Sender: TObject); procedure Action_BotonOpcionesVisibleExecute(Sender: TObject); procedure Action_INSERT_Execute(Sender: TObject); procedure Action_EDIT_Execute(Sender: TObject); procedure Action_POST_Execute(Sender: TObject); procedure Action_CANCEL_Execute(Sender: TObject); procedure Action_DELETE_Execute(Sender: TObject); private FUsaPanelDERECHO: Boolean; FMasterClass: TfvsClass; protected procedure SetUsaPanelDERECHO(aValue: Boolean); function GetUsaPanelDERECHO: Boolean; procedure SetDataSet(aValue: TprxADODataSetEdit); override; property MasterClass: TfvsClass read FMasterClass write FMasterClass; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure OnFrameShow(Sender: TObject); override; function AgregarControles(aDataSet: TprxADODataSetEdit; aTableName: String): Integer; 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 OnExecute_INSERT(var aHandled: Boolean); override; procedure OnExecute_EDIT(var aHandled: Boolean); override; procedure OnExecute_POST(var aHandled: Boolean); override; procedure OnExecute_CANCEL(var aHandled: Boolean); override; procedure OnExecute_DELETE(var aHandled: Boolean); override; procedure OnExecute_REFRESH(var aHandled: Boolean); override; property UsaPanelDERECHO: Boolean read GetUsaPanelDERECHO write SetUsaPanelDERECHO; end;
Implementación
procedure OnFrameShow(Sender: TObject)
Al mostrar el frame arma los controles que corresponden al panel izquierdo, si también debe usar el panel derecho arma esos controles también.
Ejecutado por el navegador
- nbInsert es la inserción y ejecuta OnExecute_INSERT.
- nbDelete es la eliminación y ejecuta OnExecute_DELETE.
- nbEdit es la edición y ejecuta OnExecute_EDIT.
- nbPost es el posteo de los cambios y ejecuta OnExecute_POST.
- nbCancel es la cancelación de la operación corriente (inserción o edición) y ejecuta OnExecute_CANCEL.
procedure SpeedButton_OPCIONESGetPopupOptions(Sender: TComponent; aPopupMenu: TprxPopupMenu)
Arma el menú popup del botón de opciones:
- Agrega la opción de Opciones de la clase (ver OPCIONES: Opciones de menú objetos).
- Agrega la opción de Orígenes (ver ORIGENES: Orígenes de datos).
- Agrega la opción de relaciones.
- Agrega la opción de archivos adjuntos (ver COMPROBANTES/ADJUNTOS).
- Si el dataset tiene detalles habilita esa opción.
- Habilita la opción de seguimiento marcada como obsoleta.
- Habilita el menú de impresión.
function ClassShow_AgregarControles: Boolean
Agrega los controles del dataset, si se encuentra con un BREAK habilita el panel derecho (y el splitter). No los agrega directamente a los paneles, sino que los guarda en un array interno, uno para el panel izquierdo y otro para el derecho. El armado visual se hace en OnFrameShow.
procedure Action_INSERT_Execute(Sender: TObject)
Llamado desde el INSERT del navegador, llama a OnExecute_INSERT.
procedure OnExecute_INSERT(var aHandled: Boolean)
Ejecuta la operación de inserción, controla que esté disponible con:
if DataSet.State = dsBrowse then begin if DataSet.CanInsertXtd then DataSet.InsertXtd(Self); end;
procedure Action_EDIT_Execute(Sender: TObject)
Llamado desde el EDIT del navegador, llama a OnExecute_EDIT.
procedure OnExecute_EDIT(var aHandled: Boolean)
Ejecuta la operación de edición, controla que esté disponible con:
if DataSet.State = dsBrowse then begin if DataSet.CanEditXtd then DataSet.EditXtd(Self); end;
procedure Action_POST_Execute(Sender: TObject)
Llamado desde el POST del navegador, llama a OnExecute_POST.
procedure OnExecute_POST(var aHandled: Boolean)
Ejecuta la operación de posteo:
if (DataSet.State = dsInsert) or (DataSet.State = dsEdit) then begin DataSet.PostXtd(Self); if DataSet.IsTransactionMaster then begin DataSet.UpdateBatchXtd; if DataSet is TprxADODataSetMaster then TprxADODataSetMaster(DataSet).RefreshXtd else DataSet.Refresh; end; if DataSet is TprxADODataSetDetail then CloseForm(TTfvsFrame_CloseForm_ModalResult_mrOk) else if DataSet is TprxADODataSetMaster then begin if TprxADODataSetMaster(DataSet).KeepFormOpen = False then CloseForm(TTfvsFrame_CloseForm_ModalResult_mrOk); end; end;
- Antes que nada llama al PostXtd.
- Si es el master llama a UpdateBatchXtd para grabar la transacción.
- Si es un detalle simplemente cierra el form para volver a su grilla.
procedure Action_CANCEL_Execute(Sender: TObject)
Llamado por el CANCEL del navegador, ejecuta OnExecute_CANCEL.
procedure OnExecute_CANCEL(var aHandled: Boolean)
Llama al CancelXtd del dataset, y posteriormente cierra el form.
procedure Action_DELETE_Execute(Sender: TObject)
Llamado por el DELETE del navegador, ejecuta OnExecute_DELETE.
procedure OnExecute_DELETE(var aHandled: Boolean)
Elimina un registro, antes verifica que la operación esté disponible.
if DataSet.State = dsBrowse then begin if DataSet.CanDeleteXtd(True) then begin DataSet.DeleteXtd(Self); if DataSet.IsTransactionMaster then begin DataSet.UpdateBatchXtd; if DataSet is TprxADODataSetMaster then TprxADODataSetMaster(DataSet).RefreshXtd else DataSet.Refresh; end; end; end;
procedure OnExecute_REFRESH(var aHandled: Boolean)
Refresca los datos, solo llama al ancestro.
Uso
Este frame es la opción por defecto para las clases defindas usando: