Wenn abhängig von dem Inhalt eine Aktion ausgeführt wird, finde ich es nicht schädlich, wenn das Dokument zuvor gespeichert wurde. Sollte die Aktion z.B. eine Mail mit einem Link auf das Dokument sein, wäre es kontraproduktiv, die vor dem Speichern des Dokuments zu versenden.
Um einen Dateianhang in dem Richtextfeld zu erkennen, kannst Du die EmbeddedObjekts verwenden
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
Dim rtitem As NotesRichTextItem
Set rtitem = doc.GetFirstItem ("Body")
Dim flag As Integer
If Isarray (rtitem.EmbeddedObjects) Then
flag = True
End If
Msgbox Flag
End Sub
Das ist dann schon mal sauber. Für den Screenshot könntest Du, wie schon von Dir erwähnt, rtitem.ValueLength verwenden. Unter der Annahme, dass der Screenshot größer als nur ein paar Pixel ist, kannst Du da ja einen recht großen Wert als Grenze nehmen. In einem Test hatte mein leeres Item eine Länge von 104, mit einem Screenshot des gesamten Bildschirms um die 41000. Da würde ich mir die Größe des leeren Feldes vorab ausgeben lassen und dann vielleicht das Doppelte als Erkennwert verwenden. Natürlich könnte auch jemand nur Text eintragen, dann bekommst Du natürlich auch ein größeres Item.
Eventuell könntest Du noch mit DXL-Export genauer untersuchen, aber da habe ich wenig bis keine Erfahrung mit.
Es ginge auch wie folgt:
uiDoc.GotoField("RTFeld")
uiDoc.SelectAll
uiDoc.Copy
Wenn das Feld leer ist kommt der Fehler "Dokumentenbefehl ist nicht verfügbar", bei Inhalt kommt kein Fehler.
Es ginge auch wie folgt:
uiDoc.GotoField("RTFeld")
uiDoc.SelectAll
uiDoc.Copy
Wenn das Feld leer ist kommt der Fehler "Dokumentenbefehl ist nicht verfügbar", bei Inhalt kommt kein Fehler.
Ja, coole Idee, da kann man dann eine allgemeingültige Function draus machen
Function CheckRTItem (uidoc As NotesUIDocument, feldname As String) As Integer
On Error Goto Fehler
uidoc.GotoField (feldname)
uidoc.SelectAll
uidoc.Copy
uidoc.GotoField (feldname)
CheckRtitem = True
Fehler:
Exit Function
End Function
Das zweite GotoField hebt die Auswahl auf, weil sonst durch einen beliebigen Tastendruck der Inhalt überschrieben wird
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Msgbox CheckRTItem (uidoc, "Body")
Kann man natürlich noch schöner machen, z.B. Überprüfung, ob das uidoc im EditMode ist, aber als Idee sollte das genügen.
Und natürlich wird damit ggf. der aktuelle Inhalt der Zwischenablage überschrieben, ist halt nichts für diejenigen, die meinen, die Zwischenablage sei eine Archivlösung :-X
Die Idee mit der Funktion ist Cool, ABER: Wenn Du einfach ein "Exit Function" machst, dann gilt der Fehler als nicht gehandelt. Und wenn Du in der aufrufenden Funktion ein ErrorHandling hast, wird dieses den Fehler werfen...
Besser ist dann:
Function CheckRTItem (uidoc As NotesUIDocument, feldname As String) As Integer
On Error Goto Fehler
uidoc.GotoField (feldname)
uidoc.SelectAll
uidoc.Copy
uidoc.GotoField (feldname)
CheckRtitem = True
EndOfRoutine:
Exit Function
Fehler:
Resume EndOfRoutine
End Function
durch das Resume wird der ErrorStatus zurückgesetzt...