我创建了一个firemonkey(XE8)应用程序。 我的应用程序从XML文件中读取数据并从中填充memTable。 memTable绑定了一个'ListView'。
一切正常,但这个过程很慢。我尝试使用progressbar
,但在运行repeat
循环时,“冻结应用程序”并在ListView
完全填充后重新开始工作。
我如何解决这个问题?
代码:
procedure TForm2.layoutCatalogoClick(Sender: TObject);
var
Node: IXMLNode;
auxValor :Double;
begin
Label2.Visible := True;
mmtListaProdutos.Close;
mmtListaProdutos.CreateDataSet;
mmtListaProdutos.Open;
XMLDocument1.FileName := 'C:\dados\xml.xml';
XMLDocument1.Active := true;
Node := XMLDocument1.DocumentElement.ChildNodes.FindNode('produto');
Node.ChildNodes.First;
ProgressBar1.Max := node.ChildNodes.Count;
ProgressBar1.Value := 0;
repeat
ProgressBar1.Value := ProgressBar1.Value + 1;
auxValor := StrToFloat(Node.ChildNodes['valor_preco_a'].Text);
mmtListaProdutos.Append;
mmtListaProdutoscodigo.AsString := Node.ChildNodes['codigo'].Text;
mmtListaProdutosdescricao.AsString := Node.ChildNodes['descricao'].Text;
mmtListaProdutosreferencia.AsString := Node.ChildNodes['referencia'].Text;
mmtListaProdutoscodigo_EAN.AsString := Node.ChildNodes['codigo_EAN'].Text;
mmtListaProdutosgrupo.AsString := Node.ChildNodes['grupo'].Text;
mmtListaProdutosfornecedor.AsString := Node.ChildNodes['fornecedor'].Text;
mmtListaProdutosmarca.AsString := Node.ChildNodes['marca'].Text;
mmtListaProdutosunidade.AsString := Node.ChildNodes['unidade'].Text;
mmtListaProdutosvalidade.AsString := Node.ChildNodes['validade'].Text;
mmtListaProdutosvalor_preco_a.AsString := Node.ChildNodes['valor_preco_a'].Text;
mmtListaProdutosvalor_preco_b.AsString := Node.ChildNodes['valor_preco_b'].Text;
mmtListaProdutosaltura.AsString := Node.ChildNodes['altura'].Text;
mmtListaProdutoscomprimento.AsString := Node.ChildNodes['comprimento'].Text;
mmtListaProdutoslargura.AsString := Node.ChildNodes['largura'].Text;
mmtListaProdutoscodDesc.AsString := Node.ChildNodes['codigo'].Text + ' | ' + Node.ChildNodes['descricao'].Text;
mmtListaProdutosvalorUnd.AsString := 'R$ ' + FormatFloat('#.00', auxValor) + ' / ' + Node.ChildNodes['unidade'].Text;
mmtListaProdutosmarcaFornec.AsString := Node.ChildNodes['marca'].Text;
mmtListaProdutos.Post;
Node := Node.NextSibling;
until Node = nil;
mmtListaProdutos.First;
pnlListaProdutos.Visible := True;
pnlPrincipal.Visible := False;
end;
答案 0 :(得分:1)
实时绑定不是很快,特别是涉及像listview
这样的多行GUI组件时。通过dataset
将数据加载到listview
是一种特别低效的方法。
我尝试断开绑定(在代码中)与FDMemTable
,将数据直接加载到FDMemTable
,而不是加载到列表视图中,然后重新连接绑定到FDMemTable
。