Поиск:

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


Новичок



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

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



Цитата(Albor @ 20.4.2010,  13:03)
Цитата
Покажи хеадер класса CReader.

// 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
PM MAIL WWW   Вверх
eugeniy
Дата 20.4.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albor @ 20.4.2010,  13:03)
Цитата
Нет, определить в диалоге перед вызовом функции объекта CReader. Переменные ведь передаются по ссылке, значит, прежде чем их "скормить" в функцию, они должны существовать.


можно пожалуйста показать на примере?

или так?

в файле readerDlg.h
Код
CDialog* pBirth;


затем в readerDlg.cpp

Код
pBirth = new CDialog


Цитата
а для этого pBirth нужно скормить функции GetData() и, после того как она отработает устанавливать текст в контроле.


а каким образом скормить?

на данный момент у меня в диалоге:
Код
BOOL CReaderDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
       SetTimer(ID_TIMER_1,300000,0);
    
    m_reader = new CReader;            //создание объекта класса CReader
    if(!(m_reader->Reader_Init()))    // инициализация БД
          EndDialog(0);
    
    if(!(m_reader->Read_serial_number()))    //проверка серийного номера карты
          EndDialog(0);
    
    void GetData();        //получение данных

    m_birthday_CTRL.SetWindowText(pBirth);


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


Опытный
**


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

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



Можно функцию получения данных оформить так:
Код

void CReader::GetData(MYSQL_ROW & fakultet_row, MYSQL_ROW & kurs_row, MYSQL_ROW & rows)
{
  Card_read();
  fakultet_row = fakultet_name;
  kurs_row = kurs_name;
  rows = row;
}

К сожалению, я не работал с MYSQL и мне тяжело ориентироваиться в её типах, но, проанализировав приведенный код и бегло просмотрев инфу по MYSQL думаю, что можно сделать так как показано выше. При отображении в классе диалога использовать индекс колонки таблицы б.д.
Код

GetDlgItem(IDC_BIRTHDAY)->SetWindowText(rows[10]);

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


Опытный
**


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

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



eugeniy, на будущее: если функция требует параметр типа char *, то будет неправильным объявить переменную как CDialog* pBirth и пытаться передать её в функцию. Переменная должна соответствовать требуемому типу: char * pBirth; "Скормить" - это означает передать smile . Целью вызова функции GetData является получение указателей на данные, поэтому вызов её без параметров, как в твоём примере, недопустим. То есть схема такая: объявляем нужные указатели в диалоге -> передаём их в функцию GetData (она присваивает им нужные значения) -> после, используем указатели для отображения в контролах.
PS Не обратил внимания сразу: в OnInitDialog ты сделал объявление функции GetData, а не её вызов. Ты ведь создал объект CReader, так и вызывай для него m_reader->GetData(параметры...).

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


Новичок



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

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



Цитата(Albor @ 20.4.2010,  16:55)
eugeniy, на будущее: если функция требует параметр типа char *, то будет неправильным объявить переменную как CDialog* pBirth и пытаться передать её в функцию. Переменная должна соответствовать требуемому типу: char * pBirth; "Скормить" - это означает передать smile . Целью вызова функции GetData является получение указателей на данные, поэтому вызов её без параметров, как в твоём примере, недопустим. То есть схема такая: объявляем нужные указатели в диалоге -> передаём их в функцию GetData (она присваивает им нужные значения) -> после, используем указатели для отображения в контролах.
PS Не обратил внимания сразу: в OnInitDialog ты сделал объявление функции GetData, а не её вызов. Ты ведь создал объект CReader, так и вызывай для него m_reader->GetData(параметры...).

Понятно щас поробую, а такой вариант разве не прокатит?

1)в reader_writer.h объявить метод класса CReader вот так
Код
void GetData();


2)потом сделать само тело функции в reader_writer.cpp
Код
void CReader::GetData()
{
    CReader::Card_read();
}


3)затем в readerDlg.cpp
Код
m_reader = new CReader;            //создание объекта класса CReader
    if(!(m_reader->Reader_Init()))    // инициализация БД
          EndDialog(0);

if(m_reader->Card_read()){
        m_reader->GetData();        //получение данных
        m_birthday_CTRL.SetWindowText(m_reader->birth);
        UpdateData(false);
    }
    else
        EndDialog(0);


строчка m_birthday_CTRL.SetWindowText(m_reader->birth); означает, что мы выводим в контрол m_birthday_CTRL, содержимое переменной birth, ведь объект m_reader класса CReader и сама birth описана как данные класса CReader, т.е. вроде как правильно ссылаемся, но ничерта не работает...

Я вот всё смотрю и вижу, что код по работе с девайсом как-то не работает, т.е. рядом файл открыт изначальный на С, где всё работает и выводится, а вот когда в виде проекта оформил уже ничерта не работает....мистика прям.




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


Опытный
**


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

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



Цитата(eugeniy @  21.4.2010,  01:32 Найти цитируемый пост)
Понятно щас поробую, а такой вариант разве не прокатит?

Да должен прокатить раз все переменные в открытом доступе, только GetData в таком варианте не нужна   - вместо неё вызвать Card_read() и всё. А что в отладчике вот в этом месте:
Код

m_birthday_CTRL.SetWindowText(m_reader->birth);

Конкретно - что по адресу m_reader->birth?

Добавлено через 11 минут и 24 секунды
Знаешь что ещё попробуй, перенеси код из OnInitDialog куда-нибудь в другое место, например, добавь кнопку на форму, добавь обработчик нажатия и вставь код туда. Кто знает что ты намудрил с переменными для контрола, может при инициализации текст просто затирается.
PM MAIL ICQ   Вверх
eugeniy
Дата 22.4.2010, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Да должен прокатить раз все переменные в открытом доступе, только GetData в таком варианте не нужна   - вместо неё вызвать Card_read() и всё. А что в отладчике вот в этом месте:
Код

m_birthday_CTRL.SetWindowText(m_reader->birth);

Конкретно - что по адресу m_reader->birth?

Там вообщем пусто было, т.е. просто в поле ничего не записывалось....в дебаге посмотрел где валится, нашёл ошибку, исправил

После этого, всё успешно вывилось содержимое birth в контрол, только вот срабатывает как-то криво, когда карточка лежит на ридере то выводит день рождение, а когда запустил диалог и потом поднёс карточку уже ничерта не выводит, ну это наверно уже приблуды visual c++.
хотя когда изначальный код был, то он выводил независимо есть карточка в данный момент на ридере или же потом поднесли, , надо будет с этим позже разобраться....

Только вот переменные объвленные как массив строк не выводятся row[4], row[5] и т.д....в дебаге посмотрел, на строке
Код
m_surname_CTRL.SetWindowText(m_reader->row[4]);

пишет: Unhandled exception at 0x0040309f in reader.exe: 0xC0000005: Access violation reading location 0x00000010.





Это сообщение отредактировал(а) eugeniy - 22.4.2010, 01:25

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  debuger.JPG 288,54 Kb
PM MAIL WWW   Вверх
Albor
Дата 22.4.2010, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(eugeniy @  22.4.2010,  01:15 Найти цитируемый пост)
Только вот переменные объвленные как массив строк не выводятся row[4], row[5] и т.д....в дебаге посмотрел, на строке

Так в Card_read() в row ни чего не заносится, может ты заполняешь эту переменную где-то в другом месте? Кстати, MYSQL_ROW не совсем массив строк, как я понял, наверное оператор [] у него возвращает строку.

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


Новичок



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

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



Цитата
Так в Card_read() в row ни чего не заносится, может ты заполняешь эту переменную где-то в другом месте?


Нет всё заносится в этом методе Card_read() во все переменные row[4], row[5] и т.д....

Цитата
Кстати, MYSQL_ROW не совсем массив строк, как я понял, наверное оператор [] у него возвращает строку.


я функцией mysql_fetch_row в переменную row заношу целый массив строк, а уже потом обрезаю этот массив как мне нужно.т.е если я сделал выборку из трех столбцов то результат у меня соответственно будет находиться в row[0], row[1], row[2]. Таким образом получается как вы и говорите оператор [] возвращает конкретную строку.
Если верить C API для MySQL,то

MYSQL_ROW - Является ``типобезопасным'' представлением данных одной строки. В настоящее время этот тип реализован как массив строк с фиксированным количеством байтов (их нельзя трактовать как строки с нулевым символом в конце, если величины полей могут содержать двоичные данные, поскольку они могут содержать ноль байтов). Строки можно получить вызовом функции mysql_fetch_row(). 

Теперь по поводу вывода в контролы диалога этих строк, я их вывел таким путём
1) завёл в классе CReader переменные типа CString, также их продублировал в CReaderDlg
Код
CString Imya;
CString Familiya;

2) затем в Card_read, где я извлёк данные из mysql функцией mysql_fetch_row() и сразу после этого перепресвоил значения переменных row[4] и т.д. этим переменным.
Код
 Imya = row[4];
Familiya= row[5];

и т.д.
3)а потом уже в CReader::OnInitDialog()
после вызова Card_read() делаю
Код
m_surname_CTRL.SetWindowText(m_reader->Familiya);

4) в контроле диалога получаю, вместо вывода фамилии вопросительные знаки ???????

смотрел в дебагере, как только захожу в цикл    while((row = mysql_fetch_row (res)))
то сразу все переменные row заполняются знаками вопросами.

Дата вывелась т.к. там цифры, тут видимо какой-то баг с кодировкой, не хочет кириллицу выводить(
Видимо тут уже Винда комедит, можете что-нибудь подсказать по этому поводу???






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


Опытный
**


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

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



Цитата(eugeniy @  23.4.2010,  01:40 Найти цитируемый пост)
тут видимо какой-то баг с кодировкой, не хочет кириллицу выводить(
Видимо тут уже Винда комедит, можете что-нибудь подсказать по этому поводу???

Попробуй сделать:
Код

Imya = _T(row[4]);
Familiya= _T(row[5]);

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


Новичок



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

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



Цитата(Albor @ 23.4.2010,  08:00)
Цитата(eugeniy @  23.4.2010,  01:40 Найти цитируемый пост)
тут видимо какой-то баг с кодировкой, не хочет кириллицу выводить(
Видимо тут уже Винда комедит, можете что-нибудь подсказать по этому поводу???

Попробуй сделать:
Код

Imya = _T(row[4]);
Familiya= _T(row[5]);

Неа не помогает, просто выводит вместо русских букв, знаки вопроса, тут наверно проблема в кодировки. А вы как считаете?
PM MAIL WWW   Вверх
eugeniy
Дата 24.4.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



по ходу дела данные выбираются в кодировке latin1, которая стоит в БД по дефолту, поэтому и выводится знаками вопроса "?????"
У меня раньше такая проблема была, када я код писал на С, при выводе на консоль получались кракозябрики, проблема решилась после установки соединения с БД, вызовом команды 
Код
mysql_query("SET NAMES 'cp866'");
. т.е. выводом данных в досовской кодировке.
После этого все данные отображались корректно, русскими буквами

Но применив эту же операцию к нынешнему случаю, только вместо cp866 используя cp1251 ничего не произошло.



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


Опытный
**


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

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



Не знаю, если бы кодировка - были бы кракозябры, а так похоже на 2-х байтные символы. Посмотри что копируется в объект CString, если исходная строка через байт, то разбирайся с Unicode.
PM MAIL ICQ   Вверх
eugeniy
Дата 27.4.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albor @ 26.4.2010,  09:55)
Не знаю, если бы кодировка - были бы кракозябры, а так похоже на 2-х байтные символы. Посмотри что копируется в объект CString, если исходная строка через байт, то разбирайся с Unicode.

Да, уже разобрался, проблема была на самом деле в кодировки, по дефолту мускульный сервер использует кодировку latin1, а она именно и выводит всю кириллицу в виде знаков вопроса, причём каждая буква - это один знак вопроса.т.е. он всё время возвращал в своей кодировке.
Пришлось заюзать функцию mysql_set_character_set(), которая возвращает все значения, через это соединение в нужной мне кодировки автоматически. Таким образом все поля вывелись благополучно)))
Только вот теперь не знаю как фото из БД выцепить,и также в интерфейс диалога запихать? Думаю аналогичным образом не прокатит так сделать, тут ведь уже не текстовая информация...Каким образом можно сделать, не подскажите?

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


Опытный
**


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

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



Есть элемент в тулбоксе, называется Picture Control. В его свойствах определи тип "иконка" или "битмап"(что нужно) и размещай в нём картинку.

Это сообщение отредактировал(а) Albor - 27.4.2010, 21:14
PM MAIL ICQ   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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