Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: TMC am 26.11.03 - 20:40:49

Titel: Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 26.11.03 - 20:40:49
Hi,

mit einem Script erstelle ich aus einer DB ein neues Mail
(Code in etwa: http://www.atnotes.de/index.php?board=7;action=display;threadid=11558)

Nun soll zum Schluß mit
Call uidocMail.GotoField("Body")  
der Cursor zum Bodyfeld hüpfen, aber klappt leider nicht.

Ins Subject-Feld mit
Call uidocMail.GotoField("Subject")  
klappt aber.

Wie kann ich denn in das RTFeld 'Body' den Cursor setzen?

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: ata am 26.11.03 - 20:55:53
... Richtextfelder sind erst vorhanden, wenn das Doc zum ersten Mal gespeichert wurde - würde ich mal raten...

ata
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: eknori am 26.11.03 - 20:58:10
si senor, das ist die Lösung.
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: koehlerbv am 26.11.03 - 20:58:32
Das dürfte das alte leidige Problem sein: Im Frontend hast Du ein RTF erst unter Kontrolle, wenn das Dokument im backend gespeichert und im Frontend erneut geöffnet wurde ...

Bernhard
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 26.11.03 - 20:59:02
Hi Ata,

sorry, hätte doch den ganzen Code posten sollen, hier ist er:

Code
Sub Click(Source As Button)
   Dim session As New NotesSession
   Dim ws As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument   
   Dim dbMail As NotesDatabase
   Dim docMail As NotesDocument
   Dim uidocMail As NotesUIDocument
   Dim profil As NotesDocument
   Dim docThis As NotesDocument
   Dim rti As NotesRichTextItem
   
   Set uidoc = ws.CurrentDocument 'ui
   Set docThis = uidoc.Document 'ui
   
'Prüfen ob Mail-DB vorhanden
   Set dbMail = New NotesDatabase("","")
   Call dbMail.OpenMail
   If Not dbMail.IsOpen Then
      Messagebox "Mail-Datenbank kann nicht geöffnet werden." + Chr$(10) + "Es wird kein Mail erstellt.", 16, "Fehler"
      Exit Sub
   End If  'If Not dbMail.IsOpen Then
   
'Mail erstellen   
   CreateMailMemo = 0
   Set profil = dbMail.GetProfileDocument("CalendarProfile")
   Set docMail = New NotesDocument(dbMail) 'neues Mail
   docMail.Form = "Memo" 'nimm Memo
   docMail.Logo = profil.DefaultLogo(0) 'Dient dazu, das Mail-Logo zu übernehmen
   docMail.Principal = profil.Owner(0) 'Dient dazu, das Mail-Logo zu übernehmen
   
'Mail-Felder füllen
   docMail.SendTo = docThis.a_test2 'Mailempfänger
   docMail.Subject = "Link: #" + docThis.a_ID(0) + " ( " + docThis.a_Area(0) + ")" 'Subject
   
'Anlegen und füllen des Richtextfeldes
   Set rti = docMail.CreateRichTextItem("Body" )
   Call rti.AddNewLine(3)
   Call rti.AppendText("Doc-Link >")
   Call rti.AppendDocLink(docThis, "") 'Doklink einfügen
   Call rti.AppendText("<")
   Call rti.AddNewLine(1)
   
'Temp-Speichern Backend-Doc, Öffnen Frontend-Doc, zum Schluß Löschen Backend-Doc (damit RTF-Feld angezeigt wird)
   Call docMail.Save(True,False)
   Set uidocMail = ws.EditDocument(True, docMail)
   Call docMail.Remove(True)
   
'Gehe zum Feld Body   
   Call uidocMail.GotoField("Body")   
End Sub

Body ist also eigentlich doch dann vorhanden....

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 26.11.03 - 21:00:21
@Bernhard, Ulrich: war zu langsam mit dem Posten...

sollte das hier nicht reichen?

Zitat
'Temp-Speichern Backend-Doc, Öffnen Frontend-Doc, zum Schluß Löschen Backend-Doc (damit RTF-Feld angezeigt wird)
   Call docMail.Save(True,False)
   Set uidocMail = ws.EditDocument(True, docMail)
   Call docMail.Remove(True)

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: ata am 26.11.03 - 21:02:13
du musst das uidoc schließen, neu instanzieren dann wieder öffnen. erst jetzt kannst du das Feld ansteuern...

ata
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 26.11.03 - 21:25:02
OK, habe mal die letzten Zeilen wie folgt angepasst:
Code
'Temp-Speichern Backend-Doc, Öffnen Frontend-Doc, zum Schluß Löschen Backend-Doc (damit RTF-Feld angezeigt wird)
   Call docMail.Save(True,False) 'Backend speichern
   Set uidocMail = ws.EditDocument(True, docMail) 'uidocMail öffnen
   Call uidocMail.Close 'uidocMail schließen
   Set uidocMail = ws.EditDocument(True, docMail) 'uidocMail öffnen
   Call docMail.Remove(True) 'Backend löschen
   
'Gehe zum Feld Body   
   Call uidocMail.GotoField("Body")   
End Sub

Klappt allerdings noch immer nicht.....

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: eknori am 26.11.03 - 21:27:40
geht das nicht auch über die Maskeneigenschaften ? Da gibt es doch so was wie "Beim Öffnen in ..." dies oder das Feld springen
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 26.11.03 - 21:30:13
@Ulrich:
Eigentlich schon, aber ist halt das Mailfile......

Wenn es nicht geht dann lass ich es, ist eh nur ein nice to have - Feature.

Wundert mich aber, irgendwo muss ich noch ne Kleinigkeit übersehen haben.

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 26.11.03 - 21:32:56
*Nachtrag*
Was passiert überhaupt:
Script wird wie erwartet fehlerfrei ausgeführt, nur der Cursor bleibt im SendTo stehen.

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Axel am 27.11.03 - 11:00:17
Hi,

ich hab mal ein bisschen rumgespielt und das Ganze mit dem Debugger laufen lassen und siehe da, wenn man das Script im Einzelschrittmodus laufen lässt, funktionierts. Der Cursor sitzt im Body-Feld.

Wenn man aber im Debugger auf "Fortfahren" klickt, funktioniert es auch nicht.

Ich habe noch einiges programmiertechnisch probiert, aber alles ohne Erfolg. Ich kann dir leider auch keine Lösung anbieten. RTF-Felder sind in Notes programmiertechnisch nun mal es was unkomfortabel zu handeln.


Axel
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Glombi am 27.11.03 - 12:24:26
... Richtextfelder sind erst vorhanden, wenn das Doc zum ersten Mal gespeichert wurde - würde ich mal raten...

ata
Diese Aussage trifft nur auf das Backend zu. Man kann erst dann auf ein RTItem im Backend zugreifen, wenn das Dokument gespeichert wurde.

Das gilt aber nicht für das Frontend. Und
call uidoc.GotoField("Body")
ist eine Frontendmethode.

Daran kann es also nicht liegen.

Andreas
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 27.11.03 - 21:30:59
Danke für die Infos und das Testen!

Zitat
Ich habe noch einiges programmiertechnisch probiert, aber alles ohne Erfolg.
Ich konnte es nicht lassen und hab auch nochmal einiges programmtechnisch getestet (öffnen, schließen, refresh u.v.m.).
Das www hab ich auch schon abgegrast, ohne Treffer (nur mit Fragen ohne Antwort, z.B. hier: http://groups.google.de/groups?q=Call+GotoField(%22Body%22)&hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=tnkN7.1%24I05.655%40newsfeed.slurp.net&rnum=1 (http://groups.google.de/groups?q=Call+GotoField(%22Body%22)&hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=tnkN7.1%24I05.655%40newsfeed.slurp.net&rnum=1)

Na ja, da kann man wohl nix machen...

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Semeaphoros am 27.11.03 - 21:37:59
Schon probiert, mit GotoNextField hinzukommen? Sorry, wenn das schon jemand gesagt haben sollte ....
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 27.11.03 - 21:44:45
hmm, geht leider auch nicht (bleibt im Subject-Feld wenn ich zuvor zum Subject springe).

Ich muss schon sagen, der Client ist echt frech:
Selbst bei einem GotoBottom bleibt er im Subject Feld und geht nur ganz nach rechts. :o

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Semeaphoros am 27.11.03 - 21:47:47
Versuche mal, einen Agenten zu starten, der die entsprechenden @Commands ausführt ..... oder vielleicht kannst Du ja sowieso das ganze mit Formelsprache erledigen, dort scheint es mir, dass ich keine Probleme habe, das zu tun.
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 27.11.03 - 21:52:48
1) Agent
Das wäre noch eine Lösung, mal sehen (widerstrebt mir irgendwie, wegen einem gotofield gleich einen Agent aber wenns nicht anders geht)

2) Formel
hatte ich vorher, war mir aber zu unflexibel (Felder übernehmen aus bestehendem Doc etc. Da fand ich Script eleganter)

Hab jetzt auch mal ein sleep(1) getestet, weil ja - wie auch Axel schreibt - beim Step by Step Durchlauf mit Debugger ins Body gesprungen wird. Auch ohne Erfolg....

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Semeaphoros am 27.11.03 - 22:05:36
Lieber seit kurzem 5sterniger TMC  ;D

Mit einem Sleep zu probieren, wenns mit Tracing geht, ist eine gute Idee, nur meistens hat es andere Gründe als das Zeitverhalten, wenn der Debugger sogenannte Seiteneffekte erziehlt: Datenbanken, die vom Debugger offen gehalten werden aber ohne Debugger schliessen und dann einen Object Not Set oder sowas provozieren, oder in diesem Falle könnte ich mir vorstellen, dass das Aktivieren der interaktiven Oberfläche dazu führt, dass das Feld erkannt wird...... das bringt mich auf eine weitere Idee: möglicherweise gelingt es, wenn man einen Refresh macht und danach oder davor einfach einen Script-Agenten aufruft. Mag sein, dass dadurch die Oberfläche auch wirklich nachgeführt wird.
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: koehlerbv am 27.11.03 - 22:05:56
Wir haben es hier offensichtlich mit einem Bug in Notes zu tun - die Layout-Region kann offensichtlich nicht mit LS-Statements verlassen werden. Ich habe da jetzt an Hand TMC's Code auch einiges probiert ...
Wenn jemand jetzt mal mit einem Formel-Agent (der aus TMC's Code heraus aufgerufen wird) experimentiert, dann wird es wohl interessant ;-)

Sorry, dass ich nicht mehr herausgefunden habe,
Bernhard
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 27.11.03 - 22:11:04
Mein Agent-Test:

Formelagent starten:
Zitat
Dim agent As NotesAgent
Set agent = dbThis.GetAgent("(GotoFieldBody)")
Call agent.Run()

Ganz oben hab ich noch:
Zitat
Dim dbThis As NotesDatabase 'aaaa
Set dbThis = session.CurrentDatabase    'aaa

Im Agenten steht: @Command([EditGotoField]; "Body") (ist "Run Once")

Ergebnis:
Fehlermeldung:" Notes Error - @Function is not valid in this context"....

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Semeaphoros am 27.11.03 - 22:12:03
Also, dass das ein Bug ist, ist klar. Jetzt sollte noch jemand testen, ob das der 6er auch so tut. Hab leider grad keine Gelegenheit dazu, da ich mich "in der Wüste" befinde :-)

Hintergrund: die Sache an IBM melden macht nur Sinn, wenn das Problem im 6er noch besteht, weil das im 5er sicher nicht mehr gefixt wird.
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 27.11.03 - 22:17:09
Habs gerade unter 6.0.2 CF1 Deutsch getestet, selbes Problem....

TMC
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Semeaphoros am 27.11.03 - 22:21:04
Ich leite es weiter als BugRepport.
Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: TMC am 27.11.03 - 22:25:00
Prima @Jens, thanks  :)

Titel: Re:Cursor soll zum Body per "Call uidocMail.GotoField("Body")" hüpfen
Beitrag von: Semeaphoros am 27.11.03 - 22:31:42
Bitte, ist eben gerade passiert ....  :D

Nützt ja schliesslich uns allen, wenn solche Sachen repariert werden