Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con ComboBox (https://www.clubdelphi.com/foros/showthread.php?t=43936)

MaMu 24-05-2007 13:28:28

Problema con ComboBox
 
Resulta que tengo una base de datos access, donde tengo almacenado muchos nombres, y para hacer la selección de los nombres, se me ocurrió poner un ComboBox, style csDropDown para que me permita escribir como si fuera un TEdit, y asi poder filtrarlos según con que letra empiecen, y que se me carguen estos filtrados como items. Por ejemplo, si escribo la letra "L", el ComboBox se me rellena con todos los nombres que empiecen con la letra "L", asi:

Código Delphi [-]
procedure TMiagenda.ComboBox6Change(Sender: TObject);
var nombre:string;
     i:integer;
begin
  //por las dudas lo vacío, sino me acumula los filtros
  ComboBox6.Items.Clear;
  nombre:=ComboBox6.Text;
 if (nombre<>'')
  then begin
      ComboBox6.Items.Clear;
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('select * from amigos where nombre like '''+ComboBox6.Text+'%''');
      ADOQuery1.ExecSQL;  
      ADOQuery1.Open;
  //relleno los items con lo que se encontró
      for i:=0 to ADOQuery1.RecordCount-1 do
         begin
           ComboBox6.Items.Add(ADOQuery1.FieldByName('nombre').AsString);
         ADOQuery1.Next;
      end;
  end
  else begin
  //no encontró nada pues, la entrada esta vacia 
  ComboBox6.Items.Clear;
  end;
end;

Pero me pasan algunas cosas que no se como solucionar:

- Cuando escribo algo, si es solo la primera letra, el ComboBox se rellena bien, con todos los nombres que empiezan por esa letra, pero cuando selecciono cualquiera de la lista, no me queda como ComboBox6.Text, por lo que me aparece vacío, y como unico item en la lista, y yo necesito ver la selección.

- Si yo escribo más de una letra, se invierte la escritura, asi:
* si escribo la letra "L" me aparecen todos los que empiezan por "L", pero supongamos que quiero los que empiezan con "LA", como ser Laura, Lautaro, etc. se me invierte la escritura, osea, escribo "L" seguido de eso la "A", pero me lo toma "AL" y asi suscesivamente, asumo que es porque utilizo el evento OnChange, entonces cada vez detecta el cambio.

Como podría hacerlo? se entiende lo que quiero hacer? Es un simple ComboBox que se rellene con los valores que filtro y que me permita seleccionarlos, la idea es no poner un TButton, sino hacerlo directamente.
Si alguien me puede dar una mano, le estare muy agradecido.

Saludos y Gracias

Lepe 24-05-2007 13:57:29

Si tienes delphi 7 (en delphi 6 búscalo por si acaso) tienes un componente llamado TcomboboxEx que hace lo que quieres de una forma más cómoda. Cargas todos los elementos y ese tipo de filtro ya lo hace el ComboboxEx.

Si quieres seguir con lo que tienes hecho, ten cuidado con las mayúsculas y minúsculas que igual interfiere. Además, podrías usar el evento OnkeyUp (donde si tendrás el texto y la tecla que recién se ha pulsado.

Saludos

MaMu 24-05-2007 14:41:05

Cita:

Empezado por Lepe
Si tienes delphi 7 (en delphi 6 búscalo por si acaso) tienes un componente llamado TcomboboxEx que hace lo que quieres de una forma más cómoda. Cargas todos los elementos y ese tipo de filtro ya lo hace el ComboboxEx.

Si quieres seguir con lo que tienes hecho, ten cuidado con las mayúsculas y minúsculas que igual interfiere. Además, podrías usar el evento OnkeyUp (donde si tendrás el texto y la tecla que recién se ha pulsado.

Saludos

Y como seria un ejemplo usando ComboboxEx :confused: ?, nunca lo usé :eek: !!!.

Saludos;)

Lepe 24-05-2007 16:16:02

Idéntico al combo normal, excepto que en el inspector de objetos, especificas las siguientes opciones:
Código:

            AutoCompleteOptions = [acoAutoSuggest, acoAutoAppend, acoFilterPrefixes, acoUseTab]
            ItemsEx.SortType = stText

Si le quieres poner sort a True, pues mejor, ordenados alfabéticamente.

La propiedad ItemEx, es para indentar los elementos, ponerle imágenes, etc. Para lo que quieres, no hace falta. No está de más que mires en la ayuda.

Saludos

cHackAll 24-05-2007 16:52:40

En todo caso......
 
Te dejo tu funcion corregida:

Código Delphi [-]
procedure TForm1.ComboBox6Change(Sender: TObject);
var
 Count, Pos: Cardinal;
 Text: string;
begin
 Pos := ComboBox6.SelStart;
 ComboBox6.Items.Clear;
 Text := ComboBox6.Text;
 if (Text <> '') then
   begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select * from amigos where nombre like ''' + Text + '%''');
    ADOQuery1.ExecSQL;
    ADOQuery1.Open;
    Count := ADOQuery1.RecordCount;
    if Count > 0 then
     begin
      repeat Dec(Count);
       ComboBox6.Items.Add(ADOQuery1.FieldByName('nombre').AsString);
       ADOQuery1.Next;
      until Count = 0;
      ComboBox6.ItemIndex := 0;
      ComboBox6.SelStart := Pos;
      ComboBox6.SelLength := 255;
     end;
   end;
end;

PD: Si fuese otro el caso, se debería al tipo de datos utilizado; varchar en vez de char, esto causaría que tus campos tengan espacios al final del texto produciendo así ninguna ocurrencia.

Suerte!

MaMu 25-05-2007 17:47:59

SOLUCIONADO

Muchas gracias a todos, logre hacerlo funcionar correctamente, aunque el procedimiento que utilice difiere un poco.

Saludos y gracias


La franja horaria es GMT +2. Ahora son las 03:14:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi