vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Kleine Bilder in der Listview (Versoin 1) 
Autor: Sophus
Datum: 26.08.13 14:03

Hallo Franki, ich versuche mal etwas Übersicht rein zu bringen. Hier haben wir nur zwei Ereginisse. Zuerst werden die Bilder in die ListIamge und anschließend werden die Datensätze in die ListView geladen. Das Problem wurde ja schon benannt. Ich weiß nicht, wie ich die Dafault-Bilder mit in die ListView laden soll, und bei einer bestimmten Anzahl von Bilder hört es auf zu laden.

Version 1
Sub Bilder_laden()
On Error Resume Next
 
 
   ImageList3.ImageHeight = 246
   ImageList3.ImageWidth = 164
 
 
   ImageList4.ImageHeight = 70
   ImageList4.ImageWidth = 55
 
 
   Dim file As String, Path As String
 
   'Pfad mit JPG-Bilddateien
   Path = "C:\Dokumente und Einstellungen\Sophus\Desktop\Bilder\"
 
   'Bilder in Imagelist laden
   file = Dir(Path & "*.jpg")
   Do While file <> ""
     Image1 = LoadPicture(Path & file)
     ImageList3.ListImages.Add , Path & file, Image1
     ImageList4.ListImages.Add , Path & file, Picture2
 
     file = Dir
 
   Loop
 
 
   'Filenamen ins Listview eintragen und per Schlüssel
   'auf die ImageList verweisen
   ListView1.Icons = ImageList3
   ListView1.SmallIcons = ImageList4
 
 
   file = Dir(Path & "*.jpg")
   Do While file <> ""
        Image1 = LoadPicture(Path & file)
        file = mid(file, 1, Len(file) - 4)
        ImageList3.ListImages.Add , "x" & file, Image1
        file = Dir
    Loop
 
 
Call movie_Laden_Daten
 
End Sub
 Sub movie_Laden_Daten()
 On Error Resume Next
 Dim dy2 As Recordset
 Dim mdbdbfile As Database
 
'Dim DefaultKey As String, imagekey As String
'DefaultKey = "default"
 
    Set mdbdbfile = OpenDatabase(midi.sKeyNames1.Text)
    Set dy2 = mdbdbfile.OpenRecordset("film", dbOpenTable)
    With StatusBar1.Panels(1)
    .Text = "Anzahl der gespeicherten Filme: " & dy2.RecordCount
 
 ListView1.ColumnHeaders.Add , "Col0", "ID" 
 ListView1.ColumnHeaders.Add , "Col1", "Filmtitel" 
 ListView1.ColumnHeaders.Add , "Col2", "Originaltitel" 
 ListView1.ColumnHeaders.Add , "Col3", "Regie" 
 ListView1.ColumnHeaders.Add , "Col4", "Genre" 
 ListView1.ColumnHeaders.Add , "Col5", "Jahr"
 
 Dim itmX As ListItem
 
        ListView1.ListItems.Clear
 
   While Not dy2.EOF
 
         Set itmX = ListView1.ListItems.Add(, "x" & CStr(dy2!Id), CStr(dy2( _
           "[ID]") & " " & "  " & (dy2("[Title]") & "  (" & (dy2( _
           "[originaltitle]") & ")"))), "x" & CStr(dy2!Id))
 
           Dim ti As String
           Dim I As String
             I = dy2!Title
             If IsNull(n) Then ti = "." Else ti = I
 
          Dim org As String
          Dim og As String
            og = dy2!originaltitle
             If IsNull(n) Then org = "." Else org = og
 
          Dim reg As String
          Dim nvv As String
            nvv = dy2!regie
              If IsNull(n) Then reg = "." Else reg = nvv
 
         Dim genr As String
         Dim M As String
            M = dy2!genre
             If IsNull(M) Then genr = "." Else genr = M
 
        Dim yr As String
        Dim g As String
           g = dy2!Year
            If IsNull(n) Then yr = "." Else yr = g
 
         itmX.SubItems(1) = ti
         itmX.SubItems(2) = org
         itmX.SubItems(3) = reg
         itmX.SubItems(4) = genr
         itmX.SubItems(5) = yr
 
         dy2.MoveNext
 
            Wend
 
         dy2.MoveFirst
 
     dy2.Close
 
  End With
 
End Sub


Beitrag wurde zuletzt am 26.08.13 um 14:12:26 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Kleine Bilder in der Listview 
Autor: Sophus
Datum: 27.07.12 17:28

Hallo Leute,

ich möchte mich im Voraus entschuldigen, wenn dieses Thema schon bereits besprochen wurde. Und natürlcih möchte ich mich dafür entschuldigen, wenn meine Betreffzeile nicht geizielt bzw. nicht präzise genug die Problematik zum Ausdruck bringt.

Nun, ich möchte zunächst mal ganz allgemein fragen, also weniger spezifisch. Bevor ich aber die Frage gezielt stellen kann, muss ich wohl etwas ausholen. Also, in meinem Verwaltungsprogramm verwalte ich unteranderem auch meine Filme. Und die Filme werden dann in einer Übersicht über die ListView ausgegeben. Soweit läuft auch alles wunderbar. Aber mittlerweile merke ich, dass es uninteressanter wird. Ich weiß nicht, wie ihr agiert, aber ich bin ein sehr visueller Mensch. Wenn ich durch irgendeine Videothek gehe, und mich spricht ein DVD-Cover an, so gehe ich näher zum Regel und schaue mir den Inhalt an, was der Film so bietet, und anschließend leihe ich es mir aus oder nicht. Und so möchte ich es in meiner ListView machen. Das heißt, es sollen kleine Bilder, welche die DVD-Cover darstellen, in der ListViwe ausgegeben werden.

Also, oben das Cover-Bild, und drunter den Namen des Filmes. Und da man recht viele bzw. unterschiedliche Filme hat, so hat man auch unterschiedliche Cover-Bilder.

Mir ist ja bekannt, dass man im ListView mit Hilfe von ImageList Icons ausgeben kann. Aber dies würde in diesem Fall nicht mein Anliegen lösen.

Daher zunächst und simple die Frage, ob es erstmal möglich wäre, dass man unterschiedliche Cover-Bilder in die ListView laden kann, natürlich muss es zum Film dazu gehören.

Vielen Dank im Voraus

Euer Sophus

Beitrag wurde zuletzt am 27.07.12 um 17:32:36 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: ModeratorDieter (Moderator)
Datum: 27.07.12 17:54

Nur in Verbindung mit dem ImageList-Control, d.h. die Cover müssen dem ImageList-Control hinzugefügt werden. Das ImageList-Control wiederum wird an das ListView gebunden.

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 27.07.12 18:00

Ja, so kenne ich das auch. Aber allgemein sehe ich das nicht als Lösung. Denn es ist ja ein Verwaltungsprobramm. Die Filmdaten werden in einer Datenbank hinterleg. Und zu jedem entsprechendne Film soll dann ein entsprechener Cover angezeigt werden. So ähnlich wie beim Thumbnails, wo dann drunter der Filmtitel steht. Klickt man mit einem Doppelblick drauf, so werden dann die Daten des Filmes im Detail gezeigt. Und das lässt sich mit einer Image-List bewältigen?

Ich habe mich ja über Google etwas schlau gemacht, aber die Meisten wollen die Bilder aus einem Verzeichnis in ihre ListView laden - ganz willkürlich ohne Zugehörigkeit.

Ich weiß, ich habe nicht das Talent alles vernünftig auszudrücken und mein Anliegen vernünftig zu präsentieren. Entschuldige.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: ModeratorDieter (Moderator)
Datum: 27.07.12 18:04

Wenn du die Bilder im ListView anzeigen willst, bleibt dir nichts anderes übrig, als diese zuvor in ein ImageList-Control zu laden.

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 27.07.12 18:10

Und es lässt sich dann auch zuordnen? Also dass die Bilder nicht willkürlich in die ListView geladen wird, sondern dass ein jeder Film sein entsprechendes Cover bekommt?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: ModeratorDieter (Moderator)
Datum: 27.07.12 18:17

Du könntest ja bspw. den Dateinamen als "Key"-Wert verwenden (im Imagelist)

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 27.07.12 18:36

Nun, das wäre sozusagen die "einfache" Methode, richtig? Es ist ja möglich, dass man Bilder in eine Datenbank ablegen kann - zum Beispiel in eine Access-Datenbank. Ich glaube, dann wird das Bild "zerlegt", und nicht als volles Bild, so wie wir es sehen, in die Datenbank hinterlegt. Ginge es dann auch über diese Methode? Also, man hinterlegt die Bilder in eine Datenbank und ruft dann die Bilder von der Datenbank ab, und läd es in eine ListView?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 29.07.12 02:39

Hallo,

Die Bilder sollte man nicht in einer Access DB speichern sondern nur deren Ort auf der Festplatte.

Dann kannst du z.B. ein Recordset erstellen, dieses durchlaufen und die Bilder der ImageList zuordnen. Ich verwende dabei zwei unsichtbare Picture Boxen damit ich die Bilder vorher noch bearbeiten kann bei Bedarf. Über das Recordset kannst du auch den Text zuweisen der dann unter dem Bild im ListView angezeigt werden soll.

Damit hast du dann auch die Daten die du brauchst wenn du per Doppelklick die Details zum Film anzeigen möchtest.

Wo genau liegt denn dein Problem? (Code)

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 29.07.12 03:32

Hey,

vielen Dank für deine Antwort und Hilfe. Nun eine Frage hätte ich. Deine Aussage, man solle keine Bilder in die Access Datenbank abspeichern. Diese Aussage klang irgendwie allgemeingültig oder bezog es auf meinem Fall?

Zum "Problem", ich habe noch nicht angesetzt mit dem codieren. Wie gesagt, bis hierher werden momentan die Filme aus meiner Datenbank über die ListView angezeigt. Aber irgendwann dachte ich darüber nach, die ListView und damit die Übersicht generell zu verschönern. Da mir sehr stark aufgefallen ist, dass ich ein sehr visueller Mensch bin und weniger "lese", sondern eher nach dem Cover-Bild handel. Und da wollte ich generell wissen, ob es möglich ist.

Aber wenn wir schon beim Thema Code sind. Gibt es hier in diesem Portal verständnishalber ein kleines Beispiel zu diesem Fall?

Besten Dank schonmal

Sophus
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 29.07.12 17:56

Hallo!

Kleine Bilder (Thumbnails) kannst Du in der ACCESS-Datenbank speichern.
Dieser VB@Archiv Extratipp enthält weiterführende Hinweise:
http://www.vbarchiv.net/xtra/details.php?id=9062

Wenn Du die Namen der Filme als "Keys" im Imagelist verwenden möchtest,
mußt Du darauf achten, dass diese Schlüssel eindeutig sind.

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 29.07.12 18:27

Hey, ich kann nicht auf diesen Link zugreifen. Hier wird dann ein User und Passwort abgefragt. Ich denke, es handelt sich hier um einen falschen Link?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 29.07.12 18:32

Hallo!

Das ist ein Extratipp.
Du mußt den VB@Archiv-Newsletter abonnieren (kostenlos).
Du erhälst eine Antwort-E-Mail, die per Click zu bestätigen ist.
Dort steht das benötigte Passwort und der Benutzername,
um auf diese Tipps zugreifen zu können.

http://www.vbarchiv.net/home/newsletter.php


Einfache Variante - ohne Passwort:
http://www.activevb.de/tipps/vb6tipps/tipp0577.html

MfG
Manfred

Beitrag wurde zuletzt am 29.07.12 um 18:42:31 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 31.07.12 02:16

Hallo,

Zitat:


Deine Aussage, man solle keine Bilder in die Access
Datenbank abspeichern. Diese Aussage klang irgendwie
allgemeingültig oder bezog es auf meinem Fall?


Das war eher allgemeiner Natur, da ich ja deinen persönlichen Fall nicht kenne. Natürlich ist es technisch gesehen möglich Bilder in einer Access Datenbank zu speichern (Siehe Antwort von ManfredX), allerdings wird die DB dadurch sehr schnell sehr groß (Access DBs haben Größenbeschränkung) und langsam.

Wenn du eine private Videosammlung mit ein paar Filmen verwalten möchtest spricht nichts dagegen.

Die Hauptbilder zu den Filmen solltest du aber nicht in der DB speichern, ManfredX sprach ja auch nur von Thumbnails. Deswegen kannst du auch gleich alle Bilder im Dateisystem speichern und nur den jeweiligen Pfad in der DB. Warum zweigleisig fahren, das bringt meiner persönlichen Meinung nach keine Vorteile.

Zitat:


... ich ein sehr visueller Mensch bin und
weniger lese, sondern eher nach dem Cover-Bild
handel. Und da wollte ich generell wissen, ob es möglich ist.


Ja klar ist das möglich, genau dieses Szenario nutze ich in einer VB6 Software die Bildergalerien für Websites verwalten kann oder auch Artikelübersichten in Onlineshops.

Zitat:


Aber wenn wir schon beim Thema Code sind. Gibt es hier in
diesem Portal verständnishalber ein kleines Beispiel zu
diesem Fall?


Schau einfach mal die Tipps und Tricks Rubrik durch, es sind ja mehrere Themen zutreffend.

Wie fülle ich eine ImageList zur Laufzeit mit Bildern?
Wie fülle ich ein ListView zur Laufzeit mit Bildern aus einer Imagelist?
Wie erkenne ich einen Doppelklick auf ein Item und lade weitere Informationen aus der DB?
Wie erstelle ich automatisch ein ThumbNail aus einem vorhandenen Bild und speichere es?

Für alle diese Themen gibt es hier viel Info.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 31.07.12 03:51

Hallo,

vielen Dank für deine Antwort. Also, entweder ich stelle mich etwas unbeholfen an oder aber in dieser Rubrik "Tipps und Tricks" ist nichts zu diesem Thema zu finden. Auch habe ich mich an diese Suchfunktion rangemacht - auch nichts gefunden. Schade.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 31.07.12 15:11

Hallo!

Wo genau kommst Du nicht weiter?

Hier ein kleines Beispiel.
Bild-Dateien aus einem Ordner laden und
in einer vorgegebenen Größe in Imagelist
aufbewahren und im Listview mit dem Dateinamen
als Thumbnail anzeigen.
Das Seitenverhältnis der Bilder muss ggf.
noch an das Thumbnail-Format angepasst werden.

Ziehe ein Listview, eine Imagelist und ein Image-Bildfeld
auf ein Formular:
Option Explicit
 
Private Sub Form_Load()
 
   ListView1.ColumnHeaders.Add , "Bild", "bild", 3000
 
   Image1.Visible = False
   ImageList1.ImageHeight = 200
   ImageList1.ImageWidth = 200
 
   Dim file As String, path As String
 
   'Pfad mit JPG-Bilddateien
   path = "F:\Daten\"
 
   'Bilder in Imagelist laden
   file = Dir(path & "*.jpg")
   Do While file <> ""
     Image1 = LoadPicture(path & file)
     ImageList1.ListImages.Add , path & file, Image1
     file = Dir
   Loop
 
   'Filenamen ins Listview eintragen und per Schlüssel
   'auf die ImageList verweisen
   ListView1.Icons = ImageList1
   file = Dir(path & "*.jpg")
   Do While file <> ""
     ListView1.ListItems.Add , path & file, path & file, path & file
     file = Dir 
   Loop
 
End Sub


Beitrag wurde zuletzt am 31.07.12 um 15:16:44 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 01.08.12 00:30

Hey Manfred X,

vielen dank für deine Mühe. Aber der Code scheint nicht zu funktionieren. Ich habe ein neues Projekt aufgemacht, eine Form erstelt, eine Listview hinzugefügt, den Code in die Form geschrieben, und ich habe noch diesen Code mit:

On Error Resume Next
bestückt, damit nicht sämtliche Probleme aukreuzen. Und wenn ich das Projekt dann starte, dann passiert nichts... ListView ist weiß.... und selbstverständlich habe ich den Pfad angepasst... aber dennoch nichts... Aber trotzdem vielen lieben Dank.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 01.08.12 00:55

Hallo,

Zitat:


der Code scheint nicht zu
funktionieren. Ich habe ein neues Projekt aufgemacht, eine
Form erstelt, eine Listview hinzugefügt,


Nur ListView sonst nichts? Dann kann das ja nicht klappen.
Du brauchst auch noch ImageList und Image.

Zitat:


und ich habe noch diesen Code mit:
On Error Resume Next
bestückt, damit nicht sämtliche Probleme aukreuzen.


Welche sämtlichen Probleme denn? Wenn du die Fehlermeldungen bewußt abschaltest, dann brauchst du dich auch nicht zu wundern, dass es nicht klappt und man dir nicht konkret helfen kann.

Ich habe den Code eben kurz getestet, hat auf Anhieb funktioniert. Ok die Bilder sehen nicht gut aus, aber darum geht es jetzt ja nicht.

Zitat:


Und wenn
ich das Projekt dann starte, dann passiert nichts...


Logisch, weil du alles mit der zusätzlichen Codezeile unterdrückt hast. Nimm die raus, poste die Fehlermeldungen und dann sehen wir weiter.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 01.08.12 01:04

Hallo!

Eine Fehlerbehandlung empfiehlt sich für die LoadPicture-
Funktion. Der Versuch, fehlerhafte JPGs zu laden, kann
eine Ausnahmen auslösen. In dem Fall könnte z.B. ein Standard-
Bild unter dem Schlüssel des Dateinamens in der Imagelist
abgelegt werden.

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 01.08.12 01:29

Jetzt habe ich mal diesen
On Error Resume Next
rausgenommen, und das Projekt nochmal gestartet. Und ja, ich habe die Image1 und die ImageList1 hinzugefügt. Wenn ich es nun starte, kommt folgendes:

Laufzeit '35613':
Das Abbildungsliste-Steuerelement muß vor der Verwendung intialisiert werden.


Und sobald ich auf "Debuggen" gehe wird bei folgender Zeile gelb markiert (Im Code wurd die entsprechende Zeile fett hervorgehoben und mit einem Kommentar versehen):

Option Explicit
 
Private Sub Form_Load()
 
   ListView1.ColumnHeaders.Add , "Bild", "bild", 3000
 
   Image1.Visible = False
   ImageList1.ImageHeight = 200
   ImageList1.ImageWidth = 200
 
   Dim file As String, path As String
 
   'Pfad mit JPG-Bilddateien
   path = "F:\Daten\"
 
   'Bilder in Imagelist laden
   file = Dir(path & "*.jpg")
   Do While file <> ""
     Image1 = LoadPicture(path & file)
     ImageList1.ListImages.Add , path & file, Image1
     file = Dir
   Loop
 
   'Filenamen ins Listview eintragen und per Schlüssel
   'auf die ImageList verweisen
   ListView1.Icons = ImageList1 '<<<<<<< hier wird es dann gelb markiert...
   file = Dir(path & "*.jpg")
   Do While file <> ""
     ListView1.ListItems.Add , path & file, path & file, path & file
     file = Dir 
   Loop
 
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 01.08.12 01:33

Hallo Manfred,

ja klar, das sind die Feinheiten, man könnte z.B. dieses anwenden.

http://www.vbarchiv.net/tipps/details.php?id=1264

Ich glaube aber nicht, dass es sich beim OP um dieses Problem handelt, zumal er ja keine Fehlermeldungen auswertet bzw. darauf reagiert. Das wäre schon Zufall wenn es sich da um gleich mehrere fehlerhafte Bilder handeln würde.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 01.08.12 01:58

Hallo!

Das kann eigentlich nur passieren,
wenn KEINE JPG-Dateien im Ordner (Path) vorliegen
oder wenn die Pfadangabe nicht mit einem Backslash endet
oder wenn aufgrund einer Fehler-Reaktion die
erste File-Schleife nicht ausgeführt wird.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 01.08.12 01:59

Hallo,

Welche VB Version werwendest du auf deinem Entwicklungsrechner und mit welchem Betriebssystem? Ich habe so den Verdacht, dass es daran liegt, denn wie gesagt, der Code von ManfredX funktioniert bei mir einwandfrei.

Bemühe mal eine Suchmaschine deiner Wahl mit deiner Fehlermeldung, da kommen viele Ergebnisse die darauf schliessen lassen, dass du da VB6 unter Win7 oder Vista verwendest.

Ich will jetzt auch keine Grundsatzdiskussion beschwören, nur soviel, dass ich die VB6 IDE ausschließlich auf Rechnern <= XP verwende. Damit bleibe ich sowohl aufwärts als auch abwärtskompatibel wenn es notwendig ist.

Gruß´
Frank


Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 01.08.12 02:06

Ich benutze VB6 auf einem Windows 2000 SP 4 Rechner. Aber Manfred X hatte Recht, es hat im Pfad einfach nur dieser eine BackFlash am Ende gefehlt. Und ja, die Bilder sehen auch sehr komisch bei mir aus - alles so groß gezogen. Muss ich nun die ImageList1 in der Benutzerdefinition so einstellen, dass es nur kleine Bilder, also 16x16 oder 32x32 ausspuckt?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 01.08.12 10:10

Hallo!

Die Imagelist besitzt die Eigenschaften
ImageHeight und ImageWidth. Damit kann eingestellt
werden, wie groß die Bilder in der View-Einstellung
lvwIcon der Listview dargestellt werden.
Besitzen alle geladenen Bilder das gleiche Seitenverhältnis
lassen sie sich verzerrungsfrei darstellen.

Du kannst eine zweite Imagelist verwenden und die
Bilder kleiner als "SmallIcons" laden. Diese Bilder
werden bei den Listview-Einstellungen lvwSmallIcon, lvwReport
oder lvwList verwendet.

Private Sub Form_Load()
 
ListView1.ColumnHeaders.Add , "Bild", "bild", 3000
 
Image1.Visible = False
 
ImageList1.ImageHeight = 200
ImageList1.ImageWidth = 200
 
ImageList2.ImageHeight = 32
ImageList2.ImageWidth = 32
 
Dim file As String, path As String
path = "F:\Daten\"
 
file = Dir(path & "*.jpg")
Do While file <> ""
  Image1 = LoadPicture(path & file)
  ImageList1.ListImages.Add , path & file, Image1
  ImageList2.ListImages.Add , path & file, Image1
  file = Dir
Loop
 
ListView1.Icons = ImageList1
ListView1.SmallIcons = ImageList2
file = Dir(path & "*.jpg")
Do While file <> ""
  '4 x !! 
  ListView1.ListItems.Add , path & file, path & file, path & file, path & file
  file = Dir
Loop
 
ListView1.View = lvwReport
 
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 01.08.12 20:15

Hey Manfred X,

es hat geklappt. Viele Dank. Ich kann mich eigentlich nie genug bedanken. Jetzt allerdings habe ich folgende Überlegung. Ich habe schon am Code herum probiert, wie ich diese komplette Pfad-Angabe aifblenden kann - am besten keine Angabe. Denn in meiner Datenbank sind ja Filmdaten hinterlegt und diese werden über die ListView ausgegeben.

Damit ich es richtig verstehe. Ich will ja, dass die Bilder, die in die ImageList1 geladen und anschließend in die ListView angezeigt wwerden. Jedoch nicht "willkürlich", sondern zum entsprechenden Film passend. Heißt das nun, dass ich die Bilder dann nach den Filmen benennen muss? Denn über meine ListView lasse ich auch meine ID anzeigen. Das heißt, in der Report-Ansicht kommt erst die Spalte mit der ID, dann der Filmtitel. Demnach wäre es eher sinnvoll, die Bilder nach den jeweiligen IDs zu benennen, damit diese auch entsprechend zu den jeweiligen Filmtitel richtig angezeigt werden, oder?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 01.08.12 21:01

Hallo!

Die Verknüpfung zwischen den Bildern in der Imagelist (kleine oder große
Bilder) und den Filmdaten im Listview kannst Du über die Schlüssel
frei gestalten.
Die Schlüsselwerte müssen in einer Imagelist eindeutig sein, sonst
gibt es für diese Zeichenfolgen (String) keine Einschränkungen.
Du kannst also auch Deine Datenbank-ID verwenden, wenn sie sich als
Zeichenfolge darstellen läßt (geht natürlich auch mit einer Ziffernfolge).

So sehen die Parameter der Add-Methode aus.
ImageList1.ListImages.Add [Index], [Schlüssel], Bild (Image)

Den ersten Parameter kannst Du weglassen (Komma wie im Beispiel), danach
der gewünschte Schlüsselwert (z.B. ID der Datenbankzeile mit den Filmdaten).
Der Name der Bilddatei oder des Films spielt dann keine Rolle.

So wird der ListView-Eintrag erstellt:
ListView1.ListItems.Add [Index], [Schlüssel], [Text], [Symbol], [kleines Symbol]

Aufgepasst:
Hier muss der Schlüsselwert der Imagelist für große Icons an den Parameter "Symbol"
übergeben werden, die ID der Imagelist für kleine Icons (kann die identische ID
mit der aus der Liste für große Icons sein - ist ja eine andere ImageList) an den
Parameter für "kleines Symbol".
Auch hier kannst Du den Index weglassen und die ID zusätzlich noch als Schlüssel für
die Zeile auf den zweiten Parameter zuweisen.
z.B. Parameter: , ID, Filmtitel, ID, ID (falls zwei ImageLists beim ListView-Control
verwendet werden, vgl Beispiel).

Übrigens:
Die Werte, die an den Parameter Symbol bzw. kleines Symbol gegeben werden, müssen nicht
eindeutig sein. Du kannst ein Bild aus der Imagelist bei mehreren Listview-Items anzeigen
lassen (z.B. falls Cover fehlen, kannst Du in diesen Zeilen ein einheitliches "Missing-Picture"
anzeigen lassen).

MfG
Manfred

Beitrag wurde zuletzt am 01.08.12 um 21:07:02 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 01.08.12 21:58

Hallo Manfred X,

ich komme leider nicht ganz mit. Ich kopiere dir zunächst mal meinen Code, also der meine Datenbank ausliest. Dieser Ladevorgang wird mit einem Call-Befehl abgerufen. Schließlich habe ich nur eine ListView, aber mehre Sachen werden in meiner Datenbank gespeichert, wie Kontaktdaten, Bücher und blah. Daher diese Prozedure.

Sub movie_laden()
On Error Resume Next
Dim dy2 As Recordset
Dim mdbdbfile As Database
Dim itmX As ListItem
Dim ti As String
Dim I As String
Dim org As String
Dim og As String
Dim Vn As String
Dim nvv As String
Dim gn As String
Dim g As String
Dim Nachname As String
Dim M As String
 
 
    Set mdbdbfile = OpenDatabase(midi.sKeyNames1.Text)
    Set dy2 = mdbdbfile.OpenRecordset("film", dbOpenTable)
    With StatusBar1.Panels(1)
    .Text = "Anzahl der gespeicherten Adressen: " & dy2.RecordCount
 
             Me.MousePointer = vbHourglass
 
                 ListView1.ColumnHeaders.Add , "Col0", "ID" 
                 ListView1.ColumnHeaders.Add , "Col1", "Filmtitel" 
                 ListView1.ColumnHeaders.Add , "Col2", "Originaltitel" 
                 ListView1.ColumnHeaders.Add , "Col3", "Regie" 'Vorname
                 ListView1.ColumnHeaders.Add , "Col4", "Genre" 'Nachname
                 ListView1.ColumnHeaders.Add , "Col5", "Jahr"
 
       Call GetColumnHeader 'Dies liegt im Modul
 
       ListView1.ListItems.Clear
 
If dy2.EOF And dy2.BOF Then
    MDIForm1.mnubearbeiten.Enabled = False
 Exit Sub
End If
 
While Not dy2.EOF
    Set itmX = ListView1.ListItems.Add(, "x" & CStr(dy2!Id), CStr(dy2("[ID]")))
 
 
I = dy2!Title
If IsNull(n) Then ti = "." Else ti = I
 
og = dy2!originaltitle
If IsNull(n) Then org = "." Else org = og
 
 
nvv = dy2!regie
If IsNull(n) Then Vn = "." Else Vn = nvv
 
M = dy2!genre
If IsNull(M) Then Nachname = "." Else Nachname = M
 
g = dy2!Year
If IsNull(n) Then gn = "." Else gn = g
 
itmX.SubItems(1) = ti 'Titel
itmX.SubItems(2) = org 'Originaltitel
itmX.SubItems(3) = Vn 'Regie
itmX.SubItems(4) = Nachname ' Genre
itmX.SubItems(5) = gn 'Jahre
 
 
dy2.MoveNext
Wend
dy2.MoveFirst
 
dy2.Close
 
Call Prz_Bilder_Laden
 
Me.MousePointer = vbNormal
End With
 
End Sub
Und mit dem Prz_Bilder_Laden werden nun die Bilder geladen. Die Bilder haben den Namen der ID. Das heißt, wenn der Film die ID 12345 hat, so heißt das Bild auch 12345. Die Benennung der Bildernamen habe ich zunächst manuel vorgenommen.


Sub Prz_Bilder_Laden()
 
   ListView1.ColumnHeaders.Add , "Bild", "bild", 3000
 
   Image1.Visible = False
   ImageList1.ImageHeight = 200
   ImageList1.ImageWidth = 200
 
   ImageList2.ImageHeight = 32
   ImageList2.ImageWidth = 32
 
   Dim file As String, path As String
 
   'Pfad mit JPG-Bilddateien
   path = "F:\Daten\"
 
   'Bilder in Imagelist laden
   file = Dir(path & "*.jpg")
   Do While file <> ""
     Image1 = LoadPicture(path & file)
     ImageList1.ListImages.Add , path & file, Image1
     ImageList2.ListImages.Add , path & file, Image1
     file = Dir
   Loop
 
   'Filenamen ins Listview eintragen und per Schlüssel
   'auf die ImageList verweisen
   ListView1.Icons = ImageList1
   ListView1.SmallIcons = ImageList2
   file = Dir(path & "*.jpg")
   Do While file <> ""
      ListView1.ListItems.Add , path & file, path & file, path & file, path & _
        file
     file = Dir 
   Loop
 
End Sub
Wenn ich das zunächst so in diesem Stil mache, werden die Bilder extra geladen. Das heißt, erst lädt er mir sämtliche Filmtitel, und danach die Bilder hinten ran. Die beiden werden also nicht miteinander verknüpft. Und genau da stecke ich momentan und komme mit deiner Ausfürhung ganz hinterher - ich bin leider noch etwas weit unten am Level - ein blutiger Anfänger. Daher wollte ich dich fragen, ob du es an meinem Code zeigen könntest, was du ungefähr meintest?

Beitrag wurde zuletzt am 01.08.12 um 22:01:40 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 01.08.12 22:25

Mit dieser Zeile

Set itmX = ListView1.ListItems.Add(, "x" & CStr(dy2!Id), CStr(dy2("[ID]")))

erstellst Du ein Item, das den ListItem-Schlüssel x & cstr(dy2!ID) besitzt und als
Text cstr(dy"[ID]")

Es fehlt noch der Verweis auf das Bild aus der Imagelist.
Eine reine Ziffernfolge wird als Index interpretiert, deswegen stellst
Du vor die "Id" noch einen Buchstaben:

Set itmX = ListView1.ListItems.Add(, "x" & CStr(dy2!Id), CStr(dy2("[ID]")), "x" & cstr(dy2!ID))

Zuvor füllst Du die Imagelist mit den Bildern.
Die benötigen auch Deine mit x versehene IDs als Schlüssel.
Dafür kannst Du, wie Du es beschreibst, den Filenamen benutzen.
Du mußt also die Pfadangabe im Schlüssel weglassen und dafür - wie oben - ein "x" voranstellen.
Wahrscheinlich mußt Du auch noch die File-Extension (.jpg) im File-Namen abschneiden.

So oder ähnlich ...

Do While file <> ""
Image1 = LoadPicture(path & file)
file = Mid(file, 1, Len(file) - 4)
ImageList1.ListImages.Add , "x" & file, Image1
file = Dir
Loop

Die zweite Schleife, die Listitems erstellt, mußt Du entfernen.
Die Items erhältst Du bereits aus der Routine die auf die
Datenbank zugreift.

Um das genau hinzukriegen, mußt Du das Programm ggf. debuggen.
Aus der Ferne läßt sich das nur ungefähr beurteilen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 02.08.12 00:44

Hallo Manfred X,

ich habe deinen Rat komplett befolgt... und folgendes ist dabei rausgekommen... zunächst die positive Nachrichten... ich habe das Ganze ohne
On Error Resume Next
laufen lassen und es [u]kam keine Fehlermeldung. Und [u]es funktioniert nur bedingt. Dazu habe ich dir ein ScreenShot gemacht: hier http://s14.directupload.net/file/d/2970/xi2gnbyd_jpg.htm.
Jetzt die schlechten Nachrichten. Wie du anhand des Bildes erkennen kannst, wird nur in der
ListView.View = lvwIcons
[u]nur die Zahlen angezeigt, anstatt den Filmnamen. Des Weiteren sieht man, dass ich weit über 500 Filme in meiner Datenbank habe (Siehe in der Statusbar - auch wenn da 'Adressen' steht.). Aber es werden [u]nur die Filme hochgeladen, die auch eine Cover haben. Damit du auch nochmal hinter die Kulisse blicken kann, zeige ich dir mal den Code, wie ich es realisiert habe.

Ich habe einfach mal die Prozduren getauscht. In Sub movie_laden werden zuerst die Bilder geladen, da dies die erste Prozedure ist, die mit dem Call-Befehl angesprochen wird.

Sub movie_laden()
 
   Image1.Visible = False
   ImageList1.ImageHeight = 200
   ImageList1.ImageWidth = 200
 
   ImageList2.ImageHeight = 32
   ImageList2.ImageWidth = 32
 
   Dim file As String, path As String
 
   'Pfad mit JPG-Bilddateien
   path = "F:\Daten\"
 
   'Bilder in Imagelist laden
   file = Dir(path & "*.jpg")
   Do While file <> ""
     Image1 = LoadPicture(path & file)
     ImageList1.ListImages.Add , path & file, Image1
     ImageList2.ListImages.Add , path & file, Image1
     file = Dir
   Loop
 
   'Filenamen ins Listview eintragen und per Schlüssel
   'auf die ImageList verweisen
   ListView1.Icons = ImageList1
   ListView1.SmallIcons = ImageList2
   file = Dir(path & "*.jpg")
   Do While file <> ""
        Image1 = LoadPicture(Path & file)
        file = mid(file, 1, Len(file) - 4)
        ImageList1.ListImages.Add , "x" & file, Image1
        file = Dir
    Loop
     Call movie_Laden_Daten
End Sub
Nachdem die Bilder in der ersten Prozedur geladen wurden folgen die Daten aus der Datenbank. Und ich muss noch hinzufügen, dass das Laden [u]enorm lange dauert.

Sub movie_Laden_Daten()
On Error Resume Next
Dim dy2 As Recordset
Dim mdbdbfile As Database
Dim itmX As ListItem
Dim ti As String
Dim I As String
Dim org As String
Dim og As String
Dim Vn As String
Dim nvv As String
Dim gn As String
Dim g As String
Dim Nachname As String
Dim M As String
 
 
    Set mdbdbfile = OpenDatabase(midi.sKeyNames1.Text)
    Set dy2 = mdbdbfile.OpenRecordset("film", dbOpenTable)
    With StatusBar1.Panels(1)
    .Text = "Anzahl der gespeicherten Adressen: " & dy2.RecordCount
 
             Me.MousePointer = vbHourglass
 
                 ListView1.ColumnHeaders.Add , "Col0", "ID" 
                 ListView1.ColumnHeaders.Add , "Col1", "Filmtitel" 
                 ListView1.ColumnHeaders.Add , "Col2", "Originaltitel" 
                 ListView1.ColumnHeaders.Add , "Col3", "Regie" 'Vorname
                 ListView1.ColumnHeaders.Add , "Col4", "Genre" 'Nachname
                 ListView1.ColumnHeaders.Add , "Col5", "Jahr"
 
       Call GetColumnHeader 'Dies liegt im Modul
 
       ListView1.ListItems.Clear
 
If dy2.EOF And dy2.BOF Then
    MDIForm1.mnubearbeiten.Enabled = False
 Exit Sub
End If
 
While Not dy2.EOF
    Set itmX = ListView1.ListItems.Add(, "x" & CStr(dy2!Id), CStr(dy2("[ID]")), _
      "x" & CStr(dy2!Id)) 
 
 
I = dy2!Title
If IsNull(n) Then ti = "." Else ti = I
 
og = dy2!originaltitle
If IsNull(n) Then org = "." Else org = og
 
 
nvv = dy2!regie
If IsNull(n) Then Vn = "." Else Vn = nvv
 
M = dy2!genre
If IsNull(M) Then Nachname = "." Else Nachname = M
 
g = dy2!Year
If IsNull(n) Then gn = "." Else gn = g
 
itmX.SubItems(1) = ti 'Titel
itmX.SubItems(2) = org 'Originaltitel
itmX.SubItems(3) = Vn 'Regie
itmX.SubItems(4) = Nachname ' Genre
itmX.SubItems(5) = gn 'Jahre
 
 
dy2.MoveNext
Wend
dy2.MoveFirst
 
dy2.Close
 
Me.MousePointer = vbNormal
End With
 
End Sub


Beitrag wurde zuletzt am 02.08.12 um 00:51:40 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 02.08.12 01:35

Hallo!

Das Laden dauert vermutlich lange, weil sehr viele Bilder geladen, in der Größe
angepasst und auf einen 256Farben-Modus umgesetzt werden müssen.
Verkleinere Deine Bilddateien auf Thumbgröße (etwa 150 x 100 Pixel)
und speichere sie (eventuell im Format 256er GIF) in einer Datenbankspalte.

Wenn Du die Ansicht auf "lvwIcons einstellst", wird der Text (=erste Listview-Spalte)
angezeigt. Schreibe also Deinen Titel in die erste Spalte, die ID in die zweite
Spalte der Listview.

Set itmX = ListView1.ListItems.Add(, "x" & CStr(dy2!Title), CStr(dy2("[ID]")), _
"x" & CStr(dy2!Id))

Die Überschriften in den Columnheaders und die Subitems-Zuweisungen sind entsprechend
anzupassen.

Prüfe beim Laden eines Satzes ais der DB zunächst zunächst, ob es für die aktuelle
"ID" eine Coverbild-Datei im Bildordner gibt. Wenn nicht, setze im Listview als
"Symbol" ein "Standardbild", das Du in die ImageList aufgenommen hast
(Schlüsselwert z.b: "Default")
Es wird sonst in der Einstellung lvwIcons kein Bild angezeigt.

Beitrag wurde zuletzt am 02.08.12 um 01:36:29 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 02.08.12 02:36

Hallo Manfred X,

das heißt also, ich muss in die ImageList1 ein Standard-Bild einfügen - quasi über das Eigenschaftsfenster, und dieses Bild als "Default" setzen? So werden dann erstmal Bilder geladen, die der ID zugeordnet werden können und sobald das Laden vorrüber ist, wird dann beim Rest das StandBild angezeigt? Also muss ich es nicht groß mit dem Code bearbeiten. Hab ich dich da richtig verstanden?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Manfred X
Datum: 02.08.12 06:54

Hallo!


Nein. Das mußt Du schon selbst programmieren.
Erstelle ein Default-Bild (z.B. graue Fläche, rot durchgestrichen),
nenne die Datei "Default.jpg" und stelle sie in das Verzeichnis
mit den Coverbildern. Sie wird dann ebenfalls in die Imagelist geladen.

Deinem Programm fügst Du eine kleine Such-Routine hinzu, die
prüft, ob ein bestimmter Key vorhanden ist - oder den Default-Schlüssel
zurückgibt:
Private Function FindImageKey _
      (ByVal imglist As ImageList, ByVal keytofind As String, _
       Optional ByVal defaultkey As String = "") As String
 
    Dim i%
    For i = 1 To imglist.ListImages.Count
       If ucase(keytofind) = ucase(imglist.ListImages(i).Key) Then
          FindImageKey = keytofind: Exit Function
       End If
    Next i
    FindImageKey = defaultkey
End Function
In der Routine, die die Items erstellt, fügst Du zwei String-Variable hinzu
und ermittelst den Schlüssel für die ListView-Items über die obige Routine.
Ungefähr so:
Dim DefaultKey as string, imagekey as string
DefaultKey = "default"
 
While Not dy2.EOF
    imagekey = FindImageKey(ImageList1, "x" & cstr(d2!ID), defaultkey)
    Set itmX = ListView1.ListItems.Add(, "x" & cstr(d2!ID), dy2!Title, imagekey)
 
    .......


Beitrag wurde zuletzt am 02.08.12 um 06:57:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 02.08.12 15:53

Hey Manfred X,

leider klappt es irgendwie nicht. Ich habe mir ein Bild angefertigt, es in JPG konvertiert, und es im selben Ordner abgespeichert. Nun zum Code: Ich habe diesen Private Function in die Form kopiert (Natürlich nicht in die Form_Load)

Private Function FindImageKey _
      (ByVal imglist As ImageList, ByVal keytofind As String, _
       Optional ByVal defaultkey As String = "") As String
 
    Dim i%
    For i = 1 To imglist.ListImages.Count
       If ucase(keytofind) = ucase(imglist.ListImages(i).Key) Then
          FindImageKey = keytofind: Exit Function
       End If
    Next i
    FindImageKey = defaultkey
End Function
Und die anderen String-Variablen habe ich in die vorgesehene Routine hinzugefügt. Ich bekomme keinerlei Fehlermeldung (Jap, ich lasse das Programm nach wie vor ohne On Error Resume Next laufen), sondern es arbeitet wie vorher auch. Es werden nur die Bilder angezeigt, zu denen die ID zugewiesen werden. All anderen Datensätze werden nicht geladen. Es sieht genauso aus wie auf dem Bild hier (http://s14.directupload.net/file/d/2970/xi2gnbyd_jpg.htm) - mit dem Unterschied, dass jetzt nicht nur IDs dort stehen, sondern ID Titel und Originaltitel.

Sub movie_Laden_Daten()
On Error Resume Next
Dim dy2 As Recordset
Dim mdbdbfile As Database
Dim itmX As ListItem
Dim ti As String
Dim I As String
Dim org As String
Dim og As String
Dim Vn As String
Dim nvv As String
Dim gn As String
Dim g As String
Dim Nachname As String
Dim M As String
Dim DefaultKey as string, imagekey as string
DefaultKey = "default"
 
 
    Set mdbdbfile = OpenDatabase(midi.sKeyNames1.Text)
    Set dy2 = mdbdbfile.OpenRecordset("film", dbOpenTable)
    With StatusBar1.Panels(1)
    .Text = "Anzahl der gespeicherten Adressen: " & dy2.RecordCount
 
             Me.MousePointer = vbHourglass
 
                 ListView1.ColumnHeaders.Add , "Col0", "ID" 
                 ListView1.ColumnHeaders.Add , "Col1", "Filmtitel" 
                 ListView1.ColumnHeaders.Add , "Col2", "Originaltitel" 
                 ListView1.ColumnHeaders.Add , "Col3", "Regie" 'Vorname
                 ListView1.ColumnHeaders.Add , "Col4", "Genre" 'Nachname
                 ListView1.ColumnHeaders.Add , "Col5", "Jahr"
 
       Call GetColumnHeader 'Dies liegt im Modul
 
       ListView1.ListItems.Clear
 
If dy2.EOF And dy2.BOF Then
    MDIForm1.mnubearbeiten.Enabled = False
 Exit Sub
End If
 
While Not dy2.EOF
 
    imagekey = FindImageKey(ImageList1, "x" & cstr(d2!ID), defaultkey)
    Set itmX = ListView1.ListItems.Add(, "x" & cstr(d2!ID), dy2!Title, imagekey)
 
    Set itmX = ListView1.ListItems.Add(, "x" & CStr(dy2!Id), CStr(dy2("[ID]")), _
      "x" & CStr(dy2!Id)) 'Auf wenn ich dieses Set itmX entferne, funktioniert 
      ' es nicht ganz.
 
 
I = dy2!Title
If IsNull(n) Then ti = "." Else ti = I
 
og = dy2!originaltitle
If IsNull(n) Then org = "." Else org = og
 
 
nvv = dy2!regie
If IsNull(n) Then Vn = "." Else Vn = nvv
 
M = dy2!genre
If IsNull(M) Then Nachname = "." Else Nachname = M
 
g = dy2!Year
If IsNull(n) Then gn = "." Else gn = g
 
itmX.SubItems(1) = ti 'Titel
itmX.SubItems(2) = org 'Originaltitel
itmX.SubItems(3) = Vn 'Regie
itmX.SubItems(4) = Nachname ' Genre
itmX.SubItems(5) = gn 'Jahre
 
 
dy2.MoveNext
Wend
dy2.MoveFirst
 
dy2.Close
 
Me.MousePointer = vbNormal
End With
 
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 03.08.12 23:02

Mhmhmh, keiner Idee?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 04.09.12 12:31

Bezüglich des Problem habe ich nun die Datei online hochgeladen. Eines vorweg. Nicht wundern, wenn es so "unordentlich" - um nicht zu sagen chaotisch - auf der Form aussieht. Ich habe zum Verständnis einen Bruchteil aus meinem Programm-Projekt entnommen.

Was ist alles in diesem verpackten Ordner?
- Bildercover (Ordner)
- Datenbank für Filme (Ordner)
- drei Formen und einige Module

Hinweis: Aber beim starten des kleines Projektes werdet ihr per CommandButton-Klick zu den jeweiligen Versionen geführt.

Was war nuchmal das Problem?

Folgende Probleme - um es nochmal zusammen zu fassen:

[u]In Version 1: - Es funktioniert alles, ABER:
- ich hätte die Möglichkeit: sobald einem Datensatz mittels ID kein Bild zugewiesen werden kann, dass ich dann ein DeFault-Bild verwenden kann
- Sobald mehr als 300 Bilder im Ordner sind, lassen sich die Bilder nicht mehr in die ListView laden und anzeigen. Ihr könnt es ja mal probieren. Ich habe erstmal 150 Bilder reingepackt. Da macht die erste Version noch alles ganz prima. Sobald es mehr werden, bekommt die erste Version Probleme - und aus diesem Grund nahm ich Version 2

[u]In Version 2: - es funktioniert nicht alles:
- Die Bilder lassen sich laden und in der ListView anzeigen, jedoch ohne die entsprechenden Filmdaten. Das heißt ohne Zuweisung der Film-IDs. Das pure Laden und anzeigen der Bilder in der ListView klappt wunderbar. Nun müssen die Bilder wie in der Version 1 auch zu den entsprechenden Filmdaten agezeigt werden
- Auch hier hätte ich gern die Möglichkeit: Kein Bildcover zum entsprechenden Film vorhanden? Dann als Alternativ ein Default-Bild anzeigen.

Und hier nun der Download-Link: http://www.daten-hoster.de/file/details/365087/ListView_Test.rar

Wichtig: Dieser verpackte Ordner wurde mit einem Passwort versehen. Das Passwort lautet: sophus (Groß- und Kleinschreibung wurde beachtet)

Ich danke euch...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 05.09.12 01:05

Hallo Sophus schrieb:
Zitat:

Bezüglich des Problem habe ich nun die Datei online
hochgeladen. Eines vorweg. Nicht wundern, wenn es so
"unordentlich" - um nicht zu sagen chaotisch - auf
der Form aussieht. Ich habe zum Verständnis einen Bruchteil
aus meinem Programm-Projekt entnommen.


Hast du denn diesen Bruchteil selbst mal gestestet?
Nach dem Entpacken deiner rar Datei habe ich zwei VB Projekte mit unterschiedlichem Inhalt. Welches ist denn das richtige?

In deinen Projekten bzw. Programmcode verweist du auf absolute Pfade auf deinem Rechner die niemand sonst hat. Da gibt es natürlich Fehler beim laden des Projekts und auch beim ausführen.

Du hast in jeder Sub als erstes ein On Error Resume Next stehen. Das verhindert Fehlermeldungen und kann den Programmablauf unkonntrollierbar machen bzw die Fehlersuche schwierig.


Zitat:


Folgende Probleme - um es nochmal zusammen zu fassen:

[u]In Version 1: - Es funktioniert alles, ABER:
- ich hätte die Möglichkeit: sobald einem Datensatz mittels
ID kein Bild zugewiesen werden kann, dass ich dann ein
DeFault-Bild verwenden kann


Du arbeitest da soch sowieso mit dem FSO warum nicht anhand der ID im Recordset abfragen, ob es das Bild gibt oder nicht?
Stichwort If FSO.FieleExists Then

Zitat:


- Sobald mehr als 300 Bilder im Ordner sind, lassen sich die
Bilder nicht mehr in die ListView laden


Was hat die Anzahl der Bilder im Ordner zu sagen? Entscheidend ist doch die Anzahl der Filme in der DB. Wenn du in der DB 100 Filme hast müssen auch nur 100 Bilder im ListView angezeigt werden auch wenn 1000 im Ordner sind.

Wie machst du denn überhaupt die Zuordnung von Bildnamen und dem Feld ID in deiner DB? Du hast ca. 700 Filme in der DB, die höchste ID liegt bei knapp 1000 und die Bildnamen gehen über 9000.

Ich mache das so, dass wenn die Artikelnummer z.B. 4711 lautet, das Bild dann ART_4711.jpg heißt und das entsprechende Thumbnail ART_4711_KL z.B. Ich gehe zwar nicht über ein ID-Feld (Autowert), das spielt aber keine Rolle solange die Zuordnung stimmt.

Wenn du dein Datenbankdesign überarbeiten würdest hättest du es in anderen Sachen auch einfacher. Stichwort: Alles was Zahlen sind und womit man rechnen kann oder Abfragen machen kann sollten in der DB auch Zahlenfelder sein. (FSK und das Voting mit den Sternen z.B) Aber das nur am Rande.

Als Tipp:
Lege mal ein neues Projekt an, binde die DB ein, erstelle ein einziges Formular mit einem ListView und lasse alles sontige weg. Dann kommst du der Sache wesentlich schneller näher und sowohl du als auch wir stochern hier nicht im Nebel und müssen uns durch deinen chaotischen Programmcode wühlen.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 05.09.12 07:07

Hallo Franki,

Zitat:

Hast du denn diesen Bruchteil selbst mal gestestet?
Nach dem Entpacken deiner rar Datei habe ich zwei VB Projekte mit unterschiedlichem Inhalt. Welches ist denn das richtige?


Ja, ich habe diesen Bruchteil bei mir getestet, bevor ich es euch serviere. Es sind zwei Projekte in diesem verpackten Ordner? Dann muss mir ein Fehler unterlaufen sein. Auf jeden Fall sollte es das Projekt sein, wo insgesamt 3 Formen vorhanden sind. Sobal dann das Projekt gestartet wird, bekommt man die Form, auf welcher zwei CommandButton vorhanden sind, einmal Version 1 und Version 2. Und diese beiden Versionen sind mir wichtig. Entschuldigung wenn ich für Verwirrung gestiftet habe.

Zitat:

In deinen Projekten bzw. Programmcode verweist du auf absolute Pfade auf deinem Rechner die niemand sonst hat. Da gibt es natürlich Fehler beim laden des Projekts und auch beim ausführen.


Ja, die Pfade müssen erst angepasst werden. Da dieser Bruchteil auf meinem Rechner lief, ergibt sich auch ganz andere Pfade. Aber ich dachte, es versteht sich bei Datenbankanwenundgen von selbst? Konntest du denn die Pfade noch anpassen, so dass es bei dir lief?

Zitat:

Was hat die Anzahl der Bilder im Ordner zu sagen? Entscheidend ist doch die Anzahl der Filme in der DB. Wenn du in der DB 100 Filme hast müssen auch nur 100 Bilder im ListView angezeigt werden auch wenn 1000 im Ordner sind.


Die Anzahl der Bilder im Ordner sind schon entscheiden. Wie du selbst erwähntest habe ich so an die 500-700 FIlmdaten in der Datenbank. Das heißt also, es sollen nachher 500-700 Bilder in der ListView angezeigt werden. Und wenn aber in der ersten Version aber bei 300 Bilder das Laden und Anzeigen der Bilder in der ListView problematisch wird, dann ist es wahrlich ein Problem für mich.

Zitat:

Wie machst du denn überhaupt die Zuordnung von Bildnamen und dem Feld ID in deiner DB? Du hast ca. 700 Filme in der DB, die höchste ID liegt bei knapp 1000 und die Bildnamen gehen über 9000.


In der ersten Version ist es ja noch sichtbar, in Call_Laden. Das Anzeigen der Bilder läuft über die Variabel x. Diese Variabel wurde dann beim Laden der Bilder in die ListView eingebunden. Dieses Beispiel habe ich von Manfred X entnommen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 07.09.12 00:32

Hallo,
ich kürze mal auf das Wesentliche.

Zitat:


Es sind zwei Projekte in diesem verpackten
Ordner? Dann muss mir ein Fehler unterlaufen sein. Auf jeden
Fall sollte es das Projekt sein, wo insgesamt 3 Formen
vorhanden sind. Sobal dann das Projekt gestartet wird,
bekommt man die Form, auf welcher zwei CommandButton
vorhanden sind, einmal Version 1 und Version 2.


Hmm, was soll uns das jetzt sagen? In jedem deiner beiden Projekte sind drei Formulare vorhanden und bei jedem der beiden kommt das Fenster mit den Command Buttons welche Version gestartet werden soll.

Zitat:


Ja, die Pfade müssen erst angepasst werden. Da dieser
Bruchteil auf meinem Rechner lief, ergibt sich auch ganz
andere Pfade. Aber ich dachte, es versteht sich bei
Datenbankanwenundgen von selbst?


Auch hier hast du einen Gedankenfehler da du mit absoluten Pfaden arbeitest. Grade bei Datenbankanwendungen ist das nicht notwendig und du hast die absoluten Pfade auch für die Bilder und Module in deinem Programmcode.
Und nein, ich könnte das zwar alles von Hand anpassen, aber diese Arbeit habe ich mir nicht angetan.

Mache doch mal ein Setup von deinem Projekt, installiere es auf einem anderen Rechner, wenn es dann läuft sehen wir weiter.

Zitat:


In der ersten Version ist es ja noch sichtbar, in Call_Laden.


Das finde ich nicht in deinem Programmcode, nur Movie_Laden und ähnliche Aufrufe.(Ja ich habe die Suchfunktion der VB IDE bemüht.

Das Beispiel von ManfredX ist ja schön und gut, es beschreibt auch wie man so etwas machen kann, aber es ist nicht abgestimmt auf dein Problem deinen Programmcode und deine Datenbank. Du hast ja vorher wichtige Details verschwiegen und so konnte ManfredX auch nur dahingehend antworten war er bzw. wir hier für Informationen hatten.

Schicke mir mal eine PM, du bekommst dann eine Auszug aus meinem Programmcode wie das bei mir mit dem ListView in Verbindung mit einer DB funktioniert.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 07.09.12 06:59

Hallo,

Zitat:

Hmm, was soll uns das jetzt sagen? In jedem deiner beiden Projekte sind drei Formulare vorhanden und bei jedem der beiden kommt das Fenster mit den Command Buttons welche Version gestartet werden soll.


Wie gesagt, es war leider nicht meine Absicht. Leider bin ich für eine Weile nicht an meinem Entwicklungsrechner, da ich bei meiner Mam zu Besuch bin. Wenn beide Projekte gleich sind, also beide Projekte drei Formen haben, auf denen einen Form drei Buttons sind, dann kannst du dir ein Projekt aussuchen.


Zitat:

Auch hier hast du einen Gedankenfehler da du mit absoluten Pfaden arbeitest. Grade bei Datenbankanwendungen ist das nicht notwendig und du hast die absoluten Pfade auch für die Bilder und Module in deinem Programmcode.
Und nein, ich könnte das zwar alles von Hand anpassen, aber diese Arbeit habe ich mir nicht angetan.

Mache doch mal ein Setup von deinem Projekt, installiere es auf einem anderen Rechner, wenn es dann läuft sehen wir weiter.


Die absolute Pfade sollen ja erstmal rein, weil es sich um einen kleinen Ausschnitt des Programms handelt. Nachher, wenn das Programm vollständig ist und ich mich dazu durchdringe es zu veröffentlichen, dann werde ich es so programmieren, dass die Pfade zu der Datenbank ermittelt werden und diese dann in eine IN-Daten hinterlegt wird, so dass bei jedem Programmstart die Pfade zu den Datenbanken abgeruen werden kann. Aber für dieses kleine Projekt dachte ich mir, wäre es zu viel Aufwand - daher habe ich darauf verzcihtet.


Zitat:

Das Beispiel von ManfredX ist ja schön und gut, es beschreibt auch wie man so etwas machen kann, aber es ist nicht abgestimmt auf dein Problem deinen Programmcode und deine Datenbank. Du hast ja vorher wichtige Details verschwiegen und so konnte ManfredX auch nur dahingehend antworten war er bzw. wir hier für Informationen hatten.


Welche Information habe ich euch vorenthalten? Egal welche Information fehlt, es war nicht meine Absicht.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 25.08.13 21:56

Hallo Leute,

ich bin mit meinem kleinen Projekt noch nicht weiter gekommen. Damit diejenigen, die es noch nicht wissen, diesen Thread nicht nochmal durchlesen müsst, fasse ich es nochmal kurz zusammen.

Szenario:
Ich habe ein Verwaltungsprogramm entwickelt. Dieses Programm arbeitet mit der Access-Datenbank. Dort werden Informationen von Bücher über Filme bis hin zu den Kontaktdaten gespeichert. Und die gesamten Informationen werden bei Bedarf über eine ListView ausgegeben. Alles gut soweit. Um der Sache etwas auf den Grund zu gehen, hier ein Beispiel. Nehmen wir mal die Kategorie Filme. In der Film-Datenbank befinden sich momentan mehr als 500 Film-Datensätze. Diese Datensätze sollen nun etwas freundlicher in der ListView dargestellt werden. Wie? Ganz genau, in dem zu den jeweiligen Filmen das entsprechende Cover dazu in die ListView anzeigt wird. Die Bilder werden nicht in einer Datenbank gespeichert, sondern in einem Ordner. Damit das mit der Zuordnung der Cover-Bilder zu den jeweiligen Filmtiteln vollzogen werden kann, werden die Bilddateien nach den IDs der Datensätze benannt. Das heißt, wenn der Datensatz des Filmes "10 Dinge die ich an dir hasse" die ID "200" hat, so heißt dann die Bilddatei im Ordner auch "200". Ich habe mit einigen Hilfen eine kleine (an dieser Stelle ein Dankeschön an Manfred X, Dieter und Franki) Version angefertigt. Insgesamt gibt es zwei Versionen.

Damit das nicht unübersichtlich wird mit dem Quellcode, habe ich diese beiden kleinen Versionen zu einem Projekt zusammengefasst, und stelle dieses Projekt zum Download zur Verfügung.

[u]Kurz eine Informationen zur Rar-Datei:

Passwort der Rar-Datei ist (zum Entpacken):

sophus (Auf Groß- und Kleinschreibung wurde geachtet)

Inhalt/Struktur der Rar-Datei:

Ordner
- Bilder (148 Bilder*.jpg)
- Database (films.mdb)
- Module (BrowserForFolder, Liste, ModDeutsch, modLSV_Color, mudma, scroll, WndwProcess)

Dateien
-book_add_view (Visual Basic Form File)
-book_add_view.frx (Microsoft Visual FoxPro-Bericht)
-choice (Visual Basic Form File)
-ListV (Visual Basic Form File)
-ListV.frx (Microsoft Visual FoxPro-Bericht)
-ListV1 (Visual Basic Form File)
-music manager (Visual Basic Project)


[u]Nun zum Problem

Version 1:
Positiv ist, dass sich die Bilder, die mittels ListImage in die ListView geladen werden zu den jeweiligen Film-Datensätzen zuordnen lassen. Das war aber auch schon alles. Negativ ist hierbei, dass es zum einen sehr langsam verläuft. Im Bildordner sind insgesamt 148 Bilder. Beim Laden nimmt es einfach vie zu viel Zeit in Anspruch. Als nächstes habe ich versucht, dass ein Default-Cover mit reingeladen werden soll, sobald ein Film-Datensatz kein Cover besitzt. Das heißt, beim Laden werden nur die Film-Datensätze über die ListView ausgegeben, welche auch ein Cover-Bild haben. Es kann also passieren, dass 10 Film-Datensätze mit dem zugeordneten Cover über die ListView ausgeben werden, obwohl weit mehr als 500 Datensätze vorhanden sind. Andere Film-Datensätze, die kein Cover-Bild haben bzw. denen kein Cover-Bild zugewiesen werden kann, werden nicht in der ListView angezeigt. Ich finde hier keine Lösung. Des Weiteren ist mir aufgefallen, wenn - sagen wir mal - 600 Bilder im Ordner sind, und ich starte dann diese Version, dann werden alle Bilder zwar in die Imagelist geladen, aber am Ende werden keine zugewiesene Cover und auch keine Film-Datensätze in die ListView übergeben. Es passiert schlichtweg nichts.

Version 2:
Ich möchte hier gleich vorweggreifen, dass es nicht mein Code in der Prozedure Sub Bilder_Laden ist, sondern, ich habe es mir zusammengeschnippelt. Woher ich den Code habe, weiß ich leider nicht mehr. Das Laden der Bilder wird nun etwas umständlicher gemacht. Diese zweite Version ist etwas flexibler. Das Laden der Bilder klappt auch. Und es wird auch in der ListView angezeigt... ABER... jetzt das dicke ABER... ich kriege es einfach nicht hin, dass die Cover-Bilder der jeweiligen Film-ID zugeordnet werden. Das heißt, wenn ich nur diese Prozedur Sub Bilder_Laden ausführe, dann klappt das Laden der Bilder und das Anzeigen der Bilder in der ListView. Koppel ich aber diese Prozedur an die Prozedur Sub movie_laden_Daten, dann werden keine Bilder angezeigt. Und ich habe keine Idee, wie ich innerhalb des Codes der Prozedur Sub Bilder_laden das so hindeichseln kann, dass die Cover-Bilder wie in der ersten Version dem jeweiligen entsprechenden Film zugeordnet werden. Jemand eine Idee?

Schaut euch mal das kleine Projekt an (Die Dateien wurden mit Kaspersky 2013 auf Viren überprüft):
ListView mit Bilder.rar

Für jede Hilfe, Anregung und Lösungsvorschläge bin ich sehr dankbar.

Euer Sophus

Beitrag wurde zuletzt am 25.08.13 um 22:01:42 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 26.08.13 02:14

Hallo Sophus,

du hast ja immer noch die gleichen Fehler bzw. das gleiche Chaos in deinem Projekt.

Mein Vorschlag wäre in einem neuen Vb-Projekt mal das Problem auf das Wesentliche zu reduzieren und die ganzen Module, das Subclassing usw. weg zu lassen.

Also eine neues VB Projekt anlegen (in neuem Ordner auf deiner HDD), darin die DB speichern, ein Unterverzeichnis /Bilder erstellen mit den Bildern.

Auf Form1 dann nur eine ImageList und ein ListView, mehr nicht.

Im Form_Load die Verbindung zur DB herstellen, im Unload wieder trennen. Eine Sub z.B. BilderLaden aufrufen.

In dieser Sub dann per SQL Abfrage erst mal wenige Daten abfragen zum testen. Z.B ..."Where genre = 'Animation'"

Dann im Recordset prüfen, ob es das entsprechende Bild gibt (Du arbeitest ja sowieso mit FSO also kannst du FSO.FileExist verwenden. Falls keine Datei vorhanden ist das Dummy-Bild in der Image List speichern.

Für die Detailanzeige nimmst du die ID aus dem Recordset die du als Key in der Imagelist verwendest, dann hat sich dein FindImageFromKey von selbst erledigt. (Die bremst das nämlich extrem aus)

Die zusätzlichen Daten zum Film kannst du im ListView ja als Subitems direkt mit speichern so dass sie bei Bedarf dem User angezeigt werden können. Nimm für den Test z.B. mal das Genre.

Und noch ein Hinweis:
Du arbeitest ja mit einer Datenbank, also fügst du dort neue Filme hinzu usw. Da wird ja auch das Bild vom Cover festgelegt. Ich mache das bei meinen Anwendungen so, dass bei der Anlage eines neuen Datensatzes direkt ein entsprechendes kleines Vorschaubild für das ListView erzeugt wird und ebenfalls im Dateisystem gespeichert wird. Das ist ein einmaliger Vorgang und die ganze umrechnerei bleibt bei der Anzeige erspart. Da kann man die ImageList sofort ohne Umwege laden.

Aber für den Test funktioniert es auch mit deinen Bildern, die Performance spielt erst mal keine Rolle, wenn du das Prinzip verstanden hast und mit wenigen Datensätzen testest.

Du hast ja das Beispiel Videothek angeführt. Aber auch da siehst du nicht alle Filme am Eingang sondern musst durch die Regale gehen und das entspricht einer SQL Abfrage. Und wie du sagst musst du den dich interessierenden Film einzeln in die Hand nehmen um die Inhaltsangabe auf der Rückseite lesen zu können. Das würde einer SQL-Abfrage auf eine bestimmte Film-ID entsprechen.

Die Menge der Filme bzw. Bilder spielt eigentlich keine Rolle, du darfst nur nicht den Fehler begehen alle Datensätze aus der DB gleichzeitig anzeigen zu wollen. Das ist logischerweise langsam und auch für den User eher unübersichtlich.

Also teste mal mit einem neuen Minimalprojekt poste hier dein Ergebnis und dann sehen wir weiter.

Gruß
Frank








Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview (Versoin 1) 
Autor: Franki
Datum: 27.08.13 07:01

Hallo Sophus,

nur ganz kurz, ich muss gleich weg.

Meiner Meinung nach gehst du die Sache falsch an.

Du lädst alle Bilder aus deinem Verzeichnis in die ImageList ohne Rücksicht darauf was in der DB steht.

Default Bilder, also mehrere gibt es ja sowieso nicht, es ist ja nur ein einziges Bild was genau einmal in der Imagelist sein muss, egal wie viele Filme in der DB keine Bilder eingetragen haben.

Du musst das nicht zuletzt aus Performance Gründen genau anders herum angehen:

SQL Abfrage auf die DB, Recordset durchlaufen und dort prüfen, ob es in der DB ein Bild zum jeweiligen Datensatz gibt (Dann hast du auch gleich die ID) und dort die ImageList und das ListView füllen. Am Anfang oder Ende lädst du dein Dummy-Bild in die Imagelist, und wenn im Datesatz des Recordsets zum Film kein Bild eingetragen ist, weist du das Dummy-Bild im ListView zu.

Nur so hast du auch die Garantie, dass das klappt. (Wie gesagt, vorher noch prüfen, ob es das jeweilige Bild auch gibt und ob es geladen werden kann, ansonsten ebenfalls Dummy-Bild zuweisen.

Und warum überhaupt zwei ImageLists? In der einen lädst du ja die Bilder sowieso in der Originalgröße wie sie auch im Dateisystem sind. Die werden ja im Listview eh nicht angezeigt, bzw. sollten es nicht sondern nur die kleineren Vorschaubilder. Das was du da machst, macht die Sache natürlich extrem langsam.

Schreib mir mal ein PM, am Wochenende kann ich dir vielleicht eine kleine Demo aus einem alten Projekt von mir raus ziehen.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview (Versoin 1) 
Autor: Sophus
Datum: 27.08.13 12:14

Hallo Franki,

Franki schrieb:
Zitat:

Hallo Sophus,

SQL Abfrage auf die DB, Recordset durchlaufen und dort
prüfen, ob es in der DB ein Bild zum jeweiligen Datensatz
gibt (Dann hast du auch gleich die ID) und dort die
ImageList und das ListView füllen. Am Anfang oder Ende lädst
du dein Dummy-Bild in die Imagelist, und wenn im Datesatz des
Recordsets zum Film kein Bild eingetragen ist, weist du das
Dummy-Bild im ListView zu.

Und genau vor diesem Problem stehe ich. Wie soll ich das umsetzen? Ich habe ehrlich gesagt momentan keine Ahnung, wie du es meinst oder wie ich es angehen soll. Kannst du es mir mal vorführen, wie genau du das meintest?

Zitat:


Und warum überhaupt zwei ImageLists? In der einen lädst du ja
die Bilder sowieso in der Originalgröße wie sie auch im
Dateisystem sind. Die werden ja im Listview eh nicht
angezeigt, bzw. sollten es nicht sondern nur die kleineren
Vorschaubilder. Das was du da machst, macht die Sache
natürlich extrem langsam.

Das mit den Iamge-Laden habe ich damals von Manfred X übernommen. Durch ihn bin ich ja erst einen Schritt weitergekommen.
Zitat:


Schreib mir mal ein PM, am Wochenende kann ich dir vielleicht
eine kleine Demo aus einem alten Projekt von mir raus ziehen.

Sei mir nicht böse, aber ich glaube, du hast mir damals mal eine Demo-Version von dir geschickt. Das war mit DataGrid, richtig? Zuerst, ich arbeite nicht mit DataGrid und will mich damit nicht anfreunden. Es ist für mich nicht attraktiv. Und zum anderen meine ich mich daran erinnern zu können, das dein Beispiel-Projekt nicht auf mein Problem eingeht, da du es ohne Datenbank machst, sondern die Bilder aus einem Verzeichnis direkt in die DataGrid lädst. Zumindest bin ich aus deinem damaligen Mini-Projekt nicht schlau geworden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview (Versoin 1) 
Autor: Franki
Datum: 28.08.13 06:36

Moin Sophus,

wie gesagt, am Wochenende kopiere ich dir mal was raus, definitiv mit ListView, ImageList und DB.

Ich erinnere mich, da war mal was mit DataGrid, aber was das nicht ein ganz anderes Thema bzw. Frage? Da ging es um TextMatrix usw. aber nicht um Bilder. Ich kann mich auch irren, ist ja schon eine Weile her.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview (Versoin 1) 
Autor: Sophus
Datum: 28.08.13 13:39

Hallo Franki,

du meintest mal, dass die Anzahl der Bilder in einem Ordner nichts aussagen, richtig? Wir konzentrieren uns nur mal auf Version 1. Ich habe dir das Projekt nochmal hochgeladen, nur diesmal habe ich 174 Datensätze in meiner Datenbank bearbeiten, und zwar so, dass insgesamt 174 Datensätze nun einen Cover haben. Im Ordner Bilder sind nur 174 Bilder, die den Namen der jeweiligen IDs tragen. Überflüssige Bilder, die keine Verwendung zeigen wurden rausgenommen. Die Daten in der Rar-Datei sind also gleich. Gleiche Ordner-Struktur und gleiche Dateien. Nur dass im Ordner Bilder nun 174 Bilder sind und dass ich dir eine etwas überarbeitete Datenbank mit beigelegt habe. Und auf der Form von Version 1 habe ich ein Label eingebaut, damit man nicht zählen muss. Lade ich also nur meine Datensätze ohne Bilder in die ListView, zeigt der Label mir 816 Datensätze an. Lade ich die Datensätze mit Bilder, dann zeigt mein Label mir 150 Datensätze in der ListView an. Und das, obwohl aber 174 Bilder den jeweiligen Datensätzen zugeordnet werden können.

Ich hoffe, ich konnte dir mein Problem etwas näher bringen?
Hier der Download.

P.S. Wichtig! Die RAR-Datei ist diesmal ohne Passwort.

Beitrag wurde zuletzt am 28.08.13 um 13:42:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview (Versoin Franki) 
Autor: Franki
Datum: 03.09.13 01:27

Hallo Sophus,
wie versprochen, habe ich dir mal was zusammen gestellt.
Teste wie folgt wenn du möchtest:
Neues VB Projekt anlegen mit einer Form, darauf eine Picturebox (Picture1), 1 ListView (ListView1) und eine ImageList (ImageList1) sowie einen Menü mit Datei/Beenden. Das Projekt speichern, danach deine DB dort rein kopieren und ein Unterverzeichnis Namens Bilder mit deinen Bildern. (Ich habe die DB und die Bilder von neulich genommen für den Test)

Ziel des Tests:
Zuerst wird das Dummybild in die ImageList gespeichert als erstes Bild.
SQL Abfrage auf die DB (welche auch immer), anhand der gefundenen Datensätze die ID des Films auslesen und und das dazugehörige Bild in die ImageList laden und gleichzeitig im ListView den Film eintragen. (Wenn Bild vorhanden ist, dann nehmen, wenn nicht, das DummyBild für das ListView verwenden.

Code ist ohne Fehlerbehandlung, dient nur zur Demo des Prinzips:
Deklarationsteil
Dim con As ADODB.Connection
Dim rec As ADODB.Recordset
Dim Bildverzeichnis As String
Dim BildID As String
Dim x As Integer
Form_Load()
Private Sub Form_Load()
    Set con = New ADODB.Connection
    With con
        .CursorLocation = adUseClient
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .Properties("Data Source") = App.Path & "\Films.mdb"
        .Open
    End With
    Bildverzeichnis = App.Path & "\Bilder\"
    Me.ImageList1.ImageHeight = 70
    Me.ImageList1.ImageWidth = 46
    Me.Picture1.ScaleHeight = 70
    Me.Picture1.ScaleWidth = 46
    Me.Picture1.Visible = False
    BilderLaden   
End Sub
Die Größenangaben habe ich von dir übernommen, in der ImageList werden nur die Vorschaubilder der Filme und das DummyBild gespeichert und die Bilder daraus werden für das ListView verwendet.
Private Sub BilderLaden()
    Me.ImageList1.ListImages.Clear
    Set ListView1.Icons = Nothing
    ListView1.ListItems.Clear
    Set rec = New ADODB.Recordset
'     Sql = "Select * From film Where ID > 0 Order by ID"
    ' bzw. für den Test
    Sql = "Select * From film Where ID >= 207 And ID <= 220 Order By ID"
    ' Die Bilder gibt es alle, benenne für deinen Test z.B. ein oder zwei 
    ' Bilder um damit das Dummybild greift.
    rec.Open Sql, con, adOpenKeyset, adLockReadOnly
    MsgBox "Filme in der DB: " & rec.RecordCount
    If Not rec.EOF Then
        ' Es gibt Filme, also zuerst Dummybild zuweisen
        Picture1.Picture = LoadPicture(Bildverzeichnis & "Default.jpg")
        Me.ImageList1.ListImages.Add 1, "Dummybild", Picture1.Image
        x = 1
        Me.ListView1.Icons = Me.ImageList1
        While Not rec.EOF
            BildID = CStr(rec.Fields("ID"))
            Filmtitel = rec.Fields("Title")    
            Picture1.Cls
            On Error Resume Next
            Picture1.Picture = LoadPicture(Bildverzeichnis & BildID & ".jpg")
            If Err = 0 Then
                Me.ImageList1.ListImages.Add , Chr(34) & BildID & Chr(34), _
                  Me.Picture1.Image
                Set litem = ListView1.ListItems.Add(x, Chr(34) & BildID & Chr( _
                34), Filmtitel, Chr(34) & BildID & Chr(34))
            Else
                ' Dummybild zuweisen
                Set litem = ListView1.ListItems.Add(x, Chr(34) & BildID & Chr( _
                  34), Filmtitel, "Dummybild")
                Err.Clear
            End If
            x = x + 1
            rec.MoveNext
        Wend
        MsgBox "Filme mit Bild: " & Me.ImageList1.ListImages.Count - 1
        ' -1 weil das Dummybild ja auch in der Imagelist ist, aber nicht zählt
    Else
        MsgBox "Keine Filme gefunden"
    End If
    rec.Close
    Set rec = Nothing
End Sub
Und das war es eigentlich schon.

Weiter im Teil2 des Postings...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview (Versoin Franki) 
Autor: Franki
Datum: 03.09.13 01:30

Teil2


Du hast in der ImageList nur genau so viele Bilder die zur SQL Abfrage passen plus das Dummybild.
Unter dem Icon steht der Filmtitel aus der DB. Zur weitern Verarbeitung also wo das eigentliche Bild ist, bzw. wie der Film in der DB zu identifizieren ist, siehe per Klick auf ein Icon.
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
    Anzeigetext = "Film hat in der DB die ID: " & Replace( _
      Me.ListView1.SelectedItem.Key, Chr(34), "") & vbCrLf
    If Me.ListView1.SelectedItem.Icon = "Dummybild" Then
        Anzeigetext = Anzeigetext & "Film ohne Bild"
    Else
        Anzeigetext = Anzeigetext & "Bild unter: " & Bildverzeichnis & Replace( _
          Me.ListView1.SelectedItem.Key, Chr(34), "") & ".jpg"
    End If
    MsgBox Anzeigetext
End Sub
In der MsgBox sieht du im Text die ID des Films in der DB (für erneute SQL-Abfrage z.B) sowie (falls vorhanden) wie du das Originalbild aufrufen könntest.
Und jetzt noch die Aufräumarbeiten:
Private Sub Beenden_Click()
    Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
    con.Close
    Set con = Nothing
End Sub
Wie gesagt, Fehlerbehandlung ist da nicht drin ausser On Error...

Teste bitte mal mit meiner Beispielabfrage damit der Datenbestand überschaubar bleibt. Wenn ich das auskommentierte Statement nehme, dann habe ich 773 Filme in der DB, davon haben aber nur 63 ein dazugehöriges Bild im Verzeichnis. Das ListView hat dann 773 Einträge, die ImageList nur 64 Bilder. Und das geht ruck zuck mit der Anzeige des ListViews.

Also teste mal, viel Spaß
Und schreibe mal, ob das Prinzip klar ist wie da die Vorgehensweise ist.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 03.09.13 12:58

Hey Franki,

ich danke dir für deine Mühe. Ich werde den Code gleich auf meinen Stick ziehen und es auf meinen Entwicklungsrechner ausprobieren. Dabei muss ich den Code so anpassen, dass ich in meinem Projekt DAO verwende. Ich melde mich später wieder.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Sophus
Datum: 03.09.13 21:51

Hallo Franki,

nun melde ich mich wieder zurück. Noch einmal ein dickes Dankeschön. Zunächst die guten Nachrichten. Es funktioniert soweit alles. Ich bin dank dir endlich einen Schritt weiter gekommen. Das freut mich ungemein. Damit es schneller geht, habe ich wieder wie gehabt das Projekt zum Download zur Verfügung gestellt. Damit das alles schneller abläuft, liegt die Film-Datenbank, der Bildordner und das Projekt mit bei. Diesmal wurde das Projekt neu entworfen, also alle überflüssigen Codes sind komplett weg. Und das Projekt arbeitet erstmal mit ADO-Schnittstelle - wobei ich versuchen werde, auf DAO umzustellen. Mal sehen ob ich das hinbekomme, aber das ist eine andere Baustelle. Ja, was klappt noch nicht ganz?

Nun, ich habe es soweit hinbekommen, dass die geladenen Bilder skaliert werden, sprich, die Seitenverhältnisse werden an die Picturebox angepasst. Aber diese vorgegebene Bildgröße werden irgendwie nicht in die ListView übertragen - die Bilder werden viel zu groß ausgegeben. Ich habe auch schon an der ImageList rumprobiert - erfolglos. Dadurch leidet die Bildqualität enorm. Schau es dir am besten mal selbst an. Des Weiteren ist mir aufgefallen, im Bildordner sind 176 Bilder (inkl. Default.jpg), die zugeordnet werden können. Beim durchlaufen werden aber nur 126 Bilder geladen. Die restlichen Datensätze bekommen ein Default-Bild.

Sophus

Beitrag wurde zuletzt am 03.09.13 um 21:52:38 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kleine Bilder in der Listview 
Autor: Franki
Datum: 04.09.13 00:27

Hallo Sophus
Zitat:


nun melde ich mich wieder zurück. Noch einmal ein dickes
Dankeschön. Zunächst die guten Nachrichten. Es funktioniert
soweit alles. Ich bin dank dir endlich einen Schritt weiter
gekommen.


Freut mich, aber hast du auch versucht mein Beispiel zu verstehen und nicht nur zu übernehmen?

Zitat:


Nun, ich habe es soweit hinbekommen, dass die geladenen
Bilder skaliert werden, sprich, die Seitenverhältnisse werden
an die Picturebox angepasst.


Das wurde in meinem Beispiel ja automatisch geregelt. in deinem neuen Download hast du aber ganz neue Voraussetzungen in Sachen Originalbilder zu den Filmen. Die hatten ursprünglich alle das selbe Seitenverhältnis, jetzt ist es von Bild zu Bild unterschiedlich.

Zitat:


Aber diese vorgegebene Bildgröße
werden irgendwie nicht in die ListView übertragen - die
Bilder werden viel zu groß ausgegeben. Ich habe auch schon an
der ImageList rumprobiert - erfolglos.


Du hast da einen Gedankenfehler und auch die Größe der Vorschaubilder auskommentiert. Nimm den Kommentar mal raus und setzte die Picturebox auf Scalemode Pixel, schon hast du automatisch in der ListView die Bilder in 100 x 76 Pixel.

Zitat:


Dadurch leidet die Bildqualität enorm.


Das Dummybild ist schlecht, die Bilder von den Filmen sind deutlich besser. Ich mache das so, dass das Dummybild per Grafikprogramm auf die gewünschte Größe und Qualität gebracht wird und gar nicht erst skaliert werden muss weil es ja sowieso direkt zugewiesen wird.

Wenn du Bilder mit unterschiedlichen Seitenverhältnissen auf eine einheitliche Größe bringen möchtest, dann musst du da ganz anders vor gehen. Aber das würde jetzt hier zu weit führen das zu erläutern. Du hast doch in deiner Anwendung mit Sicherheit ein Feature "Neuen Film eintragen" wo auch das Bild zugewiesen werden kann. Da musst du ansetzten mit der Skalierung und nicht erst bei der Anzeige. Stichwort: Ein Datensatz wird ein einzigel Mal geschrieben aber Millionenfach gelesen.

Zitat:


Des Weiteren ist mir aufgefallen, im Bildordner sind 176 Bilder
(inkl. Default.jpg), die zugeordnet werden können.


Jetzt wird es interessant
Ja da sind 175 Bilder drin, aber woher nimmst du die Behauptung, dass diese zu Filmen in der DB zugeordnet werden können?

Zitat:


Beim durchlaufen werden aber nur 126 Bilder geladen. Die
restlichen Datensätze bekommen ein Default-Bild.


Dir scheint die Wechselwirkung von Datenbank zu Bildverzeichnis immer noch nicht klar zu sein. Starte ich dein Programm aus dem aktuellen Download, dann habe ich im ListView:

1. Film: Fantastic Four mit Bild. In deiner Textbox wird Film-ID mit 5 angegeben, ein Bild mit 5.jpg gibt es auch

2. Film: Der blutige Pfad Gottes mit Dummybild. In deiner Textbox wird Film-ID mit 6 angegeben, ein Bild mit 6.jpg gibt es NICHT.

3.Film: Der Prinz aus Zamunda mit Dummybild: In deiner Textbox wird Film-ID mit 7 angegeben, ein Bild mit 7.jpg gibt es NICHT

4. Film: Crank mit Bild. In deiner Textbox wird Film-ID mit 8 angegeben, ein Bild mit 8.jpg gibt es auch.

usw. usw. Und jetzt machst du dir mal ein kleines Programm wo du alle Bilder im Ordner durch gehst und dann schaust, ob es die ID in der DB gibt. Dann wirst du sehen, dass das nicht so ganz zusammen passt.

For Each Bild in Bildverzeichnis check ob in DB als ID vorhanden als Stichwort. Der eigenen SQL Abfrage scheinst du ja ncht zu trauen, also mache die Gegenprobe.

Und wie gesagt, im Beispiel ist keine vernünftige bzw. notwendige Fehlerbehandlung drin, das On Error ist die Killermethode, da wird auch ein Dummybild angezeigt wenn es zwar einen Dateinamen mit dem Bild gibt, es aber aus welchen Gründen auch immer nicht in die Picturebox geladen werden kann.

Mein Fazit grundsätzlich: Du bist auf dem richtigen Weg, gehst aber gewisse Dinge vom Grundsatz her noch falsch an. Das meine ich nicht von deinem Programmcode her sondern von deiner Denkweise eine Aufgabe zu lösen.

Eine Software bzw. deren Logik entwickelt man immer zuerst im Kopf, wenn das dann erledigt ist, geht es an den Programmcode. Grade bei Design von Datenbanken ist das besonders wichtig.

Ich würde sagen, wenn du weitere Fragen hast, dann gerne per PM, hier für das Forum wird das langsam uninteressant bzw. OT.

Gruß
Frank








Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel