Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Перехват изменения размера колонки в TListView

01.01.2007
{ 
 
Question:
 
How do I capture a column resize event in TListView, the OnResize
  only works
when the ListView is changed?
 
 
Answer:
 
The event can be added with a bit of work. See the custom TListview derivative
  below
. It has 3 new events:
 
OnColumnResize, OnBeginColumnResize, OnEndColumnResize
}
 
unit
PBExListview;
 
interface
 
uses
 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 
Dialogs, ComCtrls;
 
type
 
TLVColumnResizeEvent = procedure(Sender: TCustomListview;
    columnindex
: Integer;
    columnwidth
: Integer) of object;
 
TPBExListview = class(TListview)
 
private
   
FBeginColumnResizeEvent: TLVColumnResizeEvent;
   
FEndColumnResizeEvent: TLVColumnResizeEvent;
   
FColumnResizeEvent: TLVColumnResizeEvent;
 
 
protected
    procedure
DoBeginColumnResize(columnindex, columnwidth: Integer);
     
virtual;
    procedure
DoEndColumnResize(columnindex, columnwidth: Integer);
     
virtual;
    procedure
DoColumnResize(columnindex, columnwidth: Integer);
     
virtual;
    procedure
WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
   
function FindColumnIndex(pHeader: pNMHdr): Integer;
   
function FindColumnWidth(pHeader: pNMHdr): Integer;
    procedure
CreateWnd; override;
  published
    property
OnBeginColumnResize: TLVColumnResizeEvent
      read
FBeginColumnResizeEvent write FBeginColumnResizeEvent;
    property
OnEndColumnResize: TLVColumnResizeEvent
      read
FEndColumnResizeEvent write FEndColumnResizeEvent;
    property
OnColumnResize: TLVColumnResizeEvent
      read
FColumnResizeEvent write FColumnResizeEvent;
 
end;
 
procedure
Register;
 
implementation
 
uses
CommCtrl;
 
procedure
Register;
begin
 
RegisterComponents('PBGoodies', [TPBExListview]);
end;
 
procedure
TPBExListview.DoBeginColumnResize(columnindex, columnwidth: Integer);
begin
 
if Assigned(FBeginColumnResizeEvent) then
   
FBeginColumnResizeEvent(Self, columnindex, columnwidth);
end;
 
procedure
TPBExListview.DoEndColumnResize(columnindex, columnwidth: Integer);
begin
 
if Assigned(FEndColumnResizeEvent) then
   
FEndColumnResizeEvent(Self, columnindex, columnwidth);
end;
 
procedure
TPBExListview.DoColumnResize(columnindex, columnwidth: Integer);
begin
 
if Assigned(FColumnResizeEvent) then
   
FColumnResizeEvent(Self, columnindex, columnwidth);
end;
 
function TPBExListview.FindColumnIndex(pHeader: pNMHdr): Integer;
var
  hwndHeader
: HWND;
  iteminfo
: THdItem;
 
ItemIndex: Integer;
  buf
: array [0..128] of Char;
begin
 
Result := -1;
  hwndHeader
:= pHeader^.hwndFrom;
 
ItemIndex := pHDNotify(pHeader)^.Item;
 
FillChar(iteminfo, SizeOf(iteminfo), 0);
  iteminfo
.Mask := HDI_TEXT;
  iteminfo
.pszText := buf;
  iteminfo
.cchTextMax := SizeOf(buf) - 1;
  Header_GetItem
(hwndHeader, ItemIndex, iteminfo);
 
if CompareStr(Columns[ItemIndex].Caption, iteminfo.pszText) = 0 then
   
Result := ItemIndex
 
else
 
begin
   
for ItemIndex := 0 to Columns.Count - 1 do
     
if CompareStr(Columns[ItemIndex].Caption, iteminfo.pszText) = 0 then
     
begin
       
Result := ItemIndex;
       
Break;
     
end;
 
end;
end;
 
procedure
TPBExListview.WMNotify(var Msg: TWMNotify);
begin
  inherited
;
 
case Msg.NMHdr^.code of
    HDN_ENDTRACK
:
     
DoEndColumnResize(FindColumnIndex(Msg.NMHdr),
       
FindColumnWidth(Msg.NMHdr));
    HDN_BEGINTRACK
:
     
DoBeginColumnResize(FindColumnIndex(Msg.NMHdr),
       
FindColumnWidth(Msg.NMHdr));
    HDN_TRACK
:
     
DoColumnResize(FindColumnIndex(Msg.NMHdr),
       
FindColumnWidth(Msg.NMHdr));
 
end;
end;
 
procedure
TPBExListview.CreateWnd;
var
  wnd
: HWND;
begin
  inherited
;
  wnd
:= GetWindow(Handle, GW_CHILD);
 
SetWindowLong(wnd, GWL_STYLE,
   
GetWindowLong(wnd, GWL_STYLE) and not HDS_FULLDRAG);
end;
 
function TPBExListview.FindColumnWidth(pHeader: pNMHdr): Integer;
begin
 
Result := -1;
 
if Assigned(PHDNotify(pHeader)^.pItem) and
   
((PHDNotify(pHeader)^.pItem^.mask and HDI_WIDTH) <> 0) then
   
Result := PHDNotify(pHeader)^.pItem^.cxy;
end;
 
end.
 

https://delphiworld.narod.ru/

DelphiWorld 6.0