"Wie füge ich ein Bild in eine TextBox ein?" Diese und viele ähnliche Fragen wurden schon oft gestellt. Bisher war die Antwort immer: "Kompliziert, muss man über Umwege machen". Die Zwischenablage musste dafür herhalten. Reinkopieren und rauskopieren. Nun ist damit Schluss. Betrachten wir eingefügte Bilder in einer RichTextBox einmal genauer. Doppelklickt man darauf, so öffnet sich das assoziierte Programm, zumeist Paint. Das Bild ist nichts weiter als ein Objekt, ein Bitmap-Objekt. Dieses Objekt nennt man OLE-Objekt (OLE = Object Linking and Embedding). Es bedeutet also, dass ein einfügbares Objekt erzeugt wird, welches durch Doppelklick aktiv wird und bearbeitet werden kann. In Microsoft Word und anderen Programmen ist dieses Verfahren ähnlich. Doch nun zum Wesentlichen. Um ein OLE-Objekt einzufügen benötigen wir natürlich die RichTextLibrary, die durch das Einfügen der RichtextBox-Komponente dem Projekt zur Verfügung gestellt wird. Die eingefügte RTF-Textbox führt ein Objekt namens "OLEObjects" auf. Dieses ist die Auflistung aller OLE-Objekte in der RTF-Box. Folgende Eigenschaften und Methoden sind verfügbar: Function Add([Index], [Key], [source], [objclass]) As OLEObject RTFBox.OLEObjects.Add , , "C:\test.bmp", "PicViewer.Picture" Wenn Sie das Standard-Programm nehmen wollen, dann lassen Sie objclass einfach weg. Sub Clear() Property Count As Long Property Item([Item]) As OLEObject Sub Remove(Item) OLEObject im Detail Nun schauen wir uns mal das OLEObject näher an. Es hält einige praktische Funktionen bereit. Über die Class-Eigenschaft können Sie die OLE-Klasse des Objekts abfragen, bspw. "Bitmap" in unserem Fall. Vielleicht die wichtigste Eigenschaft ist DisplayType. Sie legt fest, ob der Anwender den Inhalt des Objekts sieht (rtfDisplayContent, unsere Bitmap oder auch ein Excel-Datenblatt) oder ob lediglich das assoziierte Symbol (Icon) angezeigt wird (rtfDisplayIcon). Über die Key-Eigenschaft können Sie den festgelegten Key abrufen oder auch neu setzen, falls Sie nachträglich noch einen Wert dafür setzen wollen. Mit diesem Wissen können wir bereits unsere Funktion zum Hinzufügen eines Bildes in die RTF-Box schreiben. Die folgende Funktion können Sie so in ein Modul einfügen:Public Function RTFAddPicture(ByRef pRTFBox As Control, _ ByVal pFilename As String) As Boolean On Error Goto err_RTFAddPicture pRTFBox.OLEObjects.Add(, , pFilename).DisplayType = rtfDisplayContent RTFAddPicture = True Exit Function Err_RTFAddPicture: Err.Clear RTFAddPicture = False End Function Durch diese Funktion wird das Objekt eingefügt und sein Inhalt wird angezeigt. Achten Sie aber darauf, dass das Objekt dabei markiert wird und einen Rahmen anzeigt. Um das zu verhindern setzen Sie die SelStart-Eigenschaft der RTF-Box hoch oder runter, je nachdem ob der Cursor vor oder hinter dem Objekt auftauchen soll.
Um bspw. ein neues Excel-Datenblatt einzufügen, gehen Sie wie folgt vor: ' Leeres Excel-Datenblatt RTFBox.OLEObjects.Add(, , , "Excel.Sheet").DisplayType = rtfDisplayIcon Ein OLE-Objekt stellt aber ebenfalls Menüs zur Verfügung. Um diese Menüs zu initialisieren, rufen Sie die FetchVerbs-Funktion auf (Verb = Menü). Danach können Sie die ObjectVerb-Objekte nutzen. In einem kleinen Beispiel rufen wir nun einmal die vorhanden Verben für unsere Bitmap ab: ' Objekt erstellen Set itm = rtb.OLEObjects.Add(, "bmp", "c:\windoof\Ägypten.bmp") ' sichtbar machen itm.DisplayType = rtfDisplayContent ' Verben abrufen itm.FetchVerbs ' Verben ausgeben For n = LBound(itm.ObjectVerbs) To UBound(itm.ObjectVerbs) MsgBox itm.ObjectVerbs(n) Next n Den Pfad zu Ihrer Bitmap müssen Sie natürlich anpassen. itm stellt ein OLEObject-Objekt dar. Im Normalfall werden zwei Verben ermittelt, "&Bearbeiten" und "Ö&ffnen". Das &-Zeichen zeigt wie gewöhnlich an, dass der folgende Buchstabe unterstrichen werden soll. Um ein Verb auszuführen müssen Sie DoVerb aufrufen und den Index des Verbs angeben. Bspw. DoVerb 1 würde also den Befehl "Öffnen" ausführen und das Programm Paint aufrufen, um das Bild zu bearbeiten. Bearbeiten von OLE-Objekten Doch was passiert eigentlich beim Bearbeiten des Objekts? RTFBox.OLEObjects.Add , , "C:\test.txt" Somit haben Sie das OLE-Objekt eingefügt. Führen Sie das Projekt nun aus und falls sich das Textprogramm nicht automatisch öffnet, doppelklicken Sie auf das Symbol im RTF-Feld. Wenn Sie den Dateinamen überprüfen, werden Sie merken, dass es sich nicht um ihre erstellte Datei handelt. Dies ist eine Art Editierprävention. Wenn Sie bspw. ein Bitmap haben, welches nur angezeigt werden soll, aber auf gar keinen Fall dauerhaft verändert (ein Logo bspw.), so brauchen Sie sich keine Gedanken zu machen. Es wird eine temporäre Datei angelegt, in unserem Beispiel mit dem Namen "C__test[1].txt" oder etwas Vergleichbarem. Diese kann dann editiert werden. Beachten Sie aber Folgendes: Für die gesamte Ausführungszeit bleibt das temporäre Dokument in seiner editierten Form. Erst beim nächsten Neustart (des Programms natürlich) wird wieder mit der Ausgangsdatei initialisiert. Sie können auch nicht zwischenzeitlich das Objekt verändern. Das OLEObject bietet keine Filename-Eigenschaft oder Refresh-Methode! Die einzige Möglichkeit, die sich bietet, ist das Entfernen und Hinzufügen des OLEObject. Über die OLEObjects-Auflistung entfernen Sie über die Remove-Funktion das Objekt und fügen dafür ein neues mit der bekannten Methode ein. Achten Sie aber auf die SelStart-Eigenschaft des RTF-Felds, damit sich das Objekt auch an derselben Stelle befindet wie das alte. Falls Sie sich fragen, wie Sie das Editieren verhindern können, dann lautet die Antwort leider: gar nicht oder nur über Umwege. Anders als mit dem Einfügen der Objekte, was auch lange nur über Umwege ging, müssen Sie hier die Umwege in Kauf nehmen. Über Subclassing (das Abfangen der Windows-Fensternachrichten an das RTF-Feld) können Sie das noch manipulieren. Klassen für Dateien Falls das Bild in der Zwischenablage vorliegt, dann sollten Sie wie zuvor verfahren und einfach den Tastencode für das Einfügen an das RTF-Feld schicken (Strg + V oder Shift + Einfg.) Falls Sie sich übrigens fragen, wo die temporäre Datei abgelegt wird, dann müssen Sie lange suchen. Getestet unter Windows XP speicherte das RTF-Feld die temporäre Datei unter "D:\Dokumente und Einstellungen\Administrator\Lokale Einstellungen\Temporary Internet Files\Content.IE5\4H6VWLUN\C__test[1].txt" und somit sicher vor Suchvorgängen, dadurch aber auch sehr gut selbst vor dem Programmierer versteckt. Angenommen, Sie wollen einen Internet-Link einfügen, so können Sie nicht einfach als Dateinamen eine Internetseite mit http:// angeben. Wird source angegeben muss diese lokal erreichbar sein. Sie können natürlich eine HTML-Datei erstellen und darin im HEAD-Bereich eine Weiterleitung auf die gewünschte Seite erstellen. Das ist ebenso schnell und erspart viel Ärger. Dieser Workshop wurde bereits 30.918 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats September 2024 Dieter Otter Übergabeparameter: String oder Array? Mit der IsArray-Funktion lässt sich prüfen, ob es sich bei einem Übergabeparameter an eine Prozedur um ein Array oder einer "einfachen" Variable handelt. Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. |
|||||||||||||
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. |