Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как найти на объекте другие объекты, другие объекты созданы динамически 
:(
    Опции темы
Zero
Дата 15.10.2005, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



САБЖ.
У меня на панели создаётся динамически объект Scrollbar, но в определённые момент мне нужно его удалить. А чтобы удалить нужно обратится к идентификатору скролбара.
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 16.10.2005, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



ну... это... можешь добавить в класс формы указатель на свой ScrollBar... при создании ScrollBar'а с помощью операции new инициализировать этот указатель адресом, который new возвратит... а когда надо удалить - применяешь к указателю этому операцию delete


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Zero
Дата 16.10.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(BreakPointMAN @ 16.10.2005, 01:23)
ну... это... можешь добавить в класс формы указатель на свой ScrollBar...

А это как, ведь у меня scrollbar создаётся при нажатии на одну кнопку, а нужно чтобы удалялся на другую кнопку
Цитата(BreakPointMAN @ 16.10.2005, 01:23)
который new возвратит...

я пока с адресами не очень хорошо... smile покарайней мере в С++.
А создаётся он у меня, когда я нажимаю на кнопку, при этом вызывается функция член, из моего класса, вот пример:
Код

.......
//Вывести варианты ответов
   int position = 5;

   TScrollBox *SCrollBox = new TScrollBox(Form1->Panel1);   //Тут создаётся скролбар
   SCrollBox->Parent = Form1->Panel1;                      //здесь приклеивается к панели
   SCrollBox->Align = alClient;                          //и что я не понял нужно добавить в класс то
   SCrollBox->BorderStyle = bsNone;
   SCrollBox->VertScrollBar->Tracking = true;
   SCrollBox->HorzScrollBar->Tracking = true;

   for (unsigned int i=0; i < Test.answers[Nquest-1].answer.size(); i++) //а тут на нём флажки
     {
        TCheckBox *CheckBox = new TCheckBox(SCrollBox);
        CheckBox->Parent = SCrollBox;
        CheckBox->Top = position;
        CheckBox->Left = 10;
        CheckBox->Width = 540;
        position = position + 20;
        CheckBox->Caption = Test.answers[Nquest-1].answer[i].c_str();
     };

При повторном нажатии на другую кнопку, надо чтобы этот скрол удалился, а потом из этой процедуры он снова содался...
Хорошобы, если такое возможно, определить его как глобальную переменную, а потом пере началом кода вставить типа такого:
Код

SCrollBox.free;


Это сообщение отредактировал(а) Zero - 16.10.2005, 09:47
PM MAIL ICQ   Вверх
nikitao
Дата 16.10.2005, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



Цитата
А это как, ведь у меня scrollbar создаётся при нажатии на одну кнопку, а нужно чтобы удалялся на другую кнопку

Дак обьяви эти указатели или глобальными или статическими


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Zero
Дата 16.10.2005, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(nikitao @ 16.10.2005, 10:47)
обьяви эти указатели или глобальными или статическими

что ты подразумеваешь, под словом "эти"
Добавлено @ 09:51
Т.е. глобальными было бы ни плохо, только вот как... функцию New чтоли как глобальную объявить, т.е. её использовать в начале проги???
PM MAIL ICQ   Вверх
nikitao
Дата 16.10.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



Ну если я тебя правельно понял проблема вот в чем:
1.Нажымая на первую кнопку ты создаешь динамичеси нкии обьекты(с помощью указателей)
2.Нажимая на вторую кнопку ты должен удалить эти обьекты ,но "вторая" кнопка не видет указатели первой кнопки=>Если я правельно понял ,то лечение так выглядит:
1.Обьявляешь класс содержащий статические указатели.И в каждой функции обьявляешь по обьекту этого класса.Соответственно будешь работать с одними и теме же указателями в разных ф-циях. smile


ЗЫ Все это в теории.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
BreakPointMAN
Дата 16.10.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



мдас... smile
во-первых, это... определись, что тебе нужно-то: ScrollBar или ScrollBox (это два совершенно разных компонента; первый находится на закладке Standard, второй на закладке Additional в палитре компонентов)... а то у тебя упоминания и о том, и о том в твоих постах встречаются... но, судя по коду, речь идет именно о ScrollBox, поэтому исхожу из этого...

вот, Zero, смотри... допустим, у тебя есть форма Form1, на которую ты кинул две кнопки Button1 и Button2 (первую для создания, вторую для удаления ScrollBox'а). На этой же форме у тебя есть панель Panel1, где ты хочешь этот самый ScrollBox разместить... если ты создаешь ScrollBox в обработчике нажатия на кнопку Button1 таким же образом, как приведено в посте #3:
Код

TScrollBox *SCrollBox = new TScrollBox(Form1->Panel1);

то смотри, что получается... указатель SCrollBox у тебя объявляется как локальный. То есть, когда функция-обработчик у тебя доработает до конца, указатель этот будет потерян. Что вполне естественно - область действия и видимости локальных переменных (коей является и указатель) - от начала объявления до конца блока, а блоком в данном случае является тело функции. Так что тебе нужно что-то предпринять, чтобы не потерять адрес объекта типа TScrollBox. Здесь возможны несколько вариантов... Я бы сделал так...

В .h-файле, в модуле, где у тебя описан класс формы TForm1 (например, Unit1.h), внести в секцию private , скажем, такое объявление:
Код

TScrollBox *ScrollBox;

Это определит указатель ScrollBox как поле класса твоей формы TForm1. Поскольку поля класса доступны всем его методам (а обработчики нажатий кнопок на форме - это методы класса TForm1), то указатель ScrollBox будет виден и в случае нажатия на кнопку Button1, и в случае нажатия на кнопку Button2.

В обработчике Button1Click ты напишешь что-то вроде:
Код

...
ScrollBox = new TScrollBox(Form1->Panel1);
...

а в обработчике Button2Click что-то вроде этого:
Код

...
delete ScrollBox;
...

Вот и все...

если тебе нужно манипулировать с указателем ScrollBox из функций, которые НЕ являются методами класса формы TForm1, то ты можешь:
1) объявить указатель ScrollBox как глобальный;
2) объявить указатель ScrollBox в секции public твоей формы, а работать с ним через явное указание, какой он форме принадлежит, например:
Код

Form1->ScrollBox = new TScrollBox(Form1->Panel1)
...
delete (Form1->SсrollBox);

ну, что-то вроде этого...

Это сообщение отредактировал(а) BreakPointMAN - 16.10.2005, 12:16


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Zero
Дата 16.10.2005, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(BreakPointMAN @ 16.10.2005, 12:24)
во-первых, это... определись, что тебе нужно-то: ScrollBar или ScrollBox

smile Ну конечно же ScrollBox, я на нём динамически создаю варианты ответов на вопросы тестов, а при переключении на след. вопрос, варианты ответов обновляю. smile Просто почемуто на язык слово БАР всё время попадает... smile вот я и пишу о нём. smile smile
Цитата(BreakPointMAN @ 16.10.2005, 12:24)
то смотри, что получается... указатель SCrollBox у тебя объявляется как локальный.

Я вкурсе, но как глобальный его неполучается объявить.
Цитата(BreakPointMAN @ 16.10.2005, 12:24)
То есть, когда функция-обработчик у тебя доработает до конца, указатель этот будет потерян.
Конечно, а вот воткнуть в класс всё равно не получается, точнее получается но не работает... smile
Цитата(BreakPointMAN @ 16.10.2005, 12:24)
Я бы сделал так...
В .h-файле, в модуле, где у тебя описан класс формы TForm1 (например, Unit1.h), внести в секцию private , скажем, такое объявление:

Я даже в Открытую секцию занёс, и не помогает...
Цитата(BreakPointMAN @ 16.10.2005, 12:24)
то указатель ScrollBox будет виден и в случае нажатия на кнопку Button1, и в случае нажатия на кнопку Button2.

То что будет виден, то это понятно, но вопрос в том, почему метод Free, ни каких действий не делает???
Вот, я прикрепил сюда архив, посмотри пожалуйста... И что там не так....

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Test.zip 22,87 Kb
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 16.10.2005, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Ну е-мое! smile ладно...
Итак, разбор полетов...
Во-первых, присмотрись повнимательней к имени указателя своего! В одном случае он написан как SCrollBox, в другом случае он написан как ScrollBox. Не забывай, что язык C++ чувствителен к регистру!..
Во-вторых, даже если ты исправишь регистр, то у тебя все равно не будет это работать так, как надо... почему? Потому что, если ты объявил указатель как глобальный или как член класса, НЕ НАДО его еще раз определять в функциях, в которых ты его собираешься использовать. Поскольку таким образом ты определишь ДРУГОЙ указатель, локальный... ты будешь обращаться к нему, а не к глобальному/указателю-члену класса. Область видимости для того указателя кончится в момент объявления локального.
Из функции Button1Click убери "TScrollBox *" - и будет тебе счастье!.. smile
Код

TScrollBox *ScrollBox = new TScrollBox(Form1->Panel1);  // так ты обращаешься к локальному указателю

===>
Код

ScrollBox = new TScrollBox(Form1->Panel1); // а так - к тому, к которому хотел


PS: а как ты потом к своим CheckBox'ам обращаться будешь? Можно, конечно, массив указателей завести...

PPS: кстати, а чем тебя CheckListBox (вкладка Additional) не устроил?

Это сообщение отредактировал(а) BreakPointMAN - 16.10.2005, 15:03


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Zero
Дата 18.10.2005, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(BreakPointMAN @ 16.10.2005, 15:38)
В одном случае он написан как SCrollBox, в другом случае он написан как ScrollBox.
Блин, не как не могу от Delphi отвыкнуть... smile
Цитата(BreakPointMAN @ 16.10.2005, 15:38)
Из функции Button1Click убери "TScrollBox *"

О, точно спасибо!!! smile Я так даже не пробывал делать... smile
Цитата(BreakPointMAN @ 16.10.2005, 15:38)
PS: а как ты потом к своим CheckBox'ам обращаться будешь? Можно, конечно, массив указателей завести...

Какие указатели, Ватсон, тут всё намного проще...
Код

ShowMessage(dynamic_cast<TCheckBox&>(*Sender).Caption);

Кстати, в том прикреплённом файле, помоему я обращение устанавливал...
Цитата(BreakPointMAN @ 16.10.2005, 15:38)
чем тебя CheckListBox (вкладка Additional) не устроил?
Я её ещё не разу не пользовался...
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 18.10.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(Zero @ 18.10.2005, 07:19)
Какие указатели, Ватсон, тут всё намного проще...

если у тебя обращение осуществляется внутри обработчика (типа OnClick) - то да, проще... Sender есть, на фиг чего еще надо...
а как ты поступишь в том случае, если тебе не из какого-либо обработчика надо обратиться, а из своей какой-то функции, например, проверить, Checked ли какой-то CheckBox?..


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Zero
Дата 18.10.2005, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(BreakPointMAN @ 18.10.2005, 10:56)
а как ты поступишь в том случае, если тебе не из какого-либо обработчика надо обратиться, а из своей какой-то функции, например, проверить, Checked ли какой-то CheckBox?

Дык они у меня все в моём классе сохранены в векторе... smile
При нажатии на Чекбокс, он сразу туда записывается...(всмысле в вектор класса)

Это сообщение отредактировал(а) Zero - 18.10.2005, 10:02
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 18.10.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(Zero @ 18.10.2005, 10:02)
Дык они у меня все в моём классе сохранены в векторе... 
При нажатии на Чекбокс, он сразу туда записывается...(всмысле в вектор класса)

ну смотри-смотри... smile


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.