Hallo zusammen,
versuche mich gerade an einer Kommentarfunktion.
Dazu soll es möglich sein Text in einem Richtextfeld hinzuzufügen, als neue Zeile (AddNewLine Methode).
Im Moment scheitere ich aber daran den Link auf das aktuelle Doc zu setzen. Und zwar in einem Code der in einer Hotspot-Schaltfläche sitzt.
Hab das bisher mit Source.Document gemacht, aber das klappt hier ja nicht weil Source zur Schaltfläche gehört.
Mit Set doc = ws.CurrentDocument funktioniert es nicht, er sagt daß ein Fehler in der Zeile ist.
Mein Code sieht im Moment so aus:
Sub Click(Source As Button)
Dim doc As NotesDocument
Dim rtitem As Variant
Dim ws As New NotesUIWorkspace
'...set value of doc...
Set doc = ws.CurrentDocument
Set rtitem = doc.GetFirstItem( "rtTest" )
If rtitem.Type = RICHTEXT Then
Call rtitem.AddNewLine( 1 )
Call rtitem.AppendText( "Book is 64 pages, full color." )
End If
Call doc.Save( False, True )
End Sub
Grüß dich Bernhard,
Die Meldung war:
Type missmatch on: CURRENTDOCUMENT
Aber das .Document hat halt gefehlt, nun kommt sie nicht mehr, dafür eine Meldung "Object variable not set".
Nach Aktivierung des Debuggers markiert er die Zeile:
Dim ws As New NotesUIWorkspace
mit einem vorangestellten Pfeil.
Sub Click(Source As Button)
Dim doc As NotesDocument
Dim rtitem As Variant
Dim ws As New NotesUIWorkspace
'...set value of doc...
Set doc = ws.CurrentDocument.Document
Set rtitem = doc.GetFirstItem( "rtTest" )
If rtitem.Type = RICHTEXT Then
Call rtitem.AddNewLine( 1 )
Call rtitem.AppendText( "Book is 64 pages, full color." )
End If
Call doc.Save( False, True )
End Sub
Was ein NotesUIDocument ist weiß ich nicht genau, werd aber gleich mal die Hilfe befragen. Was ich versuche zu tun ist einen Text an ein Richtextdocument zu übergeben und an den bestehenden Text anzuhängen.
Okay.
habe bemerkt daß das befüllen auch nur dann klappt wenn das Dokument nicht im Edit Modus ist. Deshalb hab ich den Code ein bischen angepasst:
Sub Click(Source As Button)
Dim doc As NotesDocument
Dim rtitem As Variant
Dim ws As New NotesUIWorkspace
Dim EditFlag As Boolean
'...set value of doc...
Set doc = ws.CurrentDocument.Document
EditFlag = ws.CurrentDocument.EditMode
Call ws.EditDocument( True )
Call ws.CurrentDocument.Save
Call ws.EditDocument( False )
Set rtitem = doc.GetFirstItem( "rtTest" )
If rtitem.Type = RICHTEXT Then
Call rtitem.AddNewLine( 1 )
Call rtitem.AppendText( "Book is 64 pages, full color." )
End If
Call doc.Save( False, True )
ws.CurrentDocument.EditMode = EditFlag
End Sub
Ohne den Versuch das Dokument zu speichern, also wenn ich das selbst mache dann klappt es auch. Mit der Zeile Call ws.CurrentDocument.Save nicht mehr. Habs auch mit doc.Save( True , False) versucht. Klappt auch nicht.
Hi,
du mischt hier Backend- und Frontend-Funktionen und RTF-Felder, die sowieso recht störrisch programmiertechnisch zu füllen sind, reagieren hier ziemlich allergisch.
Ich habe den Code hier mal aus dem Web gefischt. Damit füllst du das RTF-Feld, dann wird das Dokument, ohne es zu speichern, neu geöffnet und damit ist der Text im RTF-Feld sichtbar. Der Code ist mit Sicherheit noch an der einen oder anderen Ecke verbesserungsfähig, aber er funktioniert auch so schon recht gut.
Sub Click(Source As Button)
Dim wksp As New NotesUIWorkspace
Dim uidoc As NotesUIDocument, uidocNew As NotesUIDocument
Dim doc As NotesDocument
Dim rti As NotesRichTextItem
Set uidoc = wksp.CurrentDocument
If uidoc.EditMode Then Call uidoc.Refresh (True) ' do this if the rich text field is editable, to get the current contents in case user has modified them.
Set doc = uidoc.Document 'get the back-end document for the document open on screen.
Set rti = doc.GetFirstItem("rtTest")
' Make your rich text changes here, for instance:
Call rti.AddNewLine(1, True)
Call rti.AppendText(Now & ": log entry.")
Call rti.Update ' ND6 only
doc.SaveOptions = "0" ' make it possible to close the document without a "do you want to save" prompt.
Call uidoc.Close(True)
Set uidocNew = wksp.EditDocument(True, doc, , , , True)
Delete uidoc
uidocNew.Document.RemoveItem("SaveOptions")
End Sub
Axel
Der Code von Axel funktioniert zwar deutlich besser, aber bis zum rumpfuschen mit den Insert Methoden benutz ich grad noch meinen weil ich mich da besser auskenne. Nachher werd ich dann den von Axel etwas anpassen. Aber erstmal muß ich das überhaupt hinkriegen...
Die BeginInsert Methode kann nicht auf ein RichText Feld selbst zielen drum muß ich den Umweg gehn ein RichTextNavigator Objekt zu erstellen.
Sub Click(Source As Button)
Dim doc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim ws As New NotesUIWorkspace
Dim EditFlag As Boolean
Dim rtnav As NotesRichTextNavigator
'...set value of doc...
Set doc = ws.CurrentDocument.Document
EditFlag = ws.CurrentDocument.EditMode
On Error Resume Next
Call ws.CurrentDocument.Save
Call ws.EditDocument( False )
Set rtitem = doc.GetFirstItem( "rtTest" )
Set rtnav = rtitem.CreateNavigator
Call rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
If rtitem.Type = RICHTEXT Then
Call rtitem.BeginInsert(rtnav)
Call rtitem.AddNewLine( 1)
Call rtitem.AppendText( "Book is 64 pages, full color." )
End If
Call doc.Save( False, True )
ws.CurrentDocument.EditMode = EditFlag
End Sub
Ohne diese Zeile [ Call rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) ] wird der Text wenigstens hinten angehängt. Mit wird er gar nicht angehängt.
Du hast ja in deinem Auszug versucht nochmal die Struktur herauszustellen die nötig ist damit das funktioniert, und ich habe versucht es an meine Prozedur anzupassen.
Hi,
ich hab's testhalber mal eingebaut und es funktioniert.
Sub Click(Source As Button)
Dim wksp As New NotesUIWorkspace
Dim uidoc As NotesUIDocument, uidocNew As NotesUIDocument
Dim doc As NotesDocument
Dim rti As NotesRichTextItem
Dim rtnav As NotesRichTextNavigator
Dim bolEditMode As Boolean
Set uidoc = wksp.CurrentDocument
bolEditMode = uidoc.EditMode
If bolEditMode Then Call uidoc.Refresh (True) ' do this if the rich text field is editable, to get the current contents in case user has modified them.
Set doc = uidoc.Document
Set rti = doc.GetFirstItem("rtTest")
Set rtnav = rti.CreateNavigator
If rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) Then
Call rti.BeginInsert(rtnav)
Call rti.AddNewLine( 1 )
Call rti.AppendText( "Book is 64 pages, full color." )
Call rti.EndInsert
Else
Call rti.AddNewLine( 1 )
Call rti.AppendText( "Book is 64 pages, full color." )
End If
Call rti.Update ' ND6 only
doc.SaveOptions = "0" ' make it possible to close the document without a "do you want to save" prompt.
Call uidoc.Close(True)
Set uidocNew = wksp.EditDocument(bolEditMode, doc, , , , True)
Delete uidoc
uidocNew.Document.RemoveItem("SaveOptions")
End Sub
@Bernhard
Danke für den Tipp. Ich hab die Ecke zwar gelesen, aber das muss ich übersehen haben.
Axel