delphi如何按照控件的左右顺序来遍历窗体中的每个控件

mashengxuucom 2012-03-11 01:21:53
delphi如何按照控件的左右顺序来遍历窗体中的每个控件
delphi默认是按照控件添加进窗体的顺序来遍历的,
有没有哪个属性能控制这个/??
...全文
1083 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangning 2012-03-23
  • 打赏
  • 举报
回复
以上代码对TLabel,TImage无效 对TPanel,TEdit有效
对无效的TLabel,TImage等放在TPanel容器里面,上面的代码就可以用了
kuangning 2012-03-23
  • 打赏
  • 举报
回复
如果窗体上的控件都是 TWinControl继承下来的 下面的代码对你可能有帮助
var

P:TPoint;
wnd:Thandle;
vWinControl: TWinControl;
begin



P := self.ClientToScreen(Point(x,y));

wnd := WindowFromPoint(p);//
if wnd<>0 then
begin
vWinControl := FindControl(wnd);


end;

end;
onlyou13 2012-03-15
  • 打赏
  • 举报
回复
可以设置tag来实现,然后findcomponent
mashengxuucom 2012-03-15
  • 打赏
  • 举报
回复
class procedure myformUtil.AdjustToolBar(aContainer: TWinControl;
bIsVert: Boolean; iSpace, iInitPosition: Integer);
var
col: TControl;
ls: TStringList;
i: Integer;
begin
if iSpace < 0 then
iSpace := 4;
if iInitPosition < 0 then
iInitPosition := 10;

aContainer.Controls[0].Left := iInitPosition;
aContainer.Controls[0].Top := Round((aContainer.ClientHeight -
aContainer.Controls[0].Height) / 2);
aContainer.Controls[i].Left := iSpace + aContainer.Controls[i - 1].Left
+ aContainer.Controls[i - 1].Width;
aContainer.Controls[i].Top := Round((aContainer.ClientHeight -
aContainer.Controls[i].Height) / 2);
end;

看看我这段代码,实现控件自动排序的,如何实现控件按原来的位置从左到右依次排序呢?
这个默认的排序规则是控件添加 进panel中的顺序.
高手指点指点..
我看见佛 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mashengxuucom 的回复:]
那controls[0]呢?
Components[0]和controls[0]有啥区别
我又如何才能改变这个次序,望指教.
[/Quote]参考http://www.cnblogs.com/del/archive/2008/10/23/1317862.html
我看见佛 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mashengxuucom 的回复:]
那如何实现对panel上的所控件进行位置排序,比如panel上有三个控件,添加进panel中的顺序分别是btn1,btn2,btn3,left小的排在左边,(btn2.left>btn3.left>btn1.left,排列的顺序就为btn1,btn3,btn2)
这种如体实现??
[/Quote]
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin

for i:= 0 to self.ComponentCount - 1 do
begin
if Components[i].name = 'Button4' then
ShowMessage(Components[i+1].Name);
end;
end;

存细观察下可以发现DELPHI的添加次序还是很有规律的
在PANEL下则只需调整PANEL内的元件次序就可以了,

(Components[i] as TControl).Left := (Components[i+1] as TControl).Left+10;这类代码来调整
SQLDebug_Fan 2012-03-11
  • 打赏
  • 举报
回复
可以用Panel.Components[0]来取得控件,然后判断是否是Button,如:
if Panel.Component[i] is TButton then
mashengxuucom 2012-03-11
  • 打赏
  • 举报
回复
那如何实现对panel上的所控件进行位置排序,比如panel上有三个控件,添加进panel中的顺序分别是btn1,btn2,btn3,left小的排在左边,(btn2.left>btn3.left>btn1.left,排列的顺序就为btn1,btn3,btn2)
这种如体实现??
山东蓝鸟贵薪 2012-03-11
  • 打赏
  • 举报
回复
case5166
对就是这位仁兄的说法
fjb577128504 2012-03-11
  • 打赏
  • 举报
回复
好东西啊
mashengxuucom 2012-03-11
  • 打赏
  • 举报
回复
那controls[0]呢?
Components[0]和controls[0]有啥区别
我又如何才能改变这个次序,望指教.
我看见佛 2012-03-11
  • 打赏
  • 举报
回复
object Edit1: TEdit
Left = 336
Top = 128
Width = 121
Height = 21
TabOrder = 2
Text = 'Edit1'
end
第一个应该是object Edit1: TEdit,看错了下
我看见佛 2012-03-11
  • 打赏
  • 举报
回复
没有的,
object Form1: TForm1
Left = 226
Top = 153
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu1
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Edit1: TEdit
Left = 336
Top = 128
Width = 121
Height = 21
TabOrder = 2
Text = 'Edit1'
end
object Button1: TButton
Left = 208
Top = 296
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
end
object Button2: TButton
Left = 408
Top = 272
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 1
OnClick = Button2Click
end

object Edit2: TEdit
Left = 368
Top = 32
Width = 121
Height = 21
TabOrder = 3
Text = 'Edit2'
end
object Edit3: TEdit
Left = 200
Top = 64
Width = 121
Height = 21
TabOrder = 4
Text = 'Edit3'
end
object RadioButton1: TRadioButton
Left = 128
Top = 40
Width = 113
Height = 17
Caption = 'RadioButton1'
TabOrder = 5
end
object MainMenu1: TMainMenu
Left = 232
Top = 96
end
end

Delphi是根据这里定义的次序进行加载的,所以此处Components[0]为Button1
如果控制焦点的话是TabOrder这个属性

5,927

社区成员

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

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