![]() |
Al modificar MaxLength ajustar TEdit.Width
Hice un componente TEditor derivado de TEdit y deseo añadirle la funcionalidad de que:
Si Autosize:=True y MaxLength<>0, Entonces se modifique el valor de Width para que se ajuste al número de caracteres máximo. Ese nuevo valor de Width debe tomar en cuenta el Font definido para el componente y el cambio debe ser visible en tiempo de diseño y en tiempo de ejecución. Actualmente, en una child Form incluyo mi componente TEditor y modifico esas propiedades en tiempo de diseño y no se ajusta el Width. Para calcular el ancho he visto algunos códigos por la red pero no he encontrado cómo atrapar/generar el evento que indique la modificación del valor de Autosize o de MaxLength para asignar el nuevo valor a Width. Gracias por adelantado. |
Hola elGuerrero.
Creo que podrías hacer algo así:
Saludos. |
Cita:
El primero es el método de la propiedad AutoSize, y el segundo se llama directamente desde el método SetMaxLength. |
SetAutoSize y DoSetMaxLength en práctica
Gracias a ambos por sus ideas. Me hicieron sentido, pero creo que me falta un detalle técnico para implementarlas en mi componente.
Al componente que hice le asigne un monospaced font para que fuera un ancho constante, lo incluyo en el Form y le modifico las propiedades en tiempo de diseño pero no me ha funcionado. Les adjunto lo esencial del código, esperando me puedan orientar para corregir mi error: Código:
|
SetAutoSize funcionando
H!
Buscando en la red, encontré un código de A. Johnson para lo redimensionar el componente TEdit. Lo adapté y si funcionó: Código:
procedure TEditor.AjustarWidth;Código:
procedure TEditor.CreateWnd;¿Qué me estará faltando? ¿No habrá otra manera de llamar el procedimiento AjustarWidth cuando se cambie el valor de MaxLength? Espero puedan ayudarme. Gracias de antemano. |
Solución con WMPaint
La solución anterior me ocasionó problemas en la apariencia del componente pues borraba el contenido de él, no actualizaba cuando cambiaba la MaxLength y otros detalles.
Se me ocurrió hacerlo a través de WMPaint, que se ejecuta al redibujar el control, así que recargue los procedimientos Código:
TEditor = class(TEdit)Código:
procedure TEditor.WMPaint(var Msg: TWMPaint);Código:
procedure TEditor.SetAutoSize(Value: Boolean);Esta solución la terminé consultando varios códigos fuente, sin embargo, tengo duda en cuanto a que si tengo bugs en el código o errores de diseño ¿Uds. qué creen? Les agradezco de antemano sus respuestas. |
| La franja horaria es GMT +2. Ahora son las 16:27:50. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi