Передача унаследованных кадров в качестве аргумента процедуры

У меня есть TPageControl с N количеством TTabSheets в моей основной форме, которую я использую для встраивания нескольких потомков TFrame. Для фреймов я создал «TBaseFrame», из которого я получаю отдельные фреймы, которые я хочу отображать в таблицах вкладок, более или менее выглядит так ...

TBaseFrame = класс (TFrame)

  • TBaseFrameDescendant1 = класс (TBaseFrame)
  • TBaseFrameDescendant2 = класс (TBaseFrame)
  • TBaseFrameDescendantN = класс (TBaseFrame)

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

procedure CreateNewTabSheetAndFrame( What do I put here to accept any of my TBaseFrameDescendants? )
var
  TabSheet: TTabSheet;

begin
  TabSheet := TTabSheet.Create(MainPageControl);
  TabSheet.Caption := 'abc';
  TabSheet.PageControl := MainPageControl;

// Here I want to create the given TBaseFrameDescendant, set the Parent to the above TabSheet and so on   
end;

Угадайте, что мой главный вопрос здесь - как настроить мою процедуру, чтобы я мог передать любой фрейм, полученный из моего TBaseFrame, чтобы я мог работать с ним в рамках процедуры, или я двигаюсь здесь в неправильном направлении?


person Marcel    schedule 02.01.2020    source источник


Ответы (1)


Вам нужно использовать так называемый метакласс.

type
  TBaseFrameClass = class of TBaseFrame;

procedure TMainForm.CreateNewTabSheetAndFrame(FrameClass: TBaseFrameClass)
var
  TabSheet: TTabSheet;
  Frame: TBaseFrame;
begin
  TabSheet := TTabSheet.Create(Self);
  TabSheet.PageControl := MainPageControl;
  Frame := FrameClass.Create(Self);
  Frame.Parent := TabSheet;
end;

Убедитесь, что если вы объявляете какие-либо конструкторы в любом из ваших классов фреймов, они являются производными от виртуального конструктора, представленного в TComponent. Это необходимо для того, чтобы создание экземпляра через метакласс вызывало соответствующий производный конструктор.

person David Heffernan    schedule 02.01.2020
comment
Ура, Дэвид, все заработало за несколько секунд, большое спасибо! :) - person Marcel; 02.01.2020