【问题标题】:Delphi - Already opened tab in pagecontrolDelphi - 已在页面控件中打开选项卡
【发布时间】:2017-05-03 12:54:41
【问题描述】:

这是关于带有动态选项卡的 PageControl。我有 5 个按钮(Button1、Button2、Button3、Button4、Button5)。

我想要以下内容:

  1. 每次点击按钮都会打开一个新的TtabSheet
  2. 单击同一个按钮时,“Ttabsheet”已经打开,应该会再次显示。

如何做到这一点?

【问题讨论】:

  • 那么当你点击一个按钮时你希望页面显示出来?
  • 你能解释一下第二部分吗?
  • 欢迎来到 Stack Overflow!请edit您的问题显示the code you have so far。您应该至少包含您遇到问题的代码的大纲(但最好是minimal reproducible example),然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask
  • 我在每个按钮上都成功添加了页面,但是当我再次单击同一个按钮时,会添加一个新页面。如果我单击显示最近打开的标签页的相同按钮,我想要。
  • 好的,所以当您按下按钮时,会添加一个页面。当您按下相同的按钮时,您希望它显示已添加的页面而不是添加新页面。这就是你要的吗?

标签: delphi delphi-xe


【解决方案1】:

只需在表单类中定义像fPreviousTabIndex 这样的变量,您可以在其中存储最后一个状态(TPageControl 的ActivePageIndex 属性)。

接下来的部分已经很简单了……

procedure TForm1.Button2Click(Sender: TObject);
const
  DESIRED_PAGE_INDEX = 2;
begin
  if PageControl.ActivePageIndex = DESIRED_PAGE_INDEX then
    PageControl.ActivePageIndex := fPreviousTabIndex
  else
  begin
    fPreviousPageIndex := PageControl.ActivePageIndex;
    PageControl.ActivePageIndex := DESIRED_PAGE_INDEX;
  end;
end;

当然你需要在创建表单时初始化fPreviousTabIndex

【讨论】:

  • 问题是创建标签的同一个按钮在再次点击时应该选择它。
【解决方案2】:

我不知道为什么您真的希望有五个按钮来完成创建选项卡然后选择它们的工作,但这是您可以尝试的方法之一

uses System.Generics.Collections;

...

var
Newtabsheet: Ttabsheet;
Tabs: TList<Ttabsheet>;
Index: array[1..5] of Integer;
Ex: array [1..5] of Boolean;

implementation

把这个放在Formcreate处理程序上

procedure TForm6.FormCreate(Sender: TObject);
begin
Tabs := Tlist<Ttabsheet>.create;
for I=1 to 5 do ex[I]:=false;
end;

在每个OnClickButton 事件处理程序上都有这个

procedure TForm6.Button1Click(Sender: TObject);
begin
if not(Ex[1])then
  begin
  Newtabsheet := Ttabsheet.Create(PageControl1);
  NewTabSheet.PageControl := PageControl1;
  Newtabsheet.Caption := 'Tab 1';
  Index[1] := Tabs.Count;
  Tabs.Add(Newtabsheet);
  Ex[1] := true;
  end
else
  begin
  Pagecontrol1.ActivePage := Tabs.List[Index[1]];
  end;
end;

procedure TForm6.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Tabs.Free;
end;

记得更改数字。

它在 RAD 工作室西雅图进行了测试。

注意: 基于 david cmets,我编辑了我的答案。更多解释请看question

【讨论】:

  • 是的 它可以运行良好,但是当我删除标签时,它无法重新打开同一个标签。我该怎么办?
  • 当您删除选项卡时执行 'ex(选项卡编号) :=false;'它应该可以解决问题。
  • 只有一件事,当您删除标签时,您正在从“标签”列表中删除它,对吧?
  • 是的,你是对的,我只是使用 PageControl1.ActivePage.free 和活动标签的声明列表。
  • 这段代码很乱。至少它应该使用一个数组而不是 5 个变量。无论如何,丢弃所有代码并使用选项卡表的 TabVisible 属性会更容易。
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多