Autor Thema: AddNewLine Methode  (Gelesen 9065 mal)

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
AddNewLine Methode
« am: 07.11.05 - 14:40:50 »
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:



Code
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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: AddNewLine Methode
« Antwort #1 am: 07.11.05 - 14:49:00 »
Was gibt NotesUIWorkspace.CurrentDocument zurück ? Ein NotesUIDocument. Du weist das aber einem NotesDocument zu. Das kann nix werden (by the way "eine Fehlermeldung" ist hier keine Fehlermeldung - Du musst schon schreiben, was da auf Deinem Monitor stand, wir wollen hier kein unnötiges Reengineering betreiben).
Set doc = ws.CurrentDocument.Document.
Dann kommt auch "eine Fehlermeldung" nicht mehr  ;D

Bernhard

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #2 am: 07.11.05 - 14:56:52 »
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.


Code
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.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: AddNewLine Methode
« Antwort #3 am: 07.11.05 - 15:03:04 »
In der Zeile kommt aber bestimmt nicht die Fehlermeldung, ich befürchte eher, dass es das Item "rtTest" noch nicht gibt und daher der Fehler in der Zeile
Set rtitem = doc.GetFirstItem( "rtTest" )
auftritt. Du musst also mit "Fortfahren" dem Debugger eine chance geben, bis zur fehlerhaften Zeile vorzudringen.

Bernhard

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #4 am: 07.11.05 - 15:07:20 »
Okay dann mach ich das doch..

Nö, das Feld rtTest gibt es bereits. Es sit ein Bearbeitbares Feld vom Typ RichText.

Der Debugger zeigt jetzt den Fehler (nach Klicken auf Fortfahren solange das möglich ist) in der Zeile:
If rtitem.Type = RICHTEXT Then
an.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: AddNewLine Methode
« Antwort #5 am: 07.11.05 - 15:15:40 »
Ich hatte die falsche Zeile kopiert, ich meinte natürlich die, die der Debugger brav gefunden. Sorry.

Wenn Du in einer Maske ein Feld vom Typ RTF definierst, hat das zwingend überhaupt nichts damit zu tun, ob es im Dokument dann solch ein Item gibt. Wenn Du das Dokument gerade neu erstellt und noch nicht gespeichert hast, dann gibt es dieses Item eben noch nicht. In diesem Fall musst Du mit NotesDocument.CreateRichTextItem das Item zunächst erzeugen.

Bernhard

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #6 am: 08.11.05 - 07:59:49 »
In Ordnung, nun versteh ich das Problem.

Aber egal ob ich die Zeile:
doc.CreateRichTextItem("rtTest")]/i]
voranstelle, oder das Dokument von Hand erstmal speichere, es passiert dann erstmal nichts. Keine Fehlermeldung aber die gewünschte Zeile wird auch nicht in das RT eingetragen.

Wenn ich mit CreateRichTextItem das Feld erzeuge dann müsste er mir aber trotzdem das befüllen das ich in der Maske bereits definiert habe, oder? Denn ein zweites mit dem Namen wäre sowieso nicht zulässig. Trotzdem versteh ich nicht warum sich gar nichts tut.

Grüße,

Andreas

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: AddNewLine Methode
« Antwort #7 am: 08.11.05 - 08:45:23 »
Denn ein zweites mit dem Namen wäre sowieso nicht zulässig.

Bei RTF-Feldern ist es möglich, dass es mehrere Felder gleichen Namens in der Maske gibt.


Wenn du ein RTF-Feld mit programmiertechnisch füllst, dann siehst du den Inhalt nicht sofort. Das Dokument muss erst geschlossen und wieder geöffnet werden.


Axel


Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #8 am: 08.11.05 - 10:04:20 »
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:

Code
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.

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #9 am: 08.11.05 - 10:23:50 »
Wenn ich die Zeile:
Call ws.EditDocument( True )
weglasse und als Save-Anweisung folgendes verwende:
Call ws.CurrentDocument.Save
dann gehts.

Allerdings kommt dann eine Fehlermeldung wenn das Dokument bereits gespeichert ist und die Anweisung sie nochmal speichern will. Wie kann ich das abfangen und nur dann speichern wenn das Dokument noch nicht gespeichert wurde?

Eine LS Entsprechung zu @IsDocBeingSaved hab ich nicht finden können.

Grüße

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: AddNewLine Methode
« Antwort #10 am: 08.11.05 - 10:58:28 »
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.

Code
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #11 am: 08.11.05 - 11:12:56 »
Du hast recht Axel, und das funktioniert auch schon recht gut.

Nur etwas fehlt mir noch. Daß der Text VOR dem bereits bestehenden gestellt wird und nicht danach. Hab etwas nachgeforscht und bin auf die BeginInsert Methode gestossen.

Hab das versucht zu implementieren:



Dim rtnav As NotesRichTextNavigator

...
...

Set rtnav = rti.CreateNavigator
Call rti.BeginInsert(rtnav)



Der Text steht immer drunter....

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: AddNewLine Methode
« Antwort #12 am: 08.11.05 - 13:39:50 »
Hi,

meines Wissens kannst du Text immer nur ans Ende eines RTF - Feldes anhängen. Oder du müsstest den kompletten Inhalt auslesen, diesen mit deinem einzufügenden Text entsprechend zusammenbauen und wieder in das RTF-Feld einfügen.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #13 am: 08.11.05 - 13:53:28 »
Aber genau das verspricht doch laut Hilfe die Methode InsertBegins des NotesRichTextItem zu tun!?

Ich werds jetz mal so versuchen wie du gesagt hast.

Danke Axel,


Grüße,

Andreas

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: AddNewLine Methode
« Antwort #14 am: 08.11.05 - 14:07:31 »
Du hast da aber die Hilfe nicht richtig gelesen - Wenn Du zu Beginn des RTIs einfügen willst, musst das erste RT-Element auch angeben. Im Beispiel zu BeginInsert ist das auch genau so aufgeführt.

Bernhard

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: AddNewLine Methode
« Antwort #15 am: 08.11.05 - 14:13:51 »
Wenn Du zu Beginn des RTIs einfügen willst, musst das erste RT-Element auch angeben. Im Beispiel zu BeginInsert ist das auch genau so aufgeführt.

Bernhard

... es gibt aber keine Methode um Text entsprechend einzufügen. Man kann dann nur mit Methoden aus der NotesRichTextRange Text auslesen. Oder hab ich da was übersehen.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #16 am: 08.11.05 - 14:18:56 »
Also ich versteh die Hilfe so daß es irgendwie möglich sein müsste, Axel.

@ Bernhard:
Ich versteh deine Antwort nicht ganz. Auf einer Maske mit nur einem einzigen RT dürfte es demnach keine Probleme geben? Kannst du mir das bitte genauer erklären?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: AddNewLine Methode
« Antwort #17 am: 08.11.05 - 14:23:28 »
@Axel:
Aus der DesignerHelp:
Zitat
Examples: BeginInsert method 
This agent inserts text at (depending on user specification) the beginning or end of an item, or before or after the nth paragraph.
...
REM Position navigator
  REM (not necessary for "end" or empty item)
  If beginningText Then
    Call rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
...
Call body.BeginInsert(rtnav)
...
Call body.AppendText(it$)
  If beginningText Or beforeText Then
    Call body.AddNewLine(1)

@Andreas:
Wieviele RTIs es gibt, ist egal - Du beziehst Dich ja auf ein spezifisches RTI.

Bernhard

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: AddNewLine Methode
« Antwort #18 am: 08.11.05 - 14:34:25 »
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.

Code
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.

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: AddNewLine Methode
« Antwort #19 am: 08.11.05 - 14:39:06 »
Hi,

ich hab's testhalber mal eingebaut und es funktioniert.

Code
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz