滤镜类的继承关系:
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;
分类:
XE2 与 FireMonkey
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧