El primero de ellos evita que se actualice visualmente el ListView hasta que lo autoricemos. La utilidad del truco se aprecia cuando la carga del ListView es extensa lo que requiere bastante tiempo. Con este truco ganamos velocidad e expensas de "no ver lo que pasa" con lo que es recomendable avisar de alguna forma que "se están haciendo cosas"
Para evitar la actualización del ListView usaremos este código:
delphi
procedure EnableRedraw(Handle: THandle; Enable: boolean); begin if not Enable then // Evito que se repinte a cada actualización de línea... SendMessage(Handle, WM_SETREDRAW, 0, 0) else begin // Permito que se repinte y obligo a que se actualize SendMessage(Handle, WM_SETREDRAW, 1, 0); InvalidateRect(Handle, nil, true); end; end;
En realidad el truco puede usarse para cualquier otro control sobre el que nos interese ese comportamiento, así que podéis experimentar con el código expuesto y otros controles lentos como puede ser un TMemo
El segundo truco es más específico del ListView y trata de asegurar que un Item va a ser visible. Es útil cuando tras seleccionar uno de ellos, realizamos una ordenación de los mismos o cuando pretendemos que se vea el último añadido tras haber llenado la zona visible, dando la sensación de que se realiza un scroll hacia arriba.
delphi
const LVM_ENSUREVISIBLE = $1013; function ListView_EnsureVisible(wnd: HWND; i: integer; fPartialOK: boolean): boolean; begin Result:= 0 <> SendMessage(wnd, LVM_ENSUREVISIBLE, i, MAKELPARAM(WORD(fPartialOK), 0)); end;
Un ejemplo de uso:
delphi
// Para el último de la lista ListView_EnsureVisible(MyListView.Handle, MyListView.Items.Count-1, true); // Para el seleccionado: ListView_EnsureVisible(MyListView.Handle, MyListView..Selected.Index, true);
Espero que os sea de utilidad.
Saludos.