Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с передачей данных, С++ 
:(
    Опции темы
Zolex
Дата 24.10.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.

Вот стоит сия задача передо мною и разобраться в ней нет сил моих, помогите чем сможете...


Программа пишется в VC6.

Выбран стандартный тэмплэйт МFC Application Wizarad (exe). (однооконный, однодокументный)
Далее в MainFraim окно делится на два вида. Один - наследник CTreeView, другой - CListView. Причем оба вида(класса) находяться в разных файлах (одноименных).


CTreeView заполняется некими элементами...

Далее задача такая - при смене элемента CTreeView (OnSelchanged, то есть при тычке мышью в какой-то Item дерева), СListView должен заполняться некими элементами.

То есть допустим в классе СListView есть метод заполнения списка элементами с названием AddItems.
Вот как его вызвать из СTreeView при событии CTreeView::OnSelchanged и передать ему выбранный Item СTreeView?

Заранее спасибо...

Это сообщение отредактировал(а) Zolex - 24.10.2006, 19:27
PM MAIL   Вверх
Earnest
Дата 24.10.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Из TreeView это вызывать не стОит: пусть виды живут себе, ничего друг о друге не зная - целее будут.
Лучше эту логику вынести в родительское окно, т.е. в MainFrame. Обработчик SELCHANGED можно ведь поставить родителю. Т.е. получает MainFrame уведомление о смене текущего элемента в дереве и вызывает себе нужный метод ListView. Для удобства ссылки на виды (нужного типа) можно запомнить в переменных MainFrame при создании клиента.


--------------------
...
PM   Вверх
Zolex
Дата 24.10.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, понял все, за исключением как SELCHANGED поставить в MainFraim. Не могли бы по-подробнее объяснить? До этого я пользовался ClassWizard для впихивания этого кода в программу....
PM MAIL   Вверх
Kostt
Дата 25.10.2006, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 8.1.2006
Где: Томск

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



Просто создай в родителе метод и вызывай его по событию OnSelChanged.
Указатель на родителя можно получить функцией CWnd GetParent()

PM MAIL   Вверх
Earnest
Дата 25.10.2006, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Все просто. 
Хотя в случае сплиттера, родителем вложенных видов является именно он, но он пересылает все команды и уведомления своему родителю, т.е. рамке.
В классе CMainFrame добавляем обработчик:

Код

class CMainFrame: public CFrameWnd
{
   ...
private:
   afx_msg void OnSelChanged (NMHDR*, LRESULT*);

private:
   CTreeViewl* m_pTree; // инициализируется при создании сплиттера и его видов
};

BEGIN_MESSAGE_MAP (CMainFrame, CFrameWnd)
   ...
   ON_NOTIFY (TVN_SELCHANGED, IDC_MYTREE, OnSelChanged)
END_MESSAGE_MAP()


void CMainFrame::OnSelChanged (NMHDR* pNMHDR, LRESULT* pResult) 
{
   *pResult = 0;
   
   HTREEITEM hCurItem = m_pTree->GetTreeCtrl().GetSelectedItem();
   ...
}


Еще одно замечание: идентификатор вида, вложенного в сплиттер, равен IdFromRowCol(row, col).  Эта функция, к сожалению, не является статической, хотя вполне могла бы быть. Поэтому нельзя определить статическую константу IDC_MYTREE = IdFromRowCol (row, col). Но можно просто списать слова (вряд ли они изменяться в ближайшие сто лет):
Код

const UINT IDC_MYTREE =  AFX_IDW_PANE_FIRST + row * 16 + col;

(вместо row, col подставь соответствующие значения).




--------------------
...
PM   Вверх
xTr1m
Дата 25.10.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть еще один способ, правда не знаю на сколько грамотный. В CTreeView ловишь, когда меняется элемент и пишешь что-то вроде
[code=cpp]
CTestDoc *pDoc = (CTestDoc*)GetDocument();
pDoc->UpdateAllView(NULL, REFRESH_SECOND_VIEW, 
Код

(CObject*)aaa);


REFRESH_SECOND_VIEW объявляешь в документе
Код

enum {REFRESH_SECOND_VIEW };


ну и во втором виде переопределяешь функцию OnUpdate()
Код

if(lHint == REFRESH_SECOND_VIEW)
{
    // делаем что нужно
    AnyStruct *a = (AnyStruct*)pHint;
}


Суть, наверное, понятно, но все же объясню.
После того, как ты поменял элемент в дереве документ посылает все видам OnUpdate с командой REFRESH_SECOND_VIEW. Второй вид принимает этот Update смотрит, что команда совпадает и делает что нужно. 
Строчка
Код

(CObject*)aaa

Это мы передаем все что угодно (структуру, переменную и т.д) и потом ловим это из pHint
PM MAIL WWW ICQ   Вверх
Earnest
Дата 25.10.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно и так, если оба вида принадлежат одному документу и он вообще есть... 


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


Новичок



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

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



Огромное всем спасибо за ответы.

В итоге я всех запутал и запутался сам.

Но тем не менее, разобрался и сделал по-другому, но опять уперся в стену.

Итак с самого начала было так (не так безоблачно, как я описал в начале).

В MainFrm в функции OnCreateClient вызываeтся функция класса CMySplitter, которая заведует делением окна.

При этом создаются виды  CmyView (от СView) и CMyListView (отCListView).

В CMyView далее вызывает функции класса CMyTree, который заведует созданием дерева в CMyView. Дерево создается опять же в новом окне, наложенным поверх CMyView.


Теперь с СMyTree в обработчике OnSelChanged я делаю следующее :

Код

CMyView* wndMyView = (CMyView*)GetParent(); // получаем родительское окно CMyTree, которым является CMyView

CMySplitter* wndCore = (CMySplitter*)(wndMyView->GetParent()); // получаем родительское окно CMyView, которым является CMySplitter

CMyListView* wndListView = (CMyListView*)(wndCore ->GetPane(0, 1)); // получаем вид, которым является CMyListView (Слава богу добрались до него)

wndListView->AddItems(); // вызываем функцию заполнения CMyListView



Ура, все работает отлично, там в AddItems передаются еще кой какие параметры, сейчас не в этом суть.

Теперь по оконцовке нам надо перерисовать все виды, дабы заполненный список отобразился.

Вот в функции AddItems я пишу в конце :

Код

CDocument* pDoc = GetDocument();
pDoc->UpdateAllViews(NULL);


И все, программа вылетает, на строчке pDoc->UpdateAllViews(NULL);

Причем, если тоже сделать в OnDraw, все работает:

Код

void CDataBaserFiles::OnDraw(CDC* pDC)
{
       CDocument* pDoc = GetDocument();
       pDoc->UpdateAllViews(NULL);
}


Ну это я так, себя проверял.

Так вот подскажите кто нибудь, где мне апдэйтить виды?

Заранее БОЛЬШОЕ человеческое Спасибо.


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


Опытный
**


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

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



AddItems эта функция какого класса? Проверь pDoc наверняка он NULL или 0xcececece
pDoc->UpdateAllViews(NULL, REDRAW) нужно писать в функции OnSelchanged вида дерева

Если не получится, то отправь мне на мыло свой прект, посмотрю
PM MAIL WWW ICQ   Вверх
Zolex
Дата 25.10.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



AddItems - это ф-ция CMyListView
PM MAIL   Вверх
Zolex
Дата 26.10.2006, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообщем, Все!

Огромное всем спасибо еще раз.

В итоге сделал через UpdateView.

На OnSelChanged получаю документ, записываю туда переменную и апдэйчу виды.

А в CListView OnUpdate читаю из документа переменную и заполняю список...

Оказалось все довольно просто. Еще раз убеждаюсь, запрограммировать можно все, главное понять как.
PM MAIL   Вверх
xTr1m
Дата 26.10.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну можно безусловно и так. Обращайся  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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