FireMonkey的TreeView控件的一个bug
来源:互联网 发布:曹琴默 知乎 编辑:程序博客网 时间:2024/05/21 11:13
FireMonkey是delphi升级到XE版本以后新提供的一个界面框架,用于替代原来的VCL,实现真正的跨平台和移动开发,另外由于firemonkey提供基于样式配置的界面开发方式,因此能够轻松实现很多具有html5的web页面效果的原生应用。
楼主最近有点闲的蛋疼,不想把自己全部的业余时间都贡献给资本家。所以打算做一个桌面端的共享应用,希望能把界面做的炫酷一些,本来就熟悉delphi,加上FireMonkey的炫酷效果所以选择了使用firemonkey。
不扯蛋,言归正传,先记录一下这两天发现的一个bug,楼主的需求是希望做一个具有阴影边框的弹窗(如下图),这个是常见的点选窗体,需要把form设置为透明,然后把内部
的容器内放入阴影效果实现,但是问题是在放入TreeView控件以后,如果有子节点的时候,列表超过一屏,也就是出现垂直滚动栏的时候,界面就卡死了,一开始以为是自己用了FMXContainer,主程序是VCL导致消息混乱导致,后来用demo试了一下在纯FMX主程序中一样出现。跟踪到消息循环里发现,是界面刷新的时候出现了死循环,
原因:
具体调用是在FMX.Platform.Win的WndProc主消息循环中收到WM_ADDUPDATERECT消息后,PaintControl.PaintRects(UpdateRects)又会触发TPlatformWin.InvalidateWindowRect,在这个函数里如果form为透明的话会发送一条更新区域WM_ADDUPDATERECT的消息,这样的话便进入了死循环
if AForm.Transparency and not (csDesigning in AForm.ComponentState) then
begin
PostMessage(Wnd, WM_ADDUPDATERECT, Integer(SmallPoint(Round(R.Left), Round(R.Top))),
Integer(SmallPoint(Round(R.Right), Round(R.Bottom))));
end
继续跟踪发现时此时TreeViewItem如果有子节点的时候DoGetUpdateRect反复触发样式计算函数
解决方法:目前验证可行的一种方法是将所有TreeViewItem父节点的DisableDisappear设置为True,就可以打破死循环,卡死问题解决
firemonkey虽然已经推出四五年,目前已经到XE10的版本,不过可能是由于embarcadero的推广能力,fmx一直没能成为移动开发的主流语言,社区也不是特别活跃,目前来看还是属于一个冷门语言。所以,想使用新东西的话好多问题就得靠自己解决了。
- FireMonkey的TreeView控件的一个bug
- 一个好用的Treeview控件
- .Net 2005 TreeView控件的一个问题
- duilib进阶教程 -- TreeView控件的bug (9)
- 分享:Microsoft IE Webcontrols Treeview的一个bug及修正
- TreeView双击事件的bug
- 探索FireMonkey的StyleBook皮肤控件的使用
- 控件treeview的使用
- TreeView控件的安装
- .net 的TreeView控件
- .net 的TreeView控件
- TreeView控件的使用
- TreeView 控件的使用
- 高级的TreeView控件
- TreeView控件的使用
- TreeView控件的使用
- TreeView控件的使用
- Delphi FireMonkey 学习笔记 – TPopup 控件的使用
- Linux_Shell初级编程入门
- linux socket c : send data when socket close—SIGPIPE, Broken pipe
- ios uitableviewcell
- //使用顺序表实现循环队列的入队和出队
- Ubuntu下配置tftp服务
- FireMonkey的TreeView控件的一个bug
- tar.xz解压缩
- Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例
- UIWebView 加载网页数据(网页,网页片段,本地文件)
- POJ 1061-青蛙的约会(拓展欧几里得)
- C++智能指针与返回局部指针测试
- java基础知识点总结(三)
- iOS创建Framework
- linux——单网卡配置双(多)ip