PDA

Ver la Versión Completa : Crear un Boton funcional a partir de dos Imagenes


martini002
19-05-2012, 09:20:56
Saludos,

Desde la tarde de ayer he intentado
realizar un boton funcional, a partir de dos imagenes
un TImage con una imagen estatica
la cuestion es que desconozco el codigo
para lograr que cuando pase el mouse
entonces cambie a otra imagen obviamente
y cuando quite el mouse entonces coloque la imagen anterior
he intentado con BitBtn pero no hubo exito
realmente esta es una de las cosas que por el momento
me urge bastante, agradeceria mucho y apreciaria su apoyo

Best,
Martin

ecfisa
19-05-2012, 18:14:26
Hola martini002.

Podés hacerlo de este modo:

...
type
TImage=class(ExtCtrls.TImage)
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
end;

TForm1 = class(TForm)
Image1: TImage;
private
public
end;

var
Form1: TForm1;

implementation

uses jpeg;

(* Mouse sobre la Imágen *)
procedure TImage.CMMouseEnter(var Msg: TMessage);
begin
Form1.Image1.Picture.LoadFromFile('C:\Tu_Ruta\Imagen1.jpg'); // o como asignes la imagen
end;

(* Mouse fuera de la Imágen *)
procedure TImage.CMMouseLeave(var Msg: TMessage);
begin
Form1.Image1.Picture.LoadFromFile('C:\Tu_Ruta\Imagen2.jpg'); // o como asignes la imagen
end;
...


Saludos.

ecfisa
19-05-2012, 18:38:16
Hola de nuevo.

Me quede pensando, ya que no estaba muy claro si hablabas de un TImage o de un TBitBtn.

Si la imágen que deseas que cambie es la que este en el TBitBtn, te convendría poner las dos imágenes en un TImageList y hacer:

type
TBitBtn=class(Buttons.TBitBtn)
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
end;

TForm1 = class(TForm)
BitBtn1: TBitBtn;
ImageList1: TImageList;
private
public
end;

var
Form1: TForm1;

implementation

procedure TBitBtn.CMMouseEnter(var Msg: TMessage);
begin
with Form1 do
begin
BitBtn1.Glyph:= nil;
ImageList1.GetBitmap(0, BitBtn1.Glyph)
end;
end;

procedure TBitBtn.CMMouseLeave(var Msg: TMessage);
begin
with Form1 do
begin
BitBtn1.Glyph:= nil;
ImageList1.GetBitmap(1, BitBtn1.Glyph)
end;
end;
...

Como verás el modo de detectar la entrada/salida del componente no difiere del anterior.

Saludos.

martini002
20-05-2012, 00:19:54
Ecfisa,

Gracias por tu respuesta, realmente me ayudo mucho


Form1.Image1.Picture.LoadFromFile('C:\Tu_Ruta\Imagen1.jpg');


Esto era lo que estaba buscando exactamente
como modificar esa propiedad directamente desde el codigo,
realmente como en el primer ejemplo es precisamente
lo que necesito, pero no me funciona,
el lenguaje no me reconoce esta propiedad


CMMouseEnter
CMMouseLeave


me tira estos errores


[Error] AreaRectangulo.pas(59): ';' expected but '.' found
[Error] AreaRectangulo.pas(59): ';' expected but ')' found



procedure BotonImg.CMMouseEnter(var Msg: TMessage); // Aqui el error
begin
Acciones.
end;



Ese hover es lo que realmente he venido buscando
pero pude encontrar otra forma un poco menos atractiva
pero que al final funciono muy bien
como podria resolver lo del hover?

Tambien me interesaria bastante conocer donde
conseguiste conocer esta propiedad "LoadFromFile"
seguramente alli mismo deben haber otras que me ayudarian bastante
interesantes respuestas,
gracias por el apoyo

Best,
Martin


procedure TForm1.BotonImgMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Form1.BotonImg.Picture.LoadFromFile('F:\Borland\Delphi7\Projects\Area Rectangulo\BotonAbajo.jpg');
end;

procedure TForm1.BotonImgMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Form1.BotonImg.Picture.LoadFromFile('F:\Borland\Delphi7\Projects\Area Rectangulo\BotonArriba.jpg');
end;

ecfisa
20-05-2012, 20:27:07
Hola martini002.


Esto era lo que estaba buscando exactamente
como modificar esa propiedad directamente desde el codigo,
realmente como en el primer ejemplo es precisamente
lo que necesito, pero no me funciona,
el lenguaje no me reconoce esta propiedad


¿ Incluiste las siguientes líneas antes de la declaración de clase del form ?

type
TBitBtn=class(Buttons.TBitBtn)
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
end;

Saludos.