Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   CheckBox con imagenes? (https://www.clubdelphi.com/foros/showthread.php?t=84850)

aitorqrv 16-12-2013 10:46:56

CheckBox con imagenes?
 
Hola a todos:

Estoy haciendo un progrma que que controla un rele que me enciende y me apaga una bonbilla. Mi problema es el siguiente, no quiero poner un componete tipo CheckBox por el tema estetico del programa, y en su lugar me gustaria poner una imagen de una bonbilla, que la cual me represente graficamente como esta mi bonbilla.

Para hacer esto he puesto una imagen dentro de un SpeedBottom y he utilizado el siguiente codigo:

Código Delphi [-]
procedure TForm1.led_2Click(Sender: TObject);
begin
    Case led_2.Enabled of
    true : led_2.Enabled := false;
    false : led_2.Enabled := true;
    //else ShowMessage('');
    end;

    label27.caption:= booltostr(led_2.Enabled);
end;

Pero, cuando pulso el boton por primera ved, la luz se enciende, lo buelbo a pulsar y se apaga, pero cundo lo pulso por tercera vez, la luz se queda constantemente encendida (siempre en true)?.



Yo quiero hacer algo que se parezca a esta imagen que me he encontrado por internet. Para cambiar el estado de las salidas, me gustaria que variase su estado al pulsar sobre los circulos que representan las salidas que me encienden o me apagan las bonbillas, sin tener que utilizar un checkbox.

Un saludo y muchas gracias por anticipado.

jafera 16-12-2013 11:32:50

Podrías poner un poco del código que utilizas?

Es que así a secas, nuestra "bombilla" está siempre en estado apagado y no "vuelve" a encenderse.

Por ejemplo puedes colocar una variable que sea el estado con valores 0 apagado y 1 encendido y jugar con eso en cada click al botón, si estado = 0 entonces al click estado = 1.

Saludos

ecfisa 16-12-2013 12:29:29

Cita:

Empezado por aitorqrv (Mensaje 470812)
...
Para cambiar el estado de las salidas, me gustaria que variase su estado al pulsar sobre los circulos que representan las salidas que me encienden o me apagan las bonbillas, sin tener que utilizar un checkbox.

Hola aitorqrv.

Te propongo esta idea, con el editor gráfico que prefieras (el que trae Delphi sirve perfectamente) crea dos imágenes .bmp de 16 x 16. Estas imágenes que podrías guardar con los nombres LedOff.bmp y LedOn.bmp por ejemplo, serán: Un circulo pintado de verde oscuro la primera y la otra de verde muy claro para lograr el efecto apagado/encendido.

En el form coloca un TImageList, agrega en la posición 0 a LedOff.bmp y en la 1 LedOn.bmp. Un TPanel con ocho TSpeedButton dentro y los TLabel que precises. Luego mediante Ctrl+mouse selecciona los 8 SpeedButtons y asígnale a todos el mismo evento OnClick.

El código quedaría:
Código Delphi [-]
...
implementation

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  sp : TSpeedButton;
begin
  for i := 0 to 7 do
  begin
    sp := FindComponent('SpeedButton'+IntToStr(i+1)) as TSpeedButton;
    if Assigned(sp) then
    begin
      sp.Flat := True; 
      sp.Tag  := 0;    // Apagado por defecto
      ImageList1.GetBitmap(sp.Tag, sp.Glyph)
    end;
  end;
end;

procedure TForm1.SpeedButtonsClick(Sender: TObject);
begin
  with Sender as TSpeedButton do
  begin
    Tag   := Integer(not Boolean(Tag));  // encender/apagar
    Glyph := nil;
    ImageList1.GetBitmap(Tag,Glyph);
  end;
end;
El estado de encendido o apagado se almacena en la propiedad Tag de los SpeedButtons y se cambia ante el click sobre el mismo como solicitabas.

El resultado es:


Saludos :)

aitorqrv 17-12-2013 10:42:05

Hola muchas gracias, el codigo que ha posteado ecfisa me funciona "correctamente", mañana tendre que analizar el codigo para intentar ver por que no salen las imagenes cuando se inicia por primeraved el programa...

Supongo que este es otro tema diferente, y si le quero eliminar los bordes al spedd button?

Muchas gracias.

ecfisa 17-12-2013 11:21:22

Cita:

Empezado por aitorqrv (Mensaje 470843)
... y si le quero eliminar los bordes al spedd button?

Hola aitorqrv.

Si te referis al borde que se presenta cuando se pasa el mouse por encima creo que no, pero podes reemplazar los SpeedButtons por Images con el mismo resultado:
Código Delphi [-]
...
implementation 

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  img : TImage;
begin
  for i := 0 to 7 do
  begin
    img := FindComponent('Image'+IntToStr(i+1)) as TImage;
    if Assigned(img) then
    begin
      img.Height:= 16;
      img.Width := 16;
      img.Tag   := 0;    // Apagado por defecto
      ImageList1.GetBitmap(img.Tag, img.Picture.Bitmap)
    end;
  end;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
 with Sender as TImage do
  begin
    Picture.Bitmap := nil;
    Tag := Integer(not Boolean(Tag));
    ImageList1.GetBitmap(Tag, Picture.Bitmap);
  end;
  //...
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 17:44:21.

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