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

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

30.01.2015, 14:21. Показов 16014. Ответов 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
9007 / 4708 / 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru