Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2016
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 18
mblascog Va por buen camino
Buscar elemento en listbox

Buenas,
Estoy intentando encontrar la manera que según el contenido de un edit.txt se posicione el cursor en un listbox.
He hecho lo siguiente:

Código Delphi [-]
procedure Tpform.buscaChange(Sender: TObject);
begin
  if Lista.Items.IndexOf(busca.text) > 0 then
    Lista.ItemIndex := Lista.Items.IndexOf(busca.text);
end;

Pero este código posiciona el cursor siempre que la coincidencia sea exacta, y a mi me gustaría que se posicionara cuando coincida el inicio del elemento del listbox, es dir, si en el edit.txt escribo 'ab' se posicione al primer elemento que empieze por ab.
Estoy leyendo que no es posible. Si no es posible, hay algún componente que lo permita?

Gracias

Última edición por mblascog fecha: 05-05-2016 a las 23:55:47.
Responder Con Cita
  #2  
Antiguo 06-05-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
En donde dice que no es posible?

Lo podes implementar "a mano", o podes buscar por "ComboBox incremental search".

En Delphi 7 creo que no esta implementado, pero en realidad el que lo implementa es el control ComboBox de Windows que la VCL envuelve, con enviar un mensaje usando la API de Windows lo podes lograr

La otra forma es implementarlo uno mismo

Debes recorrer los strings contenidos en tu combo, comparar cada uno con la cadena de texto que esta ingresada en el combo en ese momento, y si hay coincidencia parcial, poner ese elemento como seleccionado y cortar el bucle

Código Delphi [-]
uses
  StrUtils;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  I: Integer;
  AText, s: string;
begin
  AText := ComboBox1.Text;

  if AText = EmptyStr then
    Exit;

  for I := 0 to ComboBox1.Items.Count - 1 do
  begin
    s := ComboBox1.Items[i];
    if StartsText(AText, s) then
    begin
      ComboBox1.ItemIndex := I;
      ComboBox1.SelStart := Length(AText);
      ComboBox1.SelLength := Length(s) - Length(AText);
      Break;
    end;
  end;
end;

Creo que este es un inicio

Edito: Perdon, lei mal, hablas de TListBox, pero creo que el concepto es el mismo
Responder Con Cita
  #3  
Antiguo 06-05-2016
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 18
mblascog Va por buen camino
Gracias AgustinOrtu. Creo que defiere un poco entre el ComboBox y el ListBox. SeltStart y SelLength no están implementadas en ListBox.
Había pensado en la implementación manual, y voy a hacerlo ahora, pero me da la sensación que debe ser lento, pues además de buscar si por el contenido del edit empieza algún elemento del listbox (ordenado), tienes que comprobar cuando se haya pasado, para no hacer todo el bucle
Responder Con Cita
  #4  
Antiguo 06-05-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Con esto te debería valer:

Código Delphi [-]
var
  i, j: Integer;
begin
  j := -1;
  for i := 0 to (ListBox1.Count - 1) do begin
    if AnsiStrLIComp(PChar(ListBox1.Items[i]), PChar(Edit1.Text), Length(Edit1.Text))=0 then begin
      j := i;
      Break;
    end;
  end;
  ListBox1.ItemIndex := j;

Te selecciona el primero que coincida o no te selecciona ninguno si no hay elemento coincidente.

Si cambias AnsiStrLIComp (case-insensitive) por AnsiStrLComp (case-sensitive) conseguirás que distinga o no por may/min.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 06-05-2016
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 18
mblascog Va por buen camino
Muchas gracias, funciona perfecto, aunque para optimizarlo, ya que la lista contiene muchos ítems, está bien controlar que cuando se ha pasado de largo salga del bucle
Responder Con Cita
  #6  
Antiguo 06-05-2016
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 18
mblascog Va por buen camino
Para optimizar había pensado con este if:

Código Delphi [-]
if copy(Listbox1.Items[i], 1, length(edit1.text) > edit1.text then
break

Pero no funciona, pues Ló es más grande que Lu, con esto quiero decir que, si por ejemplo busco Lucena no lo encuentra, dado que antes encuentra López y al ser mayor, sale del bucle
Responder Con Cita
  #7  
Antiguo 06-05-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por mblascog Ver Mensaje
Muchas gracias, funciona perfecto, aunque para optimizarlo, ya que la lista contiene muchos ítems, está bien controlar que cuando se ha pasado de largo salga del bucle
Creo que he puesto el break dentro del bucle.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
modificar un elemento de un listBox PaulaGV Internet 4 14-04-2012 01:14:10
Problemas para deseleccionar un elemento de un listbox neon OOP 5 19-08-2011 16:00:18
Buscar un elemento en un array sin recorrerlo David OOP 3 23-07-2011 16:15:40
Buscar dentro del ListBox FrianxD C++ Builder 9 06-03-2008 07:20:27
Elemento seleccionado de un ListBox Tecnic2 OOP 12 22-05-2007 11:39:18


La franja horaria es GMT +2. Ahora son las 23:41:19.


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