Как скрыть несколько вкладок в TTabcontrol

В моей программе есть три раскрывающихся списка и один ttabcontrol с 5 вкладками. что мне нужно знать, так это то, как я могу скрыть все вкладки и снова установить их видимость, если в раскрывающемся меню выбран определенный элемент. Например, в моем раскрывающемся списке есть элемент индекса. A , B , C , A+B , A+C TabControl имел следующие вкладки. A B C Теперь мне нужно скрыть все вкладки и показать вкладку A, если в раскрывающемся списке выбрано a или a & b, если в раскрывающемся списке выбрано A + B.


person Buddy    schedule 12.05.2017    source источник
comment
Что делают остальные 2 раскрывающихся списка?   -  person Sertac Akyuz    schedule 12.05.2017
comment
Там делают то же самое D E F и G H I то же самое, что и A B C   -  person Buddy    schedule 12.05.2017
comment
Мое предложение состоит в том, чтобы сначала заставить его работать, используя условные операторы. Например если. После этого вы можете подумать о том, как это можно сделать более эффективно.   -  person Sertac Akyuz    schedule 12.05.2017
comment
Если ComboBo.ItemIndex = 1, тогда начните Tabitem1.enabled :=True ; конец иначе начало Tabitem1.enabled :=flase ; он отлично работает с 1 вкладкой, скрытой и скрытой, но когда мне нужно отобразить две вкладки одновременно, например, в случае a + b, это не сработает, что делать в этом случае?   -  person Buddy    schedule 12.05.2017
comment
Вам просто нужно иметь последовательные операторы, каждый для вкладки.   -  person Sertac Akyuz    schedule 12.05.2017
comment
Вы используете VCL или FMX? В FMX TTabItem имеет свойство Visible. Но в VCL TTabControl не позволяет вам скрывать/показывать вкладки, вы должны физически удалить их из свойства Tabs и снова добавить, поэтому я бы предложил использовать TPageControl вместо TTabControl, чтобы вы могли установить свойство TTabSheet.TabVisible для различных страницы по мере необходимости.   -  person Remy Lebeau    schedule 12.05.2017
comment
Я использую FMX.   -  person Buddy    schedule 13.05.2017


Ответы (1)


используйте перечисляемый тип, чтобы сделать это. Вы можете очень легко изучить логическую операцию.

TYPE
TabControlTag = (A, B, C);
TabTags = set of TabControlTag;
TForm1=class(TForm)
...

Реализация

procedure TForm1.HideTabControl(Sender: TObject);
{hide all tabItem in tabControl}
var
   i: integer;
begin
   for i := 0 to TabControl1.ComponentCount - 1 do
      if TabControl1.Components[i] is TTabItem then
         with TabControl1.Components[i] do
         begin
            visible := false;
         end;
end;

если вы используете TCombobox в качестве раскрывающегося списка, используйте событие OnChange

procedure TForm1.ComboBox1Change(Sender: TObject);
var
   Tabs: TabTags;
begin
   case ComboBox1.ItemIndex of
      0: { A } Tabs := [A];
      1: { B } Tabs := [B];
      2: { C } Tabs := [C];
      3: { A+B } Tabs := [A,B];
      4: { A+C } Tabs := [A,C];
   end;
   if A in Tabs then  tabItem1.Visible:=true;
   if B in Tabs then  tabItem2.Visible:=true;
   if C in Tabs then  tabItem3.Visible:=true;
end;

Очень гибкое и расширяемое решение.

Например, используя TCheckbox

var
   Tabs: TabTags;
begin
tabs:=[];
If checkBoxA.IsChecked then TabTags:= [A];
If checkBoxB.IsChecked then TabTags:= TabTags + [B];//OR boolean operations. Also allowed [A,B] * [A] which means AND, [A,B] - [A] which means NOR,
If checkBoxC.IsChecked then Include(TabTags,C)
if A in Tabs then  tabItem1.Visible:=true;
if B in Tabs then  tabItem2.Visible:=true;
if C in Tabs then  tabItem3.Visible:=true;
end
person Ricardo da Rocha Vitor    schedule 12.05.2017
comment
чтобы узнать больше о перечислимой логике, прочитайте thoughtco.com/understanding-delphi-set-type -1057656 - person Ricardo da Rocha Vitor; 13.05.2017
comment
А что, если выбрана вкладка A + B или B + C, то как сделать так, чтобы обе вкладки были видны одновременно? - person Buddy; 13.05.2017
comment
Это будет работать нормально! Это уже реализовано в процедуре выше! Просто поместите новые элементы в поле со списком с желаемой комбинацией и добавьте ссылку на этот индекс в структуре «Case of». - person Ricardo da Rocha Vitor; 13.05.2017