我不能意识到这件事.我在Delphi语言中有一个组件,它包括另外两个组件:一个火猴布局和一个包含TRectangle的TLayout动态数组。这是通过属性BarNumber实现的。
我有很多关于设计时和运行时行为的问题,这是由于DFM (火猴中的FMX)将子组件存储为对象的一部分。现在。这是创建时部分的代码。
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循环之前。但很明显,我看不到处于设计模式的栏。好吧,如果这是唯一的解决方案,我可以忍受。这还没结束..!出于一个奇怪的原因,我唯一可以设置宽度、高度和BarNumber值的地方就是代码的这一部分。如果我在对象检查器中设置它们,它们将不会被考虑,并在我运行程序时重置为默认值。(BarNumber是一个在FBarNumber上读写的变量)
简而言之:我不知道如何处理和管理我的组件,使BarNumber和其他属性在设计时设置,并在运行时查看正确的条数。非常感谢。
发布于 2012-10-22 18:51:49
我也遇到过类似的问题。我使用存储属性来避免这个问题。示例:
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;发布于 2017-06-15 23:08:37
问题是,您在设计时创建的组件将存储在fmx文件中。当您运行应用程序时,您有两个控件,要解决此问题,您需要将组件的子对象的stored属性设置为false,如下所示:
Columni.Stored := False;
发布于 2012-01-20 16:30:48
您必须确保在运行时从0列开始。只需添加如下内容:
for [i] = pred(length(column)) downto 0 do
begin
column[i].free
end;在你开始制作专栏之前。
https://stackoverflow.com/questions/8934995
复制相似问题