十万火急!如何在程序中获取自动生成的文本框的text属性?(100分)

  • 主题发起人 主题发起人 myyzg
  • 开始时间 开始时间
M

myyzg

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中动态生成了一组文件框Tedit(edit1...editn),想在程序运行中
让用户输入数据,当用户按确定按钮时,获得并保存输入
值,即获得text的值,在运行时,程序提示:未定义edit,
不会是动态生成的控件,其属性无法修改吧?
 
补充一点:对自动生成edit,当用户输入text值,当击某键时,获取输入值,
即我的问题是:如何在程序中更改和获取动态生成的控件的属性。

 
在控件的相关事件里面用sender来判断
 
用(Sender as TEdit).Text这样的方式
 
怎么叫未定义 edit.
 
遍历各控件,is TEdit则转换类型,取其Text.
 
可以访问。用FORM的ComponentCount做个循环,给你自己动态建立
的Edit一个标志(如果有其他EDIT的话),如TAG=11,就可以做了:
for i:=0 to ComponentCount-1 do
begin
if Component is TEdit then //首先这个东东要是Edit
if TEdit(Component).Tag=11 then//其次这个东东是你动态建立的
ss := TEdit(Component).Text;//取它的Text
...
end;
上面代码随手写的,不对的话自己调一调。就这个意思。
 
cakk:sender在这里如何使用?能否举例说明。
adminis:我试用了你的方法,程序显示:[Error] auto.pas(114): Undeclared identifier: 'Component',该如何处理。
 
adminis:我试过了,不行,不能在我更改了text,获取更改后的值。
 
用它的OnChange事件来获取
 
为了让大家能了解我的用意,我将我的程序和想法贴上来:
for ct:=0 to 5 do //比如最值为5
begin
myedit:=tedit.create(self);
myedit.parent:=self;
with myedit do
begin
Left := myleft;
Top := mytop;
Width := 100;
Height := 21;
TabOrder := 0;
Text := 'Edit'+inttostr(ct);
name := 'Edit'+inttostr(ct);
end;
myleft:=myleft+150;
end;
procedure tform1.button1lick(Sender: TObject);
begin
showmessage('edit1 的值是:'edit1.text);//这时只是一种要达到的目的举例。
end;
为了简省,在这里我只举一例,如何通过单击按钮,弹出消息框,显示输入的当前值。
 
我觉得你的问题有点奇怪: 既然edit1是动态生成的,那么button1怎么会事先知道
有一个edit1存在呢?
 
把原码写出来看看。
 
你实际只有一个TEdit变量。所以只能在程序中访问一个动态创建的变量,其他则只是耗费内存,访问不到
var myedit:array[0..5] of TEdit;
for ct:=0 to 5 do //比如最值为5
begin
myedit[ct]:=tedit.create(self);
myedit[ct].parent:=self;
with myedit[ct] do
begin
Left := myleft; Top := mytop;
Width := 100; Height := 21;
TabOrder := 0;
Text := 'Edit'+inttostr(ct);
//name := 'Edit'+inttostr(ct); name属性不能在运行期修改
end;
myleft:=myleft+150;
end;
procedure tform1.button1lick(Sender: TObject);
begin
for ct:=0 to 5 do
showmessage('edit'+inttostr(ct)+' 的值是:'+myedit[ct].text);
end;
 
新建一个Application。
在Form1上放两个TButton,一个TListBox;

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FTop: Integer;
procedure CreateEdit;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var I: Integer; S: string;
begin
ListBox1.Clear;
for I:=0 to Self.ControlCount-1
do begin
if (Self.Controls is TEdit)and(TEdit(Self.Controls).Tag=101)
then begin
S:=TEdit(Self.Controls).Text;
ListBox1.Items.Add(S);
end;
end;
end;

procedure TForm1.CreateEdit;
var ED: TEdit;
begin
ED:=TEdit.Create(Self);
ED.Parent:=Self;
ED.Tag:=101;
ED.Name:='ED'+IntToStr(Self.ControlCount);
ED.Text:=ED.Name;
Inc(FTop, 30);
ED.Top:=FTop;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FTop:=10;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Self.CreateEdit;
end;

end.
 
你不能在运行期修改name属性,详见《DELPHI高级开发指南》
 
请教yxyyyy:为什么不能在运行期修改?(我没有书)。
看源码,是安全的,而且运行也没错。
愿闻其详。
 
myyzg 没有看 Kang 的回答吗?
像你的源程序里的创建方法就像猴子掰玉米,创建一个就丢弃一个(指针),
幸好 Delphi 的控件还可以通过 Parent 来管理,程序退出时由 Parent 负责
释放,否则你的资源早就耗尽了。如果是在 Window 3.1 下,说不定已经 Down
机了。
“每一个动态创建的对象都要进行有效的管理”。最好不要让编译器或操作
系统替你做不该做的事情,虽然有时候是安全的。
From: BakuBaKu
 
因为在为运行时为组件的NAME赋值有一个负效应,它会为该组件
将窗体元素设为NIL!这是因为TComponent类的SetName对象方法
调用了两次SetReference对象方法,,它会先解除组件与窗体元素
的联系,然后再试图重建连接,可惜…………

不过你可以这样来在运行时改变NAME属性

procedure TForm1.Button1Click(Sender: TObject);
Var
Temp:TComponent;
Begin
//Edit1.Top:=10;
Temp:=Edit1;
Edit1.Name:='temp1';
Edit2.name:='Edit1';
Temp.Name:='Edit2';
Edit2.Text:=Edit2.Name;
Edit1.Text:=Edit1.Name;
End;

这个程序没什么用的,只是为了说明一些问题。
 
谢谢yxyyyy,理解你的解释;其实,你是在静态引用,是有可能出现这样的问题。
而我的前提是,本来不存在像Edit1,Edit2这样的静态量;我的动态量其实都在
Delphi初始化的几个List中,对其引用与释放都是安全的,只是速度不行。
 
后退
顶部