Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Закладки и всё с ними связанное...

37K
15 сентября 2008 года
dufifa2
34 / / 14.09.2008
Здарова всем!
Эта тема в чём-то продолжение темы "Авто определением компонента", просто она возникла сразу после этой темы....Ну перейдём к делу:
Я создаю закладки вот таким путём:(пусть уже будет полная картина)
На форме 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;

Ну и использовал я этот код так:
 
Код:
int i = PageControl->ActivePageIndex;
Memos->Lines->LoadFromFile(OpenDialog1->FileName);

Как вы видите этот код Memos не модходит, если смешаются закладки одного с другим компонентом. Была идея создать для каждого свой PageControl и TabSheet, а потом играть со свойством Visible компонентов, но слишком утомительно...Может есть какой-то более рациональный и быстрый способ решить эту задачу???:confused:
535
15 сентября 2008 года
Нездешний
537 / / 17.01.2008
Объяви структуру вида:
 
Код:
typedef struct
{
      bool Memo;//true если TMemo, false если TRichEdit
      TCustomEdit *pCustomEdit;// сюда указатель на Memo или RichEdit
} _edit;

далее создашь массив таких структур (лучше воспользоваться стандартным контейнером) размером по количеству вкладок. Заполнишь таки. Ну и в местах, где надо узнать, Rich это или Memo пишешь
 
Код:
if (массив_структур.Memo) dynamic_cast<TMemo*>(массив_структур.pCustomEdit)->... //здесь для Memo
else dynamic_cast<TRichEdit*>(массив_структур.pCustomEdit)->... //здесь для RichEdit
37K
15 сентября 2008 года
dufifa2
34 / / 14.09.2008
Спасибо, прада мне долго прийдётся разбираться. Стыдно признаться,но мне ещё не приходилось особо сталкиваться со структурами, массивами структур и контейнерами.Конечно более подробный код мне очень поможет, хотя я никого уговаривать не буду....постараюсь разобраться в этом нелёгком деле...:cool:
535
16 сентября 2008 года
Нездешний
537 / / 17.01.2008
Код:
//используем контейнер вектор
#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*
37K
16 сентября 2008 года
dufifa2
34 / / 14.09.2008
Код:
//используем контейнер вектор
#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)'

//действия с членами
 
Код:
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";
}

Ну это яуже понял ,действия редактирования ,распознания и т.п
Вот не знаю как с ошибочками быть...
288
16 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: dufifa2

 
Код:
//добавлять новые члены в конец вектора можно так
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(...) должны уже существовать.

11
16 сентября 2008 года
oxotnik333
2.9K / / 03.08.2007
а зачем извращаться со структурой...
достаточно через dynamic_cast проверить Memo это или RishEdit
 
Код:
TMemo *Memo = dynamic_cast<TMemo*>(SomePointer);
TRichEdit *RichEdit = dynamic_cast<TRichEdit*>(SomePointer);
if (Memo) // это Memo
if (TRichEdit) // это RichEdit

а SomePointer складывать в вектор... или куда нидь еще
1
16 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Нездешний
Объяви структуру вида:
 
Код:
typedef struct
{
      bool Memo;//true если TMemo, false если TRichEdit
      TCustomEdit *pCustomEdit;// сюда указатель на Memo или RichEdit
} _edit;

далее создашь массив таких структур (лучше воспользоваться стандартным контейнером) размером по количеству вкладок. Заполнишь таки. Ну и в местах, где надо узнать, Rich это или Memo пишешь
 
Код:
if (массив_структур.Memo) dynamic_cast<TMemo*>(массив_структур.pCustomEdit)->... //здесь для Memo
else dynamic_cast<TRichEdit*>(массив_структур.pCustomEdit)->... //здесь для RichEdit


Компоненты билдера реализуют метод ClassNameIs()
Создание массива структур тоже абсолютно лишнее - массив компонентов уже существует - зачем дублировать?.
Топикстартеру - предупреждаю - название темы должно четко и понятно связано с вопросом. Или в новой реинкарнации все начнем заново и сразу выдать бан? неужели с одного раза непонятно?

535
17 сентября 2008 года
Нездешний
537 / / 17.01.2008
Цитата:
Создание массива структур тоже абсолютно лишнее - массив компонентов уже существует - зачем дублировать?

Для удобства. Чтобы ActivePageIndex совпадал с индексом в массиве Memo/Rich, находящегося на этой вкладке

Про ClassNameIs() не знал :)

1
17 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Нездешний
Для удобства. Чтобы ActivePageIndex совпадал с индексом в массиве Memo/Rich, находящегося на этой вкладке


честно говоря не могу понять - зачем? У вас же есть ActivePageIndex
есть компонент который лежит на вкладке - так зачем? В чем выиграш? :)

535
17 сентября 2008 года
Нездешний
537 / / 17.01.2008
На случай, если на каждой вкладке содержится не один компонент. Если там их несколько, придется искать среди них TMemo или TRichEdit. Плюс предусмотреть случай, если на одной вкладке несколько TMemo (или несколько TRichEdit), один из которых должен что-то делать при переключении вкладок, а другие предназначены для иных целей.
Но, возможно, это я уже домыслил за топикстартера. Если на каждой вкладке по одному компоненту, ваш вариант действительно лучше.
37K
17 сентября 2008 года
dufifa2
34 / / 14.09.2008
Ты первое сообщение читал - если да, то тагда скажи, как ты через ActivePageIndex узнаешь при нажатии кнопки,например "вырезать", нужно вырезать текст в ТЕКУЩЕМ RichEdit или в текущем MEMO???:cool:,если они все смешались в Pages:cool:
11
17 сентября 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: dufifa2
Ты первое сообщение читал - если да, то тагда скажи, как ты через ActivePageIndex узнаешь при нажатии кнопки,например "вырезать", нужно вырезать текст в ТЕКУЩЕМ RichEdit или в текущем MEMO???:cool:,если они все смешались в Pages:cool:


ПО ActivePageIndex ищешь TTabSheet на нем ищешь RichEdit/Memo и дальше делаешь с ним все что хочешь

37K
17 сентября 2008 года
dufifa2
34 / / 14.09.2008
Расскажи пожалуйста по подробней, а то я уже и так как ты говорил делал и наоборот и перевоворот....и как только не делал. И даже в dynamic_cast не разобрался никак не получается вставить строку в RichEdit или созданной тоже путём закладки Memo. Задача в том, я повторяю, что в программе могут создаваться ,ну например, такая ситуация с закладками в последовательности:
RichEdit,RichEdit,Memo,RichEdit,memo или другая какая нубудь....неважно.Так как ,блин, вставить строку "123" в тот RichEdit или Memo, который содержится в выбранной пользователем закладке????:confused:
37K
17 сентября 2008 года
dufifa2
34 / / 14.09.2008
Всё таки покажу зачем мне эта фигня вся....вот у мэне начинающий прошлый глобальный проект TextHTML, который будет один из самых удобных блокнотов-редакторов, из всех имеющихся для редактирования HTML кода, подсветки более 15 синтаксисов и простого редактирования:
Вылажил пока скрин, но если всё сделаю то на этот сайт вылажу прогу и демо версию с исходным кодом....
:)
//------но пока тут изображён "СКЕЛЕТ" проги...
92
18 сентября 2008 года
Тень Пса
2.2K / / 19.10.2006
Цитата: dufifa2
Расскажи пожалуйста по подробней, а то я уже и так как ты говорил делал и наоборот и перевоворот....и как только не делал. И даже в dynamic_cast не разобрался никак не получается вставить строку в RichEdit или созданной тоже путём закладки Memo. Задача в том, я повторяю, что в программе могут создаваться ,ну например, такая ситуация с закладками в последовательности:
RichEdit,RichEdit,Memo,RichEdit,memo или другая какая нубудь....неважно.Так как ,блин, вставить строку "123" в тот RichEdit или Memo, который содержится в выбранной пользователем закладке????:confused:


поищи блин на форуме блин было уже блин про поиск блин компонентов блин, типа, по имени, имени класса и тд =)

перебор потомков компонента, не так уж и сложно. воспользуйся поиском, посмотри справку и не говори, что ты делал то и другое и ничего не нашёл :)

UPD: если ты смотрел справку по компоненту TPageControl, то видел, что у каждой страницы есть свойство Components. дальше сам.

37K
18 сентября 2008 года
dufifa2
34 / / 14.09.2008
Просто мне впадлу сейчас копаться - времени у меня в обрез, а на форуме о котором ты говорил так всё-таки не нашёл....
Кстати в стандартном справочнике я плохо разбираюсь - там нафиг всё на Английском долбанном......
Может подскажешь поподробнее как мне с этим разобраться.........................ПОЖАААААЛУЙСТА!! :(
1
18 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: dufifa2
Просто мне впадлу сейчас копаться - времени у меня в обрез, а на форуме о котором ты говорил так всё-таки не нашёл....
Кстати в стандартном справочнике я плохо разбираюсь - там нафиг всё на Английском долбанном......
Может подскажешь поподробнее как мне с этим разобраться.........................ПОЖАААААЛУЙСТА!! :(


если тебе "впадлу копаться" - то остальным оно вобще нафиг не нужно. тема закрыта. Остались мы в очередной раз без супер-пупер блокнота.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог