delphi - 在运行时填充 ListView
问题描述
我正在尝试在运行时使用 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;
只是为了我可以发布项目......
看起来您的帖子主要是代码;请添加更多细节。看起来您的帖子主要是代码;请添加更多细节。看起来您的帖子主要是代码;请添加更多细节。
解决方案
首先,非常感谢 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;
其他部分还是一样的。
推荐阅读
- c - 我如何在c中解析这个文件
- javascript - 使用 JavaScript 代码自动填写(网站表单)和网络发布
- xcode - Xcode 13.0 主题语法着色无法识别第三方类型名称
- css - 样式标签的媒体属性和规则中的媒体之间的区别
- keycloak - Keycloak 是否可以从公共客户端访问资源服务器
- ffmpeg - 自从更新到 3.4.9 后,无法使用 ffmpeg 在 centos 上将视频转换为 mp4
- pyspark - 需要帮助在 pyspark 的 for 循环中附加数据帧
- javascript - 如何修复这个反应过滤器?
- javascript - 这个错误在 Redux - Toolkit 中意味着什么?
- typescript - 为什么在导入模块时会显示此错误?