GroupBox和CheckBox奇怪的问题

秋天之落叶 2018-08-16 11:09:12
选择A-F的答案,我使用了1个GroupBox和6个CheckBox,遍历GroupBox中选中的CheckBox作为最后的答案字符串。
不知道动了哪里,两个页面的GroupBox和CheckBox出现了奇怪的问题,一个全选后显示ABCDEF字串,一个竟然显示FEDCBA字串,我把每个控件的属性都对了一遍,没有区别。然后单独遍历2个GroupBox,奇怪的问题来了,一个GroupBox遍历时按照A-F的次序显示CheckBox,一个遍历时按照F-A的次序显示CheckBox,我看了看CheckBox的taborder都是由左到右由小到大排列的。
单个选择ABCDEF时,也是按照倒叙的顺序显示,我在遍历后利用Tstringlist进行了排序,在edit中竟然也是倒序。edit和上一个比较,没有属性上的差别。
找了一天的时间,基本上已经抓狂了。
请问大侠们,在GroupBox和CheckBox中,什么原因会影响遍历控件的顺序?
对了,我是用过一次设置Taborder的顺序,效果不好,有自己设置了一下,这个没什么影响啊。

...全文
326 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
Controls里面的顺序是按照创建顺序递增的,也就是先拖到设计器里的,或者先调用xxx.Create的排在前面
秋天之落叶 2018-08-17
  • 打赏
  • 举报
回复
引用 3 楼 georgeye 的回复:
在你的界面上按一下右键 view as text,看一下dfm的代码你就明白是怎么回事了

哦,是按照这个顺序遍历的吗?
我只知道这是属性,不知道还和顺序有关
无聊的猪 2018-08-17
  • 打赏
  • 举报
回复
在你的界面上按一下右键 view as text,看一下dfm的代码你就明白是怎么回事了
秋天之落叶 2018-08-17
  • 打赏
  • 举报
回复
引用 10 楼 lyhoo163 的回复:
容器中的控件,顺序是按照创建顺序递增的,通过代码Create的最优先。
那么,通常通过对控件的名称,有意地按排序规律,取名称。这样,搜索子控件时,使用时,按名称排序,就可以了。

嗯,受教了
lyhoo163 2018-08-17
  • 打赏
  • 举报
回复
容器中的控件,顺序是按照创建顺序递增的,通过代码Create的最优先。
那么,通常通过对控件的名称,有意地按排序规律,取名称。这样,搜索子控件时,使用时,按名称排序,就可以了。
秋天之落叶 2018-08-17
  • 打赏
  • 举报
回复
引用 6 楼 BlueStorm 的回复:
根本就不需要关系checkbox的顺序问题,自己排一下序就可以了:

很奇怪为什么我的sl.Sort; sl.Sorted := True;就不管用?
秋天之落叶 2018-08-17
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
Controls里面的顺序是按照创建顺序递增的,也就是先拖到设计器里的,或者先调用xxx.Create的排在前面

我是昨天折腾了一天才知道的
BlueStorm 2018-08-17
  • 打赏
  • 举报
回复
更正一下:

procedure StrSort(var Str: String);
var
C: Char;
I, J, K, Len: Integer;
begin
Len := Length(Str);
if Len <= 1 then Exit;

for I := 1 to Len do
begin
K := I;
for J := I+1 to Len do
if Str[J] < Str[K] then K := J;
if K > I then
begin
C := Str[I];
Str[I] := Str[K];
Str[K] := C;
end;
end;
end;

function GetAnswers(GroupBox: TGroupBox): String;
var
I: Integer;
CheckBox: TCheckBox;
begin
Result := '';
for I := 0 to GroupBox.ControlCount - 1 do
begin
if not (GroupBox.Controls[I] is TCheckBox) then
Continue;
CheckBox := TCheckBox(GroupBox.Controls[I]);
if CheckBox.Checked then
Result := Result + Trim(CheckBox.Caption);
end;
StrSort(Result);
end;
BlueStorm 2018-08-17
  • 打赏
  • 举报
回复
根本就不需要关系checkbox的顺序问题,自己排一下序就可以了:

procedure StrSort(var Str: String);
var
C: Char;
I, J, K, Len: Integer;
begin
if Len <= 1 then Exit;

Len := Length(Str);
for I := 1 to Len do
begin
K := I;
for J := I+1 to Len do
if Str[J] < Str[K] then K := J;
if K > I then
begin
C := Str[I];
Str[I] := Str[K];
Str[K] := C;
end;
end;
end;

function GetAnswers(GroupBox: TGroupBox): String;
var
I: Integer;
CheckBox: TCheckBox;
begin
Result := '';
for I := 0 to GroupBox.ControlCount - 1 do
begin
if not (GroupBox.Controls[I] is TCheckBox) then
Continue;
CheckBox := TCheckBox(GroupBox.Controls[I]);
if CheckBox.Checked then
Result := Result + Trim(CheckBox.Caption);
end;
StrSort(Result);
end;
秋天之落叶 2018-08-16
  • 打赏
  • 举报
回复
我晕,修复正常:选择全部CheckBox控件,剪贴后再粘贴到GroupBox中,遍历所有CheckBox,竟然按照顺序显示了,哇哈哈哈
这是什么原因???
再试:先选F...A,剪贴粘贴,遍历倒序,先选A...F,剪贴粘贴,遍历正常。
结论:控件遍历是按照放到窗体的顺序显示的,和Taborder和控件名字的序号无关。
休息,结论对不对不管了,太闹心了,先休息再说。
秋天之落叶 2018-08-16
  • 打赏
  • 举报
回复
function TForm1.daan(Sender: TObject): string;
var
i: Integer;
s: string;
sl: TStringList;
begin
s := '';

if Sender is TGroupBox then
for i := 0 to TGroupBox(Sender).ControlCount - 1 do
begin
if (TGroupBox(Sender).Controls[i] is TCheckBox) then
if (TGroupBox(Sender).Controls[i] as TCheckBox).Checked then
begin
s := s + Trim((TGroupBox(Sender).Controls[i] as TCheckBox).Caption);
end;
end;

sl := TStringList.Create;

for i := 0 to Length(Trim(s)) - 1 do
begin
sl.Add(Copy(Trim(s), i + 1, 1));
end;

sl.Sort;
sl.Sorted := True;

s := '';

for i := 0 to sl.Count - 1 do
begin
s := s + sl[i];
end;

FreeAndNil(sl);

result := s;
end;

5,392

社区成员

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

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