Problem mit RTF-Box und Text Object Model (TOM)

06/10/2008 - 20:31 von Wolfgang Badura | Report spam
Hallo!
Es ist mir in VB6 gelungen, einen Text mit dem charset=koi8-r in einer
RTF-Box richtig darzustellen:
Im folgenden Codeausschnitt sind die kyrillischen Zeichen mit ihrer
hexadezimalen Wertigkeit im File "F:\Daten\Vb60tfBox\ASCII-KOI-8.txt"
enthalten.
(zB: â.ì. úÕÂÏ× <thiam@barefootbubbas.com>
àÒÉÄÉÞÅÓËÏÅ ÓÏÐÒÏ×ÏÖÄÅÎÉÅ ÇÒÕÚÏ×.
Mit VB6 ergibt das die richtigen kyrillischen Zeichen!)
Const WM_USER = &H400&
Const EM_GETOLEINTERFACE = (WM_USER + 60)

Dim RtfBoxObj As Object
Dim tomDoc As ITextDocument

SendMessage rtfBox.hwnd, EM_GETOLEINTERFACE, 0&, RtfBoxObj
Set tomDoc = RtfBoxObj
tomDoc.Open "F:\Daten\Vb60tfBox\ASCII-KOI-8.txt", tomText, 20866
'20866 ist charset koi8-r
tomDoc.Save "F:\Daten\Vb60tfBoxussian2.rtf", tomRTF +
tomCreateAlways, 20866

Nach dem letzten Stmt ist "russian2.rtf" tatsàchlich ein gültiger rtf-File,
der zB. in Word auch darstellbar ist!
Das funktioniert ganz wunderbar. Vor allem deshalb, da mit tomDoc.Save der
Inhalt der rtfBox praktisch in jedem Charset gespeichert werden kann.

Wenn ich nun in A03 das Handle "lHandle" der rtfBox (rtfBox.SetFocus und
dann mit der API GetFocus() ) ermittle und
"SendMessage lHandle, EM_GETOLEINTERFACE, 0&, RtfBoxObj" ausführe bleibt
RtfBoxObj uninitialisiert (=Nothing).
"SendMessage rtfBox.hwnd, EM_GETOLEINTERFACE, 0&, RtfBoxObj" löst zwar
keinen Compilerfehler aus,
aber A03 stürzt einige Sekunden nach der Ausführung verstàndlicherweise
kommentarlos ab..

Die Variante "Set RtfBoxObj = rtfBox.Object" oder "Set tomDoc rtfBox.Object" funktioniert auch nicht, da der Fehler 13, Typen
unvertràglich, auftritt.

In DonKarls Site habe ich zu Control-Handles nichts gefunden.

Was kann ich tun, damit die Zuweisung des Objektes tomDoc funktioniert?
Mit bestem Dank im Voraus
Wolfgang.
 

Lesen sie die antworten

#1 Sascha Trowitzsch
06/10/2008 - 21:08 | Warnen spam
Hi Wolfgang,

"Wolfgang Badura" schrieb im Newsbeitrag
news:48ea5a33$0$3968$
Hallo!
Es ist mir in VB6 gelungen, einen Text mit dem charset=koi8-r in einer
RTF-Box richtig darzustellen:
Im folgenden Codeausschnitt sind die kyrillischen Zeichen mit ihrer
hexadezimalen Wertigkeit im File "F:\Daten\Vb60tfBox\ASCII-KOI-8.txt"
enthalten.
(zB: â.ì. úÕÂÏ×
àÒÉÄÉÞÅÓËÏÅ ÓÏÐÒÏ×ÏÖÄÅÎÉÅ ÇÒÕÚÏ×.
Mit VB6 ergibt das die richtigen kyrillischen Zeichen!)
Const WM_USER = &H400&
Const EM_GETOLEINTERFACE = (WM_USER + 60)

Dim RtfBoxObj As Object
Dim tomDoc As ITextDocument

SendMessage rtfBox.hwnd, EM_GETOLEINTERFACE, 0&, RtfBoxObj
Set tomDoc = RtfBoxObj
tomDoc.Open "F:\Daten\Vb60tfBox\ASCII-KOI-8.txt", tomText, 20866 '20866
ist charset koi8-r
tomDoc.Save "F:\Daten\Vb60tfBoxussian2.rtf", tomRTF + tomCreateAlways,
20866

Nach dem letzten Stmt ist "russian2.rtf" tatsàchlich ein gültiger rtf-File,
der zB. in Word auch darstellbar ist!
Das funktioniert ganz wunderbar. Vor allem deshalb, da mit tomDoc.Save der
Inhalt der rtfBox praktisch in jedem Charset gespeichert werden kann.

Wenn ich nun in A03 das Handle "lHandle" der rtfBox (rtfBox.SetFocus und
dann mit der API GetFocus() ) ermittle und
"SendMessage lHandle, EM_GETOLEINTERFACE, 0&, RtfBoxObj" ausführe bleibt
RtfBoxObj uninitialisiert (=Nothing).
"SendMessage rtfBox.hwnd, EM_GETOLEINTERFACE, 0&, RtfBoxObj" löst zwar
keinen Compilerfehler aus,
aber A03 stürzt einige Sekunden nach der Ausführung verstàndlicherweise
kommentarlos ab..

Die Variante "Set RtfBoxObj = rtfBox.Object" oder "Set tomDoc > rtfBox.Object" funktioniert auch nicht, da der Fehler 13, Typen
unvertràglich, auftritt.

In DonKarls Site habe ich zu Control-Handles nichts gefunden.

Was kann ich tun, damit die Zuweisung des Objektes tomDoc funktioniert?



Dazu müsste man vor allem eins wissen:
Was ist eine "RTF-Box" ?
Ist es das Microsoftsche Richrtext Control richtxt32.ocx?
Oder das Lebansche oder ein anderes?
Denn davon hàngt schließlich ab, wie man an das Handle kommt.
Ein SetFocus sollte bei einem OCX nicht notwendig sein, wenn es selbst die
Eigenschaft hwnd unterstützt.
Ansonsten müsste man das Handle erst über FindWindowEx und den Klassennamen
ermitteln.

Ciao, Sascha

Ähnliche fragen