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 13-12-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Item de listbox seleccion con scroll

Hola amigos, aqui estoy oootra vez jajaja. No se que haria sin vosotros
Tengo una duda, he creado un listbox del cual solo se ve un Item y voy desplazandome con el scroll vertical de este. Lo que quiero es que, conforme me desplace, se autoseleccione el item que se ve en ese momento. Llevo toda la mañana y no doy con la manera.
Como estilo lo tengo en lbOwnerDrawFixed.
Por otro lado quiero evitar que se pueda escribir ni para buscar, solo quiero una lista por la que desplazarse con el scroll vertical y que se vaya seleccionando el que esté visible en ese momento.
¿alguna idea?
Responder Con Cita
  #2  
Antiguo 14-12-2017
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.

Una opción es,

.h
Código PHP:
...
class 
TForm1 : public TForm
{
__published:    // IDE-managed Components
  
TListBox *ListBox1;
  
void __fastcall FormCreate(TObject *Sender);
  
void __fastcall FormDestroy(TObject *Sender);  
private:    
// User declarations
  
TWndMethod _oldwndProc;
  
void __fastcall newWndProc(TMessageMessage);
  
void __fastcall vertScroll(TObject *Sender);
public:        
// User declarations
  
__fastcall TForm1(TComponentOwner);
};
... 
.cpp:
Código PHP:
...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
_oldwndProc ListBox1->WindowProc;
  
ListBox1->WindowProc newWndProc;
  
ListBox1->ItemIndex  0;
}

void __fastcall TForm1::newWndProc(TMessageMessage)
{
  if(
Message.Msg == WM_VSCROLL)
    
vertScroll(ListBox1);
  
_oldwndProc(Message);
}

void __fastcall TForm1::vertScroll(TObject *Sender)
{
  
ListBox1->Selected[GetScrollPos(ListBox1->HandleSB_VERT)] = true;
}

...

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  
ListBox1->WindowProc _oldwndProc;

Salida:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 14-12-2017 a las 22:39:43.
Responder Con Cita
  #3  
Antiguo 14-12-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¡Qué curioso!
Responder Con Cita
  #4  
Antiguo 15-12-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Tengo un problema con tu codigo, tengo 18 listboxs que requieren hacer eso y no veo una solucion buena crear 18 funciones, una para cada, y no se me ocurre como hacer que todas tengan la misma funcion y funcione solo con el listbox que la use en ese momento.
Responder Con Cita
  #5  
Antiguo 15-12-2017
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
Tengo un problema con tu codigo, tengo 18 listboxs que requieren hacer eso y no veo una solucion buena crear 18 funciones, una para cada, y no se me ocurre como hacer que todas tengan la misma funcion y funcione solo con el listbox que la use en ese momento.
Así es, pero lamentablemente omitiste ese "pequeño" detalle en tu primer mensaje...

Otra opción:

.h
Código PHP:
class TMyListBox : public TListBox
{
private:
  
int _index;
  
TWndMethod _oldWndProc;
  
TNotifyEvent _vScroll;

protected:
  
virtual void __fastcall WndProc(TMessage &msg) {
    if (
msg.Msg == WM_VSCROLL && _vScroll) {
     
_index GetScrollPos(this->HandleSB_VERT);
     
_vScroll(this);
    }
    
TListBox::WndProc(msg);
  }

public:
  
__fastcall TMyListBox(TComponent *Owner) : TListBox(Owner) {
    
_oldWndProc this->WindowProc;
    }
  
__property TNotifyEvent OnVerticalScroll = {read _vScrollwrite _vScroll};
  
__property int CurrentIndex = {read _index};
  
__fastcall ~TMyListBox() {
    
this->WindowProc _oldWndProc;
  }
}; 
.cpp
Código PHP:
...
TMyListBox *lb1// *lb2,...,*lb18

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
lb1 = new TMyListBox(this);
  
lb1->Parent this;
  
lb1->Items->CommaText "cero,uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve";
  
lb1->Height 22;
  
lb1->Left   100;
  
lb1->Top    50;
  
lb1->Font->Size 9;
  
lb1->OnVerticalScroll ListBoxVScroll;
}

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

Dado el grado de reusabilidad que puedas darle en lo futuro, podrías convertirlo en componente para así realizar las inicializaciones en tiempo de diseño.

Salida:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 15-12-2017 a las 20:19:26. Razón: Agregar comentario
Responder Con Cita
  #6  
Antiguo 15-12-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Me gusta mas la otra opcion y he estado liado con ello intentando adaptar el codigo y he llegado a esto:
Código PHP:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    
//Necesario para el desplazamiento automatico de los listbox de Armas2 y Armas3
    
TListBox *LB;
    
_oldwndProc ListBoxCatArmaChris1->WindowProc;
    
    for(
int i=0GroupBoxInventarioChris->ControlCounti++){
        if(
GroupBoxInventarioChris->Controls[i]->ClassNameIs("TListBox")){
            
LB static_cast<TListBox*>(GroupBoxInventarioChris->Controls[i]);
            if(
LB){
                
LB->WindowProc newWndProc;
                
LB->ItemIndex  0;
            }
        }
    }
    for(
int i=0GroupBoxInventarioSheva->ControlCounti++){
        if(
GroupBoxInventarioSheva->Controls[i]->ClassNameIs("TListBox")){
            
LB static_cast<TListBox*>(GroupBoxInventarioSheva->Controls[i]);
            if(
LB){
                
LB->WindowProc newWndProc;
                
LB->ItemIndex  0;
            }
        }
    }
}
//-------------------------------------------------------------------------

void __fastcall TForm1::newWndProc(TMessageMessage)
{
    if(
Message.Msg == WM_VSCROLL)
        
vertScroll(LBActual);
    
_oldwndProc(Message);
}
//-------------------------------------------------------------------------

void __fastcall TForm1::vertScroll(TObject *Sender)
{
    
TPanel *Panel;
    
TGroupBox *GB;
    
TComboBox *CB;
    
AnsiString nombreCB;
    
TPoint pt;
    
HWND HWL;

    
GetCursorPos( &pt );
    
HWL WindowFromPointpt );
    ::
ScreenToClientHWL, &pt );

    for(
int i=0TabControl1->ControlCounti++){
        if(
TabControl1->Controls[i]->ClassNameIs("TPanel") && TabControl1->Controls[i]->Visible==true){
            
Panel static_cast<TPanel*>(TabControl1->Controls[i]);
            if(
Panel->Name == "PanelArmas2"){
                
GB GroupBoxInventarioChris;
            }else if(
Panel->Name == "PanelArmas3"){
                
GB GroupBoxInventarioSheva;
            }
            
//char buff[128];
            //GetClassName( HWL, buff, sizeof( buff ) );
            
LBActual = (TListBox*)GB->ControlAtPos(pt,false,true);
            
LBActual->Selected[GetScrollPos(LBActual->HandleSB_VERT)] = true;
            
nombreCB="ComboBox"+LBActual->Name.SubString(11,LBActual->Name.Length());
            
CB static_cast<TComboBox*>(GB->FindChildControl(nombreCB));
            
RellenarCombo(CB,LBActual->ItemIndex);
            break;
        }
    }
}
//-------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    
TListBox *LB;
    for(
int i=0GroupBoxInventarioChris->ControlCounti++){
        if(
GroupBoxInventarioChris->Controls[i]->ClassNameIs("TListBox")){
            
LB static_cast<TListBox*>(GroupBoxInventarioChris->Controls[i]);
            if(
LB){
                
LB->WindowProc _oldwndProc;
            }
        }
    }
    for(
int i=0GroupBoxInventarioSheva->ControlCounti++){
        if(
GroupBoxInventarioSheva->Controls[i]->ClassNameIs("TListBox")){
            
LB static_cast<TListBox*>(GroupBoxInventarioSheva->Controls[i]);
            if(
LB){
                
LB->WindowProc _oldwndProc;
            }
        }
    }
}
//------------------------------------------------------------------------- 
El primer problema es que desaparecen todos los ListBox menos el primero y al cerrar la aplicacion da una excepcion incluso despues de salir del evento OnDestroy.
El segundo problema es que no soy capaz de obtener el ListBox actual. Intenté con el evento OnMouseMove del ListBox pero al usar el scroll de este no entra en ese evento asi que lo estoy intentando como ven en el codigo, atraves de la posicion en el GroupBox pero no retorna el Puntero al ListBox aunque he podido ver que la clase es TListBox con las dos lineas que tengo comentadas. Por otro lado LBActual ya no hace falta pasarla como parametro y podria estar en la funcion vertScroll ya que solo hago uso de ella ahi.
¿Como puedo hacer para saber cual ListBox es el que llama a la funcion? ¿Y para solucionar lo de los ListBox que desaparecen?

Última edición por aguml fecha: 15-12-2017 a las 21:04:21.
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
Seleccion de item en combobox da error list index out of bonds jafera OOP 18 09-05-2013 10:21:54
Pregunta Combobox, selección del item sin hacer click NPIdea OOP 2 15-01-2010 07:42:14
ListBox - Scroll Kreyser Varios 2 08-06-2005 13:27:24
Scroll en un listbox kakesoft OOP 0 06-04-2005 02:40:25
Selección automática item combobox neon OOP 0 24-02-2005 13:59:22


La franja horaria es GMT +2. Ahora son las 00:55:29.


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