组件顺序(50分)

  • 主题发起人 主题发起人 sense_seek
  • 开始时间 开始时间
S

sense_seek

Unregistered / Unconfirmed
GUEST, unregistred user!
遍历在panel上的控件顺序是由控件创建的顺序而成的,可以在对应的 dfm 文件中查看,跟设计时指定的TabOrder没有关系。
如果panel上的控件顺序不是依次创建(可能根据实际要求进行过调整),但是设计时已经对控件进行了TabOrder的指定,请问是否能根据TabOrder的顺序来打印出某种控件的相关属性,比如 TEdit(aCom).Caption, TEdit(aCom).Text等信息?
注:不希望通过重新调整控件的创建顺序......
 
你究竟要做什么?
没有看明白!
如果要自己调整顺序(设计期),可以用cnpack ,cnwizard 工具
如果要在运行期,显示/打印?属性
if (components is tedit) then
myprint((components as tedit).caption);
这个不会不知道吧??
当前可以取出taborder ,然后自己排序...xxxxxxxx
 
不是这个意思,可能我没描述清楚
楼上的方法当然知道了,但是打印出来的顺序是控件的创建顺序
比如创建控件顺序如下
Edit1,Edit3,Edit2,Edit4
使用楼上的方法用比如RichEdit打印出来的内容是
Edit1,Edit3,Edit2,Edit4
而在设计时,我重新对4个控件的TabOrder进行了设置,依次如下:
Edit1,Edit2,Edit3,Edit4
我提问的内容是如何根据我设置的TabOrder顺序将4个控件的Caption显示(打印)出来....
 
我现在是简单使用如下方式实现,做法比较粗糙,控件少的话,还勉强能凑合````
是否有其他方式可实现??
// 定义一个记录
MyRec = record
iOrder: Integer;
sName: stortstring;
sText: stortstring;
end;

// 调用
....
var
i,k,m: Integer;
s: string;
MyRecList: array of MyRec;
aCom: Component;
begin
k := 0;
// 数组下标
for i := 0 to panel1.ControlCount - 1 then
begin
aCom := panel1.Controls;
if (aCom is TEdit) then
begin
MyRecList[k].iOrder := TEdit(aCom).TabOrder;
MyRecList[k].sName := TEdit(aCom).Name;
MyRecList[k].sText := TEdit(aCom).Text;
Inc(k)
end;
// end if
end;
// end for
for m:= 1 to kdo
begin
s := 'Edit' + IntToStr(m);
// Edit控件的Name
for i := 0 to k - 1do
begin
if MyRecList.sName = s then
// 如果是用别的如TabOrder则使用相应的判断条件
begin
RichEdit1.Lines.Add(IntToStr(MyRecList.iOrder));
RichEdit1.Lines.Add(MyRecList.sName);
RichEdit1.Lines.Add(MyRecList.sText);
end;
end;
end;
end;

如上方式即可实现打印顺序为自己定义顺序(以上根据控件名称排序)....
 
已自行解决,谢谢关注!
以上例子中应先为 MyRecList 分配足够的空间。
根据 MyRecList.iOrder进行升序排序(如使用冒泡算法等)。
再依次遍历 MyRecList 可实现题目要求:)
 
后退
顶部