Popular A list view at runtime with DynamicAppearance

Good Morning, I'm trying to add items to a listview at runtime. In this item to a text and an image, the part of the text worked normal, but the image does not, it is added Normally, but it is done for all other items, it had to be equal to the text, each item with its own. Follow the Code:

 anitem : TListViewItem;
        txt : TListItemText;
        img : TListItemImage;
begin

    with FrmMain do
    begin

      anitem :=Listview1.items.add;

       with anitem do
       begin

        txt := TListItemText(Objects.FindDrawable('Text1'));
        txt.Text := S.Nome;
        //the image  part
        img := TListItemImage(Objects.FindDrawable('Image2'));

        img.Bitmap := s.Icone;
       end;

    end; 



//A rotina que estava com problema: 

    procedure TfrmMain.crialista;
    var
    Aux1 : TStringDynArray; // Usado para trocar o nome.exe por nome_Icon
    icone : string;          // Recebe o caminho completo para pegar o icone
    Programa : Tprograma;  //  Contem todas as informações do programa , é passado para cada item da listbox.
    Path : string;   //acho que não serve de nada
        // tb não usa pra nada
      Aux : integer;
     ARPrograma : array of TPrograma ;
      searchaux: string;
      Contador : integer;
    begin
         listview1.Items.clear;

              TThread.CreateAnonymousThread(procedure
         begin
          QryEIS.Close;
          QryEIS.open; 
            Contador:= 0 ;

           SetLength(ARPrograma, QRyEIS.RecordCount );
          QryEIS.First;        
          while not QryEIS.Eof do
            begin
              QryDiretorio.Close;

              QryDiretorio.ParamByName('NomeDoSistema').Value:= QryEIS.FieldByName('DescricaoEIS').Value;
                 QryDiretorio.Open;
              // Pegando o Icone do programa...

              if QryDiretorio.RecordCount = 0  then //escrever o erro aqui
                else
                begin

              aux1 :=     splitString( QryDiretorio.FieldByName('Sistema').Value, '.')  ;
              icone := 'F:\Sistemas\Icones\Launcher\' +aux1[0]+'_Icon.ico';
             // ImageList1.AddMasked(Bmp,clFuchsia);
              imagecontrol1.LoadFromFile(icone);
              ARPrograma[Contador].Icone := imagecontrol1.bitmap;


              ARPrograma[Contador].Nome:= QryDiretorio.FieldByName('NomeDoSistema').Value;
              ARPrograma[Contador].NomeExe :=  QryDiretorio.FieldByName('Sistema').Value;
                 ARPrograma[Contador].SingleUser := QryDiretorio.FieldByName('SingleUser').Value ;
              // Caminho da unidade C (PathC) e da unidade F (Path)
              if QryDiretorio.FieldByName('SingleUser').Value = 'T' then
              begin
            ARPrograma[Contador].path := trim(QryDiretorio.FieldByName('Origem').Value)+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
                ARPrograma[Contador].pathC := trim(QryDiretorio.FieldByName('destino').Value)+'\'+qryNome.FieldByname('NomeUsuario').Value+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
                ARPrograma[Contador].DiretorioUser := trim(QryDiretorio.FieldByName('destino').Value)+'\'+qryNome.FieldByname('NomeUsuario').Value;
                 ARPrograma[Contador].Diretorio   :=trim(QryDiretorio.FieldByName('destino').Value);
                 ARPrograma[Contador].SingleUser := QryDiretorio.FieldByName('SingleUser').Value ;

              end
              else
              begin
              ARPrograma[Contador].path := trim(QryDiretorio.FieldByName('Origem').Value)+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
              ARPrograma[Contador].pathC := trim(QryDiretorio.FieldByName('destino').Value)+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
              ARPrograma[Contador].Diretorio := trim(QryDiretorio.FieldByName('destino').Value);
              end ;



                aux := fileage(ARPrograma[Contador].path);
               ARPrograma[Contador].DataMod := FileDateToDateTime(aux);
             ARPrograma[Contador].Versao  :=  Sto_GetFmtFileVersion(Programa.path , '');
              if Programa.Versao <> '' then 
                  begin
                  aux1 := splitString (Programa.Versao , '.');
                 ARPrograma[Contador].iVer[1] := strtoint(aux1[0]);
                 ARPrograma[Contador].iVer[2] := strtoint(aux1[1]);
                  ARPrograma[Contador].iVer[3] := strtoint(aux1[2]);
                  ARPrograma[Contador].iVer[4] := strtoint(aux1[3]);
                  end;


                  if fileExists(programa.pathC) then
                begin


                  ARPrograma[Contador].VersaoC := Sto_GetFmtFileVersion(Programa.pathC , '');
                   if Programa.VersaoC <> '' then   //  Mesma coisa do comentario do F:
                  begin
                  aux1 := splitString (Programa.VersaoC , '.');
                 ARPrograma[Contador].iVerC[1] := strtoint(aux1[0]);
                  ARPrograma[Contador].iVerC[2] := strtoint(aux1[1]);
                  ARPrograma[Contador].iVerC[3] := strtoint(aux1[2]);
                  ARPrograma[Contador].iVerC[4] := strtoint(aux1[3]);
                  end;
                end ;


            // Here i call the CriaFrama. 
              criaframa(ARPrograma[Contador], Contador);

               contador := Contador +1;
              end;


              QryEIS.Next;



              end;


             TThread.Synchronize(nil, procedure
             begin
    // some visual thing....

             end);

         end).Start;
    end;
Author: Matheus Anselmo, 2020-03-02

1 answers

Then as it was said in the comments, a guy from the forum in English responded. In the end the problem was not in this routine but in the routine that calls this. I was pointing all items to the same bitmap and wasn't synchronizing the threads. Follow the working code

 procedure TfrmMain.crialista;
var
Aux1 : TStringDynArray; 
icone : string;          
Path : string;   
Aux : integer;
ARPrograma : array of TPrograma ;
searchaux: string;
Contador : integer;
bitmap : FMX.Graphics.TBitmap;
begin

     listview1.Visible := false;
 load_menu.Visible := true;
 Load_menu.Enabled :=  true;
     frmMain.LPrincipal.RemoveObject(0);
     listview1.Items.clear;
     searchaux:= searchBox1.Text;
     searchBox1.Text.Empty;
    TThread.CreateAnonymousThread(procedure
    var bitmap : FMX.Graphics.TBitmap;
     begin
      QryEIS.Close;
      QryEIS.open; 
       Contador:= 0 ;
       SetLength(ARPrograma, QRyEIS.RecordCount );
      QryEIS.First;        
      while not QryEIS.Eof do
        begin
          QryDiretorio.Close;

          QryDiretorio.ParamByName('NomeDoSistema').Value  := 
            QryEIS.FieldByName('DescricaoEIS').Value;
             QryDiretorio.Open;


          if QryDiretorio.RecordCount = 0  then 
            else
            begin

                   TThread.Synchronize(nil, procedure
        begin
           aux1 :=splitString( QryDiretorio.FieldByName('Sistema').Value, '.')  ;
           icone := 'F:\Sistemas\Icones\Launcher\' +aux1[0]+'_Icon.ico';
           BitMap := FMX.Graphics.TBitmap.CreateFromFile(icone); // aqui 
           ARPrograma[Contador].Icone := bitmap ;

        end);



          ARPrograma[Contador].Nome:= QryDiretorio.FieldByName('NomeDoSistema').Value;
          ARPrograma[Contador].NomeExe :=  QryDiretorio.FieldByName('Sistema').Value;
             ARPrograma[Contador].SingleUser := QryDiretorio.FieldByName('SingleUser').Value ;

          if QryDiretorio.FieldByName('SingleUser').Value = 'T' then
          begin
        ARPrograma[Contador].path := trim(QryDiretorio.FieldByName('Origem').Value)+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
            ARPrograma[Contador].pathC := trim(QryDiretorio.FieldByName('destino').Value)+'\'+qryNome.FieldByname('NomeUsuario').Value+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
            ARPrograma[Contador].DiretorioUser := trim(QryDiretorio.FieldByName('destino').Value)+'\'+qryNome.FieldByname('NomeUsuario').Value;
             ARPrograma[Contador].Diretorio   :=trim(QryDiretorio.FieldByName('destino').Value);
             ARPrograma[Contador].SingleUser := QryDiretorio.FieldByName('SingleUser').Value ;

          end
          else
          begin
          ARPrograma[Contador].path := trim(QryDiretorio.FieldByName('Origem').Value)+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
          ARPrograma[Contador].pathC := trim(QryDiretorio.FieldByName('destino').Value)+'\'+trim(QryDiretorio.FieldByName('Sistema').Value);
          ARPrograma[Contador].Diretorio := trim(QryDiretorio.FieldByName('destino').Value);
          end ;
          //Pega a versão do .exe da unidade F:


            aux := fileage(ARPrograma[Contador].path);
           ARPrograma[Contador].DataMod := FileDateToDateTime(aux);
         ARPrograma[Contador].Versao  :=  Sto_GetFmtFileVersion(Programa.path , '');
          if Programa.Versao <> '' then //caso não seja nulo , coloca no array de integer , para ficar mais facil de comparar na hora de atualizar. (fica em Udetalhes)
              begin
              aux1 := splitString (Programa.Versao , '.');
             ARPrograma[Contador].iVer[1] := strtoint(aux1[0]);
             ARPrograma[Contador].iVer[2] := strtoint(aux1[1]);
              ARPrograma[Contador].iVer[3] := strtoint(aux1[2]);
              ARPrograma[Contador].iVer[4] := strtoint(aux1[3]);
              end;

              if fileExists(programa.pathC) then
            begin


              ARPrograma[Contador].VersaoC := Sto_GetFmtFileVersion(Programa.pathC , '');
               if Programa.VersaoC <> '' then  
              begin
              aux1 := splitString (Programa.VersaoC , '.');
              ARPrograma[Contador].iVerC[1] := strtoint(aux1[0]);
              ARPrograma[Contador].iVerC[2] := strtoint(aux1[1]);
              ARPrograma[Contador].iVerC[3] := strtoint(aux1[2]);
              ARPrograma[Contador].iVerC[4] := strtoint(aux1[3]);
              end;
            end ;


          TThread.Synchronize(nil, procedure
        begin
             criaframa(ARPrograma[Contador], Contador);

        end);


           contador := Contador +1;
          end;

          QryEIS.Next;



          end;


        TThread.Synchronize(nil, procedure
        begin

          listview1.Visible := true;
          load_menu.Visible := false;
          Load_menu.Enabled :=  false;
           searchBox1.Text :='';
        end);

     end).Start;
end;
 0
Author: Matheus Anselmo, 2020-03-03 20:44:26