将项目从Delphi7迁移到Delphi10.4;
在Delphi 10.4中使用TStream.ReadComponent,但流数据保存在Delphi 7中时,是否存在任何兼容问题?将项目从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 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