| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как найти на объекте другие объекты |
| Автор: Zero 15.10.2005, 23:53 |
| САБЖ. У меня на панели создаётся динамически объект Scrollbar, но в определённые момент мне нужно его удалить. А чтобы удалить нужно обратится к идентификатору скролбара. |
| Автор: BreakPointMAN 16.10.2005, 00:23 |
| ну... это... можешь добавить в класс формы указатель на свой ScrollBar... при создании ScrollBar'а с помощью операции new инициализировать этот указатель адресом, который new возвратит... а когда надо удалить - применяешь к указателю этому операцию delete |
| Автор: Zero 16.10.2005, 09:44 | ||||||||
А это как, ведь у меня scrollbar создаётся при нажатии на одну кнопку, а нужно чтобы удалялся на другую кнопку
я пока с адресами не очень хорошо... А создаётся он у меня, когда я нажимаю на кнопку, при этом вызывается функция член, из моего класса, вот пример:
При повторном нажатии на другую кнопку, надо чтобы этот скрол удалился, а потом из этой процедуры он снова содался... Хорошобы, если такое возможно, определить его как глобальную переменную, а потом пере началом кода вставить типа такого:
|
| Автор: nikitao 16.10.2005, 09:47 | ||
Дак обьяви эти указатели или глобальными или статическими |
| Автор: Zero 16.10.2005, 09:49 | ||
что ты подразумеваешь, под словом "эти" Добавлено @ 09:51 Т.е. глобальными было бы ни плохо, только вот как... функцию New чтоли как глобальную объявить, т.е. её использовать в начале проги??? |
| Автор: nikitao 16.10.2005, 10:45 |
| Ну если я тебя правельно понял проблема вот в чем: 1.Нажымая на первую кнопку ты создаешь динамичеси нкии обьекты(с помощью указателей) 2.Нажимая на вторую кнопку ты должен удалить эти обьекты ,но "вторая" кнопка не видет указатели первой кнопки=>Если я правельно понял ,то лечение так выглядит: 1.Обьявляешь класс содержащий статические указатели.И в каждой функции обьявляешь по обьекту этого класса.Соответственно будешь работать с одними и теме же указателями в разных ф-циях. ЗЫ Все это в теории. |
| Автор: BreakPointMAN 16.10.2005, 11:24 | ||||||||||
| мдас... во-первых, это... определись, что тебе нужно-то: ScrollBar или ScrollBox (это два совершенно разных компонента; первый находится на закладке Standard, второй на закладке Additional в палитре компонентов)... а то у тебя упоминания и о том, и о том в твоих постах встречаются... но, судя по коду, речь идет именно о ScrollBox, поэтому исхожу из этого... вот, Zero, смотри... допустим, у тебя есть форма Form1, на которую ты кинул две кнопки Button1 и Button2 (первую для создания, вторую для удаления ScrollBox'а). На этой же форме у тебя есть панель Panel1, где ты хочешь этот самый ScrollBox разместить... если ты создаешь ScrollBox в обработчике нажатия на кнопку Button1 таким же образом, как приведено в посте #3:
то смотри, что получается... указатель SCrollBox у тебя объявляется как локальный. То есть, когда функция-обработчик у тебя доработает до конца, указатель этот будет потерян. Что вполне естественно - область действия и видимости локальных переменных (коей является и указатель) - от начала объявления до конца блока, а блоком в данном случае является тело функции. Так что тебе нужно что-то предпринять, чтобы не потерять адрес объекта типа TScrollBox. Здесь возможны несколько вариантов... Я бы сделал так... В .h-файле, в модуле, где у тебя описан класс формы TForm1 (например, Unit1.h), внести в секцию private , скажем, такое объявление:
Это определит указатель ScrollBox как поле класса твоей формы TForm1. Поскольку поля класса доступны всем его методам (а обработчики нажатий кнопок на форме - это методы класса TForm1), то указатель ScrollBox будет виден и в случае нажатия на кнопку Button1, и в случае нажатия на кнопку Button2. В обработчике Button1Click ты напишешь что-то вроде:
а в обработчике Button2Click что-то вроде этого:
Вот и все... если тебе нужно манипулировать с указателем ScrollBox из функций, которые НЕ являются методами класса формы TForm1, то ты можешь: 1) объявить указатель ScrollBox как глобальный; 2) объявить указатель ScrollBox в секции public твоей формы, а работать с ним через явное указание, какой он форме принадлежит, например:
ну, что-то вроде этого... |
| Автор: Zero 16.10.2005, 13:00 | ||||||||||
Я вкурсе, но как глобальный его неполучается объявить.
Я даже в Открытую секцию занёс, и не помогает...
То что будет виден, то это понятно, но вопрос в том, почему метод Free, ни каких действий не делает??? Вот, я прикрепил сюда архив, посмотри пожалуйста... И что там не так.... |
| Автор: BreakPointMAN 16.10.2005, 14:38 | ||||
| Ну е-мое! Итак, разбор полетов... Во-первых, присмотрись повнимательней к имени указателя своего! В одном случае он написан как SCrollBox, в другом случае он написан как ScrollBox. Не забывай, что язык C++ чувствителен к регистру!.. Во-вторых, даже если ты исправишь регистр, то у тебя все равно не будет это работать так, как надо... почему? Потому что, если ты объявил указатель как глобальный или как член класса, НЕ НАДО его еще раз определять в функциях, в которых ты его собираешься использовать. Поскольку таким образом ты определишь ДРУГОЙ указатель, локальный... ты будешь обращаться к нему, а не к глобальному/указателю-члену класса. Область видимости для того указателя кончится в момент объявления локального. Из функции Button1Click убери "TScrollBox *" - и будет тебе счастье!..
===>
PS: а как ты потом к своим CheckBox'ам обращаться будешь? Можно, конечно, массив указателей завести... PPS: кстати, а чем тебя CheckListBox (вкладка Additional) не устроил? |
| Автор: Zero 18.10.2005, 07:19 | ||||||||||
О, точно спасибо!!!
Какие указатели, Ватсон, тут всё намного проще...
Кстати, в том прикреплённом файле, помоему я обращение устанавливал...
|
| Автор: BreakPointMAN 18.10.2005, 09:56 | ||
если у тебя обращение осуществляется внутри обработчика (типа OnClick) - то да, проще... Sender есть, на фиг чего еще надо... а как ты поступишь в том случае, если тебе не из какого-либо обработчика надо обратиться, а из своей какой-то функции, например, проверить, Checked ли какой-то CheckBox?.. |
| Автор: Zero 18.10.2005, 10:02 | ||
Дык они у меня все в моём классе сохранены в векторе... При нажатии на Чекбокс, он сразу туда записывается...(всмысле в вектор класса) |
| Автор: BreakPointMAN 18.10.2005, 10:06 | ||
ну смотри-смотри... |