Secondo me, però, è meglio inoltrare il filtro direttamente alla query SQL, in modo da evitare lo scaricamento di record non necessari.
Non è così semplice... Quello che volevo implementare era un "search-as-you-type", ed è inconcepibile fare una nuova query ogni volta che l'utente preme un tasto...
Ma ho trovato una soluzione. Innanzitutto ho installato in prova i MySQL Data Access Components (http://www.crlab.com), e sto pensando di acquistarli perché sono veramente meravigliosi.
La classe TMyTable (discendente da TDataSet) contiene la proprietà FilterSQL, che permette di effettuare il filtraggio con un'istruzione SQL, senza tuttavia ricaricare i dati dal server.
Poi ho creato un thread:
codice:
procedure TSQLFilterThread.Execute;
begin
try
while not Terminated do
begin
Sleep(750);
PostMessage(Form1.Handle, WM_FILTER_GRID, 0, 0);
end;
except
on e : Exception do ThreadException := e.Message;
end;
end;
Il thread ogni 750 millisecondi invia alla form un messaggio personalizzato (WM_FILTER_GRID). Il messaggio viene catturato da un apposito handle, che verifica il testo contenuto nel campo di ricerca ed esegue il filtraggio con TMyTable.FilterSQL.
Il risultato è una sorta di "search-as-you-type".