Bilder in Formularen

Moderator: ModerationP

Bilder in Formularen

Beitragvon indscho1 » 04. Mai 2021, 10:39

Hallo zusammen,
nach vielen Lessons learned habe ich mein Datenbank-Frontend nun erfolgreich mit einem MS-SQL-Server-Backend verbunden und den Datentransfer optimiert und bin damit mehr als zufrieden. Ich bin aber leider immer noch nicht zufrieden mit der Ladegeschwindigkeit der Formulare und kann dies inzwischen auf die Grafikelemente zurückführen, die ich darin verwende. Im Anhang habe ich einen Screenshot eines solchen Formulars. Die Ladezeit beträgt bei mir im Live-Betrieb auf dem Rechner so zwischen 2 und 5 Sekunden. Wenn ich dagegen den "Befehl 7" anklicke, lade ich damit einen neuen Datensatz im geöffneten Formular in weniger als einer Sekunde. Lasse ich alle Grafiken weg, dauert es etwa 1 bis 2 Sekunden, bis das gesamte Formular geladen ist. Ergo: Die Grafiken sind das Problem.

Das Beispielformular aus dem Anhang lädt von meiner Festplatte 9 Bilder von denen keines größer ist als 6 KB. Die Bilder sind alle vom Typ png. Das Formular ruft beim Öffnen eine Funktion auf, die eine Art StyleSheet abbildet, in dem ich zentral Designparameter für Schriften etc. festlege. Dort wird auch nachgeschaut, ob ein Bild vorhanden ist. Wenn ja, wird es geladen:
Code: Alles auswählen
Public Sub stylesheet_form(frm As Form, Optional booRights As Boolean = False, Optional lID As Long)

   [...]
    ' ++++++++++++++++ FORMULARFORMATIERUNG +++++++++++++++++++++++++
   
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '+++++++++++++++++++++++++ B I L D E R ++++++++++++++++++++++++++
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    'Pfad für Bilder setzen
    If Not Len(ImagePath) Then ImagePath = CurrentProject.Path & "\Images\"
   
    'Firmen-Logo setzen, falls vorhanden
    If FormControlExists(frm.Name, "picFirmenLogo") = True Then
        PicPath = ImagePath & DLookup("image", "v_tblImage", "image_id = 5") & ".png"
        frm.picFirmenLogo.Picture = IIf(FileExists(PicPath), PicPath, vbNullString)
    End If
   
    'Programm-Logo setzen, falls vorhanden
    If FormControlExists(frm.Name, "picProgrammLogo") = True Then
        PicPath = ImagePath & DLookup("image", "v_tblImage", "image_id = 4") & ".png"
        frm.picProgrammLogo.Picture = IIf(FileExists(PicPath), PicPath, vbNullString)
    End If
   [usw.]
   ...
End sub


Insgesamt gibt es ca. 50 solcher Bilder die abgefragt werden, aber in keinem Formular gibt es mehr als 9.

Was mich verwundert sind folgende Merkmale im Betrieb:
1. Arbeite ich auf einer lokalen Entwicklungs-DB (mit Server auf meinem Rechner) gibt es diese Ladeverzögerungen nicht.
2. Je weiter sich die User von Serverstandort entfernt befinden, desto länger dauert das Laden der Formulare (bei in etwa gleichbleibender Geschwindigkeit beim Datenladen).

Ich kann mir diese Zusammenhänge nicht erklären.

Hat jemand eine Idee, an was das liegen kann bzw. wie man Bilder ( wie gesagt, keins ist größer als 6 KB) schneller laden kann?

Vielen Dank im Voraus für eure Bemühungen.

Gruß Ingo
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
indscho1
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 107
Registriert: 16. Nov 2016, 11:14

Re: Bilder in Formularen

Beitragvon Bitsqueezer » 04. Mai 2021, 13:20

Hallo Ingo,

Du sagst, 50 Bilder werden in "stylesheet_form" abgefragt. Und wenn da jedesmal ein DLookup steht, wunderst Du Dich über die Ausführungszeit?

Die erste deutliche Beschleunigung wäre hier, alle DLookups rauszuwerfen und gegen ein einziges Recordset zu ersetzen, das Du am Anfang der Sub öffnest und dann für alles benutzt. Per "MoveFirst" und "Find"/"FindNext"/"Seek" (und je nachdem ob DAO oder ADO) kannst Du dann einfach den Datensatzzeiger verschieben und den Wert aus dem Recordset auslesen.
In Deinem Code würde schlimmstenfalls 50 mal ein DLookup ausgeführt, was jeweils einen "Roundtrip" zum Server kostet, ein Aufbau einer Verbindung, ein Auslesen und ein Schließen der Verbindung.
Entsprechend ist mit zunehmener Entfernung zum Server natürlich auch der Aufwand höher, die Daten abzurufen und damit die Zeit.

Wenn die Images ohnehin lokal in einem Image-Ordner liegen, dann brauchst Du das ganze ohnehin nicht. Verlinke die Images mit der lokalen Grafikdatei, fertig. Wenn sich ein Logo ändert, dann tauscht man einfach die Grafik aus und muß nichts umprogrammieren.

Wenn, was man hier nicht genau entnehmen kann, das Firmenlogo je nach Datensatz geändert werden soll, dann baue den Namen der Logografik mit in die View zum Formular ein und binde das Image-Feld an das Namensfeld über eine Funktion, die den lokalen Pfad voranstellt. Als Parameter übergibst Du der Funktion den Wert dieses Namensfeldes. Das Imagecontrol holt sich die Grafik dann selbst. Im Frontend brauchst Du dann nur die kleine Funktion zum Hinzufügen des lokalen Pfades.

So brauchst Du nicht einmal ein Recordset, um die Daten zu ermitteln, mußt keine Prüfung auf Control-Existenz machen und die Controls holen sich die Bilder einfach selbst, während eine einmalige Formularabfrage nur die Daten lädt.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8276
Registriert: 21. Jun 2007, 12:17


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste