滤镜类的继承关系:
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;