![]() |
|
![]() ![]() ![]() |
|
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Здравствуйте!
Написана программная часть на С по работе с девайсом и работе с мускульной БД в IDE MSVC++ 6.0. Осталось сделать интерфейсную часть проекта. Использую IDE MSVC++ 6.0, нужно сделать форму след. содержания: чтобы выводилось фото человека, его ФИО, дата рождения, курс, факультет, в той же форме должно быть 6 кнопок и таблица, содержащая три столбца))) Прочитал книгу Холзнера Учебный курс Visual C++ 6.0. 14 уроков, но с визуальной средой всё равно проблемы, так как программирую под линукс всё))) Помогите как и с чего начать? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
Посмотри в сторону Qt
IMHO там нужно не 14 уроков, а 1-2 P.S. Правда "слезть" с него куда сложнее, чем "залезть" ![]() Это сообщение отредактировал(а) borisbn - 23.3.2010, 07:31 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Создай проект использующий MFC, выбери диалоговое приложение. Получишь макет формы и панель элементов. Дальше интуитивно понятно.
|
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
borisbn:
С QT уже времени мало ковыряться, 2 месяца до сдачи проекта, думал либо в Делфи интерфейсную часть сделать потом в библиотеку собрать и подключить к VC++, либо в VS2005 написать на VB, но думаю что будут проблемы с интеграцией языков, поэтому решил в той же среде делать где и программная часть написана. Только вот дилема получается, либо Win32Application создавать и делать на чистом С используя WinAPI, либо создать проект MFCAppWizard(exe) и юзать С++ и МFC, но С++ не знаю((( соответственно с MFC особо не знаком, да и говорят что очень надо долго ковыряться, чтобы хоть простейшую форму накидать...но с другой стороны и с WinAPI никогда не работал, поэтому получается такая шляпа! где быстрее будет и понятней не известно( Albor: Все эти кнопки и прочие элементы я уже накидал на форму и отредактировал, а как теперь с самой проги на С, вызвать обработчик событий по тому или иному действию? (Например, у меня прога делает запрос к БД по определённому критерию, та возвращает результат запроса (например: дата рождения) и помещает в переменную, и как теперь мне тут поступить чтобы эта "дата рождения" отобразилась в интерфейсной части в поле??? ), получается как-то надо обработать это событие? вот здесь и возникает вся суть выше изложенного( |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Если используешь MFC, принцип простой. Весь обмен нужно запихать в функцию DoDataExchange в виде DDX-statements, которые связывают поля формы и переменные со значениями. Выглядит примерно так:
void CMyDialog::DoDataExchange (CDataExchange* pDX) { CMyParams* pParms = get... // здесь ты добываешь указатель на данные, которые нужно читать\писать DDX_Text (pDX, IDC_NAME, pParms->m_sName); // IDC_NAME - ид-р поля с именем ... // остальные переменные в том же духе } В принципе, если ты делал диалог мастером, то он должен был тебе костяк накидать. Далее, когда нужно прочитать данные с формы, вызываешь UpdateData (TRUE). А когда записать в форму - UpdateData (FALSE). Скажем, пользователь нажимает кнопку "Запомнить", ты вызываешь в обработчике этой кнопки UpdateData (TRUE), а потом посылаешь заполненную структуру в БД. -------------------- ... |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Я думаю, что интерфейсная часть должна использовать программу на С, а не наоборот. Раз уж у программы есть взаимодействие с пользователем, то пусть запрос отображаемых данных инициируется формой (пользователем), вызывая функции С-кода. Данные можно разместить в переменных формы, как писала Earnest, а можно и напрямую взаимодействовать с элементами формы, получая соответствующий указатель ф-цией GetDlgItem(ID_ITEM).
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 6 Всего: 50 |
||||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
если можно поподробней, что это и для чего? Это сообщение отредактировал(а) eugeniy - 25.3.2010, 23:18 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 6 Всего: 50 |
гуишная либа на чистом WinAPI
Это сообщение отредактировал(а) Alca - 25.3.2010, 23:23 |
|||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
можно здесь поподробней пожалуйста. Доустим имеется поле "фамилия" - тип static, и поле куда выводиться фамилия - edit box. фамилия: edit box. визардом добавил переменную m_surname, Category - control, variable type - CEdit. как теперь запихать в поле edit box - определённую фамилию, которая допустим содержиться в переменной в коде на С? Добавлено через 1 минуту и 16 секунд
да я вот уже не знаю с винапи или с мфц ковыряться? вроде с мфц как-то больше советов дают |
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Если бы ты визардом добавил переменную типа CString для Edit-контрола, то визард бы сам добавил строчку DDX... и тебе бы нужно было просто присвоить значение полю m_surname и вызвать UpdateData. Лично я предпочитаю первый способ (без DDX), а если на форме много элементов, то пользуюсь указателями на них и переменные в классе не создаю. Это сообщение отредактировал(а) Albor - 26.3.2010, 08:17 |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
исходный файл на С переделал под visual c++...
но всё равно не получается в edit box вывести содержимое переменных row[4],row[5],row[6],birth,kurs_name[0],fakultet_name[0] прилагаю к вашему вниманию мой проект http://ifolder.ru/17299372 если вам не составит труда, посмотрите пожалуйста, что там не так... сейчас при компиляции пишет: --------------------Configuration: reader - Win32 Debug-------------------- Compiling... readerDlg.cpp c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(100) : error C2064: term does not evaluate to a function c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(102) : error C2059: syntax error : '{' c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(102) : error C2143: syntax error : missing ';' before '{' c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(102) : error C2447: missing function header (old-style formal list?) c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(102) : error C2143: syntax error : missing ';' before '}' c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(112) : error C2065: 'birth' : undeclared identifier c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(117) : error C2440: '=' : cannot convert from 'class CReader *' to 'int' This conversion requires a reinterpret_cast, a C-style cast or function-style cast c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(118) : error C2227: left of '->Reader_Init' must point to class/struct/union c:\program files\microsoft visual studio\vc98\bin\reader\readerdlg.cpp(119) : error C2146: syntax error : missing ')' before identifier 'EndDialog' Error executing cl.exe. readerDlg.obj - 9 error(s), 0 warning(s) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
eugeniy, мало желающих найдется качать твой проект и ковыряться в нем. Если у тебе не компилируется, так приведи конкретный код, который не компилируется. Только бога ради не полный проект. Цени чужое время.
-------------------- ... |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
По приведенным ошибкам, необходимо проверить фигурные скобки и ; , то бишь - синтаксис.
|
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
все ошибки исправил
BOOL CReader::Card_read() { while((row = mysql_fetch_row (res))) { snprintf(kurs,50,"SELECT tech_name FROM kursnames WHERE kurs_id = %s", row[34]); mysql_query(conn,kurs); if (!(res=mysql_store_result(conn))) //exiterr(2); kurs_name = mysql_fetch_row(res); snprintf(fakultet,100,"SELECT tech_name FROM faculty WHERE faculty_id = %s", row[35]); mysql_query(conn,fakultet); if (!(res=mysql_store_result(conn))) // exiterr(2); fakultet_name = mysql_fetch_row(res); birth=strtok(row[10], " "); printf("%s %s %s %s %s %s\t",row[4],row[5],row[6],birth,kurs_name[0],fakultet_name[0]); fprintf(file,"%s %s %s %s %s %s\t",row[4],row[5],row[6],birth,kurs_name[0],fakultet_name[0]); printf("\n"); fprintf(file, "\n"); } } как мне с этого кода вывести значение переменных в диалог в поля edit box? вот вроде бы конкретный код... |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
После чтения и заполнения переменных диалога, связанных с полями, вызови UpdateData (false).
-------------------- ... |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Я так полагаю , мне нужно в файле 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, т.е. когда обращаешься к свойству объекта, а не к объекту в целом...то при вызове диалога, имя переменной затирается... ![]() |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
eugeniy, тебе нужно получить данные для отображения, для этого нужен механизм взаимодействия между диалогом и кодом, получающим данные. Подключи в диалоге заголовок CReader - a и вызывай его функции, полученные данные копируй в переменные диалога.
Добавлено через 2 минуты и 47 секунд Что ты имеешь ввиду под словом "затирается"? |
|||
|
||||
eugeniy |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
подключил в диалоге readerDlg.cpp заголовок СReader, путём подключения вверху хэдера reader_writer.h...
можете тут на примере пожалуйста показать, как это делается так? BOOL CReaderDlg::OnInitDialog() { CDialog::OnInitDialog(); BOOL CReader::Card_read() { m_surname_CTRL.SetWindowText(birth); UpdateData(false); } } или как тогда?
просто когда запускаешь диалог, то поле фамилия имеющая тип CString исчезает. |
||||||
|
|||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Чтобы показать на примере, нужно хотябы знать интерфейс CReader (кстати, это тип или именованное пространство?). Если это тип, то в классе диалога нужно создать его объект и через него получать доступ к функциям. Скорее всего, нужно будет расширить функционал функцией, в которую будут передаваться переменные для получения данных, так как представленная Card_read() получает данные во внутренние переменные. Что-то вроде
Полученное преобразовать к CString и отобразить. ЗЫ Если ты в классе диалога завёл переменную, определённую как control, то незачем вызывать UpdateData, ведь ты работаешь с объектом напрямую. Это сообщение отредактировал(а) Albor - 19.4.2010, 12:30 |
|||
|
||||
eugeniy |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Да CReader - это тип. Я создал объект класса CReader
и про инициализировал БД mysql
можете показать на примере как это примерно должно выглядеть?
ну в принципе верно, я ведь не с отдельным свойством объекта работаю, а как с ним целым. |
||||||||||||
|
|||||||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Примерно так:
Вызвав эту функцию из диалога, переданные в неё указатели будут указывать на нужные данные. А для отображения вызываешь m_surname_CTRL.SetWindowText(pBirth); Принцип понятен? Тебе, конечно, нужно будет подправить под свои нужды. Можно скопировать данные, а не получать указатели, чтобы не "вмешиваться" во внутреннее устройство CReader, но это уже как тебе больше нравится ![]() |
|||
|
||||
eugeniy |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Значит получилось так, функция описана в reader_writer.cpp
Предварительно в файле reader_writer.h прописал ещё один метод класса:
затем он ругался, что не понимает идетификатор rowSize, объявил его как целый тип, и обнулил. После этих манипуляций вызвал в BOOL CReaderDlg::OnInitDialog()
и вот затем если я хочу вызывать функцию для отображения то бишь
то компилятор пишет: --------------------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) |
||||||||||||
|
|||||||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
да что-то я тупанул))) исправил на CEdit теперь пишет, что pBirth не определена Добавлено @ 12:33
у меня row, объвлен как MYSQL_ROW row; MYSQL_ROW - это указатель на указатель на символ ) т.е. - это указатель не на строку, а на массив строк. То есть я получаю функцией mysql_fetch_row в переменную row целый массив строк. |
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
eugeniy |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Добавлено @ 12:35
да, также массив строк, аналогично и kurs_name Добавлено через 4 минуты и 40 секунд
т.е. определить в данных класса CReader, также как и др. переменные? |
||||||
|
|||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Понятно, у тебя получается в CReader набор записей. Тогда нужно получать размеры для каждого массива, иначе как ты будешь обрабатывать указатели. Или решить вопрос по другому: обратиться к CReader с "просьбой" вернуть определённую запись, скажем, по индексу. Всё-таки очень трудно что-то разумное подсказать, не имея более полной информации. |
|||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
это так что ли? CWnd* wnd=GetDlgItem(IDC_BIRTHDAY); wnd->SetWindowText(pBirth);
дак я вам могу её предоставить, ежели требуется... |
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Нет, определить в диалоге перед вызовом функции объекта CReader. Переменные ведь передаются по ссылке, значит, прежде чем их "скормить" в функцию, они должны существовать. Добавлено через 5 минут и 26 секунд Это нормально для установки текста в контроле с id IDC_BIRTHDAY, только pBirth должен указывать на массив символов с завершающим нулём (с-строку), а для этого pBirth нужно скормить функции GetData() и, после того как она отработает устанавливать текст в контроле. Добавлено через 7 минут и 34 секунды Покажи хеадер класса CReader. |
|||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
// reader_writer.h обьявление /////////////////////////////////////////////////////////////////////////// #if _MSC_VER > 1000 #pragma once #include <winsock.h> #include "mysql.h" #include "mwrf32.h" class CReader { public: CReader(void); ~CReader(void); //////////////////////////////////////////////////////////////////////// // Данные класса MYSQL* conn; MYSQL_RES *res; MYSQL_ROW row; MYSQL_ROW fakultet_name; MYSQL_ROW kurs_name; int ver,t; int st,k,j,s; char *kurs, *fakultet; char *query; char *birth; char a[3]; int rowSize; unsigned char *stud_id; unsigned char i; unsigned char size; unsigned char data[50]; unsigned long sn_card; unsigned long old_sn_card; unsigned char key[6]; HANDLE dev; FILE *file; FILE *fp; /////////////////////////////////////////////////////////////////// // Методы класса // -- инициализация базы данных BOOL Reader_Init(); // -- проверка серийного номера BOOL Read_serial_number(); // -- считывание карты BOOL Card_read(); // -- закрытие устройства BOOL Close_device(); // -- закрытие БД и файлов BOOL Close_mysql_and_file(); // -- получение данных ;) void GetData(char ** & pFakultet,char * & pBirth,char ** & pKurs,char ** & pRow, int & sizeRow); }; #endif // _MSC_VER > 1000 |
||||
|
|||||
eugeniy |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
|
||||||||||||
|
|||||||||||||
Albor |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Можно функцию получения данных оформить так:
К сожалению, я не работал с MYSQL и мне тяжело ориентироваиться в её типах, но, проанализировав приведенный код и бегло просмотрев инфу по MYSQL думаю, что можно сделать так как показано выше. При отображении в классе диалога использовать индекс колонки таблицы б.д.
|
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
eugeniy, на будущее: если функция требует параметр типа char *, то будет неправильным объявить переменную как CDialog* pBirth и пытаться передать её в функцию. Переменная должна соответствовать требуемому типу: char * pBirth; "Скормить" - это означает передать
![]() PS Не обратил внимания сразу: в OnInitDialog ты сделал объявление функции GetData, а не её вызов. Ты ведь создал объект CReader, так и вызывай для него m_reader->GetData(параметры...). Это сообщение отредактировал(а) Albor - 20.4.2010, 17:16 |
|||
|
||||
eugeniy |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Понятно щас поробую, а такой вариант разве не прокатит? 1)в reader_writer.h объявить метод класса CReader вот так
2)потом сделать само тело функции в reader_writer.cpp
3)затем в readerDlg.cpp
строчка m_birthday_CTRL.SetWindowText(m_reader->birth); означает, что мы выводим в контрол m_birthday_CTRL, содержимое переменной birth, ведь объект m_reader класса CReader и сама birth описана как данные класса CReader, т.е. вроде как правильно ссылаемся, но ничерта не работает... Я вот всё смотрю и вижу, что код по работе с девайсом как-то не работает, т.е. рядом файл открыт изначальный на С, где всё работает и выводится, а вот когда в виде проекта оформил уже ничерта не работает....мистика прям. |
||||||||
|
|||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Да должен прокатить раз все переменные в открытом доступе, только GetData в таком варианте не нужна - вместо неё вызвать Card_read() и всё. А что в отладчике вот в этом месте:
Конкретно - что по адресу m_reader->birth? Добавлено через 11 минут и 24 секунды Знаешь что ещё попробуй, перенеси код из OnInitDialog куда-нибудь в другое место, например, добавь кнопку на форму, добавь обработчик нажатия и вставь код туда. Кто знает что ты намудрил с переменными для контрола, может при инициализации текст просто затирается. |
|||
|
||||
eugeniy |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Там вообщем пусто было, т.е. просто в поле ничего не записывалось....в дебаге посмотрел где валится, нашёл ошибку, исправил После этого, всё успешно вывилось содержимое birth в контрол, только вот срабатывает как-то криво, когда карточка лежит на ридере то выводит день рождение, а когда запустил диалог и потом поднёс карточку уже ничерта не выводит, ну это наверно уже приблуды visual c++. хотя когда изначальный код был, то он выводил независимо есть карточка в данный момент на ридере или же потом поднесли, , надо будет с этим позже разобраться.... Только вот переменные объвленные как массив строк не выводятся row[4], row[5] и т.д....в дебаге посмотрел, на строке
пишет: Unhandled exception at 0x0040309f in reader.exe: 0xC0000005: Access violation reading location 0x00000010. Это сообщение отредактировал(а) eugeniy - 22.4.2010, 01:25 Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
||||||
|
|||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Так в Card_read() в row ни чего не заносится, может ты заполняешь эту переменную где-то в другом месте? Кстати, MYSQL_ROW не совсем массив строк, как я понял, наверное оператор [] у него возвращает строку. Это сообщение отредактировал(а) Albor - 22.4.2010, 08:26 |
|||
|
||||
eugeniy |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Нет всё заносится в этом методе Card_read() во все переменные row[4], row[5] и т.д....
я функцией mysql_fetch_row в переменную row заношу целый массив строк, а уже потом обрезаю этот массив как мне нужно.т.е если я сделал выборку из трех столбцов то результат у меня соответственно будет находиться в row[0], row[1], row[2]. Таким образом получается как вы и говорите оператор [] возвращает конкретную строку. Если верить C API для MySQL,то MYSQL_ROW - Является ``типобезопасным'' представлением данных одной строки. В настоящее время этот тип реализован как массив строк с фиксированным количеством байтов (их нельзя трактовать как строки с нулевым символом в конце, если величины полей могут содержать двоичные данные, поскольку они могут содержать ноль байтов). Строки можно получить вызовом функции mysql_fetch_row(). Теперь по поводу вывода в контролы диалога этих строк, я их вывел таким путём 1) завёл в классе CReader переменные типа CString, также их продублировал в CReaderDlg
2) затем в Card_read, где я извлёк данные из mysql функцией mysql_fetch_row() и сразу после этого перепресвоил значения переменных row[4] и т.д. этим переменным.
и т.д. 3)а потом уже в CReader::OnInitDialog() после вызова Card_read() делаю
4) в контроле диалога получаю, вместо вывода фамилии вопросительные знаки ??????? смотрел в дебагере, как только захожу в цикл while((row = mysql_fetch_row (res))) то сразу все переменные row заполняются знаками вопросами. Дата вывелась т.к. там цифры, тут видимо какой-то баг с кодировкой, не хочет кириллицу выводить( Видимо тут уже Винда комедит, можете что-нибудь подсказать по этому поводу??? |
||||||||||
|
|||||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Неа не помогает, просто выводит вместо русских букв, знаки вопроса, тут наверно проблема в кодировки. А вы как считаете? |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
по ходу дела данные выбираются в кодировке latin1, которая стоит в БД по дефолту, поэтому и выводится знаками вопроса "?????"
У меня раньше такая проблема была, када я код писал на С, при выводе на консоль получались кракозябрики, проблема решилась после установки соединения с БД, вызовом команды
После этого все данные отображались корректно, русскими буквами Но применив эту же операцию к нынешнему случаю, только вместо cp866 используя cp1251 ничего не произошло. |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Не знаю, если бы кодировка - были бы кракозябры, а так похоже на 2-х байтные символы. Посмотри что копируется в объект CString, если исходная строка через байт, то разбирайся с Unicode.
|
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Да, уже разобрался, проблема была на самом деле в кодировки, по дефолту мускульный сервер использует кодировку latin1, а она именно и выводит всю кириллицу в виде знаков вопроса, причём каждая буква - это один знак вопроса.т.е. он всё время возвращал в своей кодировке. Пришлось заюзать функцию mysql_set_character_set(), которая возвращает все значения, через это соединение в нужной мне кодировки автоматически. Таким образом все поля вывелись благополучно))) Только вот теперь не знаю как фото из БД выцепить,и также в интерфейс диалога запихать? Думаю аналогичным образом не прокатит так сделать, тут ведь уже не текстовая информация...Каким образом можно сделать, не подскажите? Спасибо. |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Есть элемент в тулбоксе, называется Picture Control. В его свойствах определи тип "иконка" или "битмап"(что нужно) и размещай в нём картинку.
Это сообщение отредактировал(а) Albor - 27.4.2010, 21:14 |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Это то я уже сделал (битмап), а какие классы, методы нужны для работы с картинкой? Просто с текстом был гемор полный, а тут по моему, как я полагаю, всё ещё хуже обстоит( |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
У CStatic (именно такого типа будет переменная для Picture Control, только не забудь изменить идентификатор для картинки, а то не сможешь добавить переменную) есть ф-ция SetBitmap(). Понадобится CBitmap. Как получить CBitmap из данных в твоей базе не подскажу - не знаю. Думаю что не сложнее, чем со строками.
|
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Поменял ID картинки, на IDC_PHOTO, сделал переменную типа CStatic. А как этими SetBitmap и CBitmap пользоваться? Например, если просто тупо из файла вставить картинку в диалог? |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Я так понял, если делаешь Bitmap тип, то только можно работать с картинками формата bmp?
Других вариантов не остаётся? А как же jpg, gif, png??? |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
поработал с классом CBitmap, там только две функции поюзал, это LoadBitmap и SetBitmap, получается и вправду этот класс может работать только с картинками формата bmp.
А если у меня на фтп-сервере картинки в jpg и png хранятся, то как тогда тут быть? Получается какие-то сторонние библиотеки нужно подключать? |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Albor, вы где?
Какими средствами можно обойтись в mfc для решения данной проблемы? Может есть уже готовое решение, и велосипед не нужно изобретать? |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
В MFC, по-моему нет, во всяком случае я не знаю. Не найду никак ссылку, автор - Виталий Рычков (WinMain), показывал как это можно сделать, по-моему, используя ATL. Найду ссылку на статью разве что, а так помочь не могу.
|
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Albor, вы где?
Какими средствами можно обойтись в mfc для решения данной проблемы? Может есть уже готовое решение, и велосипед не нужно изобретать? |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Смотри пример здесь. В коде найдёшь как загрузить разные типы картинок.
|
|||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Спасибо за ссылочку. Вообщем сделал я по этому примеру вывод картинки. Там во-первых этот класс CPicture работает только с bmp, gif, jpeg, а png не поддерживает, что уже мне не подходит. Во-вторых мне удалось вывести картинку жпег прямо на диалоге, используя функцию BOOL OnEraseBkgnd(CDC* pDC). в элемент picture control, так и не удалось вывести( поработал с классом CImage, он уже со всеми форматами умеет работать) вот кусок кода, отвечающий за загрузку картинки и вывод её в элемент picture control.
но он мне рисует только рамку картинки исходных размеров, а саму картинку в диалоге не прорисовывает, делал в OnInitDialog. не знаю почему, уже всё перепробывал( Потом сделал в функции BOOL OnEraseBkgnd(CDC* pDC). На что он мне вывел картинку исходных размеров, но при этом убрал задний фон( Как мне теперь сжать картинку до нужных мне размеров? и вернуть на место задний фон? прилагаю два скрина, один - результат работы BOOL OnEraseBkgnd(CDC* pDC), а второй - как должно быть. http://ifolder.ru/17699882 |
||||
|
|||||
Albor |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Попробуй использовать другой вариант функции вывода
|
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
А объект CImage создавался в OnInitDialog? Если да, то объяви его как член класса диалог. А так - это временный объект, уничтожаемый по завершению OnInitDialog. m_photo=SetBitmap(image); не правильно m_photo.SetBitmap((HBITMAP)image); так должно быть Это сообщение отредактировал(а) Albor - 14.5.2010, 11:02 |
|||
|
||||
eugeniy |
|
||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
немного не понял как её прикрутить(AlphaBlend), так что ли?
всё это в функции OnInitDialog. Добавлено через 5 минут и 12 секунд
Да создавался в OnInitDialog
Всмысле в хэдере? если да, то объявил вот так
|
||||||||||||||
|
|||||||||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Вот обещанная ссылка на статью. Там же можно скачать пример с использованием MFC.
|
|||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Уже сделал с использование класса CImage. Получилось примерно так.
только вот не пойму как такое проделать. А если у меня вот такая ситуация. есть переменная CString Foto, переменная Foto в свою очередь присваивается каждый раз значение row[20] (результат выборки из таблицы БД Mysql), в которой хранится, например, 1.jpg т.е. получается Foto = 1.jpg Как мне в функции загрузки картинки прописать параметр? Image.Load(LPCTSTR(Foto)) и Image.Load(Foto(GetBuffer())) пробовал не работает, падает с ошибкой.((( |
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
eugeniy |
|
||||||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Вообщем ситуация такая: Когда делаю выборку данных из mysql:
то в дебаггере вижу, что в foto попало нужно значение, например, 1234.jpg. Потом же после выборки я попадаю сюда:
и сразу же как-только я вхожу в функцию void CReaderDlg::OnTimer(UINT nIDEvent) , то сразу переменная foto становится пустая
сделал в функции BOOL CReaderDlg::OnEraseBkgnd(CDC* pDC) проверку на пустоту, чтобы не валился код.
такое ощущение, что надо что-то поменять местами. может,
нужно в другое место запихать? не пойму никак, в чём дело. Да, для справки у меня переменная foto объявлена два раза, сначала в
потом в
|
||||||||||||||||||
|
|||||||||||||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Если переменная с таким именем есть и в классе CReader и в классе CReaderDlg, то это совершенно разные переменные. CString на пустую строку проверяется так:
Это сообщение отредактировал(а) Albor - 19.5.2010, 09:55 |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Когда я объявляю в одном классе CReaderDlg переменную foto, то при компиляции он мне пишет: c:\program files\microsoft visual studio\vc98\bin\reader(3)\reader\reader_writer.cpp(258) : error C2065: 'Foto' : undeclared identifier подключил хэдер readerDlg.h, переменная объявлена как public, не понимаю почему reader_writer.cpp не может до неё достучаться!? Да, кстати, когда я делал с другими переменными
я же их объявлял и в CReaderDlg и в CReader и всё работало отлично. А тут что-то капризничает. |
||||
|
|||||
Albor |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
вот фрагмент твоего кода:
Здесь ты копируешь текст из CReader в контрол принадлежащий CReaderDlg. Почему у тебя возникает проблема копирования строки - не понимаю. Делай по шагам: 1. Объяви в CReaderDlg переменную CString m_ImageFileName; 2. В OnTimer, где читаешь карточку и перебрасываешь данные в CReaderDlg, присваиваешь этой переменной значение
Правильно, ты объявил переменную в одном классе, а пытаешься доступиться к ней из другого, а этот "другой" ни слухом ни духом не знает о первом. После того, как объявляешь с тем же именем переменную в "слепом" классе, компилятор перестаёт ругаться, но данные то остаются в CReader::Foto, а CReaderDlg::Foto, как была пустой при создании, так и осталась. Кстати, разницу в именах переменных заметил? ![]() |
||||||||
|
|||||||||
eugeniy |
|
||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
всё сделал так как вы сказали, получилось вот так:
после этого фото всё равно не выводит на главном диалоге, а когда нажимаю кнопку "заявление на мат.помощь" выводится второй диалог и после его закрытия, на главном диалоге прорисовывается фото и вылетает с ошибкой следующего содержания: Debug Assertion Failed! Program:... File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h Line:503 Expression: m_hBitmap==0 вот так(
если честно нет) |
||||||||||||||
|
|||||||||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
CReader::Foto и CReaderDlg::Foto - это полные имена переменных, состоящих из области видимости и имени переменной. Имена самих переменных одинаковые, а область видимости разная. Это всё равно, что записать файл с именем foto.bmp на диск С и на диск D, если изменить файл на диске С, то на D, он останется неизменённым и наоборот. По рисованию: судя по ошибке - попытка нарисовать "пустую" картинку. Перед вызовом функции рисования картинки, проверяй m_hBitmap и рисуй, если он не равен нулю. |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Всё вроде работает. Отлично выводит картинку.
вот кусок рабочего кода, отвечающий за вывод картинки.
можно узнать как проверить существование файла? есть ли в mfc какие-нить средства? |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
А можете показать как правильно сделать проверку на существование файла?
Спасибо |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Можно так:
|
|||
|
||||
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
спасибо |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |