Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Aladdin Sane am 04.04.05 - 15:35:53

Titel: NotesSession in einer Klasse
Beitrag von: Aladdin Sane am 04.04.05 - 15:35:53
Hallo,

ich habe folgende Klasse gebaut:

01 Class Class_Mail
02 Private session       As NotesSession
03      
04 Sub new( )
05   Dim session       As New NotesSession   
06   Set db      = session.currentdatabase
07 End Sub
...


Obwohl ich session für die ganze Klasse deklariere, ist der Eintrag in Zeile 05 nötig,
sonst kommt es zur Fehlermeldung "Object Variable Not set" bem Erzeugen eines Objektes.
   
Weiß jemand warum?

pASCAL

Titel: Re: NotesSession in einer Klasse
Beitrag von: Axel am 04.04.05 - 15:43:42
Hi,

... und wo ist das Problem oder die Frage?   ??? ???


Axel
Titel: Re: NotesSession in einer Klasse
Beitrag von: Aladdin Sane am 04.04.05 - 15:45:11
Hoppla...

Eintrag war noch gar nicht fertig.... jetzt aber.
Titel: Re: NotesSession in einer Klasse
Beitrag von: animate am 04.04.05 - 15:49:59
du musst das NotesSession-Objekt mit dem Konstruktor new erzeugen

Achtung: bei dir ist session (05) im Konstruktor was anderes als deine Instanzvariable session (02)

die Zeile 05 müsste so heißen:
Set session = New NotesSession
Titel: Re: NotesSession in einer Klasse
Beitrag von: m3 am 04.04.05 - 15:51:14
Das lässt sich mit einem Quote aus der Entwicklungs-Hilfe leicht beantworten:
Zitat
Declarations do not produce executable code.
The result of a declaration is information about a procedure, a variable, or a constant; for example, its type, dimensions, or value. This governs the behavior of the script that uses the declared item; but the declaration itself is not executed when the script runs.
Titel: Re: NotesSession in einer Klasse
Beitrag von: Axel am 04.04.05 - 15:51:31
Hi,

ist ja klar. Du hast zwar in Zeile 2 die Variable deklariert, aber nicht initialisiert.

Du kannst das aber auch so machen:

Set session = New NotesSession  

Du brauchst hier kein DIM mehr.


Axel


Titel: Re: NotesSession in einer Klasse
Beitrag von: Aladdin Sane am 04.04.05 - 16:02:04
Okay, vielen Dank.

Aber wenn ich den folgenen Code außerhalb einer Klasse kompiliere, funktioniert es:

Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.currentdatabase

Titel: Re: NotesSession in einer Klasse
Beitrag von: Marinero Atlántico am 04.04.05 - 16:11:46

Du brauchst hier kein DIM mehr.

Wie von Thomas richtig gesagt, führt das dim sogar zu einem "Variable Shadowing", d.h. du legst eine lokale (d.h. lokal im Konstruktor deklarierte Variable an, die die Instanzvariable überdeckt. Solche dinge haben mich mal sehr verwirrt.
In Lotusscript kann man glaub ich Instanzvariablen nicht direkt deklarieren und instantiieren (was in Java geht). In nicht-OO Lotusscript geht es auch (wie du gezeigt hast).
Code
private session = new notessession() ' does not work

deshalb:
Code
private session as NotesSession 'deklarieren

sub new() 
Set session = new NotesSession() ' instantiieren. 
end sub

Traditionell war es der Sinn von KOnstruktoren deklarierte Instanzvariablen zu initialisieren.
ESOTERISCH_START
Mit heutigen auf Modularität ausgerichteter OO Praxis (sehr starK: Inversion Of control) hat sich das explizite initialisieren von Variablen in Konstruktoren als unmodular herausgestellt. Das ist aber ein ganz anderer Gedanke.
ESOTERISCH_END

Sofern du dir in deinem Kopf Klarheit bzgl. der Begrifflichkeit von:
- Deklarieren
- Initialisieren
schaffst, dürfte es kein problem mehr machen.