-
LVN_COLUMNCLICK is fired by the system only in responce to left mouse click on column header. program Test;
uses
KOL;
procedure ColumnClick(Dummy: Pointer; Sender: PControl; Idx: Integer);
begin
MsgOK(Sender.LVColText[Idx]);
end;
procedure Click1(Dummy: Pointer; Sender: PControl);
begin
if Sender.RightClick then
MsgOK('Click right')
else
MsgOK('Click left');
end;
begin
Applet := NewForm(nil, 'Test');
with NewListView(Applet, lvsDetail, [], nil, nil, nil)^ do
begin
LVColAdd('Col1', taLeft, 80);
LVColAdd('Col2', taLeft, 80);
LVColAdd('Col3', taLeft, 80);
OnColumnClick := TOnLVColumnClick(MakeMethod(nil, @ColumnClick));
OnClick := TOnEvent(MakeMethod(nil, @Click1));
end;
Run(Applet);
end.
-
> LVN_COLUMNCLICK is fired by the system only in > responce to left mouse click on column header.
Understood - thank you very much.
-
You can handle right click on column header by yourself.
uses KOL, Windows, Types;
procedure Click1(Dummy: Pointer; Sender: PControl); var P: TPoint; hChildWnd: HWND; WndClass: string; hdhti: TLVHitTestInfo; begin if Sender.RightClick then begin P := Point(LoWord(GetMessagePos), HiWord(GetMessagePos)); ScreenToClient(Sender.Handle, P); hChildWnd := ChildWindowFromPoint(Sender.Handle, P); if (hChildWnd <> 0) and (hChildWnd <> Sender.Handle) then begin SetLength(WndClass, 80); SetLength(WndClass, GetClassName(hChildWnd, PChar(WndClass), Length(WndClass))); if WndClass = 'SysHeader32' then begin hdhti.pt := P; if SendMessage(hChildWnd, HDM_HITTEST, 1, Longint(@hdhti)) >= 0 then MsgOK('Click right ' + Sender.LVColText[hdhti.iItem]); end; end; end else MsgOK('Click left'); end;
-
что то, видимо народ, не понял что я имел в виду в [98] правая мышь на заголовке вызывает ONCLICK !!! в котором обрабатываются клики по итемам, и событиям от заголовка там делать нечего
-
Вот сюда function WndProcCommonNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
var NMhdr: PNMHdr;
begin
Result := False;
if Msg.message = WM_NOTIFY then
begin
NMHdr := Pointer( Msg.lParam );
case NMHdr.code of
NM_RCLICK,
NM_CLICK:
if assigned( Self_.EV.fOnClick ) then
begin
if NMHdr.code = NM_RCLICK then
include( Self_.fFlagsG6, G6_RightClick )
else exclude( Self_.fFlagsG6, G6_RightClick );
Self_.fRightClick := NMHdr.code=NM_RCLICK;
Self_.EV.fOnClick( Self_ );
end;
NM_KILLFOCUS:
if assigned( Self_.EV.fOnLeave ) then
Self_.EV.fOnLeave( Self_ );
NM_RETURN,
NM_SETFOCUS:
if assigned( Self_.EV.fOnEnter ) then
Self_.EV.fOnEnter( Self_ );
end;
end;
end; приходит сообщение от Windows WM_NOTIFY с кодом NM_CLICK, дальше что?
-
а я почем знаю, левый то почемуто не приходит в onclick,а приходит в ОnColumnClick, значит не в винде дело
-
В том и дело, что от винды как раз и не приходит левый клик. А что приходит, то и отдает код.
-
ну согласитесь не логично, что клик по заголовку идет в клик по итему в той же vcl под онклик подразумеваются именно левые клики а для правого клика по заголовку создается отдельное событие OnColumnRightClick (именно оттуда Ken [102] скопировал код) и никакой путаницы
-
Да, в VCL groupbox вообще в переопределенной процедуре Paint перерисовывался кодом из VCL. Нет, можно добавить какую-нибудь проверку, например, что WM_NOTIFY пришел для самого окна listview. Но я против такого подхода. Еще раз: кому не нравится, свой обработчик WM_NOTIFY навешивается очень просто. Если что-то делается часто, оформляется процедурой. Всяко проще, чем в VCL, где нет возможности без определения наследника легко прицепиться к обработчику. Там есть только SetWindowLong, что простым способом назвать трудно. У нас есть OnMessage, AttachProc(Ex) - доработки со стороны без проблем. Базовая версия должна быть минималистская. Не абсолютно всех интересует, где был клик правой кнопкой мыши.
-
при установленных CenterOnScreen=true и WindowsState=wsMaximized форма при запуске оставляет небольшой зазор сверху, хотя в дальнейшем при переводе в нормальный режим, а затем опять в максимальный режим такого нет. Очень похоже что форма сначала распахивается на весь экран, а потом равняется по центру экрана и присутствие панели задач заставляет образоваться зазор. Походу надо селать наоборот, сначала выровнять по центру экрана, а затем распахнуть.
P.S. Delphi 7, Windows XP, версия библиотеки скачена 21.06.2011
-
Еще одно непонятное поведение ListView. В книге и описаниях компонента сказано, что можно редактировать только одну первую колонку, но вопрос не в этом. При заполнении данными и попытке редактировать первую колонку по окончании ввода данных приложение валится с ошибкой "acсess violation 0x00000000 ...". Однако достаточно сделать обработчик события OnEndEditLVItem (можно туда ничего не вписывать, или что бы не пропал во время компиляции вписать коментарии), как приложение начинает работать как положено без всяких ошибок.
P.S. Delphi 7, Windows XP, версия библиотеки скачена 21.06.2011
-
-
Замечен глюк с Toolbar, при разделении кнопок на группы("-" в Caption свойствах кнопки). После сохранения проекта, закрытия и открытия его повторно, группы востанавливаются неверно, "-" располагается в напротив совсем других кнопок.
-
В Toolbar в свойство Caption надо вставить хотя бы пробелы, что бы после открытия "-" (separator) востановились правильно.
-
При FormCompact=true и наличии на форме ListView, вызов формы валит приложение.
-
Free_And_Nil работает некоректно, не освобождает объекты по крайней мере связанные с интерфейсами (TInterfacedComponent) метод free с последующим := nil норм
-
> Free_And_Nil работает некоректно, не освобождает объектыпо > крайней мере связанные с интерфейсами (TInterfacedComponent)метод > free с последующим := nil норм
Ага, тоже уже довольно давно заметил.
|