Mógłbyś to zrobić w oparciu o to co napisałem wyżej (to na prawdę nie jest nic trudnego). No ale rozumiem, że chodzi o czas. Dobra dvd i dvd2 to dwa różne katalogi na płytce?
tak
– Dodane 26.05.2011 (Cz) 20:31 –
Tak przy okazji, gdybym miał czas to bawił bym się z tym, tak długo, jak trzeba, ale TEMPUS FUGIT
public partial class Form1 : Form
{
private List imagesFolders;
private HashSet imagesExtensions;
private List images;
private int currentImageIndex;
private int currentFolderIndex;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string exeDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
imagesFolders = new List()
{
Path.Combine(exeDirectory,"dvd"),
Path.Combine(exeDirectory,"dvd2")
};
imagesExtensions = new HashSet()
{
"png",
"jpg"
};
images = new List();
}
private void button1_Click(object sender, EventArgs e)
{
currentFolderIndex = 0;
images.Clear();
images = GetImages(imagesFolders[currentFolderIndex], imagesExtensions);
currentImageIndex = 0;
pictureBox1.Image = images[currentImageIndex];
}
private void button4_Click(object sender, EventArgs e)
{
currentFolderIndex = imagesFolders.Count - 1;
images.Clear();
images = GetImages(imagesFolders[currentFolderIndex], imagesExtensions);
currentImageIndex = images.Count - 1;
pictureBox1.Image = images[currentImageIndex];
}
private void button3_Click(object sender, EventArgs e)
{
if (currentImageIndex != 0)
currentImageIndex--;
else if (currentFolderIndex != 0)
{
currentFolderIndex--;
images.Clear();
images = GetImages(imagesFolders[currentFolderIndex], imagesExtensions);
currentImageIndex = images.Count - 1;
}
pictureBox1.Image = images[currentImageIndex];
}
private void button2_Click(object sender, EventArgs e)
{
if (currentImageIndex != (images.Count - 1))
currentImageIndex++;
else if (currentFolderIndex != (imagesFolders.Count - 1))
{
currentFolderIndex++;
images.Clear();
images = GetImages(imagesFolders[currentFolderIndex], imagesExtensions);
currentImageIndex = 0;
}
pictureBox1.Image = images[currentImageIndex];
}
private List GetImages(string directoryPath, HashSet imagesExtensions)
{
List result = new List();
string[] fileNames = Directory.GetFiles(directoryPath);
if (fileNames != null && fileNames.Length > 0)
{
foreach (string fileName in fileNames)
{
if (imagesExtensions.Contains(Path.GetExtension(fileName).Replace(".", "").ToLower()))
{
result.Add((Image)(new Bitmap(fileName)));
}
}
}
return result;
}
}
To jest kod bez tego pokazu slajdów i bez obsługi wyjątków. Jakby coś było nie tak to pisz. Tych folderów możesz sobie natworzyć ile tam będziesz chciał. Przyjrzyj się po prostu co robię w zdarzeniu Load i w razie czego, gdy będziesz potrzebował dodatkowe foldery to je tam dodaj. Na razie sprawdź dla tych dwóch folderów i zobacz, czy zadziała.
Dzięki. Spróbujemy
– Dodane 26.05.2011 (Cz) 21:31 –
Index out of range
Hm. U mnie ten kod działa. Sprawdź w debuggerze, czy ścieżki folderów są poprawne (kolekcja imagesFolders). Jeśli są to sprawdź, czy w każdym z tych folderów masz zdjęcia. Nie zdążyłem dodać kodu, który zabezpiecza przed tym, że w danym folderze nie będzie zdjęć (będziesz to musiał zrobić sam). Jak coś to będę za około 2h.
exeDirectory “D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\bin\Debug” string
– Dodane 26.05.2011 (Cz) 21:52 –
Out of memory.
Co było powodem wyjątku “Index out of range”? I kiedy pojawia się wyjątek “Out of memory.”? W trakcie wczytywania zawartości pierwszego folderu, czy też w trakcie wczytywania zawartości drugiego folderu (już w czasie działania programu)? Jeśli w trakcie wczytywanie tego pierwszego folderu to znaczy, że wciąż jest za duży. Jeśli w trakcie wczytywania drugiego folderu to najprawdopodobniej garbage collector jeszcze nie zwolnił pamięci po poprzedniej kolekcji. W takiej sytuacji będziesz musiał poczytać jak wymusić, aby to zrobił w danej chwili (ewentualnie jak zrobić, żeby wstrzymać działanie programu dopóki tego nie zrobi).
Ewentualnie możesz powrócić do opcji, o której pisałem wcześniej (która IMO jest tutaj najlepsza). Czyli wczytywać do pamięci tylko jeden obrazek. Skoro użytkownik nie może dodawać i usuwać zdjęć z tego folderu to możesz to zrobić bardzo szybko. Po prostu załaduj do pamięci ścieżki wszystkich obrazków z tego jednego dużego folderu. Wówczas currentIndex będzie służył do przemieszczenia się po kolekcji tych ścieżek. W poszczególnych zdarzeniach Click będziesz po prostu ładował odpowiedni obrazek dla ściezki wskazywanej przez currentIndex. Proste? Proste.
Właśnie wszedłem, żeby napisać, że to na słabszych kompach nie da rady Wracamy do koncepcji 1-obrazek. Ale nie wiem jak się za to zabrać.
Każdy obrazek ma inną nazwę.
Co z tego? A co ja napisałem
BTW nie odpisałeś mi na moje pytanie z przedostatniego posta.
Wybacz. Tamto rozwiązałem, wystarczyło podzielić na mniejsze foldery. Ale potem strasznie muliło.
– Dodane 26.05.2011 (Cz) 22:49 –
Ok ścieżki załaduje, ale jak potem dostać się do tego zdjęcia? StreamReader ?
Tak samo jak było to robione do tej pory w metodzie GetImages, czyli (Image)new Bitmap(filePath).
Mi chodziło o to pytanie
BTW Ale się tasiemiec zrobił z tego topica
– Dodane 27.05.2011 (Pt) 2:51 –
Poniżej zamieszczam najnowszą wersję kodu (o to mi chodziło w jednym z moich poprzednich postów):
MyImage.cs
using System;
using System.Drawing;
using System.IO;
namespace ImageViewer
{
public class MyImage
{
public MyImage(string filePath)
{
FilePath = filePath;
FileExtension = Util.GetFileExtension(filePath);
Image = null;
}
public MyImage(string filePath, string fileExtension)
{
FilePath = filePath;
FileExtension = fileExtension;
Image = null;
}
public string FilePath { get; private set; }
public string FileExtension { get; private set; }
public Image Image { get; private set; }
public void Load()
{
if (File.Exists(FilePath))
Image = (Image)(new Bitmap(FilePath));
}
public void Clear()
{
if (Image != null)
{
Image.Dispose();
Image = null;
}
}
public override bool Equals(object obj)
{
return FilePath.ToLower().CompareTo(((MyImage)obj).FilePath.ToLower()) == 0;
}
}
}
MyImageCollection.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
namespace ImageViewer
{
public class MyImageCollection
{
public MyImageCollection(string directoryPath, HashSet fileExtensions)
{
DirectoryPath = directoryPath;
FileExtensions = fileExtensions;
Images = new List();
ResetIndex();
}
public string DirectoryPath { get; private set; }
public HashSet FileExtensions { get; private set; }
public List Images { get; private set; }
private int CurrentIndex { get; set; }
public MyImage Current
{
get
{
MyImage result = null;
if (Images.Count > 0)
{
result = Images[CurrentIndex];
}
return result;
}
}
public MyImage First
{
get
{
MyImage result = null;
if (Images.Count > 0)
{
CurrentIndex = 0;
result = Images[CurrentIndex];
}
return result;
}
}
public MyImage Last
{
get
{
MyImage result = null;
if (Images.Count > 0)
{
CurrentIndex = Images.Count - 1;
result = Images[CurrentIndex];
}
return result;
}
}
public MyImage Previous
{
get
{
MyImage result = null;
if (Images.Count > 0)
{
if (CurrentIndex > 0)
CurrentIndex--;
result = Images[CurrentIndex];
}
return result;
}
}
public MyImage Next
{
get
{
MyImage result = null;
if (Images.Count > 0)
{
if (CurrentIndex < (Images.Count - 1))
CurrentIndex++;
result = Images[CurrentIndex];
}
return result;
}
}
public void Load()
{
Load(false);
}
public void Load(bool onlyFilePaths)
{
string[] filePaths = Directory.Exists(DirectoryPath) ? Directory.GetFiles(DirectoryPath) : null;
if (filePaths != null && filePaths.Length > 0)
{
string fileExtension = string.Empty;
MyImage myImage = null;
foreach (string filePath in filePaths)
{
fileExtension = Util.GetFileExtension(filePath);
if (FileExtensions.Contains(fileExtension))
{
myImage = new MyImage(filePath, fileExtension);
Images.Add(myImage);
if (!onlyFilePaths)
myImage.Load();
}
}
}
}
public void Clear()
{
for (int i = 0; i < Images.Count; i++)
{
Images[i].Clear();
}
Images.Clear();
Images = new List();
CurrentIndex = 0;
}
public void Refresh()
{
Refresh(false);
}
public void Refresh(bool onlyFilePaths)
{
MyImage currentImage = null;
if (Images.Count > 0)
currentImage = Images[CurrentIndex];
Images = new List();
Load(onlyFilePaths);
if (currentImage != null)
{
ResetIndex();
for (int i = 0; i < Images.Count; i++)
{
if (Images[i].Equals(currentImage))
{
CurrentIndex = i;
break;
}
}
}
}
public void ResetIndex()
{
CurrentIndex = 0;
}
public bool DecreaseIndex()
{
bool result = false;
if (Images.Count > 0)
{
if (CurrentIndex > 0)
{
CurrentIndex--;
result = true;
}
}
return result;
}
public bool IncreaseIndex()
{
bool result = false;
if (Images.Count > 0)
{
if (CurrentIndex < (Images.Count - 1))
{
CurrentIndex++;
result = true;
}
}
return result;
}
}
}
Util.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace ImageViewer
{
public static class Util
{
public static string GetFileExtension(string filePath)
{
return File.Exists(filePath) ? Path.GetExtension(filePath).Replace(".", "").ToLower() : string.Empty;
}
public static HashSet GetImageFileExtensions()
{
//TODO: Add missing image extensions
return new HashSet()
{
"png",
"jpg"
};
}
public static string GetExecutableDirectoryPath()
{
return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
}
}
}
ImageViewerForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace ImageViewer
{
public partial class ImageViewerForm : Form
{
MyImageCollection images = null;
public ImageViewerForm()
{
InitializeComponent();
}
private void imageViewerForm_Load(object sender, EventArgs e)
{
images = new MyImageCollection(Path.Combine(Util.GetExecutableDirectoryPath(), "Images"), Util.GetImageFileExtensions());
images.Load(true);
firstButton_Click(null, null);
}
private void firstButton_Click(object sender, EventArgs e)
{
Clear();
Display(images.First);
}
private void previousButton_Click(object sender, EventArgs e)
{
Clear();
Display(images.Previous);
}
private void nextButton_Click(object sender, EventArgs e)
{
Clear();
Display(images.Next);
}
private void lastButton_Click(object sender, EventArgs e)
{
Clear();
Display(images.Last);
}
private void Clear()
{
images.Current.Clear();
pictureBox1.Image = null;
}
private void Display(MyImage image)
{
image.Load();
pictureBox1.Image = image.Image;
}
private void slideShowCheckBox_CheckedChanged(object sender, EventArgs e)
{
if (slideShowCheckBox.Checked)
{
if (images.Images.Count > 0)
{
firstButton.Enabled = false;
previousButton.Enabled = false;
nextButton.Enabled = false;
lastButton.Enabled = false;
backgroundWorker1.RunWorkerAsync();
}
}
else
{
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
}
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)
{
Display(images.Current);
Thread.Sleep(5 * 1000);
Clear();
if (!images.IncreaseIndex())
{
images.ResetIndex();
}
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
firstButton.Enabled = true;
previousButton.Enabled = true;
nextButton.Enabled = true;
lastButton.Enabled = true;
Display(images.Current);
}
}
}
Możesz teraz zobaczyć jak bardzo zmniejszyła się ilość kodu w formie i jak od razu łatwiej taki kod się czyta.
EDIT: Wprowadziłem do kodu wywołanie metody Dispose(), bo wciąż był problem ze zwalnianiem pamięci. Teraz jest już OK
Dzięki, za kod. Wszystko już mam, tylko nie bardzo orientuję się w pobieraniu ścieżek. Nie rozumiem tego #-o
– Dodane 27.05.2011 (Pt) 20:05 –
Coś jest nie tak:
Error 2 The type or namespace name 'MyImageCollection' could not be found (are you missing a using directive or an assembly reference?) D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 16 9 Wanderung Wędrówka Putovani
Error 3 The type or namespace name 'MyImageCollection' could not be found (are you missing a using directive or an assembly reference?) D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 25 26 Wanderung Wędrówka Putovani
Error 6 The name 'slideShowCheckBox' does not exist in the current context D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 69 17 Wanderung Wędrówka Putovani
Error 7 The name 'previousButton' does not exist in the current context D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 74 21 Wanderung Wędrówka Putovani
Error 10 The name 'previousButton' does not exist in the current context D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 108 13 Wanderung Wędrówka Putovani
Error 8 The name 'nextButton' does not exist in the current context D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 75 21 Wanderung Wędrówka Putovani
Error 11 The name 'nextButton' does not exist in the current context D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 109 13 Wanderung Wędrówka Putovani
Error 9 The name 'lastButton' does not exist in the current context D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 76 21 Wanderung Wędrówka Putovani
Error 12 The name 'lastButton' does not exist in the current context D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 110 13 Wanderung Wędrówka Putovani
Message 1 The designer has fixed inconsistent type names in a partial class. The partial class name 'Wanderung_Wędrówka_Putovani.Form1' has been changed to 'ImageViewer.ImageViewerForm'. 0 0
Error 4 The call is ambiguous between the following methods or properties: 'ImageViewer.MyImage.Load()' and 'ImageViewer.MyImage.Load()' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 63 13 Wanderung Wędrówka Putovani
Error 5 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\ImageViewerForm.cs.cs 64 39 Wanderung Wędrówka Putovani
Error 15 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 13 13 Wanderung Wędrówka Putovani
Error 18 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 20 13 Wanderung Wędrówka Putovani
Error 20 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 30 17 Wanderung Wędrówka Putovani
Error 21 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 35 17 Wanderung Wędrówka Putovani
Error 26 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 13 13 Wanderung Wędrówka Putovani
Error 29 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 20 13 Wanderung Wędrówka Putovani
Error 31 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 30 17 Wanderung Wędrówka Putovani
Error 32 Ambiguity between 'ImageViewer.MyImage.Image' and 'ImageViewer.MyImage.Image' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 35 17 Wanderung Wędrówka Putovani
Error 13 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 11 13 Wanderung Wędrówka Putovani
Error 16 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 18 13 Wanderung Wędrówka Putovani
Error 19 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 29 29 Wanderung Wędrówka Putovani
Error 22 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 44 20 Wanderung Wędrówka Putovani
Error 23 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 44 64 Wanderung Wędrówka Putovani
Error 24 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 11 13 Wanderung Wędrówka Putovani
Error 27 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 18 13 Wanderung Wędrówka Putovani
Error 30 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 29 29 Wanderung Wędrówka Putovani
Error 33 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 44 20 Wanderung Wędrówka Putovani
Error 34 Ambiguity between 'ImageViewer.MyImage.FilePath' and 'ImageViewer.MyImage.FilePath' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 44 64 Wanderung Wędrówka Putovani
Error 14 Ambiguity between 'ImageViewer.MyImage.FileExtension' and 'ImageViewer.MyImage.FileExtension' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 12 13 Wanderung Wędrówka Putovani
Error 17 Ambiguity between 'ImageViewer.MyImage.FileExtension' and 'ImageViewer.MyImage.FileExtension' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImageCollection.cs 19 13 Wanderung Wędrówka Putovani
Error 25 Ambiguity between 'ImageViewer.MyImage.FileExtension' and 'ImageViewer.MyImage.FileExtension' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 12 13 Wanderung Wędrówka Putovani
Error 28 Ambiguity between 'ImageViewer.MyImage.FileExtension' and 'ImageViewer.MyImage.FileExtension' D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 19 13 Wanderung Wędrówka Putovani
– Dodane 27.05.2011 (Pt) 20:06 –
Takie jak nazwy buttonów to wiadomo, ale z resztą sobie nie dam rady
– Dodane 27.05.2011 (Pt) 20:08 –
A tego w ogóle nie rozumiem :
Error 19 Ambiguity between ‘ImageViewer.MyImage.FileExtension’ and ‘ImageViewer.MyImage.FileExtension’ D:\Programowanie\Projekty\Wanderung Wędrówka Putovani\Wanderung Wędrówka Putovani\MyImagge.cs 12 13 Wanderung Wędrówka Putovani
:o
Trzymaj po prostu cały projekt: https://rapidshare.com/files/2569618869/ImageViewer.rar. Zobacz co i jak. Problemy mogą wynikać z tego, że Ty w projekcie masz inne przestrzenie nazw. A ja te wszystkie klasy umieściłem w przestrzeni nazw ImageViewer.
Dzięki. Bardzo mi pomogłeś.[*]