TImageList przechowuje ikony i bitmapy, którym zawsze przypisywany jest kolejny indeks z listy. Indeksów posortować się nie da, ImageList nie przechowuje nazw wczytanych ikon i bitmap, więc według jakich kryteriów chcesz sortować tą listę? Jak wyobrażasz sobie to sortowanie.
druga sprawa to jak z jednego TimageList przenieść elementy do drugiego TImageList.
Czy chodzi o przeniesienie całej zawartości jednej listy do drugie? Jeżeli tak, można to zrobić w ten sposób:
ImageList2->Assign(ImageList1);
lub:
ImageList2->AddImages(ImageList1);
Jeżeli natomiast chcesz skopiować pojedynczą ikonkę z
ImageList1 do
ImageList2 niezależnie czy to jest ikona czy bitmapa to postępujesz tak:
ImageList2->AddImage(ImageList1, 1);
Button2->Invalidate();
Pierwszy argument funkcji AddImage to obiekt typu TImageList z którego ikona jest kopiowana, a drugi argument to numer kopiowanej ikony. Kopiowana ikona zawsze jest wstawiana na pierwszą pozycję na liście. Dla obiektu który pobiera ikony z listy ImageList2 trzeba wywołać funkcję wymuszającą jego przerysowanie, czyli Invalidate lub Repaint.
Jeżeli lista ImageList2 zawiera już jakieś ikony, a Ty chcesz wstawić nowe w ściśle określonej pozycji względem istniejących ikon to używasz funkcji Insert:
#include <memory>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::auto_ptr<Graphics::TBitmap> tBmp(new Graphics::TBitmap);
/* druga bitmapa potrzebna by uzyskać przeźroczystość we wcześniejszych
wersjach środowiska C++Builder */
std::auto_ptr<Graphics::TBitmap> mBmp(new Graphics::TBitmap);
tBmp->Width = ImageList1->Width;
tBmp->Height = ImageList1->Height;
mBmp->Width = ImageList1->Width;
mBmp->Height = ImageList1->Height;
ImageList1->Draw(tBmp->Canvas, 0, 0, 2, true); /* wstawiam trzecią ikonę z listy licząc od 0 */
ImageList1->Draw(mBmp->Canvas, 0, 0, 2, false); /* tworzę maskę dla przeźroczystości */
ImageList2->Insert(3, tBmp.get(), mBmp.get()); /* wstawiam ikonę w 3 pozycji licząc od 0 tylko jeżeli lista zawiera co najmniej 3 pozycje */
Button2->Invalidate();
}
W C++Builder 2009 i 2010 jest to trochę prostsze:
#include <memory>
void __fastcall TForm1::Button6Click(TObject *Sender)
{
ImageList2->AddImage(ImageList1, 1);
std::auto_ptr<Graphics::TBitmap> tBmp(new Graphics::TBitmap);
tBmp->Width = ImageList1->Width;
tBmp->Height = ImageList1->Height;
ImageList1->Draw(tBmp->Canvas, 0, 0, 2, true); /* wstawiam trzecią ikonę z listy licząc od 0 */
ImageList1->Draw(mBmp->Canvas, 0, 0, 2, false); /* tworzę maskę dla przeźroczystości */
ImageList2->ColorDepth = cd32Bit;
ImageList2->Insert(0, tBmp.get(), NULL);
Button2->Invalidate();
}
W celu zamiany ikon miejscami należy posłużyć się funkcją
Move:
W przykładzie z pozycji 0 na pozycję 1.
W celu usunięcia ikony należy posłużyć się funkcją
Delete:
W przykładzie usunięta zostanie ikona z pozycji 1. Na jej miejsce wskoczy ikona kolejna na liście.