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.

Dos consultas

Foro público de Xailer en español
Responder
Mario Hahn
Mensajes: 33
Registrado: Sab Jul 15, 2006 12:05 am

Dos consultas

Mensaje por Mario Hahn »

Hola a todos, quisiera consultarles sobre dos problemas que se me presentan
en las pruebas que continúo haciendo para ver la posibiliad de llevar mis
programas a Xailer,
1) Cómo uso las macros, me da un error en la ejecución del
programa que tiene que ver con el uso de la macro,
para entender lo que quiero hacer paso el código. (trato de
inicializar objetos Tedit con el contenido del campo, no quiero utilizar los
DataControls)
METHOD Leer( oSender, lBookMarkChanged ) CLASS TFrmDatosFijos
Local nFor, nCampo, nCampos, nVar
nCampos := ::oDatSoc:FieldCount
With object ::oDatSoc
For nFor := 1 to nCampos
If :FieldType( nFor ) <> "M"
nCampo := :FieldName( nFor )
nVar := "::oTxt" + nCampo + ":Value"
DO CASE
CASE :FieldType( nFor ) = "C"
&nVar := :VarGet( nFor ) ////// MACRO
ENDCASE
EndIf
Next
end object
::oTxtBuscar:value := ::oDatSoc:nombre //Muestra campo de la tabla en
EditBox
RETURN Nil
2) Cómo recorro todos los objetos de un TForm, para ubicar por ejemplo todos
los objetos TEdit, TButton, etc.
Saludos.
Mario Hahn
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9441
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Dos consultas

Mensaje por ignacio »

Mario,
Expresiones del tipo:
&("::oTxt" + nCampo + ":Value")
dudo que se puedan hacer, debido a la referencia a Self ('::'). Recuerde que
las macros son incapaces de acceder a variables locales y estáticas y es
necesario utilizar variables públicas o privadas dentro de las mismas.
Intento lo siguiente:
PUBLIC oForm
&("oForm:oTxt" + nCampo + ":Value")
Un saludo
"Mario Hahn" <mhahn@prico.com.ar> escribió en el mensaje
news:[email=46faddf9@ozsrv2.ozlan.local...]46faddf9@ozsrv2.ozlan.local...[/email]
> Hola a todos, quisiera consultarles sobre dos problemas que se me
> presentan
> en las pruebas que continúo haciendo para ver la posibiliad de llevar mis
> programas a Xailer,
>
> 1) Cómo uso las macros, me da un error en la ejecución del
> programa que tiene que ver con el uso de la macro,
> para entender lo que quiero hacer paso el código. (trato de
> inicializar objetos Tedit con el contenido del campo, no quiero utilizar
> los
> DataControls)
>
> METHOD Leer( oSender, lBookMarkChanged ) CLASS TFrmDatosFijos
> Local nFor, nCampo, nCampos, nVar
> nCampos := ::oDatSoc:FieldCount
>
> With object ::oDatSoc
> For nFor := 1 to nCampos
> If :FieldType( nFor ) <> "M"
> nCampo := :FieldName( nFor )
> nVar := "::oTxt" + nCampo + ":Value"
> DO CASE
> CASE :FieldType( nFor ) = "C"
> &nVar := :VarGet( nFor ) ////// MACRO
> ENDCASE
> EndIf
> Next
> end object
>
> ::oTxtBuscar:value := ::oDatSoc:nombre //Muestra campo de la tabla en
> EditBox
> RETURN Nil
>
> 2) Cómo recorro todos los objetos de un TForm, para ubicar por ejemplo
> todos
> los objetos TEdit, TButton, etc.
>
> Saludos.
> Mario Hahn
>
>
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9441
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Dos consultas

Mensaje por ignacio »

Mario,
En cuanto a su segunda pregunta. Todo formulario tiene una matriz aControls
con todos los controles que posee. Puede utilizar el método Classname() para
saber exactamente el tipo de todos ellos y actuar en consecuencia.
Un saludo,
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
news:46fb4f3a$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Mario,
>
> Expresiones del tipo:
>
> &("::oTxt" + nCampo + ":Value")
>
> dudo que se puedan hacer, debido a la referencia a Self ('::'). Recuerde
> que las macros son incapaces de acceder a variables locales y estáticas y
> es necesario utilizar variables públicas o privadas dentro de las mismas.
> Intento lo siguiente:
>
> PUBLIC oForm
>
> &("oForm:oTxt" + nCampo + ":Value")
>
> Un saludo
>
>
> "Mario Hahn" <mhahn@prico.com.ar> escribió en el mensaje
> news:[email=46faddf9@ozsrv2.ozlan.local...]46faddf9@ozsrv2.ozlan.local...[/email]
>> Hola a todos, quisiera consultarles sobre dos problemas que se me
>> presentan
>> en las pruebas que continúo haciendo para ver la posibiliad de llevar mis
>> programas a Xailer,
>>
>> 1) Cómo uso las macros, me da un error en la ejecución del
>> programa que tiene que ver con el uso de la macro,
>> para entender lo que quiero hacer paso el código. (trato de
>> inicializar objetos Tedit con el contenido del campo, no quiero utilizar
>> los
>> DataControls)
>>
>> METHOD Leer( oSender, lBookMarkChanged ) CLASS TFrmDatosFijos
>> Local nFor, nCampo, nCampos, nVar
>> nCampos := ::oDatSoc:FieldCount
>>
>> With object ::oDatSoc
>> For nFor := 1 to nCampos
>> If :FieldType( nFor ) <> "M"
>> nCampo := :FieldName( nFor )
>> nVar := "::oTxt" + nCampo + ":Value"
>> DO CASE
>> CASE :FieldType( nFor ) = "C"
>> &nVar := :VarGet( nFor ) ////// MACRO
>> ENDCASE
>> EndIf
>> Next
>> end object
>>
>> ::oTxtBuscar:value := ::oDatSoc:nombre //Muestra campo de la tabla
>> en
>> EditBox
>> RETURN Nil
>>
>> 2) Cómo recorro todos los objetos de un TForm, para ubicar por ejemplo
>> todos
>> los objetos TEdit, TButton, etc.
>>
>> Saludos.
>> Mario Hahn
>>
>>
>>
>
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Mario Hahn
Mensajes: 33
Registrado: Sab Jul 15, 2006 12:05 am

Dos consultas

Mensaje por Mario Hahn »

Ignacio, no me queda más que agradecer su pronta respuesta, es algo que
admiro de vuestro equipo.
Un cordial saludo.
Mario.
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
news:46fb4fd7$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Mario,
>
> En cuanto a su segunda pregunta. Todo formulario tiene una matriz
> aControls con todos los controles que posee. Puede utilizar el método
> Classname() para saber exactamente el tipo de todos ellos y actuar en
> consecuencia.
>
> Un saludo,
>
> "Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
> news:46fb4f3a$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
>> Mario,
>>
>> Expresiones del tipo:
>>
>> &("::oTxt" + nCampo + ":Value")
>>
>> dudo que se puedan hacer, debido a la referencia a Self ('::'). Recuerde
>> que las macros son incapaces de acceder a variables locales y estáticas y
>> es necesario utilizar variables públicas o privadas dentro de las mismas.
>> Intento lo siguiente:
>>
>> PUBLIC oForm
>>
>> &("oForm:oTxt" + nCampo + ":Value")
>>
>> Un saludo
>>
>>
>> "Mario Hahn" <mhahn@prico.com.ar> escribió en el mensaje
>> news:[email=46faddf9@ozsrv2.ozlan.local...]46faddf9@ozsrv2.ozlan.local...[/email]
>>> Hola a todos, quisiera consultarles sobre dos problemas que se me
>>> presentan
>>> en las pruebas que continúo haciendo para ver la posibiliad de llevar
>>> mis
>>> programas a Xailer,
>>>
>>> 1) Cómo uso las macros, me da un error en la ejecución del
>>> programa que tiene que ver con el uso de la macro,
>>> para entender lo que quiero hacer paso el código. (trato de
>>> inicializar objetos Tedit con el contenido del campo, no quiero utilizar
>>> los
>>> DataControls)
>>>
>>> METHOD Leer( oSender, lBookMarkChanged ) CLASS TFrmDatosFijos
>>> Local nFor, nCampo, nCampos, nVar
>>> nCampos := ::oDatSoc:FieldCount
>>>
>>> With object ::oDatSoc
>>> For nFor := 1 to nCampos
>>> If :FieldType( nFor ) <> "M"
>>> nCampo := :FieldName( nFor )
>>> nVar := "::oTxt" + nCampo + ":Value"
>>> DO CASE
>>> CASE :FieldType( nFor ) = "C"
>>> &nVar := :VarGet( nFor ) ////// MACRO
>>> ENDCASE
>>> EndIf
>>> Next
>>> end object
>>>
>>> ::oTxtBuscar:value := ::oDatSoc:nombre //Muestra campo de la tabla
>>> en
>>> EditBox
>>> RETURN Nil
>>>
>>> 2) Cómo recorro todos los objetos de un TForm, para ubicar por ejemplo
>>> todos
>>> los objetos TEdit, TButton, etc.
>>>
>>> Saludos.
>>> Mario Hahn
>>>
>>>
>>>
>>
>>
>
>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Dos consultas

Mensaje por jfgimenez »

Mario,
en vez de esto:
> nVar := "::oTxt" + nCampo + ":Value"
> DO CASE
> CASE :FieldType( nFor ) = "C"
> &nVar := :VarGet( nFor ) ////// MACRO
> ENDCASE
puedes usar esta otra forma:
__ObjSendMsg( Self, "oTxt" + nCampo ):Value := :VarGet( nFor )
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Mario Hahn
Mensajes: 33
Registrado: Sab Jul 15, 2006 12:05 am

Dos consultas

Mensaje por Mario Hahn »

Hola José, esta configuración anduvo de diez,
ahí es donde estoy un poco de acuerdo con lo que expresó George Abinader en
este foro el 27/07/2007 que lo seguí ya que me sentí un poco identificado
con él, sé que deben estar muy repletos de trabajo, pero me parece que
faltaría un poco más de orientación sobre cómo poder aprovechar bien esta
herramienta, me parece que faltaría un poco más de documentación, mira que
estuve buscando y probando..... pero no encontré nada.
Con relación a la respuesta a la segunda pregunta, todavía no he encontrado
ayuda en relación al método Calssname(), en ningún lugar se hace referencia
a él. Te comento que la idea es con un método habilitar todos los button's
de un formulario o deshabilitarlos recorriendo y preguntando por todos sus
objetos.
Un cordial saludo.
Mario Hahn
Puerto Rico - Misiones - Argentina
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=46fb905b@ozsrv2.ozlan.local...]46fb905b@ozsrv2.ozlan.local...[/email]
> Mario,
>
> en vez de esto:
>
>> nVar := "::oTxt" + nCampo + ":Value"
>> DO CASE
>> CASE :FieldType( nFor ) = "C"
>> &nVar := :VarGet( nFor ) ////// MACRO
>> ENDCASE
>
> puedes usar esta otra forma:
>
> __ObjSendMsg( Self, "oTxt" + nCampo ):Value := :VarGet( nFor )
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info
>
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Dos consultas

Mensaje por jrcpoli-quitar »

Mario:
No se si he entendido bien tu segunda pregunta pero si lo que quieres es
que se deshabiliten y habiliten los botones de un formulario dependiendo
de ciertas condiciones creo que debí­as mirar el evento OnCheckState del
formulario o de los botones, en ese evento puedes poner las condiciones.
Por ejemplo:
Esto en un formulario con varios Browse que tiene además cuatro botones
los cuales se activan o desactivan según el estado del cada Browse.
METHOD FormCheckState( oSender ) CLASS TFormResultadosBenzing
*
** Si el Browse de Carreras tiene registros
** Activa el botón de cambio de Fecha y Hora
IF ::oDBBCarreras:KeyCount() > 0
IF !::oBTCambioH:lEnabled
::oBTCambioH:lEnabled := .T.
ENDIF
ELSE
IF ::oBTCambioH:lEnabled
::oBTCambioH:lEnabled := .F.
ENDIF
ENDIF
*
** Si el Browse de Reloj y Llegadas tiene registros
** Activa los botones de Enceste
IF ::oDBBReloj:KeyCount() > 0 .AND. ::oDBBLlegadas:KeyCount() > 0
** Activar el Botón de Enceste
IF !::oBTEnceste:lEnabled
::oBTEnceste:lEnabled := .T.
ENDIF
** Activar el Botón de Resultados
IF !::oBTResultados:lEnabled
::oBTResultados:lEnabled := .T.
ENDIF
** Activar el Botón de Procesar Suelta
IF !::oBTProcesarSuelta:lEnabled
::oBTProcesarSuelta:lEnabled := .T.
ENDIF
** Activar el Botón de Procesar Colombófilo
IF !::oBTProcesarColom:lEnabled
::oBTProcesarColom:lEnabled := .T.
ENDIF
*
ELSE
** Desactivar el Botón de Enceste
IF ::oBTEnceste:lEnabled
::oBTEnceste:lEnabled := .F.
ENDIF
** Desactivar el Botón de Resultados
IF ::oBTResultados:lEnabled
::oBTResultados:lEnabled := .F.
ENDIF
** Desactivar el Botón de Procesar Suelta
IF ::oBTProcesarSuelta:lEnabled
::oBTProcesarSuelta:lEnabled := .F.
ENDIF
** Desactivar el Botón de Procesar Colombófilo
IF ::oBTProcesarColom:lEnabled
::oBTProcesarColom:lEnabled := .F.
ENDIF
*
ENDIF
RETURN Nil
Esto mismo lo puedes hacer con los otros Objetos del formulario.
José Ramón Castro.
Mario Hahn escribió:
> Hola José, esta configuración anduvo de diez,
>
> ahí­ es donde estoy un poco de acuerdo con lo que expresó George Abinader en
> este foro el 27/07/2007 que lo seguí­ ya que me sentí­ un poco identificado
> con él, sé que deben estar muy repletos de trabajo, pero me parece que
> faltarí­a un poco más de orientación sobre cómo poder aprovechar bien esta
> herramienta, me parece que faltarí­a un poco más de documentación, mira que
> estuve buscando y probando..... pero no encontré nada.
>
> Con relación a la respuesta a la segunda pregunta, todaví­a no he encontrado
> ayuda en relación al método Calssname(), en ningún lugar se hace referencia
> a él. Te comento que la idea es con un método habilitar todos los button's
> de un formulario o deshabilitarlos recorriendo y preguntando por todos sus
> objetos.
>
> Un cordial saludo.
>
> Mario Hahn
> Puerto Rico - Misiones - Argentina
>
>
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
> news:[email=46fb905b@ozsrv2.ozlan.local...]46fb905b@ozsrv2.ozlan.local...[/email]
>> Mario,
>>
>> en vez de esto:
>>
>>> nVar := "::oTxt" + nCampo + ":Value"
>>> DO CASE
>>> CASE :FieldType( nFor ) = "C"
>>> &nVar := :VarGet( nFor ) ////// MACRO
>>> ENDCASE
>> puedes usar esta otra forma:
>>
>> __ObjSendMsg( Self, "oTxt" + nCampo ):Value := :VarGet( nFor )
>>
>> --
>> Un saludo,
>>
>> José F. Giménez
>> http://www.xailer.com
>> http://www.xailer.info
>>
>
>
Mario Hahn
Mensajes: 33
Registrado: Sab Jul 15, 2006 12:05 am

Dos consultas

Mensaje por Mario Hahn »

Hola José Ramón,
Es eso lo que quiero lograr, pero lo que no quiero hacer es en cada Form
tener que escribir cada objeto y especificar su estado, sino que con
métodos lo pueda hacer (tratar de escribir lo menos posible con la misma
funcionalidad, jejeje), Por ejemplo en VFox hago esto para habilitar todos
los objetos textbox y los combobox que haya en un form, (son solo dos líneas
de código)
Thisform.SetAll("Enabled", .f., "Textbox") //Deshabilitar todos los
Texbox
Thisform.SetAll("Enabled", .f., "Combobox") //Deshabilitar todos los
Combobox
También utilizo bucles cuando necesito cambiar el estado de varios label ó
combobox ó textox, combinando macros (de ahí la primera pregunta, que con la
solución de __ObjSendMsg() realmente solucioné el tema), por ejemplo
1ra. Forma:
For I = 1 to nFor
Etiq = "ThisForm.lbl" + ALLTRIM(STR(I)) + ".Visible = .f."
&Etiq
EndFor
Inspeccionar objetos del form
Dimension Botones[5] && Array o
For I = 1 to nFor
&& Agrego todos los Botones ó los que quiera definir
Thisform.AddObject('THIS.Dimension', 'COMMANDBUTTON')
EndFor
&& Cambio estado de botones
For Each oButton IN This.Botones
oButton.Enabled = .T.
Next
Muchas gracias y saludos.
Mario Hahn
Puerto Rico - Misiones - Argentina
"José Ramón Castro Polinio" <jrcpoli-quitarpara_envio]"@terra.es> escribió
en el mensaje news:[email=46fc0363@ozsrv2.ozlan.local...]46fc0363@ozsrv2.ozlan.local...[/email]
> Mario:
>
> No se si he entendido bien tu segunda pregunta pero si lo que quieres es
> que se deshabiliten y habiliten los botones de un formulario dependiendo
> de ciertas condiciones creo que debías mirar el evento OnCheckState del
> formulario o de los botones, en ese evento puedes poner las condiciones.
>
> Por ejemplo:
>
> Esto en un formulario con varios Browse que tiene además cuatro botones
> los cuales se activan o desactivan según el estado del cada Browse.
>
> METHOD FormCheckState( oSender ) CLASS TFormResultadosBenzing
> *
> ** Si el Browse de Carreras tiene registros
> ** Activa el botón de cambio de Fecha y Hora
> IF ::oDBBCarreras:KeyCount() > 0
> IF !::oBTCambioH:lEnabled
> ::oBTCambioH:lEnabled := .T.
> ENDIF
> ELSE
> IF ::oBTCambioH:lEnabled
> ::oBTCambioH:lEnabled := .F.
> ENDIF
> ENDIF
> *
> ** Si el Browse de Reloj y Llegadas tiene registros
> ** Activa los botones de Enceste
> IF ::oDBBReloj:KeyCount() > 0 .AND. ::oDBBLlegadas:KeyCount() > 0
> ** Activar el Botón de Enceste
> IF !::oBTEnceste:lEnabled
> ::oBTEnceste:lEnabled := .T.
> ENDIF
> ** Activar el Botón de Resultados
> IF !::oBTResultados:lEnabled
> ::oBTResultados:lEnabled := .T.
> ENDIF
> ** Activar el Botón de Procesar Suelta
> IF !::oBTProcesarSuelta:lEnabled
> ::oBTProcesarSuelta:lEnabled := .T.
> ENDIF
> ** Activar el Botón de Procesar Colombófilo
> IF !::oBTProcesarColom:lEnabled
> ::oBTProcesarColom:lEnabled := .T.
> ENDIF
> *
> ELSE
> ** Desactivar el Botón de Enceste
> IF ::oBTEnceste:lEnabled
> ::oBTEnceste:lEnabled := .F.
> ENDIF
> ** Desactivar el Botón de Resultados
> IF ::oBTResultados:lEnabled
> ::oBTResultados:lEnabled := .F.
> ENDIF
> ** Desactivar el Botón de Procesar Suelta
> IF ::oBTProcesarSuelta:lEnabled
> ::oBTProcesarSuelta:lEnabled := .F.
> ENDIF
> ** Desactivar el Botón de Procesar Colombófilo
> IF ::oBTProcesarColom:lEnabled
> ::oBTProcesarColom:lEnabled := .F.
> ENDIF
> *
> ENDIF
>
> RETURN Nil
>
> Esto mismo lo puedes hacer con los otros Objetos del formulario.
>
> José Ramón Castro.
>
> Mario Hahn escribió:
>> Hola José, esta configuración anduvo de diez,
>>
>> ahí es donde estoy un poco de acuerdo con lo que expresó George Abinader
>> en este foro el 27/07/2007 que lo seguí ya que me sentí un poco
>> identificado con él, sé que deben estar muy repletos de trabajo, pero me
>> parece que faltaría un poco más de orientación sobre cómo poder
>> aprovechar bien esta herramienta, me parece que faltaría un poco más de
>> documentación, mira que estuve buscando y probando..... pero no encontré
>> nada.
>>
>> Con relación a la respuesta a la segunda pregunta, todavía no he
>> encontrado ayuda en relación al método Calssname(), en ningún lugar se
>> hace referencia a él. Te comento que la idea es con un método habilitar
>> todos los button's de un formulario o deshabilitarlos recorriendo y
>> preguntando por todos sus objetos.
>>
>> Un cordial saludo.
>>
>> Mario Hahn
>> Puerto Rico - Misiones - Argentina
>>
>>
>>
>> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
>> news:[email=46fb905b@ozsrv2.ozlan.local...]46fb905b@ozsrv2.ozlan.local...[/email]
>>> Mario,
>>>
>>> en vez de esto:
>>>
>>>> nVar := "::oTxt" + nCampo + ":Value"
>>>> DO CASE
>>>> CASE :FieldType( nFor ) = "C"
>>>> &nVar := :VarGet( nFor ) ////// MACRO
>>>> ENDCASE
>>> puedes usar esta otra forma:
>>>
>>> __ObjSendMsg( Self, "oTxt" + nCampo ):Value := :VarGet( nFor )
>>>
>>> --
>>> Un saludo,
>>>
>>> José F. Giménez
>>> http://www.xailer.com
>>> http://www.xailer.info
>>>
>>
Responder