ColumnWIDTH = GRID_WIDTH_AUTOSIZE

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by andyglezl »

Hola

Estoy tratando de que las columnas de un GRID sean del ancho del contenido,
pero me las deja de un cierto ancho fijo. Si doy doble click en el separador de
la columna, si lo deja bien. Cual sería la forma correcta ?

Lo hago se la siguiente forma.
----------------------------------------------------------------------------------------
I'm trying to get the columns in a GRID are the width of the content,
but I let a certain fixed width. If I double click on the separator
column, if it makes it. What would be the correct way?

I do it is as follows.

Code: Select all

				FOR i1 = 1 TO LEN( aHeaders )
					SetProperty( cForm, "GRID_X", "ColumnWIDTH", i1, GRID_WIDTH_AUTOSIZE )  //  GRID_WIDTH_AUTOSIZEHEADER    <==== Con esto, OK
				NEXT
------------------------------------------------------------------------------------------------

Otro detalle
Attachments
Grid1.jpg
Grid1.jpg (325.81 KiB) Viewed 3550 times
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by andyglezl »

Otro detalle
Estoy queriendo detectar que columnas están "cerradas" para poder
omitirlas al momento de exportar, pero si las cierro manualmente, como
que no altera el ColumnWIDTH. Alguna forma de poder hacerlo ? Gracias
-------------------------------------------------------------------------------------
another detail
I'm wanting to detect which columns are "closed" to
omit when exporting, but if I close manually as
does not alter the columnwidth. Any way to do this? Thanks
--------------------------------------------------------------------------------------

Code: Select all

for count2 := 1 to LEN( linedata)
			IF GETPROPERTY( windowname,gridname,"ColumnWIDTH", count2 ) > 1		//   AGL
			MSGINFO( GETPROPERTY( windowname,gridname,"ColumnWIDTH", count2 ) )
Quiza alguna propiedad HIDE para la columna ?
---------------------------------------------------------
Maybe some HIDE property for the column?

IF GETPROPERTY( windowname,gridname,"ColumnHIDE", count2 ) > .T.
Attachments
Grid2.jpg
Grid2.jpg (351.06 KiB) Viewed 3544 times
Andrés González López
Desde Guadalajara, Jalisco. México.
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by Javier Tovar »

Hola andyglezl,

Con esto vas a poder distribuir tus contenidos en las columnas, pero obviamente tiene que tener espacio suficiente el ancho de la GRID.

Code: Select all

PROCEDURE ReparteEspacios()
LOCAL nCampos := Win_Imprimir.Grid_1.ColumnCOUNT 
LOCAL aArray := {}
LOCAL cDato,cDato1 
LOCAL lDato
LOCAL nDato, nDato1, nDato2, nDato3
LOCAL nSuma := 0
LOCAL nEspacio := 0
LOCAL lReparte := Win_Imprimir.Check_4.VALUE

IF lReparte == .T.
	For n:= 1 To nCampos
		nDato := Win_Imprimir.Grid_1.ColumnWIDTH(n)
		cDato := STR(nDato)
		AAdd(aArray, cDato)
		AAdd(aAnteAnchos,cDato)
	NEXT n

	FOR n:= 1 To Len(aArray)
		nSuma:= nSuma + Val(aArray[n])
	NEXT n

	nEspacio := nAnchoGrid - nSuma

	nEspacio := (nEspacio / Len(aArray))-1

	FOR n:= 1 To Len(aArray)
		nDato := VAL(aArray[n]) + nEspacio
		Win_Imprimir.Grid_1.ColumnWIDTH(n) := nDato
	NEXT n

	Win_Imprimir.Grid_1.Refresh
ELSE
	IF Len(aAnteAnchos) == nCampos
		FOR n:= 1 To Len(aAnteAnchos)
			Win_Imprimir.Grid_1.ColumnWIDTH(n) := VAL(aAnteAnchos[n])
		NEXT n
	ENDIF
ENDIF


Y con esto eliminas las columnas que no quieres exportar: Le pones nada más una condición o varias para que las elimine automáticamente.


RETURN NIL

Code: Select all

 DeleteColumn ( nColIndex )

Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by Javier Tovar »

Javier Tovar wrote:Hola andyglezl,

Con esto vas a poder distribuir tus contenidos en las columnas, pero obviamente tiene que tener espacio suficiente el ancho de la GRID.

Code: Select all

PROCEDURE ReparteEspacios()
LOCAL nCampos := Win_Imprimir.Grid_1.ColumnCOUNT 
LOCAL aArray := {}
LOCAL cDato,cDato1 
LOCAL lDato
LOCAL nDato, nDato1, nDato2, nDato3
LOCAL nSuma := 0
LOCAL nEspacio := 0
LOCAL lReparte := Win_Imprimir.Check_4.VALUE

IF lReparte == .T.
	For n:= 1 To nCampos
		nDato := Win_Imprimir.Grid_1.ColumnWIDTH(n)
		cDato := STR(nDato)
		AAdd(aArray, cDato)
		AAdd(aAnteAnchos,cDato)
	NEXT n

	FOR n:= 1 To Len(aArray)
		nSuma:= nSuma + Val(aArray[n])
	NEXT n

	nEspacio := nAnchoGrid - nSuma

	nEspacio := (nEspacio / Len(aArray))-1

	FOR n:= 1 To Len(aArray)
		nDato := VAL(aArray[n]) + nEspacio
		Win_Imprimir.Grid_1.ColumnWIDTH(n) := nDato
	NEXT n

	Win_Imprimir.Grid_1.Refresh
ELSE
	IF Len(aAnteAnchos) == nCampos
		FOR n:= 1 To Len(aAnteAnchos)
			Win_Imprimir.Grid_1.ColumnWIDTH(n) := VAL(aAnteAnchos[n])
		NEXT n
	ENDIF
ENDIF





RETURN NIL
Y con esto eliminas las columnas que no quieres exportar: Le pones nada más una condición o varias para que las elimine automáticamente.

Code: Select all

 DeleteColumn ( nColIndex )

Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by Javier Tovar »

Hola andyglezl,

El ejemplo anterior es de acuerdo al ancho de la GRID, pero también puedes hacer un barrido para saber al ancho máximo de tus datos por columna y de esa manera le das el ancho exacto a tus columnas!!!

Y la condición que podrias poner para eliminar las columnas que estan "Cerradas" seria algo asi:

Code: Select all

   For n:= 1 To nCampos
      IF Win_Imprimir.Grid_1.ColumnWIDTH(n) < 10
               DeleteColumn ( n)
               n:= n-1
      ENDIF
   NEXT n


Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by Javier Tovar »

Un ejemplo, que seria otra alternativa :)

Code: Select all

/*
* MiniGUI Virtual Grid Demo
* (c) 2009 Roberto Lopez
*/

#include "hmg.ch"

Function Main

Local aValue := { Nil , Nil }

   * Grid Column Controls Definitions

   aCtrl_1 := {'TEXTBOX','NUMERIC','9999999999'}
   aCtrl_2 := {'TEXTBOX','CHARACTER'}
   aCtrl_3 := {'TEXTBOX','CHARACTER'}
   aCtrl_4 := {'DATEPICKER','UPDOWN'}
   aCtrl_5 := { 'CHECKBOX' , 'Yes' , 'No' }
   aCtrl_6 := { 'EDITBOX' }

mat_HEADERS_todos         :={'Column 1','Column 2','Column 3','Column 4','Column 5','Column 6'}
mat_WIDTHS_todos          :={140,140,140,100,100,100}
mat_COLUMNCONTROLS_todos  :={ aCtrl_1 , aCtrl_2 , aCtrl_3 , aCtrl_4 , aCtrl_5 , aCtrl_6 }
mat_COLUMNFIELDS_todos    :={ 'Code' ,  'First' , 'Last' ,  'Birth' , 'Married' , 'Bio' }

mat_HEADERS         := mat_HEADERS_todos
mat_WIDTHS          := mat_WIDTHS_todos
mat_COLUMNCONTROLS  := mat_COLUMNCONTROLS_todos
mat_COLUMNFIELDS    := mat_COLUMNFIELDS_todos


   DEFINE WINDOW Form_1 ;
      AT 0,0 ;
      WIDTH 800 ;
      HEIGHT 510 ;
      TITLE 'Hello World!' ;
      MAIN 

      DEFINE MAIN MENU 
         POPUP 'File'
            ITEM 'Pack'               ACTION Pack()
            ITEM 'Append (Alt+A)'            ACTION Form_1.Grid_1.Append
            ITEM 'Set RecNo'            ACTION Form_1.Grid_1.RecNo := val(InputBox('','')) 
            ITEM 'Get RecNo'            ACTION MsgInfo( Str(Form_1.Grid_1.RecNo) )
            ITEM 'Delete (Alt+D)'            ACTION Form_1.Grid_1.Delete
            ITEM 'Recall (Alt+R)'            ACTION Form_1.Grid_1.Recall
            ITEM 'Get Value'            ACTION ( aValue := Form_1.Grid_1.Value , MsgInfo( Str( aValue [1] ) + ' , ' + Str( aValue [2] ) ) )
            ITEM 'Set Value'            ACTION ( aValue [ 1 ] :=  val(InputBox('New Row','Selected Cell (Value)')) , aValue [ 2 ] :=  val(InputBox('New Col','Selected Cell (Value)')) , Form_1.Grid_1.Value := { aValue [ 1 ] , aValue [ 2 ] } )
            ITEM 'Save Pending Changes (Alt+S)'      ACTION Form_1.Grid_1.Save
            ITEM 'Clear Changes Buffer (Undo) (ALt+U)'   ACTION Form_1.Grid_1.ClearBuffer
         END POPUP
         
         POPUP 'FIELDS'
             ITEM 'Ver Todos'            ACTION cambiar_field (1)
             ITEM 'Ver FIELDS 1, 2 y 3'  ACTION cambiar_field (2)
             ITEM 'Ver FIELDS 4, 5 y 6'  ACTION cambiar_field (3)
         END POPUP    
      END MENU

      USE TEST // SHARED

      INDEX ON CODE TO CODE

      *PACK

      GO TOP

      @ 10,10 GRID Grid_1 ;
         WIDTH 770 ;
         HEIGHT 440 ;
         HEADERS mat_HEADERS;
         WIDTHS  mat_WIDTHS;
         EDIT ;
         VALUE { 1 , 1 } ;
         COLUMNCONTROLS mat_COLUMNCONTROLS;
         ROWSOURCE "Test" ;
         COLUMNFIELDS mat_COLUMNFIELDS;
         ALLOWAPPEND ;
         ALLOWDELETE 
      
   END WINDOW

   CENTER WINDOW Form_1

   ACTIVATE WINDOW Form_1

Return

Function pack
   pack
   Form_1.Grid_1.Refresh
Return



procedure cambiar_field (n)
   mat_HEADERS         := {}
   mat_WIDTHS          := {}
   mat_COLUMNCONTROLS  := {}
   mat_COLUMNFIELDS    := {}

   do case
      case n = 1
        mat_HEADERS         := mat_HEADERS_todos
        mat_WIDTHS          := mat_WIDTHS_todos
        mat_COLUMNCONTROLS  := mat_COLUMNCONTROLS_todos
        mat_COLUMNFIELDS    := mat_COLUMNFIELDS_todos
      case n = 2
           for i = 1 to 3             
               aadd (mat_HEADERS, mat_HEADERS_todos [i])
               aadd (mat_WIDTHS,  mat_WIDTHS_todos [i])
               aadd (mat_COLUMNCONTROLS, mat_COLUMNCONTROLS_todos [i])
               aadd (mat_COLUMNFIELDS, mat_COLUMNFIELDS_todos[i])
           next
      case n = 3
           for i = 4 to 6                           
               aadd (mat_HEADERS, mat_HEADERS_todos [i])
               aadd (mat_WIDTHS,  mat_WIDTHS_todos [i])
               aadd (mat_COLUMNCONTROLS, mat_COLUMNCONTROLS_todos [i])
               aadd (mat_COLUMNFIELDS, mat_COLUMNFIELDS_todos[i])
           next
    endcase

    reg := 1
    IF IsControlDefined ( Grid_1 , Form_1 ) 
        reg := Form_1.Grid_1.recno 
        Form_1.Grid_1.Release
    ENDIF
    
    @ 10,10 GRID Grid_1 OF Form_1;
         WIDTH 770 ;
         HEIGHT 440 ;
         HEADERS mat_HEADERS;
         WIDTHS  mat_WIDTHS;
         EDIT ;
         VALUE { reg , 1 } ;
         COLUMNCONTROLS mat_COLUMNCONTROLS;
         ROWSOURCE "Test" ;
         COLUMNFIELDS mat_COLUMNFIELDS;
         ALLOWAPPEND ;
         ALLOWDELETE 
            
return
Saludos
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by andyglezl »

Muchas gracias Javier

Creo que en algún momento utilizaré parte de tu código.

Mi intención es utilizar las Propiedades y Eventos que tiene el Control GRID
( para evitar codificar de mas) y saber si estoy mal o es un BUG.

Por ejemplo, si en el GRID cierro algunas columnas, con eso me doy cuenta
para no exportarlas o imprimirlas. Pero parece que al cerrarlas manualmente
no altera la propiedad ColumnWIDTH.
-----------------------------------------------------------------------------------------
Thank you very much Javier

I think at some point will use some of your code.

My intention is to use the Properties and Events that has the GRID Control
(To avoid more coding) and whether I'm wrong or is a BUG.

For example, if I close the GRID some columns, with that I realize
not export or print. But it seems to close them manually columnwidth not alter the property.
Andrés González López
Desde Guadalajara, Jalisco. México.
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by Javier Tovar »

Hola andyglezl,
( para evitar codificar de mas)
Si, a veces quisiéramos que estuvieran todas las soluciones en los controles sin poner un código extra, ni tres lineas, pero en varios lenguajes que he visto, ninguno hace todo, lo demás hay que hacerlo a mano!, mientras no haya otra alternativa. :shock:

Si no esta en HMG.3.3.1 AUN NO EXISTE!!! :shock:

Saludos
User avatar
Clip2Mania
Posts: 99
Joined: Fri Jun 13, 2014 7:16 am
Location: Belgium

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by Clip2Mania »

I'm trying to get the columns in a GRID are the width of the content,
but I let a certain fixed width. If I double click on the separator
column, if it makes it. What would be the correct way?

I do it is as follows.

Code: Select all

	
            FOR i1 = 1 TO LEN( aHeaders )
               SetProperty( cForm, "GRID_X", "ColumnWIDTH", i1, GRID_WIDTH_AUTOSIZE )  //  GRID_WIDTH_AUTOSIZEHEADER    <==== Con esto, OK
            NEXT
Tried to do this in a BROWSE (although nowhere documented), and it works quite well..

Code: Select all

local k, nHwnd := GetControlHandle("Browse_1","Form")
for k:=0 to len(aWidths)-1
  LISTVIEW_SETCOLUMNWIDTH(nHwnd,k,GRID_WIDTH_AUTOSIZE )  
next
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: ColumnWIDTH = GRID_WIDTH_AUTOSIZE

Post by andyglezl »

Gracias Clip2Mania

Ya lo solucioné manualmente (pero siempre es bueno conocer mas)
Esta es la imagen que le mostré al usuario para explicarle su uso.
(lo siento, pero esta desarrollado en español)
----------------------------------------------------------------------------
Thanks Clip2Mania

Already solved manually (but it's always good to know more)
This is the picture that I showed to the user to explain their use.
(sorry, but this developed in Spanish)
Attachments
Grid-Search-Edit2.jpg
Grid-Search-Edit2.jpg (453.59 KiB) Viewed 3381 times
Andrés González López
Desde Guadalajara, Jalisco. México.
Post Reply