您的位置:首页 > 编程语言 > Delphi

Delphi XE2 之 FireMonkey 入门(15) - 滤镜: 获取滤镜信息

2013-09-30 10:25 513 查看
滤镜类的继承关系:

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 := 0;
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: