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

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:

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