Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Listview con "flechitas" en columnas
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Listview con "flechitas" en columnas Responder citando

Despues de leerme todo lo que hay en el foro sobre poner la direccion de ordenacion en los captions de las columnas, me encuentro con un problema.

Lo he hecho añadiendo un imagelist con los 2 iconos (arriba y abajo) de 16x16 e incluyendo el imagalist en el smallimages del listview en modo VsReport.
Cuando le doy a una columna cambio el imageindex a 0 de la columna para que salga la flecha, y sale, pero en los item->caption aparece tambien la imagen. Pensando pensando di con el "fallo". Le puse a todos los items imageindex=-1. Ya no salen las flechas en los items pero deja el espacio a la izquierda que ocupa en dibujo. Como resulta que esa columna solo tiene espacio para 2 caracteres, si le añades el tamaño del dibujo, esos caracteres dejan de verse centrados y se ve fatal

Alguna idea para eliminar ese hueco?

Saludos, Bosoft.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Todavía no he solucionado el problema de las flechas en la cabecera de los ListView.
Por tanto, y después de mucho buscar, he encontrado un "trocito" de delphi que creo que me lo resolverá
Como el delphi y yo no nos hablamos de toda la vida, ruego a alguien me "corrija" la traducción
comentado está el código original

Código:
//uses commctrl;
#include <CommCtrl.hpp>

//procedure TForm1.SetColumnImage(List: TListView; Column, Image: Integer; ShowImage: Boolean);
void __fastcall SetColumnImage(TListView *List,int Column, int Image, bool ShowImage)
{
/*var
  Align, hHeader: integer;
  HD: HD_ITEM;   */
int Align, hHeader;
HD_ITEM HD;

//begin
  hHeader = SendMessage(List->Handle, LVM_GETHEADER, 0, 0);

//  with HD do
//  begin
//   case List.Columns[Column].Alignment of
  switch(List->Columns->Items[Column]->Alignment)
   {
/*    case List.Columns[Column].Alignment of
     taLeftJustify: Align := HDF_LEFT;
     taCenter: Align := HDF_CENTER;
     taRightJustify: Align := HDF_RIGHT;*/
    case taLeftJustify: Align = HDF_LEFT;
    case taCenter: Align = HDF_CENTER;
    case taRightJustify: Align = HDF_RIGHT;
//   else
//     Align := HDF_LEFT;
    default: Align = HDF_LEFT;
//   end;
   }

// ERRORES: variables mask, pszText, fmt, iImage no existen

//   mask := HDI_IMAGE or HDI_FORMAT;
   mask = HDI_IMAGE | HDI_FORMAT;

// pszText := PChar(List.Columns[Column].Caption);
   pszText = PChar(List->Columns->Items[Column]->Caption);

/*   if ShowImage then
     fmt := HDF_STRING or HDF_IMAGE or HDF_BITMAP_ON_RIGHT
   else
     fmt := HDF_STRING or Align;*/
   if( ShowImage )
     fmt = HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT;
   else
     fmt = HDF_STRING | Align;

//   iImage := Image
   iImage = Image;

//  end;

//  SendMessage(hHeader, HDM_SETITEM, Column, Integer(@HD));
  SendMessage(hHeader, HDM_SETITEM, Column, int(@HD));
// end;
}


El código está sacado de
http://delphi-kb.blogspot.com.es/2011/01/how-to-put-image-eg-sort-arrow-on.html

Saludos y gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:

#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ImgList.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
  TListView *ListView1;
  TImageList *ImageList1;
  void __fastcall ListView1ColumnClick(TObject *Sender,
          TListColumn *Column);
private:   // User declarations
  BOOL Ascending;
  TListColumn *LastColumn;
  void __fastcall TForm1::WndProc(Messages::TMessage &Message);
public:      // User declarations
  __fastcall TForm1(TComponent* Owner);
  void __fastcall SetColumnImage(TListView *List, int Column, int Image, BOOL ShowImage);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

int __stdcall SortByColumn(DWORD lParam1, DWORD lParam2, DWORD lParamSort, BOOL ARecurse = False)
{
  return 0;
}

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  LastColumn = 0;
}

void __fastcall TForm1::SetColumnImage(TListView *List, int Column, int Image, BOOL ShowImage)
{
  int Align, hHeader;
  HD_ITEM HD;

  hHeader = SendMessage(List->Handle, LVM_GETHEADER, 0, 0);
  Align = List->Columns->Items[Column]->Alignment;
  HD.mask = HDI_IMAGE | HDI_FORMAT;
  HD.pszText = List->Columns->Items[Column]->Caption.c_str();

  if(ShowImage)
    HD.fmt = HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT;
  else
    HD.fmt = HDF_STRING | Align;

  HD.iImage = Image;

  SendMessage((HANDLE)hHeader, HDM_SETITEM, Column, (DWORD)&HD);
}

void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)
{
  LastColumn = Column;

  // Toggle column Tag
  Column->Tag ^= 1; // 0 -> 1  ;  1 -> 0
  // Determine sort order based on the value of the Tag
  Ascending = Column->Tag == 1;

  // This loop displays the icon in the selected column.
  for(int i = 0; i < ListView1->Columns->Count; i++)
    SetColumnImage(ListView1, i, Column->Tag, i == Column->Index);

  // The CustomSort function is not covered in this
  // article but is explained elsewhere in Delphi Knowledge Base
  TListView(Sender).CustomSort((PFNLVCOMPARE)SortByColumn, Column->Index);
}

void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  if (Message.Msg == WM_NOTIFY  && LastColumn && Message.LParam){
    if(((NMHDR*)(Message.LParam))->hwndFrom == ListView1->Handle)
    for(int i = 0; i < ListView1->Columns->Count; i++)
      SetColumnImage(ListView1, i, LastColumn->Tag, i == LastColumn->Index);
  }
  TForm::WndProc(Message);

}



Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si lo que quieres es usar las flechitas estándar de Windows, puedes usar este código:

Código:

#define  HDF_SORTDOWN  0x0200
#define  HDF_SORTUP    0x0400

void SetSortIcon(TListView *ListView, int ColumnIndex, BOOL Ascending)
{
  HANDLE hHeader;
  HD_ITEM HD;

  hHeader = (HANDLE)SendMessage(ListView->Handle, LVM_GETHEADER, 0, 0);
  HD.mask = HDI_FORMAT;
  SendMessage(hHeader, HDM_GETITEM, ColumnIndex, DWORD(&HD));
 
  if(Ascending == 1)
    HD.fmt = (HD.fmt & ~HDF_SORTUP) |  HDF_SORTDOWN;
  else
    HD.fmt = (HD.fmt & ~HDF_SORTDOWN) | HDF_SORTUP;

  SendMessage(hHeader, HDM_SETITEM, ColumnIndex, DWORD(&HD));
}



Código:

void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)
{
  Column->Tag ^= 1; // Guardamos eun el tag 1 ó 0 para indicar el orden
  SetSortIcon(ListView1, Column->Index, Column->Tag);

  // Ordenamos según convenga... esto no está implementado
  TListView(Sender).CustomSort((PFNLVCOMPARE)SortByColumn, Column->Index);
}


Si usas un BCB antiguo, no olvides incluir un archivo de recursos XP.rc

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchísimas gracias, escafandra
He estado 2 días fuera y me encuentro con 2 soluciones Shocked

Ahora me pongo a probarlas y te cuento

Lo dicho, Gracias

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola escafandra y antes, repito, GRACIAS

He probado las 2 "formas" en un proyecto nuevo
La segunda va perfecta, aunque le falta el borrado de la anterior columna y el repintado si se cambia el tamaño de la cabecera. Me pondré a ello después.

En cuanto a la primera forma me salta este error
Código:
Project Project1.exe raised exception class EStackOverflow with message 'Stack overflow'.

He intentado buscar en que zona salta, pero paso a paso nunca lo consigo
Analizando paso a paso, veo que en SetSortIcon siempre llega la columna 0, es decir, como si la función se volviese recursiva y jamás pasase de la columna 0.

He puesto varios breaks y este es el resultado independientemente de la columna pinchada:
en ListView1ColumnClick dentro del for: salta a la primera. Valor de i=0
en WndProc dentro del for: i=0 siempre y después de 15 o 20 <F8> no salta el error
en SetSortIcon: siempre le llega ColumnIndex=0

Por cierto, en la forma 2 he puesto unos iconos en el imagelist, por si era ese el error

Saludos y GRACIAS

Edito: Uso RAD 2007
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Para que se borre la anterior flechita puedes usar esta forma:

Código:

void SetSortIcon(TListView *ListView, int ColumnIndex, BOOL Ascending)
{
  HANDLE hHeader;
  HD_ITEM HD;

  hHeader = (HANDLE)SendMessage(ListView->Handle, LVM_GETHEADER, 0, 0);
  for(int i = 0; i < ListView->Columns->Count; i++){
    HD.mask = HDI_FORMAT;
    SendMessage(hHeader, HDM_GETITEM, i, DWORD(&HD));
    if(i == ColumnIndex){
      if(Ascending)
        HD.fmt = (HD.fmt & ~HDF_SORTUP) | HDF_SORTDOWN;
      else
        HD.fmt = (HD.fmt & ~HDF_SORTDOWN) | HDF_SORTUP;
    }
    else
      HD.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);

    SendMessage(hHeader, HDM_SETITEM, i, DWORD(&HD));
  }
}


No me queda claro el código que te falla, si la traducción de delphi y esta última filosofía sin imágenes. A mi no me falla ninguno, no creo que en el copy/paste que hice para publicar aparezca un "gazapo". Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias de nuevo
Estaba haciéndolo desde el ListView1ColumnClick pero me has ganado. Ahora solo tengo que poner los tags a 0 para que no recuerde los anteriores en las demás columnas

Cita:
No me queda claro el código que te falla, si la traducción de delphi y esta última filosofía sin imágenes. A mi no me falla ninguno, no creo que en el copy/paste que hice para publicar aparezca un "gazapo". Saludos.

Es la traducción de delphi y no se si podré explicar lo que falla, puesto que al hacer el seguimiento paso a paso no aparece el error y si fuese algún error de copy/paste se podría reproducir paso a paso

Quedo a tu disposición por si quieres averiguar el fallo y me presto a hacer todas las pruebas necesarias


saludos y GRACIAS

EDITO: para añadir la "limpieza" de tags

Código:
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
     TListColumn *Column)
{
 // Guardamos eun el tag 1 ó 0 para indicar el orden
//Column->Tag ^= 1; // ahora lo guardamos en TAG
int TAG=Column->Tag ^ 1;

  for(int i = 0; i <ListView1>Columns->Count; i++)
        ListView1->Column[i]->Tag=0;

Column->Tag=TAG;
SetSortIcon(ListView1, Column->Index, Column->Tag);

  // The CustomSort function is not covered in this
  // article but is explained elsewhere in Delphi Knowledge Base
  TListView(Sender).CustomSort((PFNLVCOMPARE)SortByColumn, Column->Index);

}

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pues ya está casi resuelto el tema
Siguiendo con la filosofía "sin imágenes", solo falta añadir que al redimensionar una columna se repinte la flecha
El código necesario sería tal que así (probado en un button):
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(int i = 0; i <ListView1>Columns->Count; i++)
      if(ListView1->Column[i]->Tag)
            SetSortIcon(ListView1, i, ListView1->Column[i]->Tag);
}

Pero no consigo saber el evento que salta al redimensionar la columna. Los he probado todos, incluidos ListView1AdvancedCustomDraw, ListView1Resize y ListView1CustomDraw, pero o no funcionan (ListView1Resize) o se ejecutan antes de terminar el repintado, con lo cual la flecha se borra.

Saludos Y Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:

class TForm1 : public TForm
{
__published:   // IDE-managed Components
  TListView *ListView1;
  void __fastcall ListView1ColumnClick(TObject *Sender,
          TListColumn *Column);
  void __fastcall FormCreate(TObject *Sender);
private:
  TListColumn *LastColumn;
  TWndMethod OldListViewProc;
  void __fastcall ListViewWindowProc(TMessage &Msg);

public:      // User declarations
  __fastcall TForm1(TComponent* Owner);
};



Código:

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  LastColumn = 0;
  OldListViewProc = ListView1->WindowProc;
  ListView1->WindowProc = ListViewWindowProc;
}

void SetSortIcon(TListView *ListView, int ColumnIndex, BOOL Ascending)
{
  HANDLE hHeader;
  HD_ITEM HD;

  hHeader = (HANDLE)SendMessage(ListView->Handle, LVM_GETHEADER, 0, 0);
  for(int i = 0; i < ListView->Columns->Count; i++){
    HD.mask = HDI_FORMAT;
    SendMessage(hHeader, HDM_GETITEM, i, DWORD(&HD));
    if(i == ColumnIndex){
      if(Ascending)
        HD.fmt = (HD.fmt & ~HDF_SORTUP) | HDF_SORTDOWN;
      else
        HD.fmt = (HD.fmt & ~HDF_SORTDOWN) | HDF_SORTUP;
    }
    else
      HD.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);

    SendMessage(hHeader, HDM_SETITEM, i, DWORD(&HD));
  }
}

void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)
{
  LastColumn = Column;
  Column->Tag ^= 1; // Guardamos eun el tag 1 ó 0 para indicar el orden
  SetSortIcon(ListView1, Column->Index, Column->Tag);

  // Ordenamos según convenga... esto no está implementado
  TListView(Sender).CustomSort((PFNLVCOMPARE)SortByColumn, Column->Index);
}

void __fastcall TForm1::ListViewWindowProc(TMessage &Msg)
{
  if(Msg.Msg == WM_NOTIFY && Msg.LParam && LastColumn){
    if((((NMHDR*)(Msg.LParam))->code == NM_RELEASEDCAPTURE))
       SetSortIcon(ListView1, LastColumn->Index, LastColumn->Tag);
  }
  OldListViewProc(Msg);
}



Saludos.


Ultima edición por escafandra el Vie 18 Sep, 2015 10:21 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola de nuevo, escafandra
Supongo que tu última "versión" es para que la flecha continué al redimensionar la columna, pero e mi caso se mantiene mientras estiro y se borra al soltar.

El sistema es parecido al que mandé en delphi, aunque este no da error. Buscaré por ahí por si alguien ha encontrado la solución, puesto que windows lo hace bien

Saludos y MUCHAS GRACIAS
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

[quote="bosoft"
Supongo que tu última "versión" es para que la flecha continué al redimensionar la columna, pero e mi caso se mantiene mientras estiro y se borra al soltar.[/quote]

Exacto, pero se me olvidó añadirte esta parte para activar la sobrecarga del tratamiento de mensajes del ListView:
Código:

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  LastColumn = 0;
  OldListViewProc = ListView1->WindowProc;
  ListView1->WindowProc = ListViewWindowProc;
}


Ya lo añadí arriba.

Si tengo tiempo lo modifico para compactarlo todo sin necesidad de alterar tanto código en el el formulario.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

PERFECTO.
Muchísimas gracias por tu gran trabajo


Saludos y GRACIAS

EDITO: he añadido a SetSortIcon la alineación según la columna:
Código:
 void SetSortIcon(TListView *ListView, int ColumnIndex, BOOL Ascending)
{
  HANDLE hHeader;
  HD_ITEM HD;
  int Align = ListView->Columns->Items[ColumnIndex]->Alignment; //<---- linea añadida

  hHeader = (HANDLE)SendMessage(ListView->Handle, LVM_GETHEADER, 0, 0);
  for(int i = 0; i < ListView->Columns->Count; i++){
   HD.mask = HDI_FORMAT;
   SendMessage(hHeader, HDM_GETITEM, i, DWORD(&HD));

   if(i == ColumnIndex){
     if(Ascending)
      HD.fmt = (HD.fmt & ~HDF_SORTUP) | HDF_SORTDOWN | Align; // <----- añadido Aling
     else
      HD.fmt = (HD.fmt & ~HDF_SORTDOWN) | HDF_SORTUP | Align; // <----- añadido Aling
   }
   else
     HD.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);

   SendMessage(hHeader, HDM_SETITEM, i, DWORD(&HD));
  }
}



Ahora se pone la flecha alineada
Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

En principio no hace falta añadir esas líneas pues el alíneamiento lo encuentra la línea:
Código:
SendMessage(hHeader, HDM_GETITEM, i, DWORD(&HD));


He escrito una clase para facilitar todo este tema, estoy haciendo pruebas que son muy satisfactorias y simplifican la tarea ya que no hay que escribir la sobrecarga
Código:
void __fastcall TForm1::ListViewWindowProc(TMessage &Msg);

para ningún ListView del formulario ni llevar una variable que indique la última columna pulsada, que es muy engorroso, sobre todo si hay más de un ListView.

Lo publicaré en breve, cuando compruebe que no tiene problemas.


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Esta es la clase que comentaba, basta tener un elemento de la misma para cada ListView que usemos, se inicializa pasando el Handle del ListView, luego en el evento OnColumnClick de los ListView le asignamos el tipo de flechita, arriba o abajo. La clase se encarga de enganchar el bucle de mensajes para evitar el borrado de la flechita al redimensionar la columna.

Admite FullDrag = true para trasladar las columnas de sitio.

Sólo usa la API siendo independiente de la VCL, sirviendo para proyectos API pura.

Es un poco más de código pero mucho menos engorroso su manejo posterior.

Código:

//------------------------------------------------------------------------------
// SortIcon.cpp
// TSortIcon
// escafandra 2015
// Clase para manejo de las flechitas de orden en las cabeceras de las columnas
// de un ListView

#ifndef SortIconCPP
#define SortIconCPP

#include <Windows.h>

#define  HDF_SORTDOWN  0x0200
#define  HDF_SORTUP    0x0400

#define SI_Descendign  0
#define SI_Ascendign   1
#define SI_Erase       3

typedef int (__stdcall *PLRESULT)();

class TSortIcon
{
  private:
  HANDLE hListView;
  HDITEM HDFocus;
  int FocusIndex;
  PLRESULT OldListViewProc;

  static LRESULT __stdcall DefListViewProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
  {
    TSortIcon* pSortIcon = (TSortIcon*)GetWindowLongPtr(hWnd, GWL_USERDATA);
    if(pSortIcon)
      return pSortIcon->ListViewProc(hWnd, Msg, WParam, LParam);
    else return DefWindowProc(hWnd, Msg, WParam, LParam);
  }

  LRESULT __stdcall ListViewProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
  {
    if(Msg == WM_NOTIFY && LParam){
      if(((NMHDR*)(LParam))->code ==  NM_RELEASEDCAPTURE)
        SendMessage(((NMHDR*)(LParam))->hwndFrom, HDM_SETITEM, FocusIndex, DWORD(&HDFocus));
    }
    return CallWindowProc(OldListViewProc, hWnd, Msg, WParam, LParam);
  }

  public:
  void SetSortIcon(DWORD Value)
  {
    int ColumCount;
    int ColumnIndex;
    HANDLE hHeader;
    HD_ITEM HD;
    HDHITTESTINFO HTI;

    GetCursorPos(&(HTI.pt));
    ::ScreenToClient(hListView, &(HTI.pt));

    hHeader = (HANDLE)SendMessage(hListView, LVM_GETHEADER, 0, 0);
    ColumCount  = SendMessage(hHeader, HDM_GETITEMCOUNT, 0, 0);
    ColumnIndex = SendMessage(hHeader, HDM_HITTEST, 0, DWORD(&HTI));
    if(HTI.flags != HHT_ONDIVIDER) FocusIndex = ColumnIndex;

    for(int i = 0; i < ColumCount; i++){
      HD.mask = HDI_FORMAT;
      SendMessage(hHeader, HDM_GETITEM, i, DWORD(&HD));
      if(i == FocusIndex){
        if(Value == SI_Ascendign)
          HD.fmt = (HD.fmt & ~HDF_SORTDOWN) | HDF_SORTUP;
        else if(Value == SI_Descendign)
          HD.fmt = (HD.fmt & ~HDF_SORTUP) | HDF_SORTDOWN;
        HDFocus = HD;
      }
      else
        HD.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);
      SendMessage(hHeader, HDM_SETITEM, i, DWORD(&HD));
    }
  }

  void SetHandle(HANDLE HListView)
  {
    if(hListView || HListView == INVALID_HANDLE_VALUE || !HListView)
    if(hListView){
      SetWindowLong(hListView, GWL_USERDATA, 0);
      SetWindowLong(hListView, GWL_WNDPROC, (LONG)OldListViewProc);
      SetSortIcon(3);
      hListView = 0;
    }
    if(HListView != INVALID_HANDLE_VALUE && HListView){
      hListView = HListView;
      SetWindowLongPtr(hListView, GWL_USERDATA, (LONG)this);
      OldListViewProc = (PLRESULT)SetWindowLongPtr(hListView, GWL_WNDPROC, (LONG)TSortIcon::DefListViewProc);
    }
  }

  ~TSortIcon() {SetHandle(0);}
};
#endif



Ejemplo de uso:
Código:

//---------------------------------------------------------------------------
// SI1 y SI2 son miembros de TForm1
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  SI1.SetHandle(ListView1->Handle);
  SI2.SetHandle(ListView2->Handle);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
      TListColumn *Column)
{
  Column->Tag ^= 1; // Guardamos eun el tag 1 ó 0 para indicar el orden
  SI1.SetSortIcon(Column->Tag);

  // Ordenamos según convenga... esto no está implementado
  TListView(Sender).CustomSort((PFNLVCOMPARE)SortByColumn, Column->Index);
}

void __fastcall TForm1::ListView2ColumnClick(TObject *Sender,
      TListColumn *Column)
{
  Column->Tag ^= 1; // Guardamos eun el tag 1 ó 0 para indicar el orden
  SI2.SetSortIcon(Column->Tag);

  // Ordenamos según convenga... esto no está implementado
  TListView(Sender).CustomSort((PFNLVCOMPARE)SortByColumn, Column->Index);
}


Espero que esto solucione tu problema de forma satisfactoria.


Saludos.


Ultima edición por escafandra el Lun 21 Sep, 2015 2:38 pm, editado 6 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.