Domino 9 und frühere Versionen > ND6: Entwicklung
NotesRichtextNavigator und RTRange
eknori:
Hat jemand erfahrung mit diesen beiden Klassen ??
Ich knobele gerade an folgenden Problem:
Ein RichtextItem enthält z.B. folgenden Text:
Sehr geehrter Herr <<RCPT>>,
Ihre Anfrage <<REQNUMBER>> wird von unserem Mitarbeiter <<SUPPORTER>> bearbeitet.
Ich möchte jetzt die <<>> Tags durch Werte aus dem Ticket ersetzen, wobei die Strings innerhalb der <<>> Feldnamen darstellen.
Mittels
If rtnav.FindFirstString("<<", _
RT_FIND_CASEINSENSITIVE) Then
Do
Call rtrange.SetBegin(rtnav)
'Messagebox rtrange.textParagraph,, "<<"
' und wie geht es dann hier weiter ??
Loop While rtnav.FindNextString("<<", _
RT_FIND_CASEINSENSITIVE)
Else
Messagebox "<<",, "String not found"
End If
komme ich auch immer an das nächste <<
Aber wie mache ich jetzt das Replace ?
If rtnav.FindFirstString("<<", _
RT_FIND_CASEINSENSITIVE) Then
Do
Call rtrange.SetBegin(rtnav)
'Messagebox rtrange.textParagraph,, "<<"
While rtrange.FindAndReplace _
("<<RCPT>>",_ ' find
CommonNameString (Trim(atWord(Cstr(m),"|",1))),_ ' replace
RT_FIND_CASEINSENSITIVE) > 0
Call rtItem.Update ' Must update before looping
Wend
Loop While rtnav.FindNextString("<<", _
RT_FIND_CASEINSENSITIVE)
Else
Messagebox "<<",, "String not found"
End If
Dieses Konstrukt funktioniert nicht ( ich weiß, daß hier einiges Hardcodiert ist, aber <<RCPT>> ist der erste Tag im Text.
Im Debugger meckert er immer die Zeile mit dem Wend an.
Jemand schon mal die Kombination der Klassen programmiert ( In der Notes Hilfe ist alles separat beschrieben, aber nicht in der Kombination ) Irgendwie scheinen sich die ursprünglich erzeugten Objecte rtNav und rtRange selber zu "zerstören"
flaite:
Ich habe ein ähnliches "RichText Templating" mit den neuen Klassen vor.
Deshalb hab ich ein deutliches Interesse an deinem Erfolg.
Ich hoffe, ich habe das beim raschen Überfliegen verstanden, aber für mich wirkt es eventuell erfolgversprechender, wenn wir statt eines Replace ein ganz neues RichTextItem mit eigenem RichTextNavigator erzeugen und das dann Stück für Stück aus dem geparsten Zeug erzeugen?
Möglicherweise ist das ein bischen verwirrend und vielleicht auch falsch aber ich bin selbst noob in diesem Thema.
Axel
eknori:
--- Zitat ---wenn wir statt eines Replace ein ganz neues RichTextItem mit eigenem RichTextNavigator erzeugen und das dann Stück für Stück aus dem geparsten Zeug erzeugen
--- Ende Zitat ---
ist zumindest einen Versuch wert.
Habe mir auch schon überlegt, mir erst die <<TAG>> Tags in ein Array zu schreiben und dann in einem zweiten Step mit FindReplace das ursprüngliche RTItem zu bearbeiten. Ich glaube, daß ist einfacher, als sich jedesmal den RTNavigator neu zu erzeugen ...
eknori:
strTemp = ""
If rtnav.FindFirstString("<<", _
RT_FIND_CASEINSENSITIVE) Then
Do
Call rtrange.SetBegin(rtnav)
strTemp = strTemp + "~" + Mid(rtrange.textRun, 3, Instr( rtrange.textRun,">") -3 )
Loop While rtnav.FindNextString("<<", _
RT_FIND_CASEINSENSITIVE)
End If
Dim ret As Variant
ret = Split ( strTemp, "~" )
Msgbox ret(1)
liefert mir in ret alle TAGS des RtItems zurück; der Rest ist dann recht einfach ...
OK, man muß ret jetzt noch unique zu machen.
dann kann man mir
forall x in ret.values
sich jeweils einen Wert nach dem anderen vornehmen, sich den Wert des korrespondierenden Items aus dem Doc in der Collection holen und dann beschwingt mit:
While rtrange.FindAndReplace _
"<<" & CStr(x) & ">>",_ ' find
<ReplaceWithWertAusDoc>,_ ' replace
RT_FIND_CASEINSENSITIVE) > 0
Call rtItem.Update ' Must update before looping
Wend
alle Vorkommen von "<<" & CStr(x) & ">>" zu ersetzen.
ein rtItem.Update hinterhergeschossen und schon ist man fertig, oder ?
Das Drumherum ist dann Fleißarbeit, so mit ERRHANDLE und so ...
eknori:
OK, kurz vor der Tagesschau noch schnell der funktionierende Code ( Ohne grossartiges ERRHANDLE ) für ein dynamisches FindandReplace in einem RT Item
Set rtnav = rtItem.CreateNavigator
Set rtrange = rtItem.CreateRange
strTemp = ""
If rtnav.FindFirstString ( TAG_PREFIX, _
RT_FIND_CASEINSENSITIVE) Then
Do
Call rtrange.SetBegin ( rtnav )
strTemp = strTemp + TAG_DELIMITER + Mid ( rtrange.textRun, 3, Instr( rtrange.textRun,TAG_SUFFIX ) -3 )
Loop While rtnav.FindNextString ( TAG_PREFIX, RT_FIND_CASEINSENSITIVE )
End If
Dim arrRetFieldNames As Variant
Dim ret As Integer
arrRetFieldNames = Arrayunique ( Split ( strTemp, TAG_DELIMITER ), 5 )
Set rtrange = rtItem.CreateRange
Dim strT As String
Forall t In arrRetFieldNames
strT = Cstr ( t )
If ( Not strT = "" ) Then
If ( Not ItemTextExists ( TicketDoc, strT ) = False) Then
ret = rtrange.FindAndReplace _
( TAG_PREFIX & strT & TAG_SUFFIX,_ ' find
TicketDoc.GetFirstItem( strT ).Text, _ ' replaceWith
RT_REPL_ALL) > 0
Call rtItem.Update ' Must update before looping
End If
End If
End Forall
@Axel: Ist das so i.O. ? Oder hast du noch eine bessere Idee ?
Oder hat sonstwer noch eine zündende IDEE ?? ( viele Kosumenten, wenig Produzenten )
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln