Autor Thema: Casts in Lotusscript  (Gelesen 7180 mal)

Offline oz

  • Frischling
  • *
  • Beiträge: 17
Casts in Lotusscript
« am: 13.09.05 - 11:17:33 »
Hallo Forum,

Ich habe einen Konstruktor der folgendermaßen aussieht.

   Sub New (doc As Variant)
      On Error Goto errorhandler
      
      If doc Isa "NotesUIDocument" Then
         Messagebox "is a NotesUIDocument"
         Dim sd As NotesUIDocument
         Set sd = doc
         Messagebox sd.FieldGetText("fldDBServer")         
      Else
         Messagebox "not"
      End If
        End Sub

Der Konstruktor nimmt soll also UIDocuments aber auch a NotesDocuments entgegennehmen. In Abhängigkeit des Typs soll der Konstruktor den entsprechenden Typ auflösen und einer neuen Variable (sd) zuweisen.
Danach möchte ich auf dem neu erzeugten methoden ausführen, also wie im Beispiel FieldGetText(). Dann bekomme ich allerdings den Fehler "Object Variable not set".
Kann mir bitte jemand erklären, wie ich in Lotusscript diesen Cast hinbekommen oder was hier falsch läuft?

Vielen Dank im Voraus OZ.


Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Casts in Lotusscript
« Antwort #1 am: 13.09.05 - 11:33:34 »
Tja. isA gibts nicht. Oder ???
Versuch mal die Funktion Datatype (s. NotesHilfe). Aber wenn ich nicht völlig falsch liege, dann bekommst du hier für NotesUIDocument und NotesDocument dasselbe Nümmerschen.
Eine Möglichkeit wäre mit Errrorhandling und Resume Next im Konstruktor zu arbeiten, aber das ist sicher nicht das Gelbe vom Ei.

Mal so unter uns (manche bitte einfach mal weghören:)
Eine konsistente und einfache Reflection API, die so wichtig in Java geworden ist, gibt es in LotusScript einfach nicht. LotusScript hat andere Stärken.

Alternative: Nimm einfach 2 strictly typed Konstruktoren.
Einer nimmt ein NotesDocument. Der andere ein NotesUIDocument.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Casts in Lotusscript
« Antwort #2 am: 13.09.05 - 11:42:20 »
Ich glaube nicht, dass du in LS Methoden überlagern kannst, Axel.
Und vom IsA-Operator hab ich ehrlich gesagt auch noch nichts gehört.

Ich weiß zu wenig über das Problem, um den Sinn des Lösungsansatzes (zwei völlig verschiedene Klassen) in Frage zu stellen. Eigentlich kenne ich das Problem gar nicht, nur die angestrebte Lösung.

Ohne aber mehr darüber zu wissen halte ich persönlich den Ansatz für ganz schlecht und würde evtl. Vererbung verwenden. Also eine Basisklasse mit gemeinsamen Methoden und je eine spezielle Klasse für NotesDocument und NotesUIDocument.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: Casts in Lotusscript
« Antwort #3 am: 13.09.05 - 11:44:10 »
@Thomas: Aus der Designer Hilfe  ;D

Determines if an object reference variable is of a specified class or a class derived from the specified class.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Casts in Lotusscript
« Antwort #4 am: 13.09.05 - 11:45:57 »
Hehe, das ist cool. Ich habe ehrlich noch nie davon gehört :)
Danke für den Hinweis!
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Casts in Lotusscript
« Antwort #5 am: 13.09.05 - 11:48:51 »
Ok, abgesehen von dem, was ich bisher geschrieben habe: was zeigt dir denn der Debugger an. Ist in doc und sd jeweils etwas enthalten?
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline oz

  • Frischling
  • *
  • Beiträge: 17
Re: Casts in Lotusscript
« Antwort #6 am: 13.09.05 - 11:49:26 »
Das mit den zwei typed Constructors ist mir natürlich zuerst in den Sinn gekommen. Das geht aber in LotusScript aber wohl nicht, weil es keine 2 Methoden mit dem gleichen Namen aber unterschiedlicher Signatur kann. Heißt also Method Overloading geht nicht. Oder habe ich da was übersehen?

Gruß

Oz

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: Casts in Lotusscript
« Antwort #7 am: 13.09.05 - 12:24:55 »
Also grundsätzlich funktioniert der Code; habe das in einem Button mal getestet

Sub cNew ( doc As Variant )
   
   If doc Isa "NotesUIDocument" Then
      Messagebox "is a NotesUIDocument"
      Set sd = doc
      Messagebox sd.FieldGetText("fldDBServer")         
   Else
      Messagebox "not"
   End If
End Sub

und im Click

Sub Click(Source As Button)
   Dim workspace As New NotesUIWorkspace
   Call cNew ( workspace.CurrentDocument.Document )
                Call cNew ( workspace.CurrentDocument )
End Sub
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Casts in Lotusscript
« Antwort #8 am: 13.09.05 - 12:39:42 »
IsA funktioniert wohl, aber

Code
 Set sd = doc

bringt den Type mismatch.

Bernhard

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: Casts in Lotusscript
« Antwort #9 am: 13.09.05 - 12:41:03 »
OK, versuche mal folgenden Stunt

Sub cNew ( doc As Variant )
   Dim ws As New NotesUIWorkspace
   If doc Isa "NotesUIDocument" Then
      Messagebox "is a NotesUIDocument"
      ws.EditDocument False,doc.document
      Set sd = ws.CurrentDocument
      Messagebox sd.FieldGetText("Title")         
   Else
      Messagebox "not"
   End If
End Sub

obwohl da ja eigentlich unsinn ist:

Sub cNew ( doc As Variant )
   Dim ws As New NotesUIWorkspace
   If doc Isa "NotesUIDocument" Then
      Messagebox "is a NotesUIDocument"
      Set sd = ws.CurrentDocument
      Messagebox sd.FieldGetText("Title")         
   Else
      Messagebox "not"
                                Set BackEndDoc = doc.document
   End If
End Sub

wäre wohl die Lösung, oder habe ich mich da jetzt auch verrannt  ?
« Letzte Änderung: 13.09.05 - 12:44:57 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Casts in Lotusscript
« Antwort #10 am: 13.09.05 - 12:47:30 »
Ich würds so machen:
Code

sd As NotesDocument

Sub cNew ( doc As Variant )
   Dim ws As New NotesUIWorkspace
   If doc Isa "NotesUIDocument" Then
      Messagebox "is a NotesUIDocument"
     set sd = doc.Document
   Else if doc isA "NotesDocument"
    set  sd = doc
   else 
   ' throw some error if u like 2
End If
   print "sdoc.form(0)=" & sdoc.form(0)
   
End Sub

Habs aber nicht ausprobiert.

cool mit dem isA. Ist ein Operator und der steht nicht unter der Sektion LotusScript Language Referenz. Ich sollte meine Suchstrategie in der Notes Hilfe ändern. Gut zu wissen.

Natürlich funktioniert overloading nicht. Das war Quatsch.
Je nachdem was du vorhast, kann dir isA weiterhelfen.

Das Sinn deines Vorgehens sehe ich aber auch noch nicht (soll nix heissen).
Von einem größeren alten Projekt refaktoriere ich relativ viel hin zu OO-Code. Nur hinterfrage ich immer stärker, wo und vor allem wie OO in LS Sinn macht und wo und wie nicht.
Es stellt sich in der Praxis an einigen Stellen als wirklich sehr sinnvoll heraus. An anderen aber nicht.

Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Casts in Lotusscript
« Antwort #11 am: 13.09.05 - 12:48:24 »
War ein Schmarrn, was ich da erzählt habe - klar, geht natürlich doch mit Variante 1. Man muss halt nur sd richtig deklarieren  ::)

Bernhard

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: Casts in Lotusscript
« Antwort #12 am: 13.09.05 - 12:53:45 »
Zitat
sd As NotesDocument

Sub cNew ( doc As Variant )
   Dim ws As New NotesUIWorkspace
   If doc Isa "NotesUIDocument" Then
      Messagebox "is a NotesUIDocument"
     set sd = doc.Document
   Else if doc isA "NotesDocument"
    set  sd = doc
   else
   ' throw some error if u like 2
End If
   print "sdoc.form(0)=" & sdoc.form(0)
   
End Sub

würde aber so nicht funktionieren, da doc vom typ Variant ist ( und deshalb set  sd = doc
 in die Hose geht ).
OK, gehen wir also davon aus, daß bei allen weiteren Methoden nur Backend verwendet wird, dann kann man Axel's code noch weiter eindampfen

sd As NotesDocument

Sub cNew ( doc As Variant )
       set sd = doc.Document
     print "sd.form(0)=" & sd.form(0)
 
End Sub
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Casts in Lotusscript
« Antwort #13 am: 13.09.05 - 15:59:20 »
also ich halte von dieser Überprüfung, welches Objekt da übergeben wurde, wirklich gar nix.
Wenn Vererbung zu umständlich ist, dann würde ich 3 Methoden verwenden, um das Objekt zu initialisieren, nach dem es mit dem Konstruktor erzeugt wurde.

init()
initWithDoc()
InitWithUiDoc()

an der Stelle im Programm, wo das Objekt erzeugt und initialisiert wird ist hoffentlich bekannt, ob ich ein Document oder UiDocument habe. Dort rufe ich dann die entsprechende Methode auf die wiederum die generelle aufruft.
Alles andere sind für mich Stunts, wie Ulrich so schön gesagt hat, und führen zu bekannten Problemen (z. B. Compiler beschwert sich nicht bei falschen Parametern, miserable Erweiterbarkeit)
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline oz

  • Frischling
  • *
  • Beiträge: 17
Re: Casts in Lotusscript
« Antwort #14 am: 13.09.05 - 16:59:07 »
Also prinzipiell ist reflection ja ne feine Sache um Dinge zu generalisieren, aber in LotusScript offensichtlich nur mit "Stunts" möglich.

Mal kurz zur Erklärung warum die ganze Wallung.

Ich habe ein releativ komplexes Formular mit einigen Abhängigkeiten zwischen den zahlreichen Feldern. Ich möchte nun einen Wrapper um dieses Formular bauen wo ich die einzelnen Formularfelder nicht direkt über FieldGetText bzw. GetItemValue hole sondern über Getter Methode in einer Klasse eben. Die Felder sind über Properties gemappt. Korrespondierend soll es Setter Methoden geben mit denen die Felder befüllt werden.
Das ganze Formular beeinhaltet Settings, die einmalig von einem Admin angelegt werden. Also über das UIDocument. Zur laufzweit der Applikation werden eben diese Settings aus dem Backend Dokument augelesen. Nun möchte ich mir eben wieder eine Objektstruktur aufbauen, die aus den ganzen feldern besteht. Da es ja die selben Felder sind, egal ob Front- oder Backenddokument, kam mir die Idee für beide also NotesUIDocument und NotesDocument die gleichen Klassen mit den gleichen Properties zu verweden und sie lediglich anders zu initialisieren.

Die Idee mit dem

init()
initWithDoc()
InitWithUiDoc()

ist ja nicht schlecht, hilf mir aber nihct wenn ich auf die Properties zugreife, weil der Zugriffsmethoden auf Felder für Front- und Backend Dokumente unterschiedlich sind.

Ich möchte das ganze deswegen machen, weil ich soweit es geht den Code an einer Stelle haben möchte und in Events lediglich kleine Schnipsel LotusScript code haben möchte, die in diese Klasse rufen.

Ich werde mir das Ganze nochmal durch den Kopf gehen lassen.
Wenn jemand noch ne Idee hat. Nur zu.

Gruß

Oz

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: Casts in Lotusscript
« Antwort #15 am: 13.09.05 - 17:02:52 »
Hast du es denn wenigstens mal hiermit

Sub cNew ( doc As Variant )
   Dim ws As New NotesUIWorkspace
   If doc Isa "NotesUIDocument" Then
      Messagebox "is a NotesUIDocument"
      Set sd = ws.CurrentDocument
      Messagebox sd.FieldGetText("Title")         
   Else
      Messagebox "not"
                                Set BackEndDoc = doc.document
   End If
End Sub


getestet ?
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Casts in Lotusscript
« Antwort #16 am: 13.09.05 - 18:26:52 »
Also prinzipiell ist reflection ja ne feine Sache um Dinge zu generalisieren, aber in LotusScript offensichtlich nur mit "Stunts" möglich.
Da stimme ich zu. Aber du hast in LotusScript schlicht und ergreifend einfach nicht die Möglichkeiten, die du in Java hast. Also muß man sich da in der Praxis ein bischen anpassen.
In Java bin ich übrigens absolut der Meinung, dass solche Konstrukte:
Code
	Class charFilterClazz;
			try {
				charFilterClazz = Class.forName(clazzName);
				instance = (CharFilter) charFilterClazz.newInstance();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				throw new InstantiationError("Can not intantiate: " + clazzName, e);
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				throw new InstantiationError("Can not intantiate: " + clazzName, e);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				throw new InstantiationError("Can not intantiate: " + clazzName, e);
			} catch (ClassCastException e) {
				throw new InstantiationError("Can not cast to CharFilter: " + clazzName, e);
			}
			
nur so lange abgespaceter Guru-Zeugs ist, bis man es zum erstenmal einsetzt. Zumal das ganze Exception Handling eh von Eclipse generiert wird.          

Das geht noch einen Schritt weiter als was du wolltest. Aber wenn noch nicht mal downKasten möglich ist, fehlt einfach in LotusScript die entsprechende Unterstützung.

Zitat
Ich habe ein releativ komplexes Formular mit einigen Abhängigkeiten zwischen den zahlreichen Feldern. Ich möchte nun einen Wrapper um dieses Formular bauen wo ich die einzelnen Formularfelder nicht direkt über FieldGetText bzw. GetItemValue hole sondern über Getter Methode in einer Klasse eben. Die Felder sind über Properties gemappt. Korrespondierend soll es Setter Methoden geben mit denen die Felder befüllt werden.
Warum brauchst du da einen getter für? Ich komme OO-mässig auch eher von Java her bin aber gleichzeitig relativ erfahrener Domino Programmierer. Ich erlebe dass so, dass manche meiner Konstrukte einfach zu Java sind. Die klappen dann meist in LS nicht so gut. Wrapper ist z.B. etwas, dass sich irgendwie nie als sinnvoll erweist. Es liegt irgendwie auf der Hand. Klingt jetzt vielleicht ein bischen esoterisch.
Aber wieso brauchst du das?
Du kannst doch in die Mappings die realen Feldnamen reinschreiben?
Dann brauchst du keine extra getter und setter für.
[offtopic]
Ich hab sogar für das Übertragen von Feldwerten aus anderen Dokumenten eine Art mini-Konfigurationssprache entwickelt. Sieht dann so aus
Street=DBPersonal.LUPUser.KEY=userName.FIELD=Strasse.RESULTTYPE=String
Heisst:
Hole dir aus der Datenbank Personal
in der Ansicht User
mit dem Key des Wertes des Feldes userName des aktuellen Dokuments
den Wert des Feldes Strasse
mach es zu einem String
und fülle das Feld Strasse mit diesem Wert.
(wobei ich das mit dem RESULTTYPE erst nicht berücksichtigt habe. IST ABER WICHTIG).


Und natürlich stellt der kreative Teil der Kundenadmins Fragen, wie man an damit an die und jene Felder drankommt. Teilweise sprengt das dann den Rahmen des gegenwärtigen Frameworks. Ist ein interessanter Prozess. Leider inofiziell. Inofiziell ist ein anderes Wort für "generiert Überstunden".  ;D
[/offtopic]

Im Grund eignen sich für die Abarbeitung von sowas Notes-Klassen recht gut. Aber eben vielleicht anders als man erst denkt.

Zitat
, kam mir die Idee für beide also NotesUIDocument und NotesDocument die gleichen Klassen mit den gleichen Properties zu verweden und sie lediglich anders zu initialisieren.
lohnt nicht. Du kannst ja im Aufruf des Konstruktors das UiDoc jederzeit zu einem Document machen.
new yourClass (uidoc.Document).
Das verkompliziert den Client Code wirklich nur sehr minimal. 
Ball flach halten.

Gruß Axel
« Letzte Änderung: 13.09.05 - 18:30:32 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz