PDA

Vollständige Version anzeigen : Miniaturbilder vergrößert darstellen?


Juergen65
28.05.2012, 10:54
Hallo
Brauch mal wieder eure Hilfe. Ich habe in einem Formular mehrere Miniaturbilder. Nun möchte ich gerne, wenn man auf ein ausgewähltes Bild klickt, dass dieses vergrößert angezeigt wird.

Wie kann ich das realisieren ??

Danke für Tipps
Gruss
Jürgen:)

stuz1
28.05.2012, 12:40
Hallo Jürgen,

was hast du denn vor? Ich habe z.B. eine Artikel-Datenbank, darin kann ich zu jedem Artikel Bilder hinterlegen, die Bilder sind dabei allerdings in einem Ordner im Dateisystem abgelegt. Im Formular verwende ich ein Grafik-Steuerelement, hier wird das Bild als Datenherkunft VERKNÜPFT, Bildeigenschaft Größenanpassung = Zoomen.....

Nun kann man entweder beim Klick auf das Bild ein weiteres Formular öffnen, mit einen Grafik-Steuerelement welches einfach größer ist und diesem die gleiche Bilderherkunft verpassen, oder innerhalb des ersten Formulares ein unsichtbares, größeres Grafikelement sichtbar machen, oder das Bild in einem anderen Programm (z.B. Internetexplorer?) anzeigen lassen..

Die Frage ist also: Was hast du denn genau vor?

Gruß

Stefan

Juergen65
28.05.2012, 12:59
Hallo Stefan
Ich habe mir ein Zuchtbuch erstellt, in einem Formular hat man die Möglichkeit zu einem Zuchttier 4 Bilder in Miniatur mit Bemerkungen zu hinterlegen. Diese Bilder werden angezeigt, mit einem Image von MSForms (ActiveX-Steuerelement).

Mir würde es schon reichen, wenn ich die Möglichkeit hätte diese per Auswahl im internet Browser groß anzuzeigen.

Wie müsste ich da vorgehen ??

Gruß
Jürgen

stuz1
28.05.2012, 13:21
Hallo Jürgen,

ich habe mir die Klasse kurz angeschaut... aber ehrlich gesagt sehe ich auf die schnelle nicht wie das Image-Objekt der MS Forms-Klasse überhaupt funktioniert, habe das noch nie verwendet... :upps:

Da kann ich dir leider nicht helfen.

Wenn du mir sagst was du da genau machst bzw. woher und wie das Image-Control seine Daten bekommt die es anzeigen soll können wir das evtl. lösen, aber wenn ich das richtige Active-X Control erwischt habe dann hat dieses ja auch keine Ereigniseigenschaft beim Klicken oder so... hmm....

Gruß und Sorry,

Stefan

stuz1
28.05.2012, 13:35
Hallo Jürgen,

habe mir das ganze im Objektkatalog kurz angeschaut. Also das Image-Objekt hat auch ein Ereignis BeiKlick... soweit ok... jetzt ist die Frage wie bindest du die DAten an das Element? Die Bilder liegen in einem Verzeichnis? Oder hast du die irgendwie in der Datenbank gespeichert? (Was man nicht sollte?)

Gruß

Stefan

Juergen65
28.05.2012, 14:06
Hallo Stefan
Danke für die Mühe, ich habe mal einen kleinen Auszug als Anhang angefügt.

Ist vieleicht besser als jede Erklärung

Gruss
Jürgen

Storch
28.05.2012, 16:21
Hallo Jürgen,

ich verwende nur noch das MSForms-ImageControl. In meinen Anwendungen habe ich für Großansichten ein eigenes Formular mit einer MSFoms.Imagebox erstellt. Mit Doppelklick auf Miniaturvorschaubilder öffne ich das Form und übergebe in den OpenArgs den Pfad zur Bilddatei.
Eine Sub, die bei Form_Load aufgerufen wird, bringt das Bild dort zur Anzeige.

In einer anderen Anwendung übergebe ich einen entsprechenden Verweis und erzeuge mit diesem Verweis eine RecordSources für das Formular. Diese RecordSource enthält u.a. den Verweis auf den Pfad zu den Bilddateien. Mittels Datensatznavigation ist es nun möglich, alle zusammen gehörigen Bilder durch zu blättern.

Eine dritte Variante (nur eine Idee und ungetestet):
Bei Klick auf eine Miniatur, das ImageControl mit der linken oberen Ecke neu positionieren, dann vergrößern und bei einem weiteren Klick wieder in die Ursprungsgröße bringen.

Die Frage ist natürlich, was DU mit Miniaturansichten meinst. Hast Du extra von einem Bild jeweils ein miniaturisiertes Bild erzeugt oder besteht die Miniatur lediglich aus einem sehr klein gehalten Imagecontrol, welches mittels Zoom, das Bild einpasst???

stuz1
28.05.2012, 16:42
Hallo Jürgen,

ich habe mir deine Datenbank kurz angeschaut.... leider gehst du einen Weg der für mich schwer zu Ergänzen ist da ich auf diese Weise normalerweise nicht mit Bilder umgehe. Du speicherst die Bilder als binären Datenstrom in einem OLE-Feld... das verkompliziert natürlich den Umgang damit einigermaßen... vor allem für mich, da ich mit dieser Methode noch nie gearbeitet habe.

Ich lege alle Bilder Grundsätzlich in einem extra Ordner unterhalb der Datenbank ab.... (z.b. c:\Datenbank\Zuchtbilder\Pict1.jpg)... und von dieser Stelle kann ich dann jederzeit darauf zugreifen und die Datenbank wird nicht unnötig aufgebläht.... dann brauche ich nur den Pfad zum Bild in einer Tabelle abzuspeichern... klar: Wenn du die Datenbank weiter gibst muss auch dieser Ordner extra mitgegeben werden.

Insbesondere jetzt deine Bilder in ein externes Programm zu bekommen wird sicher aufwändig... Also machst du am besten wie Uwe beschrieben hat ein neues Formular welches ein großes Image.Objekt hat welches du entsprechend mit den dir bekannten Daten füllst...

Ein Hinweis zum Click_Ereignis: Dies wird dir im Eigenschaftenfenster nicht angeboten, daher musst du diese Sub für dein Imagecontrol selber anlegen:

Private Sub AXPIX_Click()

MsgBox "Hallo"

End Sub




Viel Erfolg


Stefan

Juergen65
28.05.2012, 17:53
Hallo
Danke für eure Infos, dass mit dem extra Formular wollte ich eigentlich umgehen. Ich hatte gedacht, dass mit VBA Code das bestehende MSForms-ImageControl in der Größe beim anklicken vergrößert dargestellt werden könnte. Oder die Option mit dem anzeigen im Webbrowser.

Nunja, vieleicht hat jemand hier im Forum noch einen Lösungsansatz wie man das umsetzen könnte.

Danke u. Gruss
Jürgen
:)

Storch
28.05.2012, 18:05
Ob Du nun den Webbrowser aktivierst oder nen weiteres Formular öffnest macht IMHO für das Handling des Users keinen Unterschied. Es passiert immer eine Aktion außerhalb des aktiven Forms. Mit einem weiteren Formular würdest wenigstens innerhalb Deiner Anwendung bleiben.

Und warum verfolgst DU nicht meine Dritte Idee, das Control zu vergrößern?

Juergen65
28.05.2012, 18:33
Hallo Uwe
Im Beitrag #6 habe ich einen Anhang als Auszug eine DB beigefügt. Mit Miniaturansicht meine ich die dort dargestellte Bildergröße.

Wäre es möglich, dass man mit einem Click auf dem Bild, dass Bildvergrössert darstellt, wie in deiner dritten Möglichkeit gemeint ??, dieses war mir vorhin beim überfliegen des Beitrages nicht aufgefallen "Sorry"

Gruß
Jürgen:)

stuz1
28.05.2012, 18:37
Hallo,

nur zur Info: Wenn du das machen möchtest muss auch dein UFO vergrößert werden, da du das Image-Steuerelement nicht größer als das Formular machen kannst, bzw. es dann durch die Ränder des Formular verdeckt wird! Momentan ist dein UFO kaum breiter als das Steuerelement selber.

Gruß

Stefan

Storch
28.05.2012, 18:53
Gehen geht (fast) alles.

Folgende Codes funzen bei mir anstandslos: bitte auch die Kommentare lesen!!!

'Im Modulkopf (Deinem Form) deklarieren;
'Variable überwacht den Darstellungszustand des ImageCOntrols
Private bBigSize As Boolean

'separate Sub, nur im Modul sichtbar
Private Sub sChangeSize()
With Me.Image0
'Wenn Boolean = True
If bBigSize Then
'Then-Zweig verkleinert das Imagecontrol
'bei Verkleinerung erst die Ausdehnung verkleinern,
'danach die Positionierung ändern
.Width = 4 * 567
.Height = 4 * 567
.Left = 4 * 567
.Top = 4 * 567
Else
'Else-Zweig vergrößert das Imagecontrol
.Left = 1 * 567
.Top = 1 * 567
.Width = 10 * 567
.Height = 10 * 567
End If
bBigSize = Not bBigSize
End With
End Sub

'Load-Ereignis Deines Formulars
Private Sub Form_Load()
Dim strPicturePath As String
'Kontrollvariable initialisieren
bBigSize = False
'Bildpfad aus Tabelle an Variable zuweisen
strPicturePath = DLookup("img_pfad", "tbl_images", "img_id = 1")
'Imagecontrol mit dem Bild laden
Me!Image0.Picture = LoadPicture(strPicturePath)
End Sub

'DoubleClick, alternativ nimmst Du Click-Ereignis
Private Sub Image0_DblClick(ByVal Cancel As Object)
'Aufruf der Private SUb
sChangeSize
End Sub


Statt Me.image0 musst Du Dein Imagecontrol dort benennen.
Die Booleansche wird in FormLoad initialisiert und überwacht, ob das ImageControl gerade Groß (Big) oder eben nicht Big dargestellt wird. Diese Überwachung ließe sich aber auch ohne die Variable an den Positions -oder ausdehnungswerten des Imagecontrols fest machen.
In Abhängigkeit dessen vergrößert bzw. verkleinert die Sub sChangeSize bei jeem Click/DblClick das Imagecontrol. Das schließt auch jeweils die Aktualisierung der Position mit ein.
Du kannst den Code der Sub sChangeSIze auch direkt in die Ereignisprozedur packen.
Hinweis: Die Multiplikation mit 567 macht aus den Werten Zentimeter
Außerdem solltest DU das Imagecontrol über Menü Format in den Vordergrund setzen
Ich hoffe, ich konnte Dir weiterhelfen

Edith: Hab grad die letzte Nachricht von Stefan gelesen. Da ich Deine DB nicht eingesehen habe...... mein Code setzt natürlich voraus, das das Form groß genug ist. Werd jetzt doch mal nen Blick in Deine DB werfen

Storch
28.05.2012, 19:08
Zuchtbuch.. sowas hab ich noch im Plan für Hunde. Hat aber keine Eile.

Eine Alternative wäre ein zunächst unsichtbares Imagecontrol auf dem Hauptformular, dort mit ausreichender Größe und zentriert ausgerichtet.
Sollte bei FormLoad auf initialisierender weise auf unsichtbar gesetzt werden.

Ein Klick auf eine Miniatur lädt das entsprehende Bild in das noch unsichtbare COntrol und setzt es dann auf sichtbar, ein Klick auf das große Imagecontrol setzt es wieder unsichtbar.

Es bleibt nur zu klären, ob das Imagecontrol auch alle anderen Controls überdeckt.

Juergen65
28.05.2012, 19:17
Hallo Uwe
Mit meinen VBA Kentnisse befinde ich mich in den anfängen, wäre es Möglich, das du mir deinen Lösungsansatz in meiner DB einbaust, die ich dem Anhang #6 beigefügt habe.

Wäre echt toll, danke
Gruß
Jürgen

Storch
28.05.2012, 19:40
Es ist nicht böse gemeint aber wenn man Dir immer 'Alles einbaut', dann wirst Du nicht weit kommen, zumal DU am Ende garnicht mehr weisst, was DU da hast.

Mein Alternativvorschlag ist relativ simpel um zu setzen und dabei will ich Dir auch gerne helfen. Aber immer schrittweise, damit DU auch was lernst. Und für heute hab ich Feierabend.

Du kannst mal ein Imagecontrol in Dein Hauptformular setzen, es mittels Menü FORMAT in den Vordergrund setzen und gucken ob es auch alles dahinter liegende verdeckt. Es soll wohl einige wenige Controls geben, die sich nicht verdecken lassen.
Gib dem Imagecontrol den Namen picView.
Dann setze Du in das Load-Ereignis des Hauptforms folgende Codezeile rein:

Me!picView.Visible = False

Erzeuge Dir im Hauptform weiterhin einen Button zu Testzwecken.
In das Clickereignis dieses Buttons setzt DU folgende Codezeile:

Me!picView.Visible = Not Me!picView.Visible
Das Code kehrt die Sichtbarkeit des Controls bei jedem Klick um.

Ich hab jetzt auch nicht gesehen ob Du schon und wie Du Deine MSForms.Imagecontrols mit Bildern lädst. Wenn DIr das auch noch unklar ist, dann kannst DU diese Codezeile verwenden.
Me!picView.Picture = LoadPicture(strPicturePath)
Die Variable strPicturePath muss noch den vollständigen Pfad (also inkl. Dateiname) auf ein Bild bekommen. Diesen Code kannst Du auch in den Testbutton legen.
Oder Du legst Dir vllt erstmal ein Extra Formular an und bildest meine Anregungen dort nach.

Bis morgen

Juergen65
28.05.2012, 20:18
Hallo Uwe
Wolllte dir nur mitteilen, dass ich es fertig habe. Ich habe es mit einem neuen Formular gemacht. Sieht ganz gut aus.

Danke für die Hilfe
Gruß
Jürgen
:)