Diferencia entre revisiones de «TTfvsDBClientFrameScrollBox»

De Pragma Wiki
Ir a la navegación Ir a la búsqueda
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

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 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:

Agregar el atributo BREAK al grupo.

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):

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

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.

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 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: