Поиск:

Ответ в темуСоздание новой темы Создание опроса
> форма на MSVC++ 6.0, с чего начать? 
:(
    Опции темы
Earnest
Дата 16.4.2010, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



После чтения и заполнения переменных диалога, связанных с полями, вызови UpdateData (false).


--------------------
...
PM   Вверх
eugeniy
Дата 16.4.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Earnest @ 16.4.2010,  07:33)
После чтения и заполнения переменных диалога, связанных с полями, вызови UpdateData (false).



Я так полагаю , мне  нужно в файле readerDlg.cpp написать
в функции BOOL CReaderDlg::OnInitDialog()
{
     CDialog::OnInitDialog();
 
     m_surname_CTRL.SetWindowText (вот тут что писать, я же не могу написать просто birth ведь это переменная другого класса, как мне тут поступить, чтобы вывести содержимое birth класса CReader из файла reader_writer.cpp?);

     UpdateData(false);


m_surname - объявленна как контрол. т.е. DDX_Control ( pDX, IDC_SURNAME, m_surname_CTRL);

p.s: Почему когда категорию переменной ставишь value и тип Cstring, т.е. когда обращаешься к свойству объекта, а не к объекту в целом...то при вызове диалога, имя переменной затирается...  smile 
PM MAIL WWW   Вверх
Albor
Дата 16.4.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



eugeniy, тебе нужно получить данные для отображения, для этого нужен механизм взаимодействия между диалогом и кодом, получающим данные. Подключи в диалоге заголовок CReader - a и вызывай его функции, полученные данные копируй в переменные диалога.

Добавлено через 2 минуты и 47 секунд
Цитата(eugeniy @  16.4.2010,  12:38 Найти цитируемый пост)
то при вызове диалога, имя переменной затирается...    

Что ты имеешь ввиду под словом "затирается"?
PM MAIL ICQ   Вверх
eugeniy
Дата 16.4.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albor @ 16.4.2010,  14:43)
eugeniy, тебе нужно получить данные для отображения, для этого нужен механизм взаимодействия между диалогом и кодом, получающим данные. Подключи в диалоге заголовок CReader - a

подключил в диалоге readerDlg.cpp заголовок СReader, путём подключения вверху хэдера reader_writer.h...


Цитата
вызывай его функции, полученные данные копируй в переменные диалога.


можете тут на примере пожалуйста показать, как это делается
так?
BOOL CReaderDlg::OnInitDialog()
{
     CDialog::OnInitDialog();

        BOOL CReader::Card_read()
    {
           m_surname_CTRL.SetWindowText(birth);
           UpdateData(false);
    }
}

или как тогда?

Цитата

Что ты имеешь ввиду под словом "затирается"?




просто когда запускаешь диалог, то поле фамилия имеющая тип CString исчезает.
PM MAIL WWW   Вверх
Albor
Дата 19.4.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(eugeniy @  16.4.2010,  21:07 Найти цитируемый пост)
можете тут на примере пожалуйста показать, как это делается
так?

Чтобы показать на примере, нужно хотябы знать интерфейс CReader (кстати, это тип или именованное пространство?). Если это тип,  то в классе диалога нужно создать его объект и через него получать доступ к функциям. Скорее всего, нужно будет расширить функционал функцией, в которую будут передаваться переменные для получения данных, так как представленная Card_read() получает данные во внутренние переменные. Что-то вроде
Код

CReader::GetData(char * fname, char * lname);

Полученное преобразовать к CString и отобразить.
ЗЫ Если ты в классе диалога завёл переменную, определённую как control, то незачем вызывать UpdateData, ведь ты работаешь с объектом напрямую.

Это сообщение отредактировал(а) Albor - 19.4.2010, 12:30
PM MAIL ICQ   Вверх
eugeniy
Дата 19.4.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Чтобы показать на примере, нужно хотябы знать интерфейс CReader (кстати, это тип или именованное пространство?). Если это тип,  то в классе диалога нужно создать его объект и через него получать доступ к функциям.

Да CReader - это тип.
Я создал объект класса CReader
Код
m_reader = new CReader;

и про инициализировал БД mysql
Код
if(!(m_reader->Reader_Init()))
          EndDialog(0);



Цитата
Скорее всего, нужно будет расширить функционал функцией, в которую будут передаваться переменные для получения данных, так как представленная Card_read() получает данные во внутренние переменные.Что-то вроде
Код

CReader::GetData(char * fname, char * lname);

Полученное преобразовать к CString и отобразить.

можете показать на примере как это примерно должно выглядеть?




Цитата
ЗЫ Если ты в классе диалога завёл переменную, определённую как control, то незачем вызывать UpdateData, ведь ты работаешь с объектом напрямую.

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

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


Опытный
**


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

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



Цитата(eugeniy @  19.4.2010,  21:43 Найти цитируемый пост)
можете показать на примере как это примерно должно выглядеть

Примерно так:
Код

void CReader::GetData(char * & pFakultet, char * & pBirth, char ** & pRow, int & sizeRow)
{
   Card_read(); // читаем данные
// копируем указатели
   pFakultet=fakultet_name;
   pBirth = birth;
   pRow = row;
// получаем размер, определённый для массива row, чтобы в диалоге знать сколько в нём элементов
   sizeRow = rowSize;
}

Вызвав эту функцию из диалога,  переданные в неё указатели будут указывать на нужные данные. А для отображения вызываешь m_surname_CTRL.SetWindowText(pBirth);
Принцип понятен? Тебе, конечно, нужно будет подправить под свои нужды. Можно скопировать данные, а не получать указатели, чтобы не "вмешиваться" во внутреннее устройство CReader, но это уже как тебе больше нравится smile . 
PM MAIL ICQ   Вверх
eugeniy
Дата 20.4.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albor @ 20.4.2010,  11:07)
Примерно так:
Код

void CReader::GetData(char * & pFakultet, char * & pBirth, char ** & pRow, int & sizeRow)
{
   Card_read(); // читаем данные
// копируем указатели
   pFakultet=fakultet_name;
   pBirth = birth;
   pRow = row;
// получаем размер, определённый для массива row, чтобы в диалоге знать сколько в нём элементов
   sizeRow = rowSize;
}

Вызвав эту функцию из диалога,  переданные в неё указатели будут указывать на нужные данные. А для отображения вызываешь m_surname_CTRL.SetWindowText(pBirth);
Принцип понятен? Тебе, конечно, нужно будет подправить под свои нужды. Можно скопировать данные, а не получать указатели, чтобы не "вмешиваться" во внутреннее устройство CReader, но это уже как тебе больше нравится smile .

Значит получилось так, функция описана в reader_writer.cpp
Код

void CReader::GetData (char ** & pFakultet, char * & pBirth, char ** & pKurs, char ** & pRow, int & sizeRow)
{
    CReader::Card_read();
    pFakultet=fakultet_name;
    pBirth=birth;
    pKurs=kurs_name;
    pRow=row;
    sizeRow=rowSize;
}


Предварительно в файле reader_writer.h прописал ещё один метод класса:
Код
void GetData (char ** & pFakultet, char * & pBirth, char ** & pKurs, char ** & pRow, int & sizeRow);


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

После этих манипуляций вызвал в BOOL CReaderDlg::OnInitDialog()
Код
void GetData();


и вот затем если я хочу вызывать функцию для отображения то бишь
Код
m_birthday_CTRL.SetWindowText(pBirth);


то компилятор пишет:

--------------------Configuration: reader - Win32 Debug--------------------
Compiling...
readerDlg.cpp
c:\program files\microsoft visual studio\vc98\bin\reader(2)\reader\readerdlg.cpp(154) : error C2039: 'SetWindowTextA' : is not a member of 'CString'
        c:\program files\microsoft visual studio\vc98\mfc\include\afx.h(368) : see declaration of 'CString'
c:\program files\microsoft visual studio\vc98\bin\reader(2)\reader\readerdlg.cpp(154) : error C2065: 'pBirth' : undeclared identifier
Error executing cl.exe.

readerDlg.obj - 2 error(s), 0 warning(s)

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


Опытный
**


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

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



Так m_birthday_CTRL имеет тип CString?

Добавлено @ 12:33
Кстати, и rowSize зря ты обнулил. Где-то ж у тебя определяется размер массива row, вот его-то и нужно использовать. Именно это я и имел ввиду под rowSize.

Добавлено @ 12:35
А fakultet_name это массив строк?

Это сообщение отредактировал(а) Albor - 20.4.2010, 12:40
PM MAIL ICQ   Вверх
eugeniy
Дата 20.4.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albor @ 20.4.2010,  12:27)
Так m_birthday_CTRL имеет тип CString?


да что-то я тупанул)))
исправил на CEdit теперь пишет, что pBirth не определена

Добавлено @ 12:33
Цитата
Кстати, и rowSize зря ты обнулил. Где-то ж у тебя определяется размер массива row, вот его-то и нужно использовать.


у меня row, объвлен как MYSQL_ROW row;
MYSQL_ROW - это указатель на указатель на символ ) т.е. - это указатель не на строку, а на массив строк.
То есть я получаю функцией mysql_fetch_row в переменную row целый массив строк.





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


Опытный
**


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

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



Цитата(eugeniy @  20.4.2010,  12:40 Найти цитируемый пост)
pBirth не определена

Так нужно определить все переменные перед вызовом функции. 
PM MAIL ICQ   Вверх
eugeniy
Дата 20.4.2010, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albor @ 20.4.2010,  12:27)
Так m_birthday_CTRL имеет тип CString?

Добавлено @ 12:33
Кстати, и rowSize зря ты обнулил. Где-то ж у тебя определяется размер массива row, вот его-то и нужно использовать. Именно это я и имел ввиду под rowSize.


Добавлено @ 12:35
Цитата
А fakultet_name это массив строк?

да, также массив строк, аналогично и kurs_name

Добавлено через 4 минуты и 40 секунд
Цитата(Albor @ 20.4.2010,  12:44)
Цитата(eugeniy @  20.4.2010,  12:40 Найти цитируемый пост)
pBirth не определена

Так нужно определить все переменные перед вызовом функции.

т.е. определить в данных класса CReader, также как и др. переменные?
PM MAIL WWW   Вверх
Albor
Дата 20.4.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 
Цитата(eugeniy @  20.4.2010,  12:44 Найти цитируемый пост)
да, также массив строк, аналогично и kurs_name 

Понятно, у тебя получается в CReader набор записей. Тогда нужно получать размеры для каждого массива, иначе как ты будешь обрабатывать указатели. Или решить вопрос по другому: обратиться к CReader с "просьбой" вернуть определённую запись, скажем, по индексу. Всё-таки очень трудно что-то разумное подсказать, не имея более полной информации.
PM MAIL ICQ   Вверх
eugeniy
Дата 20.4.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albor @ 20.4.2010,  12:55)

Или решить вопрос по другому: обратиться к CReader с "просьбой" вернуть определённую запись, скажем, по индексу.

это так что ли?

CWnd* wnd=GetDlgItem(IDC_BIRTHDAY);
wnd->SetWindowText(pBirth);


Цитата
Всё-таки очень трудно что-то разумное подсказать, не имея более полной информации.


дак я вам могу её предоставить, ежели требуется...

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


Опытный
**


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

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



Цитата(eugeniy @  20.4.2010,  12:44 Найти цитируемый пост)
т.е. определить в данных класса CReader, также как и др. переменные? 

Нет, определить в диалоге перед вызовом функции объекта CReader. Переменные ведь передаются по ссылке, значит, прежде чем их "скормить" в функцию, они должны существовать.

Добавлено через 5 минут и 26 секунд
Цитата(eugeniy @  20.4.2010,  13:01 Найти цитируемый пост)
это так что ли?

Это нормально для установки текста в контроле с id IDC_BIRTHDAY, только pBirth должен указывать на массив символов с завершающим нулём (с-строку), а для этого pBirth нужно скормить функции GetData() и, после того как она отработает устанавливать текст в контроле.

Добавлено через 7 минут и 34 секунды
Цитата(eugeniy @  20.4.2010,  13:01 Найти цитируемый пост)
дак я вам могу её предоставить, ежели требуется...

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


 




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


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

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