加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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并仅使用通用列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读