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

Как создать массив в Form

30.01.2015, 14:21. Показов 15877. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.Работаю в M Visual Studio 10. Объявил класс как в хидере

C++
1
2
3
4
5
6
7
ref struct C_Find_item  //Структура для хранения того, что надо найти
{int number;//Номер поиска
 bool activ;//активный или неактивный поиск
 bool f_area;// использовать область или нет
 int start_line;// Стартовая строчка для поиска 
 int area;//область поиска при выбранном поиске по области
};
Хочу добавить в Форму одним из членов массив из экземпляров таких классов. Вот что написал

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#pragma once
#include "Form2.h"
//#include "Global.h"
 
 
 
//Find_item Find_item[Find_item_size];
 
namespace Finder {
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
 
 
 
    /// <summary>
    /// Сводка для Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    private:
        C_Find_item Find_item2; //Все хорошо
        C_Find_item Find_item1[5];//Ругается
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: добавьте код конструктора
            
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::MenuStrip^  menuStrip1;
    protected: 
    private: System::Windows::Forms::ToolStripMenuItem^  fileToolStripMenuItem;
    private: System::Windows::Forms::ToolStripMenuItem^  openToolStripMenuItem;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::OpenFileDialog^  openFileDialog1;
    private: System::Windows::Forms::RichTextBox^  richTextBox1;
 
 
    private:
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
            this->fileToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->openToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());
            this->richTextBox1 = (gcnew System::Windows::Forms::RichTextBox());
            this->menuStrip1->SuspendLayout();
            this->SuspendLayout();
            // 
            // menuStrip1
            // 
            this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(1) {this->fileToolStripMenuItem});
            this->menuStrip1->Location = System::Drawing::Point(0, 0);
            this->menuStrip1->Name = L"menuStrip1";
            this->menuStrip1->Size = System::Drawing::Size(562, 24);
            this->menuStrip1->TabIndex = 0;
            this->menuStrip1->Text = L"menuStrip1";
            // 
            // fileToolStripMenuItem
            // 
            this->fileToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(1) {this->openToolStripMenuItem});
            this->fileToolStripMenuItem->Name = L"fileToolStripMenuItem";
            this->fileToolStripMenuItem->Size = System::Drawing::Size(35, 20);
            this->fileToolStripMenuItem->Text = L"File";
            // 
            // openToolStripMenuItem
            // 
            this->openToolStripMenuItem->Name = L"openToolStripMenuItem";
            this->openToolStripMenuItem->Size = System::Drawing::Size(111, 22);
            this->openToolStripMenuItem->Text = L"Open";
            this->openToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::openToolStripMenuItem_Click);
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Location = System::Drawing::Point(46, 6);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(63, 13);
            this->label1->TabIndex = 1;
            this->label1->Text = L"Подсказка";
            // 
            // openFileDialog1
            // 
            this->openFileDialog1->FileName = L"openFileDialog1";
            this->openFileDialog1->Filter = L"Log files (*.log)|*.log";
            // 
            // richTextBox1
            // 
            this->richTextBox1->Dock = System::Windows::Forms::DockStyle::Fill;
            this->richTextBox1->Location = System::Drawing::Point(0, 24);
            this->richTextBox1->Name = L"richTextBox1";
            this->richTextBox1->RightMargin = 1255;
            this->richTextBox1->Size = System::Drawing::Size(562, 362);
            this->richTextBox1->TabIndex = 2;
            this->richTextBox1->Text = L"dadada";
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(562, 386);
            this->Controls->Add(this->richTextBox1);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->menuStrip1);
            this->KeyPreview = true;
            this->MainMenuStrip = this->menuStrip1;
            this->MinimumSize = System::Drawing::Size(570, 420);
            this->Name = L"Form1";
            this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
            this->Text = L"Form1";
            this->WindowState = System::Windows::Forms::FormWindowState::Maximized;
            this->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &Form1::Form1_KeyDown);
            this->menuStrip1->ResumeLayout(false);
            this->menuStrip1->PerformLayout();
            this->ResumeLayout(false);
            this->PerformLayout();
 
        }
#pragma endregion
    public: String^ Gettor1() {return this->richTextBox1->Text;}
 
    private: System::Void openToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) 
                 {
                     this->label1->Text=openFileDialog1->FileName;
                     auto f = openFileDialog1->FileName;
                     richTextBox1->Text = System::IO::File::ReadAllText(f);     
                 }
             }
    private: System::Void Form1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e)
             {
            /*/  if (( e->KeyCode == Keys::F) & (Control::ModifierKeys == Keys::Control))
                 {
                 
                     Form2 ^secondform = gcnew Form2();
                    
                     secondform->ShowDialog();                                  
                 }/*/
                  Form2 ^secondform = gcnew Form2();
                  secondform->textBox1->Text="bbbb";
                  secondform->ShowDialog();
               this->label1->Text=secondform->Gettor();
 
             }
};
}

В этом месте выдает ошибку
C++
1
2
3
private:
        C_Find_item Find_item2; //Все хорошо
        C_Find_item Find_item1[5];//Ругается

C++
1
2
error C2728: C_Find_item: собственный массив не может содержать этот управляемый тип
error C4368: не удается определить "Find_item1" как член управляемого "Finder::Form1": смешанные типы не поддерживаются
Подскажите пож как я могу объявить такой массив внутри класса Формы.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2015, 14:21
Ответы с готовыми решениями:

Как создать Button в Form-e и сохранить его, так чтобы при следующем открытии Form кнопка, т.е. Button существовал на форме?
Доброе время суток! У меня возник такой вопрос. Как создать Button в Form-e и сохранить его, так чтобы при следующем открытии Form...

Создать win form, используя шаблон windows form в clr, однако такого шаблона на моей студии 2013 нет
есть необходимость создать win form используя шаблон windows form в clr, однако такого шаблона на моей студии 2013 не обнаружено ... :(

как создать такую form'y
Подскажите, пожалуйста, как создать такую форму с такими же полями и галочка то бы была цветная.

17
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
30.01.2015, 15:34
Цитата Сообщение от Alexandr_las Посмотреть сообщение
Подскажите пож как я могу объявить такой массив внутри класса Формы.
C++
1
array<C_Find_item^> ^arr;
1
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
30.01.2015, 15:54  [ТС]
Большое спасибо, а как объявить полем класса Форм массив например размерности 5?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
30.01.2015, 17:08
Цитата Сообщение от Alexandr_las Посмотреть сообщение
Большое спасибо, а как объявить полем класса Форм массив например размерности 5?
Пользуйтесь этим,в конструкторе определите как содержащий 5 элементов:
C++
1
arrName = gcnew array<C_Find_item^>(5);
0
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
02.02.2015, 10:41  [ТС]
Все сделал как вы посоветовали, компилируется но при попытке вызывать 2-ю форму с таким кодом:
C++
1
2
Form2 ^secondform = gcnew Form2();
 secondform->checkBox_Activ_1->Checked=this->Find_item[1]->activ;
Вылетает с ошибкой: Сылка на объект не указывает на объект.

Подскажите пож где еще чего не хватает
0
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
04.02.2015, 21:52  [ТС]
Кто-либо знает как это сделать?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
04.02.2015, 21:59
Цитата Сообщение от Alexandr_las Посмотреть сообщение
Вылетает с ошибкой: Ссылка на объект не указывает на объект.
Прикрепите проект,так будет проще разобраться.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.02.2015, 21:04
Цитата Сообщение от Alexandr_las Посмотреть сообщение
Большое спасибо, а как объявить полем класса Форм массив например размерности 5?
Alexandr_las, ссылочное поле можно объявить как статический член:
C++
1
public: static array<MyRefType^,1>^ arrayMyRefTypes = gcnew array<MyRefType^,1>(5);
0
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
06.02.2015, 18:37  [ТС]
S_el в проекте мне пока приходится несколько раз объявлять переменные типа C_Find_item. Но я бы хотел объявить массив таких элементов. Задача на первый взгляд простая. Объявить полем массив из таких классов и в процессе программы обращаться к ним. Все что вы подсказали получилось. НО не получается использовать эти поля в программе.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
06.02.2015, 19:44
Цитата Сообщение от Alexandr_las Посмотреть сообщение
НО не получается использовать эти поля в программе.
Я подозреваю,что вы забыли их проинициализировать.Посмотрите в отладчике,что содержит ваш массив.
0
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
06.02.2015, 21:23  [ТС]
Извиняюсь за наглость но как это сделать? Вот например я создал простой проект по нажатию кнопки его полю должно присваиваться значение. Где и что нужно еще прописать?
Вложения
Тип файла: rar Test.rar (669.7 Кб, 20 просмотров)
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
06.02.2015, 21:58
Лучший ответ Сообщение было отмечено Alexandr_las как решение

Решение

Цитата Сообщение от Alexandr_las Посмотреть сообщение
но как это сделать? Вот например я создал простой проект по нажатию кнопки его полю должно присваиваться значение.
Вначале надо проинициализировать все поля в конструкторе:
C++
1
2
                for(size_t i=0;i<arr->Length;i++)
                    arr[i] = gcnew C_Find_item;
значения можно присваивать как обычным полям:
C++
1
                arr[i]->activ=true;
Добавлено через 21 минуту
Цитата Сообщение от Alexandr_las Посмотреть сообщение
Вот например я создал простой проект по нажатию кнопки его полю должно присваиваться значение.
Надо вначале определится какое значение следует присвоить.
Допустим значения надо присвоить так:
C++
1
2
3
4
5
6
7
8
9
10
11
        void Func()
            {
            for(int j=0;j<arr->Length;j++)
                {
                arr[j]->activ=false;
                arr[j]->area=j;
                arr[j]->f_area=true;
                arr[j]->number=j*j;
                arr[j]->start_line=(8+j*3);
                }
            }
создадим обработчик,для этого надо дважды нажать по кнопке в конструкторе,должны появится такие строки:
C++
1
2
3
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                
                     }
Теперь соединим - добавим вызов функции в обработчик нажатия:
C++
1
     Func();
Теперь надо вывести информацию.Первым делом надо определить функцию преобразования объекта структуры в строку.Например:
C++
1
2
3
4
5
6
7
8
9
10
            virtual String^ ToString() override
            {
            String^ str="";
            str+="\tNumber: "+number.ToString()+Environment::NewLine;
            str+="\tActiv: "+activ.ToString()+Environment::NewLine;
            str+="\tF_area: "+f_area.ToString()+Environment::NewLine;
            str+="\tStart_line: "+start_line.ToString()+Environment::NewLine;
            str+="\tArea: "+area.ToString()+Environment::NewLine;
            return str;
            }
Теперь надо решить куда выводить.Добавьте в конструктор форм текстбокс и следующим свойствам установите такие значения:
Code
1
2
ScrollBars - Vertical (прокрутка)
Multiline - True (многострочный)
Добавим в обработчик нажатия после вызова функции Func():
C++
1
2
3
4
5
6
                     textBox1->Clear();
                     for (int i(0);i<arr->Length;++i)
                         {
                         textBox1->Text+=i.ToString()+" object = "+Environment::NewLine;
                         textBox1->Text+=arr[i]->ToString()+Environment::NewLine; 
                         }
1
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
06.02.2015, 23:08  [ТС]
Все получилось. Оставлю свой проект как пример для будущих поколений)
Вложения
Тип файла: rar Test.rar (671.6 Кб, 64 просмотров)
1
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
07.02.2015, 10:25  [ТС]
Решил немного усовершенствовать проект и опять наткнулся на проблему:
Создал класс в файле stdafx.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ref class C_Find_item  //Структура для хранения того, что надо найти
{
public:
 int number;//Номер поиска
 bool activ;//активный или неактивный поиск
 bool f_area;// использовать область или нет
 int start_line;// Стартовая строчка для поиска 
 int area;//область поиска при выбранном поиске по области
 String^ substring;
 
 C_Find_item(void)
 {
     activ=false;
     f_area=false;
     start_line=0;
     area=1;
     substring="dada";
 }
};
Полем формы прописал
C++
1
        array<C_Find_item^> ^Find_item;
В конструкторе прописал:
C++
1
2
3
4
5
6
7
8
Find_item=gcnew array<C_Find_item^>(5);
 
            for (int i=0;i<array_length;i++)
            {
              Find_item[i]=gcnew C_Find_item(); 
            
            }
this->richTextBox1->Text=Find_item[1]->substring;
Компилироваться компилируется но почему то вылетает на строке
C++
1
this->richTextBox1->Text=Find_item[1]->substring;
Говорит что не указывает на экземпляр объектаж
Подскажите пож Как правильно ввести String в мой класс чтобы его можно было использовать в программеж
Вложения
Тип файла: rar Finder.rar (816.4 Кб, 16 просмотров)
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
07.02.2015, 12:31
Цитата Сообщение от Alexandr_las Посмотреть сообщение
Создал класс в файле stdafx.h
Плохая идея.Надо вынести в отдельный файл.

Цитата Сообщение от Alexandr_las Посмотреть сообщение
Компилироваться компилируется но почему то вылетает на строке
Компоненты формы надо использовать после этой строчки:
C++
1
        InitializeComponent();
перенесите её в самый верх конструктора.
0
1 / 1 / 0
Регистрация: 27.01.2015
Сообщений: 18
07.02.2015, 13:10  [ТС]
Я недавно начал на Visual Studio работать. Как бы вы посоветовали создавать класс и в каких файлах?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
07.02.2015, 13:14
Если класс небольшой,то для каждого класса свой .h файл.Если методов много,то реализацию вынести в .cpp файл.Все как в книгах пишут ;-)
0
07.02.2015, 14:00
 Комментарий модератора 
Alexandr_las, дублировать темы запрещено.
Предупреждение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2015, 14:00
Помогаю со студенческими работами здесь

Как создать и открыть новую form?
Привет, создаю программу, в которой должно быть две и более form, так же хочу, чтоб form2 открывалась по нажатию кнопки. Заранее спасибо :*...

Как создать меню в Windows Form
Здравствуйте, подскажите как создать меню в форме. Есть элемент MenuStrip. При нажатии на пункт меню необходимо вывести группу элементов на...

Как создать Windows Form на vs 2017?
Готовая консольная программа есть. Вообще не понятно, в интернете размыто.

Как в Contact Form 7 создать checkbox?
Там есть кнопка checkbox, но что бы я не делал, checkbox не появляется. Спасибо.

Как создать базу данных программно из Windows Form?
Заранее извиняюсь, возможно не в тот раздел пишу, но я новичок и хочу узнать ответ на один из основных вопросов. Хочу попробовать написать...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru