Hi @ All;
hier ein nicht ganz enifaches Thema, mit dem ich mich nicht wirklich auskenne, aber trotzdem für mein Prog brauche.
Ich poste mal den Code, dann kommen die Fragen:
Also falls ihn jemand gebrauchen kann: Der funktioniert soweit, und ist sogar rasend schnell!!
ZurInfo: **suchoption **ist ein durch (';') gesplittetes Array von Dateianhängen (.jpg;.gif u.s.w.) Und für jeden Dateianhang wird diese Funktion aufgerufen.
try
{
//Statusanzeige
Status status = new Status();
status.Show();
status.Text = "Suche...";
status.Statustext = "Suche nach: " + suchoption + " wurde gestartet ...";
status.Refresh();
string path = search_ort.Text;
imglist = new ImageList();
imglist.ColorDepth = ColorDepth.Depth16Bit;
imglist.Images.Clear();
this.ergebnisse.LargeImageList = imglist;
this.ergebnisse.LargeImageList.ImageSize = new Size(32, 32);
this.ergebnisse.View = View.LargeIcon;
string[] filenames = Directory.GetFiles(path, suchoption, SearchOption.AllDirectories);
this.ergebnisse.BeginUpdate();
foreach (string file in filenames)
{
FileInfo fi = new FileInfo(file);
Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
Image img = Image.FromFile(file).GetThumbnailImage(32, 32, myCallback, IntPtr.Zero);
ListViewItem lvi = new ListViewItem();
lvi.ImageIndex = imglist.Images.Add(img, Color.Transparent);
lvi.Tag = fi.FullName;
lvi.Text = fi.Name;
this.ergebnisse.Items.Add(lvi);
this.ergebnisse.Refresh();
}
status.Close();
int treffer = filenames.Length;
search_result.Text += Environment.NewLine + "Suche nach: " + suchoption + " : " + treffer + " Treffer.";
this.ergebnisse.EndUpdate(); // Update Beendet,wieder öffnen
}
catch (System.Exception err)
{
MessageBox.Show("Ein Fehler bei der Desktopsuche ist aufgetreten: "
+ System.Environment.NewLine + err.ToString(), "Fehler...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
**Frage: **
EDIT: // 2. Sobald große Dateien aufgerufen werden sollen, zeigt die Listview nur noch die Dateinamen an. (z.b. 400DPI) ; stürzt aber nicht ab!
_"In Hoffnung auf eine baldige positive Antwort verbleibe ich mit freundlichen Grüßen" _ lol
MFG Alex
---- >
Keine Signatur 😉
Hier könnte der Hund begraben sein...
Image img = Image.FromFile(file).GetThumbnailImage(32, 32, myCallback, IntPtr.Zero);
Image img=null;
using (Image imgTemp=Image.FromFile(file))
{
img=imgTemp.GetThumbnailImage(32,32,myCallback,IntPtr.Zero);
}
Image.FromFile liefert ja ein Image und dieses disposed Du nicht...
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Leider war der HUnd dort nicht begraben !
"Nicht genug Arbeitsspeicher" kommt trotzdem 🙁
Ich weiss echt nicht mehr weiter.
//Edit: Ich glaube es liegt an der IMAGELIST, das die nur soundsoviel Bilder aufnehmen kann, und dann mit der Fehlermeldung abbricht. Aber ich weiss
nicht, wie ich es anders lösen soll. Doppelpuffer gibts nicht bei Ihr.
//Edit 2: Ich hab versucht; Sobald eine bestimmte Menge an Bildern in der IMGList ist, diese dann anzuzeigen, und dann die Funktion rekursiv nochmal aufzurufen, aber NIX klappte.
---- >
Keine Signatur 😉
Wieviele Bilder befinden sich denn in der Imagelist?
Macht es überhaupt sinn soviele da reinzupacken? kann man eh nicht alle auf einmal sehen 🙂
Du kannst dir ja mal ausrechnen maximale Anzahl der Bilder * Thumbnail größe = Speicherverbrauch.
Die Menge der Bilder hängt von der Anzahl der Bilder ab, die sich in von Ihm gewähltem Ordner befinden. Hat dieser User, einen Ordner mit 500 Bildern, so muss ich Ihm die Möglichkeit geben, in einer Vorschau sämtliche Bilder anzeigen zu lassen.
Siehe im Windows Explorer, die Vorschau. Genauso muss mein Programm auch laufen.
Andere Frage: Gibt denn die Möglichkeit, beim Runterscrollen, eine Vorschau aufzurufen ?
MFG
Alex
---- >
Keine Signatur 😉
Schau Dir doch als Idee mal die beiden an.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...