TTfvsDBClientFrameMemo

De Pragma Wiki
Revisión del 19:18 3 jun 2025 de Luciano Carou (discusión | contribs.)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda

Descripción

El frame TTfvsDBClientFrameMemo (Implementa memo) implementa un frame que muestra un memo donde podemos escribir un texto con varias líneas.

Necesita tener el frame de edición definido como se muestra en el ejemplo.

Identidad

  • Ancestro: TTfvsDBClientFrame
  • Carpeta: C:\DevelopPrx\frames
  • Archivo: fvsDBClientFrameMemo.pas

Ejemplo de definición

Vista de la pantalla en runtime

Usamos el detalle de ORDENES COMPRA/MEMO como ejemplo, que es un memo en las ordenes de compra, la pantalla se ve de la siguiente manera:

Memo en una orden de compra.

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) FCMPCODIGO Comprobante Código de comprobante.
2 (k) FCMPLINEA Linea Línea del texto.
3 FMEMO FMEMO Texto ingresado.

(k) identifica a los campos clave de la tabla.

El frame memo guarda los textos ingresados en el último campo de la tabla, en este caso FMEMO, y el índice (cada renglón del memo) se guarda en el último campo clave (en este caso FLINEA).

FCMPCODIGO FCMPLINEA FMEMO
OCO-0001-000000001 1 POR FAVOR ENTREGAR EN
OCO-0001-000000001 2
OCO-0001-000000001 3 PORTÓN DE LA AVENIDA ROCA
OCO-0001-000000001 4
OCO-0001-000000001 5 ANUNCIAR EN PORTERÍA

Las líneas en blanco del memo se guardan también.

Definición del frame

Solo necesita Instancia 1:

Definición del frame.

Con estas definiciones el frame transforma la tabla en un memo y finalmente, a pedido del master, arma los registros que hay que GUARDAR.

Declaración

type
  TTfvsDBClientFrameMemo = class(TTfvsDBClientFrame)
    Panel1: TPanel;
    PanelINDICACIONES: TPanel;
    GroupBox1: TGroupBox;
    Panel2: TPanel;
    prxMemoCOMANDOS: TMemo;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    PanelNAVEGADOR_CUSTOM: TPanel;
    PanelNAVEGADOR_CUSTOM_Panel_BotonOpciones: TPanel;
    PanelNAVEGADOR_CUSTOM_BotonOpciones: TfvsBotonOpciones;
    PanelNAVEGADOR_CUSTOM_Panel_Left: TPanel;
    PanelNAVEGADOR_CUSTOM_DBNavigator: TfvsDBNavigator;
    procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean);
    procedure SpeedButton_OPCIONESGetPopupOptions(Sender: TComponent; aPopupMenu: TprxPopupMenu);
    procedure prxMemoSENTENCIAKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    FIndexField: String;
    FContentField: String;

    FAutoEdicion: Boolean;
    FpCATALOGO_TAG: Boolean;
    FRefreshing: Boolean;
    FEditing: Boolean;
  protected
    procedure   SetEditing(aValue: Boolean);

    procedure   DataLoad(Sender: TObject);
    procedure   DataInsert(Sender: TObject);
    procedure   DataEdit(Sender: TObject);
    procedure   DataPost(Sender: TObject);
    procedure   DataCancel(Sender: TObject);
    procedure   DataRefresh(Sender: TObject);

    procedure   FieldMessage(var Message: TprxADODataSetMessage); message MSG_PRXADODATASETMESSAGE;

    property    Refreshing: Boolean read FRefreshing write FRefreshing;
    property    Editing: Boolean read FEditing write SetEditing;
  public
    procedure   OnFrameShow(Sender: TObject); override;

    procedure   ClassShow_BuildFrame(Sender: TObject); override;
    function    ClassShow_AgregarControles: Boolean; override;
    function    ClassShow_Activate(aActivateDataSet: Boolean): Boolean; override;

    procedure   ClassShow_Activate_GetFilterCommands(aDataSet: TprxADODataSetEdit); override;

    procedure   OnExecute_POST(var aHandled: Boolean); override;
    procedure   OnExecute_CANCEL(var aHandled: Boolean); override;

    property    IndexField: String read FIndexField;
    property    ContentField: String read FContentField;

    property    AutoEdicion: Boolean read FAutoEdicion write FAutoEdicion;
    property    pCATALOGO_TAG: Boolean read FpCATALOGO_TAG write FpCATALOGO_TAG;
  end;

Implementación

procedure SetEditing(aValue: Boolean)

Setea el modo de edición.

La propiedad AutoEdicion indica si el memo es autoeditable, normalmente en pantallas donde la tabla que usa el memo es master y no es detalle de otra, entonces usa el navegador para cambiar el estado del dataset a inserción, edición (ambas operan del mismo modo con este control), grabado o cancelación.

procedure DataLoad(Sender: TObject)

Vuelca los registros del dataset en el memo.

procedure DataInsert(Sender: TObject)

Habilita el memo para la edición.

procedure DataEdit(Sender: TObject)

Habilita el memo para la edición.

procedure DataPost(Sender: TObject)

Guarda los comentarios ingresados.

procedure DataCancel(Sender: TObject)

Cancela la edición.

procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean)

Llamado desde el navegador, solo responde a:

  • nbRefresh para refrescar el contenido del memo.
  • nbEdit para editar el contenido.
  • nbPost para grabar el contenido.
  • nbCancel para cancelar la edición.

procedure prxMemoSENTENCIAKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState)

Procesa las teclas ingresadas en el memo, solo si la tabla es DEV ETIQUETAS captura el F5 para mostrar la lista de etiquetas posibles según el tipo de auxiliar que se está ingresando.

function ClassShow_AgregarControles: Boolean

Agrega los controles al frame.

Ajusta los botones visibles en el navegador dependiendo si el dataset es un detalle de otro o si es un master (en ese caso normalmente será autoeditable, es decir que el navegador va a manejar la edición del memo).

Toma los nombres de los campos índice y memo dependiendo si la tabla es o no pCATALOGO_TAG (ver DEV CATALOGOS/ETIQUETAS MENU):

  if DataSet.FieldsXtdList.ItemsCount >= 2 then
     begin
     if pCATALOGO_TAG = False then
        begin
        FIndexField   := DataSet.FieldsXtdList.Items[DataSet.FieldsXtdList.ItemsCount - 2].FieldName;
        FContentField := DataSet.FieldsXtdList.Items[DataSet.FieldsXtdList.ItemsCount - 1].FieldName;
        end
     else
        begin
        FIndexField   := DataSet.FieldsXtdList.Items[DataSet.FieldsXtdList.ItemsCount - 1].FieldName;
        FContentField := DataSet.FieldsXtdList.Items[DataSet.FieldsXtdList.ItemsCount - 2].FieldName;
        end;
     end;

La particularidad de la tabla pCATALOGO_TAG es que tiene el campo índice al final de la estructura de la tabla, eso se diferencia de la estructura normal para usar este frame que es que el campo índice esté antes del campo memo (como la tabla del ejemplo al inicio de este artículo).

Uso

Este frame se usa según las condiciones explicadas en el ejemplo al inicio de este artículo.