| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mar 17 Abr, 2007 10:53 pm Asunto: CkeckBox e Image |
|
|
Hola:
Tengo un pequeño problemita al intentar activar un checkbox haciento clic en una TImage.
El código es el siguiente:
| Código: | void __fastcall TForm1::Image0Click(TObject *Sender)
{
if(CheckBox1->Checked)CheckBox1->Checked=false;
CheckBox0->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
if(CheckBox0->Checked)CheckBox0->Checked=false;
CheckBox1->Checked=true;
}
|
Como veréis, el código esta implementado en el onclick de cada timage y de cada checkbox. En teoria debería hacer que se clicle el checkbox correspondiente al hacer clic en la image o en el checkbox y desactivar el otro. Pero el programa entra en un bucle sin fin activando y desactivando los 2 checkbox.
No puedo (o no se) usar radiobutton puesto que la imagen y el check deben estar juntitos.
Saludos, Bosoft |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 18 Abr, 2007 7:22 am Asunto: Re: CkeckBox e Image |
|
|
| bosoft escribió: | | Código: | void __fastcall TForm1::Image0Click(TObject *Sender)
{
if(CheckBox1->Checked)
CheckBox1->Checked=false;
CheckBox0->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
if(CheckBox0->Checked)
CheckBox0->Checked=false;
CheckBox1->Checked=true;
} |
|
Simplifica un poco el código. Si siempre que pulses en TImage0 vas a desactivar TImage1, yo lo haría así:
| Código: | void __fastcall TForm1::Image0Click(TObject *Sender)
{
CheckBox1->Checked=false;
CheckBox0->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
CheckBox0->Checked=false;
CheckBox1->Checked=true;
}
//--------------------------------------------------------------------------- |
Al fin y al cabo, si vas a desactivar los CheckBox, no tiene sentido que preguntes por su estado. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 18 Abr, 2007 7:41 am Asunto: |
|
|
yaya, pero hace lo mismo. Ya lo habia hecho y crei que no entraraia en bucle si ponia el if, y al hacer la pregunta se me quedo el codigo.
A ti que te gustan estas cositas ¿lo has probado?
Gracias
Saludos, bosoft |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 18 Abr, 2007 11:14 am Asunto: |
|
|
No, la verdad es que no lo he probado pero tengo hechas cosas similares con otros elementos y me funcionan bien.
Me he creado un proyecto con dos TImage y dos TCheckBox, y me ha funcionado bien con los eventos OnClick del TImage, pero sí me entraba en un bucle hasta saturar la pila de llamadas si asignaba estos eventos en los CheckBox; es decir: si ponía en el OnClick del CheckBox1 Image1Click, etc. En este caso, sí entraba en bucle, pero sólo con los OnClick de los TImage funciona bien.
| Código: | //---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
CheckBox1->Checked = true;
CheckBox2->Checked = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image2Click(TObject *Sender)
{
CheckBox1->Checked = false;
CheckBox2->Checked = true;
}
//--------------------------------------------------------------------------- |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 18 Abr, 2007 1:35 pm Asunto: |
|
|
| Angel escribió: |
Me he creado un proyecto con dos TImage y dos TCheckBox, y me ha funcionado bien con los eventos OnClick del TImage, pero sí me entraba en un bucle hasta saturar la pila de llamadas si asignaba estos eventos en los CheckBox; es decir: si ponía en el OnClick del CheckBox1 Image1Click, etc. En este caso, sí entraba en bucle, pero sólo con los OnClick de los TImage funciona bien.
|
ese es el problema. He pensado en poner otro código en el checkbox pero no acaba de chutar. tienes que pulsar en el check 2 veces para activarlo.
| Código: | void __fastcall TForm1::Image0Click(TObject *Sender)
{
CheckBox1->Checked=false;
CheckBox0->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
CheckBox0->Checked=false;
CheckBox1->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox0Click(TObject *Sender)
{
CheckBox1->Checked=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
CheckBox0->Checked=false;
}
|
¿Alguna idea?
Gracias Angel
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Jue 19 Abr, 2007 2:08 am Asunto: |
|
|
Hola bosoft
Segun lo que veo es que siempre ocasionaras el ciclo con ese metodo, ademas que en el evento onclic del checkbox no es necesario que le coloques el codigo respectivo acerca de ponerle o no un ticket, eso automaticmante lo hace...
Ahora cuando tu mediante el codigo en el Image activas o desactivas el Ticket no estoy muy seguro pero creo que en ese instante salta tambien el evento onclic del checkbox, por lo que si te das cuenta activas con la imagen y se genera el evento onclic, en este evento tambien activas o desactivas y por consiguiente se vuelve a activar el evento onclic y asi hasta el infinito y mas alllaaaaa... jejeje...
Bueno espero haberte ayudado por lo menos un poco, yo tenia un problema parecido por lo que opte por eliminar cualquier activacion o desactivacion del ticket en el evento onclic del mismo... ya que esta operacion se realiza pues automaticamente.
Hasta la proxima y suerte en lo que haces ya nos comentaras como te fue _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 19 Abr, 2007 7:52 am Asunto: |
|
|
Lo que te dice Raúl te lo iba a postear ahora porque en las pruebas que he hecho me he dado cuenta que ocurre eso: al poner Checked a true automáticamente salta el OnClick del CheckBox. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 19 Abr, 2007 12:48 pm Asunto: |
|
|
ese era el problema. Pero quiero que en la aplicación, si pinchan en la imagen o en el check, quede claro la opción elegida (solo una tipo radiobox)
¿alguna idea?
No precisamente debe tener checkbox ni Image. Pero debe quedar claro que opción de las 4 esta activada (solo una) y poder ver un dibujito.
gracias a los 2
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Vie 27 Abr, 2007 1:21 am Asunto: |
|
|
Hola Bosoft...
Jugando un poco con el builder bueno hice dos aplicaciones uno que usa varios CheckBox, y otro que usa un RadioGroup (Pueden ser con varios RadioButton pero el codigo sería largo).
El primero es una aplicación con las funcionalidades del los CheckBox o sea se pueden ir activando y desactivando varios CheckBox, junto con esta operación pues las imagenes van cambiando una a una.
El otro pues como te lo dije usa un RadioGroup la diferencia con el anterior esta en que solo tienes un item seleccionado por lo tanto solo tienes una imagen cambiada, trate de hacerlo con checkBox pero no me funciono , pero bueno aprovechando que tu pregunta esta muy practica pues la he convertido en dos tutos que te explican paso a paso que debes de hacer, por otro lado tambien hay una opcion para descargar un arhcivo ZIP el cual contiene los dos programas mas el codigo fuente.
Las direcciones para los tutos son:
CheckBox http://es.geocities.com/sejasraul/bcb0006.html
RadioGroup http://es.geocities.com/sejasraul/bcb0007.html
Luego me cuentas que novedades y como te ha ido, espero que no sea demasiado tarde... un saludo... tu amigo: [/url] _________________
 |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 27 Abr, 2007 1:25 pm Asunto: |
|
|
Gracias por tus ideas Raúl, pero se trataba de ver siempre las imágenes y al pulsar en alguna que se activara el checkbox. Con Radiobutton no lo probé.
Mi solución ha sido poner 4 Tspeedbutton en grupo. Como este componente puede albergar un bitmap, me sirve y ademas cuando están e grupo solo hay uno Down.
Gracias a todos
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Vie 27 Abr, 2007 5:19 pm Asunto: |
|
|
Hola, te explicaré una técnica q suelo yo utilizar a menudo cuando prerelleno formularios cuyos controles tienen eventos asignados como los que comentas (o los TEdit el onchange...) y es usar una variable para controlar si la asignacion la estoy haciendo yo por código o es el usuario el que esta modificando en cuyo caso si tengo que hacer algo...
en el .h del form bajo el private creo la variable
luego en el .cpp
| Código: |
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
lY = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
lY = false;
CheckBox1->Checked = true;
CheckBox2->Checked = false;
lY = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image2Click(TObject *Sender)
{
lY = false;
CheckBox1->Checked = false;
CheckBox2->Checked = true;
lY = true;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox0Click(TObject *Sender)
{
if (lY) CheckBox1->Checked=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if (lY) CheckBox0->Checked=false;
}
|
De esta forma evistas que entre en un bucle de eventos, o en otros casos estar validando datos que ya sabes q son correctos.... |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 28 Abr, 2007 6:40 am Asunto: |
|
|
muy bueno, si señor.
Eso es lo que en un principio quería, pero ya dije en un post anterior que había cambiado de componentes (SpeedButton)
Gracias por tu solución.
Saludos, bosoft, |
|
| Volver arriba |
|
 |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Mie 02 May, 2007 6:05 pm Asunto: |
|
|
Me alegro que lo hayas solucionado... hasta la proxima... _________________
 |
|
| Volver arriba |
|
 |
|