源贴地址 FMX加入了ARC技术,对象创建后不用释放,FMX会帮你释放,是不是这样就不用关心对象的释放了呢,非也! 写简单的代码,这个功能也许很好用,但如果你写的是一个项目,那隐藏的坑无形中大大的增加开发难度, 开发人员需要更加小心注意对象的释放问题:你原来正常运作的代码,在FMX下,极有可能运作不正确,灵异现象熊出落
分类: 教程
[FMX]使用 TListBox.ItemsExchange 而不是??来交换列表中两个项目的顺序
上面的 ?? 有没有几个想当然的和我一样,试图用 TListBox.Items.Exchange 来交互两个项目的顺序的?如果你那么做了,恭喜您,迷茫吧~~,彷徨吧~~,陪我一起放羔羊吧~~~ p实际上官方看来也知道这个问题,在TListBox的级别上直接提供了一个 ItemsExchange 函数来完成这一工作。我想
[FMX]为 TControl 增加 DisableAlign 和 EnableAlign 方法
官方没有提供这两个方法,但我们有时候需要调整 FMX 的布局,而这一切都需要修改 FDisableAlign 这个受保护的成员的值,而要修改它的值,在以前的文章中提供了好几种方法,当然最简单的是直接加 class helper。这里我们就采用这一办法。 代码很简单,不需要解释,上面的函数都是返回之前是否允许对齐。要禁止
[教程]Delphi 下一种简单的水印图片制作方法
水印在现代社会中常用,网上有各种制作水印的办法,而我要说的办法,实际上简单而且好理解,那就是制作半透明的 PNG 图片覆盖到原始项目上就可以了。至于为啥不说 FMX 的实现,是因为 FMX 本身各种颜色设置中就包含了透明度信息,不需要这么折腾了。 第一步:制作水印内容,比如我们创建一个TBitmap对象,在上面随便输出
[QLog]使用 CalcPerf 来查询函数性能瓶径
QLog 最新的变动修改了 CalcPerf 函数的返回值类型,改为返回 IPerfCounter(将来可能改名为 IQPerfCounter ) 接口,与以前的相比,这个接口多了一个名为 MarkEscape 的函数,用于记录两次记录之间的时间间隔,以便进行性能计数。 第一步:声明一个用于统计性能的变量,并为其初始化
[QMathExpr]为 QJson 增加 QMathExpr 支持
QMathExpr 可以方便的实现表达式的计算,将它与 QJson 结合在一起,就可以对内容进行加工处理,为程序的实现提供更大的灵活性。同样的,你可以同样将 QXML/QMsgPack 一样封装下,为其加上 QMathExpr 的支持。 调用示例:
[教程]使用泛型为 Delphi 提供一个位运算的模板支持
说起来,Delphi 自 2009 引和泛型已经很长时间了,而 Delphi 缺少位域也已经更久远了,早在远古之前……,扯远了:) 新版的 Delphi 提供了一个类,名字叫 TBits,好吧,顾名思意,可是为什么是类呀?这意味着我们没法像C++一样将它嵌入到结构体里,如果你能,你就上天了@ 好吧,为了实现这一目的,本
[教程]Delphi 10.3 新特性:内联变量
简译自 Macro 技术博客 简单一句话:Delphi 终于不用非将变量定义在函数的开头位置了。 拓展开来: 1、您可以在代码中使用变量时,通过下面的格式来定义变量: var 变量名[:变量类型][:=变量值] 示例一:
1 2 3 4 5 6 7 |
procedure Test; begin var I, J: Integer; I := 22; j := I + 20; ShowMessage (J.ToString); end; |
示例2: [crayon-62c
[教程]QAnimation 使用教程之一:为 TPageControl 切换加入动画效果
首先,VCL 的 TPageControl 是没有切入切出动画的,所以,这里要做的是给 VCL 的 TPageControl 做动画支持。当然,虽然咱们说的是 QAnimation 教程,但关注的重点不是 QAnimation,而是如何给 TPageControl 添加动画效果,QAnimation 只是一个动画控制器
【教程】delphi 中如何访问另一个类中到私有成员方法 N 合 1
此文是参考 原文链接 和群友及作者自己曾经用过的方法简单总结,感谢群内的朋友和原文作者。另外,此文中所谓的访问另一个类的私有成员,另一个类并不在同一单元,在同一单元内的私有成员 Delphi 也是可以直接访问的,不需要绕圈子。 1、最易用的方法:class helper + with self 创建一个对应类的 cl
[教程] Resource XXX not found 的解决办法
一查路径:查看程序的搜索和库文件路径中是否有重名的文件,如果资源在这些重名的文件中,链接时如果错误链接到了老版本,就有可能造成此问题。 二看定义:在 Delphi 中,如果 DFM 定义和 Pas 对应的文件不完全匹配(比如界面上有的控件,但 pas 中由于某些原因被删除了),编译时并不会提示什么问题,但实际链接到程序
[教程]判断两个不同的接口实例是否是同一个对象
如果一个对象支持多个接口,当我们获取其支持的不同接口的实例时,就会得到不同的地址,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
type IA=interface ['{CB36F22E-E44C-4842-8198-7487806A3617}'] ... end; IB=interface ['{06949AE4-97F9-48C9-9E47-21E29F396DF7}'] ... end; TABObject=class(TInterfacedObject,IA,IB) ... end; |
我们假设对象 TABObject 的实例 ab,当我们写下类似于下面的代码时:
1 2 3 4 5 6 7 8 9 |
var A:IA; B:IB; begin A:=ab; B:=ab; if Pointer(A)=Pointer(B) then .... end; |
在实际运行中,A
[教程]为 Delphi 剪贴板加入 CF_HTML 数据支持
嗯,直接上代码,需要引用 QDAC 的 QString 单元,不支持太老版本的 Delphi,使用古董版的 Delphi 的请自己改写下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
uses clipbrd, qstring; type THTMLClipboardFormatData = class helper for TClipboard private class procedure RegisterHtmlFormat; function GetAsHtml: String; procedure SetAsHtml(const Value: String); public property AsHtml: String read GetAsHtml write SetAsHtml; end; var CF_HTML: WORD = 0; //此处省略一万字 { THTMLClipboardFormatData } function THTMLClipboardFormatData.GetAsHtml: String; var AHandle: THandle; pData: PQCharA absolute AHandle; AText: QStringW; p: PWideChar; begin RegisterHtmlFormat; if Clipboard.HasFormat(CF_HTML) then begin AHandle := Clipboard.GetAsHandle(CF_HTML); try AText := Utf8Decode(pData, -1); p := PWideChar(AText); while (p^ <> '<') and (p^ <> #0) do SkipLineW(p); Result := p; finally GlobalUnlock(AHandle); end; end; end; class procedure THTMLClipboardFormatData.RegisterHtmlFormat; begin if CF_HTML = 0 then CF_HTML := RegisterClipboardFormat('HTML Format'); end; procedure THTMLClipboardFormatData.SetAsHtml(const Value: String); var S: QStringA; AText: String; AHandle: THandle; begin RegisterHtmlFormat; S := QString.Utf8Encode(Value); AText := Format('Version:0.9'#13#10 + // 'StartHTML:%08u'#13#10 + // 'EndHTML:%08u'#13#10 + // 'StartFragment:%08u'#13#10 + // 'EndFragment:%08u'#13#10 + // '<html><body>'#13#10 + // '<!--StartFragment -->'#13#10 + // '%s'#13#10 + // '<!--EndFragment-->'#13#10 + '</body></html>', [97, 172 + S.Length, 111, 136 + S.Length, Value]); S := QString.Utf8Encode(AText); AHandle := GlobalAlloc(GMEM_DDESHARE, S.Length + 1); if AHandle <> 0 then begin try Move(PQCharA(S)^, GlobalLock(AHandle)^, S.Length + 1); finally GlobalUnlock(AHandle); Clipboard.SetAsHandle(CF_HTML, AHandle); end; end; end; |
用法是直接操作 Clipboard.AsHtml 属性就可以了,例如: [crayon-62c6ab577702
[日积月累]-20180622:前向声明关键字 forward
【格式】 函数声明;forward; 【用途】 forward 关键字用于前向声明一个局部函数,比如:
1 |
function Calculate(X, Y: Integer): Real; forward; |
声明了一个 Calculate 函数,那么后面必需重新声明并实现这个函数,类似于下面: [crayon-62c6ab57771b5620277296/
[日积月累]-20180621:[Warning] W1000 Symbol ‘%1’ is deprecated: ‘Use %2’
【译】 [警告] W1000 符号 ‘%1′ 已经被废弃:’请使用 %2’ 【问题原因】 当前版的 Delphi 已经不再使用名为 %1 的函数/变量/常量,目前的代码仍可以正常运行,但最好改成使用 %2 的替代函数/变量/常量。官方的意思是相应的符号将在后续的某个版本中
[教程]DateTimeFromString 函数的使用说明
DateTimeFromString 用于将一个日期时间格式的字符串表达式转换为日期时间类型,用于替代 Delphi 自己的 StrToDate 函数(弱弱的一个函数,我一直忽略它的存在)。 在绝大部分场景下,DateTimeFromString 可以正确识别多咱格式的日期时间字符串,但并不代表它的自动识别智能到可以理
[QString]FindSwitchValue 函数使用说明
【用途】 此函数用于将命令行开关分隔为一个名称-值对,并取出其中值。 【声明】
1 2 3 4 |
function FindSwitchValue(ASwitch: QStringW; ANameValueSperator: QCharW; AIgnoreCase: Boolean; var ASwitchChar: QCharW): QStringW; overload; function FindSwitchValue(ASwitch: QStringW; ANameValueSperator: QCharW = ':') : QStringW;overload; |
【参数说明】 ASwitch : 要查找的开关 ANameValueSperator : 开关和名称的值的分隔符 AIgnoreCase : 是否忽略大小写 ASwitchC
[教程] Delphi 中的自动引用计数使用规则
Delphi 用户应该早已经熟悉自动引用计数的概念(ARC),Delphi 很早就开始支持接口、动态数组和字符串的自动引用计数(DCC32、DCC64、DCCOSX),移动编译器则加入对类的自动引用计数支持,因此还加了入弱引用的概念,以管理循环引用。有个预编译条件指令 AUTOREFCOUNT 可以检测当前是否编译器
[FMX] FMX 动画类的一个辅助增强
本增强的目的是解决动画对象只支持 published 的有效的几种属性的问题,确切的说,这是一个适配器,通过匿名函数建立与非 published 属性的适配。我在 [FMX] Delphi 中 TAnimation 设计的几点值得商榷的地方 一文中讨论了 FMX 动画支持类的一些值得商榷的地方和改动,而这个增强从另一个
[教程]为 TDateTimePicker 增加日期时间类型支持(来自LakeView)
1、找到 VCL.ComCtrls.pas 单元 2、修改 TDateTimeKind 类型,增加 dtkDateTime,以便支持日期时间类型。 TDateTimeKind = (dtkDate, dtkTime, dtkDateTime); 3、找到 TDateTimePicker.CNNotify 函数,在 D