para que sirve #DEFINE

292 views
Skip to first unread message

Elides Paredes

unread,
Nov 17, 2016, 4:22:17 PM11/17/16
to Comunidad de Visual Foxpro en Español
Estimados amigos

Saludos.

Tengo en varios formulario que he tomado de los ejemplos que publican en internet esa fuunción #DEFINE, por ejemplo:

#DEFINE TXT_LOC "Texto del Nodo secundario"
o = Thisform.oleTree
IF !ISNULL(o.SelectedItem) THEN
o.Nodes.Add(o.SelectedItem.Key, 4, Thisform.NewKey(), TXT_LOC,0)
ENDIF

Que ventajas tienes eso? si es mas fácil colocar el texto directamente en la función.

Saludos y Gracias por el apoyo que siempre me han brindado

Elides Paredes
Barquisimeto Venezuela


Carlos Hidalgo

unread,
Nov 17, 2016, 4:29:32 PM11/17/16
to publice...@googlegroups.com

Yo la uso para definir teclas de funciones especiales.
Ejemplo
#Define enter    13
#Define Escape 27
O tambiem para colores

#define blanco rgb(250,250,250) 

Asi cuando quiero usarlas es mas facil recordar el nombre que se le definio y no los numeros.

Saludos

francisco prieto

unread,
Nov 17, 2016, 4:33:06 PM11/17/16
to Comunidad de Visual Foxpro en Español
Elides,

TXT_LOC en este caso son constantes a tiempo de compilacion, es decir cuando compila el contenido de TXT_LOC va a parar a

o.Nodes.Add(o.SelectedItem.Key, 4, Thisform.NewKey(), TXT_LOC,0)

es como haber escrito

o.Nodes.Add(o.SelectedItem.Key, 4, Thisform.NewKey(), "Texto del Nodo secundario",0)

Lo bueno de esto es que los define se pueden poner en archivos .h y en vez de poner el #DEFINE en el metodo o funcion...

podes poner un #INCLUDE de archivo .h  y este .h puede contener todos los defines que necesites.

https://msdn.microsoft.com/es-es/library/cc450966(v=vs.71).aspx

Saludos,

Pancho
Córdoba
Argentina



Luiz Alexandre Ruiz

unread,
Nov 17, 2016, 4:37:44 PM11/17/16
to Comunidad de Visual Foxpro en Español
#DEFINE é geralmente usado para constantes.

Por Exemplo:

#DEFINE CR_LF CHR(10) + CHR(13)

Agora no seu exemplo, vamos dizer que você tenha o seguinte código.

#DEFINE TXT_LOC "Texto del Nodo"
o = Thisform.oleTree
IF !ISNULL(o.SelectedItem) THEN
o.Nodes.Add(o.SelectedItem.Key, 4, Thisform.NewKey(), TXT_LOC,0)
ENDIF
o.Nodes.Add(o.SelectedItem.Key, 4, Thisform.NewKey(), TXT_LOC,0)

Se você precisar alterar o texto, não precisa fazer isso nas duas linhas você vai fazer em uma linha só, como eu fiz no texto em vermelho.

Então, o bom das constantes é usá-las quando vai ser ter em mais de um lugar o mesmo valor, e também para a ajudar a documentação do código.

Você pode criar isso em um arquivo de definições e incluir o mesmo na tela desejada, eu faço isso para várias partes do meu sistema.

Abaixo um exemplo do meu arquivo Cabecalho.h

#DEFINE CR_LF                 CHR(13) + CHR(10)

&& Botões mensagem
#DEFINE BOTAO_OK            0
#DEFINE BOTAO_OK_CANCEL        1
#DEFINE BOTAO_IGNORA        2
#DEFINE BOTAO_SN_CANCEL        3
#DEFINE BOTAO_SN            4
#DEFINE BOTAO_IGNORA_CANCEL    5

&& Icones mensagem
#DEFINE MSG_ATENCAO            16
#DEFINE MSG_QUESTAO            32
#DEFINE MSG_EXCLAMACAO            48
#DEFINE MSG_INFORMACAO            64

&& Botão default
#DEFINE PRIMEIRO_BOTAO        0
#DEFINE SEGUNDO_BOTAO        256
#DEFINE TERCEIRO_BOTAO        512

&& Constante para geração RTF (Rich Text File)
#DEFINE CABECALHO_RTF        "{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fprq2 Arial;}{\f3\fmodern\fprq1 Courier New;}}" + ;
                    "{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green0\blue255;\red127\green127\blue127;\red128\green128\blue0;\red0\green128\blue0;\red0\green0\blue198;}\deflang1046"

#DEFINE PRETO_RTF            "\cf0"
#DEFINE VERMELHO_RTF        "\cf1"
#DEFINE AZUL_RTF            "\cf2"
#DEFINE CINZA_RTF            "\cf3"
#DEFINE AMARELO_RTF        "\cf4"
#DEFINE VERDE_RTF            "\cf5"
#DEFINE AZUL_ESCURO_RTF        "\cf6"

#DEFINE CARACTER_DEFAULT_RTF    "\plain"
#DEFINE FIM_PARAGRAFO_RTF    "\par"
#DEFINE INICIO_PARAGRAFO_RTF    "\pard"

#DEFINE CENTRALIZA_RTF        "\qc"
#DEFINE DIREITA_RTF        "\qr"
#DEFINE ESQUERDA_RTF        "\ql"
#DEFINE TABULACAO_RTF        "\tab"

#DEFINE SANS_SERIF_RTF        "\f0"
#DEFINE SYMBOL_RTF        "\f1"
#DEFINE ARIAL_RTF            "\f2"
#DEFINE COURIER_RTF        "\f3"

#DEFINE ITALICO_RTF        "\i"
#DEFINE NEGRITO_RTF        "\b"
#DEFINE SUBLINHADO_RTF        "\ul"
#DEFINE TAMANHO_FONTE_RTF    "\fs"

Elides Paredes

unread,
Nov 18, 2016, 9:53:55 AM11/18/16
to Comunidad de Visual Foxpro en Español


Estimados amigos

Saludos.

Esto siempre me pasa por no preguntar a tiempo, creo que de ahora en adelante lo haré con mas frecuencia. Es que ya me da un poco de "miedo", cada vez que comprendo algo, le veo muchas aplicaciones, y me hace modificar muchas cosas. Me explico, el miedo es a tener que mejorar todo y es mas trabajo..jajaja.. 

Y en éste momento ese es el caso. Muchas gracias, ahora lo entiendo,  Son muy amables al compartir sus conocimientos.. Mil gracias..!

Saludos y de nuevo Gracias por el apoyo que siempre me han brindado

Elides Paredes
Barquisimeto Venezuela


Carlos Hidalgo

unread,
Nov 18, 2016, 10:54:28 AM11/18/16
to publice...@googlegroups.com
jajaja.
Me pasa igual, pero entre mas sabe uno mas facil se hace el trabajo despues..

Saludos

Elides Paredes

unread,
Nov 18, 2016, 4:29:44 PM11/18/16
to Comunidad de Visual Foxpro en Español
Quizás esté mal decirlo así, porque es cierto, mejoran muchas cosas, mi problema es que tengo en mente algo que comento en mis conversaciones todo el tiempo, Lo difícil de programar es hacerlo fácil para el usuario. Esconder toda la complejidad del manejo de bases de datos, algoritmos, funciones, sistema operativo, redes, diseño gráfico, etc. y que para el usuario sea solo hacer click.

Cuando aprendo algo nuevo quiero aplicarlo y entonces se ven "feos"  los otros formularios y tengo que hacer muchos cambios.

Mi gran "problema" es que no estudié informática sino mecánica, y he tenido que reparar equipos electrónicos, eléctricos, sistemas de aires acondicionados o refrigeración, comerciales e industriales, trabajé como gerente de servicios en concesionarios de autos y camiones, etc.. me he metido en muchos "lios" y gracias a Dios he salido siempre bien. 

En el caso de sistemas informáticos logré también cosas que ni mis hermanas especialistas en informática, analistas e ingenieros, no han podido. Y es gracias al internet y sobre todo a éste foro donde se ven las verdaderas hazañas.

En ésta sencilla pregunta me dieron 3 enfoques diferentes y todas son excelentes soluciones a muchas cosas..

De nuevo gracias.


Elides Paredes
Barquisimeto Venezuela


HernanCano

unread,
Nov 19, 2016, 12:52:07 AM11/19/16
to Comunidad de Visual Foxpro en Español
Elides:

Por éso queremos tanto este lenguaje.... y hasta algunos le pidieron a doñe M$ que lo liberara.....(pedimos)....

Resalto lo que mencionas: tu profesión no está relacionada con informática y sin embargo utilizas este lenguaje para facilitar algunas cosas.... Como saben algunos, yo he hecho aportes a una alternativa a este lenguaje... pero programando en lenguaje C/C++.... sin embargo es muy difícil para mí .... comparando C++ con nuestro lenguaje......

Adelante, Elides... que algunos de nosotros también continuamos aprendiendo....

Fernando D. Bozzo

unread,
Nov 21, 2016, 4:18:47 AM11/21/16
to Comunidad de Visual Foxpro en Español
Hola Elides,

Aunque ya te respondieron sobradamente sobre los posibles usos de los #DEFINE, creo que te falta una pequeña explicación técnica de cómo funciona, lo que también te va a ayudar a saber en qué casos te conviene y cuándo no.

Las sentencias "#<NOMBRE>" se llaman "directivas de preprocesamiento", y suelen existir en prácticamente todos los leguajes de programación desde el C en adelante, algunas directivas mantienen incluso su nombre y significado igual en todos ellos, como ser #DEFINE, #INCLUDE, #IFDEF, #IFNDEF, etc.

Se llaman "directivas de preprocesamiento" porque sus valores son reemplazados en tiempo de compilación, o sea, cuando se genera el código objeto con BUILD EXE|APP|DLL, lo que significa que al compilar, cada vez que se procesa una línea de código que usa una de estas variables o condiciones nombradas, las sustituye por el valor que se haya definido.

Esto permite abstraerse de los datos y manejar conceptos, que son más fáciles para programar. Por ejemplo, si bien podrías usar esto para cambiar el color del texto en un textbox a rojo por programa:

txtDatos.ForeColor = RGB(255,0,0)



Es más claro si lo hicieras así:

txtDatos.ForeColor = C_ROJO


teniendo previamente el #DEFINE correspondiente.

Como siempre, vas a encontrar casos donde te conviene usarlo de una forma o de otra, y esta forma es para usar en código, nunca para usarlo en la solapa de propiedades de un objeto.

Saludos.-

Carlos Miguel FARIAS

unread,
Nov 21, 2016, 6:06:48 AM11/21/16
to Grupo Fox
Otra aplicación de DEFINE, que ya se ha comentado en este foro es que sirve para ofuscar el código.
#DEFINE miFuncion _0110100010101
#DEFINE miVariable _0110100010100

* código escrito
miVariable = miFuncion()

* si lo descompilan
_0110100010100 = _0110100010101()

Como además, al compilar una aplicación desaparecen los comentarios, ayuda a que el código quede ofuscado

Otro uso: Supongamos que nuestra aplicación debe ser usada en paises con lenguajes diferentes, entonces...
En un archivo que llamaremos espaniol.h ponemos todos los textos que se usan el programa

#DEFINE MSG_ERR_001 "Error 001. Usuario Incorrecto. Cambie el usuario"
#DEFINE MSG_ERR_002 "Error 002. Usuario Violento. Cámbielo a los golpes"

En otro archivo por ejemplo ingles.h
#DEFINE MSG_ERR_001 "Error 001. Incorrect user. Change User"
#DEFINE MSG_ERR_002 "Error 002. Violent User. Change it to blows"

entonces en el código en lugar de poner el texto, pones la constante definida

IF hayErrorUsuario()
   MESSAGE(MSG_ERR_001, ...
ENDIF

y cuando tengas que compilar, solo cambias el archivo de inclusión y tienes una compilación con mensajes en otro idioma sin necesidad de tocar el código.

Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe

Mario López

unread,
Nov 21, 2016, 8:09:37 AM11/21/16
to Comunidad de Visual Foxpro en Español

Otro uso que se le puede dar #define es utilizarlo para delimitar un bloque de código con características especiales: por ejemplo, yo lo uso para ejecutar un bloque de código Python desde un programa VFP y también para guardar los resultados de consultas SQL complicadas y facilitar así el seguimiento y corrección de posibles errores en las mismas (más datos en este thread https://groups.google.com/d/msg/publicesvfoxpro/WvI39KIAQ3c/Y7JWtcijMfYJ ) .

HTH
Mario


francisco prieto

unread,
Nov 21, 2016, 8:13:51 AM11/21/16
to Comunidad de Visual Foxpro en Español
Muy buen uso ese Mario!

Atte,

Francisco Prieto
Message has been deleted

Elides Paredes

unread,
Nov 21, 2016, 11:12:34 AM11/21/16
to Comunidad de Visual Foxpro en Español



Estimados amigos

Saludos.

Estoy gratamente impresionado y en extremo agradecido por sus aportes, me hace aprender no solo el concepto sino la forma en que cada uno da un uso diferente a un mismo concepto.
 
Eso es algo que jamás pude haber aprendido de libros porque primero no los consigo, lo que encuentro está en inglés y aunque puedo traducirlo por lo que he aprendido del idioma normal y técnico,  y con lo que se puede hacer con traductores en internet. Para mi no es suficiente. Necesito leer mil veces, hacer pruebas y luego de muchas horas,  Lo voy llevando a lo que llamo lenguaje de terrícola normal..jajaja.. 

Cuando alguien aporta un link con conceptos, (lo cual parece sencillo, encontrar,  pero realmente no lo es) igualmente me toma mucho tiempo, cuando alguien explica de forma muy técnica y coloca ejemplos , por ejemplo del mismo VFP, con sus tablas que tiene mucho inglés, a veces confundo los nombres de las funciones, los campos, etc. Y resulta difícil. 
En éste caso tengo un poco de todo, conceptos, ejemplos, aplicaciones, etc. Estoy seguro que ésto le servirá a muchos otros que también consultan sin preguntar, como yo lo he hecho infinidad de veces. Y no queda otra que estar  agradecido y sentirme en deuda con ustedes. Muchísimas Gracias..!! 

 
Elides Paredes
Barquisimeto Venezuela


Reply all
Reply to author
Forward
0 new messages