Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(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;

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

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

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

что ты подразумеваешь, под словом "эти"
Добавлено @ 09:51
Т.е. глобальными было бы ни плохо, только вот как... функцию New чтоли как глобальную объявить, т.е. её использовать в начале проги???

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


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

Автор: BreakPointMAN 16.10.2005, 11: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);

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

Автор: Zero 16.10.2005, 13:00
Цитата(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, ни каких действий не делает???
Вот, я прикрепил сюда архив, посмотри пожалуйста... И что там не так....

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

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

===>
Код

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


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

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

Автор: Zero 18.10.2005, 07:19
Цитата(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) не устроил?
Я её ещё не разу не пользовался...

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

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)