我有一个带有属性列表的基本类。然后创建子类并添加另一个属性。我需要将组件存储到文件中。但是,不是存储子组件,而是写入父组件。
下面是一个演示该问题的示例。
MyComp1 = class(TComponent)
strict private
FS: string;
FI: Integer;
published
property S: string read FS write FS;
property I: Integer read FI write FI;
end;
MyComp2 = class(MyComp1)
strict private
FS2: string;
published
property S2: string read FS2 write FS2;
end;
procedure SaveIt;
var
MS: TMemoryStream;
C1: MyComp1;
C2: MyComp2;
begin
MS := TMemoryStream.Create;
try
C1 := MyComp1.Create(nil);
C1.S := 'Hallo, World!';
C1.I := 100500;
C2 := MyComp2(C1);
C2.S2 := 'Second string';
MS.WriteComponent(C2);
MS.Position := 0;
MS.SaveToFile('C:\test.dat');
finally
MS.Free;
end;
end;详细信息:
我的功能正在随着时间的推移而扩展。所以我创建了TComponent的基类(让我们叫它MyComp1)和这种类型的变量(MyComp: MyComp1)。一旦我扩展了功能,我就从以前的版本创建后代类(MyComp2 = class(MyComp1)),添加新的所需属性,并像这样分配它的值
MyComp2(MyComp).S2 := 'Second string';然后,我需要将MyComp组件保存到带有子属性的文件中。我确实是这样创建的
MyComp := MyComp2.Create(nil)但是保存到文件中只有MyComp1的属性
发布于 2012-12-16 09:18:08
它不起作用,因为您正在实例化一个MyComp1对象,然后将其类型转换为MyComp2。它不是内存中的实际MyComp2对象,因此将值写入MyComp1对象的MyComp2属性是访问不属于MyComp1对象的内存的无效操作,因此它充其量会崩溃,而在更糟的情况下会损坏内存。
处理这种情况的正确方法是只创建MyComp2本身的对象实例,而不是创建MyComp1。MyComp2从MyComp1继承成员,因此您可以访问MyComp2对象的MyComp1属性,例如:
procedure SaveIt;
var
MS: TMemoryStream;
Comp: MyComp2;
begin
MS := TMemoryStream.Create;
try
Comp := MyComp2.Create(nil);
try
Comp.S := 'Hallo, World!';
Comp.I := 100500;
Comp.S2 := 'Second string';
MS.WriteComponent(Comp);
finally
Comp.Free;
end;
MS.Position := 0;
MS.SaveToFile('C:\test.dat');
finally
MS.Free;
end;
end;https://stackoverflow.com/questions/13895258
复制相似问题