Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Anlage in Bild einbinden

Begonnen von Illu, September 22, 2011, 19:15:21

⏪ vorheriges - nächstes ⏩

Illu

Hallihallo,
ich hab mal wieder ein Problem mit Access.

Ich speichere in einer Tabelle per Anlagefeld Bilder.

1. Frage: Wird die Datenbank mit 200-300 Datensätzen damit schon langsam und leidet die Performance?
2. Frage: Kann man so ein Anlagefeld so einstellen, dass nur eine Datei gespeichert werden kann?
3. Frage Wie kann ich das Bild aus der Anlage per VBA in ein Grafiksteuerelement laden bzw. geht das überhaupt und wenn nein, gibt es Alternativen (über Anlagesteuerelement z.B.)
Dabei ist zu sagen, dass die Anlage in diesem Fall nicht bearbeitbar sein soll.

Grüße

Illu

database

Hallo,

zu 1: JA
zu 2: NEIN

zu 3:
Speichere die Pfade zu deinen Bildern in der Tabelle und nicht die Bilder selbst!
Im Formular kannst du dann ein Bild-Steuerelement  einfügen, dem du im Bedarfsfall das Bild so zuweisen kannst:

Me!DeinBildsteuerelement.Picture = strDeinBildPfad

Siehe zu Bildern in Datenbanken auch:
http://www.donkarl.com?FAQ2.2

HTH

Illu

#2
Ok, danke. Ich bin auch zu dem Ergebnis gekommen, dass das Abspeichern nicht so sinnvoll ist. Stattdessen lass ich Bilder jetzt nach einem bestimmten Dateinamenmuster in das Steuerelement laden.

Jetzt bin ich aber auf ein rein ästhetisches Problem gestoßen: Wenn man ein neues Bild (bzw. auch wenn es das gleiche ist) in das Bildelement lädt, wird das gesamte Formular neu aufgebaut, was zur Folge hat, dass ein Listenelement einige Millisekunden wieder laden muss, da es um die 200 Elemente hat. Was bei mir schon bei einigen Millisekunden irgendwie störend wirkt, könnte auf einem weniger performanten PC noch deutlich lästiger sein. Gibt es da Abhilfe?

Grüße

database

Hallo, guten Morgen!

Du könntest versuchen ein ev. Formular-ruckeln per VBA-Code zu mindern oder abzustellen.
Schreibe dazu ins Ereignis 'Beim Anzeigen' des Formulars:

Me.Painting = False

Wenn es sich rein nur um die Wartezeit handelt, die benötigt wird um das Listenfeld neu mit Daten zu beschicken ist es ein wenig schwer eine effektive Aussage zu treffen.
Dazu müßte ich wissen WIE das Feld befüllt wird, WIEVIELE Spalten es besitzt und WIE die DATENHERKUNFT bestimmt ist.
Vielleicht gibt es eine Möglichkeit den Ladevorgang zu optimieren - nachdem die obigen Parameter bekannt sind.

ZitatWenn man ein neues Bild (bzw. auch wenn es das gleiche ist) in das Bildelement lädt, wird das gesamte Formular neu aufgebaut
...und wie lädtst du das Bild, mit welchem Code, bei welchem Ereignis - kannst du den mal zeigen bitte?
Mir ist nämlich nicht ganz klar, warum dabei das Form neu geladen werden soll und somit auch die Datenherkunft von Listensteuerelemente neu abgefragt werden




Illu

Me.Painting = False hat leider nicht gebracht.

Woher das Flackern genau kommt, weiß ich auch nicht.

Das Bild wird beim Auswählen eines Listenelements geladen:
imagepath = CurrentProject.Path & "\Mitgliederfotos\" & LCase(nachname) & "_" & LCase(vorname) & ".jpg"
    If Dir(imagepath) = "" Then
        imgFoto.Picture = CurrentProject.Path & "\Mitgliederfotos\nopicture.jpg"
    Else
        imgFoto.Picture = imagepath
    End If


Die Liste wird über folgende Abfrage befüllt:
Dim source As String
    source = "SELECT [mitID], [mitNachname] & "" "" & [mitVorname] AS mitName FROM tblMitglieder " _
    & "WHERE [mitNachname] & "" "" & [mitVorname] LIKE '*" & txtSearch.Text & "*' " _
    & "ORDER BY [mitNachname] & "" "" & [mitVorname] ASC"
    lstMitglieder.RowSource = source
    lstMitglieder.Requery


Gruß

database

Hallo,

mit dieser WHERE Klausel steigst du aber schon heftig auf die Bremse.

ZitatWoher das Flackern genau kommt, weiß ich auch nicht

Wenn ich annehme, dass Nachname und Vorname 'Mustermann Max' lauten und Textfeld 'txtSearch' "ma" drin steht - dann gute Nacht!
Da muss JEDER Nachname mit dem Vornamen zusammengesetzt werden und mit der Suchzeichenfolge verglichen werden.

Du hast eingangs geschrieben 200 Elemente - das ist ein Klax - da ruckelt nichts - ausser du scannst die Tabelle nach deinem Suchbegriff ab.
Läßt sich das denn nicht ein wenig effizienter gestalten?

Wenn das Kombi mit den Namen befüllt ist, kann man ja ins Kombifeld schreiben - durch's Autovervollständigen werden so auch die angezeigten Daten eingeschränkt und du ersparst dir diesen elend langsamen Scanvorgang. Ist ein Name ermittelt zu dem dann das Bild geholt werden soll kann das auch so erfolgen:

z.B. im Ereignis 'Nach Aktualisierung' des Kombifeldes

Dim nachname as String, vorname as String
nachname = DLookup("nachname","tblMitglieder","mitID=" & Me!DeinKombi
vorname = DLookup("vorname","tblMitglieder","mitID=" & Me!DeinKombi

imagepath = CurrentProject.Path & "\Mitgliederfotos\" & LCase(nachname) & "_" & LCase(vorname) & ".jpg"
    If Dir(imagepath) = "" Then
        imgFoto.Picture = CurrentProject.Path & "\Mitgliederfotos\nopicture.jpg"
    Else
        imgFoto.Picture = imagepath
    End If

Illu

#6
Hm ja stimmt, die Abfrage ist natürlich nicht gerade simpel. Das Problem ist, dass es kein Kombifeld, sondern ein Listenfeld ist und das soll es auch bleiben, damit man auch Personen mit gleichem Nachnamen zum beispiel simpel filtern kann etc.
Ich denke, ich werde das Flackern erstmal in Kauf nehmen und es dann auf dem Computer, auf dem die Datenbank verwendet wird nocheinmal testen, obs dort auch akzeptabel ist.
Das Flackern an sich kann man aber nicht unterdrücken?

[EDIT] Ich habs jetzt gerade nochmal durchgetestet: An der Abfrage des Listenfelds liegt es nicht, es flackert auch, wenn ich die WHERE-Klausel rausnehm. Überhaupt flackert es aber wirklich nur, wenn das Bild neugeladen wird. Wenn das Bild unberührt bleibt, flackert auch nichts.