Delphi代码迁移问题
发布时间:2020-12-15 09:49:36 所属栏目:大数据 来源:网络整理
导读:我在代码迁移期间遇到了Delphi 2010和Delphi Berlin(上次更新)之间的问题…. 我做了一个简单的代码来证明一个奇怪的行为…… 我有一个使用TList(前一个)和TList(来自Generics.Collections)的应用程序 我知道这段代码(下面)对你没有任何意义,但它是出于演示目
我在代码迁移期间遇到了Delphi 2010和Delphi Berlin(上次更新)之间的问题….
我做了一个简单的代码来证明一个奇怪的行为…… 我有一个使用TList(前一个)和TList(来自Generics.Collections)的应用程序 unit Unit1; interface uses Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls; type TTest = class Name: string; constructor Create(Nome: string); end; TForm1 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private FList: TList; end; var Form1: TForm1; implementation uses System.Generics.Collections; {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); var tmpList: TList<TTest>; begin tmpList := TList<TTest>.Create; tmpList.Add(TTest.Create('A')); tmpList.Add(TTest.Create('B')); tmpList.Add(TTest.Create('C')); tmpList.Add(TTest.Create('D')); tmpList.Add(TTest.Create('E')); FList := TList(tmpList); ShowMessage(TTest(FList[0]).Name); end; procedure TForm1.FormCreate(Sender: TObject); begin FList := TList.Create; end; constructor TTest.Create(Nome: string); begin Name := Nome; end; end. 在Delphi 2010中,ShowMessage显示’A’字符,但在Delphi Berlin上它引发了Acess违规 优化的两个应用程序都设置为False 解决方法FList := TList(tmpList); 这就是问题.强制转换是完全错误的,因为tmpList不是TList. 您的代码仅因为强制转换而编译,但强制转换不会改变右侧对象不属于要转换的类型的事实.所有演员都会阻止编译器抱怨并将你从自己身上拯救出来.你的演员阵容是编译器的谎言,结果是运行时错误. 此代码可能适用于旧版本,但只是偶然.你的运气发生了变化. 很难知道修复建议的内容.正如你所说,代码没有多大意义.每次按下按钮,都会泄漏列表.我建议您删除所有演员表,停止使用非通用TList并仅使用通用列表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |