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
,