Grid column width

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
User avatar
karweru
Posts: 220
Joined: Fri Aug 01, 2008 1:51 pm
DBs Used: DBF,mysql,mariadb,postgresql,sqlite,odbc
Contact:

Grid column width

Post 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.
Kind regards,
Gilbert.
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Grid column width

Post by Pablo César »

This would be marvel to get this information during the resize of width columns.
Last edited by Pablo César on Mon Nov 14, 2016 9:24 am, edited 1 time in total.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
Rathinagiri
Posts: 5482
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Contact:

Re: Grid column width

Post 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.
East or West HMG is the Best.
South or North HMG is worth.
...the possibilities are endless.
KDJ
Posts: 243
Joined: Mon Sep 05, 2016 3:04 am
Location: Poland

Re: Grid column width

Post 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
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Grid column width

Post by Pablo César »

Thank you man ! Very cool !

Image
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
srvet_claudio
Posts: 2224
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: Grid column width

Post 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!
Best regards.
Dr. Claudio Soto
(from Uruguay)
https://srvet.blogspot.com
User avatar
danielmaximiliano
Posts: 2716
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Grid column width

Post 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?)
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
srvet_claudio
Posts: 2224
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: Grid column width

Post 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.
Best regards.
Dr. Claudio Soto
(from Uruguay)
https://srvet.blogspot.com
Post Reply