Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > ComboBox и проблемка с ним


Автор: HappyLife 4.12.2006, 16:35
Скажите, возможно ли назначить айтемы, до того как комбобокс получит достопочтимый парент.

Такой код вываливается с ошибкой.
Код

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        TComboBox * Manager = new TComboBox(this);
        Manager->Items->Add("");
}

Автор: 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
Код
 TComboBox * Manager = new TComboBox(this);
 Manager->Parent=this;
 Manager->Items->Add("");

Автор: HappyLife 4.12.2006, 17:18
Наверное вопрос, вам был менее понятен, чем он есть на самом деле.
Я хочу знать, возможно ли без
вот этой строчки
Код

Manager->Parent=this;

Создать Айтемы.
У меня Комбо создается в отдельной DLL на независимом TWinControl
Соответсвенно в момент загрузки ДЛЛ, создаются компоненты, и в самом последнем случае TWinControl получается парента из Формы.

Или если это так существенно, то возможно ли словить событие присвоения парента, и уже после этого, создать айтемы.
Так как время назначения парента неизвестно.

Автор: dumb 4.12.2006, 17:21
манипуляции со списком реализуются посылкой сообщений.
когда у комба нет родителя, слать сообщения некуда...

Автор: HappyLife 4.12.2006, 17:26
Благодарю.
Но сам пример в более наглядном виде выглядит вот так
Код

        TWinControl * Win = new TWinControl(this);
        TComboBox * Manager = new TComboBox(this);
        Manager->Parent = Win;
        Manager->Items->Add("");

Возможно ли использовать что-то такое же независимое чтобы потом можно было разместить на любой форме набор объектов?.

Автор: 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
В коде
Код

        TWinControl * Win = new TWinControl(this);
        TComboBox * Manager = new TComboBox(this);
        Manager->Parent = Win;
        Manager->Items->Add("");


Чтобы это работало, попробуйте установить свойство Parent у объекта Win
Например:
Win->Parent = this
Либо воспользоваться конструктором с Handle

Должно работать, но надо установить координаты, размеры, чтобы увидеть свой  Combobox

Автор: HappyLife 5.12.2006, 12:07
Anikmar, 
Я знаю что нужно было установить свойство парент.
Проблема была именно в том, как БЕЗ установки Parent решить задачу. Либо как отловить установку парента. Благодарю Вас за попытку помочь.


dumb, 
Спасибо, очень дельный совет, кажется то что мне и нужно. Именно им я и решил воспользоваться. По логике, это именно то что мне и нужно. Но когда я занялся разработкой своего класса, я вспомнил о еще одном очень интересном классе TFrame, которй и помог решить мою задачу.

Код

TWinControl * Win = new TFrame(Application);
TComboBox * Manager = new TComboBox(Win);
Manager->Parent = Win;
Manager->Items->Add("");


Все работает крайне идеально.

Автор: Anikmar 5.12.2006, 13:25
Хм... Все равно же ведь Parent понадобился... Просто он скорее всего взялся из Application->MainForm.

Фактически то же самое, что и было выше:
Код

        TWinControl * Win = new TWinControl(this);
        TComboBox * Manager = new TComboBox(this);
        Win->Parent=this; // Или указатель на иную форму или Application->MainForm
        Manager->Parent = Win;
        Manager->Items->Add("");


Просто взят 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
Цитата(HappyLife @ 5.12.2006,  15:55)
Можно, но тогда нужно событие по которому нужно будет узнать, что парент уже назначен.

Немного не понял, а 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;

У меня проблем с тем как сделать не возникает.
Проблемы больше по части как сделать самым наилучшим и эффективным способом. Чтобы одно не зависело от другого.

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