Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-06-2003
vichovi vichovi is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva (España)
Posts: 59
Poder: 21
vichovi Va por buen camino
Question Mi Combo y yo

Hola a tod@s:

Estoy haciendo un componente (para practicar ) derivado de TComboBox cuya propiedad importante (y unica) es la propiedad AutoWidth, la cual si esta a verdadero hace que al desplegar la lista del combo se vean todos los elementos.

Si la introduccion de los distintos elementos (Items) es en tiempo de diseño no hay problema, todo radica cuando añado items en tiempo de ejecucion que no se que hacer para que se vuelva a recalcular el ancho de los items. Uso el metodo RePaint pero no hace nada.

A ver si alguien me puede echar una manita (por favor)

Los fuentes del componente los podeis encontrar en:

http://vichovi.en.eresmas.com/ComboBoxSpecial.zip
__________________
Vivir a la deriva,
sentir,
que no se que hago aki...

(Extremo)
Responder Con Cita
  #2  
Antiguo 09-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

En tu nuevo componente deberías interceptar cuándo se han añadido, borrado o cambiado elementos de la propiedad Items. Es preferible que esto lo controle el componente, y no hacerlo "manualmente" desde tu programa, llamando a Repaint (este método no es el mejor para esto, puesto que se llama cada vez que se redibuja el control, aunque no esté desplegado).

Puesto que estás de practicas no te voy a ofrecer una solución completa, sólo algunas pistas. La propiedad Items de un Combo es del tipo TComboBoxStrings (todo esto lo puedes ver en la VCL). Cuando se inserta, elimina o cambia un Item, Items envía mensajes del tipo CB_ADDSTRING, CB_DELETESTRING ... etc al ComboBox asociado. Si el ComboBox intercepta estos mensajes, puedes poner a TRUE una variable booleana, llamémosla FItemsChanged, que indique que ha algo cambiado. Luego sobrescribes el método DropDown y ahí recalculas todo si ha habido cambios.

Otra cosa, he visto el codigo del componente. En el método Set de la propiedad Autowidth podrías comprobar en primer lugar que el valor pasado es diferente al valor de la propiedad, para evitar operaciones innecesarias.

Si finalmente lo implementas como he explicado arriba, podrías simplificar ese método Set de forma que pusiera la variable FItemsChanged a TRUE, sin recalcular el ancho de los Items. Esta operación sólo se realizaría en el DropDown, si hace falta.
__________________
Guía de Estilo
Responder Con Cita
  #3  
Antiguo 09-06-2003
vichovi vichovi is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva (España)
Posts: 59
Poder: 21
vichovi Va por buen camino
Talking

Muchas gracias en cuanto tenga un ratito probare lo que me dices (ya decia yo que como lo llevaba no iba demasiado bien )

En cuanto a lo de comprabacion que me comentas (para no hacer calculos innecesarios) la tenia pero probando probando la quite.

Muchisimas gracias por las pistas (las pistas sirven para agilizar la mente jeje)

Un saludo
__________________
Vivir a la deriva,
sentir,
que no se que hago aki...

(Extremo)
Responder Con Cita
  #4  
Antiguo 12-06-2003
vichovi vichovi is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva (España)
Posts: 59
Poder: 21
vichovi Va por buen camino
Tengo otro pequeño problemilla:

Capturo (por ahora) el mensaje CB_ADDSTRING y pongo a true la variable FItemsChanged (para indicar que los items han cambiado), y el problema es que al combo no se añade el nuevo item.

¿Como hago para añadir el nuevo elemento?

Intento hacer:
self.Items.Add(pchar(mensaje.LParam)

Pero me da un error de desbordamiento de pila.

(supongo que es porque al hacer el items.add del combo se vuelve a generar el mensaje CB_ADDSTRING hasta que se desborda la pila)


Gracias por todo.
__________________
Vivir a la deriva,
sentir,
que no se que hago aki...

(Extremo)
Responder Con Cita
  #5  
Antiguo 12-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

En el método donde capturas ese mensaje, sólo tienes que añadir (en este caso da igual antes que después de la línea FItemsChanged := TRUE), la sentencia inherited;, así, tal cual. Cuando se está en un método que intercepta mensajes, Delphi llama al anterior manejador de dicho mensaje que encuentre en la jerarquía de clases, de forma que ese manejador ya se encargará de insertar ese nuevo Item, sin más código por tu parte.

Pensando en este tema, hará falta ver cómo capturar los cambios cuando se asignen los Items "de golpe", mediante Assign. Es otra cuestión a solucionar.
__________________
Guía de Estilo
Responder Con Cita
  #6  
Antiguo 12-06-2003
vichovi vichovi is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva (España)
Posts: 59
Poder: 21
vichovi Va por buen camino
Gracias de nuevo Andres ya estaremos en contacto (cuando me meta con el Assing)

Un saludo.
__________________
Vivir a la deriva,
sentir,
que no se que hago aki...

(Extremo)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:38:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi