 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Dom 28 Ene, 2007 10:17 am Asunto: Listview con "flechitas" en columnas |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Lun 14 Sep, 2015 7:05 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 15 Sep, 2015 6:53 pm Asunto: |
|
|
| 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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 16 Sep, 2015 11:19 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 17 Sep, 2015 7:16 am Asunto: |
|
|
Muchísimas gracias, escafandra
He estado 2 días fuera y me encuentro con 2 soluciones
Ahora me pongo a probarlas y te cuento
Lo dicho, Gracias
Saludos |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 17 Sep, 2015 7:45 am Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 17 Sep, 2015 1:45 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 17 Sep, 2015 5:41 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 17 Sep, 2015 10:27 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 17 Sep, 2015 11:04 pm Asunto: |
|
|
| 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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 18 Sep, 2015 8:14 am Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 18 Sep, 2015 10:24 am Asunto: |
|
|
[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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 18 Sep, 2015 11:37 am Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 18 Sep, 2015 1:54 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 18 Sep, 2015 10:03 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|