Разгово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;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls;
type
TLVColumnResizeEvent = procedure(Sender: TCustomListview;
columnindex: Integer;
columnwidth: Integer) ofobject;
TPBExListview = class(TListview)
private
FBeginColumnResizeEvent: TLVColumnResizeEvent;
FEndColumnResizeEvent: TLVColumnResizeEvent;
FColumnResizeEvent: TLVColumnResizeEvent;
protectedprocedure 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;
publishedproperty OnBeginColumnResize: TLVColumnResizeEvent
read FBeginColumnResizeEvent write FBeginColumnResizeEvent;
property OnEndColumnResize: TLVColumnResizeEvent
read FEndColumnResizeEvent write FEndColumnResizeEvent;
property OnColumnResize: TLVColumnResizeEvent
read FColumnResizeEvent write FColumnResizeEvent;
end;
procedureRegister;
implementationuses CommCtrl;
procedureRegister;
begin
RegisterComponents('PBGoodies', [TPBExListview]);
end;
procedure TPBExListview.DoBeginColumnResize(columnindex, columnwidth: Integer);
beginif Assigned(FBeginColumnResizeEvent) then
FBeginColumnResizeEvent(Self, columnindex, columnwidth);
end;
procedure TPBExListview.DoEndColumnResize(columnindex, columnwidth: Integer);
beginif Assigned(FEndColumnResizeEvent) then
FEndColumnResizeEvent(Self, columnindex, columnwidth);
end;
procedure TPBExListview.DoColumnResize(columnindex, columnwidth: Integer);
beginif 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
elsebeginfor ItemIndex := 0 to Columns.Count - 1 doif CompareStr(Columns[ItemIndex].Caption, iteminfo.pszText) = 0 thenbegin
Result := ItemIndex;
Break;
end;
end;
end;
procedure TPBExListview.WMNotify(var Msg: TWMNotify);
begininherited;
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;
begininherited;
wnd := GetWindow(Handle, GW_CHILD);
SetWindowLong(wnd, GWL_STYLE,
GetWindowLong(wnd, GWL_STYLE) andnot 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.
Программный код создает пользовательский компонент TPBExListview, который расширяет стандартный контроллер TListView в Delphi. Новый компонент имеет три события: OnBeginColumnResize, OnEndColumnResize и OnColumnResize. Эти события вызываются, когда пользователь изменяет ширину столбца.
Ключевая часть кода - это переопределение обработчика сообщения WMNotify, где он проверяет конкретные уведомления, отправленные контроллером списка (константы HDN_...), и вызывает соответствующие обработчики событий.
Разбор кода:
Класс TPBExListview наследуется от TListView.
У него есть три приватных поля для хранения обработчиков событий: FBeginColumnResizeEvent, FEndColumnResizeEvent и FColumnResizeEvent.
У него есть три защищенных метода: DoBeginColumnResize, DoEndColumnResize и DoColumnResize. Эти методы виртуальные, поэтому могут быть переопределены производными классами.
Обработчик сообщения WMNotify переопределяется для обработки конкретных уведомлений, отправленных контроллером списка. Когда происходит событие изменения ширины столбца (HDN_...), он вызывает соответствующие обработчики событий.
Методы FindColumnIndex и FindColumnWidth используются для поиска индекса столбца, который изменяется, и его новой ширины соответственно.
Чтобы использовать этот пользовательский компонент, вам нужно создать экземпляр TPBExListview на вашей форме, настроить столбцы, какNeeded, иthen присвоить обработчики событий для событий OnBeginColumnResize, OnEndColumnResize и OnColumnResize. Например:
procedureTForm1.TPBExListview1ColumnResize(Sender:TObject;ColumnIndex:Integer;ColumnWidth:Integer);begin// Код для обработки события изменения ширины столбцаend;procedureTForm1.TPBExListview1BeginColumnResize(Sender:TObject;ColumnIndex:Integer;ColumnWidth:Integer);begin// Код для обработки начала изменения ширины столбцаend;procedureTForm1.TPBExListview1EndColumnResize(Sender:TObject;ColumnIndex:Integer;ColumnWidth:Integer);begin// Код для обработки конца изменения ширины столбцаend;
Обратите внимание, что события вызываются, когда пользователь начинает и заканчивает изменять ширину столбца, а также когда операция изменения ширины столбца завершается.
Перехват изменения размера колонки в TListView можно осуществить с помощью custom-деривата TListview, который имеет три новых события: OnColumnResize, OnBeginColumnResize и OnEndColumnResize.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.