Page 1 of 1

Grid column width

Posted: Fri Dec 18, 2009 8:02 am
by karweru
Hi friends,

If you resize the column width of a grid using the mouse at runtime, is there a way of trapping this resizing event and calculating the new column width?
Kindly assist.

Grid column width

Posted: Sun Nov 13, 2016 10:46 am
by Pablo César
This would be marvel to get this information during the resize of width columns.

Re: Grid column width

Posted: Sun Nov 13, 2016 11:27 am
by Rathinagiri
It is doable. I have first done that in GridPlus utility. I have removed it in the finished library. I will share the code though.

Re: Grid column width

Posted: Sun Nov 13, 2016 8:05 pm
by KDJ
Pablo César wrote:This would be marvel to get this information during resing of width columns.
Pablo, here is the marvel:

Code: Select all

//Try to change column width by dragging a divider in the header

#include "hmg.ch"

FUNCTION Main()

  DEFINE WINDOW Main_WA;
    MAIN;
    WIDTH  450;
    HEIGHT 235;
    TITLE  'Grid Columns Width - see in StatusBar'

    DEFINE GRID Users_GR
      ROW             10
      COL             10
      WIDTH          420
      HEIGHT         120
      WIDTHS         {130, 140, 70}
      ITEMS          {{'John', 'Brown', '37'}, {'Peter', 'Green', '29'}, {'Eric', 'Pink', '45'}}
      JUSTIFY        {GRID_JTFY_LEFT, GRID_JTFY_LEFT, GRID_JTFY_RIGHT}
      CELLNAVIGATION .F.
    END GRID

    DEFINE BUTTON SetText_BU
      ROW      140
      COL      160
      WIDTH    130
      HEIGHT    25
      CAPTION 'Change header text'
      ACTION   SetHeaderText()
    END BUTTON
  
    DEFINE STATUSBAR
      STATUSITEM ''
      STATUSITEM '' WIDTH 140
      STATUSITEM '' WIDTH 170
    END STATUSBAR
  END WINDOW

  SetHeaderText()
  UpdateStatus()
  Main_WA.Users_GR.VALUE := 1
  Main_WA.CENTER

  InstallEventHandler('EventHandler')

  Main_WA.ACTIVATE

RETURN NIL

FUNCTION UpdateStatus()

  Main_WA.STATUSBAR.Item(1) := LTrim(Str(Main_WA.Users_GR.ColumnWIDTH(1))) + '  (range 50 - 150)'
  Main_WA.STATUSBAR.Item(2) := LTrim(Str(Main_WA.Users_GR.ColumnWIDTH(2))) + '  (range 90 - 200)'
  Main_WA.STATUSBAR.Item(3) := LTrim(Str(Main_WA.Users_GR.ColumnWIDTH(3))) + '  (range 30 - 90)'

RETURN NIL

FUNCTION EventHandler(nHWnd, nMsg, nWParam, nLParam)
  LOCAL nNotiCode
  LOCAL nCX
  LOCAL nItem

  IF nMsg == 78 //WM_NOTIFY
    IF GetHWNDFrom(nLParam) == ListView_GetHeader(Main_WA.Users_GR.HANDLE)
      nNotiCode := GetNotifyCode(nLParam)

      // https://thomasfreudenberg.com/archive/2004/03/14/hdn-track-and-hds-fulldrag
      // No HDN_TRACK is sent if HDS_FULLDRAG style is set
      // So we will check HDN_ITEMCHANGING and HDN_ITEMCHANGED
      //IF nNotiCode == -328 //HDN_TRACKW
      IF nNotiCode == -320 //HDN_ITEMCHANGINGW
        nCX := GetHeaderItemCX(nLParam)

        IF nCX >= 0
          nItem := GetHeaderItem(nLParam) + 1

          IF nItem == 1
            IF nCX < 50
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 50
              RETURN 1
            ELSEIF nCX > 150
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 150
              RETURN 1
            ENDIF
          ELSEIF nItem == 2
            IF nCX < 90
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 90
              RETURN 1
            ELSEIF nCX > 200
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 200
              RETURN 1
            ENDIF
          ELSEIF nItem == 3
            IF nCX < 30
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 30
              RETURN 1
            ELSEIF nCX > 90
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 90
              RETURN 1
            ENDIF
          ENDIF
        ENDIF
      ELSEIF nNotiCode == -321 //HDN_ITEMCHANGEDW
        UpdateStatus()
      ENDIF
    ENDIF

  ELSEIF nMsg == 273 //WM_COMMAND
    IF LoWord(nWParam) == 2 /*IDCANCEL*/
      Main_WA.RELEASE
    ENDIF
  ENDIF

RETURN NIL

FUNCTION SetHeaderText()
  STATIC nType := 0

  IF nType == 0
    Main_WA.Users_GR.Header(1) := 'First name'
    Main_WA.Users_GR.Header(2) := 'Last name'
    Main_WA.Users_GR.Header(3) := 'Age'
    nType := 1
  ELSE
    Main_WA.Users_GR.Header(1) := 'Column 1'
    Main_WA.Users_GR.Header(2) := 'Column 2'
    Main_WA.Users_GR.Header(3) := 'Column 3'
    nType := 0
  ENDIF

RETURN NIL

#pragma BEGINDUMP

  #include "SET_COMPILE_HMG_UNICODE.ch"
  #include "HMG_UNICODE.h"
  #include <windows.h>
  #include <commctrl.h>
  #include "hbapi.h"

          //GetHeaderItem(nLParam)
  HB_FUNC ( GETHEADERITEM )
  {
    LPNMHEADER lpnmheader = (LPNMHEADER) HMG_parnl(1);
    hb_retni(lpnmheader->iItem);
  }

          //GetHeaderItemCX(nLParam)
  HB_FUNC ( GETHEADERITEMCX )
  {
    LPNMHEADER lpnmheader = (LPNMHEADER) HMG_parnl(1);

    if (lpnmheader->pitem->mask == HDI_WIDTH)
      hb_retni(lpnmheader->pitem->cxy);
    else
      hb_retni(-1);
  }

#pragma ENDDUMP

Grid column width

Posted: Sun Nov 13, 2016 8:13 pm
by Pablo César
Thank you man ! Very cool !

Image

Re: Grid column width

Posted: Mon Nov 14, 2016 12:26 am
by srvet_claudio
KDJ wrote:
Pablo César wrote:This would be marvel to get this information during resing of width columns.
Pablo, here is the marvel:

Code: Select all

//Try to change column width by dragging a divider in the header

#include "hmg.ch"

FUNCTION Main()

  DEFINE WINDOW Main_WA;
    MAIN;
    WIDTH  450;
    HEIGHT 235;
    TITLE  'Grid Columns Width - see in StatusBar'

    DEFINE GRID Users_GR
      ROW             10
      COL             10
      WIDTH          420
      HEIGHT         120
      WIDTHS         {130, 140, 70}
      ITEMS          {{'John', 'Brown', '37'}, {'Peter', 'Green', '29'}, {'Eric', 'Pink', '45'}}
      JUSTIFY        {GRID_JTFY_LEFT, GRID_JTFY_LEFT, GRID_JTFY_RIGHT}
      CELLNAVIGATION .F.
    END GRID

    DEFINE BUTTON SetText_BU
      ROW      140
      COL      160
      WIDTH    130
      HEIGHT    25
      CAPTION 'Change header text'
      ACTION   SetHeaderText()
    END BUTTON
  
    DEFINE STATUSBAR
      STATUSITEM ''
      STATUSITEM '' WIDTH 140
      STATUSITEM '' WIDTH 170
    END STATUSBAR
  END WINDOW

  SetHeaderText()
  UpdateStatus()
  Main_WA.Users_GR.VALUE := 1
  Main_WA.CENTER

  InstallEventHandler('EventHandler')

  Main_WA.ACTIVATE

RETURN NIL

FUNCTION UpdateStatus()

  Main_WA.STATUSBAR.Item(1) := LTrim(Str(Main_WA.Users_GR.ColumnWIDTH(1))) + '  (range 50 - 150)'
  Main_WA.STATUSBAR.Item(2) := LTrim(Str(Main_WA.Users_GR.ColumnWIDTH(2))) + '  (range 90 - 200)'
  Main_WA.STATUSBAR.Item(3) := LTrim(Str(Main_WA.Users_GR.ColumnWIDTH(3))) + '  (range 30 - 90)'

RETURN NIL

FUNCTION EventHandler(nHWnd, nMsg, nWParam, nLParam)
  LOCAL nNotiCode
  LOCAL nCX
  LOCAL nItem

  IF nMsg == 78 //WM_NOTIFY
    IF GetHWNDFrom(nLParam) == ListView_GetHeader(Main_WA.Users_GR.HANDLE)
      nNotiCode := GetNotifyCode(nLParam)

      // https://thomasfreudenberg.com/archive/2004/03/14/hdn-track-and-hds-fulldrag
      // No HDN_TRACK is sent if HDS_FULLDRAG style is set
      // So we will check HDN_ITEMCHANGING and HDN_ITEMCHANGED
      //IF nNotiCode == -328 //HDN_TRACKW
      IF nNotiCode == -320 //HDN_ITEMCHANGINGW
        nCX := GetHeaderItemCX(nLParam)

        IF nCX >= 0
          nItem := GetHeaderItem(nLParam) + 1

          IF nItem == 1
            IF nCX < 50
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 50
              RETURN 1
            ELSEIF nCX > 150
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 150
              RETURN 1
            ENDIF
          ELSEIF nItem == 2
            IF nCX < 90
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 90
              RETURN 1
            ELSEIF nCX > 200
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 200
              RETURN 1
            ENDIF
          ELSEIF nItem == 3
            IF nCX < 30
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 30
              RETURN 1
            ELSEIF nCX > 90
              Main_WA.Users_GR.ColumnWIDTH(nItem) := 90
              RETURN 1
            ENDIF
          ENDIF
        ENDIF
      ELSEIF nNotiCode == -321 //HDN_ITEMCHANGEDW
        UpdateStatus()
      ENDIF
    ENDIF

  ELSEIF nMsg == 273 //WM_COMMAND
    IF LoWord(nWParam) == 2 /*IDCANCEL*/
      Main_WA.RELEASE
    ENDIF
  ENDIF

RETURN NIL

FUNCTION SetHeaderText()
  STATIC nType := 0

  IF nType == 0
    Main_WA.Users_GR.Header(1) := 'First name'
    Main_WA.Users_GR.Header(2) := 'Last name'
    Main_WA.Users_GR.Header(3) := 'Age'
    nType := 1
  ELSE
    Main_WA.Users_GR.Header(1) := 'Column 1'
    Main_WA.Users_GR.Header(2) := 'Column 2'
    Main_WA.Users_GR.Header(3) := 'Column 3'
    nType := 0
  ENDIF

RETURN NIL

#pragma BEGINDUMP

  #include "SET_COMPILE_HMG_UNICODE.ch"
  #include "HMG_UNICODE.h"
  #include <windows.h>
  #include <commctrl.h>
  #include "hbapi.h"

          //GetHeaderItem(nLParam)
  HB_FUNC ( GETHEADERITEM )
  {
    LPNMHEADER lpnmheader = (LPNMHEADER) HMG_parnl(1);
    hb_retni(lpnmheader->iItem);
  }

          //GetHeaderItemCX(nLParam)
  HB_FUNC ( GETHEADERITEMCX )
  {
    LPNMHEADER lpnmheader = (LPNMHEADER) HMG_parnl(1);

    if (lpnmheader->pitem->mask == HDI_WIDTH)
      hb_retni(lpnmheader->pitem->cxy);
    else
      hb_retni(-1);
  }

#pragma ENDDUMP
I have not test the code but it looks good, very good!

Re: Grid column width

Posted: Mon Nov 14, 2016 1:08 am
by danielmaximiliano
Claudio : solo falto redimensionar la ventana ya que al agrandar las columnas a su maximo tamaño se crea el Slicer y se pierde contacto visual con la colunma edad .... (se puede corregir?)

Re: Grid column width

Posted: Mon Nov 14, 2016 1:23 am
by srvet_claudio
danielmaximiliano wrote:Claudio : solo falto redimensionar la ventana ya que al agrandar las columnas a su maximo tamaño se crea el Slicer y se pierde contacto visual con la colunma edad .... (se puede corregir?)
Daniel, ni bien tenga tiempo voy a chequear el código.

Re: Grid column width

Posted: Mon Nov 14, 2016 6:38 am
by mol
Nice work, thanks!