关于动态更改image的问题(50分)

  • 主题发起人 主题发起人 ooooh
  • 开始时间 开始时间
O

ooooh

Unregistered / Unconfirmed
GUEST, unregistred user!
我将image加入了onmouseenter和onmouseleave,想移进时换成另一张图片,移出时复原.
由于有好多幅图,不想每幅都编写命令,请教如何编写才好,请给出源代码!
谢谢!
 
更换的代码写成一个过程,
将所有图的onmouseenter和onmouseleave都指向这个就可以
更偷懒的办法:
放一个image,设好事件,
copy , paste,
连事件都复制过去了
都是指向同一个
 
我是初学,不知写,请举个例子
 
搞定了,我原是不懂(sender as ...)可以获得控件自身的信息!


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ximage,pngimage;

type
TForm1 = class(TForm)
x: tximage;
about: tximage;
procedure xMouseEnter(Sender: TObject);
procedure xMouseLeave(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.xMouseEnter(Sender: TObject);
var s:string;
begin
s:=(sender as tximage).Name;
(sender as tximage).Picture.LoadFromFile('D:/My Documents/My Pictures/'+s+'_1.png');
end;

procedure TForm1.xMouseLeave(Sender: TObject);
var s:string;
begin
s:=(sender as tximage).Name;
(sender as tximage).Picture.LoadFromFile('D:/My Documents/My Pictures/'+s+'_2.png');
end;

end.
 
真服了你了,如此低效.LoadFromFile是必须重新加载解码的。
var
image1, image2 as TJPEGImage;

image1:= TJPEGImage.Create(); image1.LoadFromFile(..);
image2:= ...

(Sender as TxImage).Picture.Graphic:= image1;
 
zjan521或许你是对的,但如果图片多的时候,你这种方法就要在formcreate时写大量的代码了.至于占不占用内存,我就不知,因我还未入门.
 
Timage控件上加一个TLabel控件
就可以满足lz的条件
tlabel设置为透明 caption为空
tlabel有 mouseenter and mouseleave事件
 
OnMouseEnter/OnMouseLeave是很频繁发生的事件(如果窗口可视),而且你的代码中提示似乎更该的图片是比较固定的,因此预加载时比较合适的
 
如此说来,最好的方法是将所有图片在formcreate时加载,将其中onmouseenter出现的图片设置visible初始值为false,然后靠OnMouseEnter/OnMouseLeave控制图片的可见性?
瑞星2006下面那三个按钮是否如此?imagelist有没有支持大图片的,png格式?
 

你放一个IMAGELIST进去啊
在该LIST中添加你所需要的图片
然后自动选择咯
 
唉……IMAGELIST不支持PNG格式图片啊!只支持bmp,ico。bmp虽然透明,但比起png差远了。
 
我测试楼主的程序怎么提示 file not fount 'ximage.dcu ' 错误是什么原因,初学请多指教,谢谢!
 
这是自制控件,目的是增加鼠标移进移出事件.源码如下,可复制保存为*.pas文件后安装使用.

unit ximage;

interface

uses
SysUtils, Classes, Controls, messages,ExtCtrls;

type
tximage = class(TImage)
private
{ Private declarations }
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CM_MouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CM_MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [tximage]);
end;

procedure tximage.CM_MouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure tximage.CM_MouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.
 
大虾们,有没有更好的法子啊?
瑞星2006下面那三个按钮是怎样做到的,有人知吗?
 
后退
顶部