Autor Thema: NotesRichTextNavigator & NotesRichTextRange  (Gelesen 3694 mal)

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
NotesRichTextNavigator & NotesRichTextRange
« am: 26.09.08 - 15:13:07 »
Hallo zusammen,

es gibt zwar schon einiges zu diesen beiden Klassen und dem Thema RichText, aber ich habe hier ein komisches Phänomen...

Folgendes:

Ich habe eine simple Testdatenbank, in der sich ein Dokument befindet, welches ein RichTextItem "Body" mit Text enthält.
Diesen Text muss ich nach Tags durchsuchen und diese dann ersetzen bzw. löschen.

Hier der Text aus dem RichTextFeld:
Zitat
Sehr geehrter Herr Sowieso,

leider müssen wir Ihnen mitteilen, dass eine Reservierung auf diesen Namen unmöglich erscheint.

<<DocLink>>

Und das ist einer mittem im Text: <<DocLink>> Und der Text geht noch weiter.

Mit freundlichen Grüßen
Ihre Rezeption

Und hier ein Agent, der das ganze durchforsten soll:
Die Funktion RTIFindString soll das RichTextItem auf das Vorhanden sein des Tags prüfen.
Die Funktion RTIRemoveString soll das Tag löschen.

Code
Sub Initialize
	
	Dim db As NotesDatabase
	Dim dc As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim s As NotesSession
	Dim rti As NotesRichTextItem
	
	
' ### initialize ###
	
	Set s = New NotesSession
	Set db = s.CurrentDatabase
	Set dc = db.UnprocessedDocuments
	
	
' ### get the rich text item ###
	
	Set doc = dc.GetFirstDocument
	Set rti = doc.GetFirstItem("Body")
	
	
' ### search position of the bookmark <<DocLink>> ###
	
	If RTIFindString(rti, "<<DocLink>>") Is Nothing Then
		Msgbox "Could not find string"
	Else
		Call RTIRemoveString(rti, "<<DocLink>>")
		Call doc.Save(True, False)
		Exit Sub
	End If
	
End Sub

Function RTIFindString(rti As NotesRichTextItem, str_string As String) As NotesRichTextRange
	
	Dim rtn As NotesRichTextNavigator
	Dim rtr As NotesRichTextRange
	
	Set rtn = rti.CreateNavigator
	Set rtr = rti.CreateRange
	
	If rtn.FindFirstString(str_string, RT_FIND_CASEINSENSITIVE) Then
		Call rtr.SetBegin(rtn)
		Call rtn.SetCharOffset(Len(str_string))
		Call rtr.SetEnd(rtn)
	End If
	
	Set RTIFindString = rtr
	
	Set rtr = Nothing
	Set rtn = Nothing
	
End Function

Function RTIRemoveString(rti As NotesRichTextItem, str_string As String) As Boolean
	
	Dim rtn As NotesRichTextNavigator
	Dim rtr As NotesRichTextRange
	
	Set rtn = rti.CreateNavigator
	Set rtr = rti.CreateRange
	
	If rtn.FindFirstString(str_string, RT_FIND_CASEINSENSITIVE) Then
		Call rtr.SetBegin(rtn)
		Call rtn.SetCharOffset(Len(str_string))
		Call rtr.SetEnd(rtn)
		'Print rtr.TextRun
		Call rtr.Remove
		Call rti.Update
		Call rti.Compact
	End If
	
	Set rtr = Nothing
	Set rtn = Nothing
	
End Function

Jetzt kommt der Witz: Nach dem ein zweites Mal nach den Tags (String) gesucht wird, werden diese verdoppelt:-: Obwohl die Methode Remove des NotesRichTextRange-Objektes aufgerufen wird.

Und da das bei RichText-Gedöhns ab und an eine Rolle spielt:
Das ganze sollte unter Notes 6.5.4. laufen.


Kann mir da jemand ein bisschen auf die Sprünge helfen?

Gruß
Johnson
Gruß
Johnson

Offline LN4ever

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 505
  • Geschlecht: Männlich
Re: NotesRichTextNavigator & NotesRichTextRange
« Antwort #1 am: 27.09.08 - 00:20:03 »
Wieviele BODY-Items sind denn beim zweiten Suchen im Dokument vorhanden ? Sind es zwei ? Und im Ersten steht der Originaltext und im zweiten der, der aus der Funktion mit gelöschtem Suchstring zurückkam ?

Gruß

Norbert
Situs vilate in isse tabernit.

botschi

  • Gast
Re: NotesRichTextNavigator & NotesRichTextRange
« Antwort #2 am: 28.09.08 - 13:41:04 »
Guck mal, ob es evtl ein Bug ist.
In irgendeiner Version (kann 6.5.4 gewesen sein) gabs Bugs in vielen RichTextKlassen. ich bin selber mit "suchen und ersetzen" ganz hart auf die Fresse gefallen.

Matthias

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: NotesRichTextNavigator & NotesRichTextRange
« Antwort #3 am: 29.09.08 - 10:27:24 »
@LN4ever
Es ist immer nur ein Bodyfeld. Der Originaltext soll gleich bearbeitet werden.

@botschi
Das kann ich nur unterstreichen. Wenn ich z.B. den Debuger mitten im Durchlauf dann mit "Stop" abreche, raucht mir Notes mit nem NSD ab.  :-\

Hier die Datenbank:
Es gibt:
  • Eine Maske "Document" mit einem RTI "Body".
  • Eine Ansicht "Documents", die die Dokumente enthält.
  • Den betreffenden Agenten "FindAndReplaceWithDocLink", der über "Actions" aufgerufen werden kann.
  • Testdokumente, die den Text zum Testen bereits enthalten.

Der Agent ist noch im Aufbau. Er macht also noch nix mit DocLinks. Aktuell soll er nur suchen und, falls vorhanden, löschen.
Gruß
Johnson

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz