Delphi t设置选项卡顺序…运行时与设计时不同

Delphi t设置选项卡顺序…运行时与设计时不同,delphi,winapi,lazarus,tpagecontrol,ttabsheet,Delphi,Winapi,Lazarus,Tpagecontrol,Ttabsheet,我正在运行Lazarus 0.9.30.2 我有一个TForm,上面有一个TPageControl。TPageControl中有一系列的TTabsheet。在运行时,TTabSheets的顺序与设计时不同(见图) 设计时的顺序是我希望在运行时看到的,至少是第一次显示表单。为什么在运行时顺序会改变?有没有办法控制它?@TLama是正确的,这与在多行视图中Windows选项卡控件的行为方式有关。您观察到的行为与多行选项卡的选择处理方式有关。当您选择一个选项卡时,它总是显示在最下面一行,因为指示选择

我正在运行Lazarus 0.9.30.2

我有一个TForm,上面有一个TPageControl。TPageControl中有一系列的TTabsheet。在运行时,TTabSheets的顺序与设计时不同(见图)


设计时的顺序是我希望在运行时看到的,至少是第一次显示表单。为什么在运行时顺序会改变?有没有办法控制它?

@TLama是正确的,这与在多行视图中Windows选项卡控件的行为方式有关。您观察到的行为与多行选项卡的选择处理方式有关。当您选择一个选项卡时,它总是显示在最下面一行,因为指示选择哪个选项卡的视觉提示只能真正适用于最下面一行的选项卡

给定该约束,控件只需在修改所选选项卡时重新排列选项卡行。这对用户来说是令人惊讶的困惑。好的UI设计从来不会让UI元素像这样改变位置

很明显,这里发生的是,当表单第一次显示时,重新排列是在运行时发生的,无论出于什么原因,这导致了与设计时安排不同的安排。考虑到用户只需选择行即可按任意顺序排列,我不确定您是否应该担心行的显示顺序

如果您在表单首次显示时死心塌地地想要强制执行特定排列,则可以将类似这样的代码添加到表单的
OnCreate
处理程序中:

PageControl1.ActivePage := TabSheet9;
PageControl1.ActivePage := TabSheet5;
PageControl1.ActivePage := TabSheet1;

UI设计的最佳实践是避免多行选项卡控件,我建议您尝试以这种方式重新设计UI。

@TLama是正确的,这与Windows选项卡控件在多行视图中的行为方式有关。您观察到的行为与多行选项卡的选择处理方式有关。当您选择一个选项卡时,它总是显示在最下面一行,因为指示选择哪个选项卡的视觉提示只能真正适用于最下面一行的选项卡

给定该约束,控件只需在修改所选选项卡时重新排列选项卡行。这对用户来说是令人惊讶的困惑。好的UI设计从来不会让UI元素像这样改变位置

很明显,这里发生的是,当表单第一次显示时,重新排列是在运行时发生的,无论出于什么原因,这导致了与设计时安排不同的安排。考虑到用户只需选择行即可按任意顺序排列,我不确定您是否应该担心行的显示顺序

如果您在表单首次显示时死心塌地地想要强制执行特定排列,则可以将类似这样的代码添加到表单的
OnCreate
处理程序中:

PageControl1.ActivePage := TabSheet9;
PageControl1.ActivePage := TabSheet5;
PageControl1.ActivePage := TabSheet1;

UI设计的最佳实践是避免多行选项卡控件,我敦促您尝试以这种方式重新设计UI。

我添加了Delphi标记,因为您也可以在Delphi中看到同样的标记。看起来更像是Windows选项卡控件的行为,比如在创建控件和设置样式时,选项卡顺序会丢失。我见过一些非常奇怪的选项卡控件问题,但这一问题实际上是可以理解的,而且似乎是可行的。您是否尝试过将选项卡样式更改为显示按钮?我已经添加了Delphi标记,因为您也可以在Delphi中看到同样的标记。看起来更像是Windows选项卡控件的行为,比如在创建控件和设置样式时,选项卡顺序会丢失。我见过一些非常奇怪的选项卡控件问题,但这一问题实际上是可以理解的,而且似乎是可行的。您是否尝试过将选项卡样式更改为显示按钮?然后它可能不会对它们进行重新排序。我有30个选项卡页,因此唯一的选项是(I)使用它(ii)不使用多行样式集,因此使用TPageControl的默认滚动行为。@user1174918我添加了一些代码,解释如何至少控制窗体首次显示时选项卡行的显示顺序。但我会寻找替代的用户界面。在我看来,30个选项卡似乎太多了。@user1174918,我想David的“重新设计”意味着更多的工作,而不仅仅是将MultiLine设置为False.:-)也就是说,对内容进行不同的分组,使用嵌套的tabcontrols(用户友好程度也不高),或者其他什么。我有30个TabSheets,所以唯一的选项是(I)使用它(ii)不使用多行样式集,因此使用TPageControl的默认滚动行为。@user1174918我添加了一些代码来解释如何至少控制窗体首次显示时选项卡行的显示顺序。但我会寻找替代的用户界面。在我看来,30个选项卡似乎太多了。@user1174918,我想David的“重新设计”意味着更多的工作,而不仅仅是将MultiLine设置为False.:-)也就是说,以不同的方式对内容进行分组,使用嵌套的tabcontrols(用户友好程度也不高),或者其他什么。