请帮助我,我是Delphi的新手。 我需要动态生成文本框,如
text[1]
text[2]
...
text[n]
我还可以检索它们的价值 也许像这样(例子),
for (i=1; i<=n; i++)
arrayOfTxt[i] = text[i].text;
Delphi有可能吗? 如果有可能,那该怎么做?
答案 0 :(得分:3)
回答你提出的问题:是的,这是可能的。
详细说明:Delphi具有所谓的动态数组,在编译时不指定索引的边界,但仅在运行时指定。
因此,创建用户提供的编辑框数量(TEdit)的功能可以是这样的:
TYPE
TEditArr = ARRAY OF TEdit;
FUNCTION MakeEditBoxes(ParentForm : TForm ; Count : Cardinal) : TEditArr;
VAR
I : Cardinal;
BEGIN
SetLength(Result,Count);
FOR I:=1 TO Count DO BEGIN
Result[PRED(I)]:=TEdit.Create(ParentForm);
Result[PRED(I)].Parent:=Parent
END
END;
您可以使用以下内容:
将以下行放在表单的类声明中:
Edits : TEditArr;
然后创建如下框:
PROCEDURE TForm1.Button1Click(Sender : TObject);
VAR
E : TEdit;
Y : Cardinal;
BEGIN
Edits:=MakeEditBoxes(Self,20);
Y:=0;
FOR E IN Edits DO BEGIN
E.Top:=Y; E.Left:=0;
INC(Y,E.Height+8)
END
END;
要访问他们的文本,您可以使用类似的内容(假设您要将所有文本复制到表单上的单个多行编辑框(TMemo)):
.
.
.
VAR E : TEdit;
.
Memo1.Lines.Clear;
FOR E IN Edits DO Memo1.Lines.Add(E.Text);
.
.
.
或 - 如果您想通过索引访问它们:
.
.
.
VAR I : Integer;
.
Memo1.Lines.Clear;
FOR I:=LOW(Edits) TO HIGH(Edits) DO Memo1.Lines.Add(Edits[I].Text);
.
.
.
如果你想要一个特定编辑框的文本(例如第三个),你可以使用
Edits[2].Text
记住动态数组总是将其索引设置为0(但如果你想绕过所有索引,请使用LOW和HIGH,就像它们所用的那样,并且它会清楚地表明你正在做什么对任何阅读者你的代码,即使他们可能熟悉或不熟悉Delphi)。请注意我如何在代码中的一个地方指定编辑框的数量,如果我想要一个不同的数字,它只会是我必须改变的一个地方 - 所有剩余的代码将自动适应没有修改的正确号码。