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