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