我无法实现这一点。我在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和其他属性,并在运行时查看正确的柱数。 非常感谢你。
答案 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;