Ir al contenido



Foto

Trucos para TListView con la API de Windows


  • Por favor identifícate para responder
1 respuesta en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.849 mensajes
  • LocationMadrid - España

Escrito 03 enero 2014 - 06:36

Voy a exponeros dos trucos que he usado en código publicado en otras partes del foro pero que me parece buena idea que estén aislados para una mejor consulta.

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
  1.  
  2. procedure EnableRedraw(Handle: THandle; Enable: boolean);
  3. begin
  4.   if not Enable then
  5.     // Evito que se repinte a cada actualización de línea...
  6.     SendMessage(Handle, WM_SETREDRAW, 0, 0)
  7.   else
  8.   begin
  9.     // Permito que se repinte y obligo a que se actualize
  10.     SendMessage(Handle, WM_SETREDRAW, 1, 0);
  11.     InvalidateRect(Handle, nil, true);
  12.   end;
  13. 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
  1. const LVM_ENSUREVISIBLE = $1013;
  2. function ListView_EnsureVisible(wnd: HWND; i: integer; fPartialOK: boolean): boolean;
  3. begin
  4.     Result:= 0 <> SendMessage(wnd, LVM_ENSUREVISIBLE, i, MAKELPARAM(WORD(fPartialOK), 0));
  5. end;



Un ejemplo de uso:


delphi
  1. // Para el último de la lista   
  2. ListView_EnsureVisible(MyListView.Handle, MyListView.Items.Count-1, true);
  3.  
  4. // Para el seleccionado:
  5. ListView_EnsureVisible(MyListView.Handle, MyListView..Selected.Index, true);



Espero que os sea de utilidad.


Saludos.
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 03 enero 2014 - 08:41

Que par de buenos trucos amigo, muchas graias por compartirlo.
  • 0