Autor Thema: NotesRichTextNavigator & NotesRichTextRange  (Gelesen 3777 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