ON Grid.Header.Click DO MyRutina

190 views
Skip to first unread message

pedro olivares

unread,
Mar 7, 2012, 2:33:27 PM3/7/12
to Comunidad de Visual Foxpro en Español
Sadudos primero a todos los Foxeros y mi pegunta es la siguiente...

Tengo una rutina que quiero que se ejecute en cada Header de los Grids
que utilizo, en específico, una rutina que me ordena (ascendente o
descendente).

Lo que no quiero es tener que poner en todos los Header el código a
donde tiene que ir.

Por ejemplo:

En todos los Clic de los header de las columnas del grid tengo que
poner:

thisform.Ordenar()

Se puede hacer esto con solo una sentencia? Claro que se puede, pero
como?

Saludos.

Luis Maria Guayan

unread,
Mar 7, 2012, 2:42:46 PM3/7/12
to publice...@googlegroups.com
Mira este artículo:

--
Como ordenar un Grid haciendo clic en cada columna --
http://www.portalfox.com/article.php?sid=2728


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

pedro olivares

unread,
Mar 7, 2012, 8:11:42 PM3/7/12
to Comunidad de Visual Foxpro en Español
Luis Maria antes que nada gracias por tu repuesta y el artículo de
ejemplo, está excelente. El problema que tengo es que es para un
proyecto que llevo haciendo desde hace tiempo y ya tengo todas las
vistas de los datos y formularios hechos; y por lo que veo en tu
artículo es para generar un grid programáticamente y aplicar el
ordenamiento desde ahí.

A ver si me explico...

Todos los grids que uso son de una clase grid que tengo en una
libreria y en casi todos los formularios inserto mi grid ya creado en
estos formularios.

Ahora bien, tu apuntas que...

"Las clases que no podemos almacenar en una librería de clases
visuales, y la debemos definir programáticamente son las clases
MyColumnOrd y MyHeaderOrd, y es allí donde definimos los métodos de
ordenamiento con el clic en el Header de cada columna, y la imagen
correspondiente para cada Header."

Donde defino las 2 clases? En el clic de cada header de las columnas
de los grid?

Gracias por tu atención,

Pedro Olivares.



On 7 mar, 15:42, Luis Maria Guayan <luismar...@gmail.com> wrote:
> Mira este artículo:
> --Como ordenar un Grid haciendo clic en cada columna --http://www.portalfox.com/article.php?sid=2728
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com

Luis Maria Guayan

unread,
Mar 7, 2012, 8:59:20 PM3/7/12
to publice...@googlegroups.com
Yo también tengo mi clase MyGrid y mi clase MyGridOrd (derivada de MyGrid)

Las clases MyColumnOrd y MyHeaderOrd las tengo definidas en mi archivo de procedimientos generales, y en todas mis aplicaciones tengo la linea:

SET PROCEDURE MyLibGral ADDITIVE


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________


pedro olivares

unread,
Mar 8, 2012, 6:37:47 AM3/8/12
to Comunidad de Visual Foxpro en Español
Grácias Luis,

Ya entiendo mejor. Pero mi pregunta sigue en el aire...

Como este proceso de hacer click en cualquier header es igual para
todos (con un solo parámetro que le pasemos es suficiente),
mi idea es que VFP atrape la acción antes de ir al método y ejecutarla
desde una línea solamente, para todos los headers del grid.

Lo que se me está ocurriendo es usar BLINDEVENTS, y es lo que estoy
tratando de aprender a ver si logro dar con mi idea.

Gracias de nuevo,

Pedro.

On 7 mar, 21:59, Luis Maria Guayan <luismar...@gmail.com> wrote:
> Yo también tengo mi clase MyGridy mi clase MyGridOrd (derivada de MyGrid)
> Las clases MyColumnOrd y MyHeaderOrd las tengo definidas en mi archivo de procedimientos generales, y en todas mis aplicaciones tengo la linea:
> SET PROCEDURE MyLibGral ADDITIVE
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com
> Nada corre como un zorro
> _________________________
> El 07/03/2012 22:11, pedro olivares escribió:Luis Maria antes que nada gracias por tu repuesta y el artículo de ejemplo, está excelente. El problema que tengo es que es para un proyecto que llevo haciendo desde hace tiempo y ya tengo todas las vistas de los datos y formularios hechos; y por lo que veo en tu artículo es para generar un grid programáticamente y aplicar el ordenamiento desde ahí. A ver si me explico... Todos los grids que uso son de una clase grid que tengo en una libreria y en casi todos los formularios inserto mi grid ya creado en estos formularios. Ahora bien, tu apuntas que... "Las clases que no podemos almacenar en una librería de clases visuales, y la debemos definir programáticamente son las clases MyColumnOrd y MyHeaderOrd, y es allí donde definimos los métodos de ordenamiento con el clic en el Header de cada columna, y la imagen correspondiente para cada Header." Donde defino las 2 clases? En el clic de cada header de las columnas de los grid? Gracias por tu atención, Pedro Olivares. On 7 mar, 15:42, Luis Maria Guayan<luismar...@gmail.com>wrote:Mira este artículo: --Como ordenar un Grid haciendo clic en cada columna --http://www.portalfox.com/article.php?sid=2728 Luis María Guayán Tucumán, Argentina _________________________http://www.PortalFox.comNada corre como un zorro _________________________ El 07/03/2012 16:33, pedro olivares escribió:Sadudos primero a todos los Foxeros y mi pegunta es la siguiente... Tengo una rutina que quiero que se ejecute en cada Header de los Grids que utilizo, en específico, una rutina que me ordena (ascendente o descendente). Lo que no quiero es tener que poner en todos los Header el código a donde tiene que ir. Por ejemplo: En todos los Clic de los header de las columnas del grid tengo que poner: thisform.Ordenar() Se puede hacer esto con solo una sentencia? Claro que se puede, pero como? Saludos.

Luis Maria Guayan

unread,
Mar 8, 2012, 7:10:41 AM3/8/12
to publice...@googlegroups.com
Hay alguien en este grupo que compartió un código de ordenar las columnas con un objeto que se incluye visualmente en el formulario y trabaja con Bindevent enlazando los eventos del Grid. Lamentablemente no lo recuerdo, si alguien se acuerda por favor.

Lo buscaré, se que en el foro de http://www.foxite.com/forum alguien también envió un ejemplo con Bindevents


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________


Mario López

unread,
Mar 8, 2012, 7:40:14 AM3/8/12
to Comunidad de Visual Foxpro en Español
@Luis María: yo contesté alguna vez esto (en el 2006, qué viejos
estamos :)))

---
CLOSE TABLES ALL
USE HOME() + "Samples\Tastrade\Data\Products.dbf"

SET MULTILOCKS ON
CURSORSETPROP("Buffering", 5)

PUBLIC frmTest
frmTest = CREATEOBJECT("xForm")
frmTest.Show()

RETURN



DEFINE CLASS xForm as Form
ADD OBJECT grdProd as Grid WITH ;
Top = 10, Left = 10, Width = 500, Height = 200

Width = 520


PROCEDURE grdProd.Init

LOCAL nCol

WITH This
FOR nCol = 1 TO .ColumnCount
* Vinculo el DobleClick de cada header con el método Sort
BINDEVENT(.Columns (nCol).Header1, [DblClick], ThisForm, [Sort])
NEXT
ENDWITH

ENDPROC


* Ordena por la columna indicada si tiene índice por la misma
PROCEDURE Sort

LOCAL nCol, sField, axTags[1], axEvt[1]

AEVENTS(axEvt, 0) && Busco el control que disparó el método Sort
nCol = axEvt[1].Parent.ColumnOrder

WITH ThisForm.grdProd
sField = JUSTEXT(UPPER(.Columns (nCol).Controls(2).ControlSource))

FOR nTag = 1 TO ATAGINFO(axTags)
IF sField $ GETWORDNUM(axTags [nTag, 3], 1, "+")
SET ORDER TO (axTags [nTag, 1])
WAIT WINDOW "Ordenada por " + axTags [nTag, 3] NOWAIT
.Refresh()
EXIT
ENDIF
NEXT
ENDWITH

ENDPROC
ENDDEFINE
---

Saludos,
Mario


On Mar 8, 9:10 am, Luis Maria Guayan <luismar...@gmail.com> wrote:
> Hay alguien en este grupo que compartió un código de ordenar las columnas con un objeto que se incluye visualmente en el formulario y trabaja con Bindevent enlazando los eventos del Grid. Lamentablemente no lo recuerdo, si alguien se acuerda por favor.
> Lo buscaré, se que en el foro dehttp://www.foxite.com/forumalguien también envió un ejemplo con Bindevents
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com
> Nada corre como un zorro
> _________________________
> El 08/03/2012 08:37, pedro olivares escribió:Grácias Luis, Ya entiendo mejor. Pero mi pregunta sigue en el aire... Como este proceso de hacer click en cualquier header es igual para todos (con un solo parámetro que le pasemos es suficiente), mi idea es que VFP atrape la acción antes de ir al método y ejecutarla desde una línea solamente, para todos los headers del grid. Lo que se me está ocurriendo es usar BLINDEVENTS, y es lo que estoy tratando de aprender a ver si logro dar con mi idea. Gracias de nuevo, Pedro. On 7 mar, 21:59, Luis Maria Guayan<luismar...@gmail.com>wrote:Yo también tengo mi clase MyGridy mi clase MyGridOrd (derivada de MyGrid) Las clases MyColumnOrd y MyHeaderOrd las tengo definidas en mi archivo de procedimientos generales, y en todas mis aplicaciones tengo la linea: SET PROCEDURE MyLibGral ADDITIVE Luis María Guayán Tucumán, Argentina _________________________http://www.PortalFox.comNada corre como un zorro _________________________ El 07/03/2012 22:11, pedro olivares escribió:Luis Maria antes que nada gracias por tu repuesta y el artículo de ejemplo, está excelente. El problema que tengo es que es para un proyecto que llevo haciendo desde hace tiempo y ya tengo todas las vistas de los datos y formularios hechos; y por lo que veo en tu artículo es para generar un grid programáticamente y aplicar el ordenamiento desde ahí. A ver si me explico... Todos los grids que uso son de una clase grid que tengo en una libreria y en casi todos los formularios inserto mi grid ya creado en estos formularios. Ahora bien, tu apuntas que... "Las clases que no podemos almacenar en una librería de clases visuales, y la debemos definir programáticamente son las clases MyColumnOrd y MyHeaderOrd, y es allí donde definimos los métodos de ordenamiento con el clic en el Header de cada columna, y la imagen correspondiente para cada Header." Donde defino las 2 clases? E n el clic de cada header de las columnas de los grid? Gracias por tu atención, Pedro Olivares. On 7 mar, 15:42, Luis Maria Guayan<luismar...@gmail.com>wrote:Mira este artículo: --Como ordenar un Grid haciendo clic en cada columna --http://www.portalfox.com/article.php?sid=2728 Luis María Guayán Tucumán, Argentina _________________________http://www.PortalFox.comNadacorre como un zorro _________________________ El 07/03/2012 16:33, pedro olivares escribió:Sadudos primero a todos los Foxeros y mi pegunta es la siguiente... Tengo una rutina que quiero que se ejecute en cada Header de los Grids que utilizo, en específico, una rutina que me ordena (ascendente o descendente). Lo que no quiero es tener que poner en todos los Header el código a donde tiene que ir. Por ejemplo: En todos l os Clic de los header de las columnas del grid tengo que poner: thisform.Ordenar() Se puede hacer esto con solo una sentencia? Claro que se puede, pero como? Saludos.

pedro olivares

unread,
Mar 8, 2012, 10:24:57 AM3/8/12
to Comunidad de Visual Foxpro en Español
Mario !

Un millón de gracias, al igual que sin Luis Maria no hubiera podido
llegar tan pronto a esta solución.

...y lo de los viejitos que nos estamos poniendo, creo que de ahí
nadie se salva... :-)

Un saludo a las mujeres de paso en su Día Internacional de la Mujer.

Pedro.
> > Lo buscaré, se que en el foro dehttp://www.foxite.com/forumalguientambién envió un ejemplo con Bindevents
>
> > Luis María Guayán
> > Tucumán, Argentina
> > _________________________http://www.PortalFox.com
> > Nada corre como un zorro
> > _________________________
> > El 08/03/2012 08:37, pedro olivares escribió:Grácias Luis, Ya entiendo mejor. Pero mi pregunta sigue en el aire... Como este proceso de hacer click en cualquier header es igual para todos (con un solo parámetro que le pasemos es suficiente), mi idea es que VFP atrape la acción antes de ir al método y ejecutarla desde una línea solamente, para todos los headers del grid. Lo que se me está ocurriendo es usar BLINDEVENTS, y es lo que estoy tratando de aprender a ver si logro dar con mi idea. Gracias de nuevo, Pedro. On 7 mar, 21:59, Luis Maria Guayan<luismar...@gmail.com>wrote:Yo también tengo mi clase MyGridy mi clase MyGridOrd (derivada de MyGrid) Las clases MyColumnOrd y MyHeaderOrd las tengo definidas en mi archivo de procedimientos generales, y en todas mis aplicaciones tengo la linea: SET PROCEDURE MyLibGral ADDITIVE Luis María Guayán Tucumán, Argentina _________________________http://www.PortalFox.comNada corre como un zorro _________________________ El 07/03/2012 22:11, pedro olivares escribió:Luis Maria antes que nada gracias por tu repuesta y el artículo de ejemplo, está excelente. El problema que tengo es que es para un proyecto que llevo haciendo desde hace tiempo y ya tengo todas las vistas de los datos y formularios hechos; y por lo que veo en tu artículo es para generar un grid programáticamente y aplicar el ordenamiento desde ahí. A ver si me explico... Todos los grids que uso son de una clase grid que tengo en una libreria y en casi todos los formularios inserto mi grid ya creado en estos formularios. Ahora bien, tu apuntas que... "Las clases que no podemos almacenar en una librería de clases visuales, y la debemos definir programáticamente son las clases MyColumnOrd y MyHeaderOrd, y es allí donde definimos los métodos de ordenamiento con el clic en el Header de cada columna, y la imagen correspondiente para cada Header." Donde defino las 2 clases? E n el clic de cada header de las columnas de los grid? Gracias por tu atención, Pedro Olivares. On 7 mar, 15:42, Luis Maria Guayan<luismar...@gmail.com>wrote:Mira este artículo: --Como ordenar un Grid haciendo clic en cada columna --http://www.portalfox.com/article.php?sid=2728Luis María Guayán Tucumán, Argentina _________________________http://www.PortalFox.comNadacorrecomo un zorro _________________________ El 07/03/2012 16:33, pedro olivares escribió:Sadudos primero a todos los Foxeros y mi pegunta es la siguiente... Tengo una rutina que quiero que se ejecute en cada Header de los Grids que utilizo, en específico, una rutina que me ordena (ascendente o descendente). Lo que no quiero es tener que poner en todos los Header el código a donde tiene que ir. Por ejemplo: En todos l os Clic de los header de las columnas del grid tengo que poner: thisform.Ordenar() Se puede hacer esto con solo una sentencia? Claro que se puede, pero como? Saludos.

Rudolf Johann Heiner

unread,
Mar 8, 2012, 11:15:35 AM3/8/12
to publice...@googlegroups.com
Te paso una rutina algo larga pero funcional. En el INIT del form usas
BINDEVENT

*-- Click para las columnas del Grid1
FOR lnCols = 1 TO This.Grid1.ColumnCount
lcCol = 'This.Grid1.Column'+TRANSFORM(lnCols)+'.Header1'
BINDEVENT(&lcCol,"Click", This, "ClickHeader")
ENDFOR

El metodo CLICKHEADER (creado por ti)


IF AEVENTS(laObjeto,0) > 0
RELEASE gcFilter
PUBLIC gcFilter AS Variant

lcOldConfirm = SET("Confirm")
loObjetoGrid = ThisForm.NombreGrid
loDataBase = ThisForm.OrigenGrid
lcField = laObjeto[1].Parent.ControlSource
lcCampo = "'"+GETWORDNUM(lcField,2,".")+"'"
lcFileIDX = SYS(2023)+"\"+SUBSTR(SYS(2015),2,10)+".IDX"
lnBAR = 6
lnOpcion = 0


SELECT (loDataBase)
SET INDEX TO
SET ORDER TO
SET FILTER TO
SET CONFIRM ON

*-- CREA CURSOR PARA DATOS UNICOS
USE IN (SELECT('curUNICOS'))
SELECT DISTINCT &lcField AS CampoUnico;
FROM (loDataBase);
INTO CURSOR curUNICOS
GO TOP

*-- TIPO DE DATO
lcTipoDeDato = TYPE('curUNICOS.CampoUnico')

DEFINE POPUP AYUDA SHORTCUT FROM MROW(),MCOL() FONT 'Verdana', 7 SCROLL
DEFINE BAR 01 OF AYUDA PROMPT 'Orden Ascendente'
DEFINE BAR 02 OF AYUDA PROMPT 'Orden Descendente'
DEFINE BAR 03 OF AYUDA PROMPT '\-'
DEFINE BAR 04 OF AYUDA PROMPT '(Todas...)'
DEFINE BAR 05 OF AYUDA PROMPT '\-'
IF TYPE('curUNICOS.CampoUnico') # 'L'
SCAN
DEFINE BAR lnBAR OF AYUDA PROMPT ;
ICASE(TYPE('curUNICOS.CampoUnico') = 'N', STR(CampoUnico,10,2),;
TYPE('curUNICOS.CampoUnico') = 'C', CampoUnico,;
TYPE('curUNICOS.CampoUnico') = 'D', DTOC(CampoUnico), CampoUnico)

lnBAR = lnBAR + 1
ENDSCAN
ENDIF
ON SELECTION POPUP AYUDA lnOpcion = BAR()
ACTIVATE POPUP AYUDA
DEACTIVATE POPUP AYUDA
RELEASE POPUPS AYUDA
USE IN (SELECT('curUNICOS'))

SET CONFIRM &lcOldConfirm

SELECT (loDataBase)

*-- que opciones selecciono
DO CASE
CASE lnOpcion = 1
TRY
INDEX ON &lcField TO (lcFileIDX)
CATCH
ENDTRY
CASE lnOpcion = 2
TRY
INDEX ON &lcField TO (lcFileIDX)
lcIdxFile = JUSTSTEM(lcFileIDX)
SET ORDER TO (lcIdxFile) DESCENDING
CATCH
ENDTRY
CASE lnOpcion = 3
SET INDEX TO
SET ORDER TO
SET FILTER TO
CASE lnOpcion >=6
gcFilter = ICASE(lcTipoDeDato = 'N', VAL(PROMPT()),;
lcTipoDeDato = 'C', PROMPT(),;
lcTipoDeDato = 'D', CTOD(PROMPT()))
TRY
SET FILTER TO &lcField = gcFilter
CATCH
ENDTRY

ENDCASE
GO TOP
lcScriptRefresh = loObjetoGrid + '.Refresh'
lcScriptAutoFit = loObjetoGrid + '.Autofit'
&lcScriptRefresh
&lcScriptAutoFit
ENDIF

pedro olivares

unread,
Mar 10, 2012, 12:45:04 PM3/10/12
to Comunidad de Visual Foxpro en Español
Rudolf, la veré. Ya con el código de Mario pude resolver el problema,
pero nunca cae mal ver alternativas.

Gracias.



On 8 mar, 12:15, Rudolf Johann Heiner <rudolf_hei...@hotmail.com>
wrote:
Reply all
Reply to author
Forward
0 new messages