如何在页面控件中从一个页面移动到另一个页面时检查以前的标签页?

时间:2009-08-22 20:33:48

标签: delphi user-interface frames wizard uipagecontrol

我正在使用TPageControl,其中隐藏了TTabsheets的标签,以使它们包含的框架看起来是堆叠的,并通过在过程中的不同步骤显示不同的框架来构建某种向导。

问题是,在调用“PageControl1.ActivePageIndex:= x;”之后显示下一帧,在新帧中,我需要知道我是如何到达这里的,即先前显示的帧。

如果其他人在页面控件中使用了框架来构建向导,那么如何跟踪上一帧/下一帧呢?

谢谢。

6 个答案:

答案 0 :(得分:5)

TPageControl有一个名为OnChanging的事件,它在更改之前被调用,并允许您通过将参数设置为false来取消更改。

您还可以使用此事件记录更改前的活动页面。

但是,我鼓励你做一些与gui-component没有强烈耦合的东西。尝试让某种类负责保持框架并检查是否允许从一个框架到另一个框架的更改等等。这样可以更轻松地切换用于可视化向导的gui控件类型。而且,如果强制执行验证规则等等,它肯定会让您更容易测试,看看您的向导是否提供了您想要的逐步进展。

答案 1 :(得分:1)

在delphi.about.com上article是如何创建类似向导的用户界面的。您可以使用TPageControl.SelectNextPage方法在一组页面中前后移动。

答案 2 :(得分:1)

与Nat的回答相反,如果您使用正确的方法更改页面,tpagecontrol.onchanging事件将正常工作:

创建一个VCL表单应用程序,然后放在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)。

答案 3 :(得分:0)

您可能还想查看属于JEDI VCL库的Wizard组件。

答案 4 :(得分:0)

我写了一个wizard framework几乎可以做你想做的事情。其中大部分都记录在blog上。我使用的解决方案是将下一个/上一页的请求推送到帧本身(使用接口),然后让帧决定下一帧应该是什么。

如果你想合并这两个想法(保持你的tPageControl不变),你可以将请求路由到tPageControl.ActivePage,并且为了实现NavigateToPage可以查找你命名的页面而不是尝试找到一个特定的班级。

我的向导框架的设计是处理一些复杂的向导,这些向导包含基于沿途决策的多个路径。我将前面的帧存储在一个列表中,每个帧的“状态”存储在一个全局可访问的类中,该类在向导完成/取消后被清除。

答案 5 :(得分:0)

您必须手动跟踪上一页索引。例如,在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 - [