Hintergrundbild bleibt

Moderator: ModerationP

Hintergrundbild bleibt

Beitragvon Gast » 23. Nov 2020, 21:56

Hallo,
unter Formularentwurfstools gibt es den Button Hintergrund. Über Durchsuchen kann man dann ein Hintergrundbild einfügen.
Geht man wieder auf den Button, kann man das Bild wieder aus dem Formular entfernen. In der Formularansicht ist es dann auch nicht zu sehen. Aber in der Entwurfsansicht ist es einfach nicht wegzubekommen.
Wie schafft man das?
Gruß Axel
Gast
 

Re: Hintergrundbild bleibt

Beitragvon Bitsqueezer » 24. Nov 2020, 10:41

Hallo,

keine Ahnung, wie Du das Bild mit dem gleichen Button wieder entfernst, also bis A2016 jedenfalls kann man damit nur Bilder hinzufügen.

Das Hintergrundbild ist in der Eigenschaft "Bild" des Formulars zu finden. Wenn man da reinklickt und den Namen entfernt, fragt Access, ob das Bild entfernt werden soll und dann ist es futsch.

Vorsicht: Access fügt Hintergrundbilder mit dieser Methode automatisch in die versteckte Tabelle "MSysResources" als Anlagefeld ein, löscht das Bild aber nicht, nur weil man es aus dem Formular nimmt. Den Typ erkennt man daran, daß in "Bildtyp" die neue Eigenschaft "Freigegeben" steht, die immer bedeutet, daß das Bild auch in z.B. vielen Formularen immer aus der Tabelle kommt (was ja von Vorteil ist, weil das Bild nicht mehr eingebettet werden muß und somit weniger Resourcen in der Datei belegt). Es bleibt dann bei erneutem Aufruf im "Hintergrundbild"-Button als "Imagegalerie" stehen, um es anderweitig wieder aufrufen zu können.
Es bleibt auch dann in der Tabelle, wenn man das ganze Formular löscht und das Bild nirgendwo sonst gebraucht wird. Das kann die Datei schnell aufpumpen, wenn man einfach mal "hin und her probiert".

Abhilfe hierfür: Erst das Bild, wie gesagt, aus der Bild-Eigenschaft entfernen und dann manuell in der Tabelle MSysResources löschen (den Datensatz). Danach verschwindet nach erneutem Aufruf des Formulareditors das Bild auch aus der Imagegalerie.

Vorsicht mit der Tabelle: Hier werden auch andere Resourcen gespeichert, z.B. die Themes-Dateien usw. Also vor dem Bearbeiten am besten erst eine Kopie der Access-Datei anlegen.

Gruß

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

Re: Hintergrundbild bleibt

Beitragvon Gast » 24. Nov 2020, 13:18

Hallo,
wie Du das Bild mit dem gleichen Button wieder entfernst

Über Formularentwurfstools, Format werden beim Button Hintergrund die Galeriebilder gezeigt. Macht man einen Rechtsklick auf ein Bild, kann man es löschen. Dann ist es auch in MSysResources gelöscht.
Der umgekehrte Weg gilt nicht, wie gerade getestet. Ich habe mich mal an MSysResources gewagt. Löscht man das Bild in MSysResources und kontrolliert es über den Button, steht es da noch und ist auch ohne Fehlermeldung im Formular zu sehen sowohl in der Entwurfs- als auch der Formularansicht. Erst nach Schließen und Neuöffnen des Formulars wird das Bild nicht mehr gezeigt, steht aber immer noch in der Galerie. Will man es als Hintergrund zuweisen, kommt die Meldung, dass Access das Bild nicht öffnen kann.
Versucht man es über den Rechtsklick zu löschen, versagt dieser Weg. Es bleibt in der Galerie. Erst das Tool Reparieren räumt den Eintrag weg.
Am sichersten zum Löschen scheint also der Weg über das Kontextmenü des Buttons zu sein.
Gruß Axel
Gast
 

Re: Hintergrundbild bleibt

Beitragvon Bitsqueezer » 24. Nov 2020, 13:51

Hallo,

OK, auf die Idee, die rechte Maustaste auf dem Ribbon-Bild zu klicken, bin ich nicht gekommen...:)

Die Ribbons haben generell eine Spezialität (wenn Du die mal selbst programmierst, siehst Du, was ich meine): Sie können nicht aktiv programmiert werden. Man kann als Programmierer nur ein "Invalidate" anstoßen und dann ruft das Ribbon entsprechende Callback-Funktionen auf, die wiederum als Rückgabe den Aktualisierungwert liefern. Von hinten durch die Brust in's Auge.
Das Ribbon bekommt also von den Änderungen in der MSysResources nichts mit. Auch der Formulareditor nicht, entsprechend wird beides erst beim Neuöffnen aktualisiert.

Bei mir wird das Bild aber sofort aus der Galerie entfernt, wenn man es mit dem Kontextmenü löscht.

Reparieren war nicht nötig.

Gruß

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

Re: Hintergrundbild bleibt

Beitragvon Gast » 24. Nov 2020, 14:18

Hallo,
bei den Versuchen stellte ich das Hintergrundbild auf Zoomen ein, um es vollständig zu zeigen und passte die Größe des Formulars an, um nur das Bild zu sehen (hilfsweise wurde die Hintergrundfarbe des Detailbereichs bläulich eingefärbt). Es gelang nicht, nur das Bild zu sehen. Beim PopUp das gleiche. Der Detailbereich war zwar schmaler, aber immer noch zu sehen.
Kann man ein Bild so zeigen, dass der Detailbereich ausschließlich vom Bild als Hintergrundbild eingenommen wird?
Ein zweites Problem.Ich komme auf das Hintergrundbild, da auf ihm transparente Textfelder (HotSpots) platziert werden sollen, die beim MouseOver den Text einblenden.
Sie bleiben aber nicht an der Stelle des Bildes, wo sie in der Entwurfsansicht platziert wurden.
Inzwischen teste ich das Bildelement statt des Hintergrundbildes. Das scheint vielversprechender zu sein.
Aber es gibt so viele Optionen, auch für die Form-Eigenschaften :?
Ich probierte schon Dialog, PopUp mit diversen Einstellungen. Aber zufriedendstellend wear das nicht. Was wähle ich denn am besten? Muss gar die Registerkarten-Anzeige ausgeschaltet werden?
Das Formular soll zentriert sein und alle HotSpots an der Stelle sein, wo sie im Entwurf waren.
Gruß Axel
Gast
 

Re: Hintergrundbild bleibt

Beitragvon Bitsqueezer » 24. Nov 2020, 17:57

Hallo,

  • ein Formular-Hintergrundbild gilt immer für das gesamte Formular, einschl. Kopf/Fußbereich
  • Solange das Formular vom User in der Größe änderbar ist, kannst Du nur mit den Möglichkeiten wie Stretch und Zoom arbeiten. Bei Stretch geht natürlich das Bildverhältnis verloren. Bei Zoom entstehen leere Bereiche, die Du dann nur mit einer Farbe auffüllen kannst.
  • mit Popup hat das gar nichts zu tun. Lediglich kannst Du dort das Fenster fixieren, so daß es nicht in der Größe geändert werden kann. (Bei Tab-Darstellung ist das Anwendungsfenster entscheidend. Bei MDI-Darstellung kannst Du das Fenster natürlich auch ohne Popup fixieren.)
  • Wenn sich die Buttons verschieben, könnte es sein, daß Du das Anchoring für die Buttons nicht auf "links oben" eingestellt ist. Nur dann ist die Position fix, so wie im Design. Bei den anderen Einstellungen (das ist ja der Sinn) "wandern" die Controls entsprechend der Einstellung (z.B. bei "rechts oben" ist der Abstand vom rechten Fensterrand im Design entscheidend und bei Fenstergrößenanpassung bleibt der Abstand erhalten, wird das Fenster vergrößert, "wandert" das Control dann auch nach rechts bzw. nach oben.)
  • Das Imagecontrol wäre wahrscheinlich einfacher, da man es beliebig platzieren kann, zur Not auch mit dem gleichen Anchoring.
  • Registerkartenanzeige: Keine Ahnung, ich kann Dein Formular nicht sehen....
  • wenn Dein Formular zentriert sein soll, muß es ja schon Fensteranzeige bzw. Popup sein.

Gruß

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

Re: Hintergrundbild bleibt

Beitragvon Gast » 24. Nov 2020, 22:20

Hallo,
ich danke dir und werde es wieder aufgreifen.
Ich habe aber die Anzeige des Formulars erst einmal zurückgestellt, weil ich befürchte, dass mein Vorhaben evtl. anders oder gar nicht so geht, wie ich es mir vorstelle. Es geht um die Labels, deren SteuerelementTip eine Information zu einem Bildteil liefern soll.
Angenommen es soll eine Bildfolge gezeigt werden. Bild 1 zeigt das Bergmassiv A, Bild 2 das Bergmassiv B, Bild 3 eine Seenlandschaft, eine Straßenkarte, usw. also alles unterschiedliche Motive.
Bei jedem Datensatzwechsel sollen die einzelnen Bilder ins image-Control geladen werden.
Aber wie ist es mit den Labels? Jedes Bild hat unterschiedlich viele und die müssen an verschiedenen Stellen sein z.B. bei Bild 1 das Bergmassiv mit Jenner, Hochkalter, Schneiber, Mittelspitze. Bild 2 mit wiederum anderen Bergen. Ähnliches für Bild 3 usw.
Wie geht man jetzt vor, um die Daten in die Tabelle zu bekommen? Sie ist wohl die n-Seite der Bildtabelle. Also alles richtig platzieren und dann in einer Schleife in die Tabelle schreiben? Dann das nächste Formular für das zweite Bild entwickeln und einlesen usw. Das wäre sehr viel Code zum Auslesen und Schreiben in das endgültige Formular, das noch nicht die Zahl und Orte der Labels weiß, die es bekommen muss. Ist das überhaupt so machbar oder empfiehlt sich ein anderer Weg?
Gruß Axel
Gast
 

Re: Hintergrundbild bleibt

Beitragvon Bitsqueezer » 24. Nov 2020, 22:41

Hallo,

ich würde es so machen:

1. Die maximale Zahl der möglichen Labels festlegen. 50 sollten sicher reichen.
2. Per VBA-Code diese Anzahl Labels als numerierte Labels erzeugen (CreateControl im Designmodus), wenn Du die nicht alle von Hand anlegen willst. Durchnumeriert heißt, z.B. "Label1", "Label2", "Label3"... ohne führende Nullen. Alle Labels werden auf unsichtbar eingestellt.
3. Das Formular mit einem Image-Control versehen, in das die gewünschten Bilder geladen werden. Die Bilder sollten natürlich, wie üblich, nicht in die Datenbank gespeichert werden, sondern als Link. Ab A2010 kann das Imagecontrol anhand eines Links das Bild selbst laden.
4. Einen "Add"-Button hinzufügen, der es dem Benutzer erlaubt, eine neue Beschriftung hinzuzufügen. Dazu klickt er die Stelle im Bild an, die er beschriften möchte. Da Du die X/Y-Position der Maus über dem Imagecontrol abfragen kannst, hast Du nun die Koordinaten für Dein Labelcontrol.
5. Jetzt positionierst Du das erste der 50 versteckten Labels auf diese Koordinaten und machst es sichtbar. Entweder verwendest Du jetzt hier eine Textbox für die Eingabe oder eine feste Textbox z.B. im Header. Da kann der User nun seine Beschriftung erfassen.
6. Am Ende hast Du vier Werte: Die Nummer der Listbox von 1 bis 50, die X/Y-Koordinaten und der Labeltext.
7. Diese vier Werte speicherst Du zusammen mit der Bild-ID oder direkt dem Bildlink in eine Labeltabelle. Damit hat die Datenbank alles, was sie braucht.

Natürlich würde man jetzt noch weiteren Komfort hinzufügen, etwa, eine Beschriftung zu editieren oder ganz zu löschen usw. Das ist kein Problem, weil die Labelnummer gleichzeitig die ID in der Tabelle ist. (Also nicht der Primary Key! Jedes Bild kann je eine ID von 1 bis 50 haben! Entsprechend einen Unique Index auf die LabelID zusammen mit der BildID bzw. dem Linkfeld, so daß keine Labelnummer für das gleiche Bild zweimal vorkommt.)

Beim Anzeigen der Datensätze gehst Du ähnlich vor: Wenn ein Bild aufgerufen wird (Form_Current), lädst Du die Liste der definierten Label in ein Recordset, dann machst Du alle Labelcontrols unsichtbar (die vom letzten Datensatz noch eingeschaltet sein könnten), schaltest alle definierten Labelnummer-Controls in einer Do-Loop-Schleife über das Recordset sichtbar, belegst deren Caption mit dem Text aus der Tabelle und die Position über die X/Y-Werte.

Im Ergebnis kannst Du nun die Labels sowohl definieren, wie auch für verschiedene Bilder verschiedene Labels anzeigen an gewählten Positionen.

Gruß

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

Re: Hintergrundbild bleibt

Beitragvon Gast » 25. Nov 2020, 13:42

Hallo,
danke für die Super-Erklärung. Ich beginne gerade, sie genauso umzusetzen.
Vorab noch eine Gedanke, der mir bei folgendem kam.
Die Bilder sollten natürlich, wie üblich, nicht in die Datenbank gespeichert werden, sondern als Link

Die Anzeige eines Bildes mag ja auf dem Bildschirm (ca. 100 dpi) gut aussehen, aber auf dem Drucker beim Bericht wegen der viel höheren Auflösung miserabel (600, 1200 dpi). Daher wohl größere Bilder nehmen und daher auch die Verlinkung der Bilder. Aber wie orientiert man sich, da ja alle Bilder in ein (1) Bild-Control passen müssen, dessen Größe ja vorgegeben werden muss. Dessen Bildgröße wird auf Zoomen gestellt.
Ist das Bild zu klein, wird es wohl pixelig im Ausdruck sein?
Ist das Bild-Control für das Bild zu groß, erscheinen evtl. unerwartete Ränder? (von der Hintergrundfarbe?)
Also einige Fragen, die mir spontan einfallen; wahrscheinlich noch mehr.
Kann man dafür einige Regeln heranziehen oder das Bild-Control dynamisch halten? Evtl. genügt ja, es transpa-rent zu setzen?
Gruß Axel
Gast
 

Re: Hintergrundbild bleibt

Beitragvon Bitsqueezer » 25. Nov 2020, 14:07

Hallo,

also Access ist nicht gerade als Grafikanwendung bekannt, ist ja auch nicht dessen Zweck...

Im Report kannst Du die Größe eines Image-Controls nicht anpassen, es gibt lediglich automatische Größenanpassung für Textfelder.

Statt eines Reports würde ich daher eher eine Bildliste exportieren, z.B. in Word, wo Du dann genau einstellen kannst, wie groß das Bild dargestellt werden soll.

Natürlich kannst Du dann hier nicht die Beschriftungen wie am Bildschirm ausgeben, geht aber auch im Report nicht, weil Du nicht je Datensatz die Position der Controls neu setzen kannst (habe ich aber auch noch nie probiert, kannst ja mal mit dem Print-Event experimentieren).

Wenn Du die Beschriftungen ausgeben willst, kannst Du höchstens den Datensatz, wie beschrieben, am Bildschirm darstellen und dann einen Screenshot machen. Sorgt aber auch nicht gerade für tolle Bildqualität...

In dem Fall würde ich eher eine .NET-Anwendung o.Ä. erstellen, wo Du alle Freiheiten hast. Als Backend kannst Du trotzdem die Datenbank verwenden. Allerdings beziehen sich die Koordinaten natürlich dann auf die dargestellte Bildgröße im Access-Imagecontrol auf dem Formular von Access. Wenn Du das also passend zur Bildauflösung in einer externen Anwendung richtig darstellen willst, mußt Du die Koordinaten passend skalieren...

Gruß

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

Re: Hintergrundbild bleibt

Beitragvon Gast » 26. Nov 2020, 15:20

Hallo,
ich denke mit der Qualität kann man leben und mache mal weiter.
Ich hänge aber bei
Jetzt positionierst Du das erste der 50 versteckten Labels auf diese Koordinaten und machst es sichtbar.
Wie geht’s dann weiter?
Ein zweiter Klick soll ja die Werte in tblLabels schreiben und zwar am besten für das Label, das auf dem zuvor geklickten folgt also Label1, dann Label2 usw.
Mit DLookup könnte man einen Datensatz ermitteln, dessen xPos noch Null ist, aber das wäre sicher nicht Label2, um beim Beispiel zu bleiben. Und eine Stringzerlegung zur Ermittlung der Ziffern der Labels wäre machbar, aber umständlich, um zu finden, welches nun dran ist. Dasselbe für eine Schleife Vielleicht auch die Alternative, sich die Ziffer irgendwo zu merken.
Was wäre denn am geeignetsten?
PS Warum sollten die Labels keine führende 0 haben, also nicht Label01, Label02... (Vorteil beim Sortieren) oder hängt das mit obigem zusammen?
Gruß Axel
Gast
 

Re: Hintergrundbild bleibt

Beitragvon Bitsqueezer » 26. Nov 2020, 15:43

Hallo,

ich würde, wie gesagt, einfach einen "Add"-Button zur Verfügung stellen, damit der User bewußt einen neuen Label hinzufügt, nicht durch irgendwelche versteckten Funktionen wie "ich klicke nochmal drauf und halte dabei STRG-Shift-Alt gedrückt und tanze um die große Eiche und ...." - das ist Kokolores, da weiß keiner, wie das zu bedienen ist.

Statt Labels könntest Du natürlich auch gleich Textboxen verwenden, dann hättest Du auch die Möglichkeit, den Text direkt an Ort und Stelle zu editieren, Conditional Formatting zu verwenden (dann können die Labels auch Farbe haben..) usw.

Du kannst nicht wissen, welche Labelnr noch frei ist. Der User könnte Label 1,2,3 eingefügt und dann Label 1 gelöscht haben, dann hast Du (auch in der Tabelle) nur noch die IDs 2 und 3.

Das macht aber gar nichts, Du mußt auch keinen Namen zerlegen, denn die Tabelle ist das Informationskriterium. Beim Einlesen (Datensatzwechsel) des nächsten Bildes liest Du die Liste aller IDs mit Bezeichnungen, Positionen usw. ein, und Du verwendest dann einfach "Me.Controls("Label" & rs.Fields("LabelID")).Visible=True". Wenn also nur Label 2 und 3 existieren, dann werden auch nur diese Controls verwendet.
Wenn der User dann wieder "Add" klickt, wird bei 1 angefangen und nach dem ersten Label gesucht, das unsichtbar ist, dessen ID ist dann das nächste Label. Somit werden die 50 möglichen immer optimal genutzt. Da Du hierfür eine Zählschleife verwendest, ist Deine Zählvariable die ID, also auch hier keine Stringzerlegung.

Keine führende 0, weil Du die Zahl einfach mit "Label" verknüpfen kannst, um den Controlnamen zu ermitteln. Wozu sollte eine Sortierung hier Sinn haben? Der User sieht die Controlnamen nie und dem Entwickler ist es auch egal. Du KANNST natürlich eine führende 0 einfügen, dann mußt Du halt beim Namenzusammensetzen mehr coden. Das ist Deine Entscheidung.

Gruß

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

Re: Hintergrundbild bleibt

Beitragvon Gast » 28. Nov 2020, 15:36

Hallo Christian,
ich habe einige Zeit verbracht, das auf die Beine zu stellen. Aber, aber…
einfach einen "Add"-Button zur Verfügung stellen, damit der User bewusst einen neuen Label hinzufügt

Geht das überhaupt? Mein Versuch war ohne Erfolg, da man den Code des Add-Buttons ja nur in der Formularansicht starten kann, aber Controls kann man ja mit CreateControl nur in der Entwurfsansicht (bei der Layout-Ansicht ging es auch nicht) erstellen. Ein Widerspruch, da dies sich gegenseitig ausschließt.
Statt Labels könntest Du natürlich auch gleich Textboxen verwenden

Da möchte ich doch lieber bei den Labels bleiben, da die Boxen Teile des Bildes überdecken würden. Man kann später unter das Bild Textboxen bringen, die von den Labels abhängen.
Du kannst nicht wissen, welche Labelnr noch frei ist

Da überlege ich auch noch, wie das zu lösen ist. Aber bisher keine Lösung, da ich immer auf obigen Widerspruch stoße.
Also jede Menge Baustellen. Ich komme einfach nicht weiter und zweifle sehr, ob es überhaupt geht. Aber vielleicht hast du den Überblick und weißt einen Weg aus der Sackgasse.
Gruß Axel
Gast
 

Re: Hintergrundbild bleibt

Beitragvon Bitsqueezer » 28. Nov 2020, 18:02

Hallo,

da hast Du mich falsch verstanden.

"CreateControl" nutzt Du nur einmalig, um per VBA-Code die 50 Controls zu erstellen, also im Designmodus.

Danach werden alle 50 auf Visible=False gestellt (am besten gleich beim Erzeugen) und dann im Formularmodus entsprechend sichtbar gemacht.

Das beschränkt, wie gesagt, das Maximum an Labels auf 50, klar, sollte aber reichen.

Wenn Du andauernd "CreateControl" im Designmodus machst, wirst Du feststellen, daß Access irgendwann "dicht" macht und keine weiteren Controls mehr im gleichen Formular erlaubt, selbst wenn Du alle vorher löschst. Das ist also keine Lösung für den Betriebszustand, sondern soll nur das Design erleichtern, wenn Du nicht 50 manuell erzeugen willst.
Die 50 können alle an Koordinate 0,0 liegen.

Wenn Du schon mal meine Filterklasse gesehen hast, da wird es auch so gemacht. Von jedem Controltyp, der benötigt wird, liegen 50 versteckte im Formular und werden passend zum Filter sichtbar gemacht.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7911
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