PDA

Ver la Versión Completa : Convertir de ListBox a distintas cadenas de texto


j_flores3000
04-12-2008, 22:12:39
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:


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
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
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:


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:


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
Hola,

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


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
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:


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
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
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.

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
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 :)


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
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
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
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.


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

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
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
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
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 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.


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
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...
http://www.clubdelphi.com/foros/images/botones/quote.gif (http://www.clubdelphi.com/foros/newreply.php?do=newreply&p=329764)

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


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