Forms Lazarus pascal/Delphi-子表单不可编辑

Forms Lazarus pascal/Delphi-子表单不可编辑,forms,delphi,parent-child,lazarus,Forms,Delphi,Parent Child,Lazarus,我正在创建一个表单的新实例,并试图将其显示为面板上的子对象。但是表单似乎不可用。我的意思是我不能编辑任何文本框。但是还有其他控件,如树和按钮,它们看起来是可点击的 代码如下: procedure TForm1.ProcfrmSetupItemCategories; var NewForm: TfrmSetupItemCategories; begin NewForm:=TfrmSetupItemCategories.Create(BodyPanel); NewForm.Parent

我正在创建一个表单的新实例,并试图将其显示为面板上的子对象。但是表单似乎不可用。我的意思是我不能编辑任何文本框。但是还有其他控件,如树和按钮,它们看起来是可点击的

代码如下:

procedure TForm1.ProcfrmSetupItemCategories;
var
  NewForm: TfrmSetupItemCategories;
begin
  NewForm:=TfrmSetupItemCategories.Create(BodyPanel);

  NewForm.Parent := BodyPanel;
  NewForm.Top:=5;
  NewForm.Left:=5;
  NewForm.Show;
end;
但是如果我删除行
NewForm.Parent:=BodyPanel表单可编辑,但不在父表单/面板中

此外,当设置了父窗体时,子窗体不处于活动状态(查看标题栏)

我错过什么了吗?请给我一些建议。
谢谢

表单必须是其他表单或应用程序的子级。TPanel不知道如何管理表单,因此您的表单不会被激活,其组件也不会获得焦点

相反,您可以使用普通表单并编写一个过程来对齐表单。现在向主窗体添加一个计时器,并从ontimer事件调用对齐过程。当用户移动主窗体或调整其大小时,其他窗体将重新对齐

戴夫·彼得斯
DP软件

您是否可以添加一些详细信息,说明为什么需要使用表单并将其粘贴到面板上,以及您希望实现的目标。也许更好的解决方案是使用
t框架
。Is
BodyPanel.Enabled=True
?@TomHagen BodyPanel已启用。事实上,它是在设计时完成的,所以没有什么可以更改的。@KromStern因为我们没有MDI表单,所以我创建了两个面板。左侧面板包含菜单按钮(如手风琴)。右侧面板是车身面板。我让其他窗体使用面板作为父窗体,这样,如果主窗体移动,其他窗体也会随之移动。另外,其他表单(子表单)也不会离开面板区域。@davidheffernanlazarus;我不得不在没有MDI的情况下生活,因为我试图在Linux上实现这一点。我来自VB环境,我认为使用计时器没有任何意义。在这里停留一段时间的真正原因是什么?您需要检查用户是否移动了主窗体,以便调整其他窗体的位置以适应。您将不知道何时移动表单,因此设置一个每隔几百毫秒过期的计时器,然后在ontimer事件中检查表单是否需要移动。Hmmm。。。我不确定这是否是一种优雅或有效的方式来移动子窗体。这似乎是可行的,但我认为这不是一个好主意,特别是对于像feepascal这样强大的OOP语言。创建一个包含子窗体的新类,并拥有一个放置初始位置的构造函数,然后使用一个方法在移动父窗体时重置位置不是更好吗?您如何知道何时调用您的方法据我所知,表单没有onmove事件。面板可以是表单的父级。而TApplication不能是窗体的父级。计时器绝对不是这里的解决方案。