(* *************************************************
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张图片的更多相关文章

  1. Android Bitmap 全面解析(二)加载多张图片的缓存处理

    一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~ ...

  2. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  3. SQLite剖析之编程接口详解

    前言 使用过程根据函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_fina ...

  4. Windows Store App JavaScript 开发:简单对象绑定

    简单对象绑定是一种基本的绑定类型,可以实现将一个对象中的数据绑定到HTML元素的属性.下面通过一个示例来演示如何使用HTML5和JavaScript开发一个实现简单对象绑定的Windows应用商店应用 ...

  5. 网页FLASH幻灯片播放带链接源代码 pixviewer.swf使用(转)

        <script type="text/javascript"> <!-- var focus_width=360 var focus_height=270 ...

  6. 轻量级开源内存数据库SQLite性能测试

    [IT168 专稿]SQLite是一款轻型的数据库,它占用资源非常的低,同时能够跟很多程序语言相结合,但是支持的SQL语句不会逊色于其他开源数据库.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品 ...

  7. SQLiteAPI函数详解

    使用的过程根据使用的函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_fin ...

  8. sqlite3使用简介(内含解决sqlite内存的方法)

    一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll ...

  9. UI:页面传值、单例模式传值、属性传值、NSUserDefaults 数据持久化

    <单页面传值> 页面传值,从前向后传值,使用属性,在后一个页面定义属性,在前一个页面,用点语法,获得值,在适当的时候传值 页面传值,从后向前面传值,使用协议和代理,在后一个页面指定协议,定 ...

随机推荐

  1. 无法使用内置管理员账户打开Microsoft Edge

    一.以管理员批准模式运行所有管理员 运行"gpedit.msc",打开本地组策略编辑器,然后依次打开"计算机配置→Windows 设置→安全设置→本地策略→安全选项&qu ...

  2. Python自动化 【第五篇】:Python基础-常用模块

    目录 模块介绍 time和datetime模块 random os sys shutil json和pickle shelve xml处理 yaml处理 configparser hashlib re ...

  3. Eclipse/MyEclipse怎么设置个性化代码注释模板

    1.打开Eclipse/MyEclipse工具,打开或创建一个Java工程,点击菜单Window->Preferences弹出首选项设置窗口 2.展开左侧Java->Code Style- ...

  4. zabbix通过curl命令判断web服务是否正常并自动重启服务

    zabbix通过curl命令判断web服务是否正常并自动重启服务 主要思路: 通过curl命令获取服务器响应码,如果正常返回200,不正常返回000 具体命令: curl -I -s -w " ...

  5. cocos2d-js 3.0rc0加载游戏引擎时长时间黑屏

    如果是原始引擎的话是会比较大一些,但是最终发布的时候我们都建议你打包成release版,这个可以使用cocos命令 cocos compile -p web 来完成轻松打包,会在你的项目目录下创建一个 ...

  6. asp.net GridView控件中诗选全选和全不选功能

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  7. [2015hdu多校联赛补题]hdu5303 Delicious Apples

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5303 题意:在一个长为L的环形路径上种着一些苹果树,告诉你苹果树的位置(题目中以0~L指示坐标)及苹果 ...

  8. MATLAB - 练习程序,求灰度图像均值、最大、最小数值

    clear all; close all; clc img=imread('lena.bmp'); figure; imshow(uint8(img)); [m n]=size(img); img_m ...

  9. Selenium2+python自动化25-js处理日历控件(修改readonly属性)

    前言 日历控件是web网站上经常会遇到的一个场景,有些输入框是可以直接输入日期的,有些不能,以我们经常抢票的12306网站为例,详细讲解如何解决日历控件为readonly属性的问题. 基本思路:先用j ...

  10. eval语句(sql)类似asp

    执行字符串的SQL语句,相当于asp中的eval ***** declare @sql nvarchar(500) set @sql='select * from  sk_hzp_fk_prescri ...