300分的高难问题:如何通过Taborder来遍历某一类型的控件?(300分)

  • 主题发起人 forgot2002
  • 开始时间
F

forgot2002

Unregistered / Unconfirmed
GUEST, unregistred user!
一般遍历控件的控制顺序是采用componentindex,比如我要遍历TEdit控件,一般可以这样编程:
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to componentcount-1 do
if Components is TEdit then
begin
ShowMessage((TEdit(Components).text));
end;
end;这个顺序就是componentindex,要改变这个顺序,只能手工改动DFM窗体文件,太麻烦了!

如果是改Taborder的话,就容易多了。在Form中单击右键选"Tab Order......"就可以了,如果
要实现按Taborder来访问控件的话,也是可以做到的,我暂时只能通过烦琐的数组和数组排序
来实现。但我想,应该会有些比较高效和简便的方法。所以把这个问题放上来讨论一下,希望
大家能够给点意见,最好能够做成通用函数。可以直接通过Taborder的先后顺序来访问某一类型
的控件,谢谢大家!
 
可以改变tag
也可以把
var along:array of longint;
setlength(along,componentcount);
for i:=0 to componentcount-1 do
if Components is TEdit then
begin
along[TEdit(Components).tag]:=longint(TEdit(Components));.
// ShowMessage((TEdit(Components).text));
end;
// 访问
tedit(along).text;
 
请看清楚我的问题,是通过Taborder的先后顺序来访问某一类控件。
 
在窗体创建时用一个循环把Taborder赋给Tag以后再去访问Tag不就可以了吗?
如果你一定要有顺序那么你就只有自己建一个动态数组去维护,但这有必要吗?

如果从算法的速度来看,一个form上能有多少component。用for或建一个Taborder的索引
是分不出谁更快的。

你能说说有什么实际意义吗?
 
TabOrder是由该控件的父控件(TWinControl)的TabList维护的,你可以使用这个TWinControl
的公共的函数GetTabOrderList来获得TabList:)
像你这样的高手,现在应该知道怎么做了吧:)
 
参见TWinControl的相应代码就知道了,TabList就是Control列表。
 
多人接受答案了。
 
顶部