Закладки и всё с ними связанное...
Эта тема в чём-то продолжение темы "Авто определением компонента", просто она возникла сразу после этой темы....Ну перейдём к делу:
Я создаю закладки вот таким путём:(пусть уже будет полная картина)
На форме PageControl и чуть выше TabSheet. Выбор закладки TabSheet равен выбору закладки PageControl. Суть в том что создание новой заладки может быть с разными значениями, например закладка с Редактируемым полем RichEdit и Закладка с другим компонентом(неважно каким , пусть некий Memo2).Проблема в том что мой ранее стандартный код не подходит, ну то есть я создаю закладки так:
TTabSheet* TabSheets[50];
int PagesCount = PageControl->PageCount;
TabSheets[PagesCount] = new TTabSheet(this);
TabSheets[PagesCount]->PageControl = PageControl;
TabSheets[PagesCount]->Caption = IntToStr(PagesCount);
TabSheets[PagesCount]->TabVisible = true;
TabSheets[PagesCount]->Tag = 1;
...
Создание RichEdit(Memos):
Memos[PagesCount] = new TRichEdit(this);
Memos[PagesCount]->Parent = TabSheets[PagesCount];
Memos[PagesCount]->Name = "_Memo" + IntToStr(PagesCount);
Memos[PagesCount]->Top = TabSheets[PagesCount]->Top + 200;
Memos[PagesCount]->ScrollBars = ssBoth;
Memos[PagesCount]->Clear();
Memos[PagesCount]->Align = alClient;
Memos[PagesCount]->HideScrollBars = false;
Memos[PagesCount]->HideSelection = false;
Ну и использовал я этот код так:
Memos->Lines->LoadFromFile(OpenDialog1->FileName);
Как вы видите этот код Memos не модходит, если смешаются закладки одного с другим компонентом. Была идея создать для каждого свой PageControl и TabSheet, а потом играть со свойством Visible компонентов, но слишком утомительно...Может есть какой-то более рациональный и быстрый способ решить эту задачу???:confused:
{
bool Memo;//true если TMemo, false если TRichEdit
TCustomEdit *pCustomEdit;// сюда указатель на Memo или RichEdit
} _edit;
далее создашь массив таких структур (лучше воспользоваться стандартным контейнером) размером по количеству вкладок. Заполнишь таки. Ну и в местах, где надо узнать, Rich это или Memo пишешь
else dynamic_cast<TRichEdit*>(массив_структур.pCustomEdit)->... //здесь для RichEdit
#include <Vector>
using namespace std;
struct IntegratedEdit
{
bool Memo;
TCustomEdit *pCustomEdit;
IntegratedEdit(bool bMemo = false, TCustomEdit *pointer = NULL):
Memo(bMemo), pCustomEdit(pointer)
{} //конструктор понадобится при добавлении новых членов в вектор
};
vector<IntegratedEdit> Edits; //объявим вектор
//добавлять новые члены в конец вектора можно так
Edits.push_back(IntegratedEdit(true, Memo1));
Edits.push_back(IntegratedEdit(false, RichEdit2));
Edits.push_back(IntegratedEdit(true, Memo3));
Edits.push_back(IntegratedEdit(false, RichEdit4));
//действия с членами
int Index = PageControl1->ActivePageIndex;
if (Edits[Index].Memo)
{
dynamic_cast<TMemo*>(Edits[Index].pCustomEdit)->Alignment = taCenter;
dynamic_cast<TMemo*>(Edits[Index].pCustomEdit)->Text = "Memo";
}
else
{
dynamic_cast<TRichEdit*>(Edits[Index].pCustomEdit)->Text = "Rich";
}
И TMemo, и TRichEdit наследуются от одного предка TCustomEdit. Поэтому указатель в структуре может указывать как на TMemo, так и на TRichEdit. Информацию о том, TRichEdit там или TMemo, сохраняем в члене структуры bool Memo. Оператор dynamic_cast приведет указатель на объект из типа-предка TCustomEdit* к типу-наследнику TMemo* или TRichEdit*
#include <Vector>
using namespace std;
struct IntegratedEdit
{
bool Memo;
TCustomEdit *pCustomEdit;
IntegratedEdit(bool bMemo = false, TCustomEdit *pointer = NULL):
Memo(bMemo), pCustomEdit(pointer)
{} //конструктор понадобится при добавлении новых членов в вектор
};
vector<IntegratedEdit> Edits; //объявим вектор
Здесь у меня всё нормально... это я прописал перед __fastcall TForm1::TForm1(TComponent* Owner)....
Edits.push_back(IntegratedEdit(true, Memo1));
Edits.push_back(IntegratedEdit(false, RichEdit2));
Edits.push_back(IntegratedEdit(true, Memo3));
Edits.push_back(IntegratedEdit(false, RichEdit4));
- Это я так понял что это идёт в событии добавления закладок, НО тут ошибки: Undefined symbol 'Memo1' и так далее...
Could not find a match for 'IntegralEdit:IntegralEdit(bool,undefined)'
//действия с членами
if (Edits[Index].Memo)
{
dynamic_cast<TMemo*>(Edits[Index].pCustomEdit)->Alignment = taCenter;
dynamic_cast<TMemo*>(Edits[Index].pCustomEdit)->Text = "Memo";
}
else
{
dynamic_cast<TRichEdit*>(Edits[Index].pCustomEdit)->Text = "Rich";
}
Ну это яуже понял ,действия редактирования ,распознания и т.п
Вот не знаю как с ошибочками быть...
Edits.push_back(IntegratedEdit(true, Memo1));
Edits.push_back(IntegratedEdit(false, RichEdit2));
Edits.push_back(IntegratedEdit(true, Memo3));
Edits.push_back(IntegratedEdit(false, RichEdit4));
- Это я так понял что это идёт в событии добавления закладок, НО тут ошибки: Undefined symbol 'Memo1' и так далее...
Could not find a match for 'IntegralEdit:IntegralEdit(bool,undefined)'
Вот не знаю как с ошибочками быть...
Memo1, RichEdit2 и т.д. перед вызовом Edits.push_back(...) должны уже существовать.
достаточно через dynamic_cast проверить Memo это или RishEdit
TRichEdit *RichEdit = dynamic_cast<TRichEdit*>(SomePointer);
if (Memo) // это Memo
if (TRichEdit) // это RichEdit
а SomePointer складывать в вектор... или куда нидь еще
{
bool Memo;//true если TMemo, false если TRichEdit
TCustomEdit *pCustomEdit;// сюда указатель на Memo или RichEdit
} _edit;
далее создашь массив таких структур (лучше воспользоваться стандартным контейнером) размером по количеству вкладок. Заполнишь таки. Ну и в местах, где надо узнать, Rich это или Memo пишешь
else dynamic_cast<TRichEdit*>(массив_структур.pCustomEdit)->... //здесь для RichEdit
Компоненты билдера реализуют метод ClassNameIs()
Создание массива структур тоже абсолютно лишнее - массив компонентов уже существует - зачем дублировать?.
Топикстартеру - предупреждаю - название темы должно четко и понятно связано с вопросом. Или в новой реинкарнации все начнем заново и сразу выдать бан? неужели с одного раза непонятно?
Для удобства. Чтобы ActivePageIndex совпадал с индексом в массиве Memo/Rich, находящегося на этой вкладке
Про ClassNameIs() не знал :)
честно говоря не могу понять - зачем? У вас же есть ActivePageIndex
есть компонент который лежит на вкладке - так зачем? В чем выиграш? :)
Но, возможно, это я уже домыслил за топикстартера. Если на каждой вкладке по одному компоненту, ваш вариант действительно лучше.
ПО ActivePageIndex ищешь TTabSheet на нем ищешь RichEdit/Memo и дальше делаешь с ним все что хочешь
RichEdit,RichEdit,Memo,RichEdit,memo или другая какая нубудь....неважно.Так как ,блин, вставить строку "123" в тот RichEdit или Memo, который содержится в выбранной пользователем закладке????:confused:
Вылажил пока скрин, но если всё сделаю то на этот сайт вылажу прогу и демо версию с исходным кодом....
:)
//------но пока тут изображён "СКЕЛЕТ" проги...
RichEdit,RichEdit,Memo,RichEdit,memo или другая какая нубудь....неважно.Так как ,блин, вставить строку "123" в тот RichEdit или Memo, который содержится в выбранной пользователем закладке????:confused:
поищи блин на форуме блин было уже блин про поиск блин компонентов блин, типа, по имени, имени класса и тд =)
перебор потомков компонента, не так уж и сложно. воспользуйся поиском, посмотри справку и не говори, что ты делал то и другое и ничего не нашёл :)
UPD: если ты смотрел справку по компоненту TPageControl, то видел, что у каждой страницы есть свойство Components. дальше сам.
Кстати в стандартном справочнике я плохо разбираюсь - там нафиг всё на Английском долбанном......
Может подскажешь поподробнее как мне с этим разобраться.........................ПОЖАААААЛУЙСТА!! :(
Кстати в стандартном справочнике я плохо разбираюсь - там нафиг всё на Английском долбанном......
Может подскажешь поподробнее как мне с этим разобраться.........................ПОЖАААААЛУЙСТА!! :(
если тебе "впадлу копаться" - то остальным оно вобще нафиг не нужно. тема закрыта. Остались мы в очередной раз без супер-пупер блокнота.