首先否定用Tcomponent.Name的方法,它不能得到动态生成组件的名字.我曾试这用 它的一些事件,倒是可以得到当前组件的名称但是又不能聚焦到下一个组件,例如它 的click事件用(sender as Tedit).name 得到就是它的组件名称,但是该怎样聚焦到下 一个组件哪??
我写了一个例子供你参考:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } procedure DoKeyPress(Sender: TObject; var Key: Char); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject); var P: Pointer; I: Integer; begin for I := 1 to 5 do begin P := TEdit.Create(Self); TEdit(P).Parent := Self; TEdit(P).OnKeyPress := DoKeyPress; TEdit(P).Top := I * 30; TEdit(P).Tag := 133; // Mark as dynamic create control end; end;procedure TForm1.DoKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin SelectNext(ActiveControl, True, True); Key := #0; // aviod beep end; end;procedure TForm1.FormDestroy(Sender: TObject); var I: Integer; begin for I := Self.ControlCount - 1 downto 0 do if Self.Controls[I].Tag = 133 then Self.Controls[I].Free; end;end.此例子中的动态释放部份采用了偷懒的办法,在正式的项目中应该建立指针链表来维护,可以参考我编写的TBottomFrame(实际上是一个任务列表条)中动态创建、释放按钮的源码。
它的一些事件,倒是可以得到当前组件的名称但是又不能聚焦到下一个组件,例如它
的click事件用(sender as Tedit).name 得到就是它的组件名称,但是该怎样聚焦到下
一个组件哪??
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure DoKeyPress(Sender: TObject; var Key: Char);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
P: Pointer;
I: Integer;
begin
for I := 1 to 5 do
begin
P := TEdit.Create(Self);
TEdit(P).Parent := Self;
TEdit(P).OnKeyPress := DoKeyPress;
TEdit(P).Top := I * 30;
TEdit(P).Tag := 133; // Mark as dynamic create control
end;
end;procedure TForm1.DoKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
SelectNext(ActiveControl, True, True);
Key := #0; // aviod beep
end;
end;procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I := Self.ControlCount - 1 downto 0 do
if Self.Controls[I].Tag = 133 then
Self.Controls[I].Free;
end;end.此例子中的动态释放部份采用了偷懒的办法,在正式的项目中应该建立指针链表来维护,可以参考我编写的TBottomFrame(实际上是一个任务列表条)中动态创建、释放按钮的源码。