2016-02-24 15 views
1

我創建了一個firemonkey(XE8)應用程序。 我的應用程序從XML文件讀取數據並從中填充memTable。 memTable綁定一個'ListView'。TFDMemTable和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

與緩慢無關,但您應該在'Repeat'循環之前檢查'Node = nil',以防沒有孩子 –

回答

1

直播綁定是不是快,尤其是在像listview多行GUI組件參與。通過listview將數據加載到dataset中是一種效率低下的方法。

我會嘗試從FDMemTable直接斷開綁定(代碼),將數據加載到FDMemTable,而不是進入列表視圖,然後重新連接綁定到FDMemTable