Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ComboBox и проблемка с ним 
V
    Опции темы
HappyLife
Дата 4.12.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 8



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

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

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


Это сообщение отредактировал(а) HappyLife - 4.12.2006, 16:36
PM MAIL   Вверх
Anikmar
Дата 4.12.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Именно в этих строчках? Должна вылететь чуть позже - на отрисовке формы.

Код неправильный - создается локальная переменная - указатель со сроком жизни в течение работы коструктора. После выхода из конструктора формы данный указатель будет недействителен.

Нужно перенести объявление 

TComboBox * Manager;

внутрь класса, в раздел private или куда еще - в зависимости от задач.
PM MAIL ICQ   Вверх
HappyLife
Дата 4.12.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 8



Это не важно. Данный код лишь для наглядности.
Вылетает именно на строчке ADD
PM MAIL   Вверх
Anikmar
Дата 4.12.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



А какая ошибка?
Этот код точно наглядно представляет как получить AV

Можно увидеть рабочий код?
PM MAIL ICQ   Вверх
586
Дата 4.12.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 57
Всего: 146



Код
 TComboBox * Manager = new TComboBox(this);
 Manager->Parent=this;
 Manager->Items->Add("");

PM   Вверх
HappyLife
Дата 4.12.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 8



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

Manager->Parent=this;

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

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

Это сообщение отредактировал(а) HappyLife - 4.12.2006, 17:19
PM MAIL   Вверх
dumb
Дата 4.12.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



манипуляции со списком реализуются посылкой сообщений.
когда у комба нет родителя, слать сообщения некуда...
PM MAIL   Вверх
HappyLife
Дата 4.12.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 8



Благодарю.
Но сам пример в более наглядном виде выглядит вот так
Код

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

Возможно ли использовать что-то такое же независимое чтобы потом можно было разместить на любой форме набор объектов?.
PM MAIL   Вверх
Anikmar
Дата 4.12.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Свойство Parent отвечает за визуализацию объекта - т.е. физически на каком контроле его расположить. Т.е. это должна быть форма, панель или еще что-нить.

Важнее свойство Owner - это свойство отвечает за владельца объекта. При уничтожении владельца будет автоматически вызваны деструкторы его (что-то слово не могу придумать, вещей или собственности).

Так что на практике, думаю, что необходимо устанавливать оба эти свойства. При работе в DLL насколько я помню примеры, в качестве владельца устанавливался объект Application...
PM MAIL ICQ   Вверх
HappyLife
Дата 4.12.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 8



Anikmar, 
Благодарю Вас за объяснение.
Все эти подробности конечно мной учтены. И были созданы TPanel TDrawGrid и др.
Был создан даже ComboBox все на TWinControl, который я потом и разметил на форме.
Но проблема остается с айтомами. Их я любом случае приходится назначать уже после того как я TWinControl размещу на форме. Проблема в том что мне нужно как-то отловить назначение парента, и создать айтомы, либо в ДЛЛ создать независимую функцию SetParent, но этот вариант мне дико не нравиться, по причине, что придется менять интерфейс, который благополучно работал, до того как я начал работать с TComboBox.
PM MAIL   Вверх
dumb
Дата 4.12.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



сделай класс на основе TWinControl, в котором отлавливай какое-либо сообщение оконное, в котором и производи необходимую инициализацию, и используй его в длл вместо TWinControl.
PM MAIL   Вверх
Anikmar
Дата 4.12.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



В коде
Код

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


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

Должно работать, но надо установить координаты, размеры, чтобы увидеть свой  Combobox
PM MAIL ICQ   Вверх
HappyLife
Дата 5.12.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 8



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


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

Код

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


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

Это сообщение отредактировал(а) HappyLife - 5.12.2006, 12:54
PM MAIL   Вверх
Anikmar
Дата 5.12.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Хм... Все равно же ведь 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 уже более апгрейженный
PM MAIL ICQ   Вверх
HappyLife
Дата 5.12.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 8



Anikmar, 
Конечно понадобиться. Но я же говорил, что задача изначально была, присвоить парент, где-то посередине работы программы, в любой момент, а создать айтомы в самом начале. 
Парент назначается уже после загрузги ДЛЛ, а объект создается во время.
Я делаю сильно-модульное приложение, чтобы главное окно модуля можно было кидать, в любое время и куда угодно в любой момент работы программы.
Моему боссу может прийти в голову все что угодно, рисковать переделываем огромного количество кода я не хочу.

Да и еще насчет того что TFrame это апргейженный TWinControl я в курсе, наверное в осном вопрос в этом и был, что подскажите мне такой компонент который не потребует немеделенного парента для создания TComboBox.


Это сообщение отредактировал(а) HappyLife - 5.12.2006, 15:08
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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