Delphi, ¿cuál es el método más rápido acceso al registro en un TcxGrid o TDataSet

StackOverflow https://stackoverflow.com/questions/4080196

  •  28-09-2019
  •  | 
  •  

Pregunta

Estoy utilizando Delphi 2007 y el TcxGrid para mostrar el contenido de un archivo de biblioteca. La información de base de datos alberga sobre el tipo de archivo, el nombre, la ruta y la extensión.

En la prueba Estoy cargando 1700 registros en la red a través de la TDataSet. También hago habitación en la parrilla por 3 campos más que aún necesitan ser calculada. Son los archivos si existe, el tamaño del archivo, y la fecha de modificación.

Mi objetivo es mostrar al usuario toda la información que se almacena (que funciona muy bien y es rápido) y luego en un subproceso de fondo para encontrar la información de los otros tres campos de datos y luego insertarlos en el TcxGrid. Esta pregunta tiene poco o nada que ver con la rosca que estoy haciendo. Su funcionamiento muy bien.

Mi problema es que el acceso a los campos de la cuadrícula que ya está construido tiene una enorme desaceleración cuando accedo a ella. He tratado de dos maneras diferentes ...

  1. Grid.DataController.Values ??[RecordIndex, FieldIndex] - pero esto es una variante y sospecho que es por qué es tan lenta

  2. Grid.DataController.DataSet.FindFirst Grid.DataController.DataSet.FindNext Grid.DataController.DataSet.Fields [FieldIndex] Pero el uso de este "buscan" método es tan lento como el primer método lo intentara. Localizar y moveBy son lentos también.

Mientras corta pregunta, ¿Cuál es la manera más rápida de acceder a un registro?

¿Fue útil?

Solución 3

El código de actualización necesitaba estar dentro de una Introducción / actualización final fue mi gran problema.

Gracias por su comentario Lieven ya que era la solución a mi problema. Y gracias Gad y Daniel para las respuestas que he aprendido de.

Esto habría sido más evidente para todo el mundo tenía ayer más tiempo para publicar algo de código.

Otros consejos

Por favor, mencionar también si está utilizando un TcxGridDBTableView o TcxGridTableView?

Creo que si no se utilizan db conscientes TcxGridTableView o TcxBandedGridTableView con

View.DataController.Values ??[RecordIndex, FieldIndex] es el más rápido.

Incluso si usted tiene una aplicación de DB se puede cargar la versión no-db de la vista en la inicialización y de eventos mango DataController para detectar cambios en los datos y las cuestiones de los respectivos comandos SQL para actualizar la base de datos.

Se puede llenar la vista como esta: ?

class procedure TForm1.FillView(const View: TcxGridBandedTableView; const Sql: string);
var
  Reader: TMyOrmDataReader;
  i: Integer;
begin
  Assert(Assigned(View), 'View is not assigned parameter.');
  with View.DataController do
  begin
    BeginFullUpdate;
    try
      Reader := TMyOrm.GetDataReader(SQL);
      try
        i := 0;
        RecordCount := 50 * 1000; // make it something big in order to avoid constant resizing by 1
        while Reader.Read do
        begin
          // Fill the view
         Values[i,  0] := Reader.GetInt32(0);
         Values[i,  1] := Reader.GetString(1);
         Inc(i);
        end;
        RecordCount := i - 1;
      finally
        Reader.Free;
      end;
    finally
      EndFullUpdate;
    end;
  end;
end;

Y a continuación, los valores de acceso como:

View1.DataController.Values[View1.DataController.FocusedRecordIndex, View1Column1.Index].AsString

Se puede trabajar con mesa / base de datos primero anexar los datos que faltan y luego mostrar todos los campos como datbound.

Yo sé que esto es un viejo hilo, pero voy a mencionar que el cambio de la red para utilizar el modo Proveedor es otra manera de mejorar la velocidad de carga, ya que básicamente convierte la carga de red en una operación virtual. (Los registros no se cargan hasta que son necesarios para la visualización u otro acceso a los datos.) Después de eso, el DataController las almacena en caché, por lo que el acceso es muy rápido una vez cargado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top