[教程]如何保证对象释放时,异步调用过程都已经完成

[基本原理] 我们使用一个引用计数可以很简单的完成这一需求。 [实现细节] [进一步的实现] 上面的实现简单可靠,唯一的问题,就是对象释放必需等待异步操作完成。这个时间点是不可靠的,要更好的实现可以将异步调用进行额外的处理,并将其与对象的生命周期进行拦截。

[教程]TToolBar.TToolButton 不同按钮下拉菜单使用同一个TPopupMenu

我只是不想放那么多 TPopupMenu ,可能别人早知道,可以略过不看。 1、按钮设置样式为 tbsDropDown。 2、放一个 TPopupMenu,添加一级菜单和子菜单,二级子菜单才是我们要呈现的内容。如果要显示图标,就让 TPopupMenu 和 TToolBar 关联到同一个 TImageList,然后设置

[ZBar]ZBar 泛型库目录

[单元名] zbar.generics [组件包] zbar.rtl [组件包价格] ¥99.00 元 [单元功能] 基于泛型实现的开源容器和基础算法 [类] TZSimpleObject<T> : 仅包含一个数据成员( Value )的简单类实现 TZSimpleInterface<T> : 仅包含一个数

[教程] ZValueWatch 教程之二:在线程中处理图片

前面的教程中,我们演示了一个进度更新和位置调整的示例,接下来我们演示如何创建一个特定类型的监视对象来动态更新一个特殊类型的属性。 1、在界面上放置需要的组件,我们要在线程中动态更新图像内容,然后在前台显示(本示例依赖于 Graphics32)。 2、设置 ZWatcher的Kind为wkMessage或 wkTimer

[教程] ZValueWatch 教程之一:在主线程中监测值变化

Z 系列又加入了新的成员:ZValueWatch,它被实现用来异步监测一个值的变化。 IZValueWatch 通过将赋值和变更通知进行了异步化,这样子,在值频繁变化的场景,可以有效的减少变更通知的次数,从而提升程序的运行效率。 我们假设一个典型的应用场景:我们在后台线程中要执行长时间的操作,并且及时更新前台的进度显示

[教程]FMX中实现图片素材形状剪裁

这个东西,如果不知道方法,还是很难办的。知道方法就很容易了。 1、我们放一个TCircle,当然其它的也随意。 2、修改 Fill 的三个属性:Bitmap 指向要被剪裁的图片, WrapMode 选择 TileStretch(请保持图片尺寸比例和当前圆形的尺寸一致,否则可能变形),Kind 改为 Bitmap 设置完

[教程]VirtualTreeView 组件中,释放时可能造成假死问题修复

在 TBaseVirtualTree.Destroy 函数里,有一段代码是这么写的: 注意这个 while 循环,因为它调用的 CheckSynchronize 去检查后台线程是不是异步调用了自己,但它没有考虑如果有其它线程或者同步代码在频繁 TThread.Synchronize 或 TThread.Queue/TT

[教程]高效处理在主线程中显示后台线程处理进度

先看经典的处理方法: 我们需要更新进度时,将其切换到主线程,并更新进度显示。我们测试显示用了32735ms,也就是说100万次进度更新,用了约33秒。 接下来我们来看下优化后的代码: 对的,你没看错,我们将 FProgress.Update 直接在后台线程调用了。我们对其代码进行了逻辑隔离,实测 100 万次进度更新,

[教程]FMX for Android 使用自定义字体

步骤1:找到相应的字体文件 步骤2:在部署页面,将字体部署到 assets\internal\,保证文件为名为 字体名称.ttf 或者是 字体名称.otf,注意这个字体名称必需与在控件的 TextSettings.Font.Family 的设置一致 步骤3:设置对应控件的字体属性名称为文件名中的 字体名称 部分 步骤4

[FMX]修正 FMX 组件嵌套时 Tab 顺序不正常的问题

问题发生在 FMX.Forms.AdvanceTabFocus,检测 Tab 顺序时,没有做深入测试,造成无法正确的处理。 下面的代码用于解决这个一问题,在窗体中增加: 在对应的实现中,增加如下代码: 注意:上面的代码为免费版本代码,付费版本代码支持自动注入和焦点循环,付费金额:99元 付费方式

[教程]Delphi Android应用启动画面详解

很多人在吐嘈Delphi Android Splash 的设定(包括我在内),确实设计的很糟糕。不过话说回来了,也不是不能用,所以大家研究之后,八仙过海,各显神通。对于这些教程,大家可以参考。 首先说一下 Delphi 自带的 Android Splash 实现的限制: 如果你注意到上面的限制,那么如果不修改系统的 S

【教程】QJSON 创建根结点为数组的 JSON 内容

默认情况下,QJson创建后的实例是 jdtNull 类型(空类型),当向其添加子元素,会自动调整为 jdtObject (对象类型),如果是用 AsXXX赋值时,会自动根据接口改变结点类型。 如果我们在 QJson 中,要将根结点改变数组类型,就需要明确指定这一点: 在明确这一点以后,后面的代码写法就和普通的 JSO

[FMX]教程:运行时动态修改 FMX 样式

简单说几个点: 1、FMX 框架下,样式是通过名称来标志的。 2、GetStyleObject 默认是克隆原始的样式,所以直接修改对象自身的 FResourceLink 实例,不会影响其它样式,如果要修改全部同一类型控件的样式,手动调用控件的 GetStyleObject(false) 来获取样式的原始实例即可,进行调

[ZAsync]TZAsync.Queue

[功能说明] 此函数是一个简单的封装,以便在主线程中异步执行一些操作。而操作关联的组件如果释放的话,可以保证操作不会发生。 [函数参数] AOwner :异步操作依赖的宿主组件 AOnExecute : 要执行的操作代码 AOnCancel :当用户取消或宿主组件被释放时触发 AOnCleanup :无论操作是否被取消