Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Перехват изменения размера колонки в TListView

Разговоp двух новых pусских:
- Я пентиум купил 400 герц!!!
- А что такое 400 геpц?
- ???... скоpость вpащения вентилятоpа!!!


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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay