Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo dejar desplegado un ComboBox e inmovil? (https://www.clubdelphi.com/foros/showthread.php?t=70243)

WPascal 08-10-2010 23:54:19

Cómo dejar desplegado un ComboBox e inmovil?
 
Hola a todos, pues necesito que un ComboBox se quede desplegado y que no se contraiga, he intentado varias cosas pero no encuentro ninguna característica, a ver si alguien sabe cómo lo podría hacer.
Ah! , y tambien preguntarles si se puede cambiar el límite máximo de Items que se le puede agregar al ComboBox, pues creo que el máximo es 6700 y yo necesito unos 86000 lineas.
De antemano gracias y espero poderles ayudar también a ustedes en un futuro.

ecfisa 09-10-2010 00:21:40

Hola y bienvenido. :)

Sobre la primera pregunta, creo que lo que buscas lo hace el TListBox.

86000 lineas... ¿ Las tenés almacenadas en memoria ?
Si no es así, pareciera mas adecuado el uso de TDBLookupComboBox.


Saludos.

WPascal 09-10-2010 00:41:56

Hola, gracias por tu respuesta, la razon por la que estoy usando el ComboBox para que me permita filtrar lo que voy escribiendo en el campo superior que este tiene, intenté con el listBox pero no puede encontrar una propiedad que me permita escribir en la parte superior y filtrar con lo que hay debajo, te agradecería si me pudieras decir si tiene esa propiedad.

En cuanto a las 86000 lineas, son en realidad 86000 palabras que quiero que se filtren mientras se escribe arriba pero quiero que la lista de opciones no se repliegue y tampoco quiero usar una base de datos.
Espero haber sido más claro.
Gracias

ecfisa 09-10-2010 02:06:24

Cita:

Empezado por WPascal (Mensaje 378824)
Hola, gracias por tu respuesta, la razon por la que estoy usando el ComboBox para que me permita filtrar lo que voy escribiendo en el campo superior que este tiene, intenté con el listBox pero no puede encontrar una propiedad que me permita escribir en la parte superior y filtrar con lo que hay debajo, te agradecería si me pudieras decir si tiene esa propiedad.

En cuanto a las 86000 lineas, son en realidad 86000 palabras que quiero que se filtren mientras se escribe arriba pero quiero que la lista de opciones no se repliegue y tampoco quiero usar una base de datos.
Espero haber sido más claro.
Gracias

No, el ListBox no te muestra el cuadro de edición, si bién al pulsar una tecla te situa en el primer item de la lista
con esa letra, no hace lo que buscas...

En al segundo punto, en realidad no es importante si son palabras o frases completas, lo que veo como limitante
es el número máximo de líneas. Que para serte sincero desconocía que fuesen 6700.

En realidad si me dicen un número tan alto de items yo pensaria en almacenarlos en disco.

Voy a pensar y buscar algo más sobre el tema, si me surge algo te aviso. :)

Saludos.

ecfisa 09-10-2010 02:15:18

Hola de nuevo.

Me quedé con dudas sobre la capacidad del Combo he hice una prueba:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to 86000 do
  try
    ComboBox1.Items.Add('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
  except
    ShowMessage(IntToStr(i));
  end;
end;

Tardó en llenarlo, pero no provocó excepción... ¿ Estas seguro que son sólo 6700 items ?

Saludos. :)

roman 09-10-2010 02:17:27

Quizá podría usar un ClientDataSet guardando los datos en un xml o el formato nativo del CDS y de esta manera puede usar conroles de bases de datos sin realmente usar una base de datos.

// Saludos

ecfisa 09-10-2010 02:22:26

Cita:

Empezado por roman (Mensaje 378847)
Quizá podría usar un ClientDataSet guardando los datos en un xml o el formato nativo del CDS y de esta manera puede usar conroles de bases de datos sin realmente usar una base de datos.

// Saludos

Muy buena idea roman, un ClientDataSet es 'la' solución ya que se puede trabajar en memoria con todos los beneficios de los DataControls.

Saludos. :)

WPascal 09-10-2010 02:46:48

hola Ecfisa y Roman, en realidad yo estoy empezando y no entiendo mucho lo de xml , clientDataSet, ni base de datos , asi que tendré que esperar a aprender a utilizar estos componentes segun la idea que dio Roman.

En cuanto al experimento que hizo Ecfisa, pues yo agregué las palabras a partir de un diccionario de palabras de esos que se utilizan para hacer ataques por fuerza bruta, o sea que lo hice copie y pegue, tal vez haciendolo de esta manera se limita a 6700, no sé, si quieren busquen el diccionario en la pagina GragonJar como "listado de diccionarios fuerza bruta" en google, entre los que alli estan está el de 69000 palabras, no les dejo el enlace porque el foro no me deja..

el principal problema es el limite de tamaño, digamos que logro reducir el numero de palabras a menos de 6700, entonces me podrías decir como hago para que el ComboBox quede deplegado y estático?, a proposito no sé si tal vez tengas un diccionario de palabras en español (para fuerza bruta), pues el que tengo es el de las 60000 palabras y quisiera uno que tenga las más comunes del español que no creo que sobrepasen las 6000.

Me debo ir pero les agradezco mucho su tiempo y sus respuestas y cualquier sugerencia más luego les consulto porque estoy en un ciber jeje
Saludos.

WPascal 09-10-2010 04:15:44

Hola amigos, les cuento que ya solucione el problema del limite maximo, lo que debia hacer era en vez copiar y pegar, darle click derecho y seleccionar load y cargar el archivo de texto y cargo muy bien aunque como ya dijiste, se demora.
Ahora la duda que me queda es si se puede bloquear el ComboBox para que quede desplegado.
Que esten bien.

ecfisa 09-10-2010 10:23:08

Hola.

El único modo que se me ocurre es que te crees un descendiente de TComboBox y redefinas el evento
OnCloseUp, bastante complicado...
Si sólo deseas que se despliegue el combo cuando tiene el foco, podés hacer:
Código Delphi [-]
  ComboBox1.Perform(CB_SHOWDROPDOWN, 1,0);
Pero se te va a replegar cuando lo pierda.

Es muchísimo más sencillo como sugirió roman.

Ponés un TClientDataSet hacés doble click sobre el componente y en el editor de campos -> botón derecho del mouse -> new field.
Le das un nombre, tipo string y la longitud que desees.

Ejemplo de carga: ( 'palabra' es el nombre del campo en el ejemplo )
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  cds.CreateDataSet;
  cds.Open;
  for i:= 1 to 86000 do
  begin
    cds.Append;
    cds.FieldByName('palabra').Value:= IntToStr(i); // o también: cdspalabra.Value:= IntToStr(i) 
    cds.Post;
  end;
end;

Luego le asociás el DataControl que más te convenga, DBLookupCombobox, TDBLookupListBox, DBGrid...

Saludos. :)

WPascal 09-10-2010 19:23:31

Ok Ecfisa, intentaré hacer lo que me estás sugiriendo, el primer código que me sugeriste para darle foco al ComboBox , se lo puedo asignar a un botón, cierto?
me podrías explicar más o menos cómo funciona? porque me parece que me puede ayudar, pues necesito que por lo menos el ComboBox se despliegue al presionar un botón pero no necesariamente al escribir sobre él con el teclado.
Para que me entiendas mejor, dichos botones lo que hacen es escribir sobre el campo del ComboBox reemplazando al teclado, pero al escribir el ComboBox no se despliego porque no estoy escribiendo sobre él con teclado sino con los botones.
Si lo deseas y para que me entiendas mejor te dejo el archivo en la zona de FTP del foro>Delphi>Ejemplos>Teclado en pantalla con base de palabras.rar , para que veas lo que quiero hacer.
Saludos

rgstuamigo 09-10-2010 19:35:15

Cita:

Empezado por WPascal (Mensaje 378824)
... la razon por la que estoy usando el ComboBox para que me permita filtrar lo que voy escribiendo en el campo superior que este tiene, intenté con el listBox pero no puede encontrar una propiedad que me permita escribir en la parte superior y filtrar con lo que hay debajo, te agradecería si me pudieras decir si tiene esa propiedad.
...

Nada te impide combinar el funcionamiento de dos componentes,;) en éste caso podrías usar un componente TEdit normal (u otro similar) combinado con un TListBox;).
Saludos...:)

ecfisa 09-10-2010 20:57:45

Cita:

Empezado por WPascal (Mensaje 378891)
Ok Ecfisa, intentaré hacer lo que me estás sugiriendo, el primer código que me sugeriste para darle foco al ComboBox , se lo puedo asignar a un botón, cierto?
me podrías explicar más o menos cómo funciona? Saludos

Contestando a tus preguntas, si. Se lo podés asignar a un botón sin problemas, y funcionará siempre que primero situes el foco en el Combo.

CB_SHOWDROPDOWN es un mensaje para decirle a windows que oculte o muestre el Combo. (siempre que este no tenga el estilo igual a csSimple)

Podés enviar mensajes con dos funciones más: SendMessage y PostMessage:
PostMessage pone el mensaje en la cola y retorna , sólo devuelve si se pudo insertar el mensaje o no.
SendMessage espera que se procese el mensaje y retorna, devuelve mensajes de consulta.

Ejemplos:
Código Delphi [-]
  (* consulta si el combo está replegado y si es así lo despliega *)
  if SendMessage(ComboBox1.Handle, CB_GETDROPPEDSTATE, 0, 0) <> 1 then
    SendMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 1, 0);   
  (* pone el mensaje desplegar combo en cola *)
   PostMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 1, 0);

Saludos. :)

WPascal 09-10-2010 21:32:26

Ok Ecfisa, entonces intentaré aplicarle esta función a los botones del programa y luego te aviso cómo me fue.
Gracias por tu ayuda.
En cuanto a la sugerencia de rgstuamigo, pues es interesante pero como les digo, estoy empezando a manejar Delphi y por el momento solo manejo los componentes básicos, claro que espero más adelante saber lo que ustedes saben jeje.
Nuevamente gracias Ecfisa. Seguimos hablando

rgstuamigo 22-10-2010 18:51:52

Cita:

Empezado por WPascal (Mensaje 378898)
En cuanto a la sugerencia de rgstuamigo, pues es interesante pero como les digo, estoy empezando a manejar Delphi y por el momento solo manejo los componentes básicos, ...

Bueno pensandolo :rolleyes: bien tal parece que puedes lograrlo hacer usando un simple Combobox ;) ; poniendo la propiedad Style = csSimple al Combobox y luego redimensionas la altura (Heigth) del combobox al tamaño que deseas que se vea. Si lo haces en tiempo de diseño podras observar una linea horizontal divisoria entre los items y el cuadro de edicion del combobox, como si se tratase de dos componentes ;).
Espero que con eso soluciones tu problema.;)
Saludos...:)

ecfisa 22-10-2010 23:51:09

Cita:

Empezado por rgstuamigo (Mensaje 380166)
Bueno pensandolo :rolleyes: bien tal parece que puedes lograrlo hacer usando un simple Combobox ;) ; poniendo la propiedad Style = csSimple al Combobox y luego redimensionas la altura (Heigth) del combobox al tamaño que deseas que se vea. Si lo haces en tiempo de diseño podras observar una linea horizontal divisoria entre los items y el cuadro de edicion del combobox, como si se tratase de dos componentes ;).
Espero que con eso soluciones tu problema.;)
Saludos...:)

Tenés toda la razón mi amigo.

Ganas de complicarnos que tenemos algunos... :(

Saludos. :)


La franja horaria es GMT +2. Ahora son las 16:07: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