Tengo un ListBox con una serie de elementos ordenados Alfabeticamente.
Los elementos del Listbox pueden estar en una de esta dos situaciones
1- Elemento Inhabilitado: Ha sido "tomado" anteriormente (incluido en otra estructura) y no puede volver a ser "tomado"
2 -Elemento Habilitado: Puede ser "tomado"
Para distinguirlos visualmente he considerado diferenciarlos mediante el color del texto.
Gris: InHabilitado
Rojo: Habilitado.
Para ello he modificado la Proiedad del ListBox a Style = LBOWERDRAWFIXED y asi redibujar el listBox con el evento DRAWITEM cada vez que se opere con um elemento del ListBox.
En el Porcedimiento ListBoxDrawItem he implementado el codigo:
- Código: Seleccionar todo
- Código:
- void __fastcall *********::ListBoxDrawItem(TWinControl *Control,
- int Index, TRect &Rect, TOwnerDrawState State)
- {
- //EstadEquipos[] es un vector de booleans que indicara si el equipo
- //que esta en la posicion que se corresponde con el indice esyta
- //Habilitado o no.
- //Si esta Seleccionado cambiar color
- if (EstadEquipos[Index]== false)
- {
- ListHistEquip->Canvas->FillRect(Rect);
- ListHistEquip->Canvas->Font->Color=clDkGray;//Color texto gris
- ListHistEquip->Canvas->TextOut(Rect.Left,Rect.Top,ListHistEquip->Items->Strings[Index]);
- }
- else
- {
- //Si el Item esta seleccionado
- if (State.Contains(odSelected))
- {
- ListHistEquip->Canvas->FillRect(Rect);
- ListHistEquip->Canvas->Font->Color=clWhite; //Color texto blanco
- ListHistEquip->Canvas->TextOut(Rect.Left,Rect.Top,ListHistEquip->Items->Strings[Index]);
- }
- else
- {
- ListHistEquip->Canvas->FillRect(Rect);
- ListHistEquip->Canvas->Font->Color=clRed; //Color texto Rojo
- ListHistEquip->Canvas->TextOut(Rect.Left,Rect.Top,ListHistEquip->Items->Strings[Index]);
- }
- }
- }
Hasta Aqui todo perfecto..
Mi problema surge cuando quiero que al pulsar una tecla (una letra) el item seleccionado (el que aparezca resaltado con la franja azul caracteristica) seal el primero que comienze por la letra pulsada.
Para ello en el evento KEYDOWN del ListBox he incluido este codigo:
Código:
- Código: Seleccionar todo
- Char L;
- for (int i=0; i<ListEquipJorn>Count;i++)
- {
- L = ListEquipJorn->Items->Strings[i][1];
- if (L==Key && EstadEquipos[i])
- {
- ListEquipJorn->ItemIndex = i; //Selecciono item (Primero que empieza por la letra pulsada
- break;
- }
- }
!!!! SIEMPRE EL ITEM SELECCIONADO ES EL SEGUNDO ELEMENTO QUE COMIENZA POR LA LETRA PULSADA !!! Crying or Very sad
He seguido el programa paso a paso y este es su funcionamiento:
1 . Supongamos que la tecla pulsada es la G y el primer elemento que empieza por la letra G esta en la posicion 15.
2 . El Evento KEYDOWN funciona perfectamente al llegar a la posicion 15 la reconoce como primer elemento que empieza por G y lo selecciona:
ListEquipJorn->ItemIndex = i; sale del bucle.sale del evento.
3. Redibuja el ListBox: Aqui es donde no entiendo el funcionamiento
a) Entra en el evento DrawItem con Index = 15 lo reconoce como selecionado sale del evente
b) Vuelve a entrar en el evento con Index =16 ?? lo reconoce como no selecionado sale del evento
c) Vuelve a entrar en el evento como index =16 ?? lo reconoce como no selecionado sale del evento
c) Vuelve a entrar en el evento como index =15 ?? lo reconoce como NO selecionado sale del evento
d) Vuelve a entrar en el evento como index =16 ?? lo reconoce como SI selecionado sale del evento
el segundo elemento que comienza por G (index =16 ) esta seleccionado
Alguna Idea Gracias


