Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Mostrar el Hint de la lista desplegable de un combobox (https://www.clubdelphi.com/foros/showthread.php?t=92632)

aguml 13-12-2017 16:32:17

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?

aguml 14-12-2017 14:58:03

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 :p

roman 14-12-2017 16:47:00

Cita:

Empezado por aguml (Mensaje 523448)
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

aguml 14-12-2017 17:26:05

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.

aguml 14-12-2017 19:18:29

Bueno, mirando el componente de Román he conseguido hacerlo. Gracias a todos.


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

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