public partial class Form1 : Form
{
private int currentIndex;
private List images;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
currentIndex = 0;
images = GetImages();
}
private void button1_Click(object sender, EventArgs e)
{
currentIndex = 0;
pictureBox1.Image = images[currentIndex];
}
private void button4_Click(object sender, EventArgs e)
{
currentIndex = images.Count - 1;
pictureBox1.Image = images[currentIndex];
}
private void button3_Click(object sender, EventArgs e)
{
if (currentIndex != 0)
currentIndex--;
pictureBox1.Image = images[currentIndex];
}
private void button2_Click(object sender, EventArgs e)
{
if (currentIndex != (images.Count - 1))
currentIndex++;
pictureBox1.Image = images[currentIndex];
}
private List GetImages()
{
HashSet imagesExtensions = new HashSet() { "png", "jpg" };
string directoryPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "pct");
return GetImages(directoryPath, imagesExtensions);
}
private List GetImages(string directoryPath, HashSet imagesExtensions)
{
List result = new List();
string[] fileNames = Directory.GetFiles(directoryPath);
foreach (string fileName in fileNames)
if (imagesExtensions.Contains(Path.GetExtension(fileName).Replace(".", "")))
result.Add((Image)(new Bitmap(fileName)));
return result;
}
}
Następnym razem jak coś Ci nie będzie działać to pisz dokładnie co nie działa i czy pojawia się jakiś komunikat błędu. Moja magiczna kula aktualnie leży w piwnicy. Jedyny błąd jaki zauważyłem w kodzie to próba pobrania elementu listy o indeksie równym ilości elementów tej listy. Elementy listy numerowane są od 0, a więc ostatni element listy ma indeks równy list.Count - 1. Wprowadziłem jeszcze oprócz tego drobne poprawki do metod obsługujących zdarzenie Click poszczególnych przycisków. Teraz powinno działać.
Dziwne, że ten błąd został wyrzucony w tej linijce. Anyway najprawdopodobniej chodzi o to, że w folderze, który kryje się pod ścieżką directoryPath nie ma żadnego zdjęcia o rozszerzeniu png lub jpg. Wprowadziłem drobne poprawki w kodzie, żeby ten wyjątek się już nie pojawił:
public partial class Form1 : Form
{
private int currentIndex;
private List images;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
images = GetImages();
button1_Click(null, null);
}
private void button1_Click(object sender, EventArgs e)
{
if (images != null && images.Count > 0)
{
currentIndex = 0;
pictureBox1.Image = images[currentIndex];
}
}
private void button4_Click(object sender, EventArgs e)
{
if (images != null && images.Count > 0)
{
currentIndex = images.Count - 1;
pictureBox1.Image = images[currentIndex];
}
}
private void button3_Click(object sender, EventArgs e)
{
if (images != null && images.Count > 0)
{
if (currentIndex != 0)
currentIndex--;
pictureBox1.Image = images[currentIndex];
}
}
private void button2_Click(object sender, EventArgs e)
{
if (images != null && images.Count > 0)
{
if (currentIndex != (images.Count - 1))
currentIndex++;
pictureBox1.Image = images[currentIndex];
}
}
private List GetImages()
{
HashSet imagesExtensions = new HashSet() { "png", "jpg" };
string directoryPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "pct");
return GetImages(directoryPath, imagesExtensions);
}
private List GetImages(string directoryPath, HashSet imagesExtensions)
{
List result = new List();
string[] fileNames = Directory.Exists(directoryPath) ? Directory.GetFiles(directoryPath) : null;
if (fileNames != null && fileNames.Length > 0)
foreach (string fileName in fileNames)
if (imagesExtensions.Contains(Path.GetExtension(fileName).Replace(".", "")))
result.Add((Image)(new Bitmap(fileName)));
return result;
}
}
BTW Jeśli Ty ten kod odpalasz na linuxie przy użyciu Mono to musisz sprawdzić co kryje się w zmiennej directoryPath, bo nie wiem, czy te metody Path.Combine itd. poprawnie działają w Mono.
Miałeś mi powiedzieć, czy kolekcja obrazków (zmienna images) jest pusta, czy nie jest pusta. Nie interesuje mnie jakie argumenty są przesłane do procedury, bo przecież je znam.
W procedurze obsługującej zdarzenie DoWork nie można modyfikować właściwości kontrolek formularza (stąd ten wyjątek). Co najwyżej możesz odczytywać ich wartość (choć tego też tak na prawdę nie powinno się robić). Jeśli chcesz dokonać modyfikacji formularza w trakcie pracy backgroundworker-a to musisz to zrobić w procedurze obsługującej zdarzenie ProgressChanged (ewentualnie jeszcze przed wywołaniem metody RunWorkerAsync.
Im dalej w las, tym więcej drzew :). Komunikat błędu jest dość jasny. Zabrakło RAM-u. Jeśli masz system 32bit-owy to program może maksymalnie zaadresować 2GB RAM-u. Zgaduję, że wrzuciłeś tyle zdjęć do tego folderu, że program się wyłożył (mi to często zdarzało się w starszej wersji firefoxa, gdy ściągałem przy jego użyciu duże pliki).
Trzeba będzie przerobić ten kod. Będziesz musiał zrezygnować z buforowania wszystkich zdjęć i wczytywać je pojedynczo. Mógłbyś też wczytywać je partiami, ale w sumie jak się zastanowić, to wczytywanie pojedynczo będzie lepsze. Załóżmy, że użytkownik w trakcie działania programu usunie zdjęcie z dysku. W programie w buforze wciąż byłoby przechowywane i zostałoby wyświetlone mimo tego, że na dysku już go nie ma. Zresztą załóżmy, że użytkownik w trakcie działania programu wrzuci zdjęcie do folderu, którego zawartość jest aktualnie wyświetlana. Z racji tego, że korzystasz z bufora to to zdjęcie nie zostałoby wyświetlone, bo bufor nie jest nigdzie odświeżany.
Pokombinuj na razie sam jak to przerobić, żeby to miało ręce i nogi. Jak nic nie wykombinujesz to postaram się podrzucić Ci jakiś pomysł. Tylko jak będziesz nad tym myślał to postaraj się tak to zrobić, aby jak najwięcej kodu przenieść do osobnych klas. Możesz sobie np. zrobić klasę MyImage, która będzie miała pola Bitmap i FilePath oraz metody Exists oraz Read. Oraz klasę MyImages, która będzie miała metody GetPrevious, GetNext, GetFirst, GetLast. Coś w ten deseń.
To jest jeszcze masa czasu, bo to nie jest nic trudnego. W zasadzie wszystkie informacje już masz, żeby sobie z tym poradzić. Możesz mi podrzucić kod całego projektu (spakowany) na priva. Usiądę teraz przy tym i coś tam porobię. Mam godzinę czasu, bo potem spadam na film (ewentualnie jeszcze po filmie z 1,5h będę)