我正在使用隐藏 TTabsheets 选项卡的 TPageControl,以便它们包含的框架看起来是堆叠的,并通过在过程中的不同步骤显示不同的框架来构建某种向导。
问题是,在调用“PageControl1.ActivePageIndex := x;”之后 要显示下一帧,一旦在新帧中,我需要知道我是如何到达这里的,即先前显示的是哪一帧。
如果其他人使用页面控件中的框架来构建向导,那么您如何跟踪上一个/下一个框架?
谢谢你。
我正在使用隐藏 TTabsheets 选项卡的 TPageControl,以便它们包含的框架看起来是堆叠的,并通过在过程中的不同步骤显示不同的框架来构建某种向导。
问题是,在调用“PageControl1.ActivePageIndex := x;”之后 要显示下一帧,一旦在新帧中,我需要知道我是如何到达这里的,即先前显示的是哪一帧。
如果其他人使用页面控件中的框架来构建向导,那么您如何跟踪上一个/下一个框架?
谢谢你。
TPageControl 有一个名为 OnChanging 的事件,该事件在更改之前调用,并允许您通过将参数设置为 false 来取消更改。
您还可以使用此事件记录更改前哪个页面处于活动状态。
不过,我会鼓励你做一些与 gui 组件不那么紧密耦合的东西。尝试让某种类负责保存框架并检查是否应允许从一个框架更改为另一个框架,等等。这样可以更轻松地切换用于可视化向导的 gui 控件类型。而且它肯定会让测试更容易,看看你的向导是否给出了你想要的逐步进展,是否强制执行验证规则等等。
delphi.about.com 上有一篇文章如何创建类似向导的用户界面。您可以使用 TPageControl.SelectNextPage 方法在一组页面中前后移动。
与 Nat 的回答相反,tpagecontrol.onchanging
如果您使用正确的方法更改页面,该事件将正常工作:
创建一个 VCL 表单应用程序,然后放在一个Align 属性上TPageControl
,将 Align 属性设置为 alTop 并在下方留出一些空间。右键单击 PageControl 并添加一些页面,TabVisible:=false
为每个页面设置。现在在下面添加几个按钮。将 PageControl 的onchanging
事件和按钮的onclick
事件附加到下面的相应代码中:
procedure TForm1.Button1Click(Sender: TObject);
begin
if PageControl1.ActivePageIndex < PageControl1.PageCount - 1 then
PageControl1.SelectNextPage(true, false);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if PageControl1.ActivePageIndex > 0 then
PageControl1.SelectNextPage(false, false);
end;
procedure TForm1.PageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
showmessage(format('now leaving page number %d', [PageControl1.ActivePageIndex]));
end;
这按预期工作(BDS2006,RAD2009)。
您可能还想查看作为 JEDI VCL 库一部分的向导组件。
我已经编写了一个向导框架,它几乎可以完成您尝试做的事情。其中大部分都记录在我的博客上。我使用的解决方案是将下一页/上一页的请求推送到框架本身(使用接口),并让框架决定下一帧应该是什么。
如果您想合并这两个想法(保持 tPageControl 原样),您可以将请求路由到 tPageControl.ActivePage,并且对于 NavigateToPage 的实现,可以查找您命名的页面,而不是尝试查找特定的页面班级。
我的向导框架的设计是处理一些复杂的向导,这些向导包含基于沿途做出的决策的多条路径。我将之前的帧存储在一个列表中,每个帧的“状态”都存储在一个全局可访问的类中,一旦向导完成/取消,该类就会被清除。
您必须手动跟踪上一页索引。例如,在 Next 和 Previous 按钮的 OnClick 事件处理程序中,您可以执行以下操作:
procedure TWizardForm.NextClick(ASender: TObject);
begin
SwitchPage(True);
end;
procedure TWizardForm.PreviousClick(ASender: TObject);
begin
SwitchPage(False);
end;
SwitchPage() 看起来像这样:
procedure TWizardForm.SwitchPage(AForward: boolean);
var
LGotoPage: integer;
begin
LGotoPage := PageControl.ActivePageIndex;
if AForward and (PageControl.ActivePageIndex < PageControl.PageCount) then
inc(LGotoPage)
else if PageControl.PageIndex > 0 then
dec(LGotoPage);
if (LGotoPage <> PageControl.ActivePageIndex)
and AllowSwitchFrom(ActivePageIndex) then
begin
FPreviousPage := PageControl.ActivePageIndex;
PageControl.ActivePageIndex := LGotoPage;
end;
end;
或者类似的东西。:)
编辑: Argalatyr 是正确的,而我是不正确的,如果您想按顺序通过向导,我将假设这里就是这种情况。
OnChanging 处理程序确实会触发,并且您来自的页面(仍然)是活动页面。
当您直接设置页面索引时,不会触发 OnChanging 事件,如我的示例所示,因此您必须跟踪旧页面索引。这来自使用可选页面(非顺序)编写向导。
我应该在发布之前检查一下。为不正确的答案道歉。
N@