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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 10-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Creo que los tiros van por el evento OnMouseMove
Responder Con Cita
  #3  
Antiguo 10-04-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 10-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
¿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
Responder Con Cita
  #5  
Antiguo 10-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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?

Última edición por aguml fecha: 10-04-2016 a las 23:29:05.
Responder Con Cita
  #6  
Antiguo 10-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Se me ocurre algo asi:
Código PHP:
TEdit= (TEdit*)FindControl(HWL);
if (
E->Name == "ComboBox1")
   ... 
Responder Con Cita
  #7  
Antiguo 11-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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];
***** }
*** }
* }

Responder Con Cita
  #8  
Antiguo 11-04-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por aguml Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 11-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
combobox al seleccionar item, aparezca lista dependiendo item del primer combobox NovaV2 Varios 2 11-02-2016 02:28:08
Seleccionar item de ComboBox eennzzoo C++ Builder 4 23-06-2014 18:43:43
item de combobox abra nueva ventanita para agregar nuevo item al combobox Daniel10 OOP 2 03-05-2013 14:56:51
Seleccionar item de combobox forgiveness Conexión con bases de datos 1 16-11-2009 20:00:23
Seleccionar Item de ComboBox georgejg Varios 4 26-03-2008 16:43:03


La franja horaria es GMT +2. Ahora son las 16:39:42.


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