TprxDBComboBox

De Pragma Wiki
Revisión del 19:55 23 may 2025 de Luciano Carou (discusión | contribs.) (→‎Implementación)
(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 objeto TprxDBComboBox (Control de edición DB para enumeraciones.) es un control de edición usando cuando el valor del campo se define en Enumeraciones.

Combobox en la pantalla de cuentas.

El control tiene una caja de edición, y una lista pull-down en la que están los valores posibles, el valor del campo no se tipea, sino que se elige de la lista.

Identidad

  • Ancestro: TDBComboBox
  • Carpeta: C:\DevelopPrx\library
  • Archivo: prxDBComboBox.pas

Declaración

type
  TprxDBComboBox_GetItems = procedure (aItems: TStrings) of object;

type
  TprxDBComboBox = class(TDBComboBox)
  private
    FEnumeration: String;

    FOnEnterField: TprxADOOnEnterField;
    FOnExitField: TprxADOOnExitField;

    FConstraintItems: TStringList;
    FAllItems: TStringList;

    FGetItemsCall: TprxDBComboBox_GetItems;

    procedure   CMEnter(var Message: TCMEnter); message CM_ENTER;
		procedure   CMExit(var Message: TCMExit); message CM_EXIT;
    procedure   CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
    procedure   FieldMessage(var Message: TprxADODataSetMessage); message MSG_PRXADODATASETMESSAGE;
  protected
    procedure   SetEnumeration(aValue: String);

    property    ConstraintItems: TStringList read FConstraintItems write FConstraintItems;
    property    AllItems: TStringList read FAllItems write FAllItems;
    property    GetItemsCall: TprxDBComboBox_GetItems read FGetItemsCall write FGetItemsCall;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure   Loaded; override;

    procedure   SelectItemPublic;
    procedure   CargarElementos(aOnEnter: Boolean);

    procedure   AssignDataSource(aDataSource: TDataSource; aDataField: String; aEnumeration: String); overload;
    procedure   AssignDataSource(aDataSource: TDataSource; aDataField: String; aGetItems: TprxDBComboBox_GetItems); overload;

    property    Enumeration: String read FEnumeration write SetEnumeration;
  published
    property    OnEnterField: TprxADOOnEnterField read FOnEnterField write FOnEnterField;
    property    OnExitField: TprxADOOnExitField read FOnExitField write FOnExitField;
  end;

FOnEnterField: TprxADOOnEnterField

Permite definir una referencia al procedimiento que debe manejar el OnEnter.

FOnExitField: TprxADOOnExitField

Permite definir una referencia al procedimiento que debe manejar el OnExit.

Implementación

function TprxDBComboBoxCreate(aOwner: TComponent; aDataSource: TDataSource; aFieldName: String): TprxDBComboBox

Función definida fuera de la clase usada para crear componentes de este tipo.

procedure Loaded

El procedimiento Loaded se ejecuta cuando un form ya se ha instanciado y está listo para mostrarse al usuario, inicializa algunas de las propiedades.

Suscribe a los mensajes de dataset:

TprxADODataSetEdit(DataSource.Dataset).Messages.Subscribe(Self, DataField);
TprxADODataSetEdit(DataSource.Dataset).FieldsXtdList.AssignEditControl(DataField, Self);

Inicializa OnEnter y OnExit a los definidos en el TprxADODataSetEdit:

OnEnterField := TprxADODataSetEdit(DataSource.Dataset).OnEnterFieldXtd;
OnExitField  := TprxADODataSetEdit(DataSource.Dataset).OnExitFieldXtd;

Finalmente carga los elementos del combo:

if TprxADODataSetEdit(DataSource.Dataset).FieldsXtdList.FieldByName(DataField) <> nil then
   begin
   CargarElementos(False);
   end;

procedure CargarElementos(aOnEnter: Boolean)

Carga los elementos de la enumeración, lo hace desde las tablas de Enumeraciones.

Además, verifica si no existe un CONSTRAINT definido en TpAUX_CAMPO_CONSTRAINT_unit.

procedure CMEnter(var Message: TCMENTER)

Llama al OnEnterField, además llama al procedimiento CargarElementos por si el tipo de enumeración requiere de un refresco en el OnEnter (sql_on_enter).

procedure CMExit(var Message: TCMExit)

Llama al OnExitField, si el resultado es True sigue normalmente, sino vuelve a setear foco en el control.

procedure CNKeyDown(var Message: TWMKeyDown)

Atrapa las teclas:

  • VK_RETURN (ENTER) y avanza al siguiente control.
  • VK_F5 solo cuando hay una CONSTRAINT definido.

procedure FieldMessage(var Message: TprxADODataSetMessage)

Recibe y procesa mensajes de la aplicación, los mensajes son:

  • msgInsert el dataset cambia a inserción.
  • msgEdit el dataset cambia a edición.
  • msgCancel cancela la inserción o edición.
  • msgPost el dataset posteó los cambios.
  • msgEnable habilita (o deshabilita) un control según el estado que tenía.
  • msgDisable deshabilita el control.
  • msgFocus pone el foco sobre el control (si el control lo admite).
  • msgFindFocus si el control puede enfocar lo hace.
  • msgScroll el dataset cambia de registro.

Uso

Este control se usa cuando el campo elige su valor desde una enumeración, normalmente es instanciado por TprxScrollBox.