Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para iOS/OSX (https://www.clubdelphi.com/foros/forumdisplay.php?f=56)
-   -   Extraer informacion de ListView (https://www.clubdelphi.com/foros/showthread.php?t=96050)

giantonti1801 11-01-2023 18:51:27

Alimentacion de ListView con Datos SQL en tiempo de ejecucion
 
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:
Código Delphi [-]
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.

Código Delphi [-]
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 01:07:44

ya logre hacerlo

Código Delphi [-]
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
Código Delphi [-]
ListView1ItemClickEx
necesito capturar el valor de este registro en especifico "txtRut" y no consigo la forma de hacerlo.

cloayza 12-01-2023 13: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...

Código Delphi [-]
    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 14:11:12

Cita:

Empezado por giantonti1801 (Mensaje 549953)
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...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:
Código Delphi [-]
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í:



Si pulsas en los Items, obtienes esto:

(En el segundo)


(En el cuarto)

giantonti1801 12-01-2023 14:27:04

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 549963)
Depende de cómo hayas creado esos elementos.
En mi caso que utilizo ese sistema:
https://blog.delphiedintorni.it/2014...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:
Código Delphi [-]
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í:



Si pulsas en los Items, obtienes esto:

(En el segundo)


(En el cuarto)

Mil Gracias amigo esta solución me quedo perfecta.

giantonti1801 12-01-2023 15:24:10

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 549963)
Depende de cómo hayas creado esos elementos.
En mi caso que utilizo ese sistema:
https://blog.delphiedintorni.it/2014...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:
Código Delphi [-]
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í:



Si pulsas en los Items, obtienes esto:

(En el segundo)


(En el cuarto)

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
Código Delphi [-]
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;

Código Delphi [-]
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 15:40:17

solucionado modificando
Código Delphi [-]
Str := TListItemText(AItem.Objects[i]).Text;

cloayza 12-01-2023 20:30:00

Estimado colega, si me permite insistir con la opción que le indique, creo se evita algunas líneas de codigo...

Código Delphi [-]
      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 13-01-2023 00:58:47

Extraer informacion de ListView
 
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.

Código Delphi [-]
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 11:11:08

¿Es para iOS?

Neftali [Germán.Estévez] 13-01-2023 11: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 11: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í:
Código Delphi [-]
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 11:28:01

En el evento DeleteItem puedes probar algo como esto:

Código Delphi [-]
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 12:31:48

Cita:

Empezado por duilioisola (Mensaje 549989)
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í:
Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 02:17:52.

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