TFDMemTable и ListView

Я создал приложение firemonkey (XE8). Мое приложение считывает данные из файла XML и заполняет таблицу памяти из этого. 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 ответ

Live Binding не быстрый, особенно когда многострочный компонент GUI, такой как listview вовлечен. И загрузка данных в dataset через listview это особенно неэффективный способ сделать это.

Я попробую отключить привязки (в коде) от FDMemTableзагрузка данных непосредственно в FDMemTable, а не в виде списка, а затем заново подключить привязки к FDMemTable,

Другие вопросы по тегам