vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Forms/Controls   |   VB-Versionen: VB5, VB601.07.03
Einfügen von Bildern und Objekten in die RichTextBox

"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.

Autor:  MartoengBewertung:  Views:  30.610 

"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
Key ist wie bei einem ListView-Objekt bspw. eine eindeutige Zuordnungsmöglichkeit. Source gibt eine Quelldatei an, wenn vorhanden. Bei unserem Problem des Bitmaps müssen wir hier natürlich den Pfad zur BMP-Datei angeben. Objclass gibt die Objektklasse an. Dies kann bspw. "Bitmap" sein, aber auch "Excel.Sheet". Wenn Sie als source bspw. "C:\test.bmp" angeben wird die Objektklasse nicht unbedingt gebraucht. Über Objektklasse können Sie ein spezielles Programm für die Datei auswählen. Nehmen wir an, es ist ein Programm namens "PicViewer" installiert und es stellt ein einfügbares Objekt zur Verfügung, dann könnte der Aufruf wie folgt aussehen:

RTFBox.OLEObjects.Add , , "C:\test.bmp", "PicViewer.Picture"

Wenn Sie das Standard-Programm nehmen wollen, dann lassen Sie objclass einfach weg.

Sub Clear()
Löscht alle OLE-Objekte in der RTF-Box.

Property Count As Long
Gibt die Anzahl der OLE-Objekte in der RTF-Box zurück.

Property Item([Item]) As OLEObject
Gibt ein Element via Index (1,2,3,…) oder des spezifizierten Keys (siehe Add-Funktion) zurück.

Sub Remove(Item)
Remove entfernt ein bestimmtes Element wieder.

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.

RTFAddPicture im Einsatz
Abb.1: RTFAddPicture im Einsatz

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?
Beim Doppelklick auf das Symbol (oder beim Bitmap bspw. auch den Inhalt) des OLEObjekts wird das assoziierte Programm ausgeführt, das wissen wir bereits. Um zu verdeutlichen, was wirklich passiert machen wir einen Test. Erstellen Sie eine Datei direkt auf "C:\" namens "test.txt" und schreiben Sie etwas hinein (ein einfaches "blubb" o.ä. reicht). Fügen Sie die folgende Zeile in Form_Load ein:

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
Wenn Sie eine Datei ohne eine bestimmte Klasse (Class) angeben nimmt das RTF-Feld das Standard-Programm für den Dateityp. Bei Bitmap (*.bmp) ist es Paint. Achten Sie aber darauf, dass Dateien wie "GIF", "JPG" und weitere Grafikformate erstens nicht standardmäßig Paint zugeordnet sind und zweitens der Zusatz "Bitmap" bei einer GIF-Datei bspw. nicht zum Erfolg führt, sondern trotzdem das Standard-Programm geöffnet wird. Das hängt viel von den Systemeinstellungen des Anwenders ab und so ist es ratsam nur Bitmap-Dateien als Grafiken einzubinden.

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.



Anzeige

Kauftipp Unser Dauerbrenner!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.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


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.