MacroSustitución

02/06/2005 - 11:25 por JuanilloFox | Informe spam
Hola grupo,

Tengo el siguiente problema a la hora de implementar lo que en Visual Foxpro
se llama MacroSustitución y la verdad no se como implementarlo en C#.

En principio tengo una serie de TexBox que forman una matriz.

txtC1T1 , txtC1T2, ... , txtC2T1, txtC2T2, ..., txtCnTm.

la idea es crear un bucle para hacer referencia a cada uno de ellos.

string cTexBox = "";
string ci = "";
string cj = "";
for (int i = 1 ; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
ci = Convert.ToString(i);
cj = Convert.ToString(j);
cTexBox = "txtC" + ci + "T" + cj;
&cTexBox = "Este es el TexBox" + ci + "," + cj; // Esto sería en
FoxPro
(&cTexBox.Text. ¿Cómo se realizaría
en C#?
}
}

Gracias
Un saludo

juanillofox@andujar.com

Preguntas similare

Leer las respuestas

#6 JuanilloFox
03/06/2005 - 10:22 | Informe spam
Hola Tristan,

Creo que la cosa es más sencilla de lo que la planteais. Voy a ver si me
explico y se puede entender.

Imaginemos que tengo definido...

string c1t1, c1t2, c1t3, ..., cntm;

Si yo quiero introducir valores en las cadenas definidas sin tener que
referenciarlas manualmente podría poner...

string cj, ck;
for (int j=1 ; j < 16; j++)
{
cj = Convert.ToString(j);
for (int k = 1; k < 16; k++)
{
ck = Convert.ToString(k);
// Cómo puedo referenciar ("c" + cj + "t" + ck) para introducirle un
valor...
("c" + cj + "t" + ck) = "Un valor" // Se que está mal.

// En Visual FoxPro me definiría una variable...
string mivariable = "c" + cj + "t" + ck // y le asigaria un valor
mediante...
&mivariable = "Un Valor" // con lo que tendría asignado en c1t1 "Un Valor" por ejemplo
}
}

Esto pasaría igual con los TextBox y Label de mi página ASP. en la
asignación de la propiedad Text.

Si tenéis alguna duda podéis comentarla aunque creo que me he explicado...

Un saludo


Respuesta Responder a este mensaje
#7 Tristan
03/06/2005 - 13:32 | Informe spam
No Juanillo, es que creo que no me has entendido tú.

No existe forma de hacer macrosustituciones en C#. C# es un lenguaje
compilado, no un lenguaje interpretado o pseudo-compilado como FoxPro. En los
lenguajes VERDADERAMENTE compilados, no se puede hacer lo que dices, puesto
que eso consiste en ejecutar código que no se conoce en tiempo de
compilación, es decir eso es propio de un intérprete.

Por lo demás, tal y como te digo, en el ejemplo que propones no hay ninguna
ventaja a la hora de utilizar macrosustituciones. Lo que dices, se puede y se
DEBE realizar mediante arrays. Aunque tu lenguaje lo admita, nunca debes
depender del tiempo de ejecución si puedes depender del tiempo de
compilación. Las aplicaciones basadas en macrosustitución son poco eficientes
y muy difíciles de mantener, puesto que los errores solo se detectan en
tiempo de ejecución.

Pero de verdad, te recomiendo que leas los ejemplos que te he expuesto. Te
muestran muchas formas de hacer lo que quieres. Incluso una por la que
obtienes un control a través de un string. Pero siempre es mejor con arrays,
a no ser no sea posible.


Juan Carlos Badiola Saiz
MVP - C#


"JuanilloFox" wrote:

Hola Tristan,

Creo que la cosa es más sencilla de lo que la planteais. Voy a ver si me
explico y se puede entender.

Imaginemos que tengo definido...

string c1t1, c1t2, c1t3, ..., cntm;

Si yo quiero introducir valores en las cadenas definidas sin tener que
referenciarlas manualmente podría poner...

string cj, ck;
for (int j=1 ; j < 16; j++)
{
cj = Convert.ToString(j);
for (int k = 1; k < 16; k++)
{
ck = Convert.ToString(k);
// Cómo puedo referenciar ("c" + cj + "t" + ck) para introducirle un
valor...
("c" + cj + "t" + ck) = "Un valor" // Se que está mal.

// En Visual FoxPro me definiría una variable...
string mivariable = "c" + cj + "t" + ck // y le asigaria un valor
mediante...
&mivariable = "Un Valor" // con lo que tendría asignado en c1t1 > "Un Valor" por ejemplo
}
}

Esto pasaría igual con los TextBox y Label de mi página ASP. en la
asignación de la propiedad Text.

Si tenéis alguna duda podéis comentarla aunque creo que me he explicado...

Un saludo









Respuesta Responder a este mensaje
#8 Tristan
03/06/2005 - 13:58 | Informe spam
Por cierto. Conozco perfectamente lo que son las macrosustituciones. Lo que
ocurre es que me gustaría hacerte ver por que no son ni necesarias ni
convenientes.

En el ejemplo que has expuesto, la forma eficiente y robusta de hacer las
cosas sería:

En lugar de:

string c1t1, c1t2, c1t3, ..., cntm;



string[,] s = new string[n, m];

Y ahora si quieres referenciarlas:

for (int j=1 ; j < 16; j++)
{
for (int k = 1; k < 16; k++)
{
// Cómo puedo referenciar ("c" + cj + "t" + ck) para introducirle un
valor...
s[j, k] = "Un valor";
}
}

Las macrosustituciones no aportan ninguna ventaja en ese caso. Por el
contrario sería una forma deficiente de hacer las cosas. Por un lado necesita
conversiones de tipo, por otro es MUY poco eficiente; obliga a interpretar el
código. Por otro lado y es lo más importante, es muy poco robusto, puesto que
no detecta errores en tiempo de compilación que podrían ser detectados
fácilmente utilizando arrays.

Esto mismo es aplicable a controles.

Sin embargo, existen unas pocas situaciones en las que es necesario ejecutar
código creado en tiempo de ejecución. Dejé una clase hace poco para hacer
esto en C#. Pero vamos, jamás recomendaría utilizar algo así en un caso que
se puede resolver tan fácilmente con arrays.

Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
#9 JuanilloFox
06/06/2005 - 07:57 | Informe spam
Hola Tristan,

Gracias por contestar.

Te he puesto un ejemplo sencillo con string para que se comprendiera más o
menos lo que necesito ya se que en este tipo de casos la forma más viable es
utilizar matrices directamente, pero en verdad, son con TextBox y Label del
formulario con lo que me voy a mover y para eso tengo que hacer referencia a
dicho control de alguna.

Para qie te hagas una idea tengo una matriz con 15 filas por 15 columnas de
TextBox, otras dos filas de 15 elementos cada una de Label. ¿cual es la
forma de recorrerme dichos controles para cambiar en uno o varios elementos
la propiedad text?

Para hacer referencia a un textbox no se me permite porner

"txtC"+n+"T"+m.Text = "Un valor"

Por otra parte yo migro desde VFP que como bien dices es Seudo-compilador,
la forma de referenciar a controles es de esta forma "&" y también con la
función "Evaluate()" que nos permite realizar la sentencia anterior de la
forma que he plasmado.

Evaluate("txtC"+n+"T"+m.Text = "Un valor") devolviendo true si se ha
realizado con éxito la asignación o false caso contrario.

¿Ves un poco más claro lo que necesito hacer? Si es así por favor aclárame
como podría realizar esto en C#
Respuesta Responder a este mensaje
#10 Tristan
06/06/2005 - 11:36 | Informe spam
Para qie te hagas una idea tengo una matriz con 15 filas por 15 columnas de
TextBox, otras dos filas de 15 elementos cada una de Label. ¿cual es la
forma de recorrerme dichos controles para cambiar en uno o varios elementos
la propiedad text?

Para hacer referencia a un textbox no se me permite porner

"txtC"+n+"T"+m.Text = "Un valor"



Es que para ese caso precisamente te dejé un ejemplo. Te recomiendo que
repases los anteriores mensajes que te he dejado. Te expongo en ellos varios
ejemplos de como debes hacer exactamente eso que quieres. Posiblemente,
puesto que solo estabas buscando la forma de hacer macrosustituciones, no te
has fijado bien en lo que quería decir en mis mensajes.

En los mensajes anteriores te expongo dos maneras de hacer las cosas. Para
cada una con su ejemplo:

1) Almacenar los controles en un array. Sería lo mismo que lo de antes con
strings. A su vez hay dos formas de almacenarlos en el array:

- Olvidar los controles creados en tiempo de diseño. Crear los
controles por código en un bucle tal y como te puse en un ejemplo. Cada uno
de estos controles se guarda en el array.

- Utilizar los controles creados en tiempo de diseño, pero guardarlos
en un array en una sentencia del tipo:
dim matriz(,) as TextBox={{txtC1T1, txtC1T2, ...},{txtC2T1,...}...}

2) Acceder a los controles por el nombre como string desde código. Te puse
una función GetField que servia para eso.


De todas esta formas, te recomiendo la del array creando los controles por
código. Fíjate bien en mi ejemplo.

Juan Carlos Badiola Saiz
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida