Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22

Программа-склад с нуля

27.05.2015, 08:55. Показов 5179. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создаю общую тему, а не кучку маленьких. Надеюсь это послужит своеобразной инструкцией для начинающих, по устранению ошибок при создании программы склада.

Сразу признаюсь, знаний очень мало по программированию. Но поставил цель - до конца недели написать данную прогу. Параллельно читаю различную инфу на форуме и копаюсь в msdn.

Функционал проги:
- добавление данных;
- отображение данных (по одному объекту, по 10, в виде таблицы);
- удаление данных об объектах (удаление по указанному критерию);
- поиск и фильтрация данных (возможность задания разных критериев, минимум 3 критерия);
- подсчет каких-либо суммарных характеристик, например количество записей с определенным значением какого-либо поля (минимум 2 характеристики);
- сортировка (по нескольким критериям).
Данные об объектах должны быть оформлены в виде пользовательских типов данных - структур (struct). Для каждого объекта своя структура. Для каждого объекта создается отдельный бинарный файл.

Начал с создания формы. За основу взял DataGridView (она уже решает такие вопросы как добавление, удаление и сортировку файлов). Теперь разбираюсь что такое #pragma once, #pragma region и т.п. заголовки и их содержимое, чтобы в итоге понимать куда и какой код писать (думаю, перво-наперво нужно узнать как присвоить значение ячейки в переменную, и вывести эту переменную структуры на экран, дабы убедиться, что всё как нужно присваивается).
С радостью приму конструктивные замечания и советы

Файл с проектом прилагаю.
Вложения
Тип файла: rar Sklad.rar (721.4 Кб, 127 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2015, 08:55
Ответы с готовыми решениями:

Программа склад
Надо создать такую программу чтобы программа принимала товары в склад и отправляла со склада. Если название товара которого мы принимаем...

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

программа склад
Здраствуйте всем у меня такой вопрос: Подключил бд(Access), она читается в dbgrid, в dbedit считывается нужное поле (кол-во), и написал...

18
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
28.05.2015, 21:50  [ТС]
Изучил немного ООП.
Хочу вывести значение переменной kodT через нажатие кнопки. TextBox::Show() ругается - error C2660: System::Windows::Forms::Control::Show: функция не принимает 1 аргументов.

C++ Скопировано
1
2
3
4
5
6
    private: System::Void buttonShowOne_Click(System::Object^  sender, System::EventArgs^  e) {}
            
             void setZn (int kodTovara){
 
            this->dataGridViewProduct->Rows[0]->Cells[0]->Value = kodT;
             }
Добавлено через 1 час 50 минут
Ещё такой вариант
C++ Скопировано
1
2
     kodT = System::Convert::ToInt32(dataGridViewProduct->Rows[1]->Cells[1]->Value);
                 MessageBox::Show(kodT.ToString());
Он без ошибок, но окно с сообщением не выводит.

Добавлено через 19 часов 27 минут
Нашёлся способ безболезненно вывести значение ячейки:
C++ Скопировано
1
2
3
4
5
private: System::Void buttonShowOne_Click(System::Object^  sender, System::EventArgs^  e) 
         {
                String^ tmp = dataGridViewProduct[0,0]->Value->ToString();
                MessageBox::Show(tmp);
         }
Теперь нужно задать структуру с динамическими массивами. И организовать заполнение этих массивов с учётом неизвестного количества заполненных строк. Думаю над чем-то подобным:
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
struct goods 
    {
        int *KodT;
        char *Naimenov;
        char *EdIzm;
        int *Kolvo;
        double *Cena;
        char *KodP;
    };
 
    int *KodT = new int [5];
    char *Naimenov = new char [20];
    char *EdIzm = new char [5];
    int *Kolvo = new int [5];
    double *Cena = new double [7];
    char *KodP = new char [4];
 
{
             for (int x(0);x<=1000;x++)
             {  
                 for (int y(0);y<=5;y++)
                {
                    if ([x,y] значение у этой у ячкейки есть?)
                    {
                        int n;
                        знач. [x,y] = n;
                        switch (y)
                        {
                        case 0:
                            {
                                n = KodT[x];
                                break;
                            }
                        case 1: 
                            {
                                n = Naimenov[x];
                                break;
                            }
                        case 2: 
                            {
                                n = EdIzm[x];
                                break;
                            }
                        case 3: 
                            {
                                n = KolvoT[x];
                                break;
                            }
                        case 4: 
                            {
                                n = Cena[x];
                                break;
                            }
                        case 5: 
                            {
                                n = KodP[x];
                                break;
                            }
                            default:; 
                        }
                        
                    } 
                    else
                    {
                        выход из цикла for                  
                    }
             }
             }
 
             
         }
Добавлено через 9 часов 20 минут
Практически решение:

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
private: System::Void buttonSave_Click(System::Object^  sender, System::EventArgs^  e) 
         { 
             for (int y(0);y<=1000;y++)
             {  
                 for (int x(0);x<=5;x++)
                {
                    if (dataGridViewProduct[x,y]->Value != nullptr)
                        //|| String::IsNullOrWhiteSpace(dataGridViewProduct->[x,y]->Value->ToString()) ))
                    {
                        int intt;
                        wchar_t chart;
                        double doublet;
                        
                        intt = Convert::ToInt32(dataGridViewProduct[x,y]->Value);
                        chart = Convert::ToChar(dataGridViewProduct[x,y]->Value);
                        doublet = Convert::ToDouble(dataGridViewProduct[x,y]->Value);
 
                        switch (x)
                        {
                        case 0:
                            {
                                KodT[y] = intt;
                                break;
                            }
                        case 1: 
                            {
                                Naimenov[0][y] = chart; // тут попытка многомерному массиву значение предать
                                break;
                            }
                        case 2: 
                            {
                                EdIzm[y] = chart;
                                break;
                            }
                        case 3: 
                            {
                                Kolvo[y] = intt;
                                break;
                            }
                        case 4: 
                            {
                                Cena[y] = doublet;
                                break;
                            }
                        case 5: 
                            {
                                KodP[y] = chart;
                                break;
                            }
                            default:; 
                        }
                        
                    } 
                    else
                    {
                        goto vihod;                 
                    }
             }
             } 
            vihod: MessageBox::Show("I saved!",":D");
             
             
         }
Остался вопрос как инициализировать массив динамический "Naimenov".

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
struct goods 
    {
        int *KodT;
        char **Naimenov;
        char *EdIzm;
        int *Kolvo;
        double *Cena;
        char *KodP;
    };
 
    void setNaim () 
    {
        char **Naimenov = new char *[5];
        for (int r=0;r<5;r++)
            {
                Naimenov[r] = new char [10];
            };
    }
    
              char *EdIzm = new char [5];
          int *Kolvo = new int [5];
          double *Cena = new double [7];
          char *KodP = new char [4];
          int *KodT = new int [5];
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9649 / 4802 / 762
Регистрация: 17.04.2012
Сообщений: 9,638
Записей в блоге: 14
29.05.2015, 19:29
По поводу массивов - раз используете C++/CLI, проще и безопаснее будет использовать управляемые массивы - array<T>.
C++ Скопировано
1
array<char>^ EdIzm = gcnew array<char>(5);
и так далее.
1
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
31.05.2015, 09:44  [ТС]
Цитата Сообщение от tezaurismosis Посмотреть сообщение
По поводу массивов - раз используете C++/CLI, проще и безопаснее будет использовать управляемые массивы - array<T>.
C++ Скопировано
1
array<char>^ EdIzm = gcnew array<char>(5);
и так далее.
Ещё есть идея делать через System::String^ , но мне как и в случае с array<char>^ нужен управляемый класс. Ссылочный даже. А пока у меня структура просто лежит сама по себе, а должна быть основой всей программы, т.к. содержать в себе будет все данные из таблицы. Получается, нужно организовать ссылочный управляемый класс со структурой.

Добавлено через 13 часов 44 минуты
При этом управляемый массив должен быть динамическим! Т.к. количество строк, повторюсь, будет неизвестно изначально.
И вот его-то нужно запихать в структуру...

Добавлено через 10 часов 12 минут
Рабочая версия структура выглядит так:

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <string>
using namespace std;
using namespace System;
 
 
ref class GOODS
{
 
public:
     ref struct goods
    {
        
        static array<int>^ KodT = gcnew array<int>(5); 
        static array<String^>^ Naimenov = gcnew array<String^>(5); 
        static array<String^>^ EdIzm = gcnew array<String^>(5);
        static array<int>^ Kolvo = gcnew array<int>(5);
        static array<double>^ Cena = gcnew array<double>(7);
        static array<String^>^ KodP = gcnew array<String^>(4);
    };
};
Функция в теле класса FORM вот:

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
private: System::Void buttonSave_Click(System::Object^  sender, System::EventArgs^  e) 
         { 
             for (int y(0);y<=1000;y++)
             {  
                 for (int x(0);x<=5;x++)
                {
                    if (dataGridViewProduct[x,y]->Value != nullptr)
                        //|| String::IsNullOrWhiteSpace(dataGridViewProduct->[x,y]->Value->ToString()) )) - добавка к определителю пустой ячейки
                    {
                        
                        int intt;
                        array<String^>^ chart = gcnew array<String^>(5);
                        double doublet;
 
                        switch (x)
                        {
                        
                            case 0:
                                {
                                    intt = Convert::ToInt32(dataGridViewProduct[x,y]->Value);
                                    break;
                                }
                            case 1: 
                                {
                                    chart[0] = Convert::ToString(dataGridViewProduct[x,y]->Value);
                                    break;
                                }
                            case 2: 
                                {
                                    chart[0] = Convert::ToString(dataGridViewProduct[x,y]->Value);
                                    break;
                                }
                            case 3: 
                                {
                                    intt = Convert::ToInt32(dataGridViewProduct[x,y]->Value);
                                    break;
                                }
                            case 4: 
                                {
                                    doublet = Convert::ToDouble(dataGridViewProduct[x,y]->Value);
                                    break;
                                }
                            case 5: 
                                {
                                    chart[0] = Convert::ToString(dataGridViewProduct[x,y]->Value);
                                    break;
                                }
                            default:; 
                            }
                        
                        switch (x)
                        {
                        case 0:
                            {
                                GOODS::goods::KodT[y] = intt;
                                break;
                            }
                        case 1: 
                            {
                                GOODS::goods::Naimenov[y] = chart[0];
                                break;
                            }
                        case 2: 
                            {
                                GOODS::goods::EdIzm[y] = chart[0];
                                break;
                            }
                        case 3: 
                            {
                                GOODS::goods::Kolvo[y] = intt;
                                break;
                            }
                        case 4: 
                            {
                                GOODS::goods::Cena[y] = doublet;
                                break;
                            }
                        case 5: 
                            {
                                GOODS::goods::KodP[y] = chart[0];
                                break;
                            }
                            default:; 
                        }
                        
                    } 
                    else
                    {
                        goto vihod;                 
                    }
             }
             } 
            vihod: System::Windows::Forms::MessageBox::Show("I saved!",":D");
             
             
         }
Добавлено через 10 часов 28 минут
Ищу способ отображения по 1/10/все строки таблицы.
Предполагаю, что отображение необходимого количества строк будет определяться выделением строки (после неё, например, 1/10 строк видны, а все остальные прячутся).
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9649 / 4802 / 762
Регистрация: 17.04.2012
Сообщений: 9,638
Записей в блоге: 14
31.05.2015, 10:57
Dusty, я немного неудачный пример привел - действительно, строки удобнее представлять как System::String^. Я хотел сказать о других массивах - double *Cena, например.
Цитата Сообщение от Dusty Посмотреть сообщение
System::String^ , но мне как и в случае с array<char>^ нужен управляемый класс. Ссылочный даже
System::String^ и управляемый, и ссылочный.
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
31.05.2015, 17:32  [ТС]
Работает!

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
private: System::Void buttonShowOne_Click(System::Object^  sender, System::EventArgs^  e) 
         {
 
             for (int i=0;i<1000;i++)
             {
                 if (dataGridViewProduct[0,i]->Value != nullptr)
                 { 
                     if (dataGridViewProduct->Rows[i] == dataGridViewProduct->CurrentRow)
                     {
                         dataGridViewProduct->Rows[i]->Visible = true;
                     } 
                     else
                     { 
                         dataGridViewProduct->Rows[i]->Visible = false;
                     }
                 }
 
                 else {goto vihod;};
             } vihod:;              
             
         }
private: System::Void buttonShowTen_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             for (int i=0;i<1000;i++)
             {
                 if (dataGridViewProduct[0,i]->Value != nullptr)
                 { 
                     if (dataGridViewProduct->Rows[i] == dataGridViewProduct->CurrentRow)
                     {
                         dataGridViewProduct->Rows[i]->Visible = true;
                         i = i+9;
                     } 
                     else
                     { 
                         dataGridViewProduct->Rows[i]->Visible = false;
                     }
                 }
 
                 else {goto vihod;};
             } vihod:;          
 
         }
private: System::Void buttonShowTable_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             for (int i=0;i<1000;i++)
             {
                 if (dataGridViewProduct[0,i]->Value != nullptr)
                 { 
                      dataGridViewProduct->Rows[i]->Visible = true;
                 } 
                
                 else {goto vihod;};
             } vihod:;
         }
Перелистывать только нельзя (на следующие 10, например).


Теперь на очереди понять как создать для пользователя поиск и фильтр по данным DataGridView.


Добавлено через 24 минуты
По отображению ещё. Ошибку выдаёт кнопка "по 10", если после выделенной строки нет 10 строк. Проблема в том, что я не знаю как программе дать понять, что строка имеет не нулевое значение, а её вовсе строки нет Как-то давать её проверять наличие 10-ти строк, что ли.

Добавлено через 2 часа 11 минут
Поиск ищет
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
private: System::Void button1_Click_1(System::Object^  sender, System::EventArgs^  e) 
         {
 
             for (int i=0;i<1000;i++)
             {
                 if (dataGridViewProduct[0,i]->Value != nullptr)
                 { 
                     dataGridViewProduct->Rows[i]->Visible = false;
                 } 
 
                 else {goto vihod;};
             } vihod:;
            
 
            int com = comboBoxP->SelectedIndex;
            int textPI;
            array<String^>^ textPS = gcnew array<String^>(5);
 
            switch (com)
            {
            case 0:
                {
                    textPI = Convert::ToInt32(textBoxPolePoiska->Text);
                    for (int i=0;i<1000;i++)
                    {
                        if (GOODS::goods::KodT[i] != 0)
                        {
                            if (GOODS::goods::KodT[i] == textPI)
                            {
                                dataGridViewProduct->Rows[i]->Visible = true;
                            }
                        }
                        else 
                        {
                            goto vihod1;
                        }   
                                                
                    }
                    break;
                }
            case 1: 
                {
                    textPS[0] = textBoxPolePoiska->Text;
                    for (int i=0;i<1000;i++)
                    {
                        if (GOODS::goods::Naimenov[i] != nullptr)
                        {
                            if (GOODS::goods::Naimenov[i] == textPS[0])
                            {
                                dataGridViewProduct->Rows[i]->Visible = true;
                            }
                        }
                        else 
                        {
                            goto vihod2;
                        }   
 
                    }
                    break;
                }
            case 2: 
                {
                    textPS[0] = textBoxPolePoiska->Text;
                    for (int i=0;i<1000;i++)
                    {
                        if (GOODS::goods::KodP[i] != nullptr)
                        {
                            if (GOODS::goods::KodP[i] == textPS[0])
                            {
                                dataGridViewProduct->Rows[i]->Visible = true;
                            }
                        }
                        else 
                        {
                            goto vihod3;
                        }
                    }
                    break;
                }
            default:;
            }
            vihod1:;
            vihod2:;
            vihod3:;
 
 
         }
Теперь очередь фильтра
Выявить принцип сравнения данных в структуре массивов.

Добавлено через 3 часа 15 минут
И пока я не знаю как вызвать СheckListBox по нажатию кнопки (в новом окне или в той же форме). По замыслу он заполнится данными из массива отфильтрованных значений. И вот уже у этих значений убираем галки, жмём "ОК" и видим список в табличке с отфильтрованными данными.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9649 / 4802 / 762
Регистрация: 17.04.2012
Сообщений: 9,638
Записей в блоге: 14
31.05.2015, 19:47
Цитата Сообщение от Dusty Посмотреть сообщение
как вызвать СheckListBox по нажатию кнопки
Динамическое добавление компонентов делается например так
C++ Скопировано
1
2
СheckListBox^ checkListBox1 = gcnew СheckListBox();
checkListBox1->Parent = this;
Это записывается в обработчик события Click кнопки.
По коду:
C++ Скопировано
1
2
      else {goto vihod;};
} vihod:;
Очень необычный код, это что им пытаетесь сделать? Если нужно выйти из цикла - break, если принудительно запустить следующую итерацию - continue, а если участок кода в конце блока с циклом, то можно вообще ничего не писать, он сам продолжится дальше.
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
31.05.2015, 20:09  [ТС]
Цитата Сообщение от tezaurismosis Посмотреть сообщение
По коду:
C++ Скопировано
1
2
else {goto vihod;};
} vihod:;
Очень необычный код, это что им пытаетесь сделать? Если нужно выйти из цикла - break, если принудительно запустить следующую итерацию - continue, а если участок кода в конце блока с циклом, то можно вообще ничего не писать, он сам продолжится дальше.
Это я так криво из цикла выхожу.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9649 / 4802 / 762
Регистрация: 17.04.2012
Сообщений: 9,638
Записей в блоге: 14
31.05.2015, 20:22
Цитата Сообщение от Dusty Посмотреть сообщение
Это я так криво из цикла выхожу.
Не выходите криво, выходите прямо - используйте break
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
13.02.2016, 12:54  [ТС]
Я возвращаюсь чтобы доделать программу

Цитата Сообщение от Dusty Посмотреть сообщение
Рабочая версия структура выглядит так:

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include <string>
using namespace std;
using namespace System;
ref class GOODS
{
public:
    ref struct goods
    {
        static array<int>^ KodT = gcnew array<int>(5);
        static array<String^>^ Naimenov = gcnew array<String^>(5);
        static array<String^>^ EdIzm = gcnew array<String^>(5);
        static array<int>^ Kolvo = gcnew array<int>(5);
        static array<double>^ Cena = gcnew array<double>(7);
        static array<String^>^ KodP = gcnew array<String^>(4);
    };
};
Нифига она не рабочая. Т.е. она работает, конечно, но не выполняет условий "увеличение массива во время работы программы". Вычитал, что в С++ для этого существуют векторы. А любые динамические массивы по факту массивы переменной длинны. Если захочешь увеличивать место в массиве, будь добр создать новый, побольше, и перенести туда данные со старого.
Поэтому решением в данных условиях считаю создание изначально массива с запасом ячеек.
Например: "static array<int>^ KodT = gcnew array<int>(1000);". Грубо, конечно. Зато условия выполнены
0
Эксперт .NET
 Аватар для Usaga
12850 / 8880 / 1321
Регистрация: 21.01.2016
Сообщений: 33,358
13.02.2016, 16:16
Цитата Сообщение от Dusty Посмотреть сообщение
"увеличение массива во время работы программы"
Кто мешает использовать контейнеры? В C++\CLI для управляемого кода используйте контейнеры из .NET (List<String^>), для неуправляемого - контейнеры из STL (std::vector<std::string>).
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
13.02.2016, 16:21  [ТС]
Не подумал о них
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
24.02.2016, 00:52  [ТС]
Переиначил главную структуру в программе (напомню что она в отдельном файле "GOODS.h", основной проект с таблицей и прочими вычислениями находятся отдельно от структуры, в файле "Form1.h"). Теперь она будет выглядеть примерно так:

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class GOODS
{ 
public: 
     struct goods 
    {
        vector <int> KodT;
            ...      // и т.д.
        
     goods ()             //конструктор
     { 
           goods tovar;
               tovar.KodT;
                ...      // и т.д.
     }
     };
И всё вроде хорошо, но присвоить значение члену структуры "tovar.KodT" в "Form1.h" проблематично, т.к. такую запись:

C++ Скопировано
1
2
3
4
 private: System::Void buttonSave_Click(System::Object^  sender, System::EventArgs^  e)
    { ...
               GOODS::goods()::KodT.push_back(intt);  // тут intt переменная типа int 
        };
компилятор ругает.

error C2039: KodT: не является членом "`global namespace'"
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "KodT"
error C2065: KodT: необъявленный идентификатор
error C2228: выражение слева от ".push_back" должно представлять класс, структуру или объединение
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
28.02.2016, 20:53  [ТС]
Упростил свои структуры до нельзя:

C++ Скопировано
1
2
3
4
5
6
7
8
9
class GOODS 
{
 
public: 
     struct goods 
    {   
        int KodI;
        double KodD;
    }TOVAR, POSTAV;
И всё равно, если вызывать в "Form1.h" так:
C++ Скопировано
1
GOODS::TOVAR.KodI = intt;
Ругает - "error C2228: выражение слева от ".KodI" должно представлять класс, структуру или объединение"

Т.е. не видит компилятор, что это структура. Тупик.

Теперь буду с помощью формул в "GOODS.h" из "Form1.h" переносить все действия по заполнению структуры. В эту сторону может заработает

Добавлено через 5 часов 28 минут
Переделал. Теперь обращаюсь из "Form1.h" в "GOODS.h" посредством функций:

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 struct goods
    {   
        vector <int> KodT;
        double KodD;
    }TOVAR, POSTAV;
    
     static goods TovKodT (int a)
     { 
         goods TOVAR;
         TOVAR.KodT.push_back(a);
         return TOVAR;
     }
 
     static goods TovKodD (double a)
     { 
         goods TOVAR;
         TOVAR.KodD = a;
         return TOVAR;
     }
НО, не возвращается структура "TOVAR" с обновлённым значением: "KodT" равен 0. В отличие от "KodD", значение которого на месте.

Добавлено через 30 минут
Похоже что в функциях объявление
C++ Скопировано
1
goods TOVAR;
приводит к потере предыдущих значений этой структуры.
По факту нужно передавать изменяющуюся структуру всем функциям поочерёдно. Но как... В сторону указателей смотреть буду. Может в них решение.
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
19.03.2016, 17:39  [ТС]
Решилось
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
struct goods
    {   
        vector <int> KodT;
        vector <string> Naim;
        vector <string> EdIzm;
        vector <int> Kolvo;
        vector <double> Cena;
        vector <string> KodP;
 
    }TOVAR, POSTAV;
 
 
    static goods FormKodT (int a)
    {   
        goods VremStrKodT;
        VremStrKodT = TOVAR;
        VremStrKodT.KodT.push_back(a);
        return VremStrKodT;
    }
    
    static goods FormNaim (string a)
    { 
        goods VremStrNaim;
        VremStrNaim = TOVAR;
        VremStrNaim.Naim.push_back(a);
        return VremStrNaim;
    }
 
    static goods FormEdIzm (string a)
    { 
        goods VremStrEdIzm;
        VremStrEdIzm = TOVAR;
        VremStrEdIzm.EdIzm.push_back(a);
        return VremStrEdIzm;
    }
 
    static goods FormKolvo (int a)
    {   
        goods VremStrKolvo;
        VremStrKolvo = TOVAR;
        VremStrKolvo.Kolvo.push_back(a);
        return VremStrKolvo;
    }
 
    static goods FormCena (double a)
    {   
        goods VremStrCena;
        VremStrCena = TOVAR;
        VremStrCena.Cena.push_back(a);
        return VremStrCena;
    }
 
    static goods FormKodP (string a)
    { 
        goods VremStrKodP;
        VremStrKodP = TOVAR;
        VremStrKodP.KodP.push_back(a);
        return VremStrKodP;
    }
Передаю значения из ячеек. Всё работает.

Появилась новая задачка: пронумеровать строки.
Есть первый столбец в DataGridView, он идёт как заглавный для строк, RowHeader называется. Там-то и нужно проставить циферки от 1 и далее (пометил жёлтым цветом на картинке). Не так просто, как оказалось. Очень много инфы с кодом C# (фиг разберёшься), но C++ не нашёл.
Изображения
 
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
20.03.2016, 13:23  [ТС]
Неотзывчиво как-то, товарищи

Решение следующее:
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
// создаём делегата
void InitializeComponent(void)
        {
this->dataGridViewProduct->RowStateChanged += gcnew System::Windows::Forms::DataGridViewRowStateChangedEventHandler(this, &Form1::dGVP_RowStateChanged);
}
 
#pragma endregion
// саму функцию      
        private: System::Void dGVP_RowStateChanged(System::Object^  sender, System::Windows::Forms::DataGridViewRowStateChangedEventArgs^ e) 
        {  
            e->Row->HeaderCell->Value = (e->Row->Index + 1).ToString(); //задаём значение заглавной ячеки строки
        } 
};
Привязал к событию RowStateChanged (возникает при изменении состояния строки).
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
26.03.2016, 15:48  [ТС]
Чтобы уйти со строки, необходимо заполнить все её ячейки.
Придумал прикурчивать к событию это:
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i(0);i<6;i++)
             { 
                 int ir (dataGridViewProduct->CurrentRow->Index);
                 int rc (dataGridViewProduct->RowCount);
 
                 if (dataGridViewProduct[i,ir]->Value == nullptr && (++ir != rc)) 
                 {                   
                     MessageBox::Show("Cтрока № " + ir.ToString() + " заполнена не полностью!",":(");
                         dataGridViewProduct->ClearSelection();
                     dataGridViewProduct->CurrentCell = *** // вот тут как?
                     break;
                 }
                
             }
Решение C# не помогает:
C# Скопировано
1
2
3
datagrid.CurrentCell.Selected = false;
datagrid.CurrentCell = datagrid.Rows[RowIndex].Cells[ColumnIndex];
datagrid.Rows[RowIndex].Cells[ColumnIndex].Selected = true;
Кто-нибудь
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
28.03.2016, 22:46  [ТС]
Решения пока нет.
Перепробовал кучу событий возникающих в момент перехода от одной строки к другой. Привязывал код смены активной строки на нужную с последующим выделением.

C++ Скопировано
1
2
3
    dataGridViewProduct->CurrentRow->Selected = false;
    dataGridViewProduct->Rows[0]->Selected = true;
    dataGridViewProduct->CurrentCell = dataGridViewProduct->Rows[0]->Cells[0];
Работать отказывается. Но если привязать код к кнопке - вуаля! Всё так как задумано. НО, код должен выполнятся без нажатия кнопки, в момент перехода от одной строки к другой... Думается мне, что вмешиваются какие-то события, которые сводят на нет все мои изменения.
0
1 / 1 / 0
Регистрация: 23.01.2015
Сообщений: 22
17.04.2016, 13:48  [ТС]
Решения нет для выделения строки таблицы если в ней не заполнена ячейка. Отбросил эту нереализуемую опцию из программы.

Теперь нужно сохранить введённые в таблицу данные в двоичный файл.
Использую запись структуры целиком:
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
const char *FName="m:\\123"; // путь для сохранения и чтения файла со структурой ТОВАР
ofstream f(FName,ios::binary|ios::out);
f.write((char*)&TOVAR,sizeof TOVAR); //Записали всю структуру целиком
f.close();
 
//--//
 
const char *FName="m:\\123"; //открываем файл для чтения
ifstream in(FName,ios::binary|ios::in);
in.read((char*)&TOVAR,sizeof TOVAR); //Читаем структуру целиком сразу  
in.close();
Сохраняю в файл, изменяю данные в таблице, загружаю - без изменений, ранее сохранённые данные не появились в структуре (проверяю прямое значения TOVAR.KodT[0], например). Всё гладко компилируется и без ошибок. Отловить что и где не так, пока не вышло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2016, 13:48
Помогаю со студенческими работами здесь

Программа Магазин+склад
Доброго времени суток всем! Есть такая программка: tovari = {&quot;Яблоко&quot;: 5, &quot;Груша&quot;: 4, &quot;Мандарин&quot;: 3} for tovar, tsena in...

БД склад запчастей: Каким образом можно модифицировать схему, оставив только 2 сущности, СКЛАД и РЕЦЕПТ
Ребятки, помогите) Вообщем посмотрите схему, каким образом можно ее модифицировать, оставив только 2 сущности, СКЛАД и РЕЦЕПТ.. Ну что...

Программа подсчитывает сумму положительных чисел. Если в массиве находится 3 нуля, то программа прекращает свою работу
Решите эту задачу, пожалуйста.

ООП, программа склад, застрял, нужен совет
Всем привет, пишу не большую программку типа склада, есть 3 поля (наименование,цена и кол-во,есть абстрактный класс Item, от которого...

Программа Фолио Win Склад Проф в локальной сети
Добрый день! Есть два компьютера подключенных между собой по локально сети. На одном стационарном компьютере установлена складская...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер