Domanda

Sto usando Delphi 2007 e TcxGrid per mostrare il contenuto di una libreria di file.Il database contiene informazioni sul tipo di file, nome, percorso ed estensione.

Durante i test sto caricando 1700 record nella griglia tramite TDataSet.Faccio spazio nella griglia anche per altri 3 campi che devono ancora essere calcolati.Indicano se il file esiste, dimensione del file e data di modifica.

Il mio obiettivo è mostrare all'utente tutte le informazioni memorizzate (che funziona benissimo ed è veloce), quindi in un thread in background trovare le informazioni per gli altri tre campi di dati e quindi inserirli in TcxGrid.Questa domanda ha poco o niente a che fare con il threading che sto facendo.Funziona bene.

Il mio problema è che l'accesso ai campi della griglia già costruita presenta un enorme rallentamento quando accedo.Ho provato due modi diversi...

  1. Grid.DataController.Values[RecordIndex,FieldIndex] - ma questa è una variante e sospetto che sia per questo che è così lento

  2. Grid.DataController.dataset.findFirst Grid.datacontroller.dataset.findnext Grid.datacontroller.dataset.fields [fieldindex] ma usando questo metodo "cercare" è altrettanto lento come il primo metodo che ho provato.Anche la localizzazione e lo spostamento sono lenti.

Domanda lunga, in breve: qual è il modo più veloce per accedere a un record?

È stato utile?

Soluzione 3

Il mio grosso problema era il codice di aggiornamento che doveva trovarsi all'interno di un aggiornamento di inizio/fine.

Grazie Lieven per il tuo commento poiché era la soluzione al mio problema.E grazie Gad e Daniel per le risposte da cui ho imparato.

Questo sarebbe stato più evidente a tutti se ieri avessi avuto più tempo per pubblicare del codice.

Altri suggerimenti

Indica anche se stai utilizzando TcxGridDBTableView o TcxGridTableView?

Penso che utilizzando TcxGridTableView o TcxBandedGridTableView non compatibili con il database con

View.DataController.Values[RecordIndex, FieldIndex] è il più veloce.

Anche se disponi di un'applicazione db puoi caricare la versione non db della vista durante l'inizializzazione e quindi gestire gli eventi DataController per rilevare le modifiche ai dati ed emettere i rispettivi comandi SQL per l'aggiornamento del database.

Puoi riempire la vista in questo modo:

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;

E quindi accedi a valori come:

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

Potresti lavorare con la tabella/set di dati aggiungendo prima i dati mancanti e quindi mostrare tutti i campi come associati a dati.

So che questo è un vecchio thread, ma dirò che passare dalla griglia all'utilizzo della modalità Provider è un altro modo per migliorare la velocità di caricamento, perché essenzialmente trasforma il caricamento della griglia in un'operazione virtuale.(I record non vengono caricati finché non sono necessari per la visualizzazione o altro accesso ai dati.) Successivamente, DataController li memorizza nella cache, quindi l'accesso è molto veloce una volta caricati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top