Конференция "KOL" » Версия 3.10 [Delphi]
 
  • Vladimir Kladov © (26.05.11 20:27) [100]
    LVN_COLUMNCLICK is fired by the system only in responce to left mouse click on column header.

    program Test;

    uses
     KOL;

     {$I KOLDEF.inc}

    procedure ColumnClick(Dummy: Pointer; Sender: PControl; Idx: Integer);
    begin
    //if Sender.RightClick then
      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.

  • Jon © (26.05.11 21:53) [101]

    > LVN_COLUMNCLICK is fired by the system only in
    > responce to left mouse click on column header.


    Understood - thank you very much.
  • Ken © (27.05.11 11:04) [102]
    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;
  • QAZ (27.05.11 22:47) [103]
    что то, видимо народ, не понял что я имел в виду в [98]
    правая мышь на заголовке вызывает ONCLICK !!! в котором обрабатываются клики по итемам, и событиям от заголовка там делать нечего
  • Vladimir Kladov © (28.05.11 06:00) [104]
    Вот сюда

    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:  {$IFDEF NIL_EVENTS}
                    if assigned( Self_.EV.fOnClick ) then
                    {$ENDIF}
                    begin
                       {$IFDEF USE_FLAGS}
                           if   NMHdr.code = NM_RCLICK then
                                include( Self_.fFlagsG6, G6_RightClick )
                           else exclude( Self_.fFlagsG6, G6_RightClick );
                       {$ELSE} Self_.fRightClick := NMHdr.code=NM_RCLICK; {$ENDIF}
                       Self_.EV.fOnClick( Self_ );
                    end;
         NM_KILLFOCUS: {$IFDEF NIL_EVENTS}
                       if  assigned( Self_.EV.fOnLeave ) then
                       {$ENDIF}
                           Self_.EV.fOnLeave( Self_ );
         NM_RETURN,
         NM_SETFOCUS: {$IFDEF NIL_EVENTS}
                      if  assigned( Self_.EV.fOnEnter ) then
                      {$ENDIF}
                         Self_.EV.fOnEnter( Self_ );
       end;
     end;
    end;



    приходит сообщение от Windows WM_NOTIFY с кодом NM_CLICK, дальше что?
  • QAZ (28.05.11 13:13) [105]
    а я почем знаю, левый то почемуто не приходит в onclick,а приходит в ОnColumnClick, значит не в винде дело
  • Vladimir Kladov © (30.05.11 20:25) [106]
    В том и дело, что от винды как раз и не приходит левый клик. А что приходит, то и отдает код.
  • QAZ (30.05.11 22:58) [107]
    ну согласитесь не логично, что клик по заголовку идет в клик по итему
    в той же vcl под онклик подразумеваются именно левые клики а для правого клика по заголовку создается отдельное событие OnColumnRightClick (именно оттуда Ken [102] скопировал код)
    и никакой путаницы
  • Vladimir Kladov © (31.05.11 16:28) [108]
    Да, в VCL groupbox вообще в переопределенной процедуре Paint перерисовывался кодом из VCL. Нет, можно добавить какую-нибудь проверку, например, что WM_NOTIFY пришел для самого окна listview. Но я против такого подхода. Еще раз: кому не нравится, свой обработчик WM_NOTIFY навешивается очень просто. Если что-то делается часто, оформляется процедурой. Всяко проще, чем в VCL, где нет возможности без определения наследника легко прицепиться к обработчику. Там есть только SetWindowLong,  что простым способом назвать трудно. У нас есть OnMessage, AttachProc(Ex) - доработки со стороны без проблем. Базовая версия должна быть минималистская. Не абсолютно всех интересует, где был клик правой кнопкой мыши.
  • Santa (21.06.11 15:15) [109]
    при установленных CenterOnScreen=true и WindowsState=wsMaximized форма при запуске оставляет небольшой зазор сверху, хотя в дальнейшем при переводе в нормальный режим, а затем опять в максимальный режим такого нет. Очень похоже что форма сначала распахивается на весь экран, а потом равняется по центру экрана и присутствие панели задач заставляет образоваться зазор. Походу надо селать наоборот, сначала выровнять по центру экрана, а затем распахнуть.

    P.S. Delphi 7, Windows XP, версия библиотеки скачена 21.06.2011
  • Santa (23.06.11 13:08) [110]
    Еще одно непонятное поведение ListView. В книге и описаниях компонента сказано, что можно редактировать только одну первую колонку, но вопрос не в этом.
     При заполнении данными и попытке редактировать первую колонку по окончании ввода данных приложение валится с ошибкой "acсess violation 0x00000000 ...". Однако достаточно сделать обработчик события OnEndEditLVItem (можно туда ничего не вписывать, или что бы не пропал во время компиляции вписать коментарии), как приложение начинает работать как положено без всяких ошибок.

    P.S. Delphi 7, Windows XP, версия библиотеки скачена 21.06.2011
  • Thaddy © (24.06.11 22:32) [111]
  • Santa (27.06.11 11:38) [112]
    Замечен глюк с Toolbar, при разделении кнопок на группы("-"  в Caption свойствах кнопки). После сохранения проекта, закрытия и открытия его повторно, группы востанавливаются неверно, "-" располагается в напротив совсем других кнопок.
  • Santa (29.06.11 11:44) [113]
    В Toolbar в свойство Caption надо вставить хотя бы пробелы, что бы после открытия "-" (separator) востановились правильно.
  • Santa (07.07.11 09:25) [114]
    При FormCompact=true и наличии на форме ListView, вызов формы валит приложение.
  • QAZ (23.07.11 17:52) [115]
    Free_And_Nil работает некоректно, не освобождает объекты
    по крайней мере связанные с интерфейсами (TInterfacedComponent)
    метод free с последующим := nil норм
  • AndreyRus © (23.07.11 21:37) [116]

    > Free_And_Nil работает некоректно, не освобождает объектыпо
    > крайней мере связанные с интерфейсами (TInterfacedComponent)метод
    > free с последующим := nil норм


    Ага, тоже уже довольно давно заметил.
 
Конференция "KOL" » Версия 3.10 [Delphi]
Есть новые Нет новых   [134430   +2][b:0.001][p:0.003]