TFDMemTable和ListView

时间:2016-02-24 11:17:01

标签: delphi listview delphi-xe8

我创建了一个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;

1 个答案:

答案 0 :(得分:1)

实时绑定不是很快,特别是涉及像listview这样的多行GUI组件时。通过dataset将数据加载到listview是一种特别低效的方法。

我尝试断开绑定(在代码中)与FDMemTable,将数据直接加载到FDMemTable,而不是加载到列表视图中,然后重新连接绑定到FDMemTable