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