PDA

Ver la Versión Completa : Extraer informacion de ListView


giantonti1801
11-01-2023, 17:51:27
Buen dia.

Estoy desarrolando en android y ulizando un LinstView, he agragado algunas cajas adicionales para luego alimentarla en tiempo de ejecucion con informacion de tablas SQL Server. Lo hice con Bind Visully funciona perfecto pero me limita tanto en la parte grafica como tambien en algunas consultas.
Me explico mejor quiero colocarle la imagen Redonda en la lista pero no puedo hacerlo por Bind Visually sino la única forma que conozco es hacerlo en tiempo de ejecución, y aunque lo puedo hacer con el Listview estandart cuando le agrego los otros campos tengo dificulta para llegarle a estos campos y alimentarlos. Adjunto una foto que talvez pueda darle más claridad.
Los campos son:
txtNombre
Image2
TxtRut
txtFecha
txtAprobacion
txtComentario

Todos estos campos estan en ListView y realmente lo que quiero es alimentarlos en tiempo de ejecución y también cambiarle la imagen y colocársela redonda.

UniQueryDetalleVisita.Open;
TabControl.ActiveTab := Tbl_DetalleVisitas;
while not UniQueryVisitantes.Eof do
begin
item2 := ListView2.Items.Add;
streamIMG2 := TMemoryStream.Create;
if UniQueryVisitantesFOTO.IsNull then
ImgPadron2.Bitmap.SaveToStream(streamIMG2)
else
UniQueryVisitantesFOTO.SaveToStream(streamIMG2);
Circle2.Fill.Bitmap.Bitmap.LoadFromStream(streamIMG2);
item2.Bitmap := Circle2.MakeScreenshot; //aqui la imagen
Item2.Text := UniQueryVisitantesNom_vis.AsString; //aqui unos de la información de dataBase
//......... otra onformacion

UniQueryVisitantes.Next;
end;

giantonti1801
12-01-2023, 00:07:44
ya logre hacerlo

TListItemImage(item.Objects.FindDrawable('Image2')).Bitmap := Circle2.MakeScreenshot;
TListItemText(item.Objects.FindDrawable('txtNombre')).Text := UniQueryDetalleVisitaNom_Vis.AsString;
TListItemText(item.Objects.FindDrawable('txtRut')).Text := UniQueryDetalleVisitarut__vis.AsString;
TListItemText(item.Objects.FindDrawable('txtFecha')).Text := UniQueryDetalleVisitaHora_in_vis.AsString;
TListItemText(item.Objects.FindDrawable('txtAprobacion')).Text := UniQueryDetalleVisitaact_vis.AsString;
TListItemText(item.Objects.FindDrawable('txtComentarios')).Text := UniQueryDetalleVisitacometario.AsString;
UniQueryDetalleVisita.Next;
Pero ahora tengo otra dificulta que si le doy un clic con el elemento de ListView1ItemClickEx necesito capturar el valor de este registro en especifico "txtRut" y no consigo la forma de hacerlo.

cloayza
12-01-2023, 12:43:43
Estimado giantonti1801, puedes utilizar las propiedades del Item.Tag o Item.TagString para almacenar el identificador que requieres...

Esto deberias realizar en el momento que estas agregando los items al TListview...


Item.Tag := UniQueryDetalleVisitarut__vis.AsInteger;
Item.TagString := UniQueryDetalleVisitarut__vis.AsString;


Luego en el evento ListView1ItemClickEx, accedes a sus valores a traves de Item

Saludos cordiales

Neftali [Germán.Estévez]
12-01-2023, 13:11:12
necesito capturar el valor de este registro en especifico "txtRut" y no consigo la forma de hacerlo.

Depende de cómo hayas creado esos elementos.
En mi caso que utilizo ese sistema:
https://blog.delphiedintorni.it/2014/05/personalizzare-il-text-di-una-tlistview.html

Se puede acceder a los detalles de la siguiente forma (aunque uses otro, es posible que se pueda extrapolar) accediendo a los objetos:

En el evento OnItemclick hay lo siguiente:

var
Str:String;
begin
// recorrer los diferentes Objetos del Item
for var I:integer := 0 to (AItem.Objects.Count-1) do
// Si son de tipo Texto los Añado
if (AItem.Objects[i] is TListItemText) then
Str := Str + TListItemText(AItem.Objects[i]).Text + SLineBreak;

ShowMessage('Objects:' + Str);

En mi caso con un Listview así:

https://i.imgur.com/8PbOBCB.png

Si pulsas en los Items, obtienes esto:

(En el segundo)
https://i.imgur.com/HeDDWzj.png

(En el cuarto)
https://i.imgur.com/PPE3nvN.png

giantonti1801
12-01-2023, 13:27:04
;549963']Depende de cómo hayas creado esos elementos.
En mi caso que utilizo ese sistema:
https://blog.delphiedintorni.it/2014/05/personalizzare-il-text-di-una-tlistview.html

Se puede acceder a los detalles de la siguiente forma (aunque uses otro, es posible que se pueda extrapolar) accediendo a los objetos:

En el evento OnItemclick hay lo siguiente:

var
Str:String;
begin
// recorrer los diferentes Objetos del Item
for var I:integer := 0 to (AItem.Objects.Count-1) do
// Si son de tipo Texto los Añado
if (AItem.Objects[i] is TListItemText) then
Str := Str + TListItemText(AItem.Objects[i]).Text + SLineBreak;

ShowMessage('Objects:' + Str);

En mi caso con un Listview así:

https://i.imgur.com/8PbOBCB.png

Si pulsas en los Items, obtienes esto:

(En el segundo)
https://i.imgur.com/HeDDWzj.png

(En el cuarto)
https://i.imgur.com/PPE3nvN.png

Mil Gracias amigo esta solución me quedo perfecta.

giantonti1801
12-01-2023, 14:24:10
;549963']Depende de cómo hayas creado esos elementos.
En mi caso que utilizo ese sistema:
https://blog.delphiedintorni.it/2014/05/personalizzare-il-text-di-una-tlistview.html

Se puede acceder a los detalles de la siguiente forma (aunque uses otro, es posible que se pueda extrapolar) accediendo a los objetos:

En el evento OnItemclick hay lo siguiente:

var
Str:String;
begin
// recorrer los diferentes Objetos del Item
for var I:integer := 0 to (AItem.Objects.Count-1) do
// Si son de tipo Texto los Añado
if (AItem.Objects[i] is TListItemText) then
Str := Str + TListItemText(AItem.Objects[i]).Text + SLineBreak;

ShowMessage('Objects:' + Str);

En mi caso con un Listview así:

https://i.imgur.com/8PbOBCB.png

Si pulsas en los Items, obtienes esto:

(En el segundo)
https://i.imgur.com/HeDDWzj.png

(En el cuarto)
https://i.imgur.com/PPE3nvN.png

Esta opción me Trae la información que necesito perfectamente pero al momento de aplicar un where no me esta leyendo la información sustraída por Str puedo pensar que puede haber un problema con el texto talvez necesita una conversión para ser leido, Lo insólito que no me esta arrojando ningún error pero no me muestra ninguna información;

procedure TForminicio.ListView1ItemClick(const Sender: TObject;
const AItem: TListViewItem);
var
item: TListViewItem;
streamIMG : TStream;
Str:String;
begin
// recorrer los diferentes Objetos del Item
for var I:integer := 0 to (AItem.Objects.Count-1) do
// Si son de tipo Texto los Añado
if (AItem.Objects[i] is TListItemText) then
Str := TListItemText(AItem.Objects[i]).Text + SLineBreak;
Label21.Text := (Str);
//ShowMessage(Str);
begin
UniQueryDetalleVisita.Close;
UniQueryDetalleVisita.SQL.Clear;
UniQueryDetalleVisita.SQL.text := 'select V.Rut__vis, V.Num_dep_Vis, V.Nom_Vis, V.Piso__Vis, V.Acept_Vis, V.Hora_in_vis, V.act_vis, V.cometario, I.FOTO from visitas V'+
' Inner Join IMG I on V.N_reg = I.REGISTRO where Rut__Vis = :Rut__Vis';// and Num_dep_Vis = :Num_dep_Vis order by Hora_in_vis ';
UniQueryDetalleVisita.ParamByName ('Rut__Vis').Asstring := Label21.Text;

giantonti1801
12-01-2023, 14:40:17
solucionado modificando Str := TListItemText(AItem.Objects[i]).Text;

cloayza
12-01-2023, 19:30:00
Estimado colega, si me permite insistir con la opción que le indique, creo se evita algunas líneas de codigo...


while not UniQueryVisitantes.Eof do
begin
item2 := ListView2.Items.Add;
...
//Asignas el valor del Rut al TagString del Item
//Este valor lo recuperas luego.

item2.TagString:=UniQueryVisitantesRut__vis.AsString;

...
UniQueryVisitantes.Next;
end;

procedure TForminicio.ListView1ItemClick(const Sender: TObject;
const AItem: TListViewItem);
var
item: TListViewItem;
streamIMG : TStream;
Str:String;
begin
UniQueryDetalleVisita.Close;
UniQueryDetalleVisita.SQL.Clear;
UniQueryDetalleVisita.SQL.text := 'select V.Rut__vis, V.Num_dep_Vis, V.Nom_Vis, V.Piso__Vis, V.Acept_Vis, V.Hora_in_vis, V.act_vis, V.cometario, I.FOTO from visitas V'+
' Inner Join IMG I on V.N_reg = I.REGISTRO where Rut__Vis = :Rut__Vis';// and Num_dep_Vis = :Num_dep_Vis order by Hora_in_vis ';
UniQueryDetalleVisita.ParamByName ('Rut__Vis').Asstring := AItem.TagString;

Bueno, solo es una sugerencia...
Saludos cordiales

giantonti1801
12-01-2023, 23:58:47
Hola Amigo gracias por su ayuda. Ahora estoy buscando la forma de extraer la información desde el ListView y con la opción que me dio Neftaly me trae la información perfecta en el evento onClickItem pero cuando le hago un swip y me sale el botón Delete no me está trayendo la información por lo que no puedo aplicar filtro.

Str:String;
begin
// recorrer los diferentes Objetos del Item
for var I:integer := 0 to (AItem.Objects.Count-1) do
// Si son de tipo Texto los Añado
if (AItem.Objects[i] is TListItemText) then
Str := TListItemText(AItem.Objects[i]).Text;
Label21.Text := (Str);
Con esta opcion en el evento onclickItem funciona perfecto pero no me lo hace en el Swip o cuando le doy al botón delete.

Casimiro Notevi
13-01-2023, 10:11:08
¿Es para iOS?

Neftali [Germán.Estévez]
13-01-2023, 10:16:15
Lo más sencillo es que continues con la conversación anterior, ya que estás hablando sobre en mismo problema, en lugar de crear un hilo nuevo.
La información del hilo puede ser útil a otros usuarios.

Tampoco tengo claro a qué te refieres con "swip". Tal vez alguna imagen ayude.

duilioisola
13-01-2023, 10:19:42
Si el ListView se llama MiListView, debes poner el código para el borrado en el evento OnDeleteItem.

Qudaría más o menos así:

procedure TFMCarrito.MiListViewDeleteItem(Sender: TObject; AIndex: Integer);
var
Str:String;
begin
// recorrer los diferentes Objetos del Item
for var I:integer := 0 to (MiListView.Items[AIndex].Objects.Count-1) do
// Si son de tipo Texto los Añado
if (MiListView.Items[AIndex].Objects[i] is TListItemText) then
Str := TListItemText(MiListView.Items[AIndex].Objects[i]).Text;

Label21.Text := (Str);
end;

Neftali [Germán.Estévez]
13-01-2023, 10:28:01
En el evento DeleteItem puedes probar algo como esto:

var
Str:String;
begin
Str := Str + ListView1.Items[AIndex].Text;
ShowMessage('ListView1DeleteItem -> ' + Str);
end

Otra opción es acceder a los datos de la tabla a partir de ese texto.

NOTA: Veo que [duilioisola] se me ha adelantado. Iba a añadfir que la otra opción era hacer el CAST, de forma similar a como hemos comentado en el otro hilo.
https://www.clubdelphi.com/foros/showthread.php?t=96045

giantonti1801
13-01-2023, 11:31:48
Si el ListView se llama MiListView, debes poner el código para el borrado en el evento OnDeleteItem.

Qudaría más o menos así:

procedure TFMCarrito.MiListViewDeleteItem(Sender: TObject; AIndex: Integer);
var
Str:String;
begin
// recorrer los diferentes Objetos del Item
for var I:integer := 0 to (MiListView.Items[AIndex].Objects.Count-1) do
// Si son de tipo Texto los Añado
if (MiListView.Items[AIndex].Objects[i] is TListItemText) then
Str := TListItemText(MiListView.Items[AIndex].Objects[i]).Text;

Label21.Text := (Str);
end;


Gracias amigos, En efecto esta opción resolvió el problema. la recomendación que le seguía a esta no la he probado y como ya está funcionando no considere prudente probar la otra opción. de igual forma agradezco a todos.