Autor Thema: RichText Variable wird nicht überschrieben?  (Gelesen 2806 mal)

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
RichText Variable wird nicht überschrieben?
« am: 08.07.14 - 09:54:43 »
Hallo,

ganz bestimmt eine Anfängerfrage, ich habe ein Problem beim überschreiben einer RichText-Variable.

Innerhalb einer Schleife hole ich mir aus einem Feld den Inhalt eines RichText-Felds.
Dieser wird zur Laufzeit bearbeitet und soll dann mit jedem Lauf durch die Schleife wieder den Ausgangsinhalt erhalten.
Das funktioniert aber bei mir nicht. Beim ersten Aufruf der Messagebox zur Anzeige von strVorlagentext wird noch das Original angezeigt, beim 2. Aufruf wird der veränderte Inhalt gezeigt, nicht wieder das Original.
Warum überschreibt Set rtiVorlagentext = doc.GetFirstItem("Vorlagentext") nicht den Inhalt?

Hier der Auszug aus dem Script:

Zitat
...[schnipp]
Dim rtiVorlagentext As NotesRichTextItem
...[schnipp]
While Not ( qdoc Is Nothing )
   Set rtiVorlagentext = doc.GetFirstItem("Vorlagentext")
   strVorlagentext = rtiVorlagentext.GetFormattedText(False,False)
   Messagebox strVorlagentext
...[schnipp]
   Set rtnav = rtiVorlagentext.CreateNavigator
   Set rtrange = rtiVorlagentext.CreateRange
   Call rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
   Call rtrange.SetBegin(rtnav)
   If rtrange.FindAndReplace (m.Value, item.Text, RT_REPL_ALL + RT_FIND_CASEINSENSITIVE) > 0 Then
'      Call rtiVorlagentext.Compact
   End If
...[schnipp]
   If Messagebox (rtiVorlagentext.GetFormattedText(False,False),MB_OKCANCEL,"Vorschau") = IDCANCEL Then
      Messagebox ("abgebrochen")
      Exit Sub
   End If
   Set qdoc = empflist.GetNextDocument (qdoc)
Wend




Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: RichText Variable wird nicht überschrieben?
« Antwort #1 am: 08.07.14 - 10:52:28 »
Ergänzung:

Auch wenn ich mir den Inhalt vorher wegsichere, funktioniert es nicht.
Ich steh echt auf dem Schlauch  :-\

Zitat
Set rtiBackup = doc.GetFirstItem("Vorlagentext")
...
      While Not ( qdoc Is Nothing )   
         Set rtiVorlagentext = rtiBackup
         strVorlagentext = rtiVorlagentext.GetFormattedText(False,False)
         Messagebox strVorlagentext
...
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: RichText Variable wird nicht überschrieben?
« Antwort #2 am: 08.07.14 - 12:01:25 »
Du veränderst in Deinem Script das Item.
Probier das mal so:

Code
Dim unid As String
unid = doc.UniversalID
While Not ( qdoc Is Nothing )
   Delete doc
   Set doc = db.GetDocumentByUnid (unid)
   Set rtiVorlagentext = doc.GetFirstItem("Vorlagentext")
   strVorlagentext = rtiVorlagentext.GetFormattedText(False,False)
   Messagebox strVorlagentext

EDIT:

Alternative wäre (ich vermute, dass Du das Richtextitem im qdoc verarbeitest, ansonsten verstehe ich den Sinn nicht), erst das Item in qdoc zu kopieren und dann dort zu verändern, anstatt im Vorlagendokument
« Letzte Änderung: 08.07.14 - 12:13:54 von Peter Klett »

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: RichText Variable wird nicht überschrieben?
« Antwort #3 am: 08.07.14 - 12:46:30 »
Ziel:
Der Anwender erstellt einen Vorlagentext.
Im doc steht das aktuelle nicht gespeicherte Dokument. mit dem Vorlagentext.
Der Anwender klickt auf Vorschau.
Hier wählt er eine bis mehrere Adressen aus.
Die gewählten Dokumente stehen in qdoc.
Im Vorlagentext sind Platzhalter im Format %Name% angegeben.
Für jeden gewählten Adresseintrag (also qdoc) wird eine Vorschau erstellt,
bei der die Platzhalter durch den Inhalt der Felder aus qdoc ersetzt werden.

Wenn ich das richtig verstehe, werde ich durch Dein Beispiel das in Bearbeitung befindliche Dokument zerstören.
Dadurch gehen also auch die aktuellen Änderungen des Anwenders verloren, oder?
Wenn ich ein alternatives "xdoc" verwende und über GetDocumentByUnid den Inhalt von "Vorlagentext" hole,
habe ich auch nicht aktuellen Änderungen des Anwenders.

Ich kann dem Anwender natürlich vorschreiben, dass er die Vorschau nur mit einer gespeicherten Vorlage anzeigen kann,
aber das ist imho nicht das Ziel einer Vorschau.

Ich verstehe nicht, inwiefern ich den Inhalt vom Dokumentenfeld "Vorlagentext" verändere, wenn ich die imho unabhängige Variable rtiVorlagentext verändere. Oder wird mit Set rtiVorlagentext = doc.GetFirstItem("Vorlagentext") keine Wert-Zuweisung sondern eine inhaltliche Verknüpfung geschaffen?


Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: RichText Variable wird nicht überschrieben?
« Antwort #4 am: 08.07.14 - 12:59:31 »
Ok, Ansatz verstanden. Ich dachte, es handelt sich um eine gespeicherte Vorlage, die der Benutzer irgendwo auswählt.

Durch das Delete würdest Du das Dokument aus dem Speicher löschen und auch nicht wieder nachladen können, da es ja nicht gespeichert ist.

Ist der Text in der Vorschau ein Richtext oder nur ein Text?

Wenn Du aus der Vorlage nur den Text brauchst (ohne Formatierung), könntest Du den Text mit rtitem.GetUnformattedText in eine Textvariable schreiben und dort mit Replace die Platzhalter austauschen.

rtiVorlagentext ist nicht unabhängig von dem Richtextitem, sondern es ist es.

Verwendest Du stattdessen

Set rtiVorlagentext = doc.GetFirstItem ("Vorlagentext")
strVorlagentext = rtiVorlagentext.GetUnformattedText

Dann ist strVorlagentext ein Text, der unabhängig vom Richtextitem ist.

Falls Du die Formatierungen auch brauchst, müssten wir nochmal weiter drüber nachdenken

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: RichText Variable wird nicht überschrieben?
« Antwort #5 am: 08.07.14 - 13:22:52 »
Der Text für Vorlage ist ein Richtext und kann so ziemlich alles enthalten, was möglich ist: Formatierte Texte, Bilder, Anhänge...
In der Vorschau soll dieser Inhalt der Vorgabe entsprechend korrekt formatiert angezeigt werden.
Lediglich die Platzhalter sollen ersetzt werden durch Inhalte aus dem jeweiligen Adressbuch-Dokument. I.d.R. werden es sicher Felder wie
FirstName, LastName, CompanyName usw. sein.
strVorlagentext verwende ich nur, damit ich die verwendeten Platzhalter über Regexp finde. Regexp verträgt imho kein RichText.
Sicherlich könnte ich hier auch GetUnformattedText verwenden, aber gewonnen habe ich dadurch nichts, wenn sich mit rtiVorlagentext auch das Item "Vorlagentext" des Dokuments ungewollt verändert.

Wäre es ein Ansatz, wenn ich ein neues Dummy-RichText-Feld zur Laufzeit im Dokument erzeuge, den Inhalt aus "Vorlagentext" kopiere und dieses Feld immer wieder zerstöre und neu erstelle?
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: RichText Variable wird nicht überschrieben?
« Antwort #6 am: 08.07.14 - 14:15:08 »
Ich hab es jetzt mal mit dem Ansatz versucht und damit scheint es jetzt zu funktionieren:

Zitat
...
      Set rtiVorlagentext = doc.GetFirstItem("Vorlagentext")
      Set qdoc = empflist.GetFirstDocument         ' erster selektierter Adressbucheintrag
      While Not ( qdoc Is Nothing )                  ' Laufe durch alle selektierten Einträge
         ' für jeden Eintrag Original-Vorlage holen   
         Call doc.RemoveItem("dummyfield")
         Set rtidummyfield = New NotesRichTextItem(doc, "dummyfield")
         Call rtidummyfield.AddNewLine(1)
         Call rtidummyfield.AppendRTItem(rtiVorlagentext)
         strVorlagentext = rtidummyfield.GetFormattedText(False,False)
         Messagebox strVorlagentext
...
                  Set rtnav = rtidummyfield.CreateNavigator
                  Set rtrange = rtidummyfield.CreateRange
                  Call rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
                  Call rtrange.SetBegin(rtnav)
                  If rtrange.FindAndReplace (m.Value, item.Text, RT_REPL_ALL + RT_FIND_CASEINSENSITIVE) > 0 Then
'                     Call rtiVorlagentext.Compact
                  End If
...
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz