Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CListBox в модальном диалоге 
:(
    Опции темы
Fighter
Дата 26.9.2006, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 2



Проблема вот в чем. Пусть есть диалог, который называется CMyDlg. В этом CMyDlg есть объявление переменной:

Код

  ...
  CListBox m_ListBox;
  ...


Этот CMyDlg вызывается из CView класса, ну, в данном случае из CMyView.

Код

...
void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    CWordListDlg dlg;
    dlg.DoModal();
}
...



Проблема вот в чем. Нужно перед выводом модального диалога заполнить CListBox. Как это сделать?
PM MAIL   Вверх
zkv
Дата 26.9.2006, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



можно, например, в класс CWordListDlg добавить метод, заполняющий лист-бокс, и вызывать его перед DoModal(); Или заполнять лист-бокс в InitDialog(), все зависит от того чем, и откуда заполнять.
PM MAIL   Вверх
Fighter
Дата 26.9.2006, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 2



Цитата(zkv @  26.9.2006,  04:46 Найти цитируемый пост)
все зависит от того чем, и откуда заполнять.


Чем? - Ну, наверное строками.

Откуда - а вот этому вопросу как раз и посвящен другой мой топик (http://forum.vingrad.ru/index.php?showtopic=113533).

Добавлено @ 05:10 
И вообще, ну почему же везде есть свой геморой. Почему нельзя было сделать так, чтобы можно было писать что-то вроде

Код

void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    CMyDlg dlg;
    dlg.m_ListBox.AddString("This is my try string");
    dlg.DoModal();
}

PM MAIL   Вверх
xTr1m
Дата 26.9.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



вот довольно простой способ.
Код

void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    CMyDlg dlg;

    CStringArray strings;
    strigns.Add("first string");
    strings.Add("second string");

    dlg.m_strings.Copy(strings);

    dlg.DoModal();
}


и потом в OnInitDialog() CMyDlg пишем
Код

BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    for(int i=0; i<m_strings.GetSize(); i++)
        m_ListBox.AddString(m_strings[i]);

    return TRUE;
}


и все  smile 
PM MAIL WWW ICQ   Вверх
Athlon
Дата 26.9.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



Цитата

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

void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    CMyDlg dlg;
    dlg.m_ListBox.AddString("This is my try string");
    dlg.DoModal();
}



А в чем собственно проблема? Сделай m_ListBox public,а не private вот и все дела  smile 
PM MAIL ICQ   Вверх
xTr1m
Дата 26.9.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Цитата

void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    CMyDlg dlg;
    dlg.m_ListBox.AddString("This is my try string");
    dlg.DoModal();
}


вот так вот нельзя писать не из-за private. В данном случае происходит обращение к еще не существуещему m_ListBox, он создается в OnInitDialog (ну не совсем в нем, но в этом сейчас суть)
PM MAIL WWW ICQ   Вверх
zkv
Дата 26.9.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(Fighter @  26.9.2006,  05:07 Найти цитируемый пост)
И вообще, ну почему же везде есть свой геморой. Почему нельзя было сделать так, чтобы можно было писать что-то вроде

Выделить всёкод C++
void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    CMyDlg dlg;
    dlg.m_ListBox.AddString("This is my try string");
    dlg.DoModal();
}

создавай диалог Creat'ом, и потом можешь работать с элементами управления этого диалога напрямую. 
Ну а если уж очень хочется передать указатель на класс в диалог, который в этом классе создается, то сделать это можно например так (насколько это изящно судить не берусь smile ):
в файле-хидере диалога пишем:
Код

// CMyDialog dialog
//...
class CExtClass; //говорим компилятору, что потом расскажем, что такое CExtClass

class CMyDialog : public CDialog 
{
  //...
  CMyDialog( CExtClass *pExtClass, CWnd* pParent = NULL );
  //...
  CExtClass *m_pExtClass; //здесь будет указатель на внешний класс, можно конечно хранить как 
                                           //void *, а потом в нужный момент преобразовывать к CExtClass *
};


в файле-cpp диалога пишем:
Код

// CMyDialog dialog
//...
#include "ExtClass.h" //хидер, в котором определен CExtClass


CMyDialog ::CMyDialog (CExtClass *pExtClass, CWnd* pParent )
    :: CDialog(CMyDialog::IDD, pParent)
{
    
    m_pExtClass= pExtClass;
}
//теперь, юзая m_pExtClass можно управлять вызвавшим диалог классом

и теперь можно передавать указатель, в твоем примере так:
Код

void CExtClass::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    CMyDialog dlg( this );
    dlg.DoModal();
}

PS повторюсь, что не знаю, насколько этот способ "изящен", и стоит ли вообще к нему прибегать, буду рад, если кто-нибудь выскажет мнение.
PM MAIL   Вверх
Athlon
Дата 27.9.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



2 zkv - нормальный способ если не хватило времени или желания перенести логику задачи в документ(если я все правильно понимаю, то речь идет о SDI приложении). Касательно же изящности - такой финт выглядит вполне нормально, нужно только контролировать когда переданый в диалог класс будет уничтожатся. 
2 xTr1m - согласен, я не уточнил, что когда я использую в SDI приложении диалоги для ввода чего-нибудь, то делаю их членами класса представления. При таком подходе есть существенное преимущество - диалог инициализируется один раз, а при n-м вызове на диалоге остаются данные введеные пользователем при (n-1)-м вызове. Может с точки зрения стиля это и не лучший подход, но мне он кажется довольно удобным.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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