Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/23: Рейтинг темы: голосов - 23, средняя оценка - 4.91
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750

Обращение к произвольному элементу массива в Windows Form

13.01.2019, 10:42. Показов 4746. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В массиве типа std::string обртиться по индексу к любому элементу массива можно лeгко:
C++
1
2
3
std::string s[] = {"a","bc","def","ghij" };//элемент с индексом 2 - это s[2]
    String^ S = gcnew System::String(s[2].c_str());//преобразуем std::string в System::String
    textBox1->Text = S;//выведет def
И даже, если массив динамический, можно обратиться к любому элементу по его индексу:
C++
1
2
3
4
5
std::string *s = new std::string[4];
    s[0] = "a"; s[1] = "bc"; s[2] = "def"; s[3] = "ghij";
    String^ S = gcnew System::String(s[2].c_str());
    textBox6->Text = S;//выведет def
    delete[] s;//освобождаем память
А как обратиться по индексу к произвольному элементу массива System::String (или любого другого типа)?
C++
1
2
3
4
5
array<System::String^>^ S = {L"a", L"bc", L"def", L"ghij"};
    textBox1->Text = S<2>;//Ошибка
    textBox1->Text = S[2];//Ошибка
      textBox1->Text = S(2);//Ошибка
       textBox1->Text = ??????????   S   ????????????    куда передать целочисленный индекс 2  ???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2019, 10:42
Ответы с готовыми решениями:

Windows Form. Обращение к елементу формы из стороней функции.
Пишу в Visual Studio 2010. Проект Windows Form Application. Подскажите кто нибудь, как мне обратится к из сторонней функции к елементу...

windows form ввод массива
помогите нужно вводишь размер массива и заполняешь его случайными числами помогите реализовать чтобы в подменю хотя бы работал метод...

Обращение к элементу System::String^
Среда программирования VisualStudio 2010 C++ Express. Задача - обработать строку, введённую в текстовое поле. Приложение Win Forms. Код...

19
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 11:36
Цитата Сообщение от LVV Посмотреть сообщение
В массиве типа std::string
LVV, класс с перегруженными скобками это не обязательно массив. stl-строка может содержать массив и обычно, - содержит, но она не является массивом. Более того. Нет таких рекурсивных типов, которые по индексу содержат себя. Хотя путём преобразования (автоматического) похожий эффект можно получить, как исключение.
То есть, вот это не должно скомпилироваться:
Цитата Сообщение от LVV Посмотреть сообщение
s[0] = "a";
Позиция в строке - символ (многосимвольный, кстати, - да, но он - не строка)
C++
1
s[0] = 'a';
Соответственно:
C++
1
textBox1->Text[0] = S[2];
Должно работать. Или:
C++
1
textBox1->Text = S;
То есть, типы должны совпадать или должно быть автоматическое приведение от левого к правому операнду приравнивания.
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.01.2019, 12:05  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, вот это не должно скомпилироваться:
s[0] = "a";
Позиция в строке - символ (многосимвольный, кстати, - да, но он - не строка)
s[0] = 'a';

Всё компилируется. Код проверен.
s[0] = "a"; - это не позиция в строке, а нулевой элемент (с индексом 0) в строковом массиве. Тоесть s[0] - это строка.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 12:07
Цитата Сообщение от LVV Посмотреть сообщение
Всё компилируется. Код проверен.
s[0] = "a"; - это не позиция в строке, а нулевой элемент (с индексом 0) в строковом массиве.
Простите, - увидел, что S это таки массив. Сейчас пересмотрю.
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.01.2019, 12:13  [ТС]
А вот это не компилируется;
Цитата Сообщение от IGPIGP Посмотреть сообщение
Соответственно:
textBox1->Text[0] = S[2]
C++
1
2
array<System::String^>^ S = {L"a", L"bc", L"def", L"ghij"};
    textBox1->Text[2] = S[2];//Ошибка
Как же обратиться по индексу к произвольному элементу массива System::String?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 12:16
Лучший ответ Сообщение было отмечено LVV как решение

Решение

Цитата Сообщение от LVV Посмотреть сообщение
textBox1->Text[0] = S[2]
textBox1->Text[0] - это символ (многосимвольный) так как поле Textbox это строка. Может всё-таки:
C++
1
textBox1->Text = S[2]
Есть поле Lines у RichTextBox если я правильно помню, так вот оно - массив.
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.01.2019, 12:55  [ТС]
К сожалению, нет.
C++
1
2
3
4
5
array<System::String^>^ S = {L"a", L"bc", L"def", L"ghij"};
    textBox1->Text = S<2>;//Ошибка
    textBox1->Text = S[2];//Ошибка
      textBox1->Text = S(2);//Ошибка
       textBox1->Text = ??????????   S   ????????????    куда передать целочисленный индекс 2  ???
Но всё равно, спасибо. Я не знал о синтаксисе, типа textBox1->Text[2];
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 13:36
Цитата Сообщение от LVV Посмотреть сообщение
К сожалению, нет.
Забавно. Дело в том, что у меня (vs2008) не работает из под 7-ки тоже. Нужно разобраться почему, но есть сообщение
C++
1
Ошибка    1   error C2248: System::Windows::Forms::Control::text: невозможно обратиться к private член, объявленному в классе "System::Windows::Forms::Control"   ...\Form1.h 99  textboxVsArrayStr
В хрюше всё нормально. Думаю, разум в майкрософт прогрессирует и они обновили всё так, что теперь уж лучше на Qt всё делать. Или на шарпе.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
13.01.2019, 14:13
Лучший ответ Сообщение было отмечено LVV как решение

Решение

Цитата Сообщение от LVV Посмотреть сообщение
А как обратиться по индексу к произвольному элементу массива System::String (или любого другого типа)?
C++
1
2
3
4
5
array<System::String^>^ S = {L"a", L"bc", L"def", L"ghij"};
    textBox1->Text = S<2>;//Ошибка
    textBox1->Text = S[2];//Ошибка
      textBox1->Text = S(2);//Ошибка
       textBox1->Text = ??????????   S   ????????????    куда передать целочисленный индекс 2  ???
Строка №3 рабочая. Если у тебя она дает ошибку компиляции значит ты что-то не то делаешь. Например, ты написал этот код на уровне классе, а не в методе. Если бы ты привел весь код или хотя бы привел текст ошибки (что нужно всегда делать, а не заставлять других заниматься гаданием), то тогда можно будет дать точный ответ.
2
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.01.2019, 15:26  [ТС]
Уважаемые, IGPIGP и OwenGlendower. Склоняюсь перед Вами в глубоком пардоне.
Дело в том, что я экспериментирую в двух средах одновременно: VS 2010 и VS 2017... Ну и запутался маленько... В одном проекте остался мусор, который мешал проверить решение...
Действительно, вариант №3 рабочий.
Вот так всё работает:
C++
1
2
3
4
5
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    array<System::String^>^ S = { L"a", L"bc", L"def", L"ghij" };
    textBox1->Text = S[2];//выводит def
}
Еще раз извините и спасибо за участие.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 16:50
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если у тебя она дает ошибку компиляции значит ты что-то не то делаешь.
OwenGlendower, я же говорю:
Цитата Сообщение от IGPIGP Посмотреть сообщение
В хрюше всё нормально.
а в win7 - ни в какую. Может надо в манифесте что-то вручную поправить? Я раньше только под 32-разрядной win7 компилил (mvs2008). 64-разрядную поставил недавно (памяти добавил до 24Gb) и с тех пор C++/cli не трогал на ней. А сейчас - сам удивляюсь. Хотя может дело и не в этом, но нет пока времени разобрать. Я студию на этой машине только для форума использовал, а сейчас в разделе C++/cli редко отвечаю. Вот и получился сюрприз. За что все и любят майкрософт.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
13.01.2019, 16:59
IGPIGP, обращение к элементу массива по индексу это базовый синтаксис языка. Зависеть от версии Windows он никак не должен. Может у тебя, как и у LVV, разный код в разных ОС? У меня как раз Windows 7 и на ней все прекрасно работает.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
C2248: System::Windows::Forms::Control::text:
невозможно обратиться к private член, объявленному в классе "System::Windows::Forms::Control"
Похоже у тебя просто опечатка в коде. Нужно обращаться к свойству Text - с заглавной буквы.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 17:03
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Может у тебя, как и у LVV, разный код в разных ОС? У меня как раз Windows 7 и на ней все прекрасно работает.
У меня mvs2008 (это важно). Я и на xp и на 7 создал чистую форму с нуля. Кнопка и текстбокс. В событии баттон клик хоюша послушно запихивает строку (элемент массива) в текстбокс. А на win7 (64) ругается на private, хотя он и должен быть) Метод же свой - приватный... Не знаю в чём дело.

Добавлено через 3 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Похоже у тебя просто опечатка в коде. Нужно обращаться к свойству Text - с заглавной буквы.
Во блин... А я уж макрософт проклял. Мягкое с мелким перепутал - факт!
OwenGlendower, -спасибо!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
13.01.2019, 17:07
IGPIGP, пожалуйста
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
05.02.2019, 09:47  [ТС]
И снова вопрос.
Возникла необходимость создания строкового одномерного динамического массива, а потом его заполнения.
В чистом С++ это выглядит примерно так:
C++
1
std::string *sr = new std::string[40];
и после этого могу присвоить значение любому элементу с допустимым индексом. Например:
sr[35]="qwerty";

В Visual C++ аналогичный System::String массив объявляется, так:
C++
1
array<System::String^>^ sr;
Но, я не пойму где указывать количество элементов массива. Вторым параметром там вроде бы размерность массива.
C++
1
2
array<System::String^,1>^ sr;//одномерный
array<System::String^,2>^ srr;//двумерный
Как сделать, например, чтобы этот код работал:
C++
1
2
3
4
5
private: System::Void textBox1_TextChanged(System::Object^  sender, System::EventArgs^  e) {
                 array<System::String^>^ sr;
                 sr[35]=textBox1->Text;
                 textBox2->Text=sr[35];
             }
В чём ошибка?
Компилируется нормально, но при изменении текста в текстбокс1 выдаёт в третьей строке: "Ссылка на объект не указывает на экземпляр объекта"
Подскажите или дайте ссылку для изучения.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.02.2019, 09:47
Цитата Сообщение от LVV Посмотреть сообщение
array<System::String^>^ sr;
LVV, попробуйте
C++
1
array<System::String^>^ sr=gcnew array<System::String^>(36);//35 штук точно поместится
ps по запросу (гугл) array C++/cli
выдаёт много всего и в частности:
https://docs.microsoft.com/en-... ew=vs-2017
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
05.02.2019, 12:10  [ТС]
Спасибо,IGPIGP.
Проверю, отпишусь.
Самое интересное, что у меня и так работало:
C++
1
2
array<System::String^>^ sr;
                 sr[35]=textBox1->Text;
но потом вдруг перестало.
Мистика...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.02.2019, 12:24
Цитата Сообщение от LVV Посмотреть сообщение
Самое интересное, что у меня и так работало:
Не должно бы. LVV, мы сейчас прикоснулись к очень важной теме. Это ссылочные классы. В классике мы не можем объявить и инициализировать ссылку в два этапа, а в C++/cli - легко. Это значит, что можно создавать ссылки и главное, - контейнеры (массивы, например) ссылок. В классике это запрещено по вышеозначенной причине. В слях это можно, но нужно не забывать инициализировать объявленные ссылки.
0
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
06.02.2019, 05:26  [ТС]
Спасибо,IGPIGP, всё работает.
Цитата Сообщение от LVV Посмотреть сообщение
Самое интересное, что у меня и так работало:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не должно бы
Как раз и сбило с толку то, что вполне рабочим был вариант: array<System::String^>^ sr;
Пользовался откомпилированным файлом без проблем.
Но когда захотел немного подправить проект, оказалось, что новый откомпилированный файл стал давать исключения на этом месте. Почему так - не знаю.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.02.2019, 09:33
Лучший ответ Сообщение было отмечено LVV как решение

Решение

Цитата Сообщение от LVV Посмотреть сообщение
Почему так - не знаю.
LVV, я же написал:
Цитата Сообщение от IGPIGP Посмотреть сообщение
В слях это можно, но нужно не забывать инициализировать объявленные ссылки.
LVV, вот ссылка С++
C++
1
2
3
4
int a(0);
int & ref_a = a;//объявление и инициализация в одном операторе
//int & next_ref;//это недопустимо
//next_ref=a;//это уже поздно и, соответственно, - бесполезно
в C++/cli
Вы можете объявить ссылку nullptr без её инициализации объектом. А позже - инициализировать (предложение gcnew ...). Но если инициализация не пройдёт успешно или Вы просто забудете её выполнить, то ваша ссылка останется равной nullptr. Потом, при первом же обращении - исключение. Можно проверять, кстати, но это полезно именно тогда когда вы инициализировали (пробовали), но есть шанс, что это не прошло успешно (не нашёлся/открылся файл и пр.). Но это другой разговор.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2019, 09:33
Помогаю со студенческими работами здесь

Обращение к элементу окна из main функции
При попытке обратиться к параметру элемента компилятор (VS2008) выдает ошибку: error C2227: выражение слева от &quot;-&gt;Value&quot;...

Что быстрее? Обращение к элементу массива или к элементу структуры?
Обращение к элементу массива или к элементу структуры? Экспериментирую с кодом и получается примерно одинаково. Что интересно, время на...

Обращение к элементу массива
Есть массив, который приходит мне в формате json, как мне обратиться к примеру ко второму элементу, к полю name? &quot;games&quot;:

Обращение к элементу массива?
Не пойму в этом коде 15 строчку, а именно x. Что значит esi*2 и что этто за элемент мы получаем? .data x dw 1, 2, 3, 4, 5, 6, 7 k...

Обращение к элементу массива
Здравствуйте! Пытаюсь обратиться к третьему элементу массива, но в результате в регистре ax получается не то, что нужно. То есть хочу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru