cli::array
добавить несколько раз по одному элементу чтобы размер массива увеличивался
Размер массива cli::array задаётся при его создании. Удаление/добавление элементов невозможно.
Есть метод Resize, позволяющий изменить размер массива, но нужно понимать, что при его применении создаётся новый массив заданного размера, в который копируется содержимое старого массива (то есть это затратная операция). После чего старый массив удаляется сборщиком мусора.
Чтобы не следить самостоятельно за размером массива, можно использовать класс List - в нём можно добавлять и удалять элементы. Выделение памяти под новый массив в случае нехватки размера происходит автоматически.
Если нужно действительно динамически добавлять и удалять элементы, то лучше использовать коллекцию LinkedList. Это классический двухсвязный список, со всеми его преимуществами и недостатками.
P.S. не могу не понудеть: C++/CLI - мутант, с которого ни в коем случае не стоит начинать освоение программирования. Если пишете под .NET - осваивайте C#. Если есть желание изучить C++, то изучайте нормальный, не дотнетный.
А про C++/CLI ну не знаю, в ВУЗе обучали нас строить окна на сообщениях, муть ужасная, Windows Forms позволяет все построить быстро и удобно...
stdafx.h
//#include <Cfgmgr32.h>
#define PROGRESS_STATUS_WAIT -10
#define PROGRESS_STATUS_CLEAR -5
using namespace System;
using namespace System::Collections::Generic;
ref class ListViewProgress{
public:
System::Windows::Forms::ListView ^listview;
LinkedList<System::Windows::Forms::ListViewItem^> ^lvi;
LinkedList<System::Windows::Forms::ProgressBar^>^ pb;
[COLOR="Red"]pb = gcnew LinkedList <System::Windows::Forms::ProgressBar^>;[/COLOR]
ListViewProgress(System::Windows::Forms::Control::ControlCollection ^control){
listview = gcnew System::Windows::Forms::ListView();
listview->Dock = System::Windows::Forms::DockStyle::Fill;
listview->UseCompatibleStateImageBehavior = false;
listview->Margin.All=0;
control->Add(listview);
};
void Add (System::String^ name, int image){
//lvi = gcnew array<System::Windows::Forms::ListViewItem^>(1);
//lvi[0]=listview->Items->Add(name,image);
//pal = gcnew array<ProgressAndLabel^>(1);
//pal[0] = gcnew ProgressAndLabel(listview->Controls);
//pal[0]->SetLocation(lvi[0]->Bounds);
};
void View (int view){
switch(view){
case 0:
listview->View=System::Windows::Forms::View::LargeIcon;
//WritePrivateProfileString(L"View",L"Icons",L"1",CONFIGFILE);
break;
case 1:
listview->View=System::Windows::Forms::View::SmallIcon;
//WritePrivateProfileString(L"View",L"Icons",L"2",CONFIGFILE);
break;
case 2:
listview->View=System::Windows::Forms::View::List;
//WritePrivateProfileString(L"View",L"Icons",L"3",CONFIGFILE);
break;
case 3:
listview->View=System::Windows::Forms::View::Details;
//WritePrivateProfileString(L"View",L"Icons",L"4",CONFIGFILE);
break;
case 4:
listview->View=System::Windows::Forms::View::Tile;
//WritePrivateProfileString(L"View",L"Icons",L"5",CONFIGFILE);
break;
}
};
};
На выделенной строчке пишет:
Ошибка 2 error C3845: ListViewProgress:: pb: только статические данные-члены можно инициализировать внутри класс ссылки или типа, передаваемого по значению d:\документы\visual studio 2008\projects\parallelcopycommander 1.0\parallelcopycommander 1.0\stdafx.h 12 ParallelCopyCommander 1.0
C# - полностью объектно-ориентированный язык. На C++ можно написать программу совсем без классов, в C# как минимум будет один класс (с методом Main).
И C#, и C++.NET используют один и тот же Framework, так что набор стандартных классов одинаковый - Framework Class Library - FCL, он же Base Class Library - BCL. Так что без проблем можно переписать ListView.
Насчёт многопоточности и параллельности. Я слишком плохо знаю C++.NET, но в C# с этим дело обстоит прекрасно! Если не ошибаюсь, Parallel Extensions применимо и к C++.NET, но PLINQ существует только в C#.
В приципе, если нет проблем с английским, то можно найти достаточно документации по C++.NET, но на русском ситуация гораздо хуже. А с литературой по шарпу на русском проблем нет.
Дело ваше, продолжайте мучить цпп. Как надоест выписывать лишние значочки, продираться сквозь неудобный синтаксис и тщетно искать примеры, - добро пожаловать в мир Шарпа :)
Эммм. Даже сказать-то нечего по этому поводу...
Я бы WPF брал. Там такой финт тривиален. На WinForms это однозначно займет больше времени реализацию и отнимет еще больше сил на отладку.
Нужна абстрактная многопоточность и сферическая отдача ресурсуов? Или что-то конкретное? Если мне не изменяет память, то в Микрософте уже 4 (четыре) фреймворка для работы с многопоточкой сделали - бери не хочу: PLinq, Tasks, Async в F# и еще Axum, а в C#5 грядет жалкое подобие немерлового ComputationExpressions - async/await.
Кстати в uTorrent прогресс-бар отрисовывается (OwnerDraw=true) "врукопашную", там какой-то конкретной компоненты ProgressBar нет.