【问题标题】:How to handle subcomponents and properties created in runtime vs designtime?如何处理在运行时与设计时创建的子组件和属性?
【发布时间】:2012-02-14 15:21:22
【问题描述】:

我无法意识到这件事。我在 DELPHI 中有一个组件,其中包括 2 个其他组件:一个 Firemonkey 布局,其中一个包含 TRectangle 的 TLayout 动态数组。 这是通过属性 BarNumber 实现的。

我有很多关于设计时与运行时行为的问题,这是由于 DFM(Firemonkey 中的 FMX)将子组件存储为对象的一部分。 现在。这是 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 和其他属性,并在运行时查看正确的条数。 非常感谢。

【问题讨论】:

  • 你应该接受答案,如果它们是正确的,我看到你所有的问题你从来没有接受过..
  • 我在设计时通过我制作的一个简单组件创建的对象遇到了同样的问题

标签: delphi


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

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

    Column[i].Stored := False;

    【讨论】:

      【解决方案3】:

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

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

      在开始制作列之前。

      【讨论】:

      • 嗯,我试过了,但它不起作用。在运行时, Column 数组的值被重置,因此释放它们不会生效。我使用 Loaded Method 和 csDesigning 检查来确保仅在运行时添加条。它有效,但仍远非理想。还是非常感谢你..!
      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2013-01-11
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多