Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как управлять CView из диалога?

462
25 апреля 2003 года
little brother
81 / / 18.10.2002
Есть у меня SDI приложение, есть класс вида и все такое... Есть так же диалог (например настройки или что-то в этом роде). Так вот как сделать так, чтобы при нажатии на кнопке в диалоговом окне можно было вызывать любые методы класса вида (CView, CScrollView и т.д.).
4.0K
25 апреля 2003 года
dmitry_moiseev
7 / / 24.04.2003
Не знаю, подойдет ли:
a) CMyDlg - класс диалога
б) CMyFormView - класс отображения

1. В CMyDlg
class CMyDlg : public CDialog
{
...
public:
CMyFormView* m_pview;
...
}


2. В CMyFormView определяешь метод, который вызывает MyDlg
void CMyFormView::OnMyDialog()
{
CMyDlg dlg;
dlg.m_pview = this;
dlg.DoModal();
}

3. Теперь можно управлять CMyFormView, например получив указатель на документ
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CMyDoc* pDoc = m_pview->GetDocument();
...
}

Да и не забыть про #include.


Цитата:
Originally posted by little brother
Есть у меня SDI приложение, есть класс вида и все такое... Есть так же диалог (например настройки или что-то в этом роде). Так вот как сделать так, чтобы при нажатии на кнопке в диалоговом окне можно было вызывать любые методы класса вида (CView, CScrollView и т.д.).

1.8K
25 апреля 2003 года
Jeff
94 / / 22.04.2003
Цитата:
Originally posted by little brother
Есть у меня SDI приложение, есть класс вида и все такое... Есть так же диалог (например настройки или что-то в этом роде). Так вот как сделать так, чтобы при нажатии на кнопке в диалоговом окне можно было вызывать любые методы класса вида (CView, CScrollView и т.д.).



А может просто дать диалогу указатель на класс вида?

462
28 апреля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by Jeff


А может просто дать диалогу указатель на класс вида?



Да я вообще не могу дать дерективу #include "MyView.h" в диалоге и #include "MyDlg.h" в классе вида одновременно ???
Кто-нибудь пробовал? Подскажите пжлста! Кстати диалог у меня не модальный (это очевидно неважно, но для конкретности).

462
28 апреля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by Jeff


А может просто дать диалогу указатель на класс вида?



Не получается!!! Компилятор не дает вставить дерективы #include "MyView.h" в класс диалога и #include "myDlg.h" в класс вида одновременно! Кто-нибудь пробовал подобное? Подскажите пожалуйста способ вызова методов класса вида из немодального диалога!

4.0K
28 апреля 2003 года
dmitry_moiseev
7 / / 24.04.2003
Должно лечится так:
В MyFormView.CPP -> #include "MyDlg.h"
в MyDlg.H -> #include "MyFormView.h"
3.5K
28 апреля 2003 года
shadowmaan
20 / / 24.04.2003
Цитата:
Originally posted by little brother


Не получается!!! Компилятор не дает вставить дерективы #include "MyView.h" в класс диалога и #include "myDlg.h" в класс вида одновременно! Кто-нибудь пробовал подобное? Подскажите пожалуйста способ вызова методов класса вида из немодального диалога!



Вот тебе пример, как выполнить такого рода включение.

Код:
// file a.h

class B;

class A
{
   B* pb;
   void g();
};

// file a.cpp
#include "a.h"
#include "b.h"

void A::g() { pb->f(); }

// file b.h
class A;

class B
{
   A* pa;
   void f();
};

// file b.cpp
#include "b.h"
#include "a.h"

void B::f() { pa->g(); }


Класс А пользуется членаме класса В и в то же время класс В пользуется членами класса А.
Для краткости инициализация указателей пропущенна. Идея в том, что включения выполняются в файлах реализации, а в заголовочных файлах используются предварительные объявления.
462
28 апреля 2003 года
little brother
81 / / 18.10.2002
Вот так - работает! Но... Я могу воспользоваться любыми public методами класса, но при попытке работать с переменными получается ошибка и ещё: к protected методам можно получить доступ таким макаром?
3.5K
28 апреля 2003 года
shadowmaan
20 / / 24.04.2003
Цитата:
Originally posted by little brother
Вот так - работает! Но... Я могу воспользоваться любыми public методами класса, но при попытке работать с переменными получается ошибка и ещё: к protected методам можно получить доступ таким макаром?



Нет. Ты имеешь доступ только к public членам, как к методам, так и к данным. Что бы получить доступ к protected членам, используются друзья. То есть, концепция класса не меняется.

Что за ошибка при обращении к переменной?

1.8K
28 апреля 2003 года
Jeff
94 / / 22.04.2003
Цитата:
Originally posted by little brother
Вот так - работает! Но... Я могу воспользоваться любыми public методами класса, но при попытке работать с переменными получается ошибка и ещё: к protected методам можно получить доступ таким макаром?



К protected ты никак не получишь доступ, я во всяком случае не знаю как. Что за ошибка? Покажи как ты иннициализируешь указатели, как вызвать к переменным обращаешься, и производны ли твои классы от других.

462
29 апреля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by Jeff


К protected ты никак не получишь доступ, я во всяком случае не знаю как. Что за ошибка? Покажи как ты иннициализируешь указатели, как вызвать к переменным обращаешься, и производны ли твои классы от других.



Указатели инициализирую как в сообщении от Shadowmaan. У меня класс myView::CScrollView, у него переменная типа public: CString str. Из моего диалога пытаюсь записать строку: p_MyView->str="string"; (например при WM_LBUTTONDOWN()), вылетает оштбка "Microsoft Visual C++ Debug Library: debug Assertion Failed...... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) - это появляется при нажатии левой кнопкой мыши. Конечно, можно вызвать какой-нибудь метод класса myView, и передать в него строку, но мне кажется, что и к переменным можно обращаться.

3.5K
29 апреля 2003 года
shadowmaan
20 / / 24.04.2003
Цитата:
Originally posted by little brother


Указатели инициализирую как в сообщении от Shadowmaan. У меня класс myView::CScrollView, у него переменная типа public: CString str. Из моего диалога пытаюсь записать строку: p_MyView->str="string"; (например при WM_LBUTTONDOWN()), вылетает оштбка "Microsoft Visual C++ Debug Library: debug Assertion Failed...... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) - это появляется при нажатии левой кнопкой мыши. Конечно, можно вызвать какой-нибудь метод класса myView, и передать в него строку, но мне кажется, что и к переменным можно обращаться.



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

1.8K
29 апреля 2003 года
Jeff
94 / / 22.04.2003
Цитата:
Originally posted by little brother


Указатели инициализирую как в сообщении от Shadowmaan. У меня класс myView::CScrollView, у него переменная типа public: CString str. Из моего диалога пытаюсь записать строку: p_MyView->str="string"; (например при WM_LBUTTONDOWN()), вылетает оштбка "Microsoft Visual C++ Debug Library: debug Assertion Failed...... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) - это появляется при нажатии левой кнопкой мыши. Конечно, можно вызвать какой-нибудь метод класса myView, и передать в него строку, но мне кажется, что и к переменным можно обращаться.



К переменной попробуй так обращатся:
CScrollView* p_MyView;
((myView*)p_MyView)->str = "string";
Да и к методам класса аналогично. Я обычно так делаю.

462
29 апреля 2003 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by Jeff


К переменной попробуй так обращатся:
CScrollView* p_MyView;
((myView*)p_MyView)->str = "string";
Да и к методам класса аналогично. Я обычно так делаю.



Все! Теперь работает! Благодарю всех!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог