DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: mulancc
今日帖子: 0
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/22 12:08:18
标题:
firemonkey下image显示图片的问题 浏览:292
加入我的收藏
楼主: 请教 ,我在firemonkey下用image控件显示图片,发现一个问题,发现显示时只会显示最后一张图片,代码如下,是什么原因?

代码如下:

function showpic:boolean;
var
  lFile : string ; 
begin
   for i := 0 to 2 
begin
   lFile := getFile(i);//这里会去取文件名,文件都是jpg文档
    img.Bitmap.Assign(nil);
    img.Bitmap.LoadFromFile(lFile);
sleep(2000) ;
end;
end;
----------------------------------------------
-把学习当信仰
作者:
男 lyp8899 (lyp8899) ★☆☆☆☆ -
盒子活跃会员
2020/12/22 12:35:52
1楼: var
  lFile : string ;
  i:integer;
begin
   for i := 1 to 3 do
   begin
     lFile := 'C:\'+i.ToString +'.jpg';
     Image1.Picture.Bitmap.Assign(nil);
     Image1.Picture.LoadFromFile(lFile);
     Image1.Update;
     sleep(2000) ;
   end;
end;
这样可以
----------------------------------------------
▄︻┻┳═
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/12/22 16:01:12
2楼: 所有你的问题是什么?
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/22 16:39:56
3楼: 永远只显示最后一张图
----------------------------------------------
-把学习当信仰
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/22 16:45:22
4楼: @lyp8899  我是在fmx平台下
----------------------------------------------
-把学习当信仰
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/12/22 16:59:28
5楼: 只显示最后一张图没错啊。

所有,还是问题描述不到位。究竟问题是什么?
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/22 17:10:19
6楼: 我的意思是前面几张图 看不到
----------------------------------------------
-把学习当信仰
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/22 17:20:16
7楼: 不管是哪个文件load进去,显示的内容 都 是最后一张图片,就是没更新的意思
----------------------------------------------
-把学习当信仰
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2020/12/22 17:27:32
8楼: 5 楼 答案 正解。
楼主 不相信 就算了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/22 17:56:01
9楼: 我是想用image做一个幻灯片一样播放图片的容器 , 发现 图片不会显示前面的,只会显示最后一张
----------------------------------------------
-把学习当信仰
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2020/12/22 17:57:23
10楼: sleep 会导致 UI 线程卡死,无法显示。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/12/22 18:28:54
11楼: 楼上正解。

DELPHI 的工作原理是这样的:

你写的代码,除非你把代码放进了某个线程去执行,默认它是被主线程执行的。这个主线程也就是楼上说的 UI 线程。因为处理控件在屏幕上的显示,是主线程。

你写一个:Image.bmp.LoadFromFile,只是把数据导入了 Image,后继,Image 里面的很多行代码会做很多操作才会显示出来。

但是,你直接 Sleep 也就是让主线程停止工作了。后继显示的代码就没来得及执行。

再然后, Sleep 结束,你的循环马上又跑到下一个加载文件了。所有一通循环下来,当然只显示最后一张。

所以你的标题是显示最后一张,代码确实是显示最后一张。那就没有问题嘛。

这里要显示某一张,你用 Image.Update 是没错。

另外你还可以试试 Application.ProcessMessage 来看看能不能出来。这句话的意思就是执行完数据加载,让你的 Application 处理一下 WINDOWS 消息,而不是马上跑去做第二次循环。

假设,你写一个死循环,比如:

while true do
begin
  Sleep(1000);
end;

那么,你的程序就死掉了。原因就是你的循环没有停,没有空闲时间让 Application 去处理 WINDOWS 的消息。程序也就不会有界面上的变化。
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/22 19:55:27
12楼: 楼上各位,是我错了,不能用for这样搞,感谢大家
----------------------------------------------
-把学习当信仰
作者:
男 emailx45 (emailx45) ▲▲▲△△ -
注册会员
2020/12/23 12:43:11
13楼: I think that using a "Timer" would be a good approach!
我认为使用“计时器”将是一个很好的方法!

Timer with "Interval =  2000"

So, the main topic is not "locked / asleep"
因此,主要主题不是“锁定/睡眠”
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 hexi (Hexi) ★☆☆☆☆ -
盒子活跃会员
2020/12/23 22:04:49
14楼: sleep(2000)
改为:
var 
  D:UInt32;//Cardinal

D:=TThread.GetTickCount+2000;
while D>TThread.GetTickCount do
begin
  Application.ProcessMessages;
  Sleep(1);
end;
----------------------------------------------
-
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2020/12/23 23:46:51
15楼: 谢谢,最终是用了timer的方法,@emailx45
----------------------------------------------
-把学习当信仰
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行33.20313毫秒 RSS