我正在尝试在运行时使用DynamicAppearance填充ListView。文字部分效果很好,但图像始终与最后一个相同。此代码将相同的图像添加到所有项目。我只想将图像添加到一个项目中。
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;
procedure TfrmMain.CriaFrama(s: Tprograma; a : integer);
var
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;
仅我可以发布该项目.........
您的帖子似乎主要是代码;请添加更多详细信息。 看起来您的帖子大部分是代码;请添加更多详细信息。 看起来您的帖子大部分是代码;请添加更多详细信息。
答案 0 :(得分:0)
首先,非常感谢Remy Lebeau对我的帮助。 正如他在评论中所说,问题在于将所有项目指向相同的位图,并且在用户界面中进行某些更改时未同步段。 (不同步会产生一些访问冲突错误) 代码:
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);
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); // Do not use that , use the 2 params FileAge, for more information check the comments
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;
其他部分相同。