Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-12-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 727
Poder: 6
aguml Va por buen camino
Mostrar el Hint de la lista desplegable de un combobox

La idea es ir moviendo el raton por encima de la lista y como son textos mas grandes pues ir mostrando el Hint. Tengo esto a partir de una funcion que me pasasteis y intento modificarla:
Código PHP:
void __fastcall TForm1::AppIdle(TObject *Senderbool &done)
{
    
TPoint pt;
    
HWND HWL;

    
GetCursorPos( &pt );
    
HWL WindowFromPointpt );

    if ( 
HWL != )
    {
        
char buff[128];
        
GetClassNameHWLbuffsizeofbuff ) );
        if ( 
StrICompbuff"ComboLBox" ) == 0)
        {
            
int inx;
            if ( 
FInCBoxMaps)
            {
                ::
ScreenToClientHWL, &pt );
                
inx LOWORDSendMessageHWLLB_ITEMFROMPOINT0,
                (
LPARAM)MAKELONG(pt.xpt.y)));

                if ( 
inx >= ){
                    
//Aqui muestro la imagen
                    
MostrarImagenMapa(inx);
                }
            }
            
TComboBox *CB static_cast<TComboBox*>(FindVCLWindow(Mouse->CursorPos));
            if(
CB)
                
CB->HintCB->Items[inx].Text;
        }
    }

El caso es que creo que lo que hago para mostrar el hint no es correcto porque compila pero me parece que CB nunca obtiene un puntero valido. ¿me podrian ayudar?
Responder Con Cita
  #2  
Antiguo 14-12-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 727
Poder: 6
aguml Va por buen camino
He estado liado con ello pero no doy con el modo y tengo muchas dudas que no se como solucionar.
Esto es lo que tengo para controlar el evento de desplazarse por la lista y mostrar los Hints:
Código PHP:
//Funcion que controla el evento de desplazamiento del raton sobre los items del combobox de los mapas
void __fastcall TForm1::AppIdle(TObject *Senderbool &done)
{
    
TPoint pt;
    
HWND HWL;

    
RECT rcItem,rcLista;

    
GetCursorPos( &pt );
    
HWL WindowFromPointpt );

    if ( 
HWL != )
    {
        
char buff[128];
        
GetClassNameHWLbuffsizeofbuff ) );
        if ( 
StrICompbuff"ComboLBox" ) == 0)
        {
            
int inx;
            if ( 
FInCBox)
            {
                ::
ScreenToClientHWL, &pt );
                
inx LOWORDSendMessageHWLLB_ITEMFROMPOINT0,
                (
LPARAM)MAKELONG(pt.xpt.y)));

                if ( 
inx >= ){
                    
//Aqui muestro la imagen
                    
if(FInCBoxMaps){
                        
MostrarImagenMapa(inx);
                    }

                    
memset(textoHint,'\0',sizeof(textoHint));

                    
//Obtengo la cadena del item
                    
SendMessageHWLLB_GETTEXTinxint(&textoHint));
                    
//Obtengo su posicion en la lista
                    
SendMessageHWLLB_GETITEMRECTinx, (LPARAM)&rcItem);
                    
int largo=SendMessageHWLLB_GETTEXTLEN,inx,0);
                    
//Muestro el hint siempre y cuando sea diferente al que ya se esta mostrando
                    
if(StrIComptextoHinthint->Caption.c_str()) != 0)
                    {
                        
//Necesito saber cuando estoy dentro de la lista del combobox y cuando no para mostrar el hint o hacerlo desaparecer

                        //Necesito indicarle tanto la posicion donde mostrarse como el tamaño justo
                        
rcLista.left=pt.x//Necesito la posicion donde se debe mostrar el hint ya que esto me lo muestra arriba del todo de la pantalla
                        
rcLista.top=pt.y//Necesito la posicion donde se debe mostrar el hint ya que esto me lo muestra arriba del todo de la pantalla
                        
rcLista.right=rcLista.left + (largo 6); //Necesito el ancho justo de lo que ocupa el texto porque esto no funciona asi
                        
rcLista.bottom=rcLista.top + (rcItem.bottom rcItem.top); //Necesito el alto justo de lo que ocupa el texto
                        
hint->Caption=textoHint;
                        
hint->Color=clInfoBk;
                        
hint->ActivateHint(rcLista,textoHint);
                    }
                }
            }
        }
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxMapasDropDown(TObject *Sender)
{
    
hint= new THintWindow(ComboBoxMapas->Handle);
    
FInCBoxMaps true;
    
FInCBox true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxMapasCloseUp(TObject *Sender)
{
    
delete hint;
    
ComboBoxMapas->Hint ComboBoxMapas->Items->Strings[ComboBoxMapas->ItemIndex];
    
FInCBoxMaps false;
    
FInCBox false;
    
MostrarImagenMapa(ComboBoxMapas->ItemIndex);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxsDropDown(TObject *Sender)
{
    
hint= new THintWindow(ComboBoxMapas->Handle);
    
FInCBox true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxsCloseUp(TObject *Sender)
{
    
delete hint;
    
ComboBoxMapas->Hint ComboBoxMapas->Items->Strings[ComboBoxMapas->ItemIndex];
    
FInCBox false;
}
//--------------------------------------------------------------------------- 
Y en el .h:
Código PHP:
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    
...
    ...
    
void __fastcall ComboBoxMapasCloseUp(TObject *Sender);
    
void __fastcall ComboBoxMapasDropDown(TObject *Sender);
    
void __fastcall ComboBoxsDropDown(TObject *Sender);
    
void __fastcall ComboBoxsCloseUp(TObject *Sender);
private:    
// User declarations
    
...
    ...
    
//Para mostrar imagenes cuando me mueva por el ComboBox de mapas
    
bool FInCBoxFInCBoxMaps;
    
THintWindow *hint;
    
char  textoHint[200];

    
void __fastcall AppIdle(TObject *Senderbool &done);
public:        
// User declarations
    
__fastcall TForm1(TComponentOwner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif 
Me muestra los Hints pero me los muestra arriba del todo de la pantalla en vez de debajo del item de la lista o encima o al lado como hace windows normalmente. Ademas no se como ponerle el ancho correcto para que coja todo el texto del Item. ¿Alguien que pueda ayudarme?
He visto un post donde Roman comenta sobre el tema y de ahi me he guiado un poco: https://www.clubdelphi.com/foros/sho...429#post523429
Tambien hablaba de que habia creado un componente que hacia esto pero al intentar descargarlo de los enlaces no puedo entrar en su pagina con lo que no puedo descargarlo y seria interesante tener un componente ya hecho que me hubiese ahorrado muchos dolores de cabeza
Responder Con Cita
  #3  
Antiguo 14-12-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.181
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
He visto un post donde Roman comenta sobre el tema y de ahi me he guiado un poco: https://www.clubdelphi.com/foros/sho...429#post523429
Tambien hablaba de que habia creado un componente que hacia esto pero al intentar descargarlo de los enlaces no puedo entrar en su pagina con lo que no puedo descargarlo
Esa página ya no existe. En el otro hilo te he puesto el componente.

LineComment Saludos
Responder Con Cita
  #4  
Antiguo 14-12-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 727
Poder: 6
aguml Va por buen camino
He conseguido solucionarlo casi todo y ha quedado asi:
Código PHP:
//Funcion que controla el evento de desplazamiento del raton sobre los items del combobox de los mapas
void __fastcall TForm1::AppIdle(TObject *Senderbool &done)
{
    
TPoint pt;
    
HWND HWL;

    
RECT rcItem;

    
GetCursorPos( &pt );
    
HWL WindowFromPointpt );

    if ( 
HWL != )
    {
        
char buff[128];
        
GetClassNameHWLbuffsizeofbuff ) );
        if ( 
StrICompbuff"ComboLBox" ) == 0)
        {
            
int inx;
            if ( 
FInCBox)
            {
                ::
ScreenToClientHWL, &pt );
                
inx LOWORDSendMessageHWLLB_ITEMFROMPOINT0,
                (
LPARAM)MAKELONG(pt.xpt.y)));

                if ( 
inx >= ){
                    
//Aqui muestro la imagen
                    
if(FInCBoxMaps && lastIndex != inx){
                        
MostrarImagenMapa(inx);
                        
lastIndex=inx;
                    }

                    
//memset(textoHint,'\0',sizeof(textoHint));

                    //Obtengo la cadena del item
                    
SendMessageHWLLB_GETTEXTinxint(&textoHint));
                    
//Obtengo su posicion en la lista
                    
SendMessageHWLLB_GETITEMRECTinx, (LPARAM)&rcItem);
                }
            }
            
//Muestro el hint siempre y cuando sea diferente al que ya se esta mostrando
            
if(pt.>= rcItem.left && pt.<= rcItem.right && pt.>= rcItem.top && pt.<= rcItem.bottom)
            {
                
//Vuelvo a mostrarlo siempre que sea uno diferente al anterior
                
if(StrIComptextoHinthint->Caption.c_str()) != 0)
                {
                    
//Necesario para saber la posicion relativa para mostrar el hint
                    
::ClientToScreen(HWL, &pt);
                    
//int largo=SendMessage( HWL, LB_GETTEXTLEN,inx,0);
                    
                    
rcItem.left=pt.x;
                    
rcItem.top=pt.y;
                    
rcItem.right=pt.300//Necesito el ancho justo de lo que ocupa el texto porque esto no funciona asi
                    
rcItem.bottom=pt.15//Necesito el alto justo de lo que ocupa el texto
                    
hint->Caption=textoHint;
                    
hint->Color=clInfoBk;
                    
hint->ActivateHint(rcItem,textoHint);
                }
            }
        }else{
            if(
hint != NULL){
                
hint->ReleaseHandle();
                
hint->Caption="";
            }
        }
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxMapasDropDown(TObject *Sender)
{
    
hint= new THintWindow(ComboBoxMapas->Handle);
    
FInCBoxMaps true;
    
FInCBox true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxMapasCloseUp(TObject *Sender)
{
    if(
hint != NULL){
        
delete hint;
        
hint=NULL;
    }
    
ComboBoxMapas->Hint ComboBoxMapas->Items->Strings[ComboBoxMapas->ItemIndex];
    
FInCBoxMaps false;
    
FInCBox false;
    
MostrarImagenMapa(ComboBoxMapas->ItemIndex);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxsDropDown(TObject *Sender)
{
    
hint= new THintWindow(ComboBoxMapas->Handle);
    
FInCBox true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBoxsCloseUp(TObject *Sender)
{
    
TComboBox *CB static_cast<TComboBox*>(Sender);
    
CB->Hint CB->Items->Strings[CB->ItemIndex];
    if(
hint != NULL){
        
delete hint;
        
hint=NULL;
    }
    
FInCBox false;
}
//--------------------------------------------------------------------------- 
Lo que me falta es asignar el tamaño correcto al Hint para que se vea del largo del texto pero no se como hacerlo y ya llevo dos dias con esto.
Responder Con Cita
  #5  
Antiguo 14-12-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 727
Poder: 6
aguml Va por buen camino
Bueno, mirando el componente de Román he conseguido hacerlo. Gracias a todos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Lista Desplegable en una Celda C++ DanielMC C++ Builder 3 07-10-2012 23:16:57
Lista desplegable dudas lejia Varios 7 14-01-2008 15:48:47
Como utilizo un ComboBox Para Mostrar una lista de una Columna?? foetus Conexión con bases de datos 5 06-07-2007 04:37:30
lista desplegable nikotina Conexión con bases de datos 1 09-10-2006 19:27:23
Lista desplegable dinámica HombreSigma PHP 1 12-07-2004 09:22:39


La franja horaria es GMT +2. Ahora son las 15:32:32.


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