• Sábado 11 de Mayo de 2024, 20:26

Autor Tema:  Pregunta  (Leído 4898 veces)

Devilcpc

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Pregunta
« en: Jueves 26 de Agosto de 2004, 21:11 »
0
buenas

necesito hacer un while q se ejecute hasta q el usuario presione un boton (button1), queria saber q condicion le tengo q poner al while

ej:
while (No se presiona el boton)
{



}

si no me explique bien avisenmen, gracias

Saludos
-- Solo se q no se nada, pero aun supero a la generalidad de todos los hombres q no saben eso tampoco --

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pregunta
« Respuesta #1 en: Viernes 27 de Agosto de 2004, 07:36 »
0
Podes usar una variable booleana (que puede tener dos valores, TRUE o FALSE).

BOOL BotonPresionado = false;

Y en el evento de click del botón poner BotonPresionado = true;

while (BotonPresionado == false)
{
  //codigo que se ejecutara despues de que presionen el boton
  BotonPresionado = false; //para no volver a ejecutarse hasta que se presione el boton
}

No es muy eficiente pero no entiendo que queres realmente.

 :hola:  :ph34r:  :comp:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Hodoacro

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Pregunta
« Respuesta #2 en: Martes 7 de Septiembre de 2004, 11:16 »
0
Creo que la solución que te ha dado nuestro colega no te va a servir, ya que mientras que esté en ejecución cualquier bucle (no solo el While) de tu programa los eventos de los diferente controles no están en activo, de hecho, el programa parecerá colgado y no hará nada.

Si deseas que un buque este en activo mientras que el usuario no pulse algún botón (me imagino que eso es lo que quieres), una de las soluciones es  incluir un objeto TTimer. Este objeto activa una hilo paralelo de ejecución que es visitado cada cierto tiempo.  A partir de este objeto se puede ejecutar cualquier función para hacer lo que sea. Lo bueno de este objeto es que no para la ejecución del hilo principal del programa y los eventos de los controles estarán en activo. De esta forma puedes usar una variable bool que se active cuando pulses el botón deseado. Sólo tienes que consultar esta variable en la función o funciones asociadas al hilo de ejecución generado por TTimer....., y ya lo tienes.

Revisa la información de TTimer, puede ser la solución.

Devilcpc

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Re: Pregunta
« Respuesta #3 en: Martes 7 de Septiembre de 2004, 23:19 »
0
muchas gracias por la respuesta

efectivamente eso es lo q me pasa, el programa me queda colgado

eso era lo q queria saber, hace poco estube averiguando y me dijeron lo mismo q tengo q aprender a trabajar con hilos y con TTimer, si tendiras alguna informacion de como usarlos, alguna pagina web o algo, me seria muy util...

Gracias de nuevo

Adrian
-- Solo se q no se nada, pero aun supero a la generalidad de todos los hombres q no saben eso tampoco --

Hodoacro

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Pregunta
« Respuesta #4 en: Miércoles 8 de Septiembre de 2004, 09:43 »
0
La verdad es que no tengo idea de donde puedes encontrar información de este tema, yo me ayudo de un libro de Anaya multimedia llamado Programación en C++ Builder. Te doy los datos ya que es el libro es español, que yo conozca, que tiene la información más extensa sobre este y otros temas. Es para el Builder 1 pero te sirve para cualquier otra versión.

Nombre: Programación en C++ Builder (adquiera los fundamentos básicos de programación).
Editorial : Anaya Multimedia.
Autor: Francisco Charte.
ISBS : 84-415-0203-X

El problema es que es del 1997 y no sé si seguiran vendiéndolo.

De todas formas utilizar TTimer no es nada complicado:

Create un Objeto TTimer, bien insertandolo desde el editor (desde la pestaña System) o creandolo en tiempo de ejecucion.

El objeto tiene dos propiedades significativas.

Interval: Que determina cada cuantos milisegundo será visitado el objeto.
Enabled: Que activa y/o desactiva el objeto.

Tiene un sólo evento :

OnTimer: La función asociada a este evento será la que se ejecutará cada "Interval" milisegundos.

A partir de la función asociada a OnTimer puedes llamar a cualquier otra función o funciones del mismo programa. Las funciones que se ejecutan desde TTimer no tienen nada de especial, son funciones normales, solo tienen la salvedad de ser ejecutadas cada cierto tiempo.

Para activar/desactivar el objeto usa TTimer->Enabled=true o false.

Espero que te sirva.

Devilcpc

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Re: Pregunta
« Respuesta #5 en: Miércoles 8 de Septiembre de 2004, 20:31 »
0
ok, gracias por la informacion

ya q estoy te hago otra pregunta:

estoy haciendo un trabajo para la facultad (2° año de ing electronica), y elegimos hacer el control de alarma y manejo de una casa
en una seccion el usuario puede elegir q las luces de la casa se prendan y se apagen a una hora determinada, la parte de prender y apagar luces ya se como hacerla, mi duda es como hacer q se active y desactive a la hora determinada
supongo q es tambien con el TTimer, pero como le pongo el principio y el fin?

espero q me hayas entendido, sino decime y me trato de explicar mejor

Saludos
-- Solo se q no se nada, pero aun supero a la generalidad de todos los hombres q no saben eso tampoco --

Hodoacro

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Pregunta
« Respuesta #6 en: Jueves 9 de Septiembre de 2004, 09:55 »
0
Efectivamente tienes que utilizar un objeto TTimer que sea visitado cada cierto tiempo, Si quieres ser muy exacto podría ponerle un intervalo de menos de un segundo, pero puedes ponerlo que se visite cada 5 segundos, por ejemplo (TTimer->Interval=5000).

create dos variables del formato de hora, existe gran canitidad de tipos de estas variables, una de ellas, que esta definida en "dos.h" es :

struct time {
   unsigned char ti_min;      /* minutes */
   unsigned char ti_hour;     /* hours */
   unsigned char ti_hund;     /* hundredths of seconds */
   unsigned char ti_sec;      /* seconds */
};

esta estrucutura es usada por funciones como :

void gettime(struct time *timep);
void settime(struct time *timep);

Create dos variables de este tipo, por ejemplo, HoraComienzo y HoraFin, que sean rellenadas en las dos funciones asociadas a los botones hora comienzo y hora final.

create una función que tendrás que asociar al evento OnTimer del Objeto TTimer, que es la que va a comparar la hora actual con estos dos variables:

FuncionXxx(){

struct time TActual;

GetTime (&TActual); // pilla la hora actual del sistema

// ---- a partir de aquí compara los datos TActual con los de HoraComienzo y HoraFin

..
..
..
}

Espero que te sirva.

Devilcpc

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Re: Pregunta
« Respuesta #7 en: Viernes 10 de Septiembre de 2004, 22:09 »
0
buenas

estoy trabajando en esto y tengo algunas dudas, en vez de usar la libreria dos.h uso la time.h y las variables son asi:
Código: Text
  1.  
  2.       TTime HoraEncendido;
  3.       TTime HoraApagado;
  4.       TTime HoraActual;
  5.  
  6.  
despues le pongo el valor del campo y voy al TTimer:
Código: Text
  1.  
  2.     HoraEncendido = CmpEncender->Text;
  3.     HoraApagado = CmpApagar->Text;
  4.     TimerLuces->Enabled = true;  
  5.  
  6.  
y en el Evento OnTimer del TTimer:
Código: Text
  1.  
  2.    HoraActual = Time();
  3.    if (HoraEncendido == HoraActual)
  4.     Outport(FrmDireccion->PDirOut,2);
  5.    if (HoraApagado == HoraActual)
  6.    {
  7.      Outport(FrmDireccion->PDirOut,0);
  8.      TimerLuces->Enabled = false;
  9.    }
  10.  
  11.  
no me da error pero no se prende el led seleccionado, creo q la comparacion no funciona bien
 <_<
-- Solo se q no se nada, pero aun supero a la generalidad de todos los hombres q no saben eso tampoco --

Hodoacro

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Pregunta
« Respuesta #8 en: Martes 14 de Septiembre de 2004, 13:58 »
0
Eso es lo que te pasa, no puedes comparar datos complejos (la hora lo es), como si fueran datos simples (con un '=='). Bueno, existe esa posiblidad, pero pasa por crearte tu propio objeto THora y sobracargar operadores, etc..

Pregúntate qué es el objeto TTime. No sé exactamente su naturaleza pero nomarmente será una estructura o clase que tendrá propiedades como TTimer->Hour, TTimer->Minutes, etc...

Las comparaciones serían más o menos así (suponiendo que TTime tengan propidades como las que te he referido anteriormente):

Código: Text
  1. // control de encendido
  2. if (TimerLuces->Enabled=false)
  3.    if (HoraEncendido->Hour<=HoraActual->Hour)
  4.       if (HoraEncendido->Minutes=HoraActual->Minute)
  5.          if (HoraEncendido->Secon<=HoraActual->Secon){
  6.             Outport(FrmDireccion->PDirOut,2);
  7.             TimerLuces->Enabled = true;
  8.          }
  9.  
  10.  
  11. // control de apagado
  12. if (TimerLuces->Enabled=false)
  13.    if (HoraApagado->Hour>=HoraActual->Hour)
  14.      if (HoraApagado->Minute>=HoraActual->Minute)
  15.         if (HoraApagado->Secon>=HoraActual->Secon){
  16.              Outport(FrmDireccion->PDirOut,0);
  17.               TimerLuces->Enabled = false;
  18.         }
  19.  

Échale un vistazo a la estructura TTime.

Hodoacro

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Pregunta
« Respuesta #9 en: Martes 14 de Septiembre de 2004, 14:03 »
0
Perdona pero he visto algun bichito en el código.

Te lo paso de nuevo:

Código: Text
  1. // control de encendido
  2. if (TimerLuces->Enabled==false) // la cambiada
  3.   if (HoraEncendido->Hour<=HoraActual->Hour)
  4.      if (HoraEncendido->Minutes=HoraActual->Minute)
  5.         if (HoraEncendido->Secon<=HoraActual->Secon){
  6.            Outport(FrmDireccion->PDirOut,2);
  7.            TimerLuces->Enabled = true;
  8.         }
  9.  
  10.  
  11. // control de apagado
  12. if (TimerLuces->Enabled==true) // otra mas
  13.   if (HoraApagado->Hour>=HoraActual->Hour)
  14.     if (HoraApagado->Minute>=HoraActual->Minute)
  15.        if (HoraApagado->Secon>=HoraActual->Secon){
  16.             Outport(FrmDireccion->PDirOut,0);
  17.              TimerLuces->Enabled = false;
  18.        }
  19.  

Ahora creo que está bien

Devilcpc

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Re: Pregunta
« Respuesta #10 en: Miércoles 15 de Septiembre de 2004, 21:17 »
0
buenas de nuevo

mira, te cuento q no me funciona eso q me dijiste porque apenas pongo HoraEncendido-> me da el error:

[C++ Error] luces.cpp(134): E2288 Pointer to structure required on left side of -> or ->*  :lightsabre:

si tenes alguna idea por favor contestame

Saludos
-- Solo se q no se nada, pero aun supero a la generalidad de todos los hombres q no saben eso tampoco --

AURED

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Pregunta
« Respuesta #11 en: Jueves 16 de Septiembre de 2004, 00:31 »
0
Normal, eso te ocurrirá siempre que crees tu variable de la forma siguiente

TTime HoraEncendido;

Para poder acceder a ella con el -> tienes que crearla dinámicamente.
TTime* HoraEncendido

y luego en el evento que corresponda....

HoraEncedido=new TTime;
HoraEncendido->miembrox=.......

Si quieres declarar tu variable del modo original para acceder a los miembros de la clase usa el punto . en vez de la flecha ->
"Es mejor saber después de haber pensado y discutido que aceptar los saberes que nadie discute para no tener que pensar"

Devilcpc

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Re: Pregunta
« Respuesta #12 en: Jueves 16 de Septiembre de 2004, 18:11 »
0
ok, gracias por la ayuda

de todos modos cuando uso el punto  me aparecen muchas propiedades pero ninguna en la q me tome por separado la hora de los minutos y los segundos
como: HoraEncendido.minutos, hay alguna forma de hacerlo??
-- Solo se q no se nada, pero aun supero a la generalidad de todos los hombres q no saben eso tampoco --

AURED

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Pregunta
« Respuesta #13 en: Viernes 17 de Septiembre de 2004, 02:18 »
0
Lo lamento, pero el error en tu código ha de estar en otro sitio, si que puedes comparar datos TTime entre si, pues el operador == está sobrecargado en esa clase.

He probado esto y funciona a la perfección:

Código: Text
  1.  
  2. Hora1=Edit1->Text;
  3. Hora2=Edit2->Text;
  4. if(Hora1==Hora2)
  5. ShowMessage("Son iguales");
  6. else
  7. ShowMessage("No son iguales");
  8.  
  9.  

Busca en otro sitio, el error no está en comparar dos datos TTIME, se puede.

No sé pero quizá esté el error en el intervalo que pones al Timer, si por ejemplo va de 5 en 5 segundos y la hora actual pasa de 12/02/03 16:01:00 a 12/02/03 16:01:05 y coincide que la hora de encendido es 12/02/03 16:01:02 jamás se te cumplirán las condiciones.

Si quieres que el led de encendido esté prendiendo siempre que se haya superado la hora de encendido y el de apagado lo respectivo usa en vez de comparadores ==, <= o >= según corresponda.
"Es mejor saber después de haber pensado y discutido que aceptar los saberes que nadie discute para no tener que pensar"

AURED

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Pregunta
« Respuesta #14 en: Viernes 17 de Septiembre de 2004, 02:31 »
0
Estaba pensando...si comparas en cada ontimer y se nciende solo si la hora actual es IGUAL a la hora prefijada solo se encenderá durante un instante muy pequeño ¿no? en el siguiente ontimer ya no sé cumpliría...

No deberías plantertelo mjeor así?

si hora encendido<= hora actual<hora apagado)
"Hagase la luz y que se mantenga"
si no
"Apaga y vamonos y no enciendas la luz de nuevo"
"Es mejor saber después de haber pensado y discutido que aceptar los saberes que nadie discute para no tener que pensar"