如何在Delphi中动态创建组件,例如TLabel或TEdit等?

7

使用 Delphi 2010

SQLQuery1.First; // move to the first record
while(not SQLQuery1.EOF)do begin
   // do something with the current record
   // What's the code should i write in this part in order to create a TEdit
   // containing the user fullname the current item.
   ShowMessage(SQLQuery1['whom']);
   SQLQuery1.Next; // move to the next record
end;

你为什么想要为每个记录创建一个组件?你是否尝试使用dbgrid呢? - RRUZ
你想为每个记录都添加一个编辑控件吗?它们会放在网格内还是其他地方?如果使用DBGrid,根本不需要这样做,因为它已经支持编辑。如果出于其他原因需要它,那么您需要在某个地方维护这些控件的列表,以便在完成后正确释放它们。这高度取决于您想要放置这些控件的位置以及您希望这些控件可见的时间有多长。我个人认为(如果不使用DBGrid),您可能希望改用字符串网格(为每个记录显示编辑区域)。 - Jerry Dodge
PS - ShowMessage(SQLQuery1['whom']); 更安全的写法是 ShowMessage(SQLQuery1.FieldByName('whom').AsString); - Jerry Dodge
更安全,从什么方面来说呢,@Jerry? - Rob Kennedy
如果“whom”为空,由于这是一种变体类型并且它以不同的方式处理NULL,因此可能会失败。或者,确保明确使用正确的类型可以避免许多不同的转换问题。 - Jerry Dodge
4个回答

6

创建一个 TEdit 需要按照以下步骤进行:

创建一个变量以便进行操作,可以是局部变量或类成员。

Edit: TEdit;

然后您构建它。
Edit := TEdit.Create(Self);

构造函数的参数是所有者。这可以确保在所有者被销毁时,控件也会被销毁。我的假设是Self是一个窗体。
现在你需要给控件一个父级。
Edit.Parent := Self;

也许它在面板上。
Edit.Parent := StatusPanel;

最后,您设置文本。
Edit.Text := SQLQuery1['whom']);

使用标签时,与使用文本类似,只需使用“Caption”属性而不是“Text”属性。当然,您肯定也想设置其他属性,但我想您已经知道如何做了。

动态创建组件时需要设置哪些属性最重要的方法是将一个组件放在表单上,切换到文本视图,并查看哪些属性被流式传输。那些属性在动态创建时也应该考虑设置。毕竟,流式传输的组件都是动态创建的 :) - David

4

您还可以通过可视化设计组件,在其上使用GExperts Components to Code专家,并再次从表单设计器中删除它们。对于标签/编辑对,这将得到如下结果:

var
  Edit1: TEdit;
  Label1: TLabel;

  Edit1 := TEdit.Create(Self);
  Label1 := TLabel.Create(Self);

  Edit1.Name := 'Edit1';
  Edit1.Parent := Self;
  Edit1.Left := 344;
  Edit1.Top := 172;
  Edit1.Width := 121;
  Edit1.Height := 21;
  Edit1.TabOrder := 0;
  Edit1.Text := 'Edit1';
  Label1.Name := 'Label1';
  Label1.Parent := Self;
  Label1.Left := 296;
  Label1.Top := 176;
  Label1.Width := 65;
  Label1.Height := 17;
  Label1.Caption := 'Label1';
  Label1.FocusControl := Edit1;

大多数情况下,需要进行一些重新调整(删除TabOrder行,用SetBounds、Align或您自己的逻辑替换Left/Top/...),对于某些属性/组件,它根本不起作用。但是这样可以节省很多时间。

3
Var
  AnEdit : TEdit;
Begin
  AnEdit := TEdit.Create(self);
  AnEdit.Parent := self; // or some suitable container compoent e.g GroupBox, Panel
  AnEdit.Top := ?;
  AnEdit.Left := ?
  // any other properties you weant to set.
End;

让人困惑的是设置父级元素。


1
with TEdit.Create(self) do
begin
  Parent:= ... // The name of the panel or form, on which you would like to place TEdit
  Text:= 'your text'; 
  // And you could set its position by giving "Left" and/or "Width", so on..
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接