Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Cómo puedo hacer para que una variable valga 2 valores al mismo tiempo (https://www.clubdelphi.com/foros/showthread.php?t=50637)

wlad 23-11-2007 15:30:44

Cómo puedo hacer para que una variable valga 2 valores al mismo tiempo
 
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

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
Código Delphi [-]
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.

Código Delphi [-]
 
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

Cita:

Empezado por wlad (Mensaje 247971)
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.

Código:


      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.
Código:


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
Código:


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

Código:


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

Cita:

Código Delphi [-]
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

colavorame
 
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

Cita:

Empezado por jefferson (Mensaje 249904)
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

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/0...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:
Código Delphi [-]
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...


La franja horaria es GMT +2. Ahora son las 18:51:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi