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

Ваш аккаунт

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

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

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

Динамическое размещение контроллов на форме.

315
12 октября 2005 года
Nick_M
399 / / 29.05.2003
Нужно разместить определенный набор контроллов на форме (ну скажем Edit и Label). Причем таких наборов может быть сколько угодно. Создал класс представляющий собой такой набор.
Код:
class THistory
{
private:
public:
        TLabel *lblDate;
        TEdit *edtDate;
        __fastcall THistory(Classes::TComponent* AOwner);
        __fastcall ~THistory();
};

__fastcall THistory::THistory(Classes::TComponent* AOwner)
{
lblDate = new TLabel(AOwner);
edtDate = new TEdit(AOwner);
}

__fastcall THistory::~THistory()
{
delete lblDate;
delete edtDate;
}

Если размещать один такой набор, то все просто:
Код:
THistory *history = new THistory(frmForm);
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
history->lblDate->Top = 200;
history->edtDate->Parent = frmForm;
history->edtDate->Text = "01/01/01";
history->edtDate->Left = 76;
history->edtDate->Top = 210;
history->edtDate->ReadOnly = true;
delete history;

Вопрос в том, как разместить неограниченное их количество. Думаю сделать это с помощью контейнера vector. Помогите советом как это сделать.
315
12 октября 2005 года
Nick_M
399 / / 29.05.2003
Дошел до следующего:
В классе формы:
 
Код:
typedef std::vector<THistory*> THistory_vector;
THistory_vector vec_history;
В обработчике:
Код:
THistory *history = new THistory(frmForm);
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
history->lblDate->Top = 200;
history->edtDate->Parent = frmForm;
history->edtDate->Text = "01/01/01";
history->edtDate->Left = 76;
history->edtDate->Top = 210;
history->edtDate->ReadOnly = true;
vec_history.push_back(history);
delete history;
Но вот дальше работать через vec_history[0] не получится потому как в вектор скопирован не сам экземпляр класса THistory, а ссылка на него. Оператором delete history; это дело уничтожается. Вопрос: как скопировать экзепляр history в вектор?
1
12 октября 2005 года
kot_
7.3K / / 20.01.2000
History *history = new THistory(frmForm);
history->lblDate->Parent = frmForm;
history->lblDate->Caption = "Дата";
history->lblDate->Left = 8;
...

Но вот дальше работать через vec_history[0] не получится потому как в вектор скопирован не сам экземпляр класса THistory, а ссылка на него. Оператором delete history; это дело уничтожается. Вопрос: как скопировать экзепляр history в вектор?


Используя копирующий конструктор. Или создав свой шаблон vector. Или используя auto_ptr.

315
13 октября 2005 года
Nick_M
399 / / 29.05.2003
Цитата:
Originally posted by kot_
Используя копирующий конструктор. Или создав свой шаблон vector. Или используя auto_ptr.


В строке vec_history.push_back(history); никаких конструкторов не вызывается. Хотя если написать THistory his = *history; вызавется конструктор копирования. Как заставить скопировать класс в вектор?

1
13 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Nick_M
В строке vec_history.push_back(history); никаких конструкторов не вызывается. Хотя если написать THistory his = *history; вызавется конструктор копирования. Как заставить скопировать класс в вектор?


А если так -

 
Код:
vec_history.push_back(new THistory(*history));

- хотя у данного варианта есть свои недостатки - правда сейчас не помню какие именно. Попробуй использовать что либо подобное.
Когда мне необходимо было помещать объект своего класса в контейнер - я просто наследовал, в моем случае от нужного мне - и писал свою функцию размещения. Двойное удовольствие - во первых сам контролируешь помещение и удаление объекта, во вторых большинство стандартных функций шаблона и вся мощь стл к твоим услугам.:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог