Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Convertir de ListBox a distintas cadenas de texto (https://www.clubdelphi.com/foros/showthread.php?t=62129)

j_flores3000 04-12-2008 22:12:39

Convertir de ListBox a distintas cadenas de texto
 
Queria saber si se puede pasar cada uno de los items de un list box a distintas variables string, ejemplo tengo en el list box:
1.- club
2.- delphi
3.-foros
4.- oop
y que estos items se asignen a distintas var string.

dec 04-12-2008 22:19:22

Hola,

Puedes acceder a los "Items" de un "ListBox" mediante la propiedad del mismo nombre:

Código Delphi [-]
var
  s: string;
begin
  
  s := ListBox1.Items[0];

end;

En este caso la variable "s" contendrá el texto del primer elemento de la lista.

Caro 04-12-2008 22:23:39

Hola, solo necesitas acceder a la posición que necesitas en su propiedad Items, un ejemplo para ver el item seleccionado.

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
showmessage(ComboBox1.Items[ComboBox1.ItemIndex]);
end;

Saluditos

j_flores3000 04-12-2008 22:47:23

Cita:

Empezado por Caro (Mensaje 329725)
Hola, solo necesitas acceder a la posición que necesitas en su propiedad Items, un ejemplo para ver el item seleccionado.

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
showmessage(ComboBox1.Items[ComboBox1.ItemIndex]);
end;

Saluditos

Lo que quiero hacer es acceder automaticamente no uno por uno porque la cantidad de los items no es fija

Caro 04-12-2008 22:52:39

Cita:

Empezado por j_flores3000 (Mensaje 329733)
Lo que quiero hacer es acceder automaticamente no uno por uno porque la cantidad de los items no es fija

Hola de nuevo, puedes acceder a todos los items recorriendo, ejemplo:

Código Delphi [-]
var
 cadena : String;
begin
 for Ind:=0 to ComboBox1.Items.Count-1 do
  begin
   cadena := ComboBox1.Items[Ind];
   showmessage(cadena); 
  end;

Saluditos

dec 04-12-2008 22:53:57

Hola,

Puedes valerte de otras propiedades de "Items" para recorrer los existentes:

Código Delphi [-]
var
  s: string;
  i, len: integer;

begin

  len := ListBox1.Items.Count - 1;

  for i := 0 to len do
  begin

    s := s + ' - ' + ListBox1.Items[i];

  end;

  // Muestra los elementos separados por guiones

  ShowMessage(s);

end;

j_flores3000 04-12-2008 22:56:54

Cita:

Empezado por dec (Mensaje 329735)
Hola,

Puedes valerte de otras propiedades de "Items" para recorrer los existentes:

Código Delphi [-]
var
  s: string;
  i, len: integer;

begin

  len := ListBox1.Items.Count - 1;

  for i := 0 to len do
  begin

    s := s + ' - ' + ListBox1.Items[i];

  end;

  // Muestra los elementos separados por guiones

  ShowMessage(s);

end;

Sin ser molesto lo que hacen ahi es agregar todos los items a 1 sola cadena de texto yo necesito que se haga cada palabra (o item) en una variable distinta

Caro 04-12-2008 23:04:27

Cita:

Empezado por j_flores3000 (Mensaje 329737)
Sin ser molesto lo que hacen ahi es agregar todos los items a 1 sola cadena de texto yo necesito que se haga cada palabra (o item) en una variable distinta

No entiendo porque lo quieres poner en diferentes variables, si puedes trabajar con la lista de items directamente.

En diferentes variables:

Código Delphi [-]
var
 cadena : String;
 var1, var2, var3, var4, var5....... : String;
begin
 for Ind:=0 to ComboBox1.Items.Count-1 do
  begin
    cadena := ComboBox1.Items[Ind];
    Case Ind Of
     0 : var1 := cadena;
     1 : var2 := cadena;
     2 : var3 := cadena;
     3 : var4 := cadena;
     4 : var5 := cadena;
     ..................... 
    end; 
  end;

Saluditos

ContraVeneno 04-12-2008 23:05:19

¿y para que los quieres en una variable? digo, ya los tienes en el combo... para que repetir el valor en otra variable... además, los ejemplos que amablemente Caro y Dec te han mostrado, son suficientes como para que TU deduzcas como realizar lo que quieres... no es buena idea esperar a que aquí hagan tu tarea.

dec 04-12-2008 23:06:05

Hola,

Hum... pero es que no vamos a hacerte todo el trabajo, ¿o sí? Je je je. Lo que quiero decir es que en el código que tanto Caro como yo hemos mostrado, puede verse cómo asignar un elemento de una lista a una variable de tipo "string". ¿Que quieres usar más variables de tipo string y asignar un elemento de la lista a cada una? Bueno. ¿Quién te lo impide? Otra cosa es que claro, no sabes los elementos que va a tener la lista... luego no puedes declarar variables "s1, s2, s3" y así. Vale.

Pues entonces se me ocurre que puedes usar un "Array de cadenas", y añadir cada elemento de la lista en un elemento del "Array", pero, aquí ya se me viene a la cabeza que no sé muy bien qué quieres hacer, porque, ¿para qué añadir los elementos de la lista en un "Array", si ya están en la lista, que nos ofrece una propiedad como "Items", que, es como si fuera un "Array"? Así que no se me ocurre qué más decirte y lo lamento. :rolleyes:

egostar 04-12-2008 23:07:36

Cita:

Empezado por j_flores3000 (Mensaje 329737)
Sin ser molesto lo que hacen ahi es agregar todos los items a 1 sola cadena de texto yo necesito que se haga cada palabra (o item) en una variable distinta

No se pero creo que para eso se tendrían que crear frames en tiempo de ejecución, porque hasta donde se (aunque alguien podria decirme lo contrario) no se pueden crear variables en tiempo de ejecución.

Salud OS

Caro 04-12-2008 23:12:39

Cita:

Empezado por dec (Mensaje 329744)
Pues entonces se me ocurre que puedes usar un "Array de cadenas", y añadir cada elemento de la lista en un elemento del "Array", pero, aquí ya se me viene a la cabeza que no sé muy bien qué quieres hacer, porque, ¿para qué añadir los elementos de la lista en un "Array", si ya están en la lista, que nos ofrece una propiedad como "Items", que, es como si fuera un "Array"? Así que no se me ocurre qué más decirte y lo lamento. :rolleyes:

Eso mismo digo yo, sería mejor trabajar con la lista de items directamente.

Cita:

Empezado por egostar (Mensaje 329745)
No se pero creo que para eso se tendrían que crear frames en tiempo de ejecución, porque hasta donde se (aunque alguien podria decirme lo contrario) no se pueden crear variables en tiempo de ejecución.

Frames :confused:, no sería mucha cosa para volver a guardar los items. Que yo sepa no se pueden crear variables en ejecución, pero podría tenerlas definidas todas las que piense que va utilizar y asignar con un case como lo hice arriba, pero insisto sería mejor que trabajara con los items directamente y así no se complica la vida.

Saluditos

egostar 04-12-2008 23:30:03

Cita:

Empezado por Caro (Mensaje 329747)
Frames :confused:, no sería mucha cosa para volver a guardar los items. Que yo sepa no se pueden crear variables en ejecución, pero podría tenerlas definidas todas las que piense que va utilizar y asignar con un case como lo hice arriba, pero insisto sería mejor que trabajara con los items directamente y así no se complica la vida.

Puede ser, el asunto es donde quiere poner los nombres de los datos que tenga en el ListBox, pero supongamos que quiera poner labels en la forma pero que se creen solo las que tenga el listbox. Yo crearia un frame con un label y haria esto.

Aqui algo rapido :)

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  I: integer;
  f: TFrame2;
begin
  for I := 0 to ListBox1.Count - 1 do begin
    f := TFrame2.Create(nil);
    f.Parent := Form1;
    f.Label1.Caption := ListBox1.Items[i];
    f.Top := 100+i*15;
    f.Left := 20;
  end;
end;

Salud OS

Caro 04-12-2008 23:35:23

Cita:

Empezado por egostar (Mensaje 329752)
Puede ser, el asunto es donde quiere poner los nombres de los datos que tenga en el ListBox, pero supongamos que quiera poner labels en la forma pero que se creen solo las que tenga el listbox. Yo crearia un frame con un label y haria esto.

Ok amiguito ;), en el ejemplo que das también se podría crear los Label directamente sin usar los frames. Creo que sería bueno que el amiguito/a nos indicara para que realmente quiere utilizar las diferentes variables.

Saluditos

egostar 04-12-2008 23:38:28

Cita:

Empezado por Caro (Mensaje 329756)
Ok amiguito ;), en el ejemplo que das también se podría crear los Label directamente sin usar los frames. Creo que sería bueno que el amiguito/a nos indicara para que realmente quiere utilizar las diferentes variables.

Saluditos

:D :D :D, bueno amiguita, es que me gusta complicarme la vida ;):rolleyes:

Salud ITOS

PD, me enseñas a hacer eso :) :o

Delphius 04-12-2008 23:47:18

Sería útil que j_flores3000 aportara más detalles del caso. Si nos describiera sus problemas, necesidades, requisitos, planteos y/o dudas podríamos ver tal vez a esto con otra óptica y tal vez ofrecer alguna alternativa.

Por lo pronto, me uno a sus planteos:
¿Para que tener tantas variables como items existan si se puede tener y referenciar a cada item, desde una misma variable (combo)?

j_flores3000, a lo que apuntan todos los compañeros (y compañera;)) es que se estaría redundando datos. Si ya en el Combo se tiene guardado los datos ¿Para que tener otras N variables con cada dato? El combo no es más que un array dinámico visual. Y como cualquier array permite que todos los items se referencien mediante un único nombre. ¡Esa es una de sus cualidades y ventajas!

Como he dicho al principio, si conocieramos más del tema...

Saludos,

egostar 04-12-2008 23:49:00

El punto es que para que quiere otro array si al final un ListBox es eso :rolleyes: es necesario mas información.

Salud OS

PD; Como bien lo estas diciendo amigo Delphius ;)

Caro 04-12-2008 23:55:32

Cita:

Empezado por egostar (Mensaje 329757)
PD, me enseñas a hacer eso :) :o

Supongo que a crear los Labels sin los Frames.

Digamos que los ponemos dentro de un panel, por eso lo del Parent.

Código Delphi [-]
var
 aTop, Ind : Integer;
 Lab : TLabel;
begin
 aTop := 10;
 for Ind:=0 to ComboBox1.Items.Count-1 do
  begin
   Lab := TLabel.Create(Self);
   Lab.Parent := panel1;
   Lab.Name := 'Label'+IntToStr(Ind);
   Lab.Caption := ComboBox1.Items[Ind];
   Lab.Top := aTop;
   Lab.Left := 20;
   Inc(aTop,15);
  end;
end;


Yo también estoy con ustedes,sería bueno que nos de mas información.

Saluditos

j_flores3000 04-12-2008 23:56:56

Muchas gracias por todo lo comentado hasta ahora. Es que tengo que insertar en un quick report todos los items que haya en el listbox pero que sean en qrtext distintos. Por eso queria pasarlos a variables de texto y de ahi asignarlos a los qrtext ( En un quick report). Lo que me doy cuenta ahora es que puedo asignarlos desde los items.

Los items estan en un formulario y el quick report en otro. Es para hacer facturas y necesito poner los productos que compre en lineas total mente distintas se ve?

Bien el problema restante es que los items los voy agregando yo y a veces son 50 items o aveces 2 se ve??

Igualmente gracias por todo...

egostar 04-12-2008 23:58:45

Hola amiguita

Esto es lo que no tenia en mente :o

Código Delphi [-]
Lab.Name := 'Label'+IntToStr(Ind);

Como hacer que el label tuviera otro nombre :rolleyes::D

gracias amiguita ;)

Salud ITOS

egostar 05-12-2008 00:00:31

Cita:

Empezado por j_flores3000 (Mensaje 329764)
Muchas gracias por todo lo comentado hasta ahora. Es que tengo que insertar en un quick report todos los items que haya en el listbox pero que sean en qrtext distintos. Por eso queria pasarlos a variables de texto y de ahi asignarlos a los qrtext ( En un quick report). Lo que me doy cuenta ahora es que puedo asignarlos desde los items.

Los items estan en un formulario y el quick report en otro. Es para hacer facturas y necesito poner los productos que compre en lineas total mente distintas se ve?

Bien el problema restante es que los items los voy agregando yo y a veces son 50 items o aveces 2 se ve??

Igualmente gracias por todo...

:D:D:D, olvidemos todo, rollback jejejeje

Salud OS

j_flores3000 05-12-2008 00:04:51

Perdon pero no soy mujer o sea tengo j_flores3000 porque me llamo Juan Flores...mmm eso siempre fue un problema en el foro...jajajaja. Igualmente quisiera hacer un 2º llamado de atencion al que tiene la foto del guason ya que es la segunda vez que en varios post trata de retarme o no se que...yo solo estoy pidiendo ayuda si el no me la quiere brindar todo bien pero que no se alze mas. Si pudieramos superar nuestras diferencias con contra veneno seria bueno...igualmente sigo buscando la solucion a mi problema hice varias pruebas pero sigue sin salir!

ContraVeneno 05-12-2008 00:33:20

a caray, no amigo, mi intensión no es causar polémicas ni levantones ni nada agresivo. Es que, a mi me dio la impresión de que estabas esperando que hiciéramos el código exactamente como tu lo pides y eso aquí no es bien visto. Vamos, que según lo que puso Dec, él tuvo la misma impresión, solo que lo puso con diferentes palabras.

En corto, con los ejemplos que ya habían puesto Caro y Dec, se hubiera solucionado tu planteamiento original y me pareció de "mal ver" que no te sintieras satisfecho con esas respuestas.

Ahora, el problema es, que faltó que desde un principio nos dieras los detalles que nos acabas de dar; si nos hubieras explicado desde un principio que era para hacer un reporte de una factura, las propuestas e ideas hubieran sido muy diferentes. Como ya dijo Egostar, ahora es necesario hacer un Rollback de todo. :D

Con los nuevos datos que nos propones, lo mejor es utilizar una base de datos, si no utilizas ninguna sería bueno que buscaras opciones para utilizarlas. Si no te interesan las bases de datos, yo te recomendaría que utilizaras una tabla en memoria (Las JEDI JVCL tienen un componente muy bueno llama TjvMemoryData); a esta tabla en memoria, le puedes insertar, eliminar, modificar todos los artículos que quieras y el QuickReport lo enlazas a esta tabla por medio de QRDBText. De esta forma, si son 2, 10, 500 artículos, el mismo QuickReport se encargará de acomodarlo.

En fin, que mi intensión no es ofender a nadie, simplemente expreso mi punto de vista. Te pido una disculpa si te pareci agresivo en este hilo o en algún otro.

j_flores3000 05-12-2008 14:11:57

Cita:

Empezado por ContraVeneno (Mensaje 329781)
a caray, no amigo, mi intensión no es causar polémicas ni levantones ni nada agresivo. Es que, a mi me dio la impresión de que estabas esperando que hiciéramos el código exactamente como tu lo pides y eso aquí no es bien visto. Vamos, que según lo que puso Dec, él tuvo la misma impresión, solo que lo puso con diferentes palabras.

En corto, con los ejemplos que ya habían puesto Caro y Dec, se hubiera solucionado tu planteamiento original y me pareció de "mal ver" que no te sintieras satisfecho con esas respuestas.

Ahora, el problema es, que faltó que desde un principio nos dieras los detalles que nos acabas de dar; si nos hubieras explicado desde un principio que era para hacer un reporte de una factura, las propuestas e ideas hubieran sido muy diferentes. Como ya dijo Egostar, ahora es necesario hacer un Rollback de todo. :D

Con los nuevos datos que nos propones, lo mejor es utilizar una base de datos, si no utilizas ninguna sería bueno que buscaras opciones para utilizarlas. Si no te interesan las bases de datos, yo te recomendaría que utilizaras una tabla en memoria (Las JEDI JVCL tienen un componente muy bueno llama TjvMemoryData); a esta tabla en memoria, le puedes insertar, eliminar, modificar todos los artículos que quieras y el QuickReport lo enlazas a esta tabla por medio de QRDBText. De esta forma, si son 2, 10, 500 artículos, el mismo QuickReport se encargará de acomodarlo.

En fin, que mi intensión no es ofender a nadie, simplemente expreso mi punto de vista. Te pido una disculpa si te pareci agresivo en este hilo o en algún otro.

Ok Contra Veneno, disculpas aceptadas. Disculpame a mi tambien por mis enojos!

Caro 05-12-2008 15:01:46

Cita:

Empezado por j_flores3000 (Mensaje 329764)
Muchas gracias por todo lo comentado hasta ahora. Es que tengo que insertar en un quick report todos los items que haya en el listbox pero que sean en qrtext distintos. Por eso queria pasarlos a variables de texto y de ahi asignarlos a los qrtext ( En un quick report). Lo que me doy cuenta ahora es que puedo asignarlos desde los items.

Los items estan en un formulario y el quick report en otro. Es para hacer facturas y necesito poner los productos que compre en lineas total mente distintas se ve?

Bien el problema restante es que los items los voy agregando yo y a veces son 50 items o aveces 2 se ve??

Cita:

Empezado por j_flores3000 (Mensaje 329769)
...igualmente sigo buscando la solucion a mi problema hice varias pruebas pero sigue sin salir!

Hola de nuevo, esos eran los detalle que te pedíamos para poder ayudarte mejor y ver otras alternativas en vez de pasarlos a variables.
´
Volviendo a tu pregunta, para pasar los items del ListBox a tu QuickReport lo puedes hacer de la siguiente forma:

Necesitas utilizar el evento OnNeedData de tu QuickReport, colocas una banda con BandType rbDetail y ahí dentro un qrLabel.

Código Delphi [-]
    Indice : Integer;
.................
.................
procedure TForm1.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
begin
 MoreData := Indice <= FormListBox.ListBox1.Count-1;
 if MoreData then
  qrLabel1.Caption :=  FormListBox.ListBox1.Items[Indice];
 Inc(Indice);
end;
 
//Inicializamos nuestra variable indice
procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
 Indice := 0;
end;

Pero deberías considerar utilizar una base de datos.

Saluditos

coso 05-12-2008 16:38:12

Cita:

Muchas gracias por todo lo comentado hasta ahora. Es que tengo que insertar en un quick report todos los items que haya en el listbox pero que sean en qrtext distintos. Por eso queria pasarlos a variables de texto y de ahi asignarlos a los qrtext ( En un quick report). Lo que me doy cuenta ahora es que puedo asignarlos desde los items.

Los items estan en un formulario y el quick report en otro. Es para hacer facturas y necesito poner los productos que compre en lineas total mente distintas se ve?

Bien el problema restante es que los items los voy agregando yo y a veces son 50 items o aveces 2 se ve??

Igualmente gracias por todo...


Hola, para hacer lo que pides, podrias usar algo como esto

Código Delphi [-]
   for i := 0 to Listbox1.Items.Count - 1 do          
  (formdelosreports.FindComponent('qrlabel'+inttostr(i)) as  TQRLabel).Caption := Listbox1.Items[i];

suponiendo que los diferentes qrlabel ya existan en el momento de ejecución, si no deberias crearlos e ir colocandolos uno a uno. Ahora bien, el quick report tiene una banda, llamada detail band, que sirve precisamente para hacer lo que estas intentando hacer 'a mano', usando el evento OnNeedData y, si usas bases de datos, los QRDBText. Busca en el foro y en los propios ejemplos de Delphi y verás que te ahorras faena. Saludos.

PD: nada, repitiendo lo dicho por los colegas del club en esta segunda pagina de posts


La franja horaria es GMT +2. Ahora son las 15:41:10.

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