| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2391 人关注过本帖, 2 人收藏
标题:用imagelist控件载入许多小图片时,为什么总用出现OUT OF MEMORY?
只看楼主 加入收藏
天狼剑星
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2010-11-11
收藏
得分:0 
对了,昨天按你的说法,我的理解是这样的,表单上放一个容器,然后程序运行时,取出需要显示的每个图片的文件名,然后做一个循环,每一步都往容器里添加一个IMAGE控件,然后把IMAGE控件的图像源设定了指定文件,第一,这样做行吗?如果行的话,我有以下问题
1、在程序运行时,用语句往容器里添加IMAGE控件我不会写
2、我想在每个图下面显示文件名,如何实现?
3、添加的IMAGE控件的尺寸如何设定?控件与控件之间的间距如何设定?
4、如果添加的IMAGE控件很多的话,容器会自动添加滚动条吗?

我的要效果如附件所示
图片附件: 游客没有浏览图片的权限,请 登录注册

2011-08-24 11:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
前面三个都可以实现,但Container没有滚动条,表单或编辑框才有,建议用表单。

授人以渔,不授人以鱼。
2011-08-24 11:40
天狼剑星
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2010-11-11
收藏
得分:0 
可以教教我如何写语句及思路吗?我水平不够,感激了!
2011-08-24 11:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果一定要用Container,可以不做滚动条,改设计按钮滚动,或者用键盘滚动。

授人以渔,不授人以鱼。
2011-08-24 11:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
凡是往容器中添加控件,都是用AddObject()或NewObject()。比如你的容器是Container1,则用Container1.AddObject("Image01", "Image")动态添加控件,第一个参数是控件的Name,字符串,第二个参数是控件的基类名。添加之后,就可以对Container.Image01进行操作,比如:
程序代码:
ThisForm.Container1.AddObject("Image01", "Image")
WITH ThisForm.Container1.Image01
    .Picture = "Picture01.JPG"    && 设定控件的图片来源
    .Stretch = 1                  && 图片保持比例缩放
    .Height = 200                 && 控件Image01的尺寸
    .Width = 200
    .Top = 10                     && 控件Image01左上角的坐标,相对其容器,即Container1
    .Left = 10
    .Visible = .T.                && 动态添加的控件默认都是不可见的,必须设为可见
ENDWITH

注意:精确定位可用容器的尺寸和此处设定的控件尺寸计算,都是可算的!比如,要图片放在容器的底部离地5像素处,可以写:
.Top = .Parent.Height - .Height - 5

这就是运行时动态添加控件的基本方法。留意AddObject()中新控件的变量名是用字符串传入的,也就意味着,这个字符串是你可以计算出来,它的命名可以有规律(就如你平常的Form1、Form2),也可以是数组。只要你能循环,想添加多少个控件都没问题。

使用Stretch属性缩放图片,是原图缩放,不会对图片的精度作修改。

[ 本帖最后由 TonyDeng 于 2011-8-24 12:11 编辑 ]

授人以渔,不授人以鱼。
2011-08-24 12:00
天狼剑星
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2010-11-11
收藏
得分:0 
非常感谢,我先试试看
2011-08-24 12:30
天狼剑星
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2010-11-11
收藏
得分:0 
代码.rar (1.11 KB)

TonyDeng,请帮我看一下代码,实现是实现了,看看是不是可以更合理,另外,还有以下问题
1、我想在每个IMAGE控件的MOUSEMOVE代码里,把鼠标指标改掉,这样生动一点,如何实现?
2、每个屏幕的尺寸不一样,如何计算在不同屏幕上每一列显示的图片个数?(我目前是7个)
2011-08-24 17:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我先下载,快下班了,晚上有空再看。

授人以渔,不授人以鱼。
2011-08-24 17:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片排列部分没什么大问题,还可以简练一点。

前面那个取文件列表的FOR循环,不要直接FOR i = 1 TO ADIR(),那样就不断地从磁盘读取文件列表和建立数组了。ADIR()函数的用法,是返回得到的数组行数,如果返回值为0,表示没有实质性动作,此时如果原先没有那个数组alj[],则不会建立它,但如果已有这个数组,则不会删掉原有的元素,而是保留不动。因此,正确的用法是先建立数组alj,即DIMENSION alj[1][5],然后再IF ADIR(alj, bl) > 0进行判断,实际读入文件列表了就执行后续动作,否则跳离,不要再做动作。当真有文件时,ADIR()会自动修改alj数组的行数。也就是说,要保障性的调用是每次执行ADIR()之前都把数组清空,只留一行,用返回值来判断成功与否。

要修改鼠标,可以设置Image.MousePoint属性,有多种值对应各种鼠标形状(具体可查帮助),值范围从0-16,0是默认鼠标,若设为99,则使用自己定制的鼠标图标(外部图片),此时用MouseIcon属性指定。

各种有尺寸的控件都有其Height、Width、Top、Left属性,ThisForm.Width就是当前窗体的宽度,This.Width是当前控件的宽度(当前是什么控件就是什么控件的宽度),得到这些尺寸和位置数据,怎么计算调整都不是问题。比如你获取当前窗体的宽度之后,可以根据需要设定的图片宽度(你现在设定为100)对比,就得到该放多少列了。这是动态调整控件布局的基本办法,窗体拉伸也可以自动调整的。

授人以渔,不授人以鱼。
2011-08-24 20:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
还有,你那个ADIR()数组中对减号的处理是多余,表明你实际上不知道ADIR()的用法。ADIR()自动建立的二维五列数组alj[n][5],每行是一个文件,第一列是文件名(不带路径),第二列是文件的大小(字节数),第三列是最后的修改日期,第四列是最后的修改时间,第五列是文件属性(表明是普通文件、隐藏文件还是文件夹等等)。你使用的时候,直接取alj[n][1]就是文件名了,不用做什么(当然前面要自己加入路径,你做了)。

授人以渔,不授人以鱼。
2011-08-24 21:41
快速回复:用imagelist控件载入许多小图片时,为什么总用出现OUT OF MEMORY?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053184 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved