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=0; i < GroupBoxInventarioChris->ControlCount; i++){
if(GroupBoxInventarioChris->Controls[i]->ClassNameIs("TListBox")){
LB = static_cast<TListBox*>(GroupBoxInventarioChris->Controls[i]);
if(LB){
LB->WindowProc = newWndProc;
LB->ItemIndex = 0;
}
}
}
for(int i=0; i < GroupBoxInventarioSheva->ControlCount; i++){
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(TMessage& Message)
{
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 = WindowFromPoint( pt );
::ScreenToClient( HWL, &pt );
for(int i=0; i < TabControl1->ControlCount; i++){
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->Handle, SB_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=0; i < GroupBoxInventarioChris->ControlCount; i++){
if(GroupBoxInventarioChris->Controls[i]->ClassNameIs("TListBox")){
LB = static_cast<TListBox*>(GroupBoxInventarioChris->Controls[i]);
if(LB){
LB->WindowProc = _oldwndProc;
}
}
}
for(int i=0; i < GroupBoxInventarioSheva->ControlCount; i++){
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?