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