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