FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Componente derivado de DBEdit que active un hint con un dato específico
Tengo un componente TDBEditX diseñado por mi heredado de un TDBEdit
En el evento OnCreate del mismo TDBEditx trato de asignar un hint que depende del nombre del campo, es decir desde una tabla busco el campo y hallo una explicación del mismo que luego deseo asignar a la propiedad hint del componente. El problema es que el nombre del campo está en la propiedad DataField de TDBEditx que dentro del 'construct' del mismo es desconocida. Hay alguna forma de asignar este hint que se active después de ejecutar el evento Create del TDBEdit , de tal manera que ya sea conocida la propiedad DataField? Gracias de antemano.
__________________
SigmaMan |
#2
|
||||
|
||||
Yo creo que hasta que se produzca la asignación será imposible atribuirle un "Hint", puesto que desconocemos a que campo va a asociarse dicho Dbedit.
Como tu lo estás programando supongo que ya tendrás controlado en que momento se produce la asignación, en este momento por elemplo podrías llamar a una función CargaHints que hicera dicho trabajo. Dbedit1.Hint:='Bla.....'; Dbedit1.ShowHint:=True; Espero te sirva la idea. Un Saludo. |
#3
|
|||
|
|||
Precisamente eso es lo que quiero averiguar. Existe algún evento que me permita capturar el datafield, antes de mostrar el hint? Intenté con el onshowhint pero este es un evento de TApplication y no de TDBEdit. Y es que debiera existir tal evento ! Sino como hago para inicializar ciertas variables u operaciones del componente que dependan de los valores de las propiedades del mismo?
__________________
SigmaMan |
#4
|
|||
|
|||
Hola:
Prueba a interceptar el mensaje CM_HINTSHOW en tu componente, que se dispara cuando se necesita capturar el Hint, algo así como: Código:
TDBEditHint = class(TDBEdit) private procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; ... end; procedure TDBEditHint.CMHintShow(var Message: TMessage); begin if Field <> nil then with TCMHintShow(Message) do if TablaBusqueda.Locate(DataField, Field.Value, [loCaseInsensitive]) then HintInfo^.HintStr := TablaBusqueda.FieldByName('Descripcion').AsString else HintInfo^.HintStr := 'Descripción no disponible'; inherited; end; Cita:
Código:
TDBEditHint = class(TDBEdit) protected procedure Loaded; override; ... end; procedure TDBEditHint.Loaded; begin inherited Loaded; Hint := 'Mi nombre es ' + DataField; end;
__________________
Guía de Estilo |
#5
|
||||
|
||||
Durante la construcción, no todos los objetos del mismo nivel están disponibles, debido a que se crean a medida que se "extraen" del ejecutable. Sin embargo hay un método protegido llamado Loaded, que se invoca cuando todos los objetos ya han sido creados y las relaciones entre objetos ya están disponibles.
Lo normal sería utilizar este método, algo así como: Código:
Interface TMyDBEdit : Class(TDBEdit) .. Protected Procedure Loaded; override; ... End; Implementation ... Procedure TDBMyEdit.Loaded; Begin inherited; if not csDesigning in ComponentState Then Hint := BuscarHintParaElCampo(Self.FieldName); End; ... Hasta luego,
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
|
|