Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: matze79 am 13.07.05 - 11:35:08

Titel: Postopen und POstsave verknüpfen
Beitrag von: matze79 am 13.07.05 - 11:35:08
Hallo,

ich habe eine Klasse, die im Postopen und im Postsave initialisiert werden muss. Hintergrund: Ich lese in das Objekt einige Variablen des aktuellen Notesdokumentes ein. Diese sind aber erst nach dem ersten Speichern oder halt beim erneuten öffnen des Dokumentes existieren.

Frage1:
Kann ich die Initialiserung vie Postopen/Postsave auch über einen Button bewerkstelligen?

Frage2:
Ich habe im Postopen und im Postsave den gleichen Code. Kann ich den Code irgendwie automatisch vom Postopen in den POstsave übrnehmen, damit ich nicht an zwei Stellen den Code ändern muss?

Viele Grüße
matze

Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: klaussal am 13.07.05 - 11:39:39
zu Frage 2 : das könnte man wohl über eine Function in einer Script-Bibliothek machen.
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: Axel am 13.07.05 - 11:53:32
Frage1:
Kann ich die Initialiserung vie Postopen/Postsave auch über einen Button bewerkstelligen?

Hi,

die Frage verstehe ich nicht so ganz.  ???


Was du aber machen kannst, die Klasse maskenglobal zu deklarieren und dann in PostOpen-Event zu initialisieren. Sie steht dann auch im PostSave-Event zur Verfügung.


Axel
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: Semeaphoros am 13.07.05 - 11:57:02
Ich verstehe Frage 1 so, ob man den Code auch anderweitig aufrufen kann. Die Lösung für beide Fragen ist, entweder den Code im globalen Teil der Maske als Function oder Sub zu definieren, dann lässt er sich in allen Events/Buttons/internen Aktionen aufrufen, oder (was eh empfehlenswert ist), den Code in eine Scriptlib auszulagern, die man dann in den globalen Options einbindet.
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: matze79 am 14.07.05 - 11:38:05
Hallo,

vielen Dank für Antworten. Hier nochmal mein Problem:

Ich habe eine geschützte Klasse. Diese Klasse muss ich initialisieren um die Methoden zu nutzen. Bei der Initialisierung im Postopen/Postsave weise ich Variablen aus dem aktuellen Notesdokument zu:

Sub Postopen(Source As Notesuidocument)
...
Set myObject = New myClass(Source)
myObject.params("objectVar").Value = Source.FieldGetText( "notesVar" )
...
End Sub


-> Wenn ich nun den Code in den Postopen eintrage, dann wird "notesVar" nur beim Öffnen des Dokumentes gelesen. Eine Variablenänderung wirkt sich erst beim nochmaligen öffnen aus.
-> Wenn ich meinen Code nun in den Postsave kopiere, habe ich nach dem Speichern die geänderte Variable in meinem Objekt.


Problem 1: Ich habe den gleichen Code an zwei Stellen. Wie kan ich den Code genau auslagern? Gibt es sowas wie include(), wo ich beliebigen Code (Klassen als auch einzelne Codezeilen) einfach zur Laufzeit einfügen kann?

Problem 2. Kann ich die Variable auch in einem Button zuweisen?


Viele Grüße
matze
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: flaite am 14.07.05 - 11:57:55
Wie Jens bereits erwähnt hat, haben Masken einen Bereich, wo man Globals definieren kann. Der scope dieser globals schliesst Schaltflächen/Aktionen in der Maske ein (bin mir zu 95% sicher). Du findest diesen Bereich im Objektbrowser der Maske ganz oben.
Dort kannst du natürlich auch Objekte (als global) deklarieren.

Include-mässig geht über ScriptLibraries.
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: animate am 14.07.05 - 12:37:29
also ich würde für Problem 1 folgende Lösung anstreben:

du hast in deiner Klasse ja das zugehörige UIDocument als Attribut - das entnehme ich dem Konstruktor
Set myObject = New myClass(Source)

in der Klasse registriere ich mich für beliebige Events diseses uidocuments, auf die ich reagieren möchte.

Also

Class MyClass

Private uidoc as NotesUIDocument

On Event Postopen From uidoc Call processPostOpen()
On Event Postsave From uidoc Call processPostSave()

Sub processPostOpen(parameter des PostOpenEvents)
Call init()
End sub


Sub processPostSave(parameter des PostSaveEvents)
Call init()
End sub

Sub init()
//füllen
End Sub

End Class

das heißt, für jedes interessante Event have ich eine Methode, die sich darum kümmert.

Für das Initialisieren selbst mache ich eine eigene Methode in der Klasse, die das uidocument ausliest und die Attribute befüllt

Naja, so oder zumindest so ähnlich würde ichs machen

Das Problem Nr2 verstehe ich nicht
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: matze79 am 14.07.05 - 16:10:52
Hallo,

kann ich via

%INCLUDE "c:\test.lss"

auch in der Datenbank befindliche Scripte einbinden? Wenn ja, wie lade ich meine Codebrocken in die DB?

Inhalt von c:\test.lss:
messagebox("TEST")


matze
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: Axel am 14.07.05 - 16:23:50
Hi,

was meinst du mit: "in der Datenbank befindliche Scripte" ?

Mit %INCLUDE lassen sich nur Scripte einbinden, die als (Text) - Dateien vorliegen.


Axel
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: flaite am 14.07.05 - 16:44:35
Skriptbibliotheken in der Datenbank bindest du einfach so ein:
Code
 
Use "LibArchivierung"

im Bereich Options des jeweiligen Gestaltungselements.
Wobei LibArchivierung der Name der hier eingebundenen Skriptlib ist.

Dabei musst du ein bischen aufpassen in welcher Reihenfolge du kompilierst. Wenn du die da drin hast und die Skriptlib neu kompilierst hast du da teilweise alte Versionsstands der SkriptLib im Gestaltungselement. Ausserdem können zirkuläre Referenzen für Chaos sorgen. Wir haben letztens mal erlebt, dass bei Skriptlibs die sich mehrfach gegenseitig includeten die Ladezeit des betreffenden Codes dramatisch erhöhte.
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: matze79 am 14.07.05 - 17:34:50
Hallo,

> Use "LibArchivierung"

in einer Scriptlib kann nach meinen Tests nur eine Klasse stehen und nicht Prozedualer Code. Ich suche eine Möglichkeit einfach ein paar Codezeilen in mehreren Masken einzubinden.

matze
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: koehlerbv am 14.07.05 - 17:43:14
in einer Scriptlib kann nach meinen Tests nur eine Klasse stehen und nicht Prozedualer Code.

Das stimmt in keinster Weise. Es ist ohne weiteres möglich, beide Verfahren zu kombinieren. Und die Einbindung von ScriptLibs in andere Designelemente ist genau das allgemein gebräuchliche, erprobte und robuste Verfahren. Die Hinweise, die u.a. Axel gegeben hat, sind natürlich zu beachten - aber das muss man ja sowieso.

Weiterhin sind die maskenglobalen Declarations der Ort, über die sich die einzelnen Events wunderbar "unterhalten" können.

Bernhard
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: flaite am 14.07.05 - 23:15:04
Du kannst einfach Funktionen da reinschreiben.
Oder in den Declarations Klassen.

Die Hilfe vom Domino Designer ist oft wirklich hilfreich.
Da sollte es Beispiele für Scriptlibs geben. Für Funktionen und Klassen.

Gruß Axel
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: Semeaphoros am 14.07.05 - 23:16:53
Und vor allem sollte man die Antworten, die man hier bekommt, ernst nehmen.
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: TMC am 14.07.05 - 23:25:10
Sehr hilfreich ist der Tipp von Thomas, also "On Event <Der Event>".
Allerdings habe ich mir dabei angewohnt, in den eigentlichen Maskenevents noch kurz einen Kommentar zu hinterlassen, z.B.:

Code
Sub Postopen(Source As Notesuidocument)
	'Wird über MyClass abgehandelt
End Sub

Denn sonst kann man schnell mal einen Programmier-Kollegen verwirren, der vielleicht fälschlicherweise der Meinung ist: Kein PostOpen-Code vorhanden -> PostOpen-Event wird nicht abgehandelt. Gerade in Datenbanken, die nicht komplett auf OO aufgebaut sind, besteht IMHO diese Gefahr...
Titel: Re: Postopen und POstsave verknüpfen
Beitrag von: animate am 15.07.05 - 08:24:34
Sehr hilfreich ist der Tipp von Thomas, also "On Event <Der Event>".

Mein Punkt ist eigentlich, dass ich die Initialisierung kapseln würde. Entweder gleich in die Klasse oder in eine Factory, die mir sozusagen aus einem Notes(UI)Document ein initialisiertes Objekt der Klasse macht.

Das mit dem On Event ist Nebensache, ich habs nur dazugeschrieben, weils so gut passt.