泛型,存放N张图片
(* *************************************************
1、里面放多张图片,用文件名作为索引
2、线程在背后从硬盘加载到内存
3、批量加载
4、加载完成后执行回调,回调是线程安全的
5、回调中的参数是新加载了多少张图片
************************************************** *)
unit BitmapList; interface uses
ystem.SysUtils, System.Classes, FMX.Graphics, Generics.Collections,
xSuperObject, xSuperJson, UrlMon, IdURI, DateUtils; type
TBitmapList = class(TDictionary<string, TBitmap>)
private public
RPath, LPath: string; // url路径,本地路径
function CreateDirPath(url: string): string; // 生成路径
function GetSubDateTime(S1, S2: string): string; // 获取两个时间间隔
procedure LoadFromFiles(s: string; callback: TProc < Integer >= nil); overload; // 加载一个或逗号分隔的多个图片文件名
procedure LoadFromFiles(ss: TStrings; callback: TProc < Integer >= nil);overload; // TStrings 的多个图片文件名
procedure LoadFromFiles(ja: ISuperArray; callback: TProc < Integer >= nil); overload; // jo 的多个图片文件名
procedure LoadFromFiles(ja: ISuperArray; k: string; callback: TProc < Integer >= nil); overload; // ja.O[i].S[K]的多个图片文件名 ja里的某个值
end;
implementation
uses UnitLog;
{ TBitmapList }
procedure TBitmapList.LoadFromFiles(s: string; callback: TProc<Integer>);
var
temp1, temp2: string;
i, j: Integer;
begin
TThread.CreateAnonymousThread(
procedure
var
i, n: Integer;
t, t1: string;
o: TBitmap;
a: TArray<string>;
begin
n := 0;
a := s.Split([',']);
for i := 0 to length(a) - 1 do
begin
t := a[i];
if (t <> '') and (not ContainsKey(t)) then
begin
if (not FileExists(t)) and (RPath <> '') then
begin
t1 := t.Replace(RPath, LPath).Replace('/', '\'); // 本地路径
if (UrlDownloadToFile(nil, PChar(TIdURI.URLEncode(t)), PChar(t1), 0, nil) = 0) then
t := t1
else
t := '';
end;
if (t <> '') and (ContainsKey(t) = False) then
begin
o := TBitmap.Create;
o.LoadFromFile(t);
Add(t, o);
Inc(n);
end;
end;
end; if (Assigned(callback)) then
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
callback(n);
end);
end).Start;
end; procedure TBitmapList.LoadFromFiles(ss: TStrings; callback: TProc<Integer>);
var
s: string;
i: Integer;
begin
for i := 0 to ss.Count - 1 do
begin
s := ss[i];
LoadFromFiles(s, callback);
end;
end; procedure TBitmapList.LoadFromFiles(ja: ISuperArray; k: string;
callback: TProc<Integer>);
var
s: String;
x: IMember;
i: Integer;
begin
s := '';
for x in ja do
s := s + x.AsObject.s[k] + ',';
s := s.TrimRight([',']);
LoadFromFiles(s, callback);
end; procedure TBitmapList.LoadFromFiles(ja: ISuperArray; callback: TProc<Integer>);
var
s: string;
x: IMember;
begin
s := '';
for x in ja do
s := x.AsString;
LoadFromFiles(s, callback);
end;
泛型,存放N张图片的更多相关文章
- Android Bitmap 全面解析(二)加载多张图片的缓存处理
一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~ ...
- ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- SQLite剖析之编程接口详解
前言 使用过程根据函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_fina ...
- Windows Store App JavaScript 开发:简单对象绑定
简单对象绑定是一种基本的绑定类型,可以实现将一个对象中的数据绑定到HTML元素的属性.下面通过一个示例来演示如何使用HTML5和JavaScript开发一个实现简单对象绑定的Windows应用商店应用 ...
- 网页FLASH幻灯片播放带链接源代码 pixviewer.swf使用(转)
<script type="text/javascript"> <!-- var focus_width=360 var focus_height=270 ...
- 轻量级开源内存数据库SQLite性能测试
[IT168 专稿]SQLite是一款轻型的数据库,它占用资源非常的低,同时能够跟很多程序语言相结合,但是支持的SQL语句不会逊色于其他开源数据库.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品 ...
- SQLiteAPI函数详解
使用的过程根据使用的函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_fin ...
- sqlite3使用简介(内含解决sqlite内存的方法)
一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll ...
- UI:页面传值、单例模式传值、属性传值、NSUserDefaults 数据持久化
<单页面传值> 页面传值,从前向后传值,使用属性,在后一个页面定义属性,在前一个页面,用点语法,获得值,在适当的时候传值 页面传值,从后向前面传值,使用协议和代理,在后一个页面指定协议,定 ...
随机推荐
- linux 源码安装
下载源码安装包,一般为.tar.gz格式 解压源码至文件夹,linux终端进入该文件夹,安装只需三步,第四步为扫尾工作: ./configure --prefix=/usr/self/文件夹名称 ...
- 树莓派_360wifi2_佳能MP236打印机
入手树莓派后一直没时间弄,设想用360wifi做无线网卡,也一直不得解,今天成功写下经验 本人刷的是官方系统,版本为3.12.28,首先更新系统内核,参考以下网址: http://groenholdt ...
- 百度地图api简单使用方法
百度地图API的使用方法 百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html&g ...
- ajax返回值给上层函数的方法。
function load_val(callback){//定义一个回调函数 $.getJSON('test.php' , function(dat){ callback(data);//将返回结果当 ...
- 百度地图API示例之添加定位相关控件
代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" cont ...
- Android,配置Activity为启动Activity(AndroidManifest.xml,application,intent-filter,MAIN,LAUNCHER)
备忘: 将Activity注册为启动Activity. 在AndroidManifest.xml中的<application>元素中加入以下<activity>子元素内容: & ...
- pcA降维算法
http://ufldl.stanford.edu/wiki/index.php/主成分分析 if ~exist('train_IM_all','var')||~exist('train_LA_all ...
- 转 苹果的新编程语言 Swift 简介
苹果官方文档地址 https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Pro ...
- C语言课设心得分享(一)
今儿上完课设,老师果然讲的比较少,周四还不用去,看来还是学生自己折腾.我在做课设的过程中,攒了一些心得/体会,希望能和大家分享分享,也希望能一起探讨探讨.如果是我能回答的问题,我很乐意能够提供帮助. ...
- POJ 1661 Help Jimmy LIS DP
http://poj.org/problem?id=1661 对板按高度排序后. dp[i][0]表示现在站在第i块板上,向左跑了,的状态,记录下时间和其他信息. O(n^2)LIS: 唯一的麻烦就是 ...