如何处理在运行时和设计时创建的子组件和属性?

时间:2012-01-19 23:40:49

标签: delphi

我无法实现这一点。我在DELPHI中有一个组件,其中包含2个其他组件:Firemonkey布局,其中包含一个包含TRectangle的动态TLayout数组。 这是通过BarNumber财产实现的。

我在设计时与运行时行为方面存在很多问题,这是由于DFM(Firemonkey中的FMX)将子组件存储为Object的一部分。 现在。这是On Create部分的代码。

constructor TFluffyTable.Create(Owner: TComponent);
var
i: integer;
begin
  inherited Create(Owner);

  Width:=300;
  Height:= 160;
  BarNumber:=100;
  SetLength(Column, FBarNumber);
  for i := 0 to (FBarNumber-1) do
  begin
     Column[i]:= TColumn.Create(Self);
     Column[i].Name:= 'Column_' + IntToStr(i);
     Column[i].Parent:= Self;
     Column[i].Height:=Height;
     Column[i].Width:=Width/FBarNumber;
     Column[i].Align:= TAlignLayout.alMostLeft;
   end;
  end;

如果我注册组件并在设计时使用它,我会显示正确的条数。但是如果我用组件运行程序,我得到两倍的条形,因为EXE加载了值。我设法用

来解决这个问题
   if not (csDesigning in ComponentState) then

就在for循环之前。 但显然,我无法在设计模式中看到BARS。如果这是唯一的解决方案,我可以忍受。 那还没结束......! 出于一个奇怪的原因,我可以为Width,Height和BarNumber设置我的值的唯一一个地方是代码的一部分。如果我在对象检查器中设置它们,则在运行程序时将不会考虑它们并将其重置为默认值。 (BarNumber是一个在FBarNumber上读写的变量)

简而言之:我不知道如何处理和管理我的组件,以便在设计时设置BarNumber和其他属性,并在运行时查看正确的柱数。 非常感谢你。

3 个答案:

答案 0 :(得分:3)

我遇到了类似的问题。我使用存储属性来避免这个问题。 例如:

constructor TMachine.Create(AOwner: TComponent);
begin
  inherited;
  self.Width := 50;
  self.Height := 90;

  // create machine rectangle and set default properties
  FMachine := TRectangle.Create(self);
  FMachine.Parent := self;
  FMachine.Height := 50;
  FMachine.Align := TAlignLayout.alBottom;
  FMachine.Fill.Color := TAlphaColorRec.red;
  FMachine.Stroke.Color := TAlphaColorRec.Black;
  FMachine.Stroke.Thickness := 3;
  FMachine.Stored := false;
end;

答案 1 :(得分:0)

您必须确保在运行时以0列开头。 只需添加以下内容:

for [i] = pred(length(column)) downto 0 do
begin
  column[i].free
end;

在开始制作列之前。

答案 2 :(得分:0)

问题是您在设计时创建的组件将存储在fmx文件中。当您运行应用程序时,您有两次控件,以解决您需要将存储属性设置为false的问题,以及组件的子对象,如下所示:

Column [i] .Stored:= False;