将项目从Delphi7迁移到Delphi10.4;

将项目从Delphi7迁移到Delphi10.4;,delphi,Delphi,在Delphi 10.4中使用TStream.ReadComponent,但流数据保存在Delphi 7中时,是否存在任何兼容问题? 谢谢只要做一个简单的测试,将组件保存到Delphi 7中的流,并在Delphi 10.4中重建项目(无代码更改),然后从Delphi 7流数据封送回组件,它就可以工作了 下面是代码 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Con

在Delphi 10.4中使用TStream.ReadComponent,但流数据保存在Delphi 7中时,是否存在任何兼容问题?
谢谢

只要做一个简单的测试,将组件保存到Delphi 7中的流,并在Delphi 10.4中重建项目(无代码更改),然后从Delphi 7流数据封送回组件,它就可以工作了

下面是代码

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Contnrs, StdCtrls;

{$ASSERTIONS ON}

type
  TForm1 = class(TForm)
    btGenerate: TButton;
    btRead: TButton;
    Memo1: TMemo;
    procedure btGenerateClick(Sender: TObject);
    procedure btReadClick(Sender: TObject);
  private
  public
  end;

  TChildComponent = class(TComponent)
  private
    FViewID: string;
    FViewCaption: string;
    FSessionID: Cardinal;
    procedure ReadViewCaption(Reader: TReader);
    procedure ReadViewID(Reader: TReader);
    procedure ReadSessionID(Reader: TReader);
    procedure WriteViewCaption(Writer: TWriter);
    procedure WriteViewID(Writer: TWriter);
    procedure WriteSessionID(Writer: TWriter);
  protected
    procedure DefineProperties(Filer: TFiler); override;
  public
    procedure Assign(Source: TPersistent); override;
    property ID: string read FViewID write FViewID;
    property Caption: string read FViewCaption write FViewCaption;
    property SessionID: Cardinal read FSessionID write FSessionID;
  end;

  TChildComponentList = class(TComponent)
  private
    FLastFocusViewID: string;
    FList: TObjectList;
    function GetCount: Integer;
    function GetItems(Index: Integer): TChildComponent;
  protected
    procedure DefineProperties(Filer: TFiler); override;
    procedure ReadSettings(Reader: TReader);
    procedure WriteSettings(Writer: TWriter);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Add: TChildComponent;
    procedure Assign(Source: TPersistent); override;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: TChildComponent read GetItems; default;
  published
    property LastFocusViewID: string read FLastFocusViewID write FLastFocusViewID;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TChildComponent }

procedure TChildComponent.Assign(Source: TPersistent);
var
  S: TChildComponent;
begin
  if Source is TChildComponent then
  begin
    S := TChildComponent(Source);

    FSessionID := S.SessionID;
    FViewCaption := S.Caption;
    FViewID := S.ID;
  end
  else
    inherited Assign(Source);
end;

procedure TChildComponent.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('SessionID', ReadSessionID, WriteSessionID, True);
  Filer.DefineProperty('ViewCaption', ReadViewCaption, WriteViewCaption, True);
  Filer.DefineProperty('ViewID', ReadViewID, WriteViewID, True);
end;

procedure TChildComponent.ReadSessionID(Reader: TReader);
begin
  FSessionID := Reader.ReadInteger;
end;

procedure TChildComponent.ReadViewCaption(Reader: TReader);
begin
  FViewCaption := Reader.ReadString;
end;

procedure TChildComponent.ReadViewID(Reader: TReader);
begin
  FViewID := Reader.ReadString;
end;

procedure TChildComponent.WriteSessionID(Writer: TWriter);
begin
  Writer.WriteInteger(FSessionID);
end;

procedure TChildComponent.WriteViewCaption(Writer: TWriter);
begin
  Writer.WriteString(FViewCaption);
end;

procedure TChildComponent.WriteViewID(Writer: TWriter);
begin
  Writer.WriteString(FViewID);
end;

{ TChildComponentList }

function TChildComponentList.Add: TChildComponent;
begin
  Result := TChildComponent.Create(nil);
  FList.Add(Result);
end;

procedure TChildComponentList.Assign(Source: TPersistent);
var
  S: TChildComponentList;
begin
  if Source is TChildComponentList then
  begin
    S := TChildComponentList(Source);

    FLastFocusViewID := S.LastFocusViewID;
  end
  else
    inherited Assign(Source);
end;

constructor TChildComponentList.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FList := TObjectList.Create;
end;

procedure TChildComponentList.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('ActiveViews', ReadSettings, WriteSettings, True);
end;

destructor TChildComponentList.Destroy;
begin
  Destroying;
  FreeAndNil(FList);
  inherited;
end;

function TChildComponentList.GetCount: Integer;
begin
  Result := FList.Count;
end;

function TChildComponentList.GetItems(Index: Integer): TChildComponent;
begin
  Result := FList[Index] as TChildComponent;
end;

procedure TChildComponentList.ReadSettings(Reader: TReader);
var
  PActiveView: TComponent;
begin
  Reader.ReadListBegin;
  try
    FList.Clear;
    while not Reader.EndOfList do
    begin
      PActiveView := Reader.ReadComponent(nil);
      FList.Add(PActiveView);
    end;
  finally
    Reader.ReadListEnd;
  end;
end;

procedure TChildComponentList.WriteSettings(Writer: TWriter);
var
  I: Integer;
begin
  Writer.WriteListBegin;
  for I := 0 to FList.Count - 1 do
    Writer.WriteComponent(TComponent(FList[I]));
  Writer.WriteListEnd;
end;

{ TForm1 }

procedure TForm1.btGenerateClick(Sender: TObject);
var
  Item: TChildComponent;
  List: TChildComponentList;
  Stream: TMemoryStream;
begin
  Memo1.Lines.Add('Save to file: TChildComponentList.bin');

  List := TChildComponentList.Create(nil);
  List.LastFocusViewID := '2';

  Item := List.Add;
  Item.ID := '1';
  Item.Caption := 'TChildComponent1';
  Item.SessionID := 100;

  Item := List.Add;
  Item.ID := '2';
  Item.Caption := 'TChildComponent2';
  Item.SessionID := 1;

  Stream := TMemoryStream.Create;
  Stream.WriteComponent(List);

  Stream.Position := 0;
  Stream.SaveToFile('TChildComponentList.bin');

  Stream.Free;
  List.Free;

  Memo1.Lines.Add('Done - OK');
end;

procedure TForm1.btReadClick(Sender: TObject);
var
  Item: TChildComponent;
  List: TChildComponentList;
  Stream: TMemoryStream;
begin
  Memo1.Lines.Add('Load from file: TChildComponentList.bin');

  Stream := TMemoryStream.Create;
  Stream.LoadFromFile('TChildComponentList.bin');

  Stream.Position := 0;
  List := Stream.ReadComponent(nil) as TChildComponentList;

  Assert(List <> nil);
  Assert(List.Count = 2);
  Assert(List.LastFocusViewID = '2');

  Item := List[0];
  Assert(Item.ID = '1');
  Assert(Item.Caption = 'TChildComponent1');
  Assert(Item.SessionID = 100);

  Item := List[1];
  Assert(Item.ID = '2');
  Assert(Item.Caption = 'TChildComponent2');
  Assert(Item.SessionID = 1);

  Memo1.Lines.Add('List.LastFocusViewID=' + List.LastFocusViewID);

  Stream.Free;
  List.Free;

  Memo1.Lines.Add('Done - OK');
end;

initialization
  RegisterClasses([TChildComponent, TChildComponentList]);

end.
单元1;
接口
使用
窗口、消息、系统工具、变体、类、图形、控件、窗体、,
对话框、Contnrs、StdCtrls;
{$ASSERTIONS ON}
类型
TForm1=类(TForm)
btGenerate:TButton;
btRead:t按钮;
备忘录1:TMemo;
程序btGenerateClick(发送方:ToObject);
程序btReadClick(发送方:TObject);
私有的
公众的
结束;
TChildComponent=类(TComponent)
私有的
FViewID:字符串;
FViewCaption:字符串;
fssessionid:红衣主教;
程序ReadViewCaption(读取器:TReader);
程序ReadViewID(读卡器:踏板);
程序ReadSessionID(读取器:踏板);
程序WriteViewCaption(编写者:TWriter);
程序WriteView(编写器:TWriter);
过程WriteSessionID(编写器:TWriter);
受保护的
程序定义属性(文件提交人:TFiler);推翻
公众的
程序分配(来源:TPersistent);推翻
属性ID:字符串读取FViewID写入FViewID;
属性标题:字符串读取FViewCaption写入FViewCaption;
属性SessionID:基数读取FSessionID写入FSessionID;
结束;
TChildComponentList=类(TComponent)
私有的
FLastFocusViewID:字符串;
FList:TObjectList;
函数GetCount:Integer;
函数GetItems(索引:整数):TChildComponent;
受保护的
程序定义属性(文件提交人:TFiler);推翻
程序读取设置(读卡器:踏板);
程序写入设置(写入程序:TWriter);
公众的
构造函数创建(AOwner:TComponent);推翻
毁灭者毁灭;推翻
功能添加:TChildComponent;
程序分配(来源:TPersistent);推翻
属性计数:整数读取GetCount;
属性项[索引:整数]:TChildComponent读取GetItems;违约
出版
属性LastFocusViewID:字符串读取FLastFocusViewID写入FLastFocusViewID;
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
{TChildComponent}
程序TChildComponent.Assign(来源:TPersistent);
变量
S:TChildComponent;
开始
如果源是TChildComponent,则
开始
S:=TChildComponent(源);
FSessionID:=S.SessionID;
FViewCaption:=S.标题;
FViewID:=S.ID;
结束
其他的
继承分配(源);
结束;
过程TChildComponent.DefineProperties(文件管理器:TFiler);
开始
继承的定义属性(文件管理器);
Filer.DefineProperty('SessionID',ReadSessionID,WriteSessionID,True);
Filer.DefineProperty('ViewCaption',ReadViewCaption,WriteViewCaption,True);
Filer.DefineProperty('ViewID',ReadViewID,WriteViewID,True);
结束;
过程TChildComponent.ReadSessionID(读取器:TReader);
开始
FSessionID:=Reader.ReadInteger;
结束;
过程TChildComponent.ReadViewCaption(读取器:TReader);
开始
FViewCaption:=Reader.ReadString;
结束;
过程TChildComponent.ReadViewID(读取器:TReader);
开始
FViewID:=Reader.ReadString;
结束;
过程TChildComponent.WriteSessionID(编写器:TWriter);
开始
Writer.WriteInteger(fssessionid);
结束;
过程TChildComponent.WriteViewCaption(编写器:TWriter);
开始
作家写作能力(FViewCaption);
结束;
过程TChildComponent.WriteView(编写器:TWriter);
开始
作家写作(FViewID);
结束;
{TChildComponentList}
函数TChildComponent列表。添加:TChildComponent;
开始
结果:=TChildComponent.Create(nil);
FList.Add(结果);
结束;
过程TChildComponentList.Assign(来源:TPersistent);
变量
S:tchildcomponent列表;
开始
如果源是TChildComponentList,则
开始
S:=TChildComponentList(源);
FLastFocusViewID:=S.LastFocusViewID;
结束
其他的
继承分配(源);
结束;
构造函数TChildComponentList.Create(AOwner:TComponent);
开始
继承的创建(AOOwner);
FList:=TObjectList.Create;
结束;
过程TChildComponentList.DefineProperties(文件管理器:TFiler);
开始
继承的定义属性(文件管理器);
Filer.DefineProperty('ActiveView',ReadSettings,WriteSettings,True);
结束;
析构函数TChildComponentList.Destroy;
开始
破坏;
FreeAndNil(FList);
继承;
结束;
函数TChildComponentList.GetCount:Integer;
开始
结果:=FList.Count;
结束;
函数TChildComponentList.GetItems(索引:整数):TChildComponent;
开始
结果:=FList[Index]作为TChildComponent;
结束;
过程TChildComponentList.ReadSettings(读取器:TReader);
变量
PActiveView:t组件;
开始
Reader.ReadListBegin;
尝试
FList.Clear;
而不是Reader.EndOfList
开始
PActiveView:=Reader.ReadComponent(nil);
FList.Add(PActiveView);
结束;
最后
Reader.ReadListEnd;
结束;
结束;
过程TChildComponentList.WriteSettings(编写器:TWriter);
变量
I:整数;
开始
Writer.WriteListBegin;
对于I:=0到FList.Count-1 do
Writer.WriteComponent(TComponent(FList[I]);
作家、作家、听众;
结束;
{TForm1}
程序TForm1.btGenerateClick(发送方:ToObject);
变量
项目:TChildComponent;
列表:TChildComponentList;
流:TMemoryStream;
开始
Memo1.Lines.Add('Save to file:TChildComponentList.bin');
列表:=TChildComponentList.Create(无);
List.LastFocusViewID:=“2”;
项目:=列表。添加;
Item.ID:=“1”;
项目.标题:=“TChildComponent1”;
项目.SessionID:=100;
项目:=列表。添加;
Item.ID:=“2”;
项目.标题:=“TchildComponent 2”;
项目.SessionID:=1;
Stream:=TMemoryStream.Create;
Stream.WriteComponent(列表);
流位置:=0;
Stream.SaveToFile('TChildComponentList.bin');
免费;
列表。免费;
备忘录1.行。添加('Done-OK');
结束;
程序TForm1.btReadClick(发送方:TObject);
变量
项目:TChildComponent;
列表:TChildComponentList;
流:TMemoryStream;
开始
备忘录1.行。添加('Lo