xref: /trunk/main/framework/test/test_documentproperties.bas (revision ef1ef8e674fabf3a541d12c6e6c14cecdfc2f9e7)
1Sub Main
2        ' Oeffnen der LOG-Datei
3        ' Es gibt 2 Moeglichgkeiten, diesen Test zu absolvieren.
4        ' 1) Ausgabe von Informationen in MessageBoxen
5        ' 2) Ausgabe von Informationen in einer LOG-Datei
6        '
7        ' Die Methoden OpenLOG, CloseLOG, Message, ErrorMessage und InfoMessage beruecksichtigen das automatisch!
8        ' Zum Umschalten zwischen den beiden Zustaenden genuegt es, eine der folgenden
9        ' zwei Programmzeilen zu aktivieren ...
10
11        'bLOGOn = cOn
12        bLOGOn  = cOff
13
14        'bShowErrorsOnly        = cOn
15        bShowErrorsOnly     = cOff
16
17        OpenLOG     ( cTestPath + "TestDocumentProperties.log" )
18        InfoMessage ( "Test DocumentProperties ... [start]" )
19
20        ' Service besorgen
21        InfoMessage ( "Service besorgen ... [start]" )
22        aDocumentProperties = createUnoService ( "com.sun.star.document.DocumentProperties" )
23
24        ' Erfolg abtesten
25        if ( isnull ( aDocumentProperties ) ) then
26            ErrorMessage ( "Service konnte nicht instanziiert werden!"  )
27            exit sub
28        else
29            InfoMessage ( "Service erfolgreich instanziiert ..."    )
30            InfoMessage ( "Service besorgen ... [ende]"             )
31        end if
32
33        ' Unterstuetzte Schnittstellen, Methoden und Properties anzeigen
34        ' Achtung: Methoden und Properties koennen nicht angezeigt werden ...
35        ' neues Uno <-> Basic !?
36        msgbox  aDocumentProperties.dbg_supportedInterfaces
37        'msgbox aDocumentProperties.dbg_methods
38        'msgbox aDocumentProperties.dbg_properties
39
40        ' Testen des Services unter normalen Bedingungen (also wie vorgesehen)
41        bState = Test_NormalUse ( aDocumentProperties )
42        ' Fehlerstatus abfragen
43        if ( bState = cError ) then
44            ErrorMessage ( "Der Service arbeitet unter normalen Bedingungen nicht korrekt!" )
45        end if
46
47        bState = Test_ErrorUse  ( aDocumentProperties )
48        ' Fehlerstatus abfragen
49        if ( bState = cError ) then
50            ErrorMessage ( "Der Service verhaelt sich in Fehlersituationen nicht korrekt!" )
51        end if
52
53        ' Schliessen der Error-Logdatei
54        InfoMessage ( "Test DocumentProperties ... [ende]" )
55        CloseLOG
56End Sub
57
58'*****************************************************************************************************************
59' Testfunktionen
60'*****************************************************************************************************************
61
62'----------------------------------------------------------------------------
63' Testmethode: Testet den Service unter normalen Bedingungen
64'
65' Returnwert cOK bedeutet, dass sich das Objekt normal verhaelt ...
66' Returnwert cError bedeutet, dass sich das ein Fehler aufgetreten ist ...
67'----------------------------------------------------------------------------
68Function Test_NormalUse ( aDocumentProperties ) as Boolean
69
70        ' Zunaechst wird vom Erfolg des Test ausgegangen.
71        ' Sollte einer der Detail-Tests fehlschlagen, dann wird dieser Wert
72        ' zurueckgesetzt. Damit wird dann angezeigt, dass mindestens ein
73        ' Einzeltest nicht korrekt funktionierte.
74
75        Test_NormalUse = cOK
76
77        bState = Test_NormalUse_XPropertySet    ( aDocumentProperties )
78        if ( bState = cError ) then
79            Test_NormalUse = cError
80        end if
81
82        bState = Test_NormalUse_XNameContainer  ( aDocumentProperties )
83        if ( bState = cError ) then
84            Test_NormalUse = cError
85        end if
86
87        bState = Test_NormalUse_XPersist        ( aDocumentProperties )
88        if ( bState = cError ) then
89            Test_NormalUse = cError
90        end if
91
92End Function
93
94'----------------------------------------------------------------------------
95' Testmethode: Testet den Service unter Randbedingungen und provoziert Fehlerzustaende
96'
97' Returnwert cOK bedeutet, dass das Objekt damit keine Probleme hat ...
98' Returnwert cError bedeutet, dass das Objekt noch nicht robust genug ist ...
99'----------------------------------------------------------------------------
100Function Test_ErrorUse ( aDocumentProperties ) as Boolean
101
102        Test_ErrorUse = cOK
103
104End Function
105
106'----------------------------------------------------------------------------
107' Testmethode: Testen des unterstuetzten Interfaces "XPropertySet" unter normalen Bedingungen
108'
109' Returnwert = cOK      ; wenn der Test erfolgreich war
110' Returnwert = cError   ; wenn sich das Objekt nicht korrekt verhalten hat
111'----------------------------------------------------------------------------
112Function Test_NormalUse_XPropertySet ( aDocumentProperties ) as Boolean
113
114        ' Einschalten der Fehlerbehandlung, um Exceptions oder aehnliches abzufangen!
115        on Error goto Test_NormalUse_XPropertySet_Error
116
117        InfoMessage ( "Test_NormalUse_XPropertySet ... [start]" )
118
119        ' 1) Test der Funktion "getPropertySetInfo()"
120        '       Da diese Funktion keine Parameter besitzt und zudem eine "get"-Methode
121        '       darstellt, wird sie durch Basic automatisch als "Property" behandelt!
122        '       Daher schreibt man nicht "getPropertySetInfo()" sondern nur "PropertySetInfo".
123
124        ' Besorgen der Info
125        PropertySetInfo = aDocumentProperties.PropertySetInfo
126        ' Und abtesten auf Gueltigkeit
127        if ( isnull (PropertySetInfo) ) then
128            ErrorMessage ( "getPropertySetInfo() ... Error (Keine Info bestimmbar!)" )
129            goto Test_NormalUse_XPropertySet_Error
130        end if
131
132        ' Hier fehlt noch der Test der InfoStruktur! (Laesst sich unter Basic irgendwie NICHT testen!!!???)
133        ' ...
134
135        InfoMessage ( "getPropertySetInfo() ... OK" )
136
137        ' 2) getPropertyValue() & setPropertyValue ()
138        '       In diesem Service sind mehrere Properties bereits definiert und vorbelegt.
139        '       Zum Test werden repraesentativ einige davon verwendet. Naemlich je eine
140        '       der verschiedenen Datentypen!
141        '       Das sind im folgenden:      OWString, sal_Bool, sal_Int16, sal_uInt16, sal_Int32, DateTime, Sequence< sal_Int8 >
142        '                                   Achtung! sal_uInt16 kann in Basic so nicht dargestellt werden. Daher wird ein normaler
143        '                                   Integer-Wert angenommen - Bedingung ist, das hier im Test der Wertebereich nicht
144        '                                   ueberschritten wird!
145        '       Es wird versucht den Standardwert dieser zu ermitteln und zu merken;
146        '       dann einen neuen Wert zu setzen; sowie diesen wiederum zu lesen und mit den
147        '       vorherigen Werten zu vergleichen!
148
149        ' Zunaechst werden die Standardwerte dieser Properties besorgt ...
150        sDefaultValue_OWString$     = aDocumentProperties.getPropertyValue ( "Author"           )
151        bDefaultValue_sal_Bool      = aDocumentProperties.getPropertyValue ( "AutoloadEnabled"  )
152        nDefaultValue_sal_Int16%    = aDocumentProperties.getPropertyValue ( "EditingCycles"    )
153        nDefaultValue_sal_uInt16%   = aDocumentProperties.getPropertyValue ( "Priority"         )
154        nDefaultValue_sal_Int32&    = aDocumentProperties.getPropertyValue ( "EditingDuration"  )
155        aDefaultValue_DateTime      = aDocumentProperties.getPropertyValue ( "ModifyDate"       )
156'       aDefaultValue_ByteSequence  = aDocumentProperties.getPropertyValue ( "ExtraData"        )
157        aDefaultValue_ByteSequence  = aDocumentProperties.ExtraData
158
159        ' ... dann die Werte zur Kontrolle ausgeben.
160        ShowProperties ( aDocumentProperties )
161
162        InfoMessage ( "getPropertyValue() ... OK" )
163
164        ' Jetzt werden neue Werte vereinbart ...
165        ' Diese werden so gewaehlt, das sie garantiert von den Standardwerten verschieden sind!
166        ' Dazu werden die alten auf Wert abgefragt und entsprechend die neuen gesetzt.
167        sNewValue_OWString$     = sDefaultValue_OWString$   + "NeuerWert"
168        bNewValue_sal_Bool      = not bDefaultValue_sal_Bool
169        nNewValue_sal_Int16%    = nDefaultValue_sal_Int16%  + 1
170        if ( nDefaultValue_sal_uInt16% = 1 ) then
171            nNewValue_sal_uInt16% = 2
172        else
173            nNewValue_sal_uInt16% = 1
174        end if
175        nNewValue_sal_Int32&    = nDefaultValue_sal_Int32&  + 1
176
177        aNewValue_DateTime                  = aDefaultValue_DateTime
178        aNewValue_DateTime.HundredthSeconds = aDefaultValue_DateTime.HundredthSeconds   + 1
179        aNewValue_DateTime.Seconds          = aDefaultValue_DateTime.Seconds            + 1
180        aNewValue_DateTime.Minutes          = aDefaultValue_DateTime.Minutes            + 1
181        aNewValue_DateTime.Hours            = aDefaultValue_DateTime.Hours              + 1
182        aNewValue_DateTime.Day              = aDefaultValue_DateTime.Day                + 1
183        aNewValue_DateTime.Month            = aDefaultValue_DateTime.Month              + 1
184        aNewValue_DateTime.Year             = aDefaultValue_DateTime.Year               + 1
185
186        aNewValue_ByteSequence = aDefaultValue_ByteSequence
187        nElementCount% = UBound ( aDefaultValue_ByteSequence )
188'       for nCounter%=0 to nElementCount% step 1
189'           aNewValue_ByteSequence(nCounter%) = ( aDefaultValue_ByteSequence(nCounter%) + 1 )
190'       next nCounter%
191
192        ' Anschliessend muessen diese neuen Werte gesetzt werden.
193        aDocumentProperties.setPropertyValue ( "Author"         , sNewValue_OWString$       )
194        aDocumentProperties.setPropertyValue ( "AutoloadEnabled", bNewValue_sal_Bool        )
195        aDocumentProperties.setPropertyValue ( "EditingCycles"  , nNewValue_sal_Int16%      )
196        aDocumentProperties.setPropertyValue ( "Priority"       , nNewValue_sal_uInt16%     )
197        aDocumentProperties.setPropertyValue ( "EditingDuration", nNewValue_sal_Int32&      )
198        aDocumentProperties.setPropertyValue ( "ModifyDate"     , aNewValue_DateTime        )
199'       aDocumentProperties.setPropertyValue ( "ExtraData"      , aNewValue_ByteSequence    )
200        aDocumentProperties.ExtraData = aNewValue_ByteSequence
201
202        ' Dann lassen wir sie uns ausgeben, um sie mit den vorherigen vergleichen zu koennen.
203        ' (Das geht natuerlich nur, wenn "bLOGOn=cOn" ist - also eine LOG-Datei geschrieben wird!)
204        ShowProperties ( aDocumentProperties )
205
206        ' Nun werden die Properties wieder gelesen ...
207        sLastValue_OWString$    = aDocumentProperties.getPropertyValue ( "Author"           )
208        bLastValue_sal_Bool     = aDocumentProperties.getPropertyValue ( "AutoloadEnabled"  )
209        nLastValue_sal_Int16%   = aDocumentProperties.getPropertyValue ( "EditingCycles"    )
210        nLastValue_sal_uInt16%  = aDocumentProperties.getPropertyValue ( "Priority"         )
211        nLastValue_sal_Int32&   = aDocumentProperties.getPropertyValue ( "EditingDuration"  )
212        aLastValue_DateTime     = aDocumentProperties.getPropertyValue ( "ModifyDate"       )
213        aLastValue_ByteSequence = aDocumentProperties.getPropertyValue ( "ExtraData"        )
214
215        ' ... und mit den vorher als zu setzend bestimmte Werte vergleichen!
216        ' Es duerfen KEINE Unterschiede auftreten, da sonst "setPropertyValue()" nicht korrekt funktioniert hat!
217
218        if ( CompareOWString            ( sNewValue_OWString$,      sLastValue_OWString$    ) = cDifferent ) then
219            ErrorMessage    ( "setPropertyValue() ... Fehler [OWString fehlerhaft]"     )
220            goto Test_NormalUse_XPropertySet_Error
221        elseif ( CompareBool            ( bNewValue_sal_Bool,       bLastValue_sal_Bool     ) = cDifferent ) then
222            ErrorMessage    ( "setPropertyValue() ... Fehler [sal_Bool fehlerhaft]"     )
223            goto Test_NormalUse_XPropertySet_Error
224        elseif ( CompareInt16           ( nNewValue_sal_Int16%,     nLastValue_sal_Int16%   ) = cDifferent ) then
225            ErrorMessage    ( "setPropertyValue() ... Fehler [sal_Int16 fehlerhaft]"    )
226            goto Test_NormalUse_XPropertySet_Error
227        elseif ( CompareInt16           ( nNewValue_sal_uInt16%,    nLastValue_sal_uInt16%  ) = cDifferent ) then
228            ErrorMessage    ( "setPropertyValue() ... Fehler [sal_uInt16 fehlerhaft]"   )
229            goto Test_NormalUse_XPropertySet_Error
230        elseif ( CompareInt32           ( nNewValue_sal_Int32&,     nLastValue_sal_Int32&   ) = cDifferent ) then
231            ErrorMessage    ( "setPropertyValue() ... Fehler [sal_Int32 fehlerhaft]"    )
232            goto Test_NormalUse_XPropertySet_Error
233        elseif ( CompareDateTime        ( aNewValue_DateTime,       aLastValue_DateTime     ) = cDifferent ) then
234            ErrorMessage    ( "setPropertyValue() ... Fehler [DateTime fehlerhaft]"     )
235            goto Test_NormalUse_XPropertySet_Error
236        elseif ( CompareByteSequence    ( aNewValue_ByteSequence,   aLastValue_ByteSequence ) = cDifferent ) then
237            ErrorMessage    ( "setPropertyValue() ... Fehler [ByteSequence fehlerhaft]" )
238            goto Test_NormalUse_XPropertySet_Error
239        end if
240
241        InfoMessage ( "setPropertyValue() ... OK" )
242
243        ' Nun wird noch mit den zuerst ermittelten Default-Werten verglichen!
244        ' Hier MUESSEN Unterschiede auftreten, da sonst "get-" UND "setPropertyValue()" nicht korrekt funktioniert haben!
245
246        if ( CompareOWString            ( sDefaultValue_OWString$,      sLastValue_OWString$    ) = cEqual ) then
247            ErrorMessage    ( "Zusammenspiel set & getPropertyValue() ... Fehler [OWString fehlerhaft]"     )
248            goto Test_NormalUse_XPropertySet_Error
249        elseif ( CompareBool            ( bDefaultValue_sal_Bool,       bLastValue_sal_Bool     ) = cEqual ) then
250            ErrorMessage    ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_Bool fehlerhaft]"     )
251            goto Test_NormalUse_XPropertySet_Error
252        elseif ( CompareInt16           ( nDefaultValue_sal_Int16%,     nLastValue_sal_Int16%   ) = cEqual ) then
253            ErrorMessage    ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_Int16 fehlerhaft]"    )
254            goto Test_NormalUse_XPropertySet_Error
255        elseif ( CompareInt16           ( nDefaultValue_sal_uInt16%,    nLastValue_sal_uInt16%  ) = cEqual ) then
256            ErrorMessage    ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_uInt16 fehlerhaft]"   )
257            goto Test_NormalUse_XPropertySet_Error
258        elseif ( CompareInt32           ( nDefaultValue_sal_Int32&,     nLastValue_sal_Int32&   ) = cEqual ) then
259            ErrorMessage    ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_Int32 fehlerhaft]"    )
260            goto Test_NormalUse_XPropertySet_Error
261        elseif ( CompareDateTime        ( aDefaultValue_DateTime,       aLastValue_DateTime     ) = cEqual ) then
262            ErrorMessage    ( "Zusammenspiel set & getPropertyValue() ... Fehler [DateTime fehlerhaft]"     )
263            goto Test_NormalUse_XPropertySet_Error
264'       elseif ( CompareByteSequence    ( aDefaultValue_ByteSequence,   aLastValue_ByteSequence ) = cEqual ) then
265'           ErrorMessage    ( "Zusammenspiel set & getPropertyValue() ... Fehler [ByteSequence fehlerhaft]" )
266'           goto Test_NormalUse_XPropertySet_Error
267        end if
268
269        InfoMessage ( "Zusammenspiel set & getPropertyValue() ... OK" )
270
271        ' Der Test war erfolgreich! Meldung ausgeben und zurueck zm Aufrufer.
272        ' Ausschalten der Fehlerbehandlung
273        on Error goto 0
274        ' Meldung ausgeben
275        InfoMessage ( "Test_NormalUse_XPropertySet ... [ende]" )
276        ' Status setzen
277        Test_NormalUse_XPropertySet = cOK
278        ' Und Funktion beenden
279        Exit Function
280
281' Es ist ein unerwartete Fehler aufgetreten! (Exception ...)
282' Meldung ausgeben und mit Fehler zurueckkehren.
283Test_NormalUse_XPropertySet_Error:
284        ' Ausschalten der Fehlerbehandlung
285        on Error goto 0
286        ' Meldung ausgeben
287        ErrorMessage ( "Test_NormalUse_XPropertySet ... [Error]" )
288        ' und Fehlerstatus setzen
289        Test_NormalUse_XPropertySet = cError
290        ' Abbruch der Funktion erzwingen!
291        Exit Function
292
293End Function
294
295'----------------------------------------------------------------------------
296' Testmethode: Testen des unterstuetzten Interfaces "XNameContainer" unter normalen Bedingungen
297'
298' Returnwert = cOK      ; wenn sich das Objekt korrekt verhalten hat
299' Returnwert = cError   ; wenn das Objekt noch nicht robust genug ist
300'----------------------------------------------------------------------------
301Function Test_NormalUse_XNameContainer ( aDocumentProperties ) as Boolean
302
303        ' Einschalten der Fehlerbehandlung, um Exceptions oder aehnliches abzufangen!
304        on Error goto Test_NormalUse_XNameContainer_Error
305
306        InfoMessage ( "Test_NormalUse_XNameContainer ... [start]" )
307
308        ' Da das Initialisieren im Konstruktor des Objektes und das Aufraeumen im Destruktor
309        ' automatisch geschieht und diese Methode pro Programmablauf nur einmal verwendet wird,
310        ' darf sich kein Element schon im NameContainer befinden!
311        ' Wenn doch, ist das ein Fehler!
312        if ( aDocumentProperties.hasElements () = TRUE ) then
313            ErrorMessage ( "Der NameConatiner sollte eigentlich leer sein, enthaelt initial aber schon Elemente!?" )
314            goto Test_NormalUse_XNameContainer_Error
315        end if
316
317        ' Zunaechst werden mehrere Elemente in den NameContainer eingefuegt.
318        sItemName_1$    = "Item 1"
319        sItemName_2$    = "Item 2"
320        sItemName_3$    = "Item 3"
321        sItemName_4$    = "Item 4"
322        sItemName_5$    = "Item 5"
323
324        sFirstValue_1$  = "Value 1"
325        sFirstValue_2$  = "Value 2"
326        sFirstValue_3$  = "Value 3"
327        sFirstValue_4$  = "Value 4"
328        sFirstValue_5$  = "Value 5"
329
330        aDocumentProperties.insertByName ( sItemName_1$, sFirstValue_1$ )
331        aDocumentProperties.insertByName ( sItemName_2$, sFirstValue_2$ )
332        aDocumentProperties.insertByName ( sItemName_3$, sFirstValue_3$ )
333        aDocumentProperties.insertByName ( sItemName_4$, sFirstValue_4$ )
334        aDocumentProperties.insertByName ( sItemName_5$, sFirstValue_5$ )
335
336        ' Zur Kontrolle die Werte ausgeben. (Nur wichtig, wenn geloggt wird!)
337        ' Dabei wird die Methode "getElementNames()" gleich implizit mitgetestet!
338        ShowNameContainer ( aDocumentProperties )
339
340        ' Aber auch die Anzahl kontrollieren.
341        ' (Hier wird eine eigene BASIC-Hilfsfunktion verwendet! keine Interface-Methode)
342        if ( getNameContainerCount ( aDocumentProperties ) <> 5 ) then
343            ErrorMessage ( "insertByName() ... Fehler (Der NameConatiner enthaelt nicht die eingefuegten 5 Elemente!)" )
344            goto Test_NormalUse_XNameContainer_Error
345        end if
346
347        ' Nun noch feststellen, ob die 5 denn auch tatsaechlich vorhanden sind.
348        if ( aDocumentProperties.hasByName ( sItemName_1$ ) = FALSE ) then
349            ErrorMessage    ( "hasByName() ... Fehler [Element 1 nicht vorhanden!?]" )
350            goto Test_NormalUse_XNameContainer_Error
351        elseif ( aDocumentProperties.hasByName ( sItemName_2$ ) = FALSE ) then
352            ErrorMessage    ( "hasByName() ... Fehler [Element 2 nicht vorhanden!?]" )
353            goto Test_NormalUse_XNameContainer_Error
354        elseif ( aDocumentProperties.hasByName ( sItemName_3$ ) = FALSE ) then
355            ErrorMessage    ( "hasByName() ... Fehler [Element 3 nicht vorhanden!?]" )
356            goto Test_NormalUse_XNameContainer_Error
357        elseif ( aDocumentProperties.hasByName ( sItemName_4$ ) = FALSE ) then
358            ErrorMessage    ( "hasByName() ... Fehler [Element 4 nicht vorhanden!?]" )
359            goto Test_NormalUse_XNameContainer_Error
360        elseif ( aDocumentProperties.hasByName ( sItemName_5$ ) = FALSE ) then
361            ErrorMessage    ( "hasByName() ... Fehler [Element 5 nicht vorhanden!?]" )
362            goto Test_NormalUse_XNameContainer_Error
363        end if
364
365        ' Dann die Werte wieder auslesen.
366        sCompareValue_1$ = aDocumentProperties.getByName ( sItemName_1$ )
367        sCompareValue_2$ = aDocumentProperties.getByName ( sItemName_2$ )
368        sCompareValue_3$ = aDocumentProperties.getByName ( sItemName_3$ )
369        sCompareValue_4$ = aDocumentProperties.getByName ( sItemName_4$ )
370        sCompareValue_5$ = aDocumentProperties.getByName ( sItemName_5$ )
371
372        ' Zum Vergleich die Werte ausgeben. (Nur wichtig, wenn geloggt wird!)
373        ShowNameContainer ( aDocumentProperties )
374
375        ' Dann die Werte automatisch vergleichen!
376        if ( CompareOWString        ( sFirstValue_1$, sCompareValue_1$ ) = cDifferent ) then
377            ErrorMessage    ( "getByName() ... Fehler [Element 1 fehlerhaft]" )
378            goto Test_NormalUse_XNameContainer_Error
379        elseif ( CompareOWString    ( sFirstValue_2$, sCompareValue_2$ ) = cDifferent ) then
380            ErrorMessage    ( "getByName() ... Fehler [Element 2 fehlerhaft]" )
381            goto Test_NormalUse_XNameContainer_Error
382        elseif ( CompareOWString    ( sFirstValue_3$, sCompareValue_3$ ) = cDifferent ) then
383            ErrorMessage    ( "getByName() ... Fehler [Element 3 fehlerhaft]" )
384            goto Test_NormalUse_XNameContainer_Error
385        elseif ( CompareOWString    ( sFirstValue_4$, sCompareValue_4$ ) = cDifferent ) then
386            ErrorMessage    ( "getByName() ... Fehler [Element 4 fehlerhaft]" )
387            goto Test_NormalUse_XNameContainer_Error
388        elseif ( CompareOWString    ( sFirstValue_5$, sCompareValue_5$ ) = cDifferent ) then
389            ErrorMessage    ( "getByName() ... Fehler [Element 5 fehlerhaft]" )
390            goto Test_NormalUse_XNameContainer_Error
391        end if
392
393        InfoMessage ( "getByName() ... OK" )
394
395        ' Jetzt wird versucht einige der Elemente in ihrem Wert zu veraendern.
396        sNewValue_1$    = "NewValue 1"
397        sNewValue_2$    = "NewValue 2"
398        sNewValue_3$    = "NewValue 3"
399        sNewValue_4$    = "NewValue 4"
400        sNewValue_5$    = "NewValue 5"
401
402        aDocumentProperties.replaceByName ( sItemName_1$, sNewValue_1$ )
403        aDocumentProperties.replaceByName ( sItemName_2$, sNewValue_2$ )
404        aDocumentProperties.replaceByName ( sItemName_3$, sNewValue_3$ )
405        aDocumentProperties.replaceByName ( sItemName_4$, sNewValue_4$ )
406        aDocumentProperties.replaceByName ( sItemName_5$, sNewValue_5$ )
407
408        ' Zur Kontrolle die Werte ausgeben. (Nur wichtig, wenn geloggt wird!)
409        ShowNameContainer ( aDocumentProperties )
410
411        ' Dann die Werte wieder auslesen.
412        sCompareValue_1$ = aDocumentProperties.getByName ( sItemName_1$ )
413        sCompareValue_2$ = aDocumentProperties.getByName ( sItemName_2$ )
414        sCompareValue_3$ = aDocumentProperties.getByName ( sItemName_3$ )
415        sCompareValue_4$ = aDocumentProperties.getByName ( sItemName_4$ )
416        sCompareValue_5$ = aDocumentProperties.getByName ( sItemName_5$ )
417
418        ' Zum Vergleich die Werte ausgeben. (Nur wichtig, wenn geloggt wird!)
419        ShowNameContainer ( aDocumentProperties )
420
421        ' Dann die Werte automatisch vergleichen!
422        if ( CompareOWString        ( sNewValue_1$, sCompareValue_1$ ) = cDifferent ) then
423            ErrorMessage    ( "replaceByName() ... Fehler [Element 1 fehlerhaft]" )
424            goto Test_NormalUse_XNameContainer_Error
425        elseif ( CompareOWString    ( sNewValue_2$, sCompareValue_2$ ) = cDifferent ) then
426            ErrorMessage    ( "replaceByName() ... Fehler [Element 2 fehlerhaft]" )
427            goto Test_NormalUse_XNameContainer_Error
428        elseif ( CompareOWString    ( sNewValue_3$, sCompareValue_3$ ) = cDifferent ) then
429            ErrorMessage    ( "replaceByName() ... Fehler [Element 3 fehlerhaft]" )
430            goto Test_NormalUse_XNameContainer_Error
431        elseif ( CompareOWString    ( sNewValue_4$, sCompareValue_4$ ) = cDifferent ) then
432            ErrorMessage    ( "replaceByName() ... Fehler [Element 4 fehlerhaft]" )
433            goto Test_NormalUse_XNameContainer_Error
434        elseif ( CompareOWString    ( sNewValue_5$, sCompareValue_5$ ) = cDifferent ) then
435            ErrorMessage    ( "replaceByName() ... Fehler [Element 5 fehlerhaft]" )
436            goto Test_NormalUse_XNameContainer_Error
437        end if
438
439        InfoMessage ( "replaceByName() ... OK" )
440
441        ' Hier sollen einige der 5 Eintraege geloescht werden.
442        aDocumentProperties.removeByName ( sItemName_1$ )
443        aDocumentProperties.removeByName ( sItemName_3$ )
444
445        ' Dann wieder die Anzahl kontrollieren.
446        ' (Hier wird eine eigene BASIC-Hilfsfunktion verwendet! keine Interface-Methode)
447        if ( getNameContainerCount ( aDocumentProperties ) <> 3 ) then
448            ErrorMessage ( "removeByName() ... Fehler (Der NameConatiner enthaelt nicht die erwarteten 3 Elemente!)" )
449            goto Test_NormalUse_XNameContainer_Error
450        end if
451
452        ' Nun noch feststellen, ob die restlichen 3 denn auch tatsaechlich die richtigen sind.
453        if ( aDocumentProperties.hasByName ( sItemName_2$ ) = FALSE ) then
454            ErrorMessage    ( "removeByName() ... Fehler [Element 2 nicht vorhanden!?]" )
455            goto Test_NormalUse_XNameContainer_Error
456        elseif ( aDocumentProperties.hasByName ( sItemName_4$ ) = FALSE ) then
457            ErrorMessage    ( "removeByName() ... Fehler [Element 4 nicht vorhanden!?]" )
458            goto Test_NormalUse_XNameContainer_Error
459        elseif ( aDocumentProperties.hasByName ( sItemName_5$ ) = FALSE ) then
460            ErrorMessage    ( "removeByName() ... Fehler [Element 5 nicht vorhanden!?]" )
461            goto Test_NormalUse_XNameContainer_Error
462        end if
463
464        ' Zur Kontrolle die Werte nochmals ausgeben. (Nur wichtig, wenn geloggt wird!)
465        ShowNameContainer ( aDocumentProperties )
466
467        InfoMessage ( "removeByName() ... OK" )
468
469        ' Der Test war erfolgreich! Meldung ausgeben und zurueck zm Aufrufer.
470        ' Ausschalten der Fehlerbehandlung
471        on Error goto 0
472        ' Meldung ausgeben
473        InfoMessage ( "Test_NormalUse_XNameContainer ... [ende]" )
474        ' Status setzen
475        Test_NormalUse_XNameContainer = cOK
476        ' Und Funktion beenden
477        Exit Function
478
479' Es ist ein unerwartete Fehler aufgetreten! (Exception ...)
480' Meldung ausgeben und mit Fehler zurueckkehren.
481Test_NormalUse_XNameContainer_Error:
482        ' Ausschalten der Fehlerbehandlung
483        on Error goto 0
484        ' Meldung ausgeben
485        ErrorMessage ( "Test_NormalUse_XNameContainer ... [Error]" )
486        ' und Fehlerstatus setzen
487        Test_NormalUse_XNameContainer = cError
488        ' Abbruch der Funktion erzwingen!
489        Exit Function
490
491End Function
492
493'----------------------------------------------------------------------------
494' Testmethode: Testen des unterstuetzten Interfaces "XPersist" unter normalen Bedingungen
495'
496' Returnwert = cOK      ; wenn der Test erfolgreich war
497' Returnwert = cError   ; wenn sich das Objekt nicht korrekt verhalten hat
498'----------------------------------------------------------------------------
499Function Test_NormalUse_XPersist ( aDocumentProperties ) as Boolean
500
501        ' Einschalten der Fehlerbehandlung, um Exceptions oder aehnliches abzufangen!
502        on Error goto Test_NormalUse_XPersist_Error
503
504        InfoMessage ( "Test_NormalUse_XPersist ... [start]" )
505
506        ' Laden der Properties aus einer Datei
507        aDocumentProperties.read ( cTestPath + "TestDebug_in.sdw" )
508
509        ' Zur Kontrolle anzeigen
510        ShowProperties ( aDocumentProperties )
511
512        ' Speichern der Properties in einer neuen Datei
513        aDocumentProperties.write   ( cTestPath + "TestDebug_Out.sdw" )
514        aDocumentProperties.read    ( cTestPath + "TestDebug_Out.sdw" )
515
516        ' Zur Kontrolle anzeigen
517        ShowProperties ( aDocumentProperties )
518
519        ' Der Test war erfolgreich! Meldung ausgeben und zurueck zm Aufrufer.
520        ' Ausschalten der Fehlerbehandlung
521        on Error goto 0
522        ' Meldung ausgeben
523        InfoMessage ( "Test_NormalUse_XPersist ... [ende]" )
524        ' Status setzen
525        Test_NormalUse_XPersist = cOK
526        ' Und Funktion beenden
527        Exit Function
528
529' Es ist ein unerwartete Fehler aufgetreten! (Exception ...)
530' Meldung ausgeben und mit Fehler zurueckkehren.
531Test_NormalUse_XPersist_Error:
532        ' Ausschalten der Fehlerbehandlung
533        on Error goto 0
534        ' Meldung ausgeben
535        ErrorMessage ( "Test_NormalUse_XPersist ... [Error]" )
536        ' und Fehlerstatus setzen
537        Test_NormalUse_XPersist = cError
538        ' Abbruch der Funktion erzwingen!
539        Exit Function
540
541End Function
542
543'*****************************************************************************************************************
544' Hilfsfunktionen und -methoden
545'*****************************************************************************************************************
546
547'----------------------------------------------------------------------------
548' Hilfsmethode: Oeffnet die LOG-Datei.
549'----------------------------------------------------------------------------
550Sub OpenLOG ( sFileName$ )
551        if ( bLOGOn = cOn ) then
552            sLOGFileName$   = sFileName$
553            nLOGFileHandle% = FreeFile
554            open sLOGFileName$ for output as nLOGFileHandle%
555        end if
556End Sub
557
558'----------------------------------------------------------------------------
559' Hilfsmethode: Schliesst die LOG-Datei.
560'----------------------------------------------------------------------------
561Sub CloseLOG
562        if ( bLOGOn = cOn ) then
563            close #nLOGFileHandle%
564        end if
565End Sub
566
567'----------------------------------------------------------------------------
568' Hilfsmethode: Gibt einen Text in einer LOG-Datei aus.
569'----------------------------------------------------------------------------
570Sub WriteLOG ( sMessage$ )
571        if ( bLOGOn = cOn ) then
572            Write #nLOGFileHandle% sMessage$
573        end if
574End Sub
575
576'----------------------------------------------------------------------------
577' Hilfsmethode: Gibt eine MessageBox mit Fehlertext, Zeilennummer und Warnschild aus.
578'----------------------------------------------------------------------------
579Sub ErrorMessage ( sMessage$ )
580        ' Entweder in die LOG-Datei schreiben oder eine MessageBox anzeigen.
581        if ( bLOGOn = cOn ) then
582            WriteLOG ( sMessage$ )
583        else
584            MsgBox ( sMessage$, 16 )
585        end if
586End Sub
587
588'----------------------------------------------------------------------------
589' Hilfsmethode: Gibt eine Hinweisbox aus.
590'----------------------------------------------------------------------------
591Sub InfoMessage ( sMessage$ )
592        ' Nur was anzeigen, wenn Nutzer es wuenscht!
593        if ( bShowErrorsOnly = cOff ) then
594            ' Ansonsten wird entweder in die LOG-Datei geschrieben oder eine MessageBox angezeigt.
595            if ( bLOGOn = cOn ) then
596                WriteLOG ( sMessage$ )
597            else
598                MsgBox ( sMessage$, 64 )
599            end if
600        end if
601End Sub
602
603'----------------------------------------------------------------------------
604' Hilfsfunktion: Vergleicht zwei OWString-Werte
605'
606' Returnwert = cEqual       ; wenn Werte identisch sind
607' Returnwert = cDifferent   ; wenn Werte verschieden sind
608'----------------------------------------------------------------------------
609Function CompareOWString ( sOWString_1$, sOWString_2$ ) as Boolean
610
611        if ( sOWString_1$ = sOWString_2$ ) then
612            CompareOWString = cEqual
613        else
614            CompareOWString = cDifferent
615        end if
616
617End Function
618
619'----------------------------------------------------------------------------
620' Hilfsfunktion: Vergleicht zwei DateTime-Strukturen
621'
622' Returnwert = cEqual       ; wenn Werte identisch sind
623' Returnwert = cDifferent   ; wenn Werte verschieden sind
624'----------------------------------------------------------------------------
625Function CompareDateTime ( aDateTime_1, aDateTime_2 ) as Boolean
626
627        if ( aDateTime_1.Day = aDateTime_2.Day and aDateTime_1.Month = aDateTime_2.Month and aDateTime_1.Year = aDateTime_2.Year and aDateTime_1.Hours = aDateTime_1.Hours and aDateTime_1.Minutes = aDateTime_1.Minutes and aDateTime_1.Seconds = aDateTime_1.Seconds and aDateTime_1.HundredthSeconds = aDateTime_1.HundredthSeconds ) then
628            CompareDateTime = cEqual
629        else
630            CompareDateTime = cDifferent
631        end if
632
633End Function
634
635'----------------------------------------------------------------------------
636' Hilfsfunktion: Vergleicht zwei ByteSequence's
637'
638' Returnwert = cEqual       ; wenn Werte identisch sind
639' Returnwert = cDifferent   ; wenn Werte verschieden sind
640'----------------------------------------------------------------------------
641Function CompareByteSequence ( seqByteSequence_1, seqByteSequence_2 ) as Boolean
642
643        ' Wenn beide leer sind, sind sie auch identisch !
644        ' Dieser Test mit "IsArray" ist noetig, da bei einem leeren Array die
645        ' Funktion "UBound" einen Fehler produziert!
646        if ( IsArray ( seqByteSequence_1 ) = FALSE and IsArray ( seqByteSequence_2 ) = FALSE ) then
647            CompareByteSequence = cEqual
648            Exit Function
649        end if
650
651        ' Wenn jedoch nur eine leer ist, dann sind sie nicht identisch.
652        if ( IsArray ( seqByteSequence_1 ) = FALSE ) or ( IsArray ( seqByteSequence_2 ) = FALSE ) then
653            CompareByteSequence = cDifferent
654            Exit Function
655        end if
656
657        ' Besorgen der Anzahl der Elemente der Sequences
658        nElementCount_1%    =   UBound ( seqByteSequence_1 )
659        nElementCount_2%    =   UBound ( seqByteSequence_2 )
660
661        ' Wenn diese Anzahl schon verschieden ist, dann ...
662        if ( nElementCount_1% <> nElementCount_2% ) then
663            ' ... sind die Sequences wohl verschieden.
664            CompareByteSequence = cDifferent
665            ' Die Element brauchen dann nicht mehr verglichen zu werden.
666            Exit Function
667        end if
668
669        ' Ansonsten werden die Elemente einzeln miteinander verglichen.
670        for nCounter%=0 to nElementCount_1% step 1
671            ' Wenn auch nur ein paar davon verschieden ist, dann ...
672            if ( nElementCount_1%(nCounter%) <> nElementCount_2%(nCounter%) ) then
673                ' ... kann der Vergleich abgebrochen werden!
674                CompareByteSequence = cDifferent
675                Exit Function
676            end if
677        next nCounter%
678
679        ' Wenn man bis hier gekommen ist, dann sind die Sequences identisch.
680        CompareByteSequence = cEqual
681
682End Function
683
684'----------------------------------------------------------------------------
685' Hilfsfunktion: Vergleicht zwei Int16-Werte
686'
687' Returnwert = cEqual       ; wenn Werte identisch sind
688' Returnwert = cDifferent   ; wenn Werte verschieden sind
689'----------------------------------------------------------------------------
690Function CompareInt16 ( nInt16_1%, nInt16_2% ) as Boolean
691
692        if ( nInt16_1% = nInt16_2% ) then
693            CompareInt16 = cEqual
694        else
695            CompareInt16 = cDifferent
696        end if
697
698End Function
699
700'----------------------------------------------------------------------------
701' Hilfsfunktion: Vergleicht zwei Int32-Werte
702'
703' Returnwert = cEqual       ; wenn Werte identisch sind
704' Returnwert = cDifferent   ; wenn Werte verschieden sind
705'----------------------------------------------------------------------------
706Function CompareInt32 ( nInt32_1&, nInt32_2& ) as Boolean
707
708        if ( nInt32_1& = nInt32_2& ) then
709            CompareInt32 = cEqual
710        else
711            CompareInt32 = cDifferent
712        end if
713
714End Function
715
716'----------------------------------------------------------------------------
717' Hilfsfunktion: Vergleicht zwei Bool-Werte
718'
719' Returnwert = cEqual       ; wenn Werte identisch sind
720' Returnwert = cDifferent   ; wenn Werte verschieden sind
721'----------------------------------------------------------------------------
722Function CompareBool ( bBool_1, bBool_2 ) as Boolean
723
724        if ( bBool_1 = bBool_2 ) then
725            CompareBool = cEqual
726        else
727            CompareBool = cDifferent
728        end if
729
730End Function
731
732'----------------------------------------------------------------------------
733' Hilfsfunktion: Vergleicht die Properties zweier Objekte um Unterschiede festzustellen.
734'
735' Returnwert = cEqual       ; wenn Objekte von den Properties her identisch sind
736' Returnwert = cDifferent   ; wenn Objekte von den Properties her verschieden sind
737'----------------------------------------------------------------------------
738Function CompareDocumentProperties ( aDocumentProperties_1, aDocumentProperties_2 ) as Boolean
739
740        ' Besorgen der Werte und zwischenspeichern (bezogen auf Objekt 1)
741        sAuthor_1$                  = aDocumentProperties_1.getPropertyValue ( "Author"                     )
742        bAutoloadEnabled_1          = aDocumentProperties_1.getPropertyValue ( "AutoloadEnabled"            )
743        nAutoloadSecs_1%            = aDocumentProperties_1.getPropertyValue ( "AutoloadSecs"               )
744        sAutoLoadURL_1$             = aDocumentProperties_1.getPropertyValue ( "AutoloadURL"                )
745        sBliendCopiesTo_1$          = aDocumentProperties_1.getPropertyValue ( "BlindCopiesTo"              )
746        sCopiesTo_1$                = aDocumentProperties_1.getPropertyValue ( "CopiesTo"                   )
747        aCreationDate_1             = aDocumentProperties_1.getPropertyValue ( "CreationDate"               )
748        sDefaultTarget_1$           = aDocumentProperties_1.getPropertyValue ( "DefaultTarget"              )
749        sDescription_1$             = aDocumentProperties_1.getPropertyValue ( "Description"                )
750        nEditingCycles_1%           = aDocumentProperties_1.getPropertyValue ( "EditingCycles"              )
751        nEditingDuration_1&         = aDocumentProperties_1.getPropertyValue ( "EditingDuration"            )
752        seqExtraData_1              = aDocumentProperties_1.getPropertyValue ( "ExtraData"                  )
753        sInReplyTo_1$               = aDocumentProperties_1.getPropertyValue ( "InReplyTo"                  )
754        bIsEncrypted_1              = aDocumentProperties_1.getPropertyValue ( "IsEncrypted"                )
755        sKeywords_1$                = aDocumentProperties_1.getPropertyValue ( "Keywords"                   )
756        sMIMEType_1$                = aDocumentProperties_1.getPropertyValue ( "MIMEType"                   )
757        sModifiedBy_1$              = aDocumentProperties_1.getPropertyValue ( "ModifiedBy"                 )
758        aModifyDate_1               = aDocumentProperties_1.getPropertyValue ( "ModifyDate"                 )
759        sNewsgroups_1$              = aDocumentProperties_1.getPropertyValue ( "Newsgroups"                 )
760        sOriginal_1$                = aDocumentProperties_1.getPropertyValue ( "Original"                   )
761        bPortableGraphics_1         = aDocumentProperties_1.getPropertyValue ( "PortableGraphics"           )
762        aPrintDate_1                = aDocumentProperties_1.getPropertyValue ( "PrintDate"                  )
763        sPrintedBy_1$               = aDocumentProperties_1.getPropertyValue ( "PrintedBy"                  )
764        nPriority_1%                = aDocumentProperties_1.getPropertyValue ( "Priority"                   )
765        bQueryTemplate_1            = aDocumentProperties_1.getPropertyValue ( "QueryTemplate"              )
766        sRecipient_1$               = aDocumentProperties_1.getPropertyValue ( "Recipient"                  )
767        sReferences_1$              = aDocumentProperties_1.getPropertyValue ( "References"                 )
768        sReplyTo_1$                 = aDocumentProperties_1.getPropertyValue ( "ReplyTo"                    )
769        bSaveGraphicsCompressed_1   = aDocumentProperties_1.getPropertyValue ( "SaveGraphicsCompressed"     )
770        bSaveOriginalGraphics_1     = aDocumentProperties_1.getPropertyValue ( "SaveOriginalGraphics"       )
771        bSaveVersionOnClose_1       = aDocumentProperties_1.getPropertyValue ( "SaveVersionOnClose"         )
772        sTemplate_1$                = aDocumentProperties_1.getPropertyValue ( "Template"                   )
773        bTemplateConfig_1           = aDocumentProperties_1.getPropertyValue ( "TemplateConfig"             )
774        aTemplateDate_1             = aDocumentProperties_1.getPropertyValue ( "TemplateDate"               )
775        sTemplateFileName_1$        = aDocumentProperties_1.getPropertyValue ( "TemplateFileName"           )
776        sTheme_1$                   = aDocumentProperties_1.getPropertyValue ( "Theme"                      )
777        sTitle_1$                   = aDocumentProperties_1.getPropertyValue ( "Title"                      )
778        bUserData_1                 = aDocumentProperties_1.getPropertyValue ( "UserData"                   )
779
780        ' Besorgen der Werte und zwischenspeichern (bezogen auf Objekt 2)
781        sAuthor_2$                  = aDocumentProperties_2.getPropertyValue ( "Author"                     )
782        bAutoloadEnabled_2          = aDocumentProperties_2.getPropertyValue ( "AutoloadEnabled"            )
783        nAutoloadSecs_2%            = aDocumentProperties_2.getPropertyValue ( "AutoloadSecs"               )
784        sAutoLoadURL_2$             = aDocumentProperties_2.getPropertyValue ( "AutoloadURL"                )
785        sBliendCopiesTo_2$          = aDocumentProperties_2.getPropertyValue ( "BlindCopiesTo"              )
786        sCopiesTo_2$                = aDocumentProperties_2.getPropertyValue ( "CopiesTo"                   )
787        aCreationDate_2             = aDocumentProperties_2.getPropertyValue ( "CreationDate"               )
788        sDefaultTarget_2$           = aDocumentProperties_2.getPropertyValue ( "DefaultTarget"              )
789        sDescription_2$             = aDocumentProperties_2.getPropertyValue ( "Description"                )
790        nEditingCycles_2%           = aDocumentProperties_2.getPropertyValue ( "EditingCycles"              )
791        nEditingDuration_2&         = aDocumentProperties_2.getPropertyValue ( "EditingDuration"            )
792        seqExtraData_2              = aDocumentProperties_2.getPropertyValue ( "ExtraData"                  )
793        sInReplyTo_2$               = aDocumentProperties_2.getPropertyValue ( "InReplyTo"                  )
794        bIsEncrypted_2              = aDocumentProperties_2.getPropertyValue ( "IsEncrypted"                )
795        sKeywords_2$                = aDocumentProperties_2.getPropertyValue ( "Keywords"                   )
796        sMIMEType_2$                = aDocumentProperties_2.getPropertyValue ( "MIMEType"                   )
797        sModifiedBy_2$              = aDocumentProperties_2.getPropertyValue ( "ModifiedBy"                 )
798        aModifyDate_2               = aDocumentProperties_2.getPropertyValue ( "ModifyDate"                 )
799        sNewsgroups_2$              = aDocumentProperties_2.getPropertyValue ( "Newsgroups"                 )
800        sOriginal_2$                = aDocumentProperties_2.getPropertyValue ( "Original"                   )
801        bPortableGraphics_2         = aDocumentProperties_2.getPropertyValue ( "PortableGraphics"           )
802        aPrintDate_2                = aDocumentProperties_2.getPropertyValue ( "PrintDate"                  )
803        sPrintedBy_2$               = aDocumentProperties_2.getPropertyValue ( "PrintedBy"                  )
804        nPriority_2%                = aDocumentProperties_2.getPropertyValue ( "Priority"                   )
805        bQueryTemplate_2            = aDocumentProperties_2.getPropertyValue ( "QueryTemplate"              )
806        sRecipient_2$               = aDocumentProperties_2.getPropertyValue ( "Recipient"                  )
807        sReferences_2$              = aDocumentProperties_2.getPropertyValue ( "References"                 )
808        sReplyTo_2$                 = aDocumentProperties_2.getPropertyValue ( "ReplyTo"                    )
809        bSaveGraphicsCompressed_2   = aDocumentProperties_2.getPropertyValue ( "SaveGraphicsCompressed"     )
810        bSaveOriginalGraphics_2     = aDocumentProperties_2.getPropertyValue ( "SaveOriginalGraphics"       )
811        bSaveVersionOnClose_2       = aDocumentProperties_2.getPropertyValue ( "SaveVersionOnClose"         )
812        sTemplate_2$                = aDocumentProperties_2.getPropertyValue ( "Template"                   )
813        bTemplateConfig_2           = aDocumentProperties_2.getPropertyValue ( "TemplateConfig"             )
814        aTemplateDate_2             = aDocumentProperties_2.getPropertyValue ( "TemplateDate"               )
815        sTemplateFileName_2$        = aDocumentProperties_2.getPropertyValue ( "TemplateFileName"           )
816        sTheme_2$                   = aDocumentProperties_2.getPropertyValue ( "Theme"                      )
817        sTitle_2$                   = aDocumentProperties_2.getPropertyValue ( "Title"                      )
818        bUserData_2                 = aDocumentProperties_2.getPropertyValue ( "UserData"                   )
819
820        ' Als erwarteten Zielwert schon mal "Properties identisch" annehmen!!!
821        ' F�r den Fall, das nur eine diesen Anspruch nicht erf�llt, wird der Wert einfach zur�ckgesetzt.
822        ' Von da bleibt der neue Wert bestehen und zeigt an, da� sich mindestens eine Property ge�ndert hat!
823        CompareDocumentProperties = cEqual
824
825        ' Dann die Werte vergleichen
826        if ( CompareOWString        ( sAuthor_1$,                   sAuthor_2$                  ) = cDifferent ) then
827            CompareDocumentProperties = cDifferent
828        elseif ( CompareBool        ( bAutoloadEnabled_1,           bAutoloadEnabled_2          ) = cDifferent ) then
829            CompareDocumentProperties = cDifferent
830        elseif ( CompareInt16       ( nAutoloadSecs_1%,             nAutoloadSecs_2%            ) = cDifferent ) then
831            CompareDocumentProperties = cDifferent
832        elseif ( CompareOWString    ( sAutoLoadURL_1$,              sAutoLoadURL_2$             ) = cDifferent ) then
833            CompareDocumentProperties = cDifferent
834        elseif ( CompareOWString    ( sBliendCopiesTo_1$,           sBliendCopiesTo_2$          ) = cDifferent ) then
835            CompareDocumentProperties = cDifferent
836        elseif ( CompareOWString    ( sCopiesTo_1$,                 sCopiesTo_2$                ) = cDifferent ) then
837            CompareDocumentProperties = cDifferent
838        elseif ( CompareDateTime    ( aCreationDate_1,              aCreationDate_2             ) = cDifferent ) then
839            CompareDocumentProperties = cDifferent
840        elseif ( CompareOWString    ( sDefaultTarget_1$,            sDefaultTarget_2$           ) = cDifferent ) then
841            CompareDocumentProperties = cDifferent
842        elseif ( CompareOWString    ( sDescription_1$,              sDescription_2$             ) = cDifferent ) then
843            CompareDocumentProperties = cDifferent
844        elseif ( CompareInt16       ( nEditingCycles_1%,            nEditingCycles_2%           ) = cDifferent ) then
845            CompareDocumentProperties = cDifferent
846        elseif ( CompareInt32       ( nEditingDuration_1&,          nEditingDuration_2&         ) = cDifferent ) then
847            CompareDocumentProperties = cDifferent
848        elseif ( CompareByteSequence( seqExtraData_1,               seqExtraData_2              ) = cDifferent ) then
849            CompareDocumentProperties = cDifferent
850        elseif ( CompareOWString    ( sInReplyTo_1$,                sInReplyTo_2$               ) = cDifferent ) then
851            CompareDocumentProperties = cDifferent
852        elseif ( CompareBool        ( bIsEncrypted_1,               bIsEncrypted_2              ) = cDifferent ) then
853            CompareDocumentProperties = cDifferent
854        elseif ( CompareOWString    ( sKeywords_1$,                 sKeywords_2$                ) = cDifferent ) then
855            CompareDocumentProperties = cDifferent
856        elseif ( CompareOWString    ( sMIMEType_1$,                 sMIMEType_2$                ) = cDifferent ) then
857            CompareDocumentProperties = cDifferent
858        elseif ( CompareOWString    ( sModifiedBy_1$,               sModifiedBy_2$              ) = cDifferent ) then
859            CompareDocumentProperties = cDifferent
860        elseif ( CompareDateTime    ( aModifyDate_1,                aModifyDate_2               ) = cDifferent ) then
861            CompareDocumentProperties = cDifferent
862        elseif ( CompareOWString    ( sNewsgroups_1$,               sNewsgroups_2$              ) = cDifferent ) then
863            CompareDocumentProperties = cDifferent
864        elseif ( CompareOWString    ( sOriginal_1$,                 sOriginal_2$                ) = cDifferent ) then
865            CompareDocumentProperties = cDifferent
866        elseif ( CompareBool        ( bPortableGraphics_1,          bPortableGraphics_2         ) = cDifferent ) then
867            CompareDocumentProperties = cDifferent
868        elseif ( CompareDateTime    ( aPrintDate_1,                 aPrintDate_2                ) = cDifferent ) then
869            CompareDocumentProperties = cDifferent
870        elseif ( CompareOWString    ( sPrintedBy_1$,                sPrintedBy_2$               ) = cDifferent ) then
871            CompareDocumentProperties = cDifferent
872        elseif ( CompareInt16       ( nPriority_1%,                 nPriority_2%                ) = cDifferent ) then
873            CompareDocumentProperties = cDifferent
874        elseif ( CompareBool        ( bQueryTemplate_1,             bQueryTemplate_2            ) = cDifferent ) then
875            CompareDocumentProperties = cDifferent
876        elseif ( CompareOWString    ( sRecipient_1$,                sRecipient_2$               ) = cDifferent ) then
877            CompareDocumentProperties = cDifferent
878        elseif ( CompareOWString    ( sReferences_1$,               sReferences_2$              ) = cDifferent ) then
879            CompareDocumentProperties = cDifferent
880        elseif ( CompareOWString    ( sReplyTo_1$,                  sReplyTo_2$                 ) = cDifferent ) then
881            CompareDocumentProperties = cDifferent
882        elseif ( CompareBool        ( bSaveGraphicsCompressed_1,    bSaveGraphicsCompressed_2   ) = cDifferent ) then
883            CompareDocumentProperties = cDifferent
884        elseif ( CompareBool        ( bSaveOriginalGraphics_1,      bSaveOriginalGraphics_2     ) = cDifferent ) then
885            CompareDocumentProperties = cDifferent
886        elseif ( CompareBool        ( bSaveVersionOnClose_1,        bSaveVersionOnClose_2       ) = cDifferent ) then
887            CompareDocumentProperties = cDifferent
888        elseif ( CompareOWString    ( sTemplate_1$,                 sTemplate_2$                ) = cDifferent ) then
889            CompareDocumentProperties = cDifferent
890        elseif ( CompareBool        ( bTemplateConfig_1,            bTemplateConfig_2           ) = cDifferent ) then
891            CompareDocumentProperties = cDifferent
892        elseif ( CompareDateTime    ( aTemplateDate_1,              aTemplateDate_2             ) = cDifferent ) then
893            CompareDocumentProperties = cDifferent
894        elseif ( CompareOWString    ( sTemplateFileName_1$,         sTemplateFileName_2$        ) = cDifferent ) then
895            CompareDocumentProperties = cDifferent
896        elseif ( CompareOWString    ( sTheme_1$,                    sTheme_2$                   ) = cDifferent ) then
897            CompareDocumentProperties = cDifferent
898        elseif ( CompareOWString    ( sTitle_1$,                    sTitle_2$                   ) = cDifferent ) then
899            CompareDocumentProperties = cDifferent
900        elseif ( CompareBool        ( bUserData_1,                  bUserData_2                 ) = cDifferent ) then
901            CompareDocumentProperties = cDifferent
902        end if
903
904End Function
905
906'----------------------------------------------------------------------------
907' Hilfsfunktion: Wandelt eine Struktur des Types DateTime in einen formatierten String um
908'----------------------------------------------------------------------------
909Function DateTime2String ( aDateTime ) as String
910
911        stempString$ = ""
912        stempString$ = stempString$ + aDateTime.Day                 + "."
913        stempString$ = stempString$ + aDateTime.Month               + "."
914        stempString$ = stempString$ + aDateTime.Year                + " - "
915        stempString$ = stempString$ + aDateTime.Hours               + ":"
916        stempString$ = stempString$ + aDateTime.Minutes             + ":"
917        stempString$ = stempString$ + aDateTime.Seconds             + ":"
918        stempString$ = stempString$ + aDateTime.HundredthSeconds    + " Uhr"
919
920        DateTime2String = stempString$
921
922End Function
923
924'----------------------------------------------------------------------------
925' Hilfsfunktion: Wandelt eine Sequence von Bytes in einen formatierten String um
926'----------------------------------------------------------------------------
927Function ByteSequence2String ( seqByteSequence ) as String
928
929        nElementCount% = UBound ( seqByteSequence() )
930
931        if ( nElementCount% < 1 ) then
932            stempString$ = "leer"
933        else
934            stempString$ = "{"
935            for nCounter%=0 to nElementCount% step 1
936                stempString$ = stempString$ + seqByteSequence(nCounter%)
937            next nCounter%
938            stempString$ = stempString$ + "}"
939        end if
940
941        ByteSequence2String = stempString$
942
943End Function
944
945'----------------------------------------------------------------------------
946' Hilfsmethode: Zeigt die aktuellen Werte ALLER Properties an
947'----------------------------------------------------------------------------
948Sub ShowProperties ( aDocumentProperties )
949
950        ' Besorgen der Werte und zwischenspeichern
951        sAuthor$                = aDocumentProperties.getPropertyValue ( "Author"                   )
952        bAutoloadEnabled        = aDocumentProperties.getPropertyValue ( "AutoloadEnabled"          )
953        nAutoloadSecs%          = aDocumentProperties.getPropertyValue ( "AutoloadSecs"             )
954        sAutoLoadURL$           = aDocumentProperties.getPropertyValue ( "AutoloadURL"              )
955        sBliendCopiesTo$        = aDocumentProperties.getPropertyValue ( "BlindCopiesTo"            )
956        sCopiesTo$              = aDocumentProperties.getPropertyValue ( "CopiesTo"                 )
957        dCreationDate           = aDocumentProperties.getPropertyValue ( "CreationDate"             )
958        sDefaultTarget$         = aDocumentProperties.getPropertyValue ( "DefaultTarget"            )
959        sDescription$           = aDocumentProperties.getPropertyValue ( "Description"              )
960        nEditingCycles%         = aDocumentProperties.getPropertyValue ( "EditingCycles"            )
961        nEditingDuration&       = aDocumentProperties.getPropertyValue ( "EditingDuration"          )
962        seqExtraData            = aDocumentProperties.getPropertyValue ( "ExtraData"                )
963        sInReplyTo$             = aDocumentProperties.getPropertyValue ( "InReplyTo"                )
964        bIsEncrypted            = aDocumentProperties.getPropertyValue ( "IsEncrypted"              )
965        sKeywords$              = aDocumentProperties.getPropertyValue ( "Keywords"                 )
966        sMIMEType$              = aDocumentProperties.getPropertyValue ( "MIMEType"                 )
967        sModifiedBy$            = aDocumentProperties.getPropertyValue ( "ModifiedBy"               )
968        dModifyDate             = aDocumentProperties.getPropertyValue ( "ModifyDate"               )
969        sNewsgroups$            = aDocumentProperties.getPropertyValue ( "Newsgroups"               )
970        sOriginal$              = aDocumentProperties.getPropertyValue ( "Original"                 )
971        bPortableGraphics       = aDocumentProperties.getPropertyValue ( "PortableGraphics"         )
972        dPrintDate              = aDocumentProperties.getPropertyValue ( "PrintDate"                )
973        sPrintedBy$             = aDocumentProperties.getPropertyValue ( "PrintedBy"                )
974        nPriority%              = aDocumentProperties.getPropertyValue ( "Priority"                 )
975        bQueryTemplate          = aDocumentProperties.getPropertyValue ( "QueryTemplate"            )
976        sRecipient$             = aDocumentProperties.getPropertyValue ( "Recipient"                )
977        sReferences$            = aDocumentProperties.getPropertyValue ( "References"               )
978        sReplyTo$               = aDocumentProperties.getPropertyValue ( "ReplyTo"                  )
979        bSaveGraphicsCompressed = aDocumentProperties.getPropertyValue ( "SaveGraphicsCompressed"   )
980        bSaveOriginalGraphics   = aDocumentProperties.getPropertyValue ( "SaveOriginalGraphics"     )
981        bSaveVersionOnClose     = aDocumentProperties.getPropertyValue ( "SaveVersionOnClose"       )
982        sTemplate$              = aDocumentProperties.getPropertyValue ( "Template"                 )
983        bTemplateConfig         = aDocumentProperties.getPropertyValue ( "TemplateConfig"           )
984        dTemplateDate           = aDocumentProperties.getPropertyValue ( "TemplateDate"             )
985        sTemplateFileName$      = aDocumentProperties.getPropertyValue ( "TemplateFileName"         )
986        sTheme$                 = aDocumentProperties.getPropertyValue ( "Theme"                    )
987        sTitle$                 = aDocumentProperties.getPropertyValue ( "Title"                    )
988        bUserData               = aDocumentProperties.getPropertyValue ( "UserData"                 )
989
990        ' Eine Zeichenkette zusammenbasteln, welche die Werte formatiert darstellt.
991        sOutLine$ =             "[OWString]"        + chr$(9) + "Author"                    + chr$(9) + "= {" + chr$(9) + sAuthor$                          + "}" + chr$(13)
992        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "AutoloadEnabled"           + chr$(9) + "= {" + chr$(9) + bAutoloadEnabled                  + "}" + chr$(13)
993        sOutLine$ = sOutLine$ + "[sal_Int16]"       + chr$(9) + "AutoloadSecs"              + chr$(9) + "= {" + chr$(9) + nAutoloadSecs%                    + "}" + chr$(13)
994        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "AutoLoadURL"               + chr$(9) + "= {" + chr$(9) + sAutoLoadURL$                     + "}" + chr$(13)
995        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "BliendCopiesTo"            + chr$(9) + "= {" + chr$(9) + sBliendCopiesTo$                  + "}" + chr$(13)
996        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "CopiesTo"                  + chr$(9) + "= {" + chr$(9) + sCopiesTo$                        + "}" + chr$(13)
997        sOutLine$ = sOutLine$ + "[DateTime]"        + chr$(9) + "CreationDate"              + chr$(9) + "= {" + chr$(9) + DateTime2String(dCreationDate)    + "}" + chr$(13)
998        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "DefaultTarget"             + chr$(9) + "= {" + chr$(9) + sDefaultTarget$                   + "}" + chr$(13)
999        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Description"               + chr$(9) + "= {" + chr$(9) + sDescription$                     + "}" + chr$(13)
1000        sOutLine$ = sOutLine$ + "[sal_Int16]"       + chr$(9) + "EditingCycles"             + chr$(9) + "= {" + chr$(9) + nEditingCycles%                   + "}" + chr$(13)
1001        sOutLine$ = sOutLine$ + "[sal_Int32]"       + chr$(9) + "EditingDuration"           + chr$(9) + "= {" + chr$(9) + nEditingDuration&                 + "}" + chr$(13)
1002        sOutLine$ = sOutLine$ + "[Sequence<Byte>]"  + chr$(9) + "ExtraData"                 + chr$(9) + "= {" + chr$(9) + ByteSequence2String(seqExtraData) + "}" + chr$(13)
1003        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "InReplyTo"                 + chr$(9) + "= {" + chr$(9) + sInReplyTo$                       + "}" + chr$(13)
1004        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "IsEncrypted"               + chr$(9) + "= {" + chr$(9) + bIsEncrypted                      + "}" + chr$(13)
1005        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Keywords"                  + chr$(9) + "= {" + chr$(9) + sKeywords$                        + "}" + chr$(13)
1006        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "MIMEType"                  + chr$(9) + "= {" + chr$(9) + sMIMEType$                        + "}" + chr$(13)
1007        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "ModifiedBy"                + chr$(9) + "= {" + chr$(9) + sModifiedBy$                      + "}" + chr$(13)
1008        sOutLine$ = sOutLine$ + "[DateTime]"        + chr$(9) + "ModifyDate"                + chr$(9) + "= {" + chr$(9) + DateTime2String(dModifyDate)      + "}" + chr$(13)
1009        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Newsgroups"                + chr$(9) + "= {" + chr$(9) + sNewsgroups$                      + "}" + chr$(13)
1010        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Original"                  + chr$(9) + "= {" + chr$(9) + sOriginal$                        + "}" + chr$(13)
1011        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "PortableGraphics"          + chr$(9) + "= {" + chr$(9) + bPortableGraphics                 + "}" + chr$(13)
1012        sOutLine$ = sOutLine$ + "[DateTime]"        + chr$(9) + "PrintDate"                 + chr$(9) + "= {" + chr$(9) + DateTime2String(dPrintDate)       + "}" + chr$(13)
1013        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "PrintedBy"                 + chr$(9) + "= {" + chr$(9) + sPrintedBy$                       + "}" + chr$(13)
1014        sOutLine$ = sOutLine$ + "[sal_Int16]"       + chr$(9) + "Priority"                  + chr$(9) + "= {" + chr$(9) + nPriority%                        + "}" + chr$(13)
1015        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "QueryTemplate"             + chr$(9) + "= {" + chr$(9) + bQueryTemplate                    + "}" + chr$(13)
1016        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Recipient"                 + chr$(9) + "= {" + chr$(9) + sRecipient$                       + "}" + chr$(13)
1017        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "References"                + chr$(9) + "= {" + chr$(9) + sReferences$                      + "}" + chr$(13)
1018        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "ReplyTo"                   + chr$(9) + "= {" + chr$(9) + sReplyTo$                         + "}" + chr$(13)
1019        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "SaveGraphicsCompressed"    + chr$(9) + "= {" + chr$(9) + bSaveGraphicsCompressed           + "}" + chr$(13)
1020        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "SaveOriginalGraphics"      + chr$(9) + "= {" + chr$(9) + bSaveOriginalGraphics             + "}" + chr$(13)
1021        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "SaveVersionOnClose"        + chr$(9) + "= {" + chr$(9) + bSaveVersionOnClose               + "}" + chr$(13)
1022        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Template"                  + chr$(9) + "= {" + chr$(9) + sTemplate$                        + "}" + chr$(13)
1023        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "TemplateConfig"            + chr$(9) + "= {" + chr$(9) + bTemplateConfig                   + "}" + chr$(13)
1024        sOutLine$ = sOutLine$ + "[DateTime]"        + chr$(9) + "TemplateDate"              + chr$(9) + "= {" + chr$(9) + DateTime2String(dTemplateDate)    + "}" + chr$(13)
1025        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "TemplateFileName"          + chr$(9) + "= {" + chr$(9) + sTemplateFileName$                + "}" + chr$(13)
1026        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Theme"                     + chr$(9) + "= {" + chr$(9) + sTheme$                           + "}" + chr$(13)
1027        sOutLine$ = sOutLine$ + "[OWString]"        + chr$(9) + "Title"                     + chr$(9) + "= {" + chr$(9) + sTitle$                           + "}" + chr$(13)
1028        sOutLine$ = sOutLine$ + "[sal_Bool]"        + chr$(9) + "UserData"                  + chr$(9) + "= {" + chr$(9) + bUserData                         + "}"
1029
1030        ' Ausgabe der formatierten Zeichenkette
1031        InfoMessage ( sOutLine$ )
1032End Sub
1033
1034'----------------------------------------------------------------------------
1035' Hilfsmethode: Zeigt die aktuellen Elemente des NameContainers an.
1036'----------------------------------------------------------------------------
1037Sub ShowNameContainer ( aDocumentProperties )
1038
1039        if ( aDocumentProperties.hasElements () = FALSE ) then
1040            InfoMessage ( "Keine Elemente im NameContainer enthalten." )
1041            Exit Sub
1042        end if
1043
1044        aNameField      = aDocumentProperties.getElementNames ()
1045        if ( IsArray ( aNameField ) = FALSE ) then
1046            ErrorMessage ( "getElementNames() .... Fehler (Es konnte keine Sequence bestimmt werden!)" )
1047            Exit Sub
1048        end if
1049        nElementCount%  = UBound ( aNameField () )
1050
1051        stempString$ = ""
1052        for nCounter%=0 to nElementCount% step 1
1053            stempString$ = "[" + nCounter% + "]"
1054            stempString$ = stempString$ + chr$(9) + aNameField(nCounter%)
1055            stempString$ = stempString$ + chr$(9) + "="
1056            stempString$ = stempString$ + chr$(9) + aDocumentProperties.getByName ( aNameField(nCounter%) )
1057            stempString$ = stempString$ + chr$(13)
1058        next nCounter%
1059
1060        InfoMessage ( stempString$ )
1061
1062End Sub
1063
1064'----------------------------------------------------------------------------
1065' Hilfsfunktion: Ermittelt die Anzahl der im NameContainer enthaltenen Elemente.
1066'
1067' Returnwert = Anzahl der Elemente
1068'----------------------------------------------------------------------------
1069Function getNameContainerCount ( aDocumentProperties ) as Long
1070
1071        if ( aDocumentProperties.hasElements () = FALSE ) then
1072            getNameContainerCount = 0
1073            Exit Function
1074        end if
1075
1076        aNameField      = aDocumentProperties.getElementNames ()
1077        nElementCount%  = UBound ( aNameField () )
1078
1079        ' Da die Zaehlung bei 0 beginnt, und der ermittelte Wert die obere Grenze darstellt,
1080        ' muss hier eine 1 draufgeschlagen werden.
1081        getNameContainerCount = nElementCount% + 1
1082
1083End Function