Создать рамку в зависимости от назначения кнопки - PullRequest
0 голосов
/ 12 декабря 2018

В форме:
* TCategoryButtons (например, в каждой из 10 кнопок есть 3 категории)
* TPageControl (clean)
Создано 30 (например) разных кадров.

При нажатии кнопки необходимо:
1. Проверить, был ли уже создан кадр (только один кадр для одной кнопки).
2. Создать вкладку в TPageControl и активировать ее.
3. Создайте рамку, соответствующую кнопке, и поместите ее в созданную вкладку (если вкладка закрыта, убейте ее и рамку).

Вот что я мог сделать:

procedure TForm1.CategoryButtons1Categories0Items0Click(Sender: TObject);
var
  Client: TTabSheet;
begin
  if (not Assigned(Frame2)) then
  begin
    Client := TTabSheet.Create(Self);
    Client.PageControl := PageControl1;
    Client.Caption := CategoryButtons1.Categories[0].Items[0].Caption;
    PageControl1.ActivePage := Client;

    Frame2 := TFrame2.Create(nil);
    Frame2.Parent := Client;
  end;
end;

Я пытался сделать это следующим образом:

type
  TFrameClass = class of tframe; 

function GetFrClass(const aClassID: Integer): TFrameClass;
begin
  case aClassID of
    1:
      Result := TFrame2;
    2:
      Result := TFrame3;
  else
    Result := nil;
  end;
end;

procedure TForm1.CreateFrm(tags: Integer; NameTSh: string);
var
  FrClass: TFrameClass;
  Frame: tframe;
  Client: TTabSheet;
begin
  FrClass := GetFrameClass(tags);

  if (FrClass <> nil) then
  begin
    Client := TTabSheet.Create(Self);
    Client.PageControl := PageControl1;
    Client.Caption := NameTSh;

    Frame := FrClass.Create(Client);
    Frame.Parent := Client;
  end;
end;

Но этот метод не ограничивает количество созданных экземпляров кадра.

Пожалуйста, скажите мне решение!

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете использовать значение tags: Integer в процедуре TForm1.CreateFrm(), чтобы определить, существует ли кадр в PageControl1 или нет.

Перед созданием кадра и добавлением его в PageControl1,проверьте, имеет ли какая-либо из существующих страниц значение tags в свойстве tag:

procedure TForm1.CreateFrm(tags: Integer; NameTSh: string);
var
  i: integer;
  ...
begin
  for i := 0 to PageControl1.PageCount-1 do
    if PageControl1.Pages[i].tag = tags then
      Exit;

  FrClass := GetFrameClass(tags);
  ...

В конце процедуры CreateFrm() вы сохраните tags

  PageControl1.Pages[PageControl1.PageCount-1].Tag := tags;
end;
...