滤镜类的继承关系:


TObject -> TPersistent -> TFilter -> TShaderFilter -> { 具体的滤镜类 }

//下面例子首先会用到 FMX.Filter 单元的四个公用方法:
procedure FillCategory(AList: TStrings);
procedure FillFiltersInCategory(const Category: string; AList: TStrings);
function FilterByName(const AName: string): TFilter;
function FilterClassByName(const AName: string): TFilterClass;

通过 FillCategory()方法可以获取滤镜的分类列表:


FillCategory(ListBox1.Items);

通过 FillFiltersInCategory()方法可以获取某个类别的滤镜列表:


FillFiltersInCategory('分类名称', ListBox2.Items);

通过 FilterByName()方法可以获取滤镜对象:


var
  filter: TFilter;
begin
  filter := FilterByName('滤镜名称'); //这很方便, 省得手动建立了
end;

通过 TFilter 的 FilterAttr()方法可以获取滤镜的信息:


var
  filter: TFilter;
  filterRec: TFilterRec; //滤镜信息被包装在 TFilterRec 类型的结构体中
begin
  filter := FilterByName('滤镜名称');
  filterRec := filter.FilterAttr;
  {因为 FilterAttr 是 class 方法, 所以也可以如下获取}
  filterRec := FilterClassByName('滤镜名称').FilterAttr;
end;

TFilterRec 结构:


TFilterRec = record
  Name: string;                //滤镜名称
  Desc: string;                //滤镜描述
  Values: TShaderValueRecArray; //滤镜的参数数组, TShaderValueRec 类型
end;

TShaderValueRec 结构:


TShaderValueRec = record
  Name: string;                //参数名称
  Desc: string;                //参数描述
  ValueType: TShaderValueType; //参数类型: vtFloat, vtPoint, vtColor, vtBitmap(数值、点、颜色值、图像)
  Value: Variant;              //参数值
  Min, Max, Default: Variant;  //参数的最小、最大及默认值
end;

测试: 需要两个 TListBox、一个 TMemo, 还有 OnCreate 事件和 TListBox 的 OnClick 事件.


uses System.TypInfo; //用于获取枚举名称

procedure TForm1.FormCreate(Sender: TObject);
begin
  FillCategory(ListBox1.Items); //获取分类名称列表
end; procedure TForm1.ListBox1Click(Sender: TObject);
var
  strItem1: string;
begin
  strItem1 := ListBox1.Items[ListBox1.ItemIndex];
  FillFiltersInCategory(strItem1, ListBox2.Items); //获取指定类别的滤镜列表   ListBox2.ItemIndex := ;
  ListBox2.OnClick(nil);
end; procedure TForm1.ListBox2Click(Sender: TObject);
var
  strItem2: string;
  filter: TFilter;
  filterRec: TFilterRec;
  shaderValueRec: TShaderValueRec;
begin
  strItem2 := ListBox2.Items[ListBox2.ItemIndex];
  filter := FilterByName(strItem2); //通过滤镜名称获取滤镜对象
  filterRec := filter.FilterAttr;  //获取滤镜对象的信息
//  filterRec := FilterClassByName(strItem).FilterAttr; //同上一行   Memo1.Text :=  '滤镜类名: ' + filter.ToString; //ClassName
  Memo1.Lines.Add('滤镜名称: ' + filterRec.Name);
  Memo1.Lines.Add('滤镜描述: ' + filterRec.Desc);
  Memo1.Lines.Add('------------------------------------------------');   for shaderValueRec in filterRec.Values do
  begin
    Memo1.Lines.Add('参数名称: ' + shaderValueRec.Name);
    Memo1.Lines.Add('参数描述: ' + shaderValueRec.Desc);
    Memo1.Lines.Add('参数类型: ' + GetEnumName(TypeInfo(TShaderValueType), Integer(shaderValueRec.ValueType)));
    if shaderValueRec.ValueType <> TShaderValueType.vtBitmap then
    begin
      Memo1.Lines.Add('当前值: ' + string(shaderValueRec.Value));
      Memo1.Lines.Add('最小值: ' + string(shaderValueRec.Min));
      Memo1.Lines.Add('默认值: ' + string(shaderValueRec.Default));
      Memo1.Lines.Add('最大值: ' + string(shaderValueRec.Max));
    end;
    Memo1.Lines.Add(EmptyStr);
  end;
end;

Delphi XE2 之 FireMonkey 入门(15) - 滤镜: 获取滤镜信息的更多相关文章

  1. Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView、TTreeViewItem

    Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView.TTreeViewItem TScrollBox -> TCustomTreeView -> ...

  2. Delphi XE2 之 FireMonkey 入门(43) - 控件基础: TStringGrid、TGrid

    Delphi XE2 之 FireMonkey 入门(43) - 控件基础: TStringGrid.TGrid TStringGrid.TGrid 都是从 TCustomGrid 继承; 区别有:1 ...

  3. Delphi XE2 之 FireMonkey 入门(41) - 控件基础: TListBox

    Delphi XE2 之 FireMonkey 入门(41) - 控件基础: TListBox TScrollBox -> TCustomListBox -> TListBox; 其元素项 ...

  4. Delphi XE2 之 FireMonkey 入门(40) - 控件基础: TMemo

    Delphi XE2 之 FireMonkey 入门(40) - 控件基础: TMemo 值得注意的变化: 1.其父类 TScrollBox 的许多特性也很有用处, 如:   Memo1.UseSma ...

  5. Delphi XE2 之 FireMonkey 入门(37) - 控件基础: TControl 概览

    Delphi XE2 之 FireMonkey 入门(37) - 控件基础: TControl 概览 { TControl } public   constructor Create(...); ov ...

  6. Delphi XE2 之 FireMonkey 入门(36) - 控件基础: TForm

    Delphi XE2 之 FireMonkey 入门(36) - 控件基础: TForm 当我第一次读取 Form1.StyleLookup 并期待出现 "formstyle" 时 ...

  7. Delphi XE2 之 FireMonkey 入门(45Finally) - 结题与问题

    Delphi XE2 之 FireMonkey 入门(45Finally) - 结题与问题 很喜欢 FMX 的一些新控件, 如: TExpander.TArcDial.TComboTrackBar.T ...

  8. Delphi XE2 之 FireMonkey 入门(42) - 控件基础: TComboBox、TComboEdit

    Delphi XE2 之 FireMonkey 入门(42) - 控件基础: TComboBox.TComboEdit TListBox 有两个兄弟 TComboListBox.TComboEditL ...

  9. Delphi XE2 之 FireMonkey 入门(39) - 控件基础: TScrollBox、TVertScrollBox、TFramedScrollBox、TFramedVertScrollBox

    Delphi XE2 之 FireMonkey 入门(39) - 控件基础: TScrollBox.TVertScrollBox.TFramedScrollBox.TFramedVertScrollB ...

随机推荐

  1. 梯度下降算法(Gradient descent)GD

    1.我们之前已经定义了代价函数J,可以将代价函数J最小化的方法,梯度下降是最常用的算法,它不仅仅用在线性回归上,还被应用在机器学习的众多领域中,在后续的课程中,我们将使用梯度下降算法最小化其他函数,而 ...

  2. 020-VMware虚拟机作为OpenStack计算节点,上面的虚拟机无法启动问题解决

      问题描述: VMware虚拟机作为OpenStack计算节点,如果安装的操作系统是CentOS7.3,则在此计算节点放置的虚拟机无法正常启动,报如下错误: 在创建计算节点时,为了能让 KVM 能创 ...

  3. 数据结构课后练习题(练习一)1007 Maximum Subsequence Sum (25 分)

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  4. VB Open 函数详解 打开、关闭、读、写文件

    (一)打开和关闭文件      1.顺序文件     打开顺序文件,我们可以使用Open语句.它的格式如下:Open pathname For [Input |Output |Append] As [ ...

  5. 安装了vs2019 编译node-sass node-gyp 找不到编译器的解决方法

    1 新建powershell脚本文件 <# This is a workaround for "node-gyp is unable to find msbuild if VS2019 ...

  6. vue开发移动端总结

    1.app.vue组件中,外层只能有一个div块,不能多个并列在一起. 正确: 错误: 2.main.js文件 3. app.vue文件 4. stroe.js 文件 5. router.js

  7. 【leetcode】848. Shifting Letters

    题目如下: 解题思路:本题首先要很快速的计算出任意一个字符shift后会变成哪个字符,其实也很简单,让shift = shift % 26,接下来再做计算.第二部是求出每个字符要shift的次数.可以 ...

  8. react native之使用 Fetch进行网络数据请求

    这是一个单独的页面,可以从其他地方跳转过来. 输入语言关键字,从github检索相关数据 import React, {Component} from 'react'; import { StyleS ...

  9. 2,ActiveMQ-入门

    ActiveMQ是Apache出品的,非常流行的消息中间件,可以说要掌握消息中间件,需要从ActiveMQ开始.首先去官网下载:ActiveMQ官网 一,ActiveMQ目录配置文件 1.1,Acti ...

  10. System.currentTimeMillis和System.nanoTime()

    ns(nanosecond):纳秒, 时间单位.一秒的10亿分之一,即等于10的负9次方秒.常用作 内存读写速度的单位.  1纳秒=0.000001 毫秒  1纳秒=0.00000 0001秒 jav ...