Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2013, 22:56   #1
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию Взаимодействие между 2 классами

Всем доброе время суток!
Помогите разобраться как взаимодействовать с 2мя классами. У меня есть главный диалог класса CnotepadDlg и немодальный диалог класса Dialog. В классе Dialog пытаюсь воздействовать на элементы, которые принадлежат классу CnotepadDlg. Вот мой неработающий пример

Код:
void Dialog::OnBnClickedButton3()
{
    CnotepadDlg Dlg;
    int nSelStart, nSelEnd;
    Dlg.edit1.SetFocus();        //Пытаюсь установить фокус на элемент класса CnotepadDlg
    Dlg.edit1.GetSel(nSelStart,nSelEnd);
    UpdateData(TRUE);
    CString a=Dlg.edit, b, c;
    EditC1.GetWindowText(b);
...
}
Ошибка на 3й строчке:
bigory вне форума Ответить с цитированием
Старый 27.06.2013, 23:07   #2
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Посмотри что находится в фале, указанном в сообщении об ошибке на 359 строке. Там должен быть блок ASSERT, условие которого не выполняется. Тогда будет понятно в чём именно проблема.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 27.06.2013, 23:21   #3
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию

Ошибка там где подчеркнуто
Код:
CWnd* CWnd::SetFocus()
{
	ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));

	if (m_pCtrlSite == NULL)
		return CWnd::FromHandle(::SetFocus(m_hWnd));
	else
		return m_pCtrlSite->SetFocus();
}
В появившемся окне пишет
notepad.exe has triggered a breakpoint

Выходит, я так думаю, что потерял хендл. Как же его тут восстановить?
bigory вне форума Ответить с цитированием
Старый 28.06.2013, 00:40   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

а это никак не может быть связанно с тем, что:

Код:
void Dialog::OnBnClickedButton3()
{
    CnotepadDlg Dlg;
    ...
}
локальный Dlg дохнет по окончанию работы функции?
_Bers вне форума Ответить с цитированием
Старый 28.06.2013, 01:06   #5
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
а это никак не может быть связанно с тем, что:

локальный Dlg дохнет по окончанию работы функции?
Эта ошибка возникает до того как функция завершится

Еще это не помогает
Код:
	CnotepadDlg Dlg;
	CEdit *edit1;
	edit1=(CEdit*)Dlg.GetDlgItem(IDC_EDIT1);
Та же ошибка на edit1=(CEdit*)Dlg.GetDlgItem(IDC_ED IT1);

Последний раз редактировалось bigory; 28.06.2013 в 01:36.
bigory вне форума Ответить с цитированием
Старый 28.06.2013, 06:43   #6
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

а ниче что вы переменную объявили а окошко не запустили?
Это MFC вроде?
Kukurudza вне форума Ответить с цитированием
Старый 28.06.2013, 11:29   #7
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Kukurudza Посмотреть сообщение
а ниче что вы переменную объявили а окошко не запустили?
Это MFC вроде?
Я не понимаю зачем мне запускать 2е главное окно...

Попробую пояснить.
CnotepadDlg уже создан и является главным окном, скажем окно текстового редактора.
CDialog немодальное окно, которое создается Create(IDD_DIALOG1); и запускается через ShowWindow(SW_SHOW);. Предположим это будет что-то типа поиска текста в текстовом поле, который в окне класса CnotepadDlg. В немодальном окне есть кнопка "Найти". При нажатии на эту кнопку, в текстовом поле, которая находится в окне класса CnotepadDlg, выделяется найденный текст

Я знаю что эту возможность можно реализовать через CFindReplaceDialog(), но я хочу создать свое окно.
Проблема в том, что я не могу при нажатии на кнопку "OnBnClickedButton3" воздействовать на объекты класса CnotepadDlg

Да, MFC

Последний раз редактировалось bigory; 28.06.2013 в 12:00.
bigory вне форума Ответить с цитированием
Старый 28.06.2013, 12:09   #8
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

Код:
void Dialog::OnBnClickedButton3() {
    CnotepadDlg Dlg;              // объект какого то класса. ок. только че то он не инициализирован
    int nSelStart, nSelEnd;      // какое-то целые числа
    Dlg.edit1.SetFocus();        //Пытаюсь установить фокус на элемент класса CnotepadDlg который вообще говоря еще не понятно что. инициализировать то новый объект я не хочу, ибо объект такого типа тётьдусяизмохосранска уже когда то инициализировала
    Dlg.edit1.GetSel(nSelStart,nSelEnd);     // ну опятьдвадцатьпять. про тётьдусю не буду писать второй раз
    UpdateData(TRUE);      // ок. обновил данные с формы или наоборот имхо не помню чекаво там в мфс
    CString a=Dlg.edit, b, c; //опять тетя дуся и две переменные и кастринг
    EditC1.GetWindowText(b); // я хз че это
...
}
я надеюсь понятно объяснил? вы объявили новую переменную и не инициализировали ее. и пытаетесь к ней достучатся.
Код:
double * massiv; //ну я типа создал массив окда
massiv[10] = 10.0; //опа на эксепшн четакоенепайму
извиняюсь за грубость, если кто-то ее почувствовал на себе

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

Последний раз редактировалось Kukurudza; 28.06.2013 в 12:12.
Kukurudza вне форума Ответить с цитированием
Старый 28.06.2013, 13:10   #9
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию

Как надо? Вот мой неправильный код


Создан главный диалог класса CnotepadDlg
Создан дочерний диалог класса Dialog

notepadDlg.h

Код:
#pragma once
#include "afxwin.h"
#include "Dialog.h"

class CnotepadDlg : public CDialog
{
...

public:
    Dialog* Replace;
...

notepadDlg.cpp

Код:
...

//Правка_Заменить...
void CnotepadDlg::OnEditRepeat()
{
    // Вызов окна
    if(!Replace)
    {
        Replace = new Dialog;
        Replace->Create(IDD_DIALOG1);
        Replace->ShowWindow(SW_SHOW);
        Replace->EditC1.SetWindowText(strFind);
        CnotepadDlg This=this;
    }
    else //если создан
    {
        Replace->Edit1=strFind;
        Replace->SetActiveWindow(); //то делаем его активным
        Replace->ShowWindow(SW_SHOW);
        Replace->EditC1.SetWindowText(strFind);
    }
}

Dialog.h

Код:
#pragma once
#include "afxwin.h"
//#include "notepadDlg.h"  //Если раскомментировать, то рычит

// Dialog dialog

class Dialog : public CDialog
{

public:
...
    CEdit EditC1;
    afx_msg void OnBnClickedButton3();
};
Dialog.cpp

Код:
...
#include "notepadDlg.h"
...

void Dialog::OnBnClickedButton3()
{
    CnotepadDlg Dlg;
    Dlg.GetDlgItem(IDD_NOTEPAD_DIALOG);
    CEdit *edit1;
    edit1=(CEdit*)Dlg.GetDlgItem(IDC_EDIT1);
bigory вне форума Ответить с цитированием
Старый 28.06.2013, 13:26   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Dialog::OnBnClickedButton3 создает новый объект типа CnotepadDlg.
Передавайте вашему Dialog объекту указатель на CnotepadDlg в качестве родителя и сохраняйте этот указатель в переменной класса Dialog.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взаимодействие между формами и БД Lazio Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 28.01.2012 10:39
Передачи куки между классами temkas C# (си шарп) 5 26.08.2011 13:33
Взаимодействие между серверами alex-chz PHP 6 03.03.2010 23:44
Взаимодействие между формами Marsel737 Общие вопросы Delphi 5 16.11.2009 22:29
взаимотношения между классами ciaonataha Общие вопросы C/C++ 3 23.07.2009 18:37