动态生成20个编辑框,然后分别给对应的程序动态赋值

pomiox 2010-07-01 08:38:31
那位高手能帮我编写个程序,动态生成20个编辑框,然后分别给对应的程序动态赋值!
...全文
178 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzttzz 2010-07-01
  • 打赏
  • 举报
回复
5,15楼的够你用的了
pomiox 2010-07-01
  • 打赏
  • 举报
回复
首先呢,我谢谢大家的热心帮助.其实我是想做个一个动态生成控件,并且控件动态生成后,动态的给每个控件赋不同的值,并且在时钟控件中循环扫描对应的值实时变化。比如说:生成12个编辑框控件,然后在时钟控件中分别定义对应12个编辑框的变量,且此变量在1000毫秒内扫描一次,并且对应12个编辑框实时显示出来。
Dision LI 2010-07-01
  • 打赏
  • 举报
回复

procedure TForm1.MyEditClick(Sender: TObject);
var
i:integer;
begin
for i := 0 to Self.ControlCount - 1 do
begin
if Self.Controls[i] is TEdit then
TEdit(Self.Controls[i]).Text :='abc'+inttostr(i);
end;
end;


因为我又定义了个单击事件,单击后单元的值变为有'abc'了,你也可以不要
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
呵呵,还有两种不太常用一点的。

1. 不对Edit序列进行区分,根据Left和Top值来定位Edit
2. 为Edit生成唯一的名字,通过FindComponent来找Edit
亮剑_ 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 biekvn 的回复:]
别着急呀,还有办法呢,
[/Quote]
9楼又改用一个动态数组代替TStringList来存放动态创建的Edit指针
这么多方法本质上其实一样,不同的是标识Edit序列的方法有所区别
pomiox 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ameken 的回复:]
Delphi(Pascal) code

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
proced……
[/Quote]
这位帅哥,您有没有测试过按2次以上后,所赋值的值改变了呢!请帮我看看如何处理下。
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
问题提的不清楚,没有办法去深入解决
林石公 2010-07-01
  • 打赏
  • 举报
回复
估计啊,你们的答案都达不到楼长的要求,嘿嘿,应当还有别的更奇怪的要求
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tjianliang 的回复:]
创建+赋值,一个循环,创建和赋值分开就用两个循环

5、6楼的代码应该是可以满足LZ要求了,区别是一个利用了Tag属性来标识,一个是设置了一个TStringList作为控件集
[/Quote]

别着急呀,还有办法呢,
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
使用一维数组的方法

定义一个类型

type
TEditArray = array of TEdit;

在窗口类的private段下面定义一个私有属性
private
...
FEditArray: TEditArray;
...
public
...
end;


procedure TForm1.CreateEdit(ACount: Integer);
var
I: Integer;
AEdit: TEdit;
begin
SetLength(FEditArray, ACount); //设置动态数组大小

for I := 0 to ACount - 1 do
begin
AEdit := TEdit.Create(Self);
with AEdit do
begin
parent := self;
Left := 值;
top := 值;
end;
FEditArray[I] := AEdit;
end;
end;

//获取TEdit
function getEdit(Index: Integer): TEdit;
begin
Result := nil;
if (Index < Low(FEditArray)) or (Index > High(FEditArray)) then exit;
Result := FEditArray[Index];
end;

//获取TEdit
{
var
AEdit: TEdit;
begin
AEdit := getEdit(0); //获取第1个动态创建的TEdit;
//AEdit := getEdit(19); //获取第19个动态创建的TEdit;
end;
}


亮剑_ 2010-07-01
  • 打赏
  • 举报
回复
创建+赋值,一个循环,创建和赋值分开就用两个循环

5、6楼的代码应该是可以满足LZ要求了,区别是一个利用了Tag属性来标识,一个是设置了一个TStringList作为控件集
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
使用TObjectList类的方法(需要添加Contnrs.pas单元)

在窗口类的private段下面定义一个私有属性
private
...
FEditControls: TObjectList;
...
public
...
end;


procedure TForm1.CreateEdit(ACount: Integer);
var
I: Integer;
AEdit: TEdit;
begin
for I := 0 to ACount - 1 do
begin
AEdit := TEdit.Create(Self);
with AEdit do
begin
parent := self;
Left := 值;
top := 值;
end;
FEditControls.Add(AEdit);
end;
end;


//获取TEdit
function getEdit(Index: Integer): TEdit;
begin
Result := nil;
if (Index < 0) or (Index >= FEditControls.Count) then exit;
Result := FEditControls.Items[Index] as TEdit;
end;

//获取TEdit
{
var
AEdit: TEdit;
begin
AEdit := getEdit(0); //获取第1个动态创建的TEdit;
//AEdit := getEdit(19); //获取第19个动态创建的TEdit;
end;
}
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
使用TStringList类的方法

在窗口类的private段下面定义一个私有属性
private
...
FEditControls: TStringList;
...
public
...
end;


//动态创建TEdit;

procedure TForm1.CreateEdit(ACount: Integer);
var
I: Integer;
AEdit: TEdit;
begin
for I := 0 to ACount - 1 do
begin
AEdit := TEdit.Create(Self);
with AEdit do
begin
parent := self;
Left := 值;
top := 值;
end;
FEditControls.AddObject(IntToStr(I), AEdit);
end;
end;

//获取TEdit
function getEdit(Index: Integer): TEdit;
begin
Result := nil;
if (Index < 0) or (Index >= FEditControls.Count) then exit;
Result := FEditControls.Object[Index] as TEdit;
end;

//获取TEdit
{
var
AEdit: TEdit;
begin
AEdit := getEdit(0); //获取第1个动态创建的TEdit;
//AEdit := getEdit(19); //获取第19个动态创建的TEdit;
end;
}

麦客来了 2010-07-01
  • 打赏
  • 举报
回复


//动态创建Count个TEdit
procedure TForm1.createEdit(Count: Integer);
var
I: Integer;
begin
for I := 0 to Count - 1 do
with TEdit.Create(self) do
begin
parent := self; //创建的TEdit显示在当前窗口上
//根据需要设置Left和top值
left := 位置值;
top := 位置值;
tag := 100 + I; //新创建TEdit的Tag值与自动创建的TEdit区别一下,Tag属性值从100开始
end;
end;

//根据ATag值获取动态生成的TEdit;
function TForm1.getEdit(ATag: Integer): TEdit;
var
I: Integer;
AEdit: TEdit;
begin
Result := nil;

for I := 0 to ControlCount - 1 do
if Controls[I] is TEdit then
begin
AEdit := Contols[I] as TEdit;
if AEdit.Tag = 100 + ATag then
begin
Result := AEdit;
Break;
end;
end;
end;

//获取TEdit
{
var
AEdit: TEdit;
begin
AEdit := getEdit(0); //获取第1个动态创建的TEdit;
//AEdit := getEdit(19); //获取第19个动态创建的TEdit;
end;
}
Dision LI 2010-07-01
  • 打赏
  • 举报
回复
.....居然习惯用VB的注释 单引号了
把注释去掉就可以运行了
Dision LI 2010-07-01
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);

private
{ Private declarations }
procedure MyEditClick(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
Var
MyEdit : Array of TEdit;
i,j,k: Integer;
begin
SetLength(MyEdit,12); '设置动态长度12
for i := 0 to 11 do
begin
MyEdit[i] := TEdit.Create(Self);
MyEdit[i].Width := 130;
MyEdit[i].Height:= 80;
MyEdit[i].Parent:=self;
MyEdit[i].Text:=inttostr(i); '赋值
MyEdit[i].OnClick := MyEditClick; '定义动态事件
j:=Trunc(i/2); //取整 行 设置为2列,要改5列对应3个2都改变为5
K:=i mod 2 ; //取余 列
if i<2 then
begin
MyEdit[i].Top:=10;
MyEdit[i].Left:=30+i*150;
end else
begin
MyEdit[i].Top:=10+30*j;
MyEdit[i].Left:=30+k*150;
end;
end;
end;


procedure TForm1.MyEditClick(Sender: TObject);
var
i:integer;
begin
for i := 0 to Self.ControlCount - 1 do
begin
if Self.Controls[i] is TEdit then
TEdit(Self.Controls[i]).Text :='abc'+inttostr(i);
end;
end;


end.
pomiox 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
创建会吧,然后就是循环form上的组件


Delphi(Pascal) code

var
i:integer;
begin
for i := 0 to Self.ControlCount - 1 do
begin
if Self.Controls[i] is TEdit then
TEdit(Self.Controls[i]).Text :……
[/Quote]
帅哥,其实我的意思是先动态生成20个,然后再动态赋值,您的代码只能先创建在form然后才赋值的过程呀!
bdmh 2010-07-01
  • 打赏
  • 举报
回复
创建会吧,然后就是循环form上的组件


var
i:integer;
begin
for i := 0 to Self.ControlCount - 1 do
begin
if Self.Controls[i] is TEdit then
TEdit(Self.Controls[i]).Text := 'abc';
end;
end;
haitao 2010-07-01
  • 打赏
  • 举报
回复
使用tag

使用arr:array [1..20] of Tedit;自动创建时arr[i]:=Tedit.create(self);...
dd_zhouqian 2010-07-01
  • 打赏
  • 举报
回复
加个tag吧,分起来方便些

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧