PDA

Ver la Versión Completa : Cómo puedo hacer para que una variable valga 2 valores al mismo tiempo


wlad
23-11-2007, 15:30:44
como puedo hacer para que una variable valga 2 valores al mismo tiempo y pueda ejecutar el mismo procedure,pa esos dos distintos valores

eduarcol
23-11-2007, 15:34:11
Hola te recomiendo leas la Guia de Estilo (http://www.clubdelphi.com/foros/guiaestilo.php)

Plantea mejor tu pregunta para que te podamos ayudar, con lo que dices lo unico que se me ocurre es un arreglo, pero mientras no escribas mejor no podre darte mas datos

marcoszorrilla
23-11-2007, 15:35:03
Pues una variable solamente puede contener un valor a la vez, si nos dices que es lo que quieres lograr quizás alguién te pueda ayudar, en un principio pienso que lo quieres lo lograrías utilizando matrices.

Un Saludo.

wlad
23-11-2007, 15:49:42
este es el codigo

procedure TForm2.Image1Click(Sender: TObject);
begin
Randomize;
op:=Random(52);
edit3.Visible:=false;
case op of
0 : Mayorarp(36+random(48));
1 : menorarp(36+random(48));
2 : aumentadoarp(36+random(48));
3 : disminuidaarp(36+random(48));
4 : triMayor(36+random(48));
5 : trimenor(36+random(48));
6 : triaumentada(36+random(48));
7 : tridisminuida(36+random(48));
8 : Mayormaj7arp(36+random(48));
9 : menormaj7arp(36+random(48));
10 : triMayormaj7(36+random(48));
11 : trimenormaj7(36+random(48));
12 : triMayor7(36+random(48));
13 : trimenor7(36+random(48));
14 : Mayor7arp(36+random(48));
15 : menor7arp(36+random(48));
16 : escromatica(36+random(48));
17 : esfrigida(36+random(48));
18 : eseolicomenor(36+random(48));
19 : eslidio(36+random(48));
20 : esmixolidio(36+random(48));
21 : esdorio(36+random(48));
22 : esjonicomayor(36+random(48));
23 : eslocreo(36+random(48));
24 : esmenorarmonico(36+random(48));
25 : esmenormelodico(36+random(48));
26 : esmenorpentatonica(36+random(48));
27 : esmayorpentatonica(36+random(48));
28 : esblues (36+random(48));
29 : segmenor (36+random(48));
30 : segmayor (36+random(48));
31 : termenor (36+random(48));
32 : termayor (36+random(48));
33 : cuartajus(36+random(48));
34 : cuartaaug(36+random(48));
35 : quintajus(36+random(48));
36 : sexmenor (36+random(48));
37 : sexmayor (36+random(48));
38 : septmenor(36+random(48));
39 : septmayor(36+random(48));
40 : octava (36+random(48));
41 : armsegmenor (36+random(48));
42 : armsegmayor (36+random(48));
43 : armtermenor (36+random(48));
44 : armtermayor (36+random(48));
45 : armcuartajus(36+random(48));
46 : armcuartaaug(36+random(48));
47 : armquintajus(36+random(48));
48 : armsexmenor (36+random(48));
49 : armsexmayor (36+random(48));
50 : armseptmenor(36+random(48));
51 : armseptmayor(36+random(48));
52 : armoctava (36+random(48));
end;
caca:=op;
edit3.text:=floattostr(caca);
end;

lo que quiero es que la variable "op" q se guardo en "caca" luego se compare con "op2" para ejecutar cierto procedimiento, pero ese procedimiento debe ejecutarse cuando "op2" tome uno de edos valores.


procedure TForm2.Button9Click(Sender: TObject);
begin
if (op2=29) or (op2=41) then;
correcto:=correcto;
incorrecto:=incorrecto;
if op2=caca then
correcto:=correcto+1
else
incorrecto:=incorrecto+1;
edit1.text:=floattostr(correcto);
edit2.text:=floattostr(incorrecto);
edit3.visible:=true;
end;

eduarcol
23-11-2007, 15:54:39
Si no haces caso a las recomendaciones muy poca ayuda recibiras, encierra el codigo entre etiquetas para que sea mas legible.

Segun lo estas haciendo funciona?? no funciona??, que error te da ese codigo??

Gabo
23-11-2007, 16:13:03
No se entiende lo que quieres.
Recuerda que para que alguien se tome el tiempo de responderte, tú debes habértelo tomado para redactar bien la pregunta.

Me parece un problema de lógica...

wlad
23-11-2007, 16:17:32
mmm,la verdad es que soy nuevo en este foro,he leido el manual de estilo,pido disculpas ,si no m expresé bien en un comienzo,

con respecto al codigo ,no arroja ningun error,solo sucede un problema al ejecutar,este codigo corresponde a un entrenador auditivo ,que genera :escalas,intervalos y acordes de dos formas,arpegiados y armonicos,
lo que propone mi programa es que al ejecutar un boton genere un intervalo,una escala o acorde al azar....ese boton que genera los priocedimientos de las escas y acordes al azar,lo hace llamando los procedimientos por medio de una variable "OP" que se visualiza en toda la unidad(declarada en implementacion).luego el valor que tomo la variable, o sea de 0 a 52 se guardara en la variable "caca".por lo tanto lo que se necesita hacer,es responder a lo que se genero mediante un boton, por ejemplo si el boton que genera los procedimientos al azar ,arrojo un acorde mayor arpegiado, con un boton debiera responder tanto para cuando el acorde sea mayor arpegiado ,o mayor armonico ,o sea cuando "op" valga 0 o 4 en el codigo delphi.
entonces en el click del boton que responde a eso tiene como caption "mayor" (que sirvira para responde cuando el acorde es mayor arpegiado ,o mayor armonico)entonces al ejecutar el click del boton que se está usando para responder tiene que tener una variable que ya valga 0 o 4 , y luego se compare "op2" con la variable "caca" y si son iguales los valores guarde la respuesta en un EDIT para saber si es correcto ,si esos valores al compararse son distintos,la respuesta se guardara en el EDIT correspondiente a incorrecto...

gracias por tomarse el tiempo para leer esto..

pcicom
23-11-2007, 19:11:41
como puedo hacer para que una variable valga 2 valores al mismo tiempo y pueda ejecutar el mismo procedure,pa esos dos distintos valores


Creo Entender lo que mencionar, si es asi puedes darte una idea de como una variable puede tener 2 o mas Valores dando el formato que tu decidas:

1er Caso.



cVar := '001Juan';

Esta variable es de tipo String y puede contener 2 Valores que puedes resuperar mediante alguna Instriccion.

nNumero := strtoint(Copy(cVar,1,3)) ; // Esto seria = 1
cNombre := strtoint(Copy(cVar,4)) ; // Esto seria = Juan

Entonces en la misma Variable cVar estarias Almacenando 2 Valores..


2do Caso.


Puedes Usar Variables de tipo registro

Type record cVar
Numero:integer;
Nombre:String
end;


Y Usarla Asi.

cVar.Numero := 1;
cVar.Nombre := 'Juan';




3er Caso


Paso de Variables entre funciones con Paso de Variables por Valor

function XValor(pValor:Variant):Integer; overload;
begin
XValor := 0;
if pValor>1 then
XValor := pValor;
end;

function XValor(pValor:Variant):String; overload;
begin
XValor := '';
if pValor <> '' then
XValor := pValor;
end;

Usandola seria asi:

nSuma := nSUma + XValor(1);

cNombre := 'Perez ' + XValor('Juan');






4o Caso



procedure XValor(pValor:Integer);
begin
pValor := pValor + 100;
end;


Usandola seria asi:

x := 50; // x = 50
xValor(x); // x= 150

Si checas el Valor de X cambio al pasarla por la Funcion..


Este ejemplo se aplica muy sencillamente en el caso de una funcion para
obtener el factorial de un Numero donde utilizar la recursividad para resolver
el valor usando y cambiando el valor de la variable una y otra vez..



function Fact(nValor:integer):integer;
begin
if nValor < 1 then Result := 1
else Result := nValor * Fact(nValor-1) ;
end;



Ejecutandolo seria

showmessage('El Factorial de 5 = ',inttostr(Fact(5)));

// Si checas en la Misma Funcion cambia el Valor de la variable nValor





ESPERO TE SIRVE UN POCO DE AYUDA...

marcoszorrilla
24-11-2007, 10:59:23
cVar := '001Juan';

Esta variable es de tipo String y puede contener 2 Valores que puedes resuperar mediante alguna Instriccion.

nNumero := strtoint(Copy(cVar,1,3)) ; // Esto seria = 1
cNombre := strtoint(Copy(cVar,4)) ; // Esto seria = Juan

Entonces en la misma Variable cVar estarias Almacenando 2 Valores..


Que conste que ya había considerado este caso, pero consideré y sigo haciéndolo que la variable solamente contiene un valor, otra cosa es que nosotros los descompongamos posteriormente.

Un Saludo.

courtois
01-12-2007, 10:13:08
Estoy de acuerdo con marcos, tecnicamente, la variable contiene un solo valor, operativamente ese valor puede representar mas de una cosa... por otro lado no entiendo para que se desea que una variable pueda tener 2 valores simultaneamente si el procedimiento se ejecuta con un valor o con el otro y no precisamente con los 2 al mismo tiempo

jefferson
02-12-2007, 23:09:49
mira hermano lo que pasa es que es primera vez que estoy en este foro. pero la verdad es que necesito conocer aceca de delphi, porque me toca ver esa materia el semestre que viene, entonces necesito unas baces.

nota: sera que me puedes mandar elguna informacion direccion o documento en el cual yo conosca lo bacico de delphi.
puedes mandarlo a este correo jeffermosquera@hotmail.com

telo agradesco.

ArdiIIa
03-12-2007, 00:37:51
nota: sera que me puedes mandar elguna informacion direccion o documento en el cual yo conosca lo bacico de delphi.
puedes mandarlo a este correo jeffermosquera@hotmail.com

telo agradesco.


Prueba con la Cara Oculta de Delphi (http://www.terawiki.clubdelphi.com/Delphi-Win32/Libros/)

nota1:Mi corrector ortográfico se ha bloqueado a leer todas la palabras subrayadas de tu post anterior.

nota2: No es muy sano pedir las cosas para que las envíen por correo, de este modo si hay una solución y se publica en el foro, cualquier otra persona con la misma duda puede encontrar la ayuda necesaria.

angeluz
19-12-2007, 13:55:02
Lo que puedes hacer es declarar una arreglo de largo 2, donde en la primera posición guardes el primer valor y luego en la segunda posición guardes el segundo valor….

El código seria el siguiente.

//------------------------------------------------

procedure Run;
var
a: array of String;
begin
SetLength(a, 2); //Defines el largo del arreglo
a[0] := 'Valor_1'; //Asignas el valor 1
a[1] := 'Valor_2'; //Asignar el valor 2

Writeln(a[0]); // Muestra la valiable 1 "Valor_1"
end;

//------------------------------------------------


Espero te sirva
Saludos.

mamcx
19-12-2007, 17:14:56
Lo que pasa es que quieres meter un cuadrado en un circulo. En Apolo 13 lo hicieron, pero eran los cientificos de la NASA. ;)

Hay algunos tips elementales para programar:

- Las funciones deben ser "cortas" con anidaciones que ojala no sean muy profundas.
- Una variable para cada cosa. Y solo una cosa a la vez
- Las variables son del tipo de datos preciso, en los lenguajes donde sea posible
- Un codigo bien escrito deberia poder leerse sin la necesidad de comentarios. Para ello:
-- Los nombres deberian de ser claros , anular el deseo de usar abreviaciones a menos que la abreviacion sea la forma mas clara de expresarlo
-- Buena identacion y en el caso de nombres compuestos decidirse por el estilo NombreCompuesto (nota las mayusculas) o Nombre_compuesto o nombreCompuesto. Lo importante es que sea obvia la division.
-- Utilizar bien la identacion, y apegarse a ella. Te recomiendo que adoptes un estilo de formateo de codigo. El oficial es http://dn.codegear.com/article/10280 (aunque los comentarios tan decorados no son practicos, el resto es Ok)

Y del ZEN de python (http://mundogeek.net/archivos/2007/07/02/el-zen-de-python/) aplica:

2. Explícito es mejor que implícito.

cVar es de naturaleza implicita y varia su significado. Eso es casi como tener una variable global.


Cuando se necesita una variable mutante se usa un VARIANT o un variable empaquetada como un array, record, o mi favorita, una clase poliformica. Por ejemplo:

TValor=class
public
Valor:Variant;
function Recuperar
begin
//Escribir aqui como se decide que se devuelve esto o aquello. Al ponerlo como una funcion queda explicito en codigo que el valor es poliformico y que regla se sigue para recuperarlo. Ej: Al devolver el precio de un producto, hay una regla que determina que es o no con impuesto.
end;


7. La legibilidad cuenta.

No es legible el codigo. No esta bien identado y a juzgar por las respuestas, fue dificil darse cuenta para todos de que trataba. Debido a lo especializado de tu codigo (y quizas esas abreviaturas tengan sentido en el ambito que se mueve) la unica forma de volverlo legible es con una nota de que es eso ;)

Tambien te recomiendo que sigas el consejo de las palabras compuestas.

8. Los casos especiales no son suficientemente especiales como para romper las reglas.

Darle muchos significados a una variable por ahorrarse una declaracion tiende a complicar la logica.

9. Aunque lo pragmático gana a la pureza.

Solo es practico usar una vbl poliformica para algo que es de naturaleza poliformica. No como atajos

12. Cuando te enfrentes a la ambigüedad, rechaza la tentación de adivinar.

O sea, si hay que adivinar, el codigo tiene un defecto de diseño!

13. Debería haber una -- y preferiblemente sólo una -- manera obvia de hacerlo.
17. Si la implementación es difícil de explicar, es una mala idea.
18. Si la implementación es sencilla de explicar, puede que sea una buena idea.

;)

mamcx
19-12-2007, 17:16:01
P.D. Porque no funciona la etiqueta delphi?

maeyanes
19-12-2007, 18:06:03
Hola mamcx...

Están deshabilitadas temporalmente en lo que actualizan algunos módulos del foro...


Saludos...