Динамически добавлять панель управления на динамическую вкладку (C++ Builder Rad Studio)?

У меня проблема с получением значения tabPage->Name, потому что оно будет сгенерировано, когда пользователь нажмет кнопку, первый блок моего кода создаст новую вкладку внутри PageControl3, а затем я использую условие static int tabNumber; по if для создания tabPage->Caption, а затем я использую заголовок для tabPage->Name динамически.

Мне нужно имя этой таблицы, чтобы передать ее в строке ошибок.

static int tabNumber;
if (tabNumber >= 1) ++tabNumber;
else tabNumber = 1;
PageControl3->Visible = true;
TTabSheet *tabPage = new TTabSheet(PageControl3);
tabPage->PageControl = PageControl3;
tabPage->Caption = UnicodeString("Untitled") + IntToStr(tabNumber);
tabPage->Name = UnicodeString("ts") + tabPage->Caption;

Вторая часть моего кода должна создать новый TPanel внутри текущего tabpage->Name, который был создан в приведенной выше части моего кода, НО это не сработает.

TPanel *panelPage = new TPanel(tabPage->Name); // Error Line
panelPage->Align = alClient;
panelPage->Name = UnicodeString("panel") + tabPage->Caption;

Ошибка массажа:

[bcc32 Error] mainUnit.cpp(50): E2285 Could not find a match for 'TPanel::TPanel(const UnicodeString)'

Итак, я не знаю, как получить доступ к значению tabPage->Name, потому что оно было создано динамически?


person Nazari    schedule 08.01.2019    source источник
comment
Конструктору требуется переменная/объект компонента, а не строка с текстом имени. Например, TPanel *panelPage = new TPanel(tabPage); Будет ли это работать для вас? Вам нужно сделать панель родительской tabPage?   -  person Baxter    schedule 08.01.2019
comment
В вашем решении ошибка исправлена, да, я хочу, чтобы TPanel стал дочерним элементом для tapPage. На данный момент, когда я компилирую и запускаю приложение, я не вижу никакой панели внутри вкладки, когда я тестирую.   -  person Nazari    schedule 08.01.2019
comment
@DBBaxter Спасибо, чувак, я просто добавляю к нему panelPage->Parent = tapPage; panelPage->show(); и его работу; D   -  person Nazari    schedule 08.01.2019
comment
На заметку: tabNumber необходимо инициализировать, например static int tabNumber = 0;, а if (tabNumber >= 1), вероятно, вместо этого должно быть if (tabNumber < MaxInt). И вам действительно не нужно Name ваши динамические объекты вообще, если только вы не планируете использовать TComponent::FindComponent() для их поиска позже, но это не является хорошим дизайном кода. И вам не нужно вызывать Show(), когда вы также используете Visible = true (фактически это то, что Show() делает внутри).   -  person Remy Lebeau    schedule 08.01.2019
comment
Спасибо за примечание, Реми Лебо, но if (tabNumber < MaxInt) не будет работать, и я планирую использовать объект дозы позже, я обновлю ответ с помощью вашего примечания.   -  person Nazari    schedule 09.01.2019


Ответы (1)


DB Baxter Для конструктора требуется переменная/объект компонента, а не строка с текстом имени. Например, TPanel *panelPage = new TPanel(tabPage); Будет ли это работать для вас? Вам нужно сделать панель родительской tabPage?

Помогая DB Baxter, я думаю, что правильный и полный ответ для создания динамического TPanel внутри динамического TTabSheet потребует компонентной переменной/объекта, а затем для отображения TPanel мы должны использовать команду whatever->show();, полный код может быть таким:

static int tabNumber = 0;
if (tabNumber >= 1) {
    ++tabNumber;
} else {
    tabNumber = 1;
    PageControl3->Visible = true;
}
// create new tab sheet inside PageControl3
TTabSheet *tabSheet = new TTabSheet(PageControl3);
tabSheet->PageControl = PageControl3;
tabSheet->Caption = UnicodeString("Untitled") + IntToStr(tabNumber);
tabSheet->Name = UnicodeString("ts") + tabSheet->Caption;

// create new panel inside the current tab sheet
TPanel *panelBox = new TPanel(tabSheet);
panelBox->Parent = tabSheet;
panelBox->Align = alClient;
panelBox->Name = UnicodeString("panelPage") + IntToStr(tabNumber);
panelBox->BevelOuter = bvNone;
panelBox->ShowCaption = true;
panelBox->Caption = UnicodeString("panel") + tabSheet->Caption;
panelBox->Show();

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

// adding the registration frame to the panel
TregFrame *newRegistration = new TregFrame(panelBox);
newRegistration->Parent = panelBox;
newRegistration->Align  = alClient;

Примечание: не забудьте включить ваш кадр в рабочий файл, например #include "registrationFrame.h".

person Nazari    schedule 08.01.2019