Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ListView interesante (https://www.clubdelphi.com/foros/showthread.php?t=51216)

Esau 09-12-2007 19:19:13

ListView interesante
 
Hola Foristas, les cuento estoy haciendo una aplicación interesante en la cual tengo un ListView con datos de todo tipo, el ListView tiene en su propiedad ViewStyle = vsReport. Para que aparezca como un grid. Tengo varias columnas, cada columna de un tipo: enteros , textos y fechas.
Cuando el usuario desea que los datos se muestren en forma ascendente ordenado por una columna solo hace clic en el titulo de la columna, si desea que este ordenado pero de forma descendente vuelve ha hacer clic en la columna y se ordena de forma descendente. Hasta este punto todo funciona bien, pero me gustaría que al momento que los datos se encuentren de forma ascendente o descendente se dibuje en el titulo una flechita según sea el caso o algo muy parecido al explorador de Windows,
En el Explorador si Uds. hacen Clic al nombre se ordena y se dibuja en el titulo una flecha que nos indica en que orden se encuentra ordenado, si vuelven ha hacer clic en la misma columna el orden se invierte y también la flecha o indicador.

En Delphi existe alguna forma de hacer lo mismo en un ListView?

Saludos y Gracias

xEsk 09-12-2007 22:38:22

Hola, hace algún tiempo implementé el código que realiza lo que buscas, aquí lo tienes:
Código Delphi [-]
procedure SetColumnImage(const ListView: TListView; Column: Integer; Down: Boolean);
var
  n: Integer;

  procedure RemoveImage(Index: Integer);
  var
    Header: THandle;
    HDItem: THDItem;

  begin
    // Get the ListView Header Handle
    Header := ListView_GetHeader(ListView.Handle);
    FillChar(HDItem, SizeOf(HDItem), 0);
    HDItem.Mask := HDI_BITMAP or HDI_IMAGE or HDI_FORMAT;
      // current status secure
    Header_GetItem(Header, Index, HDItem);
    // arrow delete
    HDItem.fmt := HDItem.fmt and not HDF_SORTUP and not HDF_SORTDOWN
      and not HDF_BITMAP_ON_RIGHT and not HDF_IMAGE;
    // changes use
    Header_SetItem(Header, Index, HDItem);
  end;

  procedure SetImage(Index: Integer; Direction: Boolean);
  var
    Header: THandle;
    HDItem: THDItem;

  begin
    // Get the ListView Header Handle
    Header := ListView_GetHeader(ListView.Handle);
    FillChar(HDItem, SizeOf(HDItem), 0);
    HDItem.Mask := HDI_BITMAP or HDI_IMAGE or HDI_FORMAT;
    // current status secure
    Header_GetItem(Header, Index, HDItem);
    // arrow is to appear right
    HDItem.fmt := HDItem.fmt and not HDF_SORTUP and not HDF_SORTDOWN
      and not HDF_IMAGE or HDF_BITMAP_ON_RIGHT;
    // set direction
    if Direction = true then //sdUp then
      HDItem.fmt := HDItem.fmt or HDF_SORTUP
    else
      HDItem.fmt := HDItem.fmt or HDF_SORTDOWN;
    // changes use
    Header_SetItem(Header, Index, HDItem);
  end;

begin
  // remove icons
  for n:=0 to ListView.Columns.Count - 1 do
    RemoveImage(n);
  // set the "arrow icon"
  SetImage(Column, not Down);
end;
El parámetro Down: Boolean sirve para indicar si la dirección es mirando hacia abajo, en caso de que "Down" sea false, entonces pinta la flecha mirando para arriba.

Ejemplo de uso:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetColumnImage(ListView1, 0, false);
end;
Saludos, espero que te sea útil.

Editado: Se me olvidó poner que se debe añadir "CommCtrl" en los USES!

Esau 10-12-2007 15:56:51

Funciona de Maravilla
 
Funciona de maravilla, no me queda nada mas que agradecerte por tu tiempo...

Saludos y Gracias de Nuevo.


La franja horaria es GMT +2. Ahora son las 16:24:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi