Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Saber sobre que item estoy de un ComboBox (https://www.clubdelphi.com/foros/showthread.php?t=90124)

aguml 10-04-2016 20:23:19

Saber sobre que item estoy de un ComboBox
 
Pues el titulo creo que es bastante descriptivo pero lo explico mejor. La idea es que cuando despliege un ComboBox y me mueva sobre la lista saber sobre que item estoy para poder mostrar un Hint diferente en una StatusBar antes de seleccionar ninguna de las opciones. ¿es posible eso? ¿podeis explicarme como hacerlo?

AgustinOrtu 10-04-2016 21:23:47

Creo que los tiros van por el evento OnMouseMove

ecfisa 10-04-2016 22:39:16

Hola aguml.

Fijate si te sirve esta propuesta.

.h
Código PHP:

...
class 
TForm1 : public TForm
{
__published:
  
TComboBox *ComboBox1;
  
TStatusBar *StatusBar1;
  
void __fastcall FormCreate(TObject *Sender);
private:
  
void __fastcall AppIdle(TObject *Senderbool &done);
public:
  
__fastcall TForm1(TComponentOwner);
};
... 

.cpp
Código PHP:

...
void __fastcall TForm1::AppIdle(TObject *Senderbool &done)
{
  
TPoint pt;
  
HWND HWL;

  
GetCursorPos( &pt );
  
HWL WindowFromPointpt );

  if ( 
HWL != )
  {
    
StatusBar1->SimpleText "";
    
char buff[128];
    
GetClassNameHWLbuffsizeofbuff ) );
    if ( 
StrICompbuff"ComboLBox" ) == )
    {
      ::
ScreenToClientHWL, &pt );
      
int inx LOWORDSendMessageHWLLB_ITEMFROMPOINT0,
        (
LPARAM)(pt.65535 pt.x)) );

      if ( 
inx >= )
        
StatusBar1->SimpleText IntToStr(inx) + " " +
          
ComboBox1->Items->Strings[inx];
    }
  }
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
Application->OnIdle AppIdle;
  
ComboBox1->Items->CommaText =
    
"cero,uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve";
  
ComboBox1->DropDownCount 10;
}
... 

Salida:


Saludos :)

aguml 10-04-2016 22:56:05

¿En serio hay que hacer algo así solo para eso? Funcionar veo que funciona ��.
Para delphi vi esto usando el evento onmousemove pero no se si eso se puede pasar a c++Builder o es complicarse mucho la vida: https://www.devexpress.com/Support/C...Details/K18258

aguml 10-04-2016 23:10:57

Por cierto, esto que haces:
Código PHP:

 (LPARAM)(pt.65535 pt.x

Viene a ser lo mismo que hacer esto ¿no?:
Código PHP:

 (LPARAM)MAKELONG(pt.xpt.y

Por cierto en tu ejemplo saldría para todos los combobox del form pero en mi caso tengo dos forms y solo quiero ese comportamiento en uno por lo que supongo que teniendo el hWnd puedo obtener el nombre o el número de instancia para saber cual es ¿no?

aguml 10-04-2016 23:39:12

Se me ocurre algo asi:
Código PHP:

TEdit= (TEdit*)FindControl(HWL);
if (
E->Name == "ComboBox1")
   ... 


aguml 11-04-2016 00:17:33

La StatusBar la tengo de forma que muestra los hint de todos los componentes al ponerse encima así que creo que con cambiar el hint me valdría ¿no? Seria algo asi:
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" ) == )
*** {
*******
TComboBoxCB = (TComboBox*)FindControl(GetParent(HWL)); 
********if (
CB->Name == "ComboBox1"){
*********** ::
ScreenToClientHWL, &pt );
*********** 
int inx LOWORDSendMessageHWLLB_ITEMFROMPOINT0, (LPARAM)MAKELONG(pt.xpt.y)) );

*********** if ( 
inx >= )
************** 
CB->Hint=ListaStrings[inx];
***** }
*** }
* }



ecfisa 11-04-2016 06:00:49

Hola.
Cita:

Empezado por aguml (Mensaje 504272)
Por cierto, esto que haces:
Código PHP:

 (LPARAM)(pt.65535 pt.x

Viene a ser lo mismo que hacer esto ¿no?:
Código PHP:

 (LPARAM)MAKELONG(pt.xpt.y


Si, es equivalente.


Cita:

Por cierto en tu ejemplo saldría para todos los combobox del form pero en mi caso tengo dos forms y solo quiero ese comportamiento en uno por lo que supongo que teniendo el hWnd puedo obtener el nombre o el número de instancia para saber cual es ¿no?
Se me ocurre que una forma sencilla de discriminarlo podría ser:
.h
Código PHP:

class TForm1 : public TForm
{
__published:
...
private:
  
bool FInCBox1;  
  
void __fastcall AppIdle(TObject *Senderbool &done);
... 

.cpp
Código PHP:

...
TStringsListaHints

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
Application->OnIdle AppIdle;
  ...
  
FInCBox1 false;
  
ListaHints = new TStringList;
  
ListaHints->Assign(ComboBox1->Items);
}

void __fastcall TForm1::AppIdle(TObject *Senderbool &done)
{
  
TPoint pt;
  
HWND HWL;

  
GetCursorPos( &pt );
  
HWL WindowFromPointpt );

  if ( 
HWL != )
  {
    
StatusBar1->SimpleText "";
    
char buff[128];
    
GetClassNameHWLbuffsizeofbuff ) );
    if ( 
StrICompbuff"ComboLBox" ) == 0)
    {
      if ( 
FInCBox1)
      {
        ::
ScreenToClientHWL, &pt );
        
int inx LOWORDSendMessageHWLLB_ITEMFROMPOINT0,
          (
LPARAM)(pt.65535 pt.x) ) );

        if ( 
inx >= )
          
StatusBar1->SimpleText ListaHints->Strings[inx];
      }
    }
  }
}

void __fastcall TForm1::ComboBox1DropDown(TObject *Sender)
{
  
FInCBox1 true;
}

void __fastcall TForm1::ComboBox1CloseUp(TObject *Sender)
{
  
FInCBox1 false;
}

...

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  
delete ListaHints;




Cita:

La StatusBar la tengo de forma que muestra los hint de todos los componentes al ponerse encima así que creo que con cambiar el hint me valdría ¿no?
Si.

Saludos :)

aguml 11-04-2016 11:55:24

Ya solo me falta un detalle. Necesito tener un array de cadenas que sea accesible en mas de un sitio asi que lo que hago es esto:
private:
Código PHP:

static const AnsiString HintsMessages[18],HintsMessagesTypes[2]; 

Y en el constructor hago esto:
Código PHP:

__fastcall TForm1::TForm1(TComponentOwner)
   : 
TForm(Owner)
{
   
//Inicializo la cadena constante de validacion de entrada del teclado
   
GoodKey "0123456789abcdefABCDEF";

   const 
AnsiString TForm1::HintsMessages[18]={"Este mensaje activa la ventana.",
                    
"Este mensaje pone el foco en la ventana.",
                    
"Este mensaje quita el foco de la ventana.",
                    
"Este mensaje indica si se redibuja la ventana o no.",
                    
"Este mensaje se envia para preguntar a una ventana si se puede cerrar al cerrar sesión.",
                    
"Este mensaje se envia para indicar a una ventana que se va a cerrar sesión.",
                    
"Este mensaje envia un clic izquierdo.",
                    
"Este mensaje es el que se da al pulsar el botón izquierdo del ratón.",
                    
"Este mensaje es el que se da al soltar el botón izquierdo del ratón.",
                    
"Este mensaje es el que se da al hacer doble clic con el botón izquierdo del ratón.",
                    
"Este mensaje es el que se da al pulsar el botón derecho del ratón.",
                    
"Este mensaje es el que se da al soltar el botón derecho del ratón.",
                    
"Este mensaje es el que se da al hacer doble clic con el botón derecho del ratón.",
                    
"Este mensaje es el que se da al pulsar el botón central del ratón.",
                    
"Este mensaje es el que se da al soltar el botón central del ratón.",
                    
"Este mensaje es el que se da al hacer doble clic con el botón central del ratón.",
                    
"Este mensaje es el que se da al girar la rueda vertical del ratón.",
                    
"Este mensaje es el que se da al girar la rueda horizontal del ratón."};

   const 
AnsiString TForm1::HintsMessagesTypes[2]={"Esta opción espera la respuesta. El valor de retorno será la respuesta obtenida.",
                         
"Esta opción no espera respuesta alguna. Retorna 1 si se envió correctamente y 0 si falló."};


Lo que queria realmente es hacerlo con const char*name[] pero creo que sería aun mas complicado.
Con lo que tengo me da estos errores:
Cita:

[C++ Error] Main.cpp(26): E2089 Identifier 'HintsMessages' cannot have a type qualifier
[C++ Error] Main.cpp(45): E2089 Identifier 'HintsMessagesTypes' cannot have a type qualifier
Es que no me hace nada de gracia hacerlo con un TStrings y tener que añadir uno a uno. Por eso quiero hacerlo con un array, para inicializarlo de golpe todo.


La franja horaria es GMT +2. Ahora son las 12:28:53.

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