Menu

[r3207]: / trunk / Src / 3rdParty / LVEx.pas  Maximize  Restore  History

Download this file

126 lines (109 with data), 3.7 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
{*******************************************************}
{ }
{ TListViewEx Version 1.0 }
{ }
{ Copyright (c) 1999-2009 Vadim Crits }
{ }
{*******************************************************}
unit LVEx;
interface
uses
Windows, Messages, Classes, CommCtrl, ComCtrls;
type
TSortOrder = (soNone, soUp, soDown);
TListViewEx = class(TListView)
private
FHeaderHandle: HWND;
FSortColumn: Integer;
FSortOrder: TSortOrder;
FSortImmediately: Boolean;
procedure UpdateColumn(Index: Integer);
procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
procedure LVMDeleteColumn(var Message: TMessage); message LVM_DELETECOLUMN;
procedure LVMSetItemText(var Message: TMessage); message LVM_SETITEMTEXT;
public
constructor Create(AOwner: TComponent); override;
property SortColumn: Integer read FSortColumn default -1;
property SortOrder: TSortOrder read FSortOrder default soNone;
property SortImmediately: Boolean read FSortImmediately write
FSortImmediately default True;
end;
procedure Register;
implementation
{$R LVEx.res}
procedure Register;
begin
RegisterComponents('Win32', [TListViewEx]);
end;
constructor TListViewEx.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSortColumn := -1;
FSortOrder := soNone;
FSortImmediately := True;
end;
procedure TListViewEx.UpdateColumn(Index: Integer);
const
HDF_SORTUP = $0400;
HDF_SORTDOWN = $0200;
SortOrder: array[TSortOrder] of Word = (0, HDF_SORTUP, HDF_SORTDOWN);
var
Item: THDItem;
begin
FillChar(Item, SizeOf(THDItem), 0);
Item.Mask := HDI_FORMAT;
if (FSortColumn <> -1) and (FSortColumn <> Index) then
begin
Header_GetItem(FHeaderHandle, FSortColumn, Item);
Item.fmt := Item.fmt and not (HDF_SORTDOWN or HDF_SORTUP);
Header_SetItem(FHeaderHandle, FSortColumn, Item);
end;
Header_GetItem(FHeaderHandle, Index, Item);
if (FSortColumn <> -1) and (FSortColumn = Index) then
Item.fmt := Item.fmt and not (HDF_SORTDOWN or HDF_SORTUP);
Item.fmt := Item.fmt or SortOrder[FSortOrder];
Header_SetItem(FHeaderHandle, Index, Item);
end;
procedure TListViewEx.WMNotify(var Message: TWMNotify);
begin
inherited;
FHeaderHandle := ListView_GetHeader(Handle);
if (FHeaderHandle <> 0) and (Message.NMHdr^.hWndFrom = FHeaderHandle) then
with Message, NMHdr^, PHDNotify(Pointer(NMHdr))^ do
case code of
HDN_ITEMCLICK:
begin
if (FSortColumn = Item) and (FSortOrder = soUp) then
FSortOrder := soDown
else
FSortOrder := soUp;
UpdateColumn(Item);
FSortColumn := Item;
CustomSort(nil, FSortColumn - 1);
end;
HDN_ITEMCHANGED:
if (FSortColumn <> -1) and (FSortColumn = Item) and
(PItem^.Mask and HDI_TEXT <> 0) then
UpdateColumn(Item);
end;
end;
procedure TListViewEx.LVMDeleteColumn(var Message: TMessage);
begin
inherited;
if Message.WParam = FSortColumn then
begin
FSortColumn := -1;
FSortOrder := soNone;
end;
end;
procedure TListViewEx.LVMSetItemText(var Message: TMessage);
begin
inherited;
if not (csDesigning in ComponentState) and
FSortImmediately and (FSortColumn <> -1) then
with PLVItem(Message.LParam)^ do
if (FSortColumn = iSubItem) and
((iSubItem = 0) or (stateMask and LVIS_FOCUSED = 0)) then
CustomSort(nil, FSortColumn - 1);
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.