给Delphi高版本添加类似Kotlin的for的功能

前几天在盒子的帖子上讨论Delphi11的特性,一个朋友说希望有for in 0..100这种类似kotlin的循环语法。

随便指出了可以变相实现for in [0..100]即可,结果有其他朋友验证了,这种写法在DelphiXE1之前的版本是可以的,在高版本Delphi上实际上被认为是集合,那么就不能超过255个元素,无法实用。

好在高版本的Delphi的For in是通过数据类型有一个GetEnumerator方法返回枚举器来实现的,一些简单数组之类的靠编译器自动处理的。

那么就可以变相实现这个功能了。

这就变相的实现了仿kotlin这种直接for[……]

继续阅读

发表在 未分类 | 标签为 | 给Delphi高版本添加类似Kotlin的for的功能已关闭评论

Android,保活,复活,防杀

从Android5到Android11都通用。
这是在我的Mate40Pro(Android10)上面的效果

[……]

继续阅读

发表在 Android, APP, Delphi, 未分类 | 标签为 , , , | 2条评论

Managed Record的使用一则

其实Managed Record有很多方便使用的场景。
比如下面的就是把TStringBuilder由Class改成了Managed Record。好处就是不再需要释放了。[……]

继续阅读

发表在 Delphi | 标签为 , , | Managed Record的使用一则已关闭评论

Delphi Managed Record的一个不方便的地方

使用的时候还要
var a : TMyRecord := TMyRecord.create(1);
实际上既有constructor,又有Initialize,是有歧义的,完全可以合并。
变成如下这种方式:
class operator Initialize(out Dest: TMyRecord, 各种构造的参数);
比如
class operator Initialize(out Dest: TMyRecord, v : Integer);
使用的时候就可以非常简洁了。
var a : TMyRecord(1);[……]

继续阅读

发表在 Delphi | 标签为 , | Delphi Managed Record的一个不方便的地方已关闭评论

Delphi10.4托管记录(Managed Record)产生的机器代码分析

只分析了Delphi Windows平台X86,X64上的代码,ARM平台和Linux平台基于是LLVM编译器的,没有分析。

Delphi 10.4

VC2015

VC的代码之所以加了GetTickCount,Sleep是因为VC的编译器极其智能,Release版本的时候如果函数为空会直接优化掉。

先看X86版本Delphi的代码(代码优化是否勾选,产生的代码没有区别,也就是这块Debug和Release版本是一样的)

十分的啰嗦,基本可以理解成是加了一大堆的Try Finally。懒得要死。

再看VC X86 Debug版本的代码

还算干脆利索,非常直接。
再看VC X[……]

继续阅读

发表在 Delphi | 标签为 | 4条评论

Delphi 10.4 的期待和不足

Delphi10.4发布在即,看了许多特性宣传,最值得期待的就是托管记录。
最开始Delphi的结构体支持操作符重载,就很兴奋,想自己封装算法库,自己封装智能指针。
比如自己实现string,自己实现BigInt之类的。结果发现record虽然支持了操作符重载,但是不能自动初始化和反初始化。导致一些事情很难做,比如string我要默认是”,BigInt默认是0等等。
十几年前就建议增加初始化和反初始化的操作符重载,结果人家回了句话十几年都在没动静。
好在这次总算是增加了这方面的支持,但是我觉得还没做全。

想要实现类似C++的智能指针还缺个重要的操作符重载,就是.或者->(Delphi里面是^[……]

继续阅读

发表在 Delphi | 8条评论

CPP各个操作系统和平台的宏定义

#if TARGET_OS_MAC
#if TARGET_OS_IPHONE
#if TARGET_IPHONE_SIMULATOR
#if TARGET_OS_EMBEDDED

#ifdef __ANDROID__

#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
#if defined(__IPHONE_OS_MIN_VERSION_REQUIRED)

//Windows
#ifdef WIN32
#ifdef _WIN32
//64位Window[……]

继续阅读

发表在 CPP | 标签为 , , , | 103条评论

跨平台的,在FMX中读取ICON文件的每一帧到Bitmap

昨天在使用FreeImage的时候发现FreeImage对ICON的处理有问题,32位的帧读出来的背景居然是黑的。我猜应该是32位没有And的Mask数据。而它按照24位以下的处理方式把Alpha值填成255了。

只能自己动手写代码,也不复杂,算上把Windows单元抽出来声明的结构体,也就300行。经测试可以在Win32,Win64,Android,FMX for Linux上可以正常使用。

如此的简单,就不上传工程了,直接贴代码就是了。[……]

继续阅读

发表在 Delphi, 未分类 | 197条评论

关闭掉新版Delphi的几个固定导出函数(__dbk_fcall_wrapper,dbkFCallWrapperAddr,TMethodImplementationIntercept)

不知道从什么时候起Delphi编译的PE文件总是三个固定的导出函数。

一方面有强迫症的同学们会不爽,另一方面其实是不安全的。

这三个函数是:__dbk_fcall_wrapper,dbkFCallWrapperAddr,TMethodImplementationIntercept

有两种方式可以去掉他们。

1.修改RTL源代码,注释掉这几处函数的exports代码行。重新编译。不过重新编译对小白或者比较懒的同学确实不方便。况且出了新版本Delphi又要重做一遍。

2.把编译后的EXE,DLL处理一下,去掉这几个函数。

做了个小工具,可以删除EXE,DLL的导出函数的,可以批量删除导[……]

继续阅读

发表在 Delphi, 未分类 | 标签为 , , , , | 59条评论

FireMonkey在使用GDIPlus放大图像的Bug的修复

Delphi10.2中FireMonkey中GDIPlus放大图片的Bug,不知道从哪个版本开始的,还是一直都这样。

新建一个FireMonkey工程,窗口上放一个Image控件,WrapMode设置为Stretch,表示随控件大小缩放。指定一张小图。

默认使用D2D的时候放大没问题

关闭D2D使用GDIPlus渲染

initialization
GlobalUseDirect2D := False;
finalization

end.

再看:

 

边缘多了一圈渐变。

找到FMX.Canvas.GDIP.pas文件,拷贝到我们工程所在目录中。作如下修改[……]

继续阅读

发表在 Delphi, 未分类 | 标签为 , , , , | 46条评论