In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Nombre de un browse desde el propio brovse

Foro de Xailer profesional en español
Claudio C
Posts: 46
Joined: Sun Sep 20, 2015 8:13 pm
Location: Buenos Aires

Nombre de un browse desde el propio brovse

Postby Claudio C » Tue Apr 25, 2017 5:42 am

Estimados

Estoy haciendo una extensión de Tbrowse y en uno de sus metodos necesito saber el "nombre de variable" del propio browse ( el valor que se carga en el IDE cVarName )
El tema es que no encuento la funcion / propiedad que ne Devuelva el nombre.

//--------------------
method test( ) CLASS TBrowse
local cVentana,cBrowse
cVentana:=::oParent:classname() // Ok, nombre del formulario contenedor del browse
cBrowse := ::cVarName ???

Desde ya gracias por su tiempo.
User avatar
ignacio
Site Admin
Posts: 8553
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

Re: Nombre de un browse desde el propio brovse

Postby ignacio » Tue Apr 25, 2017 12:02 pm

Buenos días,

Me temo que esa información ni siquiera existe en run-time. Díganos exactamente lo que desea hacer e intentamos hacerle alguna sugerencia al respecto.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Claudio C
Posts: 46
Joined: Sun Sep 20, 2015 8:13 pm
Location: Buenos Aires

Re: Nombre de un browse desde el propio brovse

Postby Claudio C » Tue Apr 25, 2017 2:15 pm

Ignacio, la idea es esta:

Salvar el estado de las columnas de cada browse, de cada ventana, para cada usuario y de manera automática.
De esta manera cada Usuario determina que columnas quiere ver y en que orden para cada browse del sistema.
El método lo resolví hace tiempo con SaveState(), etc ...
Lo que necesito ahora es incorporar esta funcionalidad a la clase Madre de los browsers para no tener que programarlo en cada uno.
Esta informacion ( Ventana+browse+usuario ) en conjunto con SaveState() se registra en un BD y se restaura al iniciar el browse.
El usuario es una variable propia del sistema : ok
La ventana contenedora del Browse me lo da ::oParent:classname() : ok
El nombre del browse... ahí hago agua.

Por lo que me decís no existe ese dato en runtime. Aunque el nombre del control ( browse ) debe figurar en la lista de componentes de la ventana...
Veo si con el handle del browse puedo encontrarlo en la lista de objetos del contenedor y asi obtener el nombre...

Escucho sugerencias
Gracias por su tiempo
User avatar
ignacio
Site Admin
Posts: 8553
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

Re: Nombre de un browse desde el propio brovse

Postby ignacio » Tue Apr 25, 2017 4:45 pm

Hola,

Veo que lo que realmente necesita es reconocer de forma individual cada uno de los browses que utiliza su aplicación. Hay varias formas de hacerlo: una de ellas es usar el miembro CARGO para distinguir cada Browse, otra posibilidad es utilizar información del dataset sobre el cual se apoya si es el caso. Yo le recomiendo que simplemente cree un checksum con los nombres de las columnas del Browse (use HB_MD5) . Es poco probable que tengas dos browses iguales.

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Claudio C
Posts: 46
Joined: Sun Sep 20, 2015 8:13 pm
Location: Buenos Aires

Re: Nombre de un browse desde el propio brovse (final)

Postby Claudio C » Wed Apr 26, 2017 7:33 pm

Estimado Ignacio

Gracias por tus recomendaciones.
1) La primer opcion fue, como indicas vos, usar CARGO. Funcionaba pero dependia que se cargase este valor en el IDE y la idea era que fuese automático.
2) Lo del dataset no es aplicable porque mi idea es 'colgar' esta nueva característica en la clase madre TBrowse.
3) El checksum es muy bueno pero una restricción que tengo es que los browses no tienen definidas las columas por código ( no se agregan en el IDE ).
Las columnas se definen en un 'select' dentro de stored procedures en maria db... con lo cual no se que me daría el checksun en dos llamadas diferentes del programa.

Entonces lo que hice ( y por ahora funciona ) es ver qué 'número' de browse es el actual dentro de la lista de 'browses' de su contenedor.

Esta solucion tiene ciertas 'debilidades' potenciales, pero una vez definido el layout del form funciona solo.
Cualquier propuesta superadora es bienvenida pero hasta entonces me quedo con esta solución.
Debajo dejo el código por si a alguien le sirve,
Un saludos y gracias.
Claudio.

//------------------------------------------------------------------------------
method daNroDeBrowse() CLASS TBrowse
// Este método devuelve la posición relativa del Browse dentro de la lista de 'Browses' de su contenedor ::oParent (Normalmente un TForm).
// Se consideran Solo los controles que heredan de TBrowse. Este ID varía si se agrega un Browse en el contenedor en una posición de edición previa al browse en cuestion. También si se cambia la secuencia de edición entre distintos browses de edición.
// NO cambia el id si se agregan otros controles no derivados de TBrowse al
// contenedor como botones, labels, etc.
local i
local nID := 0
local aCTLs := ::oParent:aControls // Lista de controles del contenedor
local j := Len(aCTLs)
for i=1 to j // Barre lista de controles
if aCTLs[i]:iskindof('TBrowse') // Ve si desciende de browse
++nID // Cuenta 'browses'
if aCTLs[i]:Handle == ::Handle // Se encontró a si mismo :)
return nID // Devuelve su 'orden' entre los browses
endif
endif
next
return 0

Return to “Spanish”