NotesRichText und ich bekomme graue Haare

    • Offizieller Beitrag

    ich versuche im Body (RT-Feld) einige Wörter farbig hervorzuheben.
    funktioniert auch, wbeim erstenmal. Lasse ich den Code ein 2. mal über das Body-Feld, dann wird irgendetwas hervorgehoben und beim nächstenmal werden sogar teile gelöscht.


    Mein Test-Eintrag:
    Test Achtung Test


    1. Lauf:
    Test [color=FF0000]Achtung[/color] Test


    2. Lauf:
    [color=FF0000]Test Achtung[/color] Test


    3. Lauf:
    [color=FF0000]Test Ac[/color]
    hier scheint genau nach dem Offset abgeschnitten zu werden.



    Habt Ihr eine Ahnung warum sich dieses Script so verhällt?
    Habe ich einen Denk-Fehler im Script?


    Danke und Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Hallo Dirk,


    ich hoffe, das dir die Haare noch nicht ausgefallen sind.


    Nun zu deinem Script.


    Hier ist das klassische Problem von Notes. Richtext-Änderungen im Backend durchführen, welche im dann im geöffnetem Frontend nicht sichtbar sind.


    Also muss hierfür am Anfang in den Editmodus gewechselt werden.
    .: If uidoc.EditMode = False Then uidoc.EditMode = True :.



    Wenn ich den CharOffset richtig verstanden habe, dann ist das der Startpunkt für die Range. Somit würde in deinem Fall der Eintrag ab der 6. Stelle erzeugt.
    .: Call rtnav.SetCharOffset( 5 ) :.


    Und zum guten Schluß wird alles noch gespeichert.
    .: doc.Save True, True, True :.
    .: :.
    .: Call uidoc.refresh( True ) :.
    .: Call uidoc.Reload :.
    .: Call uidoc.Save :.
    .: :.
    .: uidoc.EditMode = False :.


    Bei mir hat's funktioniert.
    Ich hoffe das damit ein paar Haare retten konnte.


    Gruß
    Ralph

    • Offizieller Beitrag

    sind noch nicht ausgefallen, nur ergraut :D


    Erstmal Danke für Deine Antwort.


    Den Button, der das RT-Feld ändert, sehe ich nur, wenn das Dokument im LeseModus geöffnet ist. Im Script steht auch noch ein Uidoc.Close.


    Ist mir auch klar, dass ich das RT-Feld nur im BackEnd verändern kann.


    Den StartPunkt der Range setze ich mit:
    rtnav.FindFirstString(searchString$) ' Suchen im RT-Feld
    Call rtrange.SetBegin(rtnav) ' setzen des RangeBeginns


    Mit SetCharOffset schiebe ich nur meinen Cursor um 6 Stellen (Länge des Wortes "Achtung") weiter und setzte dort das RangeEnde.
    Call rtnav.SetCharOffset(Len(searchString$))
    Call rtrange.SetEnd(rtnav)


    Beim erstenmal macht das Script auch was es soll, nur beim 2. mal wird irgend etwas markiert und dann beim 3. mal der Text abgeschnitten.


    Nehme ich nach dem ersten Lauf die Formatierung aus dem RT-Feld raus, dann funktioniert es wieder.


    Was will ich eigentlich erreichen:
    In einem Konfigurations-Dokument sollen Wörter und deren Formatierung hinterlegt werden. z.B:
    "Auchtung" - rot, fett , Courier
    "Wichtig" - grün, fett
    "Error" - lila, fett
    usw.
    Diese Wörter sollen so in dem RT-Feld formatiert werden.
    Zur Zeit kopiere ich den Text per OLE-Automation nach Word, formatiere den Text und kopiere ihn zurück ins RT-Feld, funktioniert auch. Leider kann ich nicht sicherstellen, dass auf allen Rechneren Word installiert ist. Die OLE-Automation ist zwar langsamer, aber die Formatierungsmethoden sind wesentlich effizienter.


    Gruß
    Dirk


    */edit
    Notes Clients: 6.5.1 deutsch, 6.5.3 deutsch und 6.5.4 deutsch

  • dann war meine Antwort ja noch nicht zu spät..... ;)


    Wie das Leben so spielt! Nach deiner Antwort wollte ich meine Lösung testen und es funkionierte nicht. :-o War ich wohl zu euphorisch.


    Solch' eine Art der Anwendung habe ich mir gedacht. Alles andere macht hierfür keinen Sinn. Da ich etwas ähnliches benötige, teste ich noch mit den Möglichkeiten herum.


    Hierbei wurde ein Fehler erzeugt, wenn der gesuchte Text am Ende der Zeile im RT stand. Daher die If-Klausel.


    Aber jetzt :
    Script kann wahrscheinlich noch optimiert werden, aber es klappt.


    *****************************************
    if rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) Then
    Call rtrange.SetBegin(rtnav)
    hitString = Instr(rtrange.TextParagraph, searchString)
    If hitString <> 0 Then
    Set rtnav2 = rtnav.Clone
    Set rtrange2 = rtrange.Clone
    erg = rtnav2.FindFirstString(searchString)
    While erg = True
    Call rtrange2.SetBegin( rtnav2 )
    Call rtnav.SetCharOffset( Len(searchString) )
    If Len( rtrange2.TextParagraph ) > erg Then
    Call rtrange2.SetEnd( rtnav2 ) '#
    End If
    Call rtrange2.SetStyle( richStyle1 )
    Wend
    End If
    Set rtrange2 = Nothing
    Set rtnav2 = Nothing
    Else
    Messagebox "Kein Element im Body",, "Kein Paragraph"
    End If

    doc.Save True, False, False
    strNoteId = doc.NoteID
    uidoc.Close
    Set doc = Nothing
    Set doc = db.Getdocumentbyid( strNoteID )
    Call ws.EditDocument( False, doc )
    ***********************************



    Hoffe das ich dir helfen konnte


    gruß
    Ralph

    • Offizieller Beitrag

    die Zeile
    if rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) Then
    gibt immer False zurück, d.h. ich bekomme nur die MsgBox ""Kein Element im Body".


    Gruß
    Dirk

  • Hallo,


    was ist dann bei dir anders???


    Sollen die Änderungen unbedingt im Workplace erledigt werden? Reicht nicht hierfür auch eine Ansicht mit entsprechnder Aktion auf die selektierten Dokumente?


    Ich habe eine Testmaske mit zwei Feldern (Titel und Body). Body ist dabei natürlich ein RT-Feld.


    Beim CopyAndPaste hat sich wohl im Script ein FATALER Fehler eingeschlichen (ENDLOS-SCHLEIFE).
    Daher, bevor das Script weiter eingesetzt wird, vor dem WEND muß folgender Codes-Schnipsel eingefügt werden:


    "erg = rtnav2.FindNextString(searchString)"


    Ansonsten funktioniert das Script bei mir.
    Habe es unter verschiedensten Möglichkeiten, wie:
    <Test Achtung TEXT!> oder


    <Test Achtung TEXT


    Test2 Achtung und weiter im TEXT


    Achtung>
    ausprobiert.



    Noch irgendwelche Ideen??


    Gruß
    Ralph

    • Offizieller Beitrag

    ich habe eine Maske mit nur einem Feld (RT-Feld "Body") und einer Schaltfläche. In dieser Schaltfläche befindet sich folgender Code:


    Egal was ich in dem RT_Feld "Body" eintrage, ich bekomme immer die MSGBox "Kein Element im Body"


    Gruß
    Dirk

  • In deinem Script wird das Body-Feld gelöscht, bevor du es nach Text-Schnipseln durchsuchst.


    <
    Set body_Item = doc.GetFirstItem("Body")
    Call body_item.Remove


    Set body = doc.CreateRichTextItem("Body")
    >


    Danach wird ein neues, <b>leeres</b> Body-Feld erstellt.
    Dann darf das Script auch die entsprechende Meldung ausgeben.


    Gruß
    Ralph

    • Offizieller Beitrag

    OH man - hast Recht - ich hatte Scriptteile aus meinen alten Versuchen kopiert :hammer:


    Habe jetzt das Script angepasst


    Aber ich bekomme immer noch die MSGBox "Kein Element im Body" :-?


    Gruß
    Dirk

  • aber wir kommen der Sache immer näher.


    Den einzigen Unterschied zu meinem Script, die Reihenfolge der Objektzuweisungen.


    <
    Set body = doc.GetFirstItem("Body")
    Set rtnav = body.CreateNavigator
    Set rtrange = body.CreateRange
    >


    Noch etwas: :-?
    Der nächste Fehler wist vorprogrammiert, eine Zuweisung für das Objekt "db" fehlt noch.


    "Set doc = db.GetdocumentbyUNID( UNID )"


    Ich habe mir angewöhnt in den Deklarationen <Option Explicit> einzutragen. Dadurch werden alle Variablen und Objekte beim Kompilieren überprüft. Ist zwar zum Teil umständlich, aber es hilft.


    Gruß
    Ralph

    • Offizieller Beitrag

    Habe jetzt Deine Reihenfolge verwendet - gleiches Ergebnis "Kein Element im Body".


    Option Declare nutze ich auch, allerdings nicht zum Testen von Code Schnipseln. Daher auch das nicht vorhandene db-Object. Allerdings muss das RT-Feld bis dahin schon berechnet und gespeichert sein.


    Gruß
    Dirk

    • Offizieller Beitrag

    Hinweis:
    "Option Explicit" oder "Option Declare" brauchst Du nicht jedesmal neu eintragen.


    Gehe mal in die Eigenschaften des Programmierfensters auf den 2. Reiter und aktiviere den Punkt "'Option Declare' automatisch hinzufügen".

  • Ich meinte nur den Eintrag "Option Explicit".
    "Option Declare" wird automatisch eingetragen. Lettzterer überprüft jedoch nicht den Code auf Unstimmigkeiten hinsichtlich der Deklarationen. Hierfür ist dann "Option Explicit" zuständig.


    Jetzt aber wieder zum Thema!


    Der Screenshot zeigt die Inhalte der Variablen laut Debugger.


    Kannst du damit etwas anfagen?


    Gruß
    Ralph

    • Offizieller Beitrag

    SCH... Cache. Habe die Cahce.ndk gelöscht und schon funktioniert das Script.


    Habe nur noch die Zeile "erg = rtnav2.FindNextString(searchString)" vor dem Wend eingefügt.


    Danke. Hast Dir ein erholsammes Wochenende bei einem :pint: verdient.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein