2017-05-05 88 views
0

我做了一个Delphi应用程序与德尔福,但我有一个奇怪的行为。这是情况。德尔福克隆布局

enter image description here

我有一个TLayout(称为InputLayout),它包含了GridPanelLayout。我必须复制InputLayout这里面格但我得到这样的结果:

enter image description here

结果当然是我在左边的一个。你可以看到,这是而不是我在找什么,因为我想有一个上面的网格的确切副本。最后的结果必须是两个GridPanelLayout,其中第二个放置在第一个之下。这是代码:

procedure TForm1.Button3Click(Sender: TObject); 
var c: TGridPanelLayout; 
begin 

try 

    c := TGridPanelLayout(InputLayout.Children[0].Clone(InputLayout)); 
    c.Align := TAlignLayout.Top; 
    InputLayout.AddObject(c); 

except 

    // ... 

end; 

end; 

什么是错?请注意,InputLayout是包含GridPanelLayout的布局,并且该组件是唯一的,所以我可以安全地使用0索引进行访问。

+0

设计时间'GridPanelLayout'似乎没有对齐到顶部。目前还不清楚'GridPanelLayout'有多少列和行。当我尝试你的问题时(有3列,1行和第一个'GridPanelLayout'对齐顶部),如果我最小化和恢复表单,我会得到一些消失的绘制文物。试试发生了什么,并添加到您的问题。 –

+0

@TomBrunberg是的,它与顶部对齐(设计时布局中的一个)。我是否也必须将克隆的那个放到TAlignLayout.Top中?我正在使用该代码,但即使我调整了不起作用的页面。这可能是一个错误? –

+0

我想我已经找到了解决方案,但它适用于TGridLayout。出于某些原因,GridPanelLayout不能很好地工作,而且我的行为与@TomBrunberg相同。 –

回答

1

我认为你不能使用TGridPanelLayout,因为看起来该组件有问题。我正在使用德尔福东京启动,我已经找到了解决您的问题。

  1. 删除一个VertScrollBox(或TLayout或HorzScrollBox)
  2. 将一个TGridLayout中的VertScrollBox
  3. 之外添加的网格布局,你需要的东西,例如一个TEditTLabel
  4. 设置TGridLayout.Visible := false;因为你使用这个作为“模板”。我将制作一份副本,并将克隆添加到InputLayout中。

A TGridLayout适用于Windows,但我想它也适用于Android和iOS(我无法用启动器测试它)。事件处理程序添加到这样一个按钮:

//Button1 onclick 
for i := 1 to max do 
    begin 
    c := (GridLayout1.Clone(Owner) as TGridLayout); 
    (c as TGridLayout).Visible := True; 
    (c as TGridLayout).Parent := InputLayout; 
    InputLayout.AddObject(c); 
    end; 

这里有一个名为max一个整型变量,当然这表示你要多少个孩子里面InputLayout创建。如果你必须制作一个副本,这并不是真的需要,但是我正在给你这个循环,以防万一你改变了主意。这里有结果:

enter image description here

这里你可以看到3个TEdit组成部分,但你有一个TLabel,一个TEditTButton。该怎么办?只需将TGridLayout可见性恢复为True,添加任何你想要的(在这种情况下是一个标签,一个编辑和一个按钮),并将属性重新设置为false。

+0

我已经理解了,我想要使用另一个组件来做类似的事情。是的,循环是无用的,因为我没有在操作中要求它,但无论如何都是好的解决方案。我希望他们能解决这个错误... –