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 !

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!