Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Como expandir PickList por software (https://www.clubdelphi.com/foros/showthread.php?t=90251)

MARX 03-05-2016 18:02:18

Como expandir PickList por software
 
Hola gente del foro
Vengo con una nueva consulta, tal vez sea una tontera pero todavía no se como hacerlo.
Necesito que cuando Empiece a escribir en un campo del DBGrid se expanda la lista del picklist automáticamente.
No tengo idea siquiera si se puede hacer.

Lo que intento hacer es que cuando empiece a escribir en el campo me vaya filtrando nombres y solo queden los que contengan las letras que voy escribiendo, por ejemplo...
Si tengo nombres

Carolina
Juan
Martín
Maria
Pedro
Roberto

y escribo en el campo de nombre "ar" me aparezcan en la lista Martin, Maria, Carolina que son los nombres que contiene la cadena "ar"
La idea es hacer una consulta de los nombres que contenga la cadena que voy escribiendo y cargarlos en el picklist, pero para que se vayan viendo se debe expandir la lista para que vayan apareciendo los nombres en la lista.

Agradeceré sus comentarios

Saludos
MARX

AgustinOrtu 03-05-2016 19:20:47

Filtra el dataset del grid. Podes usar el evento OnFilterRecord, la propiedad filter o lanzar consultas sql

Hay ejemplos de los 3 casos en el foro, aunque cualquier problema no dudes en preguntar

ecfisa 03-05-2016 19:45:05

Hola.

También creo que un filtrado desde el TDataSet o mediante una consulta SQL sería lo mas adecuado.

Pero contestando al título de tu consulta, podes usar el evento OnKeyDown del DBGrid y la función API SendInput para desplegar el PickList, vg:

Código PHP:

const KEYEVENTF_KEYDOWN 0;  

void sendKey(const WORD &key, const DWORD &flag)
{
  
INPUT ip;

  
ZeroMemory(&ipsizeof(INPUT));
  
ip.type           INPUT_KEYBOARD;
  
ip.ki.wScan       0;
  
ip.ki.time        0;
  
ip.ki.dwExtraInfo 0;
  
ip.ki.dwFlags     flag;
  
ip.ki.wVk         key;
  
SendInput(1, &ipsizeof(INPUT));
}

void __fastcall TForm1::DBGrid1KeyDown(TObject *SenderWORD &Key,
      
TShiftState Shift)
{
  if (
Key == VK_F5) {  // ( F5 por ejemplo)
    
sendKey(VK_F2,   KEYEVENTF_KEYDOWN);
    
sendKey(VK_F2,   KEYEVENTF_KEYUP);
    
sendKey(VK_MENUKEYEVENTF_KEYDOWN);
    
sendKey(VK_DOWNKEYEVENTF_KEYDOWN);
    
sendKey(VK_DOWNKEYEVENTF_KEYUP);
    
sendKey(VK_MENUKEYEVENTF_KEYUP);
  }


Una vez desplegada la lista se comporta de forma similar a un ComboBox al presionar letras.

Saludos :)

MARX 03-05-2016 22:26:35

Buenisimo ecfisa.
Lo estoy probando
Te hago una pregunta ¿Que librería es la que hay que definir para usar estas funciones?.

MARX 03-05-2016 22:32:26

Ya está, anduvo perfecto. :D
Ahora tengo que ver como lo implemento con el query.
Gracias ecfisa. ^\||/


Saludos
MARX

MARX 04-05-2016 15:45:52

Hago otra consulta, aprovechando sus conocimientos. ¿Hay alguna forma de escribir mas de un caracter en un campo del DBGrid cuando la lista del picklist está desplegada?

ecfisa 05-05-2016 13:56:05

Hola MARX.

Si no te entiendo mal, si.

Es el comportamiento por defecto de la propiedad PickList, se desplaza la selección en la lista desplegada a medida que se ingresan caracteres y con la tecla BackSpace se anula lo tecleado para el reingreso.

Si deseas desplegar la lista ordenada, previamente tendrías que cargar los datos en un TStringList y usar su método Sort, por ejemplo:
Código PHP:

...
  
TStringList *ts = new TStringList;
  
__try {
    
ts->Add("Abutarda");
    
ts->Add("Abulon");
    
ts->Add("Abadejo");
    
ts->Add("Abuelo");
    
ts->Sort();  // <- (*)
    
DBGrid1->Columns->Items[0]->PickList->Assign(ts);
  }
  
__finally {
    
delete ts;
  }
... 

Saludos :)

MARX 05-05-2016 14:29:02

A ver si me explico mejor. Cuando se despliega la lista de un picklist y escribo en el campo donde se desplegó la lista, no se pueden ver las letras que escribo, ingreso letras y lo unico que sucede es que se mueve la linea seleccionada a las palabras que empiezan con la letra que toqué, pero en el campo no se puede visualizar nada.
Lo que yo quiero es que cuando la lista está desplegada se pueda ir viendo lo que escribo como para ir ejecutando una consulta con el texto que se va escribiendo.
En un combobox si se puede ver lo que escribo en el cuadro de texto de el mismo combobox mientras la lista está desplegada.
Quiero saber si hay alguna forma que el picklist se comporte como el combobox en ese sentido.
No se si me entienden. Creo que ni yo me entiendo lo que escribí... jajaja.

ecfisa 05-05-2016 15:34:27

Hola.

Ahora creo entenderte... No veo posible hacer lo que buscas mediante la propiedad PickList.

Una consulta mas, ¿ De donde obtenes los datos que se cargan en PickList ?

Saludos :)

MARX 06-05-2016 13:32:19

Hola ecfisa.
Los datos los voy a sacar de una consulta que se va ir actualizando a medida que se ingresen los caracteres.
Pienzo hacer una consulta en SQL con la propiedad like
No quiero utilizar un DBComboBox arriba del DBGrid porque me ha traido problema con los diferentes comportamientos que necesito en los campos del DBGrid.

cualquier otro dato que necesites hacemelo saber.

Saludos
MARX

aguml 07-05-2016 17:23:32

Una idea seria escribir en un TEDIT o similar y conforme vayas escribiendo vas mandando lo escrito al componente ese que deseas usando el evento OnKeyUp por ejemplo. Con eso verías el texto sin problemas.

MARX 08-05-2016 02:15:53

Hola Aguml.
Si, mi idea era hacerlo con un DBLookup que apuntara a una consulta, pero me traía problemas con algunos comportamientos del DBGrid. Tenía que agregar mucha programacion para que no se notara que es un DBLookup
Igual, es buena idea.
Gracias por tu aporte.

Saludos
MARX


La franja horaria es GMT +2. Ahora son las 04:20:57.

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