С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/104: Рейтинг темы: голосов - 104, средняя оценка - 4.99
0 / 0 / 0
Регистрация: 31.03.2020
Сообщений: 6
MS Access

Авторизация пользователя в программе для тестирования "знаний" (Windows Forms, C++/CLI)

31.03.2020, 21:42. Показов 19331. Ответов 9

Студворк — интернет-сервис помощи студентам
Читал несколько дней форумы по данной теме и не нашел решения для своего случая(возможно автор вопроса туповат))).
Проблема следующая.
Необходимо создать приложение Windows Forms на C++ для тестирования студентов по пройденному материалу(Курсовая работа крч). Сделал окно авторизации и создания учетных записей в нем же. Создана база данных MS Access(пользователь, пароль, вопрос 1 и т.д.). Все прекрасно работает. После авторизации("Titul.h") юзер попадает в меню("MyMenu.h"), где может "пройти тест". Когда юзер нажмет "пройти тест" он будет отвечать на вопросы(Например 1-ый, "Question1.h"), которые появляются в отдельных формах(условие препода). Проблема заключается в том, как заставить программу запомнить, что вошел, например, пользователь "Ruslan" с паролем "zxcvbn" и соответственно записывать результаты его ответов(1 - верно, 0 - не верно) в эту же базу данных напротив именно этого пользователя.

Ниже представлен код "Titul.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma once
#include <string>
#include "MyMenu.h";
using namespace Microsoft::VisualBasic;
 
 
namespace Kursovaya {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Data::OleDb;
 
    /// <summary>
    /// Сводка для Titul
    /// </summary>
    public ref class Titul : public System::Windows::Forms::Form
    {
 
    public:
        Titul(void)
        {
            InitializeComponent();
 
            //
            //TODO: добавьте код конструктора
            //
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Titul()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Label^ label1;
    protected:
    private: System::Windows::Forms::Label^ label2;
    private: System::Windows::Forms::TextBox^ textBoxLogin;
    private: System::Windows::Forms::TextBox^ textBoxPassword;
    private: System::Windows::Forms::Button^ buttonEnter;
    private: System::Windows::Forms::Button^ buttonExit;
    private: System::Windows::Forms::Button^ buttonRegistration;
    private: System::Windows::Forms::TextBox^ textBoxNewLogin;
    private: System::Windows::Forms::TextBox^ textBoxNewPassword;
    private: System::Windows::Forms::Label^ label3;
    private: System::Windows::Forms::Label^ label4;
 
    private:
        /// <summary>
        /// Обязательная переменная конструктора.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
----------------------------------
#pragma endregion
private: System::Void buttonExit_Click(System::Object^ sender, System::EventArgs^ e) 
    {
        Application::Exit();
    }
private: System::Void buttonEnter_Click(System::Object^ sender, System::EventArgs^ e) 
{
    String^ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Users.mdb";
    OleDbConnection^ myConnection = gcnew  OleDbConnection(connectionString); // Подключение к БД
    OleDbCommand^ command = myConnection->CreateCommand();
    command->CommandText = "SELECT Count (*) FROM Users WHERE Пользователь = '" + textBoxLogin->Text + "' AND Пароль = '" + textBoxPassword->Text + "'";
    myConnection->Open();
    OleDbDataReader^ dataReader = command->ExecuteReader();
        if (dataReader->Read())
        {
        this->Hide();
        MyMenu^ q = gcnew MyMenu();
        q->Show();
        }
        else
        {
            MessageBox::Show("Пожалуйста введите логин и пароль", "Внимание!", MessageBoxButtons::OK, MessageBoxIcon::Information);
        }
    dataReader->Close();
    myConnection->Close();
}
private: System::Void buttonRegistration_Click(System::Object^ sender, System::EventArgs^ e) 
{
    String^ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Users.mdb";
    OleDbConnection^ myConnection = gcnew  OleDbConnection(connectionString); // Подключение к БД
    myConnection->Open();
    OleDbCommand^ command = myConnection->CreateCommand();
    
    command->CommandText = "INSERT INTO Users (Пользователь, Пароль) VALUES ('" + textBoxNewLogin->Text + "', '" + textBoxNewPassword->Text + "')";
    command->ExecuteNonQuery();
    myConnection->Close();
    MessageBox::Show("Учетная запись успешно создана!", "Внимание!", MessageBoxButtons::OK, MessageBoxIcon::Information);
}
};
}
Ниже код "MyMenu.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "Question1.h"
#include "Titul.h"
 
namespace Kursovaya {
----------------------------------
#pragma region Windows Form Designer generated code
----------------------------------
#pragma endregion
private: System::Void buttonExit_Click(System::Object^ sender, System::EventArgs^ e) 
    {
        Application::Exit();
    }
    private: System::Void buttonTest_Click(System::Object^ sender, System::EventArgs^ e) 
    {
        Question1^ f1 = gcnew Question1();
        f1->Show();
    }
    };
}
И код "Question1.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#pragma once
#include "Question2.h"
#include <string>
 
using namespace Microsoft::VisualBasic;
 
namespace Kursovaya {
----------------------------------
#pragma region Windows Form Designer generated code
----------------------------------
#pragma endregion
private: System::Void buttonNextQuestion_Click(System::Object^ sender, System::EventArgs^ e) 
    {
        int* a = new int[15];
        if (textBoxQuestion1 -> Text == "")
            MessageBox::Show("Вы не ответили на вопрос", "Ошибка!", MessageBoxButtons::OK, MessageBoxIcon::Information);
        else if ((textBoxQuestion1->Text == "Коммутация") || (textBoxQuestion1->Text == "коммутация"))
        {
            int n = n + 1; //
            int rez = 1; //
            a[0] = rez; // тут исходный препода(счетчик вопросов и соответственно ответ верно/не верно)
            
            //output_mass(a, dataGridView1);
            Question2^ f2 = gcnew Question2();
            f2->Show();
            String^ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Users.mdb";
            OleDbConnection^ myConnection = gcnew  OleDbConnection(connectionString); // Подключение к БД
            myConnection->Open();
            OleDbCommand^ command = myConnection->CreateCommand();
            command->CommandText = "INSERT INTO Users ([Вопрос №1]) VALUES (1)"; // эта строчка не работает по понятным причинам
            command->ExecuteNonQuery();
            myConnection->Close();
        }
        else
        {
            int rez = 0;
            a[0] = rez;
            //String^ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Users.mdb";
            //OleDbConnection^ myConnection = gcnew  OleDbConnection(connectionString); // Подключение к БД
            //myConnection->Open();
            //OleDbCommand^ command = myConnection->CreateCommand();
            //command->CommandText = "INSERT INTO Users (Вопрос №1) VALUES ('0')";
            //command->ExecuteNonQuery();
            //myConnection->Close();
            Question2^ f2 = gcnew Question2();
            f2->Show();
        }
    }
    private: System::Void buttonRez_Click(System::Object^ sender, System::EventArgs^ e) 
    {
        Rezult^ f3 = gcnew Rezult();
        f3->Show();
    }
};
}
Надеюсь ничего не забыл.
Буду благодарен за любую помощь
Миниатюры
Авторизация пользователя в программе для тестирования "знаний" (Windows Forms, C++/CLI)   Авторизация пользователя в программе для тестирования "знаний" (Windows Forms, C++/CLI)   Авторизация пользователя в программе для тестирования "знаний" (Windows Forms, C++/CLI)  

Авторизация пользователя в программе для тестирования "знаний" (Windows Forms, C++/CLI)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.03.2020, 21:42
Ответы с готовыми решениями:

Чистые проекты C++/CLI Windows Forms для VS 2012 и VS 2015
Здравствуйте. Как известно, начиная с VS 2012 проекты &quot;C++/CLI Windows Forms&quot; больше не включены в список создаваемых студией проектов....

Организация хранения данных в программе тестирования знаний
Добрый день, форумчане. Возникла необходимость написать программу для тестирования знаний. И тут возник вопрос: где и как лучше...

Добавление картинок к программе тестирования знаний студента
Добрый вечер. Имеется программа тестирования для проверки знаний студента. (вопрос и 4 варианта ответа) Нужен человек, который поможет...

9
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
05.04.2020, 14:58
Добрый день! На мой взгляд, нужно 2 таблицы: первая - для хранения имён пользователей (студентов) и их паролей, вторая - для вопросов и их ответов. В первой таблице следующие поля: ИД (целое последовательное число), Пользователь (тип - короткое текстовое), Пароль (тип - короткое текстовое, если в качестве пароля будут и буквы, и числа). Во второй: ИД (то же, что и в первой таблице), Вопрос (тип - короткое или длинное текстовое в зависимости от длины вопроса), Ответ (тип - логический, если ответы будут типа "да" или "нет"), Пользователь (целое число, это поле подстановки, его значение будет браться из поля ИД первой таблицы).
При входе пользователя данные логина и пароля формы надо сопоставить с Пользователем и Паролем первой таблицы. При этом надо в переменной сохранить его ИД (поле первой таблицы). Когда он будет отвечать во второй таблице, сохранённый ИД надо вставлять в поле Пользователь. Потом будет очень удобно выбирать его ответы через ... WHERE ID=1.
Считаю крайне неразумным логин, пароль, вопросы и ответы хранить в одной таблице. Если же проблема стоит ребром, что сделать надо в одной таблице, тогда напишу другой ответ.

Добавлено через 22 минуты
Нужно и третья таблица. В третьей таблице поля: ИД вопроса, Вопрос (длинное целое). Во второй таблице поле Вопрос надо изменить на поле подстановки (ИД вопроса) из третьей таблицы.
1
0 / 0 / 0
Регистрация: 31.03.2020
Сообщений: 6
06.04.2020, 14:16  [ТС]
Добрый день, вы сказали: "При входе пользователя данные логина и пароля формы надо сопоставить с Пользователем и Паролем первой таблицы. При этом надо в переменной сохранить его ИД (поле первой таблицы). Когда он будет отвечать во второй таблице, сохранённый ИД надо вставлять в поле Пользователь. Потом будет очень удобно выбирать его ответы через ... WHERE ID=1."
Не совсем понимаю, как мне обратиться к переменной, которая будет в 1-ой форме(Titul.h) в которой я буду хранить ID из второй формы (MyMenu.h)?
Полностью с вами согласен по поводу хранения вопросов в одной таблице с логином и паролем, поэтому создал 3 таблицы.
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
06.04.2020, 15:59
Лучший ответ Сообщение было отмечено SafKill как решение

Решение

Вы ведь сами сказали: "Создана база данных MS Access(пользователь, пароль, вопрос 1 и т.д.). ". Я понял так, что в БД Акцесс надо хранить пользователей (логины) и пароли.
Итак, как я считаю всё должно выглядеть. При регистрации студента он в форме должен указать свои ФИО, логин и пароль (три поля редактирования). При нажатии на ОК создаются три переменные для каждого поля редактирования, делается запрос к БД, в таблице Пользователи создаётся новая запись: полю ФИО присваивается значение переменной, хранящей ФИО из поля редактирования формы, полю Логин присваивается значение переменной, хранящей значение логина из поля редактирования формы, полю Пароль присваивается значение переменной, хранящей значение пароля из поля редактирования формы. Регистрация нового пользователя произошла.
В следующий раз при авторизации студент будет вводить только значения логина и пароля в поля редактирования формы. При нажатии на ОК создаются 2 переменные, им присваиваются значения полей редактирования (введённые логин и пароль). Далее делается запрос к БД к таблице Пользователи. В этом запросе через WHERE указываются логин и пароль. Если такая запись в этой таблице существует, то надо создать ещё одну переменную, которая будет хранить значение поля ИД из этой таблицы Пользователи. Когда потом студент ответит на вопросы, в БД в таблицу Ответы будут внесены его ответы, а эта переменная сделает запись в поле ИД Пользователи уже таблицы Ответы для того, чтобы было понятно, чей ответ на какой вопрос хранит эта таблица. После этого делается следующий запрос к БД, но уже к таблице Вопросы. Вопросы из таблицы Вопросы выдаются в новую форму, например, через DataGridView.
Т.к. в таблице Вопросы Базы Данных есть только 2 поля, БД может выдать только их. Для студента нужно напротив каждого вопроса проставлять ответы. Для этого в DataGridView надо добавить столбец Ответы (тип bool, в DataGridView можно оформить в виде переключателей RadioBotton или ещё каких-либо флажков, если ответы предполагаются в виде Да или Нет, если иначе, то тип стринг). Студент пощёлкал по Да или нет напротив вопроса, жмёт на кнопку Ответы готовы.
Итак, у нас есть значение переменной, которая хранит ИД пользователя, есть DataGridView с ИД вопроса, вопросом и ответом. Теперь надо извлечь через цикл значения DataGridView в массив, например, сделать запрос к БД с внесением новых записей из этого массива в таблицу Ответы, не забыв вносить в поле этой таблицы ИД пользователя (или студента) сохранённый в переменной ИД пользователя.
Касаемо обращения к переменной: её можно сделать "видимой" с помощью public или передать в качестве аргумента в функцию. Лучше покажите коды из обеих форм, чтобы было понятнее, о чём речь.
Если что-то непонятно написал, спрашивайте!

Добавлено через 30 минут
Вот БД: https://cloud.mail.ru/public/qDBo/2AV3xHxr7
1
0 / 0 / 0
Регистрация: 31.03.2020
Сообщений: 6
06.04.2020, 17:43  [ТС]
Переделал кое-что. БД такая же как у Вас, только названия таблиц на английской)
Примерно представляю что дальше делать, но скорее всего еще Вам напишу здесь

Код кнопки для входа

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private: System::Void buttonEnter_Click(System::Object^ sender, System::EventArgs^ e) 
{
    String^ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Users.mdb";
    OleDbConnection^ myConnection = gcnew  OleDbConnection(connectionString); // Подключение к БД
    OleDbCommand^ command = myConnection->CreateCommand();
    String^ log = textBoxLogin->Text;
    String^ pass = textBoxPassword->Text;
    command->CommandText = "SELECT Count (*) FROM Users WHERE Логин = '" + log + "' AND Пароль = '" + pass + "'";
    //Далее создал переменную ID, но не уверен в правильности запроса
    String^ ID = "SELECT [ИД пользователя] FROM Users WHERE Логин = '" + log + "' AND Пароль = '" + pass + "'";
    
    myConnection->Open();
    OleDbDataReader^ dataReader = command->ExecuteReader();
        if (dataReader->Read())
        {
        this->Hide();
        MyMenu^ t = gcnew MyMenu;
        t->Show();
        }
        else
        {
            MessageBox::Show("Пожалуйста введите логин и пароль", "Внимание!", MessageBoxButtons::OK, MessageBoxIcon::Information);
        }
    dataReader->Close();
    myConnection->Close();
}
Код кнопки для регистрации

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private: System::Void buttonRegistration_Click(System::Object^ sender, System::EventArgs^ e) 
{
    String^ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Users.mdb";
    OleDbConnection^ myConnection = gcnew  OleDbConnection(connectionString); // Подключение к БД
    myConnection->Open();
    OleDbCommand^ command = myConnection->CreateCommand();
    
    String^ FIO = textBoxFIO->Text;
    String^ Login =  textBoxNewLogin->Text;
    String^ Password = textBoxNewPassword->Text;
 
    command->CommandText = "INSERT INTO Users (ФИО, Логин, Пароль) VALUES ('" + FIO + "', '" + Login + "', '" + Password + "')";
    command->ExecuteNonQuery();
    myConnection->Close();
    MessageBox::Show("Учетная запись успешно создана!", "Внимание!", MessageBoxButtons::OK, MessageBoxIcon::Information);
}
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
06.04.2020, 21:09
Лучший ответ Сообщение было отмечено SafKill как решение

Решение

Комментирую первый код.
В 3-й строке указан старый провайдер:
C++
1
Provider=Microsoft.Jet.OLEDB.4.0
Скорее всего Вы списываете у старых своих предшественников, о чём преподаватель догадается. Далее в строке указано:
C++
1
Data Source=Users.mdb
А где путь к этой БД? Комп сам искать не умеет. Да и расширение БД тоже старое. Я, например, в качестве образца дал ссылку на БД с рассширением accdb.
Запрос из 8-й строки вернёт количество записей с указанными логином и паролем. Можно без запроса догадаться, что такая запись будет одна. Такой запрос теряет смысл. Строка запроса должна быть, как в 10-й строке кода, нам нужен ИД пользователя. Кстати, при создании учётной записи пользователей надо предусмотреть, чтобы у них не было одинаковых логинов.
10-я строка: ID - это целое число, поэтому переменная должна быть не стринг, а int. Эту переменную достаточно здесь объявить, не определяя её.
А вот дальше, в 13-й строке, когда мы получим результат запроса (а в результате мы получим ИД пользователя), мы должны присвоить переменной из 10-й строки результат запроса.
В 17 строке я не понял, зачем меню. Здесь нам надо показать следующую форму (Form). На этой форме должен быть DataGridView.
Уже в новой форме надо вновь сделать запрос к БД к таблице Вопросы (выбрать из этой таблицы вопросы). Результатом запроса нужно заполнить DataGridView. При этом надо не забыть добавить столбец в DataGridView, чтобы можно было в строках столбца отмечать Да или Нет.
Комментарий второго кода.
Строка 3: по поводу провайдера и ДатаСурс я уже высказался в комментарии к первому коду.
Строка 4: я сильно сомневаюсь, что при таком коде произойдёт подключение к БД. Насколько я знаю, там много параметров, а у Вас только строка о провайдере и ДатаСурсе. Вот, например, моё подключение:
C++
1
_bstr_t strCnn("Provider='Microsoft.ACE.OLEDB.16.0'; Data Source='D:\\Parik.accdb'; ''; ''; 0");
Я здесь кроме строки подключения указываю пустые логин и пароль.
Остальное примерно правильно. Напомню, что было бы неплохо здесь сделать проверку на наличие пользователя с таким же логином, чтобы не было двух пользователей с одним и тем же логином.
1
0 / 0 / 0
Регистрация: 31.03.2020
Сообщений: 6
10.04.2020, 17:26  [ТС]
И все таки как мне переменную ID сделать доступной из других форм? Пытался сделать через public, VS отвечает, что нужен спецификатор типа, в конструкторе тоже не получается объявить. Здесь пытался в кнопке, но тоже думаю неправильно, подскажите пожалуйста. В int не присвоить, если писать как я, скорее всего тут нужен другой синтаксис, но какой?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private: System::Void buttonEnter_Click(System::Object^ sender, System::EventArgs^ e) 
{
    String^ connectionString = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=Users.mdb";
    OleDbConnection^ myConnection = gcnew  OleDbConnection(connectionString); // Подключение к БД
    OleDbCommand^ command = myConnection->CreateCommand();
    String^ log = textBoxLogin->Text;
    String^ pass = textBoxPassword->Text;
    command->CommandText = "SELECT [ИД пользователя] FROM Users WHERE Логин = '" + log + "' AND Пароль = '" + pass + "'";
    //Далее создал переменную ID, но не уверен в правильности запроса
    int ID;
    
    myConnection->Open();
    
    OleDbDataReader^ dataReader = command->ExecuteReader();
    auto ID = gcnew OleDbCommand("SELECT @ID = [ИД пользователя] FROM Users WHERE Логин = '" + log + "' AND Пароль = '" + pass + "'");
        if (dataReader->Read())
        {
        this->Hide();
        MyMenu^ t = gcnew MyMenu;
        t->Show();
        }
        else
        {
            MessageBox::Show("Пожалуйста введите логин и пароль", "Внимание!", MessageBoxButtons::OK, MessageBoxIcon::Information);
        }
    dataReader->Close();
    myConnection->Close();
}
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
11.04.2020, 08:48
Лучший ответ Сообщение было отмечено SafKill как решение

Решение

Итак, переменная ID хранит ИД пользователя. Ид пользователя находится в таблице "Users", поле "ИД пользователя". Нужно сделать запрос к БД, из этой таблицы взять значение "ИД пользователя" и присвоить переменной ID.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string connectionString = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source='C:\\Users.mdb'; ' '; ' '; 0";
 
string queryString = "SELECT [ИД пользователя] FROM Users WHERE Логин = '" + log + "' AND Пароль = '" + pass + "'";
 
using (OleDbConnection myConnection = new OleDbConnection(connectionString))
    {
        OleDbCommand command = new OleDbCommand(queryString, myConnection);
 
        myConnection.Open();
 
        OleDbDataReader dataReader = command.ExecuteReader();
 
        int ID = dataReader[0]; 
 
//или
 
         int ID = dataReader.GetInt32(0)
      }
Примерно так.
Посмотрел Ваш код, создалось впечатление, что Вы вообще не понимаете что к чему ) Неужели Ваш код работает?
1
0 / 0 / 0
Регистрация: 31.03.2020
Сообщений: 6
12.04.2020, 21:38  [ТС]
Не знаю как у Вас, но у меня using не работает так, что это вообще за конструкция? Я видел в c# такое работает, но в плюсах первый раз вижу.
Миниатюры
Авторизация пользователя в программе для тестирования "знаний" (Windows Forms, C++/CLI)  
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
13.04.2020, 08:23
Верно, уберите using.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2020, 08:23
Помогаю со студенческими работами здесь

C++/CLI Windows Forms
Помогите пожалуйста, 1 и 2 кнопку сделала, а вот с 3 и 4 проблемы возникли(( Создать проект, содержащий 4 кнопки со следующими...

Литература по C++/CLI Windows Forms
Народ, подскажите путевый учебник или самоучитель по Windows Forms на C++.

Литература по C++/CLI Windows Forms
Хочу начать учить Windows Forms, но в интернете никакой литературы найти не могу! Подскажите хорошие книги.

Теория по C++/CLI Windows Forms
Доброе утро:) На носу сдача курсовой, назрели некоторые вопросы по теории (определениям) winforms. 1)public ref class Form1 :...

Создание приложения Windows Forms на C++/CLI в Windows 8
Добрый день! Нужно создать windows приложение на Си++, стоит 8, на 2013 много заморочек с созданием windows forms. Не подскажите, можно ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru