| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > ComboBox и проблемка с ним |
| Автор: HappyLife 4.12.2006, 16:35 | ||
| Скажите, возможно ли назначить айтемы, до того как комбобокс получит достопочтимый парент. Такой код вываливается с ошибкой.
|
| Автор: Anikmar 4.12.2006, 16:46 |
| Именно в этих строчках? Должна вылететь чуть позже - на отрисовке формы. Код неправильный - создается локальная переменная - указатель со сроком жизни в течение работы коструктора. После выхода из конструктора формы данный указатель будет недействителен. Нужно перенести объявление TComboBox * Manager; внутрь класса, в раздел private или куда еще - в зависимости от задач. |
| Автор: HappyLife 4.12.2006, 16:51 |
| Это не важно. Данный код лишь для наглядности. Вылетает именно на строчке ADD |
| Автор: Anikmar 4.12.2006, 17:13 |
| А какая ошибка? Этот код точно наглядно представляет как получить AV Можно увидеть рабочий код? |
| Автор: 586 4.12.2006, 17:13 | ||
|
| Автор: HappyLife 4.12.2006, 17:18 | ||
| Наверное вопрос, вам был менее понятен, чем он есть на самом деле. Я хочу знать, возможно ли без вот этой строчки
Создать Айтемы. У меня Комбо создается в отдельной DLL на независимом TWinControl Соответсвенно в момент загрузки ДЛЛ, создаются компоненты, и в самом последнем случае TWinControl получается парента из Формы. Или если это так существенно, то возможно ли словить событие присвоения парента, и уже после этого, создать айтемы. Так как время назначения парента неизвестно. |
| Автор: dumb 4.12.2006, 17:21 |
| манипуляции со списком реализуются посылкой сообщений. когда у комба нет родителя, слать сообщения некуда... |
| Автор: HappyLife 4.12.2006, 17:26 | ||
| Благодарю. Но сам пример в более наглядном виде выглядит вот так
Возможно ли использовать что-то такое же независимое чтобы потом можно было разместить на любой форме набор объектов?. |
| Автор: Anikmar 4.12.2006, 17:45 |
| Свойство Parent отвечает за визуализацию объекта - т.е. физически на каком контроле его расположить. Т.е. это должна быть форма, панель или еще что-нить. Важнее свойство Owner - это свойство отвечает за владельца объекта. При уничтожении владельца будет автоматически вызваны деструкторы его (что-то слово не могу придумать, вещей или собственности). Так что на практике, думаю, что необходимо устанавливать оба эти свойства. При работе в DLL насколько я помню примеры, в качестве владельца устанавливался объект Application... |
| Автор: HappyLife 4.12.2006, 17:58 |
| Anikmar, Благодарю Вас за объяснение. Все эти подробности конечно мной учтены. И были созданы TPanel TDrawGrid и др. Был создан даже ComboBox все на TWinControl, который я потом и разметил на форме. Но проблема остается с айтомами. Их я любом случае приходится назначать уже после того как я TWinControl размещу на форме. Проблема в том что мне нужно как-то отловить назначение парента, и создать айтомы, либо в ДЛЛ создать независимую функцию SetParent, но этот вариант мне дико не нравиться, по причине, что придется менять интерфейс, который благополучно работал, до того как я начал работать с TComboBox. |
| Автор: dumb 4.12.2006, 18:12 |
| сделай класс на основе TWinControl, в котором отлавливай какое-либо сообщение оконное, в котором и производи необходимую инициализацию, и используй его в длл вместо TWinControl. |
| Автор: Anikmar 4.12.2006, 18:15 | ||
В коде
Чтобы это работало, попробуйте установить свойство Parent у объекта Win Например: Win->Parent = this Либо воспользоваться конструктором с Handle Должно работать, но надо установить координаты, размеры, чтобы увидеть свой Combobox |
| Автор: HappyLife 5.12.2006, 12:07 | ||
| Anikmar, Я знаю что нужно было установить свойство парент. Проблема была именно в том, как БЕЗ установки Parent решить задачу. Либо как отловить установку парента. Благодарю Вас за попытку помочь. dumb, Спасибо, очень дельный совет, кажется то что мне и нужно. Именно им я и решил воспользоваться. По логике, это именно то что мне и нужно. Но когда я занялся разработкой своего класса, я вспомнил о еще одном очень интересном классе TFrame, которй и помог решить мою задачу.
Все работает крайне идеально. |
| Автор: Anikmar 5.12.2006, 13:25 | ||
| Хм... Все равно же ведь Parent понадобился... Просто он скорее всего взялся из Application->MainForm. Фактически то же самое, что и было выше:
Просто взят TWinControl уже более апгрейженный |
| Автор: HappyLife 5.12.2006, 14:58 |
| Anikmar, Конечно понадобиться. Но я же говорил, что задача изначально была, присвоить парент, где-то посередине работы программы, в любой момент, а создать айтомы в самом начале. Парент назначается уже после загрузги ДЛЛ, а объект создается во время. Я делаю сильно-модульное приложение, чтобы главное окно модуля можно было кидать, в любое время и куда угодно в любой момент работы программы. Моему боссу может прийти в голову все что угодно, рисковать переделываем огромного количество кода я не хочу. Да и еще насчет того что TFrame это апргейженный TWinControl я в курсе, наверное в осном вопрос в этом и был, что подскажите мне такой компонент который не потребует немеделенного парента для создания TComboBox. |
| Автор: Anikmar 5.12.2006, 15:21 |
| TComboBox создать без Parent легко - работать с ним будет нельзя. Я просто не улавливаю выхода из ситуации: TFrame тоже не будет работать без Parent - шило на мыло получается по сути. Просто создание TComboBox и наполнение его значениями можно разделить (второе делать после присваивания Parent) - может таким путем пойти? |
| Автор: HappyLife 5.12.2006, 15:55 |
| Можно, но тогда нужно событие по которому нужно будет узнать, что парент уже назначен. В этом случае dump мне предложил создать наследника от TWinControl. А проблемс легкая. Сначало создать - именно сначало создать, а потом штамповать где угодно. А комбо как вяснилось создать бей достойного парента нельзя. Точнее можно, но без айтомов. |
| Автор: Anikmar 5.12.2006, 17:01 | ||
Немного не понял, а Parent назначается кем-то другим? В смысле не вашим кодом? Есть DLL, она инициализируется неким процессом - и уже может знать его главную форму - вот уже есть злосчастный Parent Если там его назначать рано, все равно шлепается данный комбобокс при помощи вызова какой-либо функци... Может там присваивать парент и инициализировать комбобокс? |
| Автор: HappyLife 5.12.2006, 17:23 |
| Anikmar, Да можно считать что парент инициализируется кем-то другим. Задача ДЛЛ, лишь возвратить некое окошко прородителя TWinControl, которое EXE может шлепнуть куда угодно по своему усмотрению. Насчет второго варианта, он возможен, но придется менять интерфейс связи ДЛЛ и EXE и в любом случае модуль будет получаться слишком EXE зависимым чего я стараюсь избегать. Но создать функцию Init() в длл очень неплохой вариант. |
| Автор: Anikmar 6.12.2006, 11:32 |
| Пока не увидел серьезной проблемы. EXE вызывает DLL и получает некий ComboBox, который шлепает по собственному усмотрению? Тогда может быть проще EXE у себя создает ComboBox и просит DLL заполнить его значениями? |
| Автор: HappyLife 6.12.2006, 16:01 |
| Anikmar, EXE вызывает TWinControl который и шлепает по своему усмотрению. А там фиг знает что и не только ComboBox; У меня проблем с тем как сделать не возникает. Проблемы больше по части как сделать самым наилучшим и эффективным способом. Чтобы одно не зависело от другого. |