关于image自定义控件 要做一个图片控件 能实现图片切换的 但没这方面的代码做参考 求一个类似的自定义控件(要求是图片类的控件)代码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在Image1Click里调不同图片不可以吗 我以前做报警系统的时候也遇到过这样的问题 红灯,绿灯,黄灯我就用了3个TImage ,里面分别放了红,绿,黄的三张图片然后根据条件设置他们的Visible的值这样实现也挺方便的 不知道你的意图。我写了个图片控件,从TImage继承的,支持添加多文件自动播放。 设置几个属性就行:Interval 播放间隔,单位秒;AutoPlay 是否自动播放Files 要播放的文件列表控件代码:unit HotImage;interface uses Windows , Classes, ImgList , SysUtils, Graphics, Controls, Forms, jpeg,ExtCtrls;type TOnGetImageIndex = procedure(Sender: TObject; const CurrIndex: Integer; var NewIndex: integer) of object; THotImage = class(TImage) private FInRefresh: boolean; FIndex: integer; //当前播放的图片Index FLastErr: string; FImgFiles: TStrings; FOnGetImageIndex : TOnGetImageIndex; FTimer: TTimer; procedure setAutoPlay(const value: Boolean); procedure setInterval(const value: integer); function getInterval: integer; procedure setImageIndex(const Index: integer); function getAutoPlay : Boolean; procedure setImgFiles(const Value: TStrings); protected public procedure OnChangeImage(Sender: TObject); procedure RefreshImage; constructor Create(AOwner: TComponent); override; destructor Destroy; override; function GetLastErr: string; //向图片文件列表中加入文件 ;参数DisplayThis指定加入后是否立即显示这张 function AddFile(const FileName: string; const DisplayThis: Boolean = false):boolean; //function InsertFile(const FileName: string; const Index: integer): boolean; procedure DeleteFile(const Index: Integer); procedure display(const Index: Integer); published //是否自动播放 property AutoPlay: boolean read getAutoPlay write setAutoPlay default false; //自动播放时切换间隔秒数 property Interval: integer read getInterval write setInterval default 3; //图片文件路径列表。支持设计时加入 property Files: TStrings read FImgFiles write setImgFiles; //当前显示的图片索引 property index: integer read FIndex write setImageIndex default -1; //自动播放时默认按顺序循环。 实现该事件可以指定播放的图片索引。 property OnGetImageIndex: TOnGetImageIndex read FOnGetImageIndex write FOnGetImageIndex; //默认时从第一张至最后一张循环切换。但用户可在此事件中指定要切换到那张 end; procedure Register;implementationprocedure Register;begin RegisterComponents('Hotzhu', [THotImage]);end;{ THotImage }function isImageFile(const fileName: string): boolean;begin result := True //要判断的话,自己实现end;function THotImage.AddFile(const FileName: string; const DisplayThis: Boolean = false): boolean;var IndexOfAdded: Integer;begin Result := false; if not FileExists(FileName) then begin FLastErr := '文件不存在'; exit; end; if not isImageFile(FileName) then begin FLastErr := '文件不是图片'; exit; end; IndexOfAdded := FImgFiles.Add(FileName); if DisplayThis and (IndexOfAdded >= 0) then index := IndexOfAdded;end;constructor THotImage.Create(AOwner: TComponent);begin inherited; FImgFiles := TStringList.Create; FIndex:= -1; FLastErr:= ''; FTimer:= TTimer.Create(nil); FTimer.Enabled := false; FTimer.Interval := 3000; FTimer.OnTimer := OnChangeImage; FInRefresh := false; //是否为刷新显示。为false时自动播放将取下一张。为true时Index不变end;procedure THotImage.DeleteFile(const Index: Integer);begin try FImgFiles.Delete(index); if FIndex >= index then self.Index := Index - 1; except on E: Exception do FLastErr := e.message; end;end;destructor THotImage.Destroy;begin FTimer.Free; FImgFiles.Free; inherited;end;procedure THotImage.display(const Index: Integer);begin if Index = -1 then Picture.Assign(nil) else if (FImgFiles.Count > 0) and (Index < FImgFiles.Count) then begin FIndex := Index; FInRefresh := true; RefreshImage; end;end;procedure THotImage.RefreshImage;begin if FTimer.Enabled then begin FTimer.Enabled := False; FTimer.Enabled := true; end else begin if Findex < 0 then Picture.Assign(nil) else Picture.LoadFromFile(FImgFiles[Findex]); end;end;function THotImage.GetLastErr: string;begin result := FLastErr;end;procedure THotImage.setAutoPlay(const value: Boolean);begin FTimer.Enabled := value;end;function THotImage.getAutoPlay : Boolean;begin result := FTimer.Enabled ;end;function THotImage.getInterval: integer;begin result := FTimer.Interval div 1000;end;procedure THotImage.setImageIndex(const Index: integer);begin if Index < FImgFiles.Count then begin FIndex := Index; RefreshImage; end;end;procedure THotImage.setImgFiles(const Value: TStrings);begin FInRefresh := true; FIndex := -1; try FImgFiles.Assign(Value); finally FInRefresh := false; end;end;procedure THotImage.setInterval(const value: integer);begin FTimer.Interval := value * 1000;end;procedure THotImage.OnChangeImage(Sender: TObject);var NewIndex: integer;begin FTimer.Enabled :=False; try if not FInRefresh then begin if Assigned(FOnGetImageIndex) then begin if FImgFiles.Count > 0 then NewIndex := (FIndex + 1) mod FImgFiles.Count; FOnGetImageIndex(Self, FIndex, NewIndex); if (NewIndex < FImgFiles.Count) then FIndex := NewIndex; end else if FImgFiles.Count > 0 then FIndex := (FIndex + 1) mod FImgFiles.Count else FIndex := -1; end else FInRefresh := False; if FIndex = -1 then Picture.Assign(nil) else Picture.LoadFromFile(FImgFiles[Findex]); finally FTimer.Enabled :=true; end;end;end. 我不知道我说的是不是楼主想要的要是我我会这样,arayImage:array of TImage;加载好所有你想要的,再当你要显示哪个就用哪个呀 请问哪里有windous xp系统字体文件下载,就是app963的文件 多表联接用ADO编辑数据 简单问题? 关于数据库导出TXT的问题 Help: 使用Lame DLL 转换8K和11k采样的Wav文件到Mp3文件,用Winamp不能播放 求到期系统自动提示的程序实现方法、设计思路及例子! 串口问题,VC版无人能解,诚征高人参与。 怎样才能在资源文件中加入大于256色的位图。 我如何在win9*、2000关机时,运行我的一个程序。 怎样得到DELPHI菜单和工具栏中的图标,以做出漂亮的程序? 怎样得到另一个应用程序中的Edit1和Edit2的值? 让子窗体一直处于最上面
也遇到过这样的问题
红灯,绿灯,黄灯
我就用了3个TImage ,里面分别放了红,绿,黄的三张图片
然后根据条件设置他们的Visible的值
这样实现也挺方便的
设置几个属性就行:
Interval 播放间隔,单位秒;
AutoPlay 是否自动播放
Files 要播放的文件列表控件代码:unit HotImage;interface
uses Windows , Classes, ImgList , SysUtils, Graphics, Controls, Forms,
jpeg,ExtCtrls;type
TOnGetImageIndex = procedure(Sender: TObject; const CurrIndex: Integer; var NewIndex: integer) of object;
THotImage = class(TImage)
private
FInRefresh: boolean;
FIndex: integer; //当前播放的图片Index
FLastErr: string;
FImgFiles: TStrings;
FOnGetImageIndex : TOnGetImageIndex;
FTimer: TTimer;
procedure setAutoPlay(const value: Boolean);
procedure setInterval(const value: integer);
function getInterval: integer;
procedure setImageIndex(const Index: integer);
function getAutoPlay : Boolean;
procedure setImgFiles(const Value: TStrings);
protected
public
procedure OnChangeImage(Sender: TObject);
procedure RefreshImage;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetLastErr: string;
//向图片文件列表中加入文件 ;参数DisplayThis指定加入后是否立即显示这张
function AddFile(const FileName: string; const DisplayThis: Boolean = false):boolean;
//function InsertFile(const FileName: string; const Index: integer): boolean;
procedure DeleteFile(const Index: Integer);
procedure display(const Index: Integer);
published
//是否自动播放
property AutoPlay: boolean read getAutoPlay write setAutoPlay default false;
//自动播放时切换间隔秒数
property Interval: integer read getInterval write setInterval default 3;
//图片文件路径列表。支持设计时加入
property Files: TStrings read FImgFiles write setImgFiles;
//当前显示的图片索引
property index: integer read FIndex write setImageIndex default -1;
//自动播放时默认按顺序循环。 实现该事件可以指定播放的图片索引。
property OnGetImageIndex: TOnGetImageIndex read FOnGetImageIndex write FOnGetImageIndex; //默认时从第一张至最后一张循环切换。但用户可在此事件中指定要切换到那张
end; procedure Register;
implementationprocedure Register;
begin
RegisterComponents('Hotzhu', [THotImage]);
end;{ THotImage }function isImageFile(const fileName: string): boolean;
begin
result := True //要判断的话,自己实现
end;function THotImage.AddFile(const FileName: string; const DisplayThis: Boolean = false): boolean;
var IndexOfAdded: Integer;
begin
Result := false;
if not FileExists(FileName) then
begin
FLastErr := '文件不存在';
exit;
end;
if not isImageFile(FileName) then
begin
FLastErr := '文件不是图片';
exit;
end;
IndexOfAdded := FImgFiles.Add(FileName);
if DisplayThis and (IndexOfAdded >= 0) then
index := IndexOfAdded;
end;constructor THotImage.Create(AOwner: TComponent);
begin
inherited;
FImgFiles := TStringList.Create;
FIndex:= -1;
FLastErr:= '';
FTimer:= TTimer.Create(nil);
FTimer.Enabled := false;
FTimer.Interval := 3000;
FTimer.OnTimer := OnChangeImage;
FInRefresh := false; //是否为刷新显示。为false时自动播放将取下一张。为true时Index不变
end;procedure THotImage.DeleteFile(const Index: Integer);
begin
try
FImgFiles.Delete(index);
if FIndex >= index then
self.Index := Index - 1;
except
on E: Exception do
FLastErr := e.message;
end;
end;destructor THotImage.Destroy;
begin
FTimer.Free;
FImgFiles.Free;
inherited;
end;procedure THotImage.display(const Index: Integer);
begin
if Index = -1 then
Picture.Assign(nil)
else if (FImgFiles.Count > 0) and (Index < FImgFiles.Count) then
begin
FIndex := Index;
FInRefresh := true;
RefreshImage;
end;
end;
procedure THotImage.RefreshImage;
begin
if FTimer.Enabled then
begin
FTimer.Enabled := False;
FTimer.Enabled := true;
end
else begin
if Findex < 0 then
Picture.Assign(nil)
else
Picture.LoadFromFile(FImgFiles[Findex]);
end;
end;function THotImage.GetLastErr: string;
begin
result := FLastErr;
end;procedure THotImage.setAutoPlay(const value: Boolean);
begin
FTimer.Enabled := value;
end;
function THotImage.getAutoPlay : Boolean;
begin
result := FTimer.Enabled ;
end;function THotImage.getInterval: integer;
begin
result := FTimer.Interval div 1000;
end;procedure THotImage.setImageIndex(const Index: integer);
begin
if Index < FImgFiles.Count then
begin
FIndex := Index;
RefreshImage;
end;
end;procedure THotImage.setImgFiles(const Value: TStrings);
begin
FInRefresh := true;
FIndex := -1;
try
FImgFiles.Assign(Value);
finally
FInRefresh := false;
end;
end;procedure THotImage.setInterval(const value: integer);
begin
FTimer.Interval := value * 1000;
end;procedure THotImage.OnChangeImage(Sender: TObject);
var NewIndex: integer;
begin
FTimer.Enabled :=False;
try
if not FInRefresh then
begin
if Assigned(FOnGetImageIndex) then
begin
if FImgFiles.Count > 0 then
NewIndex := (FIndex + 1) mod FImgFiles.Count;
FOnGetImageIndex(Self, FIndex, NewIndex);
if (NewIndex < FImgFiles.Count) then
FIndex := NewIndex;
end
else if FImgFiles.Count > 0 then
FIndex := (FIndex + 1) mod FImgFiles.Count
else
FIndex := -1;
end
else
FInRefresh := False;
if FIndex = -1 then
Picture.Assign(nil)
else
Picture.LoadFromFile(FImgFiles[Findex]);
finally
FTimer.Enabled :=true;
end;
end;end.
再当你要显示哪个就用哪个呀