PDA

Vollständige Version anzeigen : Memo Felder mit RTF-Infos -> Daten herausfiltern


Stollentroll2001
28.12.2001, 09:39
Hallo,
ich habe eine Tabelle in der Memo-Felder mit RTF Informationen und dazugehörigen Textdaten vorhanden sind. Ich möchte nun eine Abfrage/Formular erstellen in der/dem nur die Daten aus diesen MEMO-Feldern wieder auftauchen. Die Memofelder haben unterschiedliche Längen, so dass ich mit Right/Left Funktionen wenig Erfolg habe.
Natürlich ist das Ganze wieder megaeilig...

A.S. Titel editiert

[ 11. November 2002: Beitrag editiert von: A.S. ]

Sascha Trowitzsch
28.12.2001, 13:46
Was meinst du mit "Informationen", "Textdaten", "Daten" ?

Also, ich gehe mal davon aus, dass du in den Memo-Feldern den RTF-Text gespeichert hast und jetzt den reinen Text ohne die Format-Tags haben willst.
Tja, da braucht es wohl einen Konverter. Ich kenne keinen für VB.

Aber du kannst in das Formular ein ActiveX-Control "Microsoft RichText Control" einfügen und als Steuerelementinhalt das Memofeld angeben.
Das Control zeigt den formatierten Text an.
Wenn du das nicht willst, setze es auf Visible = False und füge ein Textfeld in das Formular ein. Schreibe dann in das Ereignis "Beim Anzeigen":

Textfeld = AXRichText.Text

(...wenn das Control AXRichtext benannt wurde)

HTH, Sascha

<Volli>
04.01.2002, 12:56
Danke!

Genau den Punkt getroffen! Leider kann ich dieses doofe ActiveX Steuerlement nicht in ein Formular einfügen, weil Access meint, ich hätte dafür keine Lizenz!?! Was mache ich denn da falsch??

Sascha Trowitzsch
04.01.2002, 16:16
Nichts, gar nichts machst du falsch.
Es ist schon so, wie es Access dir sagt: Du hast keine Lizenz für das Ding.

Sorry, ich weiß leider nie, welche OCXe beim normalen Access dabei sind und welche in der Developer Version (die ich laufen habe). In diesem Fall ist es wohl nicht in der Standard/Pro/Premium drin. Es ist zwar im System, kann aber nur von bestimmten Programmen aufgerufen werden.

Ich schau mal nach, ob sich das irgendwie "beheben" lässt. ;)

Ciao erstmal, Sascha

PS: Wenn du deine Email angibst bzw. mir mailst, lässt sich da vielleicht was machen...

Sascha Trowitzsch
16.01.2002, 13:33
Was lange währt...

Da mir das keine Ruhe gelassen hat und ich nix im weiten Web gefunden hab, musste ich mich mal näher mit dem RTF-Format beschäftigen.
Das ist das selbstgestrickte Ergebnis:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre>
<span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="REM">'Konvertiert einen RTF-Text in Plain Text</span>
<span class="REM">'Funktioniert nur bei einfacheren RTF-Dokumenten</span>
<span class="REM">'(Schwierigkeiten gibt es bei eigefügten Bildern und bei Aufzählungen und Tabellen)</span>
<span class="TOKEN">Public Function</span> RTF2TEXT(strRTF <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> S <span class="TOKEN">As</span> String, TX <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> n <span class="TOKEN">As</span> Long, m <span class="TOKEN">As</span> Long, nPar <span class="TOKEN">As</span> Long, flg <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
&nbsp;
<span class="TOKEN">On Error GoTo</span> Fehler
<span class="TOKEN">If</span> Len(strRTF) = 0 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Function</span>
n = 1
<span class="TOKEN">For</span> n = 1 <span class="TOKEN">To</span> Len(strRTF)
<span class="TOKEN">If</span> Mid(strRTF, n, 1) = &quot;{&quot; <span class="TOKEN">Then</span> nPar = nPar + 1
<span class="TOKEN">If</span> Mid(strRTF, n, 1) = &quot;}&quot; <span class="TOKEN">Then</span> nPar = nPar - 1
<span class="TOKEN">If</span> nPar = 2 <span class="TOKEN">Then</span> flg = <span class="TOKEN">True</span>
<span class="TOKEN">If</span> flg <span class="TOKEN">And</span> nPar = 1 <span class="TOKEN">Then</span> <span class="TOKEN">Exit For</span>
<span class="TOKEN">Next</span> n
n = n + 1
<span class="TOKEN">Do</span>
<span class="TOKEN">Do</span> <span class="TOKEN">While</span> Asc(Mid(strRTF, n, 1)) &lt; 32
n = n + 1
<span class="TOKEN">Loop</span>
Jump0:
<span class="TOKEN">If</span> Mid(strRTF, n, 1) = &quot;{&quot; <span class="TOKEN">Then</span>
n = 1 + InStr(n + 1, strRTF, &quot;}&quot;, vbTextCompare)
GoTo Jump0
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Jump1:
m = InStr(n, strRTF, &quot; &quot;, vbTextCompare)
<span class="TOKEN">If</span> m = 0 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Do</span>
<span class="TOKEN">If</span> (InStr(1, Mid(strRTF, n, m - n), &quot;tab&quot;) &gt; 0) <span class="TOKEN">Or</span> _
(Mid(strRTF, m - 4, 4) = &quot;cell&quot;) <span class="TOKEN">Then</span> TX = TX &amp; Chr(9)
Jump2:
n = InStr(m + 1, strRTF, &quot;\&quot;, vbTextCompare)
<span class="TOKEN">If</span> n = 0 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Do</span>
<span class="TOKEN">If</span> Mid(strRTF, m + 1, 1) = &quot;{&quot; <span class="TOKEN">Then</span>
n = 1 + InStr(m + 1, strRTF, &quot;}&quot;, vbTextCompare)
m = n - 1
GoTo Jump2
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
TX = TX &amp; Mid(strRTF, m + 1, n - m - 1)
<span class="TOKEN">If</span> Mid(strRTF, n + 1, 1) = &quot;'&quot; <span class="TOKEN">Then</span>
TX = TX &amp; Chr(Val(&quot;&amp;h&quot; &amp; Mid(strRTF, n + 2, 2)))
m = n + 3
GoTo Jump2
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">If</span> Mid(strRTF, n + 1, 3) = &quot;tab&quot; <span class="TOKEN">Then</span>
TX = TX &amp; Chr(9)
n = n + 3
GoTo Jump1
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Loop</span>
Ende:
RTF2TEXT = TX
<span class="TOKEN">Exit Function</span>
&nbsp;
Fehler:
MsgBox Err.Description
<span class="TOKEN">Resume</span> Ende
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>&nbsp;</pre></div>

Ciao, Sascha

billstein70
11.11.2002, 08:54
Hallo Sascha,

deine function rtf2txt ist gut und funktioniert klasse. leider werden bei der function auch die returns "/par" gelöscht. das ergebnis ist also ein text, der direkt hintereinander erscheint. hast du eine idee, wie man die returns vorher retten kann?

gruss marco

A.S.
11.11.2002, 12:16
Sorry, OffTopic und ich kann Dir jetzt auch nicht helfen ;)

Wollte nur mal sagen, das ich das einmal eine gute Art finde sein Problem darzustellen. ;)

Ich wollte das würden mehr so machen ;)

Gruß

Arno

Sascha Trowitzsch
11.11.2002, 12:36
@billstein:

Sorry, aber das ist lange her... und ich hab es selbst bisher nirgends eingesetzt.
Es würde mich jetzt leider zuviel Zeit kosten, den nicht ganz unkomplizierten Code zu analysieren/debuggen.
Versuch vielleicht selbst, draus schlau zu werden ;)

@A.S. Was wolltest du genau sagen? :confused:

Ciao, Sascha

A.S.
11.11.2002, 12:43
@Sascha,

das ich es gut fand, das Marco den ursprünglichen Thread aufgegriffen hat, anstatt für sein kleines Teilproblem einen neuen Beitrag aufzumachen ;)

Er hätte natürlich auch letzteres machen und einen Link setzen können.

Andersherum betrachtet, würde diese Technik dazu führen, das wir schnell dutzende Beiträge mit hunderten von Beitragsseiten hätten. Das wäre aber IMHO auch nicht soooo wünschenswert und übersichtlich ;)

gruß

arno

A.S.
11.11.2002, 12:52
Idee...

Wenn Du mit Access &gt;= 2000 arbeitest, kannst Du aus den "{/par}"-Angaben im RTF-Text über die Replace-Funktion selbige entfernen und gegen vbCrLf ersetzen lassen.

Damit sollte Dir IMHO schon geholfen sein.

Gruß

Arno

Nouba
11.11.2002, 14:57
Hallo Marco,

auf Stephen Lebans Seize findest Du Kode zum Anzeigen von RTF ohne das OCX. <a href="http://www.lebans.com/richtext.htm" target="_blank">RichText</a>. Wenn Du aber Plain Text brauchst, bleibe bei Saschas Methode.

billstein70
14.11.2002, 13:36
@Sascha:
Kann ich gut verstehen. Ist ja wirklich schon lange her. Trotzdem Danke für Deine Antwort.

Ich habe zum Glück mit Deiner Funktion eine ausreichende Lösung gefunden.

@Nouba:
Danke für den Tip. Auf der Seite habe ich noch etwas interessantes zum Thema gefunden.

@A.S.
Der Tip mit der Replace-Funktion hat mir geholfen. Das Zusammenspiel zwischen Sascha´s Funktion RTF2TXT und der Replace-Funktion haben dengewünschten erfolg gebracht.
Das \vbCrLf bringt zwar nicht den gedachten Erfolg, aber so funktioniert die Sache auch.

Den Code möchte ich natürlich keinem verschweigen.

a = Replace(a, "\par", "\vbCrLf")
b = RTF2TXT(a)
b = Replace(b, "\vbCrLf", "")

Das "\vbCRLF" kann man auch durch "xxxx" ersetzen.
Das Ergebnis b bleibt gleich. Der gewünschte Text ohne RTF-Steurzeichen, aber mit den Returns.

Nochmal Danke an alle.

Gruss Marco

A.S.
14.11.2002, 14:01
Hallo Marco,

an dem Punkt mit vbCrLf hast Du mich falsch verstanden ;)

Es existiert eine (Access?)-VBA-Konstante mit diesem Namen, welche die beiden Zeichen CarriageReturn (0Dh, Wagenrücklauf) und LineFeed (0Ah, Zeilenvorschub) beinhaltet. Diese Konstante solltest Du der Replace-Funktion als Ersetzer übergeben und "/par" gegen -&gt;vbCrLf&lt;- ersetzen lassen ;)

Gruß

Arno