从delphi 10.3到delphi 10.4的改变实务

目录

从delphi 10.3到delphi 10.4的改变实务

以下逐步更新中(其中来自2群友和网友的部分,均有标注)......

序1、RAD Studio 10.3 Rio官方教程:

序2、RAD Studio 10.4 Sydney官方教程:

序3、RAD Studio官方精选博客:

序4、RAD Studio官方gitHub:

序5、RAD Studio 10.4 Demos官方gitHub:

序6、RAD Studio 10.4应用案例的官方特色作者:

官方公布的“RAD Studio 10.4.1中修复的新功能和客户报告的问题”清单:

官方公布的“RAD Studio 10.4.2中修复的新功能和客户报告的问题”清单:

第一篇  IOS篇

101、问:(2020-08-20)现在上架IOS,一定要用10.4吗?

102、问:(2020-08-20)用10.4新建一个新工程,在IOS上跑了一下,屏幕上form上下都有像是少了一节?!

第二篇  Android篇

2.001、10.4的Android真机64位调试安装不了

 2.002、关于D10.4.2的Android 64位发布结果

第三篇  MSWindows篇

3.001、TabControl设置为透明  群友QQ: 448089110 提供

3.002、RAD Studio 10.4.1新的基于Chromium的Microsoft Edge浏览器的TEdgeBrowser控件用法

3.003、使用 VCL 新用法 TImageCollection  + TVirtualImageListhttp://docwiki.embarcadero.com/RADStudio/Sydney/en/Supporting_high-DPI_images_with_the_Image_Collection_and_Virtual_ImageList_components

3.004、使用D10.4 Demos下Win10通知

第四篇  MACOS篇

第五篇  通用篇

5.001、《RAD Studio 10.4.1 Sydney 新增与改进内容介绍》

5.002、2020-09-02:TWebBrowser.LoadFromStrings变了写法TEncoding, 默认ANSI ,radstudio_ 10 4 101461a.iso

5.003、2020-09-02:关于升级和打补丁,来自群:②FireMonkey[移动开发]老猫

5.004、10.4.1支持的TPlatform

 5.005、正确使用平台识别标签

5.006、正确使用匿名线程

 5.007、DaataSnap原生服务端方法由其默认的客户端代理程序返回的UTF16编码的Json的乱码解决方法

 5.008、IDE多线程Parnassus并行调试器插件:新增(2020-12-15免费发布):

 5.009、线程相关的改进-单列:

第六篇  综合篇

6.1、专题开发

6.1.001、《哪里不放您的Delphi组件》

               《Windows中的ProgramData文件夹是什么?》

               《程序在ProgramData中存储什么?》

               《在ProgramData文件夹中有什么重要的备份吗?》

6.2、非官方推荐的开发资源

6.2.001、Delphi国内优秀网站及开源项目

第七篇  Linux篇

7.1、容器技术


从delphi 10.3到delphi 10.4的改变实务

以下逐步更新中(其中来自2群友和网友的部分,均有标注)......

序1、RAD Studio 10.3 Rio官方教程:


     http://docwiki.embarcadero.com/RADStudio/Rio/en/Getting_Started_with_RAD_Studio


序2、RAD Studio 10.4 Sydney官方教程:


     http://docwiki.embarcadero.com/RADStudio/Sydney/en/10.4_Sydney_-_Release_1
     http://docwiki.embarcadero.com/RADStudio/Sydney/en/Tutorials

序3、RAD Studio官方精选博客:

     https://community.idera.com/developer-tools/b/blog

序4、RAD Studio官方gitHub:

     https://github.com/Embarcadero

序5、RAD Studio 10.4 Demos官方gitHub:

     https://github.com/Embarcadero/RADStudio10.4Demos

序6、RAD Studio 10.4应用案例的官方特色作者:

     阿塔纳斯·波波夫(Atanas Popov)  https://blogs.embarcadero.com/author/atanas_popov/
     大卫一世(MVP)David Millington   https://blogs.embarcadero.com/author/davidi/
     戴维·米林顿   https://blogs.embarcadero.com/author/davidmillington/
     吉姆·麦基思Jim McKeeth   https://blogs.embarcadero.com/author/jimm/
     马可·坎图Marco Cantu   https://blogs.embarcadero.com/author/marcocantu/
     莎琳娜·杜邦Sarina DuPont   https://blogs.embarcadero.com/author/sarinadupont/
     斯蒂芬·鲍尔Stephen Ball   https://blogs.embarcadero.com/author/stephenball/
     技术合作伙伴Tech Partner   https://blogs.embarcadero.com/category/tech-partner/

官方公布的“RAD Studio 10.4.1中修复的新功能和客户报告的问题”清单:

http://docwiki.embarcadero.com/RADStudio/Sydney/en/New_features_and_customer_reported_issues_fixed_in_RAD_Studio_10.4.1

官方公布的“RAD Studio 10.4.2中修复的新功能和客户报告的问题”清单:

http://docwiki.embarcadero.com/RADStudio/Sydney/en/New_features_and_customer_reported_issues_fixed_in_RAD_Studio_10.4.2

http://docwiki.embarcadero.com/RADStudio/Sydney/en/Supported_Target_Platforms 

第一篇  IOS篇

101、问:(2020-08-20)现在上架IOS,一定要用10.4吗?

答:新上架 :  必须 10.4,10.3.3得自己 手工去做 “故事版” 的 Asserts.car文件。10.3.3  手工做了 故事版 的 Asserts.car文件,也是 可以的,可参考:https://blog.csdn.net/pulledup/article/details/107100019

102、问:(2020-08-20)用10.4新建一个新工程,在IOS上跑了一下,屏幕上form上下都有像是少了一节?!

答:必须得有故事版:1、直接将10.3的工程搬过来,原info.plist.TemplateiOS.xml配置模板,需要将“故事版”条目加入:<%StoryboardInfoPListKey%>。2、新建工程,必须维护故事版的Icons,默认的图标只能用于调试和运行,是不符合上架要求的,用它们产生的故事版,只有背景色无图标。

第二篇  Android篇

2.001、10.4的Android真机64位调试安装不了

内核不对吧,显示OLDSDK  :

 2.002、关于D10.4.2的Android 64位发布结果

  2.002.1、上图所示,编译时,所选择Target Platform为Android 64-bit且Configuration选Application Store时 ,发布出来的结果,是aab(上图中App Bundle格式,一种新的发布格式),而非apk,这取决于编译包额大小,大小超过150m的包都aab

详看官方文档:

      https://developer.android.com/guide/app-bundle

      Android 64位新规则:1、当包大于150M;2、当引入过多SDK造成包过大时
            《关于aab转apk的方法--bundletool》https://blog.csdn.net/qq_22521145/article/details/102553053
            《怎么从Android App Bundle (.aab)提取和转换apks文件(从AAB到APKs的转换和提取)》

                  https://blog.csdn.net/chichoxian/article/details/105570364?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control&dist_request_id=1328592.16597.16147919535052427&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control
            《Android Jetpack之Android App Bundle》https://blog.csdn.net/weixin_37730482/article/details/83501586
            《Delphi Android 64位支持》https://blog.marcocantu.com/blog/2019-delphi-android-64bit-rad-1033.html

      编译时,所选择Target Platform为Android 64-bit ,但Configuration选Development而非Application Store时,发布出来的结果,仍然为apk。

      编译时,所选择Target Platform为Android 32-bit ,发布出来的结果,为apk。 

      详请参考:《Delphi 10.4.2 Android 64位发布格式之App Bundle格式aabhttps://blog.csdn.net/pulledup/article/details/114579951

第三篇  MSWindows篇

3.001、TabControl设置为透明  群友QQ: 448089110 提供

搞定TabControl设置为透明的问题:
窗口上放一个TRectangle:

object rtglStyleTransparent: TRectangle
  StyleName = 'StyleTransparent'
  Fill.Kind = None
  Position.X = 402.000000000000000000
  Position.Y = 286.000000000000000000
  Size.Width = 50.000000000000000000
  Size.Height = 50.000000000000000000
  Size.PlatformDefault = False
  Stroke.Kind = None
  Visible = False
end
指定TabControl的StyleLookup为:StyleTransparent
(其中TabControl的TabPosition属性,我用的是None)
设置其他类型的控件透明,应该也可以用这种方式

3.002、RAD Studio 10.4.1新的基于Chromium的Microsoft Edge浏览器的TEdgeBrowser控件用法

https://blog.csdn.net/pulledup/article/details/109848546

https://blog.csdn.net/pulledup/article/details/109934357

3.003、使用 VCL 新用法 TImageCollection  + TVirtualImageList
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Supporting_high-DPI_images_with_the_Image_Collection_and_Virtual_ImageList_components

TSpeedButton:

需要解决: VCL 图示运行时,会有红边?什么问题?   -----------可以解决([龟山]Aone 提供):

 前后对比:

 如果背景是黑色的,就暴露了?!

不會, 它會自動變透明。正确的说,应该是原来红色边缘的部份,变成白色而已,只是看起来比较不奇怪。换个黑色外观,看起来还行:

这是以前的 VCL 程序,直接用 TImageCollection 可以把旧的 ImageList 转过来,图都是以前旧的 bmp。 

上面那个是 TSpeedButton, 还有一个 TBitBtn 也要改:

3.004、使用D10.4 Demos下Win10通知


Object Pascal\VCL\Windows 10 Notifications\NotificationsProject.dproj

运行时没有任何反应,是因为你没有打开Win10操作系统的【通知服务】,打开方法:

用Win10的UI操作(需要管理员登录权限)

第四篇  MACOS篇

第五篇  通用篇

5.001、《RAD Studio 10.4.1 Sydney 新增与改进内容介绍》

https://blog.csdn.net/tanqth/article/details/108376731

5.002、2020-09-02:TWebBrowser.LoadFromStrings变了写法TEncoding, 默认ANSI ,radstudio_ 10 4 101461a.iso

  来自群:②FireMonkey[移动开发]老猫

https://quality.embarcadero.com/browse/RSP-15686
如果 你们 认为  DELPHI 的 写法 太多余,希望 默认 UTF8,请 去 这个 帖子 用英语 回复。
叫他们继续改。

5.003、2020-09-02:关于升级和打补丁,来自群:②FireMonkey[移动开发]老猫

这 ISO 破解 和 BUG 修复,一起放出来。 明显 破解和 发布 是 同时的。

不要用 旧版本,特别是 需要打补丁的时候,不要忘了。小版本升级,一定要升级。否则 后果自负。

5.004、10.4.1支持的TPlatform

 5.005、正确使用平台识别标签

  {$IFDEF MSWindows}
    //.......
  {$ENDIF MSWindows}
  {$IFDEF POSIX}
    //POSIX开始,指除了MSWINDOWS以外的祖先基于Unix的所有平台:

    //OSX开始:含与苹果相关的所有平台,在其中可以细分苹果平台识别标签的定义:
    //IOS的代码开始:
    {$IFDEF IOS}
      //.......
    {$ENDIF IOS}
    //MACOS开始:
    {$IFDEF MACOS}
      //.......
    {$ENDIF MACOS}
    //...:其它与OSX相关的平台

    {$IF Defined(LINUX) or Defined(ANDROID)}
        //LINUX或ANDROID开始:含与LINUX或ANDROID相关的所有平台,在其中可以细分平台识别标签的定义:
      {$IFDEF ANDROID}
        //.......
      {$ENDIF ANDROID}
      {$IFDEF Linux}
        //.......
      {$ENDIF Linux}
    {$ENDIF}  //:LINUX或ANDROID结束

  {$ENDIF POSIX} //:POSIX结束


/
//再如:

uses System.RTLConsts, System.Generics.Defaults, System.Math,
{$IF Defined(MSWINDOWS)}
  System.Win.Devices
{$ELSEIF Defined(IOS)}
  System.iOS.Devices
{$ELSEIF Defined(MACOS)}
  System.Mac.Devices
{$ELSEIF Defined(ANDROID)}
  System.Android.Devices
{$ELSEIF Defined(LINUX)}
  System.Linux.Devices
{$ELSE}
{$MESSAGE FATAL 'System.Devices is not supported on this platform'} // do not localize
{$ENDIF}
;



5.006、正确使用匿名线程

//你可能会遇到典型的“线程”话题,现在是新世代的Delphi编程,不再是“D7年代”了,一定要养成随时随地想着使用线程的习惯...... : 
function TAppIDAndUserAccount.setAppID(
  const cnstr, ASql: string): Boolean;
var
  LEvent:TEvent;//:信号灯:控制线程执行行为的局部变量;
  LResult:Boolean; LResultInt:Integer;  //:它们都可以作为线程的返回值,可简单的用来控制线程的执行行为,未正常或成功地执行完毕!
begin
  LResultInt:=0;

  LEvent :=TEvent.Create(true);
    //:true:即:UseCOMWait(主要Windows下用,其它平台设置了也会对这个参数的传入置之不理):
    //:指定UseCOMWait以确保在线程对象处于阻塞态时等待任何STA-COM都可以做回调到该线程
      //:什么是STA-COM:1、在内存层面STA指,Spike-triggered average,译做“发放-触发平均方法”。表示传送地址指令。2、在进程层面STA指,Single-threaded apartment,单线程单元,是在WINDOWS系统中程序运行的一种方式。3、在芯片层面STA指,Static Timing Analysis,静态时序分析,是芯片设计中的一个后端流程,通常对设计的电路的时序路径进行分析,区别与动态逻辑分析。详见:https://baike.baidu.com/item/STA/4561221?fr=aladdin

  TThread.CreateAnonymousThread(
  procedure var LResultmsg:string;
  begin
    try
      try
        //在这里写线程执行函数的代码...:
        //调sql:执行一条sql语句: //where条件like必须ltrim(rtrim(去空否则含有全角等查不出来:
        if SQL(ASql,LResultmsg,nil,cnstr)=true then
        begin
          LResultInt:=1;
          LResult :=true;
          TThread.Synchronize(nil,
          procedure //var LEtc:string; UI同步局部变量;
          begin
            //在这里写线程执行函数结束后与UI的交互...:
            SJGY.ToastConfirm('已为您生成试用账号的AppID',(FOwner as TForm),2.5);
          end);//:若不发出UI消息,是因为类未实例化其FOwner(constructor Create)
          //Application.ProcessMessages;//:{$IFDEF CLR}用了线程同步就不必用它了;它通常对.net有意义(老版本delphi.net继承下来可用的)
        end else
        begin
          LResult :=false;
          LResultInt:=1;
          //Application.ProcessMessages;//:{$IFDEF CLR}用了线程同步就不必用它了;它通常对.net有意义(老版本delphi.net继承下来可用的)//SJGY.ToastConfirm........
          TThread.Synchronize(nil,
          procedure //var LEtc:string; UI同步局部变量;
          begin
            //线程异常:在这里写与UI的交互...:
            SJGY.ToastConfirm('代码异常或网络超时,发生在写数据库CarveoutAppID表CustomerAppID的过程中:'
              +LResultmsg,(FOwner as TForm),2.5);
          end);
          LEvent.SetEvent;
          LEvent.DisposeOf;
        end;
      except
        LResultInt:=1;
        LResult :=false;
        //Application.ProcessMessages;//:{$IFDEF CLR}用了线程同步就不必用它了;它通常对.net有意义(老版本delphi.net继承下来可用的)//SJGY.ToastConfirm........
        TThread.Synchronize(nil,
        procedure //var LEtc:string; UI同步局部变量;
        begin
          //线程异常:在这里写与UI的交互...:
          SJGY.ToastConfirm('线程异常或网络超时:发生在写数据库CarveoutAppID表CustomerAppID的过程中',(FOwner as TForm),2.5);
        end);
        LEvent.SetEvent;
        LEvent.DisposeOf;
      end;
    finally
      LResultInt:=1;
      LResult :=true;
      LEvent.SetEvent;
      LEvent.DisposeOf;
    end;

  end).Start;

  while LResultInt=0 do LEvent.ResetEvent;
    //:无论线程是否执行成功或发生异常,都可LEvent.ResetEvent通过强制其返回值LResultInt:=1;
    //:这是强制等待线程结束的方法,请根据具体使用场景合理使用......
  Result:=LResult;

  //:注意:LEvent.SetEvent仅仅通知UI线程执行函数的代码已经执行完毕,
    //:但若是长耗时的线程,它可能并未结束和被释放,交由delphi的线程库来控制,//:操作系统本身并不直接管控用户态的线程,它只管控操作系统内核态的线程
    //:也可交由被调用的窗体的Close事件Action := TCloseAction.caFree来释放
  //:线程自己是不能释放自己的,只能通过UI组件的事件来释放(这跟线程常用的5个状态有关)
  //:但是当长耗时的线程正在执行,你却强行释放它,则会内存泄漏:
    //:所以,所有非主窗体Close事件都不要caFree,
    //:把它留给主窗体Application组件来管理delphi的线程库,所有非主窗体的Owner设置为Application
end;

 5.007、DaataSnap原生服务端方法由其默认的客户端代理程序返回的UTF16编码的Json的乱码解决方法

格式类似:

{"result":["{\"ServerCount\":2,\"Servers\":[{\"ServerName\":\"\u672C\u573014\u670D\",\"ServerIP\":\"172.16.228.14:8000\"},{\"ServerName\":\"\u7535\u4FE1\u6D4B\u8BD5\u670D\",\"ServerIP\":\"12.23.34.45:8000\"}]}\r\n"]}

https://blog.csdn.net/warrially/article/details/16862853?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242 

 5.008、IDE多线程Parnassus并行调试器插件:新增(2020-12-15免费发布):

https://blogs.embarcadero.com/new-ide-plugin-parnassus-parallel-debugger/

 5.009、线程相关的改进-单列:

TParallel。适用于10.3(可能只有10.3.1)RTL,RTL \ Delphi,RTL \ Delphi \线程RSP-23837
TThreadPool.ShouldGrowPoolRTL,RTL \ Delphi,RTL \ Delphi \线程RSP-20528
并行ITasks无法按预期启动RTL,RTL \ Delphi,RTL \ Delphi \线程RSP-16932
两次调用时在Android下的TThread.waitfor错误RTL,RTL \ Delphi,RTL \ Delphi \线程RSP-16356

TThreadedQueue和TMonitor问题,可能的解决方案RTL,RTL \ DelphiRSB-4115
InterlockedCompareExchange128无法还原RBXRTL,RTL \ DelphiRSP-28272
TThreadedQueue.PopItem在压力下失败RTL,RTL \ DelphiRSB-3951
线程化-IdleWorkerThreadCount的错误计算RTL,RTL \ DelphiRSP-28200
TRttiContext.DropContext不是线程安全的。这会导致多线程应用程序中的错误,例如[ https://quality.embarcadero.com/browse/RSP-27769RTL,RTL \ DelphiRSP-27771
TParallel产生带有“ nil”个成员的EAggregateExceptionRTL,RTL \ DelphiRSP-24359

TThreadedQueue无法与大线程量一起使用-内存损坏RTL,RTL \ DelphiRSP-23333
TThreadedQueue在PushItem和PopItem期间错误地超时RTL,RTL \ DelphiRSP-21405

TThreadedQueue:应该等待INFINITE,但不要这样做RTL,RTL \ DelphiRSP-19993

第六篇  综合篇

6.1、专题开发

6.1.001、《哪里不放您的Delphi组件

               《Windows中的ProgramData文件夹是什么?

               《程序在ProgramData中存储什么?

               《在ProgramData文件夹中有什么重要的备份吗?

6.2、非官方推荐的开发资源

6.2.001、Delphi国内优秀网站及开源项目

第七篇  Linux篇

7.1、容器技术

      Linux调试及分发容器:   https://blogs.embarcadero.com/docker-scripts-and-dockerhub-images-for-rad-studio-10-4-1/

本博客相关:

Delphi RAD Studio 10.4.2 Sydney的新增与改进介绍原版全文

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专讲冷知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值