Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-08-2006
TriLoCBA TriLoCBA is offline
Miembro
 
Registrado: jun 2005
Posts: 28
Poder: 0
TriLoCBA Va por buen camino
Question Simular dos radiobuttons con Checkbox

Necesito simular el efecto de seleccion unica que poseen los radiobutton con un par de checkbox (Ch1 y Ch2), y no consigo que funcionen :

Código Delphi [-]
procedure TForm1.Ch1Click(Sender: TObject);
begin
  Ch1.Checked:=True;
  if Ch2.Checked then Ch2.Checked:=False;
end;

procedure TForm1.Ch2Click(Sender: TObject);
begin
  Ch2.Checked:=True;
  if Ch1.Checked then Ch1.Checked:=False;
end;

Desde ya muchas gracias por vuestra ayuda...

Un abrazo...

TriloCba

Última edición por TriLoCBA fecha: 24-08-2006 a las 03:38:43. Razón: No puse bien las etiquetas Delphi...
Responder Con Cita
  #2  
Antiguo 24-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Intenta así:

Código Delphi [-]
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
  begin
    CheckBox2.OnClick := nil;
    CheckBox2.Checked := false;
    CheckBox2.OnClick := CheckBox2Click;
  end;

  CheckBox1.Checked := true;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
  if CheckBox2.Checked then
  begin
    CheckBox1.OnClick := nil;
    CheckBox1.Checked := false;
    CheckBox1.OnClick := CheckBox1Click;
  end;

  CheckBox2.Checked := true;
end;

// Saludos
Responder Con Cita
  #3  
Antiguo 24-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Vamos a ver que te parece esta solución. Usamos un solo evento OnClick para los dos checkbox, y dento colocamos esto:

Código Delphi [-]
procedure TForm1.Ch1Click(Sender: TObject);
begin
  // Solo hay problemas cuando los dos estan marcados
  if Ch2.Checked and Ch1.Checked  then
    // Desmarcamos el checkbox que no nos llamo
    if Sender = Ch1 then
      Ch2.Checked:= FALSE
    else
      Ch1.Checked:= FALSE;
end;

PD: ¿Porque no usas radiobuttons? si quieres tener la opción de no marcar ninguno, siempre puedes añadir otro radiobutton con el caption "Ninguno de las anteriores"
Responder Con Cita
  #4  
Antiguo 24-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por seoane
si quieres tener la opción de no marcar ninguno, siempre puedes añadir otro radiobutton con el caption "Ninguno de las anteriores"
¿Y si no quiere? Es decir, tal como pones, no se imita exactamente el comportamiento de dos radiobuttons ya que justamente puedes desmarcar ambos. Quizá sólo sea una razón estética.

// Saludos
Responder Con Cita
  #5  
Antiguo 24-08-2006
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Honor a quien honor merece, Roman, eres un maestro.

Me pongo de pie.

Saludos.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #6  
Antiguo 24-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
¿Y si no quiere? Es decir, tal como pones, no se imita exactamente el comportamiento de dos radiobuttons ya que justamente puedes desmarcar ambos. Quizá sólo sea una razón estética.

// Saludos
Parece que estamos exigentes, pero si es una razón estética ya no digo mas. Mi confusión se debió a que no entendía porque alguien querría agregar código solo para que un control se comportara como otro, pero si los radiobutton os parecen feos adelante.
Responder Con Cita
  #7  
Antiguo 24-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Bueno, es que yo no sé si es una cuestión estética. Es sólo que en el código que él intentó, explícitamente pone en true el checkbox que llama. Por eso supuse que no quería dejar que se desmarcara.

Ahora, tratando de encontrar un código compacto como el de seoane, lo más que me acerco es a esto:

Código Delphi [-]
{$writeableconst on}
procedure TForm1.CheckBoxClick(Sender: TObject);
const
  Checando: Boolean = false;

begin
  if Checando then exit;

  Checando := true;
  if Sender = CheckBox1
    then CheckBox2.Checked := false
    else CheckBox1.Checked := false;

  TCheckBox(Sender).Checked := true;
  Checando := false;
end;
{$writeableconst off}

usando un sólo evento para ambos.

// Saludos
Responder Con Cita
  #8  
Antiguo 24-08-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 23
vtdeleon Va por buen camino
Si hablamos de hacerlo chiquito o compacto
Código Delphi [-]
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if TCheckBox(Sender).Name = CheckBox1.Name then
    CheckBox2.Checked:= not TCheckBox(sender).Checked
  else
    CheckBox1.Checked:= not TCheckBox(sender).Checked;
end;
Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #9  
Antiguo 24-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pero así tiene un efecto extraño: cuando haces click sobre el que está marcado, la marca pasa al otro.

// Saludos
Responder Con Cita
  #10  
Antiguo 24-08-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 23
vtdeleon Va por buen camino
Saludos
Cita:
Empezado por roman
Pero así tiene un efecto extraño: cuando haces click sobre el que está marcado, la marca pasa al otro.
Creí que queria un comportamiento similar al Radiobutton
Cita:
Empezado por TriLoCBA
Necesito simular el efecto de seleccion unica que poseen los radiobutton con un par de checkbox
Ya no entiendo
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #11  
Antiguo 24-08-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 23
vtdeleon Va por buen camino
Ooh ya, se me ha chispoteado el asunto, tienes razón roman
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #12  
Antiguo 24-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El punto es que cuando se cambia la propiedad checked por código, se genera un evento OnClick y una recursividad que da al traste con el stack. Por ello es que no he visto forma de hacerlo como no sea controlando de una u otra manera cuando se está dentro del evento.

// Saludos
Responder Con Cita
  #13  
Antiguo 24-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En su momento tambien me desconcertó ese funcionamiento, así que derivé de Tcheckbox y me creé el mio propio:
Código Delphi [-]

unit CheckBoxNoClick;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls;

type
  TCheckBoxNoClick = class(tcheckBox)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    procedure SetChecked(Value:Boolean);
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TCheckBoxNoClick]);
end;

{ TCheckBoxNoClick }

procedure TCheckBoxNoClick.SetChecked(Value: Boolean);
begin
  try
    clicksdisabled := True;
    inherited;
  finally
    ClicksDisabled:= False;
  end;
end;

end.

Cuando no se quiere que desencadene el evento OnClick por código, se usa SetChecked.
Cuando se necesita el comportamiento normal, se usa como siempre.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #14  
Antiguo 24-08-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Muy buenas respuestas... pero sigue faltando una que no entiendo, y que el único que puede responder es el autor de este hilo:

¿porqué no quieres usar RadioButtons?
__________________

Responder Con Cita
  #15  
Antiguo 25-08-2006
TriLoCBA TriLoCBA is offline
Miembro
 
Registrado: jun 2005
Posts: 28
Poder: 0
TriLoCBA Va por buen camino
Muchas gracias a todos por vuestras rapidas respuestas...!!!

Me pone orgulloso que un tema tan modesto haya juntado a los grandes del foro !!!

Para despejar dudas, la utilizacion de los checkbox en lugar de radiobutton responde a dos situaciones:

1ra. Forman parte de un form que tiene como fondo una imagen especifica sobre la cual no puedo poner ningun componente como el Tpanel ó el TRadioGroup que no traiga la propiedad Transparent; y en el mismo formulario ya poseeo una serie de RadioButtons para otra función.

y 2da., aunque menos importante, me agradan visualmente mas los checkboxs sobre los radiobuttons.

Probare los ejemplos enviados, y de nuevo muchas gracias.

Un abrazo.
Responder Con Cita
  #16  
Antiguo 25-08-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 23
vtdeleon Va por buen camino
Cita:
Empezado por Lepe
Cuando no se quiere que desencadene el evento OnClick por código, se usa SetChecked.
Cuando se necesita el comportamiento normal, se usa como siempre.
No me ha funcionado . Algo se me escapa

Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #17  
Antiguo 25-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En qué delphi lo has probado vtdeleon?

En Delphi 6 Enterprise lo he usado con éxito.

Como ves los de Borland ya pensaron en ello y precisamente por eso tienen una variabla protected/private (no recuerdo) llamada ClickDisabled.

Ahora mismo en Delphi 6 no puedo mirarlo. En BDS2006 la cosa ha cambiado:
Código Delphi [-]
procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
  if FState <> Value then
  begin
    FState := Value;
    if HandleAllocated then
      SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
    if not ClicksDisabled then Click; <-------------------------
  end;
end;
Ahora es el procedimiento SetState.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #18  
Antiguo 25-08-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 23
vtdeleon Va por buen camino
Cita:
Empezado por Lepe
Ahora mismo en Delphi 6 no puedo mirarlo. En BDS2006 la cosa ha cambiado:
Por ahí andaban los tiros.

Ahora no lo puedo probar, no tengo el delphi a mano.
Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #19  
Antiguo 27-08-2006
TriLoCBA TriLoCBA is offline
Miembro
 
Registrado: jun 2005
Posts: 28
Poder: 0
TriLoCBA Va por buen camino
Thumbs up

Perfecto... El primer codigo que planteo Roman es lo que necesitaba !!!

Muchas gracias a todos por la ayuda...

Un abrazo.

TriloCba
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Busqueda en ADOTable y RadioButtons MaJeSTiC Varios 1 06-08-2004 20:29:37
Crear RadioButtons dinámicamente Javi2 Varios 4 26-07-2004 18:27:00
simular pulsacion acrophet Varios 1 01-12-2003 15:44:13
radiobuttons haffo OOP 6 15-11-2003 19:52:20
radiobuttons asociados a un edit haffo OOP 12 06-11-2003 00:03:45


La franja horaria es GMT +2. Ahora son las 00:55:54.


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
Copyright 1996-2007 Club Delphi