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

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

{
 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.

http://delphiworld.narod.ru/ DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...