Re: Когда нужно инициализовать контрол в диалоге
От: Master Yoda Великобритания  
Дата: 26.08.06 08:15
Оценка: +1
Здравствуйте, Wallrunner, Вы писали:

<...>

Очевидно ты неправильно связываешь комбобокс на диалоге с соответствующей переменной в классе. Если пользуешься VS2003, то порядок такой: бросаешь на шаблон диалога комбобокс, вызываешь для него контекстное меню и в нем выбраешь Add Variable. Далее появится визард, который поможет все правильно сделать.

Если хочется сделать это вручную, то следует учесть, что просто добавить в класс диалога переменную типа CComboBox недостаточно. Нужно связать эту переменную с самим комбобоксом через механизм data exchange (макрос DDX_Control):

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_MYCOMBOBOX, m_ComboBox);
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Когда нужно инициализовать контрол в диалоге
От: febus Германия  
Дата: 26.08.06 08:23
Оценка: -1
Здравствуйте, Wallrunner, Вы писали:

W>Читая MSDN я пока что докопался по метода Attach и в OnInitDialog() сделал вот такое:

W>Неужели это и есть правильный ответ?
Добавь в начале метода, где делается AddString, строчку

UpdateData(TRUE);
Когда нужно инициализовать контрол в диалоге
От: Wallrunner  
Дата: 25.08.06 21:03
Оценка:
Всем привет.

Я новичок в MFC и скорее всего вопрос такой задавался, но я не знаю как нормально сформулировать поисковый запрос, поэтому решил написать пост.
Дело в том что я создал в своем проекте диалог и поместил туда ComboBox. Затем создал член класса, типа CComboBox в классе диалога.
При загрузке диалога мне нужно инициализировать комбо бокс некоторыми значение из БД. Но при попытке сделать это вызовом CComboBox::AddString() в конструкторе диалога или же в методе OnInitDialog() прога выдает assertion failed, причем не совсем понятно что ей не нравится, по-моему пустой hWnd в объекте контрола. При этом если добавить обработчик OnPaint() и сделать инициализаию там то все проходит нормально. Но мне этот способ не нравится, потому как он кривоватый — каждый раз при перерисовке диалога надо проверять не был ли контрол уже проинициализирован. Т.е. я не могу инициализировать контрол до появления окна. Так что хотел бы спросить когда (в обработчике какого события) нужно инициализировать контролы?

Да кстати, на этом диалоге у меня также есть EditBox и для него поставлен тип CString и он отлично инициализируется в конструкторе класса строковым значением, однако если его превратить в контрол то возникает та же история.
Re: Когда нужно инициализовать контрол в диалоге
От: Wallrunner  
Дата: 25.08.06 22:06
Оценка:
Читая MSDN я пока что докопался по метода Attach и в OnInitDialog() сделал вот такое:

m_ParentCatCombo.Attach(GetDlgItem(IDC_PARENT_CAT)->m_hWnd);
m_ParentCatCombo.AddString(_T("test"));
m_ParentCatCombo.Detach();


Но что-то мне тоже не нравится этот способ, как-то он дурно пахнет.
Неужели это и есть правильный ответ?
Re: Когда нужно инициализовать контрол в диалоге
От: 3V Россия  
Дата: 26.08.06 09:03
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

Здравствуйте, Wallrunner, Вы писали:

W>Так что хотел бы спросить когда (в обработчике какого события) нужно инициализировать контролы?


Вообще то, это при помощи CWnd::SubclassDlgItem делается, но для диалогов есть свой мещанихм сабклассинга контролов.
При генерации класса диалога визардом создается метод DoDataExchange. Если добавить (опять же визардом) переменную для контрола, то в DoDataExchange сгенерится вызов функции DDX_Control, в которой и производитс сабклассинг.
DoDataExchange вызывается фреймворком при вызове CDialog::OnInitDialog.
Re[2]: Когда нужно инициализовать контрол в диалоге
От: Wallrunner  
Дата: 26.08.06 09:19
Оценка:
Здравствуйте, 3V, Вы писали:

3V>Вообще то, это при помощи CWnd::SubclassDlgItem делается, но для диалогов есть свой мещанихм сабклассинга контролов.

3V>При генерации класса диалога визардом создается метод DoDataExchange. Если добавить (опять же визардом) переменную для контрола, то в DoDataExchange сгенерится вызов функции DDX_Control, в которой и производитс сабклассинг.
3V>DoDataExchange вызывается фреймворком при вызове CDialog::OnInitDialog.

Всем спасибо за ответы. На самом деле я делал все средствами студии и вызовы DDX_* у меня тоже есть.
UpdateData(TRUE) кстати в OnInitDialog() не помогает, также выдает assert, а вот вызов CDialog::OnInitDialog()
как раз-таки помог. И надо же было мне не додуматься сделать такую часто используюмую вещь как вызов метода базового класса...
Re[3]: Когда нужно инициализовать контрол в диалоге
От: febus Германия  
Дата: 26.08.06 09:34
Оценка:
Здравствуйте, febus, Вы писали:
F>
F>UpdateData(TRUE);
F>


^
Это дейсвительно бред, то что я сверху написал. Сейчас проверил.
Сорри, фигню с просони сморозил
Re: Когда нужно инициализовать контрол в диалоге
От: Axc  
Дата: 26.08.06 19:43
Оценка:
Здравствуйте, Wallrunner, Вы писали:

W>Дело в том что я создал в своем проекте диалог и поместил туда ComboBox. Затем создал член класса, типа CComboBox в классе диалога.

W>При загрузке диалога мне нужно инициализировать комбо бокс некоторыми значение из БД. Но при попытке сделать это вызовом CComboBox::AddString() в конструкторе диалога или же в методе OnInitDialog() прога выдает assertion failed,

Таки именно в OnInitDialog(), но после вызова CDialog::OnInitDialog();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.