A
Another_eYes
Unregistered / Unconfirmed
GUEST, unregistred user!
同问题LID=162610.
只是要求不同:
例子:
TNoUsage = class(TPanel)
private
FClient: TPanel;
protected
procedure DefineProperties(Filer: TFiler); override;
procedure ReadClient(Reader: TReader);
procedure WriteClient(Writer: TWriter);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Client: TPanel read fclient stored true; //如果不用defineproperties
// 将其定成自定义property则client属性
// 根本不保存在dfm中.
end;
constructor TNoUsage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FClient := TPanel.Create(Self); // 出于特殊要求, 需要TNoUsage
// 包含一个单独的Client区域.
// 设计时所有放到TNoUsage中的
// 控件都放到Client中.
FClient.Parent := self;
FClient.Align := alClient;
FClient.Visible := true;
end;
destructor .....
procedure TNoUsage.DefineProperties ....
begin
inherited DefineProperties(Filer);
Filer.DefineProperty('Client', readClient, WriteClient, true);
// filer.DefineBinaryProperty('Client',readclient, writeclient, true); ??????
end;
procedure TNoUsage.ReadClient(Reader: TReader);
begin
fclient := TPanel(reader.readcomponent(nil)); // Stream read error
// FClient := TPanel(reader.readRootComponent(FClient));// same error
// FClient := TPanel(reader.readComponent(fclient)); // same error
// ????????
end;
procedure TNoUsage.WriteClient(Writer: TWriter);
begin
writer.writecomponent(fclient);
// writer.writerootcomponent(fclient); // no effect;
end;
end.
运行环境: Delphi 5
问题: 设计时放到TNoUsage中的所有控件均无法保存到dfm中,
view as text时根本没有client属性. 再次view as form时client中所有
控件消失. 但在.pas中却生成了相应变量. 因此再次打开时将出现错误
尝试手段: 1. 将FClient转成client 属性并公布到published中. 无效
2. 自定义了client类型(defineproperties). 如果定义成BinaryProperty.
则view as text可以看到 dfm中的client属性, 其值是一串奇怪的十六进
制数.再次view as form则client中包含的控件已消失.
如果定义成property, 用TReader, TWriter读写则根本无法保存dfm.
3. 将FClient.Create(self)改成FClient.Create(AOwner)则可以保存
client中的控件. 但view as text发觉生成了4个(?!) client属性, 其中最后
一个client下有其他控件的定义. 而且设计时可以选中fclient(也可以delete它, 这和我的要求完全背道而弛了).
请教:
如何达到我的要求? 即: 我的控件中包含一个动态生成的容器, 设计
时可以将其他vcl放置到这个容器中(以这个容器作为parent, 这个可以
做到), 并且能够保存(实在想不出办法).
只是要求不同:
例子:
TNoUsage = class(TPanel)
private
FClient: TPanel;
protected
procedure DefineProperties(Filer: TFiler); override;
procedure ReadClient(Reader: TReader);
procedure WriteClient(Writer: TWriter);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Client: TPanel read fclient stored true; //如果不用defineproperties
// 将其定成自定义property则client属性
// 根本不保存在dfm中.
end;
constructor TNoUsage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FClient := TPanel.Create(Self); // 出于特殊要求, 需要TNoUsage
// 包含一个单独的Client区域.
// 设计时所有放到TNoUsage中的
// 控件都放到Client中.
FClient.Parent := self;
FClient.Align := alClient;
FClient.Visible := true;
end;
destructor .....
procedure TNoUsage.DefineProperties ....
begin
inherited DefineProperties(Filer);
Filer.DefineProperty('Client', readClient, WriteClient, true);
// filer.DefineBinaryProperty('Client',readclient, writeclient, true); ??????
end;
procedure TNoUsage.ReadClient(Reader: TReader);
begin
fclient := TPanel(reader.readcomponent(nil)); // Stream read error
// FClient := TPanel(reader.readRootComponent(FClient));// same error
// FClient := TPanel(reader.readComponent(fclient)); // same error
// ????????
end;
procedure TNoUsage.WriteClient(Writer: TWriter);
begin
writer.writecomponent(fclient);
// writer.writerootcomponent(fclient); // no effect;
end;
end.
运行环境: Delphi 5
问题: 设计时放到TNoUsage中的所有控件均无法保存到dfm中,
view as text时根本没有client属性. 再次view as form时client中所有
控件消失. 但在.pas中却生成了相应变量. 因此再次打开时将出现错误
尝试手段: 1. 将FClient转成client 属性并公布到published中. 无效
2. 自定义了client类型(defineproperties). 如果定义成BinaryProperty.
则view as text可以看到 dfm中的client属性, 其值是一串奇怪的十六进
制数.再次view as form则client中包含的控件已消失.
如果定义成property, 用TReader, TWriter读写则根本无法保存dfm.
3. 将FClient.Create(self)改成FClient.Create(AOwner)则可以保存
client中的控件. 但view as text发觉生成了4个(?!) client属性, 其中最后
一个client下有其他控件的定义. 而且设计时可以选中fclient(也可以delete它, 这和我的要求完全背道而弛了).
请教:
如何达到我的要求? 即: 我的控件中包含一个动态生成的容器, 设计
时可以将其他vcl放置到这个容器中(以这个容器作为parent, 这个可以
做到), 并且能够保存(实在想不出办法).