De API van OpenOffice.org
(bijna) zonder moeite

Verspreid door
het Franse Project Documentatie van OpenOffice.org fr.OpenOffice.org

Inhoudsopgave

1 Introductie	7

1.1 Hoe kwam dit document tot stand	7

1.2 Macrorecorder	9

1.3 Evolutie van het document	9

a) Wijzigingen	9

b) Toevoegingen	9

2 Karakteristieken van OOo Basic	10

2.1 Toegang tot macro’s	10

2.2 Uiterlijk en leesbaarheid	10

2.3 Definities van de variabelen	11

3 Vinden van het document	12

3.1 Het document als klasse	12

3.2 Toegang tot een ander, bestaand, document	12

3.3 Creëren van een nieuw document	12

3.4 Creëer een nieuw document aan de hand van een sjabloon	13

3.5 Enkele aanvullende details	13

a) StarDesktop	13

b) ThisComponent	13

c) Argumenten van LoadComponentFromURL	14

d) Eigenschappen om een document te openen	14

4 Het document opslaan	16

4.1 Opslaan als / Een kopie opslaan als	17

4.2 Het document sluiten	17

5 Calc werkbladen	18

5.1 Vinden van het werkblad	18

a) Een bestaand blad	18

b) Creëren, hernoemen, dupliceren en verwijderen van een blad	18

c) Het blad zichtbaar voor de gebruiker	19

5.2 Vinden van de cel	19

5.3 Celbereik	20

a) Bewerken van een celbereik	20

b) Celbereiken geselecteerd door de gebruiker	20

c) Zichtbaar selecteren van een celbereik	21

5.4 De coördinaten van een cel terugvinden	21

5.5 Het inhoudstype van een cel weten	22

5.6 Numerieke waarde in een cel	23

5.7 Tekst in de cel	23

a) De tekstcursor in de cel	23

b) Speciale tekens in een tekst	23

c) Plaatsing van de tekstcursor in een cel	24

5.8 Formule in de cel	24

5.9 Herberekenen van de formules in de cellen	25

5.10 De opmaak van een cel aanpassen	25

a) Opmaak van een cel	25

b) Achtergrondkleur van de cel	26

c) Kleur van het teken	26

d) Horizontaal uitlijnen	26

e) Verticaal uitlijnen	26

f) Verticale / Horizontale Orientatie	27

g) Orientatie onder willekeurige hoek	27

h) Woordterugloop	27

5.11 Opmaken van celbereiken	27

5.12 Rijen en kolommen	28

a) Definiëren van een serie kolommen	28

b) Toevoegen of opheffen van kolommen	28

c) Optimale breedte van een kolom	28

d) Toevoegen of opheffen van rijen	28

e) Verbergen van rijen of kolommen	28

5.13 Bewerken van tabellen	29

5.14 Celcursor	29

5.15 Calc functies aanroepen in een macro	30

5.16 Een tabel sorteren	31

a) Sorteren per kolom	31

b) Sorteren per rij	32

5.17 De vormen in Calc	33

a) Invoegen van een ontworpen vorm	33

b) Ankeren van de vorm	34

c) Plaatsing van de vorm	34

d) Andere functionaliteiten voor vormen	34

5.18 Afbeeldingen in Calc	35

a) Een afbeelding invoegen	35

b) Plaatsen van een afbeelding	35

c) Weergeven van een afbeelding	35

d) Meerdere afbeeldingen invoegen	36

e) Vinden van een afbeelding door zijn naam	37

6 Writer Tekstverwerking	38

6.1 Tekst vinden	38

6.2 Cursor leiden	38

a) Zichtbare cursor, tekstcursor	38

b) Tekstcursor verzetten	38

c) De zichtbare cursor	40

d) Geselecteerd bereik door de gebruiker	40

e) Zichtbaar een bereik selecteren	41

6.3 Schrijven van tekst	41

a) Inlezen, schrijven	41

b) Speciale tekens in een tekst	42

c) Een pagina-einde of kolom-einde invoegen	43

d) Voorbeelden van bewerken van tekst	43

e) Slimmigheidje : tekstmarkeringen gebruiken om tekst te schrijven	44

6.4 Een opmaakprofiel of een formaat toepassen	44

a) Een opmaakprofiel op een alinea toepassen	44

b) Tekenopmaakprofiel gebruiken	45

c) De opmaak van een teken toepassen	45

d) Terugzetten van de alineaopmaak	47

6.5 Oefening tekst schrijven	47

6.6 Inspringen in tekst	49

6.7 Zoeken en vervangen van tekst	50

a) Vervangen van een reeks door de gehele tekst	50

b) Vervangen van een alieneaopmaakprofiel door de gehele tekst	51

c) Zoeken en wijzigen van tekst	52

6.8 De tabellen in een Writer-document	54

a) Invoegen van een tabel	54

b) Eigenschappen van een tabel	54

c) Grootte van de tabel	54

d) Verplaatsen in een tabel	56

e) Schrijven van tekst in een tabelcel	58

f) Som van de cellen in een tabel	59

g) Toegang krijgen tot een rij	59

h) Achtergrondkleur van een tabel	59

i) Invoegen meerdere tabellen	60

j) Tabel vinden via zijn naam	60

k) Onregelmatige tabellen	60

6.9 De kaders in een Writer document	63

a) Kader invoegen	63

b) Elastische kaders	63

c) De verschillende ankers voor kaders	64

d) Gebruikte methoden bij plaatsen van een kader	64

e) Absolute plaatsing van het kader	64

f) Relatieve horizontale plaatsing	65

g) Relatieve verticale plaatsing	66

h) Voorbeeld complete invoeging van een kader	67

i) Tekst schrijven in een kader	67

j) Invoegen meerdere kaders	68

k) Voorbeeld van een kader in een kader	68

l) Achtergrondkleur van een kader	69

m) Kader bij zijn naam vinden	69

6.10 Tekenen in Writer	70

a) De tekenpagina van Writer	70

b) Een tekenvorm invoegen	70

c) De verschillende ankers van een vorm	71

d) Plaatsing van de vorm	71

e) Meerdere vormen invoegen	72

f) Andere functionaliteiten rondom de vorm	72

6.11 Afbeeldingen in Writer	73

a) Een afbeelding invoegen	73

b) Plaatsen van een afbeelding	73

c) Afmetingen van een afbeelding	74

d) Meerdere afbeeldingen invoegen	75

e) Vinden van een afbeelding door zijn naam	75

7 Tekenen in Draw	76

7.1 Vinden van de Tekenpagina	76

a) Creëren, hernoemen, dupliceren en verwijderen van een pagina	76

b) De pagina zichtbaar voor de gebruiker	77

c) Eigenschappen van een Tekenpagina	78

7.2 De tekenvormen in Draw	78

a) Een tekenvorm invoegen	78

b) Plaatsen van de vorm	79

c) Andere functionaliteiten van vormen	80

7.3 Afbeeldingen in Draw	80

a) Invoegen van een afbeelding	80

b) Plaatsen van een afbeelding	81

c) Afmetingen aanpassen van een afbeelding	81

d) Meerdere afbeeldingen invoegen	82

e) Een afbeelding bij zijn naam vinden	82

8 Presentatie in Impress	84

8.1 Identieke functies als Draw	84

8.2 Specifieke functies in Impress	84

9 De vormen : algemene functies voor alle toepassingen	85

9.1 Eigenschappen van vormen	85

a) Achtergrondkleur van de vorm	85

b) Vorm met een schaduw	85

c) Rotatie van de vorm	85

d) Effect parallelogram	86

e) Verschijning van de omtreklijn	86

f) Recapitulerend voorbeeld	87

9.2 Tekenen van vormen	88

a) De verschillende basisvormen	88

b) De rechthoek	89

c) De ellips	89

d) De rechte lijn	90

e) De gebroken lijn	91

f) De Veelhoek	91

g) Meerdere vormen combineren	92

h) Relatieve verplaatsing van de vormen	93

i) Groeperen van vormen	93

9.3 Tekst in de vorm schrijven	94

9.4 Vinden van een vorm	95

a) Vinden van geselecteerde vormen door de gebruiker	95

b) Een vorm een naam geven	95

c) Een vorm terugvinden bij zijn naam	95

d) Zichtbaar selecteren van een vorm	96

10 Aanvullende informatie	97

10.1 Basic vereenvoudigt het gebruik van de API	97

a) De optionele haken	97

b) De getXxxx en setXxxx	97

c) Toegang tot eigenschappen	97

10.2 Wat is een woord?	97

10.3 De verschrikkelijke constanten	98

10.4 De kleuren	98

10.5 Raadplegen van de API	100

11 Credits	102

12 Licentie	102

Introductie

OpenOffice maakt gebruik van een machtige macrotaal, Basic, die is opgenomen in het produkt. Naast de klassieke programmeer-mogelijkheden, staat het het bewerken van de inhoud van documenten van Writer, Calc, etc. toe. Daarbij maakte het gebruik van de programmeer-interface ( API ) van OpenOffice.

Het doel van dit document is te tonen hoe de API te gebruiken met BASIC-macro’s om OpenOffice documenten te creëren en te bewerken. De gegeven voorbeelden in dit document (en de vele variaties) zijn getest door de auteur.

De API is “ object-georiënteerd ”. De kennis van het programmeer-object helpt u het te begrijpen, maar ik ga niet in op het onderwerp. Dit document is bedoeld voor de “ kleine gebruiker ” die geen professionele programmeur is en die simpele antwoorden zoekt voor zijn wensen.

Ik gebruik een vereenvoudigde vorm om BASIC weer te geven, die enigszins overeenkomt met de geldige vormen in JAVA en andere talen.

Hoe kwam dit document tot stand

Voordat u dit document leest, heeft u enige kennis van de basis van programmeren nodig, en moet u enige documentatie over de OpenOffice Basic-taal zelf hebben gelezen.

De on-line Help van Basic is in het Nederlands in de versie 1.1 van OpenOffice, maar is geen startpunt voor beginners. U kunt een kleine cursus Virtual Basic vinden, gratis en in het Frans, op de website http://www.vbasic.org/VBcours.htm . En, afgezien van de hoofdstukken 1 en 2, is die cursus toepasbaar op OOo Basic.

Het meest interessante document StarOffice 6.0 Software Basic Programmer's Guide is alleen beschikbaar in het Engels.
De gids “ Useful Macro Information For OpenOffice ” van Andrew Pitonyak is beschikbaar in een Franse vertaling op de website fr.OpenOffice.org (Elements de programmation des macros dans Ooo). De hoofdstukken 10 en volgende beschrijven de bestanddelen van de Basic-taal; de rest van het document is niet echt toegankelijk voor mensen die niet thuis zijn in de API.

Lees daarna de “ HowTo ” “ Comment utiliser des macros Basic dans OpenOffice.org ”, beschikbaar in de sectie documentation HowTo op de Franse internetsite van OpenOffice. U bent dan in staat de macro-editor te openen, een bestaande macro te lezen of er een te creëren.

Na deze basis, ga door met het lezen van de hoofdstukken 2 tot 4. Als u in principe geïnteresseerd bent in de documenten van Writer of Draw, etc, spring daarna na die hoofdstukken. Eventueel brengt een hyperlink-koppeling u naar een ander hoofdstuk, dat een bepaald onderwerp verder uitwerkt. Gebruik de Navigator om naar de paragrafen te gaan die uw interesse hebben.
Als u Engels leest, staat het hoofdstuk De API raadplegen u toe zich te verdiepen in een onderwerp.

Aarzel niet om kleine proefmacro's te maken met behulp van de verstrekte gegevens. Gebruik vooral veel het Knippen/Plakken om de opdrachtregels te kopiëren vanuit deze Howto naar een bestaande macro.

Waarschuwing

Dit document is gebaseerd op de beschikbare API voor de versie 1.0.x van OpenOffice. De versies 1.1.x en volgende kunnen gedeeltelijk niet uitwisselbaar zijn.
De verificatie van dit document met de versie 1.1 is tot op heden geen enkel probleem geweest.

Macrorecorder

Met ingang van de versie 1.1 van OpenOffice, is een Macrorecorder beschikbaar. Die stelt u in staat herhalende handelingen uit te voeren met behulp van de gebruikersinterface van Writer of Calc.

Let er op dat de verkregen macro’s niet werken in de versies 1.0.x van OpenOffice.

De gegenereerde code door de recorder helpt u niet bij het zelf maken van een macro. Hij gebruikt een specifieke interface (de functie dispatch) die de gebruikersinterface bewerkt, echter slechts voor dat ene doel (herhaling van een gebruikershandeling) maar is ook zwaar. Het grootste gedeelte van de gegenereerde code wordt niet geoptimaliseerd.

Nadat u een bepaalde kennis van de macrotaal en de API heeft gekregen, kan de macrorecorder u van dienst zijn bij het realiseren van functies via de gebruikersinterface, bijvoorbeeld als u het betreffende gedeelte niet vindt in de API.

Evolutie van het document

Belangrijkste evoluties sinds de versie van 07/08/2003

Wijzigingen

h 1.1	Signaleren van een kleine cursus VB gratis op internet (Franstalig).

h 3.2	Correctie van de laatste regel : het URL-adres kan geen internet-adres zijn.

h 3.5	Nieuw : de objecten StarDeskTop en ThisComponent zijn nu beschreven in de API.

h 5.1	herschrijven van de beschrijving van de pagina's in Calc

h 7.1	herschrijven van de beschrijving van de pagina's in Draw

h 9.4 a)	nadere precisering mbt het gebruik van CurrentSelection

h 10.5	Nieuw, signaleren van de Extra Xray

Toevoegingen

h 5.10 c)	Kleur van het teken

h 5.11	Opmaken van celbereiken

Karakteristieken van OOo Basic

Toegang tot macro’s

Via het menu Extra / Macro's... krijgt u een venster waarin rechts een boomstructuur. De mappen in de boomstructuur zijn de modules. Elke module kan meerdere macro’s bevatten.

De boom soffice bestaat uit meerdere bibliotheken (Engels: libraries), die weer uit modules bestaan. Er bestaan een aantal voorgedefinieerde macro's in die boom. Lezen daarvan is inspannend, maar leerzaam. De bibliotheek standard van soffice bevat de macro's die beschikbaar zijn in alle documenten van OpenOffice. Elke module van de bibliotheek standard staat in een bestand *.xba in de map OpenOffice.org/user/basic/Standard.

Elk geopend document bezit een boom met zijn modules, waarin een bibliotheek standard. De bibliotheek standard van een document bevat de macro’s, gespecificeerd in dat document. Elke module heeft een documentobject xml geïntegreerd in het bestand van het document.

Als meerdere documenten tegelijkertijd zijn geopend, geeft de boomstructuur u toegang tot alle macro’s van de documenten ! Wees er attent op dat u uw macro in het juiste document definieert !

Om een macro te schrijven kunt u de geïntegreerde editor in OpenOffice gebruiken, maar ook een externe editor, maar gebruik OpenOffice Writer niet, die is daar niet voor geschikt.

In de macro-editor heeft u het voordeel van de zeer bruikbare gekleurde syntax-weergave, die ik hier niet kan laten zien. Ik raad u aan de voorbeelden in de macro-editor te kopiëren/over te nemen en ze van daaruit uit te voeren.

Uiterlijk en leesbaarheid

Dit document gebruikt specifieke stijlen voor de macroinstructies :

Alineaopmaak : Macroregel

Tekenopmaak : MacroInstructie

Tekenopmaak : GewijzigdeMacroInstructie

Tekenopmaak : VariabeleNaam

Pas eventueel de stijlen aan als u moeilijkheden heeft met het lezen of afdrukken, door het gehele document.

Lezen van het document op het scherm staat u toe direct naar het onderwerp te springen dat uw interesse heeft met de Navigator of de hypertekst-koppelingen.

Basic OOo is niet Hoofdlettergevoelig. Het begrijpt de namen voor de variabelen en de gereserveerde namen, maar gebruik van Hoofd- en kleine letters verhoogt de leesbaarheid. In tegenstelling daaraan moeten bepaalde elementen uit de API worden geschreven met Hoofd- of kleine letters, u komt ze tegen in het document.

U mag een aantal lege spaties tussen twee woorden Basic invoegen. De lege ruimten worden ook genegeerd door Basic.

Een commentaar begint met Rem ( niet verplicht aan het begin van de regel) en eindigt aan het eind van de regel. Een enkel aanhalingsteken ' is hetzelfde als een Rem.

In de voorkomende voorbeelden, heb ik in het algemeen de namen van de variabelen aangeduid met een Nederlandse naam om het onderscheid aan te geven tussen de basale BASIC en ook het ”magisch formuleren” wat op te helderen. Ik vind dit helderder dan de gebruikte methode van coderen met behulp van een Engelse naam, voorafgegaan door een letter ( oCel voor : object Cel )

Definities van de variabelen

Advies :

Voeg aan het begin van uw module altijd de macroinstructie toe

Option Explicit

Dankzij deze instructie, krijgt u een foutmelding voor elke variabele die niet gedefinieerd is, of verkeerd gespeld.

Definieer elke variabele met zijn expliciete type. Geef een duidelijk herkenbare naam aan uw belangrijke variabelen. Het is misschien een beetje extra tikwerk, maar wel extra duidelijk, en u verkleint waarschijnlijk de tijd die u nodig heeft om fouten in het programma op te sporen.

Voorbeeld

OPTION EXPLICIT

' algemene variabelen in de gehele module

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object

Sub DeSamenstellers

Dim celIndex As Object, celEgaal As Object ' lokale variabelen

Dim y1 As Integer, x2 As Integer ' lokale variabelen in het verdere programma

rem -- hier de instructies voor de subroutine --

End Sub

Opmerking :

Als u meerdere variabelen definieert met dezelfde Dim, herhaal het type dan voor elke apart. Variabelen zonder typeaanduiding worden verondersteld Variant te zijn (het type wordt vastgesteld bij de uitvoering).

Dim naam3, naam4 As Long rem naam3 is een Variant

Hier kan het een bizar effect hebben, een Variant werd geïnitialiseerd met “ nul ”.

Vinden van het document

Initialiseer een variabel object om te verwijzen naar het te bewerken document .

Het document als klasse

In het algemeen is het document waarin de macro werkt, het document waarvan het venster is geopend ( zij heeft de “ focus ” ). De initialisatie ziet er als volgt uit :

Dim MijnDocument As Object

MijnDocument = ThisComponent

Toegang tot een ander, bestaand, document

Om een bestaand document aan te wijzen, zonder dat expliciet aan te duiden :

Dim MijnDocument As Object

Dim AdresDoc As String

Dim EigBestand()

AdresDoc = "file:///home/testuser//work/eendocument.sxc"

MijnDocument = StarDesktop.LoadComponentFromURL(AdresDoc,"_blank",0, EigBestand)

U kunt het merendeel van de regels gebruiken zonder ze te begrijpen. U hoeft alleen maar de regel te kopiëren die AdresDoc definieert. Dat adres is hieronder weergegeven in de vorm van een URL. Voor de Windows-gebruikers: zie hier het equivalent :

C:\Mijn Documenten\tata.sxc	file:///C|/Mijn%20Documenten/tata.sxc

Basic beschikt over een commando om Windows- in URL-adressering te converteren, voorbeeld :

AdresDoc = convertToURL("C:\Documents and Settings\Arthur\Mijn documenten\Mijn Klein Doc.sxw")

Merk op dat de URL ook een bestand kan aanduiden op het lokale netwerk.

Creëren van een nieuw document

De methode is ongeveer hetzelfde als in het vorige hoofdstuk, maar gebruikt hier een magisch adres, dat afhankelijk is van het document-type ; bijvoorbeeld voor een Calc document :

Dim MijnDocument As Object

Dim AdresDoc As String

Dim EigBestand()

AdresDoc = "private:factory/scalc"

MijnDocument = StarDesktop.LoadComponentFromURL(AdresDoc,"_blank",0, EigBestand)

Type nieuw document	Magisch Adres
Writer Tekst	private:factory/swriter
Calc Werkbladdocument	private:factory/scalc
Draw Tekening	private:factory/sdraw
Impress Presentatie	private:factory/simpress
Math Formule	private:factory/smath

Deze documenten zijn gebaseerd op het standaardmodel zoals dat geldig was bij de configuratie van OpenOffice.

Creëer een nieuw document aan de hand van een sjabloon

Om een nieuw document te maken zoals een bepaald sjabloon, voeg AdresDoc toe aan het pad van uw sjablonen.

AdresDoc = convertToURL("C:\Mijn modules\Doc2kolommen.stw")

Het is zeer praktisch om direct een verzamelingen stijlen naar uw smaak, de voorgedefinieerde Calc werkbladdocumenten, een kop- of voettekst, een pagina-indeling in kolommen, of een basistekst die wordt gecompleteerd door de macro, in te stellen.

Enkele aanvullende details

StarDesktop

Het object StarDesktop vereenvoudigt de zaken. Zonder dat zou men schrijven :

Dim MijnBureaublad As Object, MijnDocument As Object

Dim AdresDoc As String

Dim EigBestand()

MijnBureaublad = createUnoService("com.sun.star.frame.Desktop")

AdresDoc = "private:factory/scalc"

MijnDocument = MijnBureaublad.LoadComponentFromURL(AdresDoc,"_blank",0, EigBestand)

ThisComponent

Het object ThisComponent vereenvoudigt de zaken.

Als de macro in de module van een document staat, wordt alleen dat document in aanmerking genomen, zelfs als men de macro vanuit een ander geopend document aanroept. Als de macro aanwezig is in een module van soffice, vertegenwoordigt ThisComponent het vanaf waar men de macro aanroept.

Men ziet vaak de volgende regels (verNederlandst) :

MijnBureaublad = createUnoService("com.sun.star.frame.Desktop")

MijnDocument = MijnBureaublad.getCurrentComponent()

MijnTekst = MijnDocument.Tekst

hetgeen niet het equivalent is van

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Tekst

maar van :

MijnDocument = StarDesktop.CurrentComponent

MijnTekst = MijnDocument.Tekst

Als u de eerste regel van de macro uitvoert in de EDI (het venster waarin de macro’s worden weergegeven), zal de derde regel een fout oproepen : methode eigenschap onvindbaar. Omdat getCurrentComponent refereert naar het EDI-venster, en niet naar het document waarin de macro wordt uitgevoerd.

De tweede regel functioneert ook in de EDI, bewijzend dat ThisComponent wel werkt. Als u uw macro’s wilt uitvoeren in de EDI en profiteren van de foutopsporings-faciliteiten, gebruik dan dus ThisComponent.

Argumenten van LoadComponentFromURL

LoadComponentFromURL laadt een document; het wordt weergegeven in een kader (een venster).

Het tweede argument van LoadComponentFromURL is de naam van het opgeroepen kader. Als een kader (een venster) wordt aangeroepen met een bestaande naam, verschijnt het document daarin. Er bestaan bepaalde gereserveerde namen (zie API), maar die heeft u waarschijnlijk niet nodig.

Het derde argument van LoadComponentFromURL wordt meestal niet gebruikt (waarde nul).

Het vierde argument vermeldt de gewenste eigenschappen van het bestand, zie hieronder.

Eigenschappen om een document te openen

U zult bepaalde informatie moeten specificeren, omschreven in de API, zie de service MediaDescriptor. Zulke informatie bezit het structuurtype Eigenschap; die Eigenschap bestaat uit een Naam (Name) en een Waarde (Value). Als u geen bepaalde informatie wilt invoegen, moet u tenminste een zichtbaar element invoegen, zoals aangegeven hierboven.

Als voorbeeld, openen van een document, beveiligd door een wachtwoord :

Dim MijnDocument As Object

Dim AdresDoc As String

Dim EigBestand(0) As New com.sun.star.beans.PropertyValue

AdresDoc = "file:///home/testuser//work/Financiën.sxc"

EigBestand(0).Name = "Wachtwoord"

EigBestand(0).Value = "Arthur1987"

MijnDocument = StarDesktop.LoadComponentFromURL(AdresDoc,"_blank",0, EigBestand() )

Respecteer Hoofd- en kleine letters voor de naam van de Eigenschap. Let er ook op dat u EigBestand moet definiëren als een vector aan een element, en dat de haakjes verplicht zijn in de laatste regel. Voor 3 gelijktijdige eigenschappen, moet EigBestand worden gedefinieerd als :

Dim EigBestand(2) As New com.sun.star.beans.PropertyValue

Belangrijkste eigenschappen om een document te openen

Eigenschappen	Betekenis
AsTemplate	boolean; gebruikt als men werkt vanuit een sjabloon. waarde true : (standaard) een nieuw document zonder titel wordt gemaakt aan de hand van een sjabloon in de URL ; waarde false : het sjabloon wordt geopend om te bewerken. Opmerking Met AsTemplate = true en een AdresDoc corresponderend naar een gewoon document (geen sjabloon) krijgt men een nieuw document gebaseerd op dat waarnaar men verwijst.
Hidden	boolean ; waarde true om het document te laden zonder zichtbaar te zijn
Password	tekenreeks; wachtwoord om het document mee te openen
ReadOnly	boolean ; waarde true om het document als Alleen-Lezen te openen (voor de gebruiker, niet voor de API)

Het document opslaan

Bij verlaten, nagaan of het document gewijzigd is ? Hiermee test u dat :

if MijnDocument.isModified then

rem plaats hier de instructies om het document te bewaren

end if

Als u een bestaand document heeft bewerkt, is het opslaan heel eenvoudig :

MijnDocument.Store

Als u een nieuw document heeft geopend, moet u de naam en het adres waar het moet worden bewaard opgeven; men gebruikt daarvoor een URL.

U zult bepaalde informatie moeten specificeren, omschreven in de API, zie de service MediaDescriptor. Zulke informatie is van het structuurtype Eigenschap; die Eigenschap bestaat uit een Naam (Name) en een Waarde (Value). Als u geen bepaalde informatie wilt invoegen, moet u tenminste een zichtbaar element invoegen.

Dit voorbeeld overschrijft het document met dezelfde naam en hetzelfde adres:

Dim MijnDocument As Object

Dim NaamvanBestand As String

Dim EigBestand()

NaamvanBestand = "file:///C:/Werk/blabla.sxw"

MijnDocument = ThisComponent

MijnDocument.storeAsURL(NaamvanBestand, EigBestand)

Om een bestaand document niet te overschrijven, gebruikt men de eigenschap Overwrite :

Dim MijnDocument As Object

Dim NaamvanBestand As String

Dim EigBestand(0) As New com.sun.star.beans.PropertyValue

NaamvanBestand = "file:///C:/Werk/__blabla.sxw"

MijnDocument = ThisComponent

EigBestand(0).Name = "Overwrite"

EigBestand(0).Value = false

MijnDocument.storeAsURL(NaamvanBestand, EigBestand() )

Dit zal een foutmelding geven (afgehandeld via het programma) als het document al bestaat.

Respecteer Hoofd- en kleine letters voor de naam van de Eigenschap. Let er ook op dat u EigBestand definieert als een vector aan een element, en dat de haakjes verplicht zijn in de laatste regel. Voor 3 gelijktijdige eigenschappen, wordt EigBestand als volgt gedeinieerd :

Dim EigBestand(2) As New com.sun.star.beans.PropertyValue

Belangrijkste eigenschappen om het document te registreren

Eigenschap	Betekenis
Author	een tekenreeks om uw ego te strelen
Version	integer getal
Password	tekenreeks ; wachtwoord om het beveiligde document te openen

Opslaan als / Een kopie opslaan als

De methode storeAsURL is hetzelfde als in het menu Bestand / Opslaan als...

Als u heeft geopend het document TOTO en u heeft het opgeslagen als TATA, werkt u momenteel in het document TATA.

Tegengesteld, de methode storeToURL maakt een kopie van het document, en dat alleen. Dus, werkend in TOTO, maakt u een kopie genaamd TATA en werkt door in TOTO. Gebruikt om uw werk regelmatig op te slaan.

De methode storeToURL gebruikt dezelfde syntaxis als storeAsURL.

Het document sluiten

De methode Dispose sluit het document en daarmee het venster waarin het werd weergegeven. Voorbeeld :

Dim EenDocument As Object

Dim AdresDoc As String

AdresDoc = "file:///C:/Teksten/blabla.sxw"

EenDocument = StarDesktop.LoadComponentFromURL(AdresDoc,"_blank",0, EigBestand)

print "Document geopend !"

EenDocument.Dispose

Calc werkbladen

Vinden van het werkblad

Voordat u kunt beginnen met werken in de cellen moet u precies aangeven in welk document ze staan en op welk blad.

Een bestaand blad

Elk werkblad van Calc heeft een tab. De naam van de tabs is standaard, in de gelokaliseerde Nederlandse versie, Werkblad1, Werkblad2, etc.

Met de API kan men ook op een blad komen :

Dim MijnDocument As Object

Dim MijnBlad As Object, DeBladen As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

print "Aantal bladen : "; DeBladen.Count

MijnBlad = DeBladen(0) ' Eerste blad

Sheets verschaft de verzameling bladen van het document. Count geeft het aantal bestaande bladen. Elk blad is toegankelijk via een index.

Men zou de variabele DeBladen ook kunnen toekennen zoals beschreven in de regel hieronder :

MijnBlad = MijnDocument.Sheets(0) ' Eerste werkblad

Attentie

Voor de API worden de pagina's genummerd vanaf nul, in de volgorde waarin zij worden weergegeven door de Calc interface. Ook als de gebruiker de volgorde van de bladen verandert, de geschreven macro blijft voor het blad bij de rang n.

Een betere methode bestaat uit het terugvinden van het blad via een gegeven naam :

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

MijnBlad = DeBladen.getByName("Oeuvres")

Men kan testen of een blad met een bepaalde naam bestaat :

if DeBladen.hasByName("Oeuvres") then

rem het blad bestaat al !

end if

Creëren, hernoemen, dupliceren en verwijderen van een blad

Creëren van een ongerept blad

De methode insertNewByName voegt een nieuw ongerept blad in op een aangegeven positie tussen de bladen van het document en geeft het een naam.

Dim MijnDocument As Object, DeBladen As Object

Dim NieuwBlad As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

' voeg ongerept blad XXX in na het tweede blad

DeBladen.insertNewByName("Totalisatie", 2)

NieuwBlad = DeBladen.getByName("Totalisatie")

Hernoemen van een blad

Hernoemen van een blad bestaat uit het wijzigen van de eigenschap Name van het blad.

MijnBlad = DeBladen.getByName("Maand")

MijnBlad.Name = "Februari"

Verplaatsen van een blad

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

MijnBlad = DeBladen.getByName("Februari")

' Verplaatsen naar de tweede positie

DeBladen.moveByName("Februari", 1)

Dupliceren van een blad

Dim MijnDocument As Object, DeBladen As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

' maak een kopie op de derde positie

DeBladen.CopyByName("Februari", "Maart", 2)

Het nieuwe blad Maart is een exacte kopie van het blad Februari, met diens inhoud.

Verwijderen van een blad

Dim MijnDocument As Object, DeBladen As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

DeBladen.removeByName("Februari")

Het blad zichtbaar voor de gebruiker

Het blad zichtbaar maken voor de gebruiker kan zo :

MijnBlad = MijnDocument.CurrentController.ActiveSheet

print "De naam van het actieve blad is : "; MijnBlad.Name

En om een ander blad zichtbaar te maken :

MijnBlad = MijnDocument.Sheets(1)

MijnDocument.CurrentController.ActiveSheet = MijnBlad

Vinden van de cel

Om een cel te bewerken, moet ik een tussen-variabele definiëren die naar de cel verwijst.

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object, EenCel As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

MijnBlad = DeBladen.getByName("Werkblad3")

EenCel = MijnBlad.getCellByPosition(3,5) ' cel D6

De parameters van getCellByPosition(x,y) zijn :

x = kolomnummer, met 0 voor A, 1 voor B, 25 voor Z, etc

y = rijnummer, met 0 voor rij 1, 1 voor rij 2, etc.

We vinden deze methode voor positionering ook terug in andere functies.

Celbereik

Bewerken van een celbereik

Er bestaat een objecttype “ celbereik ”. U kunt een celbereik op verschillende manieren definiëren :

Dim EenBereik As Object

Rem celbereik B1 t/m C6 op het 4e blad van een werkbladdocument

EenBereik = getCellRange(MijnDocument, 3, 1, 0, 2, 5)

Rem celbereik op een bepaald blad

EenBereik = MijnBlad.getCellRangeByName("B1:C6")

EenBereik = MijnBlad.getCellRangeByName("$B2") ' bereik van 1 cel

EenBereik = MijnBlad.getCellRangeByName("BereikNaam")

EenBereik = MijnBlad.getCellRangeByPosition(1,0,2,5) ' bereik B1:C6

Een cel in een bereik aanduiden :

EenCel = EenBereik.getCellByPosition(3,5)

De hier genoemde coördinaten, altijd genummerd vanaf nul, zijn relatief aan de linkerbovenhoek van het bereik.

Als het bereik bestaat uit een enkele cel, kan men volstaan met een verwijzing naar die cel :

EenCel = MijnBlad.getCellRangeByName("C13")

Opmerking :

We hebben twee mogelijkheden gezien van het gebruik van getCellByPosition :

MijnBlad.getCellByPosition(3,5)

EenBereik.getCellByPosition(3,5)

Het is nuttig om te weten dat het niet dezelfde functie betreft, maar twee gelijksoortige functies.

In het eerste geval wordt de functie gespecificeerd voor een object van het type blad, in het tweede geval is de functie gespecificeerd voor een object van het type celbereik. Dit concept is typisch voor object-georiënteerde ontwikkeling : elk type object bezit variabelen, procedures en functies die daarvoor bestemd zijn; het is gebruikelijk dezelfde naam over te nemen tussen twee object-typen, wanneer de functies gelijksoortig zijn. Als consequentie, om de dubbelzinnigheid op te heffen, vermeld men de naam van de functie of procedure of variabele vóór de naam van het object.

Als u een dag door de documentatie van de API wandelt, zult u meerdere eensluidende namen voor functies en procedures vinden. U kunt ze niet gebruiken zonder te weten aan welk type object zij toebehoren.

Celbereiken geselecteerd door de gebruiker

De gebruiker wil een celbereik selecteren, daarna een macro aanroepen. De volgende regels selecteren het geselecteerde celbereik.

Dim MijnDocument As Object

Dim EenBereik As Object

MijnDocument = ThisComponent

EenBereik = MijnDocument.CurrentSelection

De gebruiker zou meerdere bereiken per keer willen selecteren, in plaats van een enkel bereik. In dat geval, CurrentSelection levert een lijst met geselecteerde bereiken. Men heeft dus een loop nodig om de successievelijke bereiken te vinden. De naam van de bereiken staat in de eigenschap Count.

Dim MijnDocument As Object

Dim EenBereik As Object, DeSelecties As Object

Dim selx As Integer

MijnDocument = ThisComponent

DeSelecties = MijnDocument.CurrentSelection

for selx = 0 to DeSelecties.Count -1

EenBereik = DeSelecties (selx)

rem gebruik hier een van de geselecteerde bereiken

next

Als u er niet zeker van bent dat de gebruiker een enkel bereik heeft geselecteerd, gebruik dan de code hieronder. Als er geen enkele selectie is wordt de loop for niet uitgevoerd.

Zichtbaar selecteren van een celbereik

Het doel is een bereik, via een macro, te selecteren en die selectie voor de gebruiker weer te geven. Het vereist een speciale instructie, die een aangewezen cel of een celbereik gebruikt :

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object, EenBereik As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

MijnBlad = DeBladen.getByName("Blad3")

EenBereik = MijnBlad.getCellRangeByName("B2:F6")

MijnDocument.CurrentController.Select(EenBereik)

Als u de macro wilt uitvoeren in de Editor, open dan voorafgaand het Calc-venster om de selectie te bekijken.

U heeft natuurlijk gezien dat het betreffende blad wordt weergegeven.

De coördinaten van een cel terugvinden

Nu we een celbereik hebben verkregen en een cel zoeken in dat bereik, is het soms wel eens handig als we de absolute coördinaten van een bereik of een cel weten.

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object, EenBereik As Object, EenCel As Object

Dim CoordCel As Object, CoordBereik As Object

Dim HuidigBlad As Integer, HuidigeKolom As Integer

Dim HuidigeRij As Integer, BladBereik As Integer

Dim EersteKolomBereik As Integer, LaatsteKolomBereik As Integer

Dim EersteRijBereik As Integer, LaatsteRijBereik As Integer

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

MijnBlad = DeBladen.getByName("Werkblad3")

EenBereik = MijnBlad.getCellRangeByName("B1:G6")

EenCel = EenBereik.getCellByPosition(2,4) ' positie in het bereik

CoordCel = EenCel.CellAddress

HuidigBlad = CoordCel.Sheet

HuidigeKolom = CoordCel.Column

HuidigeRij = CoordCel.Row

CoordBereik = EenBereik.RangeAddress

BladBereik = CoordBereik.Sheet

EersteKolomBereik = CoordBereik.StartColumn

LaatsteKolomBereik = CoordBereik.EndColumn

EersteRijBereik = CoordBereik.StartRow

LaatsteRijBereik = CoordBereik.EndRow

Merk de eensluidende instructies voor een cel en een bereik op.

Ook hier zijn de verkregen coördinaten genummerd vanaf nul.

Het inhoudstype van een cel weten

Nadat we de regels in de voorgaande hoofdstukken hebben gelezen, kan men nu in de cel lezen en schrijven. Maar de instructies hangen af van de soort informatie om te bewerken.

De inhoud van een cel kan bestaan uit vier mogelijke typen :

lege cel

numerieke waarde

een tekst

een formule(die een waarde of een tekst zal opleveren)

Type levert het inhoudstype van de cel, in de vorm van een getal.

Om onafhankelijk te zijn van de implementatie (die kan veranderen), moet elk type worden gedefinieerd met een voorgedefinieerde constante, waarvan ik het gebruik uitleg in het hoofdstuk De verschrikkelijke constanten.

Dit voorbeeld somt de constanten op en laat de gebruiker weten welke inhoud een cel heeft :

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object, EenCel As Object

Dim InhTekst As Integer, InhWaarde As Integer

Dim InhFormule As Integer, InhLeeg As Integer

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

MijnBlad = DeBladen.getByName("Werkblad2")

EenCel = MijnBlad.getCellByPosition(2,9) ' cel C10

rem constanten van de inhoudstypen

InhLeeg= com.sun.star.table.CellContentType.EMPTY

InhWaarde= com.sun.star.table.CellContentType.VALUE

InhTekst= com.sun.star.table.CellContentType.TEXT

InhFormule= com.sun.star.table.CellContentType.FORMULA

Select Case EenCel.Type

Case InhLeeg

Print "Leeg!"

Case InhFormule

Print "Formule"

Case InhWaarde

Print "Waarde"

Case InhTekst

Print "Tekst"

End Select

Numerieke waarde in een cel

Inlezen en schrijven van een numerieke waarde in een cel :

Dim x2 As Integer

x2 = EenCel.Value

x2 = x2 + 17

EenCel.Value = x2

Attentie : Value geeft het numerieke resultaat van de formule die u in de cel vind. Als de cel een tekst bevat, of als de formule een tekst weergeeft, getValue geeft nul weer.

Tekst in de cel

Inlezen en schrijven van een tekenreeks in de cel :

Dim tx3 As String

tx3 = EenCel.String

EenCel.String = "Goedenavond"

De laatste instructie overschrijft alle tekst die in de cel staat. Het kan ook anders, maar dat is nogal gecompliceerd. Het principe kunt u echter terugvinden door de tekst in Writer of ergens anders te schrijven.

De tekstcursor in de cel

Om een tekst te schrijven in een bestaande tekst in een cel, hebben we een tekstcursor nodig. De cursor geeft de plaats van invoegen aan voor de nieuwe tekst en vervolgt bij elke invoeging.

De volgende regels voegen een tekst toe, rechts van de reeds bestaande tekst in de cel:

Dim MijnCursor As Object

tx3 = "Goedendag"

MijnCursor = EenCel.createTextCursor

EenCel.insertString(MijnCursor, tx3, false)

EenCel.insertString(MijnCursor, " de vrienden ", false)

De cursor wordt bij zijn aanmaak gecreëerd aan het einde van de bestaande tekst in de cel. Het beheer van de tekstcursor wordt beschreven in het volgende hoofdstuk.

In de procedure insertString bepaalt het derde argument :

false = invoegen in de tekst

true = overschrijven in de tekst

Speciale tekens in een tekst

Zelfs in een enkele cel kan men een tekst-alinea-einde invoegen :

Dim AlineaEinde As Integer

AlineaEinde = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK

EenCel.insertControlCharacter(MijnCursor, AlineaEinde, false)

Er bestaat een lijst van gelijksoortige verschrikkelijke constanten :

Constante	Betekenis
PARAGRAPH_BREAK	alinea-einde
LINE_BREAK	regeleinde
HARD_HYPHEN	onvoorwaardelijk afbreken
SOFT_HYPHEN	voorwaardelijk afbreken
HARD_SPACE	onvoorwaardelijke spatie

Plaatsing van de tekstcursor in een cel

Om op een bepaalde plaats in te voegen moeten we de plaats van de cursor bepalen.

MijnCursor.goLeft(23, false) ' verplaatst 23 tekens naar links

MijnCursor.goRight(12, false) ' verplaatst 12 tekens naar rechts

MijnCursor.gotoStart(false) ' aan het begin van de tekst

MijnCursor.gotoEnd(false) ' aan het einde van de tekst

Het laatste argument van de cursor-routine bepaalt :

false = plaats de cursor

true = plaats de cursor en breidt de selectie uit (zoals het slepen met de muis)

Men kan dus een bereik van meerdere tekens selecteren; Maar ook kan men de geselecteerde tekst terugkrijgen met :

tx3 = MijnCursor.String

Anderzijds kan men een geselecteerde tekst overschrijven door een nieuwe tekst :

MijnCursor.String = "Goedenavond"

Ook bestaan nog : collapseToStart, collapseToEnd, isCollapsed, gotoRange.

Overige informatie over de cursor : bekijk in de API : XTextCursor en XTextRange

Formule in de cel

Lees een formule in de cel in :

Dim tx3 As String

tx3 = EenCel.Formula 'de formule in de Engelse versie

tx3 = EenCel.FormulaLocal 'de formule in de gelokaliseerde versie

Als de cel bevat =Nu() krijgt u =Now() in de Engelse versie.

Een formule in de cel schrijven, in de gelokaliseerde versie :

Dim x2 As Integer

x2 = 5

EenCel.FormulaLocal= "=Kolom(AnderBlad.A" + LTrim(Str(x2))+")"

De numerieke variabele x2 wordt omgezet in een tekenreeks, LTrim dient om de ruimte voor het cijfer op te heffen. Resultaat : de formule verwijst naar de cel A5 op het werkblad “AnderBlad” :

=KOLOM(AnderBlad.A5)

Men krijgt hetzelfde resultaat met de Engelse formulering :

EenCel.Formula= "=Column(AnderBlad.A" + LTrim(Str(x2))+")"

Herberekenen van de formules in de cellen

Zie hier hoe u de formules herberekent in alle cellen van het werkblad :

MijnDocument.calculateAll

In een zeer complex werkblad, kunt u het herberekenen beperken tot cellen die niet bijgewerkt zijn :

MijnDocument.calculate

De herberekening gebeurt normaal gesproken automatisch. U kunt dat deactiveren om onnodig herberekenen te voorkomen en om het weer te activeren als u dat nodig vindt.

rem automatisch herberekenen uitschakelen

MijnDocument.enableAutomaticCalculation(false)

rem - - uw bewerkingen uitvoeren - -

rem automatisch herberekenen inschakelen

MijnDocument.enableAutomaticCalculation(true)

Daarnaast kunt u controleren of de automatische functie actief is :

if MijnDocument.isAutomaticCalculationEnabled then

rem de automatische herberekening is momenteel actief

end if

De opmaak van een cel aanpassen

Tot nu toe hebben we nog geen wijzigingen aangebracht in de opmaak van de cellen. De tekst of de waarde zijn in de bestaande opmaak geschreven.

Er bestaat een groot aantal mogelijkheden voor de opmaak, kijk maar in de API bij CellProperties. De meest gangbare zijn hierna beschreven.

Opmaak van een cel

De meest snelle manier om een cel op te maken is door gebruik te maken van een celopmaakprofiel dat al is gedefinieerd in het werkblad. De eigenschap CellStyle is een tekenreeks die bestaat uit de naam van de opmaak. Men kan de huidige opmaak inlezen of de opmaak veranderen :

print EenCel.CellStyle

EenCel.CellStyle= "MijnOpmaak"

Attentie

Als u de huidige opmaak opvraagt, krijgt u, voor de standaard met Ooo meegeleverde celopmaakprofielen, de Engelse naam, zelfs met een gelokaliseerde versie van OOo. Overeenkomsten voor de Nederlandse versie :

Naam in Nederlands	Verkregen Engelse naam
Resultaat	Result
Resultaat2	Result2
Standaard	Default
Kop	Heading
Kop1	Heading1

Dus, in geval van twijfel, lees de naam van de celopmaak in met een kleine macro.

Tweede mogelijke probleem : de tekenreeks die het opmaakprofiel beïnvloedt moet exact zo geschreven worden als de bestaande opmaaknaam : Hoofdletters, kleine letters, accenten. Zo niet blijft de opmaak onveranderd.

De opmaakmogelijkheden die volgen zijn specifiek voor de betreffende cel, zij passen niet het celopmaakprofiel aan. Verder geeft het opvragen van de celopmaak steeds dezelfde naam weer, ook als de cel in werkelijkheid anders is opgemaakt.

Let er ook op dat celeigenschappen ook van toepassing kunnen zijn op een celbereik, bijvoorbeeld de kleur van de achtergrond.

Achtergrondkleur van de cel

EenCel.CellBackColor = RGB(255,255,204) ' lichtgeel

EenBereik.CellBackColor = RGB(255,255,204) ' kleurt het gehele bereik

De definitie van de kleuren wordt beschreven in het hoofdstuk Kleuren.

Kleur van het teken

EenCel.CharColor = RGB(200,0,0) ' rood

De definitie van de kleuren wordt beschreven in het hoofdstuk Kleuren.

Horizontaal uitlijnen

Nog meer verschrikkelijke constanten...

EenCel.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER

Belangrijkste mogelijke waarden :

Constante	Betekenis
STANDARD	Uitlijnen zonder rekening te houden met het inhoudstype (tekst, getal)
LEFT	Links uitlijnen
CENTER	Gecentreerd uitlijnen
RIGHT	Rechts uitlijnen

Verticaal uitlijnen

Nog meer verschrikkelijke constanten...

EenCel.VertJustify = com.sun.star.table.CellVertJustify.TOP

Vergroot de regelhoogte voor een beter zicht op het effect. Mogelijke waarden :

Constante	Betekenis
STANDARD	Uitlijnen zonder meer
TOP	Uitlijnen aan de bovenkant van de cel
CENTER	Uitlijnen in het midden van de celhoogte
BOTTOM	Uitlijnen aan de onderzijde van de cel

Verticale / Horizontale Oriëntatie

Nog meer verschrikkelijke constanten...

EenCel.Orientation = com.sun.star.table.CellOrientation.TOPBOTTOM

Mogelijke waarden :

Constante	Betekenis
STANDARD	Horizontaal, zeer simpel
TOPBOTTOM	Om in te lezen, helt over naar rechts voor een Europese tekst
BOTTOMTOP	Om in te lezen, helt over naar links voor een Europese tekst
STACKED	Elke letter staat horizontaal, de letters worden van boven naar beneden geplaatst.

Oriëntatie onder willekeurige hoek

EenCel.RotateAngle = 15*100

De waarde van de hoek wordt aangegeven in honderdsten van graden; het voorbeeld correspondeert met een hoek van 15°. Een positieve waarde correspondeert op trigonometrische wijze ( tegen de wijzers van de klok in).

Woordterugloop

De opmaak is handmatig toegankelijk voor : Celopmaak / uitlijnen / Tekstverloop, Regelafbreking. Een te lange tekst voor de lengte van de cel ” begint ” automatisch aan het begin van een nieuwe regel.

Het voorbeeld van de getoonde code test de huidige status en past die aan.

if EenCel.IsTextWrapped then

print "De regelafbreking is actief"

EenCel.IsTextWrapped= false 'schakel de Regelafbreking uit'

else

print "De Regelafbreking is niet aktief"

EenCel.IsTextWrapped= true 'schakel de Regelafbreking in'

end if

Opmaken van celbereiken

De mogelijkheden voor het opmaken van een cel zijn ook beschikbaar voor celbereiken en zelfs voor rijen of kolommen (zie verderop), en voor het gehele werkblad zoals in dit voorbeeld :

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object

MijnDocument = ThisComponent

DeMappen = MijnDocument.Sheets

MijnBlad = DeMappen.getByName("MooiBlad")

MijnBlad.CellBackColor = RGB(255,255,204) ' lichtgeel

MijnBlad.CharColor = RGB(200, 0, 0) ' rood

Rijen en kolommen

Definiëren van een serie kolommen

Een serie kolommen in een werkblad wordt gedefinieerd als een deel van een celbereik. Naar dat bereik kan men verwijzen als naar een enkele cel. De kolommen zijn cellen die ” overgaan ” in een bereik. De voorgaande definities overnemende, definieert men een object ” Serie Kolommen ” aldus:

Dim MijnKolommen As Object, MijnKolom As Object

Dim AantalKolommen As Long, AantalRijen As Long

EenBereik = MijnBlad.getCellRangeByName("B1:C6")

MijnKolommen = EenBereik.Columns

EenCel = getCellByPosition(3,5) ' cel D6

MijnKolom = EenCel.Columns

AantalKolommen = EenBereik.Columns.Count

AantalRijen = EenBereik.Rows.Count

Toevoegen of opheffen van kolommen

De kolommen worden genummerd vanaf nul.

Toevoegen van 3 gegroepeerde kolommen, geef de eerste ingave de stand 4 in de serie :

MijnKolommen.insertByIndex(4,3)

Attentie, beperking :

De methode insertByIndex weigert kolommen in te voegen aan de uiterste rechterzijde van een kolommenbereik. Om deze fout te voorkomen door ze rechts te plaatsen, voeg ze in op de positie nul.

Opheffen van 3 gegroepeerde kolommen, geef de eerste de stand 5 in de serie :

MijnKolommen.removeByIndex(5,3)

Optimale breedte van een kolom

Als u in een kolom van cellen teksten met verschillende lengten heeft, is het misschien handig de breedte van de kolom aan de waarde van de langste tekst aan te passen.

MijnKolom.OptimalWidth = TRUE

Toevoegen of opheffen van rijen

De instructies zijn nagenoeg identiek :

MijnRijen = EenBereik.Rows

MijnRij = EenCel.Rows

rem Toevoegen 5 gegroepeerde rijen,

rem geef de eerste de stand 2 in de serie

MijnRijen.insertByIndex(2,5)

MijnRijen.removeByIndex(5,3)

Verbergen van rijen of kolommen

Als men voor de gebruiker een kolom of rij wil verbergen. Onderstaand voorbeeld verbergt de rijen en kolommen in het bereik B2:C6.

Dim MijnBlad As Object, EenBereik As Object

Dim MijnKolommen As Object, MijnRijen As Object

MijnBlad = ThisComponent.Sheets(0)

EenBereik = MijnBlad.getCellRangeByName("B2:C6")

MijnKolommen = EenBereik.Columns

MijnKolommen.IsVisible = false

MijnRijen = EenBereik.Rows

MijnRijen.IsVisible = false

Zoals voor het merendeel van de eigenschappen, IsVisible is misschien handig om erachter te komen of een kolom of rij is verborgen. Voorbeeld :

EenCel = MijnBlad.getCellByPosition(3,5) ' cel D6

if EenCel.Rows.IsVisible and EenCel.Columns.IsVisible then

print "De cel is zichtbaar"

else

print "De cel is verborgen !"

end if

Bewerken van tabellen

Het is moeilijk achtereenvolgens in verscheidene cellen in te lezen / schrijven. Of, in het beste geval, moet men de bewerking in alle cellen van het bereik uitvoeren.

De instructies getDataArray en setDataArray staan bewerkingen toe in een variabel overzicht en de waarden vanaf/naar het celbereik over te brengen.

Het voorbeeld dat volgt voegt 2000 toe aan de inhoud in elke cel in het celbereik dat de gebruiker selecteert. We gaan er van uit dat de cellen getallen bevatten of leeg zijn.

Dim MijnDocument As Object

Dim EenBereik As Object

Dim x1 As Long, y1 As Long

Dim mijnWaarden As Double, BijRegel As Double, EenElement As Double

MijnDocument = ThisComponent

EenBereik = MijnDocument.CurrentSelection

mijnWaarden = EenBereik.getDataArray

for y1 = LBound(mijnWaarden) to UBound(mijnWaarden)

BijRegel = mijnWaarden(y1)

for x1 = LBound(BijRegel) to UBound(BijRegel)

EenElement = BijRegel(x1) +2000

BijRegel(x1) = EenElement

next x1

mijnWaarden(y1) = BijRegel

next y1

EenBereik.setDataArray(mijnWaarden)

Het is niet mogelijk een element direct te bewerken in mijnWaarden, men moet tussen-variabelen gebruiken. De functies LBound en UBound worden uitgelegd in de on-line-Help van Basic.

Op soortgelijke wijze is het mogelijk een bereik dat tekst bevat te bewerken. In dat geval :

Dim mijnWaarden As String, BijRegel As String, EenElement As String

Celcursor

Met een celcursor kan men zich verplaatsen van cel naar cel.

Methode	Betekenis
createCursor	voor het gehele werkblad
createCursorByRange()	voor een celbereik
gotoStart	ga naar de eerste, niet lege, cel
gotoEnd	vanaf een niet leeg bereik, ga naar de laatste niet lege cel
gotoOffset()	verplaatsing met betrekking tot de actuele positie
gotoPrev	ga naar de voorgaande, niet beveiligde, cel (cel links in het algemeen)
gotoNext	ga naar de volgende, niet beveiligde, cel (cel rechts in het algemeen)

Voorbeeld :

Dim MijnCelCursor As Object, EenCel As Object

MijnCelCursor = MijnBlad.createCursor

MijnCelCursor.gotoStart

MijnCelCursor.gotoNext

EenCel = MijnCelCursor.getCellByPosition(0,0)

EenCel.String = "Goedendag"

MijnCelCursor.gotoEnd

rem een regel lager

MijnCelCursor.gotoOffset(0, 1)

MijnCelCursor.getCellByPosition(0,0).String = "Goedenavond"

Calc functies aanroepen in een macro

Het volgende voorbeeld roept de functie ADRES (zie de on-line-Help Calc, functies in de categorie Werkblad). De macro moet de Engelse versie van de functie aanroepen die de naam ADDRESS draagt.

Deze macro is een functie die het adres van een cel weergeeft in de vorm van een tekenreeks, als deel van de gebruikte coördinaten van de API. Bijvoorbeeld met de coördinaten 2,6 :

celladdr(2,6,4) geeft weer "C7"

celladdr(2,6,0) geeft weer "$C$7"

Function celladdr(Kolom As integer, Rij As Integer, absoluut As Integer) As String

Dim Toegang As Object

Dim parameters As Variant

Toegang = CreateUnoService("com.sun.star.sheet.FunctionAccess")

parameters = Array(Rij+1, Kolom+1, absoluut, "")

celladdr = Toegang.callFunction("Address", parameters())

End Function

De naam van de functie is niet afhankelijk van Hoofd- kleine letters, maar moet de Engelse naam zijn. De parameters om de functie op te roepen zijn ingesloten in de variabele ‘parameters’.

De macro VertaalFormule helpt u bij het vertalen van uw formules. In een Calc-werkblad, type uw Nederlandse formule in A1 van het blad, voer de macro uit, de Engelse vertaling van de formule vindt u nu in A3. Het werkt zelfs als uw formule syntaxis-fouten bevat !

Sub VertaalFormule

Dim MijnDocument As Object, DeBladen As Object

Dim MijnBlad As Object

Dim CelLokaal As Object, CelEngels As Object

MijnDocument = ThisComponent

DeBladen = MijnDocument.Sheets

MijnBlad = DeBladen(0)

CelLokaal = MijnBlad.getCellRangeByName("A1")

CelEngels = MijnBlad.getCellRangeByName("A3")

CelEngels.String = CelLokaal.Formula

End Sub

Voorbeeld om de werking van deze macro te tonen :

=Aselecttussen(56;999)

wordt vertaald naar :

=com.sun.star.sheet.addin.Analysis.getRandbetween(56;999)

Een tabel sorteren

Sorteren per kolom

Om een tabel te sorteren die in een Calc-werkblad staat is het nodig om meerdere argumenten in te voeren; voor een klassieke sortering in een kolom, vult men in :

een deel van het argument die voor elke kolom voor de sortering precies aanduidt :

welke kolom moet worden doorzocht,

of de sortering oplopend of aflopend is;

de serie beschrijvingen van de kolommen waaruit het geheel bestaat

de index 0 geeft de eerste kolom aan om op te sorteren,

de index 1 de kolom waarop bij dezelfde resultaten als tweede wordt gesorteerd,

de index 2 de kolom waarop bij dezelfde resultaten als derde de resterende resultaten worden gesorteerd.

een ander deel van het argument voor sortering in het algemeen, die aanduiden :

of men rijen of kolommen wil sorteren,

of de betreffende tabel een tabelnaam heeft (Engels: Header),

of de sortering per rij of per kolom is

de serie betreffende kolommen, verkregen met het eerdere argument.

Tenslotte wordt de sortering uitgevoerd met de methode Sort.

Zie hier een voorbeeld van een sortering van een tabel die in rij 1 een tabelnamen heeft, sorteren volgens kolom B en wel aflopend, dan A oplopend en daarna D oplopend. Het bereik om te sorteren is een benoemd bereik dat de gehele tabel omvat.

Dim MijnBlad As Object, MijnBereik As Object

Dim ConfigSort(2) As New com.sun.star.util.SortField

Dim DescrSort(2) As New com.sun.star.beans.PropertyValue

MijnBlad = ThisComponent.Sheets.getByName("Sorteren")

Mijnbereik = MijnBlad.getCellRangeByName("Sorteerbereik")

ConfigSort(0).Field = 1 ' kolom B

ConfigSort(0).SortAscending = false

ConfigSort(1).Field = 0 ' kolom A

ConfigSort(1).SortAscending = true

ConfigSort(2).Field = 3 ' kolom D

ConfigSort(2).SortAscending = true

DescrSort(0).Name = "SorteerVelden"

DescrSort(0).Value = ConfigSort()

DescrSort(1).Name = "Orientatie"

DescrSort(1).Value = com.sun.star.table.TableOrientation.ROWS

DescrSort(2).Name = "HeeftTabelnaam"

DescrSort(2).Value = true

MijnBereik.Sort(DescrSort())

Opmerkingen

In de instructie Dim ConfigTri(2) geeft het getal het aantal kolommen aan waarvoor criteria zijn opgegeven en over gesorteerd moet worden. Als u een enkele kolom wilt sorteren schrijft u Dim ConfigTri(0)

Als een sorteerkolom tekst bevat, onderscheidt de sortering Hoofd- en kleine letters.

De gegeven waarde voor de oriëntatie is goed voor een sortering “ per kolom ” !

De argumenten van Name moeten worden geschreven met de aangegeven Hoofd- /kleine letters.

De lege haakjes in de laatste instructie zijn onontbeerlijk.

Met de gebruikersinterface is het niet mogelijk om per keer op meer dan 3 criteria te sorteren.

Sorteren per rij

Bij sorteren per rij, de tabelnaam is kolom A, en de sortering is van toepassing op de inhoud van een of meerdere rijen : draai de kop 90° naar links en u vindt het klassieke overzicht...

Kopieer het voorgaande voorbeeld en configureer de rij-sortering :

Dim MijnBlad As Object, MijnBereik As Object

Dim ConfigSort(2) As New com.sun.star.util.SortField

Dim DescrSort(2) As New com.sun.star.beans.PropertyValue

MijnBlad = ThisComponent.Sheets.getByName("Sorteren")

MijnBereik = MijnBlad.getCellRangeByName("SorteerBereik")

ConfigSort(0).Field = 1 ' rij 2

ConfigSort(0).SortAscending = false

ConfigSort(1).Field = 0 ' rij 1

ConfigSort(1).SortAscending = true

ConfigSort(2).Field = 3 ' rij 4

ConfigSort(2).SortAscending = true

DescrSort(0).Name = "SortFields"

DescrSort(0).Value = ConfigTri()

DescrSort(1).Name = "Orientation"

DescrSort(1).Value = com.sun.star.table.TableOrientation.COLUMNS

DescrSort(2).Name = "ContainsHeader"

DescrSort(2).Value = true

MijnBereik.Sort(DescrTri())

De vormen in Calc

Hier roept men een vorm (Engels : shape) op, een elementair ontwerp, bijvoorbeeld een rechthoek, een ellips, etc.

Invoegen van een ontworpen vorm

Een vorm wordt ingevoegd in een ontwerppagina . Er bestaan evenveel ontwerppagina’s als er werkbladen zijn in het Calc-werkbladdocument, met dezelfde nummering vanaf nul. Het voorbeeld voegt minimaal een rechthoek in op het derde werkblad van het document :

Dim MijnDocument As Object, DeBladen As Object

Dim OntwerpPagina As Object

Dim MijnVorm As Object

Dim Grootte1 As New com.sun.star.awt.Size

Grootte1.Width = 5400

Grootte1.Height = 2530

MijnDocument = ThisComponent

OntwerpPagina = MijnDocument.drawPages(2) ' pagina van Calc werkblad nummer 3

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

MijnVorm.Size = Grootte1

OntwerpPagina.add(MijnVorm)

De instructie Dim Grootte1 creëert een objecttype Grootte (in Engels : Size) dat dient om de toekomstige vorm te tekenen. Basic staat directe wijzigingen in de eigenschap Size van een vorm niet toe.

Het argument van createInstance is een verschrikkelijke constante die het type van de ontworpen vorm aanduidt.

De principale elementaire vormen, beschikbaar in com.sun.star.Drawing , zijn :

Vorm	Betekenis
CaptionShape	Legenda
ClosedBezierShape	Gesloten Bézier-boog
ConnectorShape	Verbinding
EllipseShape	Ellips of cirkel
GraphicObjectShape	Grafisch Object
LineShape	Lijn
MeasureShape	Meetlat
OpenBezierShape	Open Bézier-boog
PolyLineShape	Vrije-hand Lijn
PolyPolygonShape	Veelhoek
RectangleShape	Rechthoek of vierkant
TextShape	Tekst

Als een ontwerp eenmaal is ingevoegd op de ontwerppagina kan men zijn eigenschappen veranderen, zoals hierboven weergegeven.

Ankeren van de vorm

De vorm, verkregen met de instructies van het voorgaande voorbeeld staat in de linkerbovenhoek van het werkblad, verankerd aan de cel A1.

De gebruikersinterface stelt u in staat (klik links, dan rechts op het ontwerp) een verankering aan de pagina of aan de cel te kiezen. Met een verankering aan de cel, kan men met de muis de vorm naar een andere cel verplaatsen.

De plaatsing via de gebruikte macro is in feite een tussenoplossing tussen “ pagina ” en “ cel ”.

Plaatsing van de vorm

De plaatsing wordt aangeroepen via een tussen-variabele, die de positie op een punt definieert via de coördinaten x en y. Het betreft de linkerbovenhoek van de vorm. De coördinaten worden aangegeven in 1/100 van een mm, relatief aan de linkerbovenhoek van het werkblad.

Dim MijnDocument As Object, DeBladen As Object

Dim OntwerpPagina As Object

Dim MijnVorm As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

Grootte1.Width = 5400

Grootte1.Height = 2530

Positie1.x = 5700 ' 55 mm naar rechts

Positie1.y = 8350 ' 83,5 mm naar beneden

MijnDocument = ThisComponent

OntwerpPagina = MijnDocument.drawPages(2) ' pagina van Calc werkblad nummer 3

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

MijnVorm.Size = Grootte1

MijnVorm.Position = Positie1

OntwerpPagina.add(MijnVorm)

Het resultaat van de instructies is een vorm die is verankerd aan een cel van het werkblad, bijvoorbeeld B18. Wat is er gebeurd ? De API heeft uitgerekend welke verankeringscel het dichtst bij het plaatsingspunt ligt en heeft de plaatsing van de vorm verricht bij die cel om de gevraagde positie te verkrijgen. Verwijder de vorm; verander de breedte van kolom A en de hoogte van een van de eerste rijen; voer de macro opnieuw uit : de keuze van de verankeringscel zal veranderen.

Praktisch betekent dit: het zegt ons dat de positie altijd wordt berekend met betrekking tot de pagina, wordt omgezet en geplaatst aan de cel.

Als, na invoegen van de vorm, men de breedte van de kolom of de hoogte van de rij van de verankeringscel aanpast, de dimensies van de vorm veranderen.
Als men de breedte van een voorgaande kolom of een volgende rij verandert, verandert de positie van de vorm.

Andere functionaliteiten voor vormen

De andere functionaliteiten zijn identiek voor zowel Calc als de andere toepassingen. Zij worden beschreven in een algemeen hoofdstuk :

Algemene eigenschappen

Ontwerpen van verschillende vormen

Tekst in vormen invoegen

Een vorm een naam geven

Afbeeldingen in Calc

Een afbeelding invoegen

Opmerking : in de Engelse API-versie, wordt de term Graphic gebruikt voor het benoemen van een “ bitmap ”-afbeelding of een vector-afbeelding. Er is geen relatie met het Nederlandse grafische concept.

Dit voorbeeld voegt een afbeelding in :

Dim MijnDocument As Object, DeBladen As Object

Dim OntwerpPagina As Object

Dim MijnAfbeelding As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnDocument = ThisComponent

OntwerpPagina = MijnDocument.drawPages(2) ' pagina van 3e Calc-werkblad

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Temp\Ooo.jpg")

OntwerpPagina.add(MijnAfbeelding)

Grootte1.Width = 6000 ' grootte in 1/100 van een mm

Grootte1.Height = 6000 ' grootte in 1/100 van een mm

MijnAfbeelding.Size = Grootte1

Als de originele afbeelding niet dezelfde afmetingen heeft, kan de afbeelding in het document worden vervormd. We zien verderop hoe de afmetingen aan te passen en de originele afmetingen te behouden.

De instructies voegen geen afbeelding in het Calc document in, maar slechts een koppeling naar de afbeelding. Als u het afbeeldingbestand waarnaar wordt verwezen verplaatst, hernoemt of verwijderd, zal het document een verbroken koppeling weergeven met het adres van het bestand.

Dit is een actuele beperking in de API.

Om effectief afbeeldingen in het document in te voegen via een macro, volg de volgende procedure :

Menu Bewerken > Koppelingen...

selecteer de afbeeldingskoppeling

klik op de knop Ontkoppelen; bevestigen

Sla het document op.

Plaatsen van een afbeelding

De verankering en plaatsing van een afbeelding en een vorm zijn gelijk. Kijk in het hoofdstuk dat gaat over plaatsing van de vorm in Calc.

Weergeven van een afbeelding

Om de afbeelding weer te geven zonder de proporties te veranderen, moet men de afmetingen van de afbeelding in pixels bewaren. Dit is niet eerder mogelijk dan na de instructie OntwerpPagina.add(MijnAfbeelding). De berekende proporties stellen een vaste hoogte in via de grootte functie. De twee afmetingen zijn in 1/100 van mm’s.

Dit voorbeeld plaatst de afbeelding in het werkblad en past de afbeelding aan aan de gekozen grootte, tegelijkertijd zijn proporties behoudend :

Dim MijnDocument As Object, DeBladen As Object

Dim OntwerpPagina As Object

Dim MijnAfbeelding As Object

Dim DeAfbeelding As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

Dim Proportie As Double

MijnDocument = ThisComponent

OntwerpPagina = MijnDocument.drawPages(2) ' pagina van derde Calc-werkblad

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

Positie1.x = 3000

Positie1.y = 6000

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Temp\Ooo.jpg")

MijnAfbeelding.Position = Positie1

OntwerpPagina.add(MijnAfbeelding)

DeAfbeelding = MijnAfbeelding.GraphicObjectFillBitmap

Grootte1 = DeAfbeelding.Size ' grootte in pixels !

Proportie = Grootte1.Height / Grootte1.Width

Grootte1.Width = 6000 ' grootte in 1/100 van mm’s

Grootte1.Height = Grootte1.Width * Proportie

MijnAfbeelding.Size = Grootte1

Meerdere afbeeldingen invoegen

Voor elke invoeging van een afbeelding is het nodig om een nieuwe GraphicObjectShape te krijgen, zelfs als men meerdere malen dezelfde afbeelding wil invoegen, zoals in het volgende voorbeeld. Het bevat een sub-routine om afmetingen aan te passen.

Sub Invoegen2IdentiekeAfbeeldingen

Dim MijnDocument As Object, DeBladen As Object

Dim OntwerpPagina As Object

Dim MijnAfbeelding As Object

Dim Positie1 As New com.sun.star.awt.Point

MijnDocument = ThisComponent

OntwerpPagina = MijnDocument.drawPages(2) ' pagina van derde Calc-werkblad

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

Positie1.x = 3000

Positie1.y = 6000

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Temp\Ooo.jpg")

MijnAfbeelding.Position = Positie1

OntwerpPagina.add(MijnAfbeelding)

GrootteProp(MijnAfbeelding, 6000)

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

Positie1.x = 10000

Positie1.y = 8000

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Temp\Ooo.jpg")

MijnAfbeelding.Position = Positie1

OntwerpPagina.add(MijnAfbeelding)

GrootteProp(MijnAfbeelding, 3500)

End Sub

Sub GrootteProp( EenAfbeelding As Object, Breedte As Long)

Dim DeAfbeelding As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Proportie As Double

DeAfbeelding = EenAfbeelding.GraphicObjectFillBitmap

Grootte1 = DeAfbeelding.Size ' grootte in pixels !

Proportie = Grootte1.Height / Grootte1.Width

Grootte1.Width = Breedte ' grootte in 1/100 van mm’s

Grootte1.Height = Grootte1.Width * Proportie

EenAfbeelding.Size = Grootte1

end sub

Vinden van een afbeelding door zijn naam

Om een afbeelding terug te vinden, is een goed hulpmiddel om ze te benoemen. Als een afbeelding eenmaal in het document is ingevoegd, is het mogelijk om te gebruiken de eigenschap Name :

MijnAfbeelding.Name = "Ons logo"

Alle afbeeldingen ( en de vormen ) op een pagina zijn toegankelijk door een index, bijvoorbeeld :

MijnAfbeelding = OntwerpPagina(3)

Het is weinig praktisch, maar in Calc bestaat geen API-methode om een vorm bij zijn naam terug te vinden.

Geen probleem, we kunnen de functie FindObjectByName gebruiken, beschreven in een ander hoofdstuk. Met die functie kunnen we de afbeelding terugvinden en bewerken :

Dim MijnDocument As Object

Dim MijnAfbeelding As Object

Dim OntwerpPagina As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnDocument = ThisComponent

OntwerpPagina = MijnDocument.DrawPages(2)

MijnAfbeelding = FindObjectByName( OntwerpPagina, "Ons logo")

if IsNull(MijnAfbeelding) then

print "Naam bestaat niet !"

else

Grootte1.Width = 6000 ' breedte in 1/100 van mm’s

Grootte1.Height = 3000 ' hoogte in 1/100 van mm’s

MijnAfbeelding.Size = Grootte1

end if

Attentie : deze methode vindt een object waar dan ook op de pagina, vermijd dan ook om een vorm en een afbeelding dezelfde naam te geven op dezelfde pagina.

Writer Tekstverwerking

Tekst vinden

Om te werken in een Writer-tekst moeten we die aanduiden. Om het document zelf aan te duiden is onvoldoende. In feite bevat een Writer-document verschillende objecten, zoals de normale tekst, de kop- en voetteksten of de kaders die tekst bevatten.

Voor een macro die werkt met de normale tekst in het huidige document, schrijft men :

Dim MijnDocument As Object, MijnTekst As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

Cursor leiden

Zichtbare cursor, tekstcursor

Het is goed om te onthouden dat er twee types cursor bestaan :

de zichtbare cursor, dat is die welke u ziet als u tekst typt in Writer; hij wordt hieronder beschreven

de tekstcursor, die wordt gebruikt door de macro, om de tekst die wordt bewerkt aan te duiden.

Om normale tekst in te voegen vanaf het begin van het Writer-document, definieert men aldus de tekstcursor :

MijnCursor= MijnTekst.createTextCursor

Daar staat tegenover dat, om tekst ergens anders in te voegen in een bestaande tekst, het nodig is om de cursor te verzetten.

Tekstcursor verzetten

Zie hier twee voorbeelden om de tekstcursor te verzetten :

MijnCursor.goRight(1, false) ' verzet de cursor een teken naar rechts

MijnCursor.goLeft(2, true) ' selecteert de twee voorgaande tekens

Let goed op : de tekstcursor wordt verzet, maar de zichtbare cursor wordt niet verzet.

Het tweede argument van goRight en goLeft betekent :

false = verzet de cursor

true = verzet de cursor en breidt de selectie uit (zoals met slepen met de muis). De verwerkte selectie is niet zichtbaar.

Lijst van instructies voor de cursor

De instructies om de cursor te verzetten hebben een identieke syntaxis:

Methode	Betekenis
goRight(n, false)	verzet n tekens naar rechts
goLeft(n, false)	verzet n tekens naar links
gotoStart(false)	verzet naar begin van de gehele tekst
gotoEnd(false)	verzet naar einde van de gehele tekst
gotoStartOfParagraph(false)	verzet naar begin van de huidige alinea
gotoEndOfParagraph(false)	verzet naar einde van de huidige alinea
gotoNextParagraph(false)	verzet naar begin van de volgende alinea
gotoPreviousParagraph(false)	verzet naar begin van de voorgaande alinea
gotoNextWord(false)	verzet naar begin van het volgende woord
gotoPreviousWord(false)	verzet naar begin van het volgende woord
gotoStartOfWord(false)	verzet naar begin van het huidige woord
gotoEndOfWord(false)	verzet naar eind van het huidige woord
gotoNextSentence(false)	verzet naar begin van de volgende zin
gotoPreviousSentence(false)	verzet naar begin van de vorige zin
gotoStartOfSentence(false)	verzet naar begin van de huidige zin
gotoEndOfSentence(false)	verzet naar einde van de huidige zin

Instructies om de uitersten van de cursor te bewerken

Methode	Betekenis
collapseToStart	breng het einde van de cursor op de positie van het begin van de cursor
collapseToEnd	breng het begin van de cursor naar de positie aan het einde van de cursor

Al deze instructies zij in feite functies, want het resultaat is waar als de actie wordt uitgevoerd, of niet waar indien niet. Men is niet verplicht het resultaat te gebruiken.

Er bestaan functies om vast te stellen wat de positie van de cursor is :

Functie	Betekenis
isStartOfParagraph	resultaat WAAR als de cursor aan begin van een alinea staat
isEndOfParagraph	resultaat WAAR als de cursor aan einde van een alinea staat
isStartOfWord	resultaat WAAR als de cursor aan begin van huidige woord staat
isEndOfWord	resultaat WAAR als de cursor aan einde van huidige woord staat
isStartSentence	resultaat WAAR als de cursor aan begin van een zin staat
isEndOfSentence	resultaat WAAR als de cursor aan einde van een zin staat
isCollapsed	resultaat WAAR als begin en eind van de cursor identiek is

De relatieve methoden voor woorden en zinnen kunnen verrassende resultaten opleveren. Bekijk eventueel hieronder de opmerkingen met betrekking tot notatie van woorden.

De zichtbare cursor

De zichtbare cursor, dat is de knipperende streep die tijdens het schrijven wordt weergegeven. Het is ook een selecteerbaar bereik voor de gebruiker, bijvoorbeeld door met de muis over de de tekst te glijden.

Verkrijgen van de zichtbare cursor

Dim MijnDocument As Object

Dim ZichtbareCursor As Object

MijnDocument = ThisComponent

ZichtbareCursor = MijnDocument.CurrentController.ViewCursor

Opmerking : CurrentController wordt niet aangehaald in de index van de documentatie van de API...

Merk op dat ZichtbareCursor bepaalde mogelijkheden heeft van een tekstcursor zoals MijnCursor, maar als men de positie verzet van ZichtbareCursor, wordt dat niet weergegeven op het scherm. Om alle mogelijkheden te kunnen benutten is het het beste om een tekstcursor aan te maken op de positie van de zichtbare cursor.

Tekstcursor en zichtbare cursor

We zullen een tekstcursor plaatsen op de positie van de zichtbare cursor. Maar de zichtbare cursor moet een selectiepunt hebben, of een bereik dat een begin en einde heeft.
Plaatsen van de tekstcursor aan het begin van het tekstbereik van de zichtbare cursor :

Dim MijnDocument As Object, MijnTekst As Object

Dim ZichtbareCursor As Object, MijnCursor As Object

MijnDocument = ThisComponent

ZichtbareCursor = MijnDocument.currentcontroller.ViewCursor

Mijntekst = MijnDocument.Text

MijnCursor = Mijntekst.createTextCursorByRange(ZichtbareCursor.Start)

Plaatsen van de tekstcursor aan het einde van het tekstbereik van de zichtbare cursor :

MijnCursor = Mijntekst.createTextCursorByRange(ZichtbareCursor.End)

Geselecteerd bereik door de gebruiker

Het is niet handig om een tekstcursor aan te maken voor bepaalde simpele taken. Zie hier hoe de door de gebruiker geselecteerde tekst wordt opgenomen en vervangen :

Dim MijnDocument As Object

Dim ZichtbareCursor As Object

Dim SelectieTekst As String

MijnDocument = ThisComponent

ZichtbareCursor = MijnDocument.currentcontroller.ViewCursor

SelectieTekst = ZichtbareCursor.String

ZichtbareCursor.String = " nieuwe tekst "

In de volgende zin maken we het door de gebruiker geselecteerde bereik vet (VET maken wordt hieronder uitgelegd) :

Dim MijnDocument As Object

Dim ZichtbareCursor As Object

MijnDocument = ThisComponent

ZichtbareCursor = MijnDocument.currentcontroller.ViewCursor

ZichtbareCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD

Merk op dat dezelfde zin ook geldig is als meerdere, niet aaneensluitende, bereiken zijn geselecteerd door de gebruiker : alle bereiken zijn VET !

Als de gebruiker meerdere bereiken in één keer kiest, is het vaak veel handiger om elk bereik afzonderlijk te bewerken. De eigenschap CurrentSelection levert een lijst van geselecteerde bereiken. Men gebruikt dan een loop om achtereenvolgens de bereiken te vinden. Het nummer van het bereik staat in de eigenschap Count.

Dim MijnDocument As Object

Dim AlleSelecties As Object

Dim Selx As Integer, EenBereik As Object

MijnDocument = ThisComponent

AlleSelecties = MijnDocument.CurrentSelection

for Selx = 0 to AlleSelecties.Count -1

EenBereik = AlleSelecties(Selx)

rem maak elke geselecteerd bereik VET

EenBereik.CharWeight = com.sun.star.awt.FontWeight.BOLD

next

Als u niet zeker bent of de gebruiker niet één enkel bereik heeft geselecteerd, gebruik dan bovenstaande code. Als er geen enkele selectie is, wordt de loop for niet uitgevoerd.

Zichtbaar een bereik selecteren

Het doel is een bereik via een macro te selecteren en die selectie aan de gebruiker te laten zien. Dat is niet mogelijk met de ZichtbareCursor die u reeds heeft gezien. Het vereist een speciale instructie, die de positie van de cursor, bij argument verkregen, gebruikt :

MijnCursor.gotoNextWord(false)

MijnCursor.gotoEndOfWord(true) ' selectie van een woord

' Verplaats de selectie naar de zichtbare cursor

MijnDocument.CurrentController.Select(MijnCursor)

Als u deze macro wilt uitvoeren in de Editor, open dan voorafgaand een Writer-venster om de selectie van het woord te zien.

Schrijven van tekst

Inlezen, schrijven

Men kan dus met de cursor een serie van meerdere karakters selecteren; maar ook, men neemt de geselecteerde tekst ook op met :

Dim tx3 As String

tx3 = MijnCursor.String

Tegengesteld, kan men de geselecteerde tekst verwijderen met een nieuwe tekst :

MijnCursor.String = "Goedenavond"

Attentie : als u dit principe gebruikt met het object Tekst, verwijdert u alle bestaande tekst :

MijnTekst.String = "alles wordt hierdoor verwijderd"

Onthoud dat Basic de tekenreeksen limiteert tot 64 000 karakters. Deze methoden werken dus niet in zeer lange teksten.

Gewoonlijk schrijven we de tekst dus :

MijnTekst.insertString( MijnCursor, "Dit is een tekst", false)

Na deze instructie plaatst de tekstcursor zich aan het einde van de tekst die hij heeft geschreven.

In de procedure insertString betekent het derde argument :

false = invoegen in de tekst

true = verwijder in de tekst

Speciale tekens in een tekst

Een alineaeinde invoegen in de tekst :

Dim EindAlinea As Integer

EindAlinea = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK

MinTekst.insertControlCharacter(MijnCursor, EindAlinea, false)

Het laatste argument (false) heeft dezelfde betekenis als voor insertString .

We hebben de tussen-variabele EindAlinea bediend door de code te vereenvoudigen.

Er bestaat een lijst van soortgelijke verschrikkelijke constanten:

Constante	Betekenis
PARAGRAPH_BREAK	alinea-einde
LINE_BREAK	regeleinde
HARD_HYPHEN	onvoorwaardelijke afbreking
SOFT_HYPHEN	voorwaardelijke afbreking
HARD_SPACE	onvoorwaardelijke spatie
APPEND_PARAGRAPH	voeg een alinea in na de voorgaande en plaats aan het begin

Opheffen van alinea’s

Dit voorbeeld gebruikt tot hier meerdere geschreven notaties. Hij doorloopt een complete tekst en heft de alineamarkeringen op en vervangt die door een spatie.

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

MijnCursor.gotoStart(false)

Do While MijnCursor.gotoNextParagraph(false)

MijnCursor.goLeft(1, true)

MijnCursor.String = " "

Loop

Een pagina-einde of kolom-einde invoegen

Het pagina-einde is een eigenschap van de alinea. U moet een alineaopmaakprofiel kiezen en een pagina-einde daarin opnemen. Anders moet u een Pagina-einde invoegen in de huidige Alinea :

Dim SoortPagEind As Integer

SoortPagEind= com.sun.star.style.BreakType.PAGE_AFTER

MijnCursor.breakType= SoortPagEind

U heeft al herkend een verschrikkelijke constante. Verschillende types van pagina-einden zijn mogelijk :

Constante	Betekenis
PAGE_BEFORE	nieuwe pagina voor de huidige alinea
PAGE_AFTER	nieuwe pagina na de huidige alinea
PAGE_BOTH	nieuwe pagina voor en na de huidige alinea
NONE	hef paginaeinde of kolomeinde op die bestaan in de alinea
COLUMN_BEFORE	nieuwe kolom voor de huidige alinea
COLUMN_AFTER	nieuwe kolom na de huidige alinea
COLUMN_BOTH	nieuwe kolom voor en na de huidige alinea

De einde van het type COLUMN worden gebruikt in een tekst in kolommen. In feite, men kan twee of drie kolommen per pagina hebben en wensen de kolom te beëindigen, zonder de pagina te beëindigen.

Voorbeelden van bewerken van tekst

Deze macro zal uw typefouten corrigeren; zij verwisselt de twee karakters naast elkaar op de aangewezen positie door de gebruiker :

Sub Wissel2kar

Dim MijnDocument As Object, MijnTekst As Object

Dim ZichtbareCursor As Object, MijnCursor As Object

Dim tx0, tx1, tx2 As String

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

rem we gaan er vanuit dat de zichtbare cursor tussen de twee karakters staat

ZichtbareCursor = MijnDocument.currentcontroller.ViewCursor

MijnCursor = MijnTekst.createTextCursorByRange(ZichtbareCursor.Start)

MijnCursor.goRight(1, false) ' positie na het 2e teken

MijnCursor.goLeft(2, true) ' selecteer de 2 voorgaande tekens

tx0 = MijnCursor.String

tx1 = Left(tx0, 1)

tx2 = Right(tx0, 1)

tx0 = tx2 & tx1 ' verwisselt de 2 karakters

MijnCursor.String = tx0

'herstelt de beginpositie van de zichtbare cursor

ZichtbareCursor.GoLeft(1,false)

End Sub

Kopieer de voorbeeldmacro om alinea op te heffen. Deze nieuwe versie heft niet de alinea’s op die in het, door de gebruiker, geselecteerde, bereik staan :

Dim MijnDocument As Object, MijnTekst As Object

Dim ZichtbareCursor As Object, MijnCursor As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

ZichtbareCursor = MijnDocument.currentcontroller.ViewCursor

rem creëer een werkcursor op de positie van de zichtbare cursor

MijnCursor = MijnTekst.createTextCursorByRange(ZichtbareCursor.Start)

Do While MijnCursor.gotoNextParagraph(false)

if MijnTekst.compareRegionEnds(MijnCursor, ZichtbareCursor)< 0 then Exit Do

MijnCursor.goLeft(1, true)

MijnCursor.String = " "

Loop

De functie compareRegionEnds vergelijkt de eindpositie in de twee cursors.

Opmerking : als de gebruiker meerdere bereiken selecteerde, heft de macro niets op.

Tip : tekstmarkeringen gebruiken om tekst te schrijven

Een tekstmarkering (Engels: bookmark) is een markering in een tekst. Handmatig voegt u een tekstmarkering rechts van de zichtbare cursor met het menu Invoegen > Tekstmarkering... > NaamTekstmarkering.

U kunt u zelf het schrijven van tekst via een macro aanmerkelijk makkelijker maken als u een voorgedefinieerd document (of sjabloon) invult die de vaste structuur van het document bevat, en de tekstmarkeringen gebruikt om de plaatsen te vinden die de macro moet vullen. Natuurlijk moet de macro de naam van elke tekstmarkering weten en het type informatie dat moet worden ingevoegd..

Het volgende voorbeeld initialiseert de tekstcursor op de vindplaats van de tekstmarkering genaamd ” hier_schrijven ”, dan schrijvend “ Nieuwe tekst “ :

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor = MijnDocument.Bookmarks.getByName("hier_schrijven").getAnchor

Mijntekst.insertString( MijnCursor, " Nieuwe tekst ", false)

De naam van de tekstmarkering moet exact zo worden geschreven als in de definitie. De instructie getByName resulteert in een fout als er geen tekstmarkering met die naam bestaat. U kunt het bestaan van de tekstmarkering ook testen met :

if MijnDocument.Bookmarks.hasByName("hier_schrijven") then

rem de Tekstmarkering bestaat

end if

Een opmaakprofiel of een formaat toepassen

Een opmaakprofiel op een alinea toepassen

Een van de meest doelmatige hulpmiddelen om de tekst via een macro op te maken is door de die een vooraf gemaakte stijl toe te laten passen. Als u het een nieuw document nodig heeft in uw macro-project, kunt u handmatig een sjabloon opmaken met de stijlen die u nodig heeft, dan dat sjabloon gebruiken om een nieuw document te maken.

De volgende macro toont precies hoe u zelf het opmaakprofiel “ Titel 4 ” op de tweede alinea van het huidige document toepast. Test het met een klein document met drie alinea’s.

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

MijnCursor.gotoNextParagraph(false)

rem hier is men bij de 2e alinea van de bestaande tekst

MijnCursor.paraStyleName= "Titel 4"

De tekstcursor staat misschien op een positie ergens in de alinea. Hij is ook vast te zetten op een grootte van 5 tekens, bijvoorbeeld.

Het is ook mogelijk het opmaakprofiel van een alinea te weten te komen :

print MijnCursor.paraStyleName

Attentie

Als u de naam van het opmaakprofiel wilt achterhalen, krijgt u voor de met Ooo meegeleverde profielen de Engels naam, zelfs met een gelokaliseerde versie van OOo. In onderstaand voorbeeld gebruikt men de stijl ” Titel 4 ”en herleest de stijl “ Heading 4 ”. Tegengesteld daaraan hebben profielen die u zelf creëert niet per definitie een enkele naam. Dus, in geval van twijfel, lees de naam van de stijl in met een kleine macro.

Tweede mogelijke probleem : de tekenreeks van de stijl waarmee u de cel wilt opmaken moet exact hetzelfde zijn als de bestaande stijl : Hoofd-, kleine letters, accenten. Zo niet, dan blijft de stijl van de cel onveranderd.

Tekenopmaakprofiel gebruiken

Om de opmaak van bepaalde karakters te veranderen, selecteert men die en past toe CharStyleName :

Dim MijnDocument As Object, MijnText As Object

Dim MijnCursor As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextWord(false)

MijnCursor.gotoEndOfWord(true)

MijnCursor.CharStyleName = "MijnTekenStijl"

De opmaak van een teken toepassen

Dit is hetzelfde als VET, cursief , onderstrepen, etc, toepassen op een of meerdere tekens.

Voorbeeld voor het tweede woord in de tweede alinea :

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextWord(true)

MijnCursor.gotoNextWord(false)

MijnCursor.gotoEndOfWord(true)

MijnCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD

De eigenschappen voor de tekens zijn opgesomd in de API : CharacterProperties. De belangrijkste :

Eigenschap	Betekenis
CharStyleName	Tekenreeks, naam tekenopmaakprofiel (denk aan Hoofd-/kleine letters)
CharFontName	Tekenreeks, naam van het lettertype (denk aan Hoofd-/ kleine letters)
CharHeight	De grootte van het teken, in punten
CharWeight	De “dikte” van het teken
CharShadowed	boolean; waarde WAAR om een schaduw op het teken toe te passen
CharPosture	Teken cursief of recht
CharUnderline	Om het teken te onderstrepen
CharColor	Kleur van het teken
CharBackColor	Kleur van de achtergrond van een teken
CharCrossedOut	boolean; waarde WAAR om teken door te strepen
CharEscapement	Voor een teken in superscript of subscript
CharEscapementHeight	Voor een teken in superscript of subscript

Bepaalde eigenschappen gebruiken verschrikkelijke constanten zoals voor CharWeight in het voorbeeld hieronder. Bekijk het overzicht van de belangrijkste eigenschappen :

CharWeight	constanten zoals :	com.sun.star.awt.FontWeight.XXXX

Constanten	Betekenis
NORMAL	Normaal
BOLD	Vet voorbeeld
THIN	Mager (indien beschikbaar in lettertype)
ULTRABOLD	Zeer vet (indien beschikbaar in lettertype)

Andere, minder gebruikte, bestaan, kijk in de API.

CharPosture	constanten zoals :	com.sun.star.awt.FontSlant.XXXX

Constanten	Betekenis
NONE	recht teken
ITALIC	cursief teken voorbeeld

CharUnderline	constanten zoals :	com.sun.star.awt.FontUnderLine.XXXX

Constanten	Signification
NONE	normaal, niet onderstreept
SINGLE	enkel onderstreept voorbeeld
DOUBLE	dubbel onderstreept voorbeeld
DOTTED	gestippeld onderstreept voorbeeld
WAVE	golf onderstreept voorbeeld
DASH	gestreept onderstreept voorbeeld
DASHDOT	punt-streep onderstreept voorbeeld
BOLD	vet onderstreept voorbeeld

Andere, minder gebruikte, bestaan, kijk in de API.

Teken superscript of subscript maken

Superscript of subscript voor een teken hebben twee eigenschappen van het teken nodig : CharEscapement en CharEscapementHeight.

CharEscapement specificeert de hoogte van het teken ten opzichte van een normaal teken, in percentage, ; een positieve waarde voor superscript, een negatieve waarde voor subscript.

CharEscapementHeight specificeert de relatieve grootte van het teken, in percentage, ten opzichte van een normaal teken.

Voorbeeld :

MijnCursor.gotoEndOfWord(false)MijnCursor.goLeft(1, true) ' selecteer een teken

MijnCursor.CharEscapement = 20 ' hoogte van het teken / regel

MijnCursor.CharEscapementHeight = 70 ' juiste hoogte teken / normale grootte

U kunt het resultaat met de gebruikersinterface controleren : selecteer het gewijzigde teken door de macro, menu Opmaak > Teken... tab Positie.

Opmerking : de documentatie van de API draait de omschrijving van deze twee eigenschappen om.

Terugzetten van de alineaopmaak

Om alles schoon te maken, het is gewenst om de juiste opmaakstijl op de huidige alinea teug te zetten, past men op het tekstbereik toe de methode setAllPropertiesToDefault.

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextParagraph(true) ' selecteert de gehele alinea

MIjnCursor.setAllPropertiesToDefault

Oefening tekst schrijven

Voordat we verder gaan, gaan we een praktisch werkje maken. Open een nieuw Writer document, type enkele alinea’s in het opmaakprofiel “ standaard ”. Maak dan met het menu Extra / Macro de volgende macro :

Option Explicit

Sub Main

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

Dim AlineaEinde As Integer

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

AlineaEinde = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK

MijnCursor= MijnTekst.createTextCursor

MijnTekst.insertString( MijnCursor, "Begin Tekst", false)

MijnTekst.insertControlCharacter( MijnCursor, AlineaEinde , false)

MijnTekst.insertString( MijnCursor, "Tweede regel", false)

MijnTekst.insertControlCharacter( MijnCursor, AlineaEinde , false)

MIjnTekst.insertString( MijnCursor, "Begin alinea 3 ", false)

MijnCursor.paraStyleName= "Titel 4"

MijnCursor.CharColor = 225

MijnCursor.CharShadowed = true

MijnTekst.insertString( MijnCursor, " toevoeging in kleur", false)

End Sub

Plaats de zichtbare cursor aan het einde van de regels die u heeft geschreven in het document. Voer vervolgens de macro “ stap voor stap ” uit, steeds kijkend naar de inhoud van de tekst in het document.

Na “ Begin Tekst ” kunt u vaststellen dat deze zin is geschreven aan het begin van het document : dat komt door de instelling van createTextCursor.

De methode paraStyleName past het opmaakprofiel “ Titel 4 ” toe op de huidige alinea en op de actuele tekst van de alinea.

De instructies CharColor et CharShadowed passen een kleur en een schaduw toe vanaf de cursor, dat wil zeggen op de tekens die worden geschreven vanaf hier – zoals u dat handmatig zou kunnen doen -

Na de laatst uitgevoerde instructie, ziet men dat alleen de laatste tekst in kleur is.

Varianten

Voer de macro opnieuw uit, met toepassing van de varianten. Voor deze test, wis handmatig de eerder geschreven tekst door de macro (klikkend op de knop “ Annuleren ” in het venster van het Writer document).

Wijzig handmatig het opmaakprofiel van de eerste regel in “ Tekstblok ”. Voer de macro uit : de twee regels hebben de stijl behouden, maar de derde blijft in Kop 4.

Wijzig ook de laatste regels van de macro :

MijnCursor.paraStyleName= "Kop 4"

MijnCursor.gotoStartOfParagraph(false)

MijnCursor.CharColor = 225

MijnCursor.CharShadowed = true

MijnTekst.insertString( MijnCursor, " toegevoegd in kleur", false)

MijnCursor.gotoEndOfParagraph(false)

MijnTekst.insertString( MijnCursor, " in zwart ", false)

De toevoeging in kleur staat nu aan het begin van de alinea, de toegevoegde tekst “ in zwart ” volgt goed in de huidige stijl op deze positie.

Vervang gotoStartOfParagraph door gotoStart en bekijk het verschil.

Vervang ook gotoEndOfParagraph door gotoEnd en bekijk het verschil.

Vervang ook false door true in gotoEnd en in de laatste insertString ; voer ” stap voor stap ”uit : aan het einde, alle tekst na“ toegevoegd in kleur ” is vervangen door de laatste invoeging, die hier wordt weergegeven met het huidige tekenopmaakprofiel.

Vervang nu de laatste insertString door

MijnCursor.String = " in zwart "

Het resultaat is hetzelfde.

Inspringen in tekst

Invoegen van een tabulatorstop in een tekst bestaat uit het toevoegen van het teken met de decimale waarde 9, dat is dus chr(9).

De posities van de tabulaties (de tabstops) zijn plaatsen, gedefinieerd in de huidige alineaopmaak, of standaard gedefinieerde plaatsen.

Als u specifieke tabstops wilt, twee oplossingen :

de meest simpele en praktische is een opmaakprofiel te gebruiken dat u al heeft gedefinieerd in uw document;

maar ook, definieer werkbare tabstops in de huidige alinea via programmeren, zie de macro hierna.

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object, Tekst1 As String

Dim NieuweAlinea As Integer

Dim Tab As String

Dim PositieTabStop As New com.sun.star.style.TabStop

Dim LijstTabStops(2) As Object

NieuweAlinea = com.sun.star.text.ControlCharacter.APPEND_PARAGRAPH

Tab = chr(9)

With PositieTabStop

.Position = 2500 ' 25 mm ( 2,5 cm )

.Alignment = com.sun.star.style.TabAlign.LEFT

.DecimalChar = ","

.FillChar = " "

LijstTabStops(0) = PositieTabStop

.Position = 4700 ' 47 mm

.Alignment = com.sun.star.style.TabAlign.CENTER

LijstTabStops(1) = PositieTabStop

.Position = 7010 ' 70,1 mm

.Alignment = com.sun.star.style.TabAlign.RIGHT

LijstTabStops(2) = PositieTabStop

end With

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

rem Invoegen van alinea na de huidige (hier, de eerste)

MijnTekst.insertControlCharacter(MijnCursor, NieuweAlinea, false)

MijnCursor.ParaTabStops = LijstTabStops() ' plaats de tabstops

Tekst1 = "Begin"+Tab+"Tab0"+Tab+"Tab1"+Tab+"Tab2"

MijnTekst.insertString( MijnCursor, Tekst1, false)

U kunt alle tabs in een keer aanmaken, met een overzicht waarin het benodigde aantal stops. Elke stop bestaat uit meerdere waarden :

Eigenschap	Betekenis
Position	De positie van de tabstop vanaf de linkermarge, in 1/100 mm.
Alignment	Het type tabulatie, in de vorm van een verschrikkelijke constante hieronder beschreven.
DecimalChar	Het decimale scheidingsteken ( in Nederland, de komma).
FillChar	Het opvulteken, dat vervangt de spaties, bijvoorbeeld een punt.

De mogelijke types van tabulatie zijn :

Constante	Betekenis
LEFT	De tabstop bevindt zich links van de in te springen tekst.
CENTER	De tabstop bevindt zich in het midden van de in te springen tekst
RIGHT	De tabstop bevindt zich rechts van de in te springen tekst
DECIMAL	De tabstop bevindt zich op de plaats van het decimale scheidingsteken.
DEFAULT	Gebruiken van het standaard gedefinieerde tabulatietype.

Opmerking : de uitleg in de API (versie van 04/02/2003) over de types van tabulatie zijn helemaal fout.

Zoeken en vervangen van tekst

Vervangen van een reeks door de gehele tekst

Schrijf in een Writer document meerdere malen de tekenreeks “ Annette ”. De volgende macro vervangt alle woorden “ Annette ” door “ Josien ” in het gehele document, zonder de tekenreeksen, zoals “ Jannette ” aan te passen.

Dim MijnDocument As Object

Dim IkZoek As Object

Dim AantalKeren As Long

MijnDocument = ThisComponent

IkZoek= MijnDocument.createReplaceDescriptor

with IkZoek

.SearchString = "Annette"

.ReplaceString = "Josien"

.SearchWords = true ' standaard : false

.SearchCaseSensitive = true 'standaard : false

end with

AantalKeren = MijnDocument.replaceAll(IkZoek)

print AantalKeren, "vervanging(en)!"

Uitleg :

Men creëert een object IkZoek dat alle benodigde parameters bevat voor de vervanging. De initialisatie vereist meerdere instructies; Om ergerlijke herhalingen van IkZoek bij elke instructie te vermijden, gebruikt men de zin With IkZoek ... end With (letterlijk : Met ... ).

De eigenschappen van de beschrijving om te vervangen staan u toe om de zoekactie te specificeren :

Eigenschap	Betekenis
SearchString	De tekenreeks om te zoeken
ReplaceString	De tekenreeks om te vervangen. Standaard is deze reeks leeg, zodat u die kunt weglaten.
SearchWords	boolean; true voor het niet zoeken op woorden; standaard zoekt men niet op de daar ingevoerde tekenreeks.
SearchCaseSensitive	boolean; true om onderscheid te maken tussen Hoofd-/kleine letters in de zoekactie; standaard is er geen onderscheid. (1)
SearchBackwards	boolean; true om een achterwaartse zoekactie te doen (heeft weinig nut); standaard zoekt men in de normale leesrichting.
SearchRegularExpression	boolean; true voor een zoekactie met gangbare uitdrukkingen (als dit u niets zegt, gebruik het dan niet); standaard zoekt men op een simpele overeenkomst van de reeks. (2)
SearchStyles	boolean; true voor een zoekactie op het bij SearchString opgegeven alineaopmaakprofiel; standaard zoekt men op tekst.
SearchSimilarity	boolean; true voor een zoekactie van een overeenkomende tekst met de gezochte tekst (2) (3)
SearchSimilarityAdd	Aantal toegevoegde tekens om de gezochte tekst te vinden
SearchSimilarityRemove	Aantal weggelaten tekens om de gezochte tekst te vinden
SearchSimilarityExchange	Aantal te vervangen tekens om de gezochte tekst te vinden
SearchSimilarityRelax	boolean; true om te trachten aan alle combinaties van drie eerder opgegeven criteria te voldoen bij het vinden van de gezochte tekst

Opmerkingen :

(1) Het zoeken zonder onderscheid Hoofd-/kleine-letters maakt wel onderscheidt echter wel accenttekens.

(2) Functie alleen vanaf versie 1.1 van OpenOffice

(3) Vul alle vereiste criteria in, de standaardwaarden zijn niet nul.

Vervangen van een alieneaopmaakprofiel door de gehele tekst

Deze macro vervangt alle gebruikte alineaopmaakprofielen “ Kop 4 ” door Kop 5 :

Dim MijnDocument As Object

Dim IkZoek As Object

Dim MijnCursor As Object

Dim eenstijl as string

MijnDocument = ThisComponent

IkZoek= MijnDocument.createReplaceDescriptor

with IkZoek

.SearchString = "Kop 4"

.ReplaceString = "Kop 5"

.SearchStyles = true

end with

MijnDocument.replaceAll(IkZoek)

Herlees bij dit onderwerp de opmerkingen over de namen van de Alineaopmaakprofielen.

Zoeken en wijzigen van tekst

De methoden in dit hoofdstuk staan u toe wijzigingen aan te brengen in bepaalde elementen, bijvoorbeeld veranderen van de opmaak van bepaalde woorden. Daarboven kan de zoekactie beperkt worden tot een gedeelte van de gehele tekst.

Zoeken in de gehele tekst

Deze macro zoekt de woorden “ hallo ” in de gehele tekst en zet ze in vet.

Dim MijnDocument As Object

Dim Ik Zoek As Object

Dim Gevonden As Object

MijnDocument = ThisComponent

IkZoek= MijnDocument.createSearchDescriptor

with IkZoek

.SearchString = "hallo"

.SearchWords = true

end with

Gevonden = MijnDocument.findFirst(IkZoek)

Do Until isNull(posTrouve)

Gevonden.CharWeight = com.sun.star.awt.FontWeight.BOLD

Gevonden = MijnDocument.findNext(Gevonden.End, IkZoek)

Loop

De structuur van de zoek-omschrijving is een sub-onderdeel van de zoeken-en-vervangen omschrijvingen.

De instructie findFirst begint het zoeken aan het begin van de tekst. Het object Gevonden is een cursor die de gezochte doelen selecteert. Men kan dus de reeds getoonde methoden gebruiken om dat doel te wijzigen : tekst schrijven, opmaakprofiel veranderen, opmaak veranderen. Dit eventueel na een analyse van het doel (blijkens actuele opmaak, de positie in de tekst, etc).

De instructie findNext zoekt vanaf de aangegeven positie naar het eerstvolgende argument. Als dat argument de rand is van het voorafgaand gevonden doel, gaat het zoeken voort daar waar men is gebleven.

Uiteindelijk, het zoeken mislukt en findNext ( of findFirst ) geven een nul-element weer.

Tekst zoeken in een door de gebruiker opgegeven selectie

Deze variant gaat er van uit dat de gebruiker een enkel bereik in de tekst heeft geselecteerd. Men kan de tekst in deze selectie doorzoeken.

Dim MijnDocument As Object, MijnTekst As Object

Dim ZichtbareCursor As Object

Dim IkZoek As Object

Dim Gevonden As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

ZichtbareCursor = MijnDocument.currentcontroller.ViewCursor()

IkZoek= MijnDocument.createSearchDescriptor

with IkZoek

.SearchString = "hallo"

.SearchWords = true

end with

Gevonden = MijnDocument.findNext(ZichtbareCursor.Start, IkZoek)

Do Until isNull(Gevonden)

if MijnTekst.compareRegionEnds(Gevonden, ZichtbareCursor)< 0 then Exit Do

Gevonden.CharWeight = com.sun.star.awt.FontWeight.BOLD

Gevonden = MijnDocument.findNext(Gevonden.End, IkZoek)

Loop

Het zoeken begint met findNext teneinde te kunnen beginnen op de positie aan het begin van de selectie. De functie compareRegionEnds vergelijkt de eindposities in de twee cursors.

Tekst zoeken in een bepaald bereik

Om het zoeken uit te voeren in een bepaald bereik in de tekst, volstaat het een cursor via programmeren te definiëren. In deze variant, zoekt men in de tweede alinea van de tekst :

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

Dim IkZoek As Object

Dim Gevonden As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor ' cursor aan begin van het document

MijnCursor.gotoNextParagraph(false) ' cursor aan begin van de 2e alinea

MijnCursor.gotoNextParagraph(true) ' cursor selecteert de 2e alinea

IkZoek= MijnDocument.createSearchDescriptor

with ikZoek

.SearchString = "hallo"

.SearchWords = true

end with

Gevonden = MijnDocument.findNext(MijnCursor.Start, IkZoek)

Do Until isNull(Gevonden)

if MijnTekst.compareRegionEnds(Gevonden, MijnCursor)< 0 then Exit Do

Gevonden.CharWeight = com.sun.star.awt.FontWeight.BOLD

Gevonden = MijnDocument.findNext(Gevonden.End, IkZoek)

Loop

De tabellen in een Writer-document

Invoegen van een tabel

Uitgaande van een geopend Writer document, met een tekstcursor geplaatst daar waar u een tabel wilt invoegen, ziet u hier hoe u een tabel met 5 rijen en 9 kolommen invoegt :

DimMijnTabel As Object

MijnTabel = MijnDocument.createInstance("com.sun.star.text.TextTable")

MijnTabel.initialize(5,9) ' aantal : rijen, kolommen

MijnTekst.insertTextContent(MijnCursor, MijnTabel, false)

Het argument createInstance is een “ magische formule ” om probleemloos over te nemen.

De methode insertTextContent staat u toe een object op een bepaalde plek in de tekst in te voegen, op de positie van de cursor. Hier is het object een tabel. Het derde argument betekent :

false = invoegen in de tekst

true = verwijderen uit de tekst

Eigenschappen van een tabel

De controle van de grootte van de tabel wordt behandelt in het volgende hoofdstuk. Belangrijkste andere eigenschappen :

Eigenschap	Betekenis
RepeatHeadline	boolean; true om de kopregel op elke nieuwe pagina te herhalen; waarde false als standaard
BreakType	Voegt een paginaeinde of kolomeinde in voor of na de tabel. Zelfde waarden als voor normale tekst
Split	boolean; false om op te geven dat de tabel niet over twee pagina's of twee kolommen wordt verdeeld (op voorwaarde dat de tabel op een pagina past !); waarde true als standaard, dus de tabel zal zich over twee of meer pagina's uitstrekken
BackColor	kleur van de achtergrond in de tabelcellen
Name	tekenreeks, naam van de tabel

Voorbeeld, dat gebruikt With om de tekst te beperken :

MijnTabel = MijnDocument.createInstance("com.sun.star.text.TextTable")

with MijnTabel

.RepeatHeadline = true

.BreakType = com.sun.star.style.BreakType.PAGE_AFTER

.BackColor = RGB(255,255,204) ' alles in lichtgeel

.initialize(55,4) ' aantal : rijen, kolommen

end with

MijnTekst.insertTextContent(MijnCursor, MijnTabel, false)

Grootte van de tabel

Er bestaan meerdere inter-afhankelijke eigenschappen die de grootte van een tabel aanpassen. Zoals met de voorgaande eigenschappen, is het helder om ze te definiëren vóórdat wordt aangeroepen initialize.

Horizontale plaatsing

De eigenschap HoriOrient definieert hoe de tabel horizontaal wordt geplaatst, met betrekking tot de marges. Het is een verschrikkelijke constante met als standaardwaarde :

com.sun.star.text.HoriOrientation.FULL

Belangrijkste mogelijke waarden :

Constante	Betekenis
NONE	Tabel wordt weergegeven van linker- naar rechtermarge
RIGHT	Tabel uitgelijnd aan rechtermarge
LEFT	Tabel uitgelijnd aan linkermarge
CENTER	Tabel gecentreerd in de beschikbare ruimte
FULL	Tabel wordt weergegeven in de gehele beschikbare ruimte, zonder tabelmarges
LEFT_AND_WIDTH	Tabel uitgelijnd aan linkermarge, met een opgegeven grootte door de eigenschap WIDTH

Hoewel de standaardwaarde FULL is, is het absoluut noodzakelijk een andere waarde op te geven om een grootte in te stellen.

Regelen van de grootte

Eigenschap	Betekenis
IsWidthRelative	boolean; true als RelativeWidth in aanmerking wordt genomen; false als Width in aanmerking wordt genomen
RelativeWidth	Grootte in percentage van vrije ruimte tussen de linker- en rechtermarge; waarde tussen 1 en 100
Width	Absolute grootte, in 1/100 de mm
LeftMargin	Absolute grootte van de linkermarge, in 1/100 van mm
RightMargin	Absolute grootte van de rechtermarge, in 1/100 van mm

Praktische toepassingen

Gecentreerde tabel, grootte 80%

with MijnTabel

.HoriOrient = com.sun.star.text.HoriOrientation.CENTER

.IsWidthRelative = true

.RelativeWidth = 80

.initialize(10,4) ' aantal : rijen, kolommen

end with

In OOo versie 1.0.2 is de grootte van de laatste kolom niet goed.
De eigenschappen LeftMargin en RightMargin worden genegeerd bij de oriëntatie CENTER.

Gecentreerde tabel, absolute grootte

with MijnTabel

.HoriOrient = com.sun.star.text.HoriOrientation.CENTER

.IsWidthRelative = false

.Width = 8000

.initialize(10,4) ' aantal : rijen, kolommen

end with

In OOo versie 1.0.2 is de verkregen grootte veel groter dan wordt ingesteld.
De eigenschappen LeftMargin en RightMargin worden genegeerd bij de oriëntatie CENTER.

Links uitgelijnde tabel, grootte 80%

with MijnTabel

.HoriOrient = com.sun.star.text.HoriOrientation.LEFT_AND_WIDTH

.IsWidthRelative = true

.RelativeWidth = 80

.LeftMargin = 20*100 ' 10 mm

.initialize(10,4) ' aantal : rijen, kolommen

end with

In OOo versie 1.0.2 is de grootte van de laatste kolom niet goed.
De eigenschap RightMargin wordt genegeerd met de oriëntatie LEFT_AND_WIDTH.

Links uitgelijnde tabel, absolute grootte

with MijnTabel

.HoriOrient = com.sun.star.text.HoriOrientation.LEFT_AND_WIDTH

.IsWidthRelative = false

.Width = 7000

.LeftMargin = 10*100 ' 10 mm

.initialize(10,4) ' aantal : rijen, kolommen

end with

In OOo versie 1.0.2 is de verkregen grootte veel groter dan wordt ingesteld.
De eigenschap RightMargin wordt genegeerd bij de oriëntatie LEFT_AND_WIDTH.

Tabel weergegeven tussen de linker- en rechtermarge

with MijnTabel

.HoriOrient = com.sun.star.text.HoriOrientation.NONE

.LeftMargin = 20*100 ' 10 mm

.RightMargin = 35*100 ' 15 mm

.initialize(10,4) ' aantal : rijen, kolommen

end with

De eigenschappen IsWidthRelative, RelativeWidth, Width, worden genegeerd.

Verplaatsen in een tabel

Om te schrijven in de cellen van een tabel, moet u weten hoe u zich tussen de cellen verplaatst. In Writer, de cel van een tabel wordt gevonden door zijn alfanumerieke adres, bijvoorbeeld “ B7 ”, dat hetzelfde terugvinden is als in een werkblad van Calc. Hier is het geldig omdat de simpele tabellen bestaan uit een regelmatig patroon van rijen en kolommen. Bijvoorbeeld, men schrijft als volgt een tekst eenvoudig in een bepaalde cel :

Dim EenCel As Object

EenCel = MaTable.getCellByName("G3")

EenCel.String = "een kleine tekst"

Verplaatsen met een celcursor

Men kan een celcursor gebruiken, notatie identiek als die van kijk naar Calc.

De volgende macro schrijft in alle cellen van een tabel waarvan men het aantal cellen en kolommen kent (9 en 5 in het voorbeeld), gaande van links naar rechts op elke rij en van de eerste naar de laatste rij :

Dim MijnCelCursor As Object

Dim EenCel As Object

Dim x1 As Integer, y1 As Integer

MijnCelCursor = MijnTabel.createCursorByCellName("A1")

for x1 = 0 to 4

for y1 = 0 to 8

EenCel = MijnTabel.getCellByName(MijnCelCursor.RangeName)

EenCel.String = Str(x1*100 +y1)

MijnCelCursor.goRight(1, false)

next y1

next x1

Men definieert de celcursor en plaatst die tegelijkertijd in een initieel adres van een cel, hier : A1. De cursor verplaatst zich van cel tot cel met de methode goRight, die een rij lager gaat aan het einde van de voorgaande rij.

Een cel kan misschien niet worden verkregen met zijn alfanumerieke adres, door gebruik van het argument getCellByName. De eigenschap RangeName gaat verder vanaf de celcursor.

Wijzigen van de eigenschap String van een tabelcel is de meest simpele oplossing voor het schrijven van een tekst in een cel, maar het zal de standaardopmaak van de cel opheffen. Wij verschaffen verderop een geprepareerde methode.

Lijst van instructies voor de cursor

het tweede argument van goRight betekent :

false = verplaats de cursor

true = verplaats de cursor en selecteer meerdere cellen.

De instructies voor het verplaatsen van de cursor hebben een identieke syntaxis :

Methode	Betekenis
goRight(n, false)	Verplaats n cellen naar rechts, eventueel met regeleinde
goLeft(n, false)	Verplaats n cellen naar links, eventueel met regeleinde
goUp(n, false)	Verplaats n cellen naar boven
goDown(n, false)	Verplaats n cellen naar beneden
gotoStart(false)	Verplaats naar de eerste cel, linksboven
gotoEnd(false)	Verplaats naar de laatste cel, rechtsonder

Verplaatsen zonder celcursor

Het gebruik van een celcursor is nogal lastig wanneer men toegang wil tot een cel waarvan men de coördinaten van de rij en kolom weet. De volgende macro herhaalt het voorgaande voorbeeld, maar met een directe toegang tot een bepaalde cel :

Dim EenCel As Object

Dim x1 As Integer, y1 As Integer

for x1 = 0 to 4 ' rij-index, Calc-stijl

for y1 = 0 to 8 ' kolom-index, Calc-stijl

EenCel = MijnTabel.getCellByName(TekstCel(x1, y1))

EenCel.String = Str(x1*100 +y1)

next y1

next x1

De functie TekstCel staat niet in de API, het is een functie die u als volgt noteert :

rem omzetten van de rij-/kolom-index naar de naam van de cel

Function TekstCel(Rij As Integer, Kolom As Integer) As String

if (Kolom > 25) or (Kolom<0) or (Rij<0) then

TekstCel = "??"

else

TekstCel = Chr(ASC("A") +Kolom) +LTrim(Str(Rij+1))

end if

End Function

Zij zet een numeriek rij-/kolom-coördinaat (geteld vanaf nul) om in een alfanumeriek coördinaat. Zij functioneert in tabellen met minder dan 26 kolommen, hetgeen voldoende zou moeten zijn voor uw werk...

Celbereiken

We kunnen meerdere cellen in een tabel selecteren en de celcursor verplaatsen met het argument true. Voorbeeld :

MijnCelCursor = MijnTabel.createCursorByCellName("B3")

MijnCelCursor.goRight(1, true)

MijnCelcursor.goDown(1, true)

print MijnCelcursor.Rangename

Als u uitvoert de regel print ziet u “ C4:B3 ”. Het geselecteerde bereik wordt gedefinieerd door de diagonale celcoördinaten (B3:C4 is hetzelfde).

De celcursor omvat nu een celbereik. Met een dergelijke cursor kan men algemene bewerkingen uitvoeren in alle cellen in het bereik.

Merk op dat createCursorByCellName slechts een enkele cel omvat, geen celbereik.

Schrijven van tekst in een tabelcel

Na toegang te hebben gekregen tot een cel via de hierboven omschrijven wijze, kan men een tekst schrijven met behulp van een tekstcursor binnen de cel. De mogelijkheden voor het schrijven zijn exact hetzelfde als voor normale tekst schrijven. Zoals we al hebben gezien, vervangt de eigenschap String de gehele inhoud van een cel door een tekst, of om de onbewerkte tekst van de cel te herstellen; de methoden getString en setString bestaan niet.

Dim CursorInCel As Object

Dim AlineaEinde As Integer

AlineaEinde = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK

EenCel = MijnTabel.getCellByName("B3") ' (bijvoorbeeld)

CursorInCel = EenCel.createTextCursor

EenCel.insertString(CursorInCel, "OpenOffice is", false)

EenCel.insertControlCharacter(CursorInCel, AlineaEinde, false)

CursorInCel.CharWeight = com.sun.star.awt.FontWeight.BOLD

EenCel.insertString(CursorInCel, " formidabel !", false)

De rest is identiek, speciale tekens, opmaakprofiel, opmaak. Neem de corresponderende hoofdstukken over en vervang MijnCursor door CursorInCel.

Som van de cellen in een tabel

Het volgende voorbeeld zal getallen invullen in de cellen A2, A3, A4 van een tabel en daarna in A5 een berekeningsformule plaatsen voor de som van de cellen.

EenCel = MijnTabel.getCellByName("A2")

EenCel.Value = 22.5

EenCel = MijnTabel.getCellByName("A3")

EenCel.Value = -84

EenCel = Mijntabel.getCellByName("A4")

EenCel.Value = 47/3

EenCel = Mijntabel.getCellByName("A5")

EenCel.Formula = "sum(<A2:A4>)"

Opmerking

De eigenschap Value is nodig om de cel te vullen met een numerieke waarde, en niet voor een tekst. Een getal dat decimalen bevat met worden geschreven in de Engelse notatie (met een decimale punt), het zal in het document worden weergegeven overeenkomstig de regels van de lokalisatie. De expressie 47/3 wordt in de cel met zijn numerieke resultaat geschreven.

Toegang krijgen tot een rij

De eigenschap Rows geeft de rijen van de tabel weer. Men krijgt toegang tot een bepaalde rij via zijn rangnummer (rij nul voor de eerste rij). Het voorbeeld noemt de belangrijkste eigenschappen; het stelt de hoogte van de 31e rij in op 20 millimeter en met een achtergrondkleur :

Dim RijCellen As Object

RijCellen = MijnTabel.Rows

RijCellen(30).IsAutoHeight = false

RijCellen(30).Height = 2000 ' 20 mm

RijCellen(30).BackColor = RGB(255,255,204)

Om de hoogte van de cel in te stellen is het nodig om de eigenschap IsAutoHeight op te heffen, die de hoogte van de cel standaard aanpast aan de inhoud van de cellen van de rij. De hoogte wordt aangeduid in 1/100 mm.

Achtergrondkleur van een tabel

Gehele tabel

MijnTabel.BackColor = RGB(255,255,204)

Een enkele cel

EenCel.BackColor = RGB(255,255,204)

Een rij

RijCellen(0).BackColor = RGB(255,255,204) ' de eerste rij

Een kolom

Jammer, er bestaat geen eigenschap hiervoor !
Oplossing : selecteer het celbereik overeenkomend met de kolom. Voorbeeld voor de kolom D van een tabel van 5 rijen :

MijnCelCursor = MijnTabel.createCursorByCellName("D1")

MijnCelCursor.goDown(4, true)

MijnCelCursor.BackColor = RGB(255,255,204)

Invoegen meerdere tabellen

Voor elke invoeging van een tabel is het nodig een nieuwe TextTable te maken. Het is ook nodig om, elke keer als de eigenschappen van de tabel te herdefiniëren. In dit voorbeeld voegt men twee tabellen, met dezelfde afmetingen en achtergrondkleur, in twee alinea's van het Writer-document in:

MijnTabel = MijnDocument.createInstance("com.sun.star.text.TextTable")

MijnTabel.initialize(5,4)

MijnTabel.BackColor = RGB(255,255,204)

MijnTekst.insertTextContent(MijnCursor, MijnTabel, false)

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextParagraph(false)

MijnTabel = MijnDocument.createInstance("com.sun.star.text.TextTable")

MijnTabel.initialize(5,4)

MijnTabel.BackColor = RGB(255,255,204)

Mijntekst.insertTextContent(MijnCursor, MijnTabel, false)

Tabel vinden via zijn naam

U kunt het schrijven van tekst via de macro aanzienlijk vereenvoudigen als u een voorgedefinieerd document invult (of een documentsjabloon) die de vaste structuur van het document bevat en de reeds gevormde, maar lege, tabellen, die zullen worden ingevuld door een macro. Herinner u dat elke tabel een naam heeft (standaard : Tabel1, Tabel2, etc, op aanmaakvolgorde). Met de Navigator kunt u elke tabel een eigen, meer specifieke, naam geven.

Vervolgens is het voldoende om in de macro de tabel met zijn naam aan te duiden :

MijnTabel = MijnDocument.TextTables.getByName("MooieTabel")

Nu kunt u alle voorgaande instructies gebruiken om de tabel in te vullen of te wijzigen. Natuurlijk moet de macro de naam van de tabel en het type informatie dat hij in moet vullen, weten. De naam van de tabel moet exact zo worden geschreven als in zijn definitie.

De instructie getByName levert een foutmelding op als er geen enkele tabel bestaat met die naam. U kunt het bestaan van de tabel ook als volgt testen :

if MijnDocument.TextTables.hasByName("MooieTabel") then

rem de tabel bestaat !

end if

Enfin, een tabel hernoemen is erg simpel :

MijnTabel = MijnDocument.TextTables.getByName("MooieTabel")

MijnTabel.Name = "MijnMooieTabel"

Een tabelnaam mag geen spaties bevatten.

Onregelmatige tabellen

Nemen we als voorbeeld een tabel bestaande uit 5 rijen en 4 kolommen, goed regelmatig.

A1	B1	C1	D1
A2	B2	C2	D2
A3	B3	C3	D3
A4	B4	C4	D4
A5	B5	C5	D5

Men ziet in elke cel zijn alfanumerieke coördinaten.

Samenvoegen van cellen

Uit esthetisch oogpunt of betiteling is het soms nodig meerdere aaneensluitende cellen samen te voegen. Daarvoor selecteert men het samen te voegen celbereik, waarna men gebruikt de methode mergeRange :

MijnCelCursor = MijnTabel.createCursorByCellName("B3")

MijncelCursor.goRight(1, true)

MijnCelCursor.goDown(1, true)

MijnCelCursor.mergeRange ' voegt bereik B3:C4 samen

Als de geselecteerde cellen tekst bevatten, worden de alinea's aaneengesloten in de resultaatcel.

Het probleem, dat is dat de coördinaten van de cellen nu nogal speciaal zijn :

A1	B1	C1	D1
A2	B2	C2	D2
A3.1.1 A3.1.2	B3	C3.1.1 C3.1.2
A4	B4	C4	D4

In feite, OpenOffice neemt nu aan dat het een tabel van 4 rijen heeft, waarvan men horizontaal heeft gedeeld de cel A3 en de cel C3. Om een bepaalde “ onder-cel ” aan te duiden, gebruikt men het originele alfanumerieke coördinaat van de oorsprong-cel, en men voegt de volgorde van de kolom en de rij van de onder-cel toe in de oorsprong-cel. En hier telt men vanaf 1 ! In de tabel bijvoorbeeld, de onder-cel A3.1.2 ligt in de eerste kolom en de twee rij van het vierkant van de oude cel A3.

Handigheidje

Als u klikt binnen een cel van de tabel, zult u de coördinaten zien weergegeven rechtsonder in het Writer venster ! Zeer praktisch om ze terug te vinden in complexe tabellen.

Delen van een cel

Vanaf een cursor die een cel of een celbereik aanduidt, kan men die oorsprong-cel delen, horizontaal of verticaal, in meerdere onder-cellen :

MijnCelCursor.splitRange(2, true) ' deel horizontaal

Het eerste argument is het aantal te creëren onder-cellen, in het voorbeeld is dat 2, dus men eindigt met 3 onder-cellen per gedeelde cel! Het tweede argument betekent :

false voor verticale deling

true voor horizontale deling

Resultaat van een horizontale deling :

A1	B1	C1	D1
A2	B2	C2	D2
A3	B3.1.1 B3.1.2 B3.1.3	C3.1.1 C3.1.2 C3.1.3	
A4	B4.1.1 B4.1.2 B4.1.3	C4.1.1 C4.1.2 C4.1.3	D4
A5	B5	C5	D5

Resultaat van een verticale deling :

A1	B1	C1	D1
A2	B2	C2	D2
A3	B3	C3	D3	E3	F3	G3	H3
A4	B4	C4	D4	E4	F4	G4	H4
A5	B5	C5	D5

Hier strookt de methode van vinden niet met de voorgaande en correspondeert niet met hetgeen wordt vermeld in de API bij getCellByName. ( Hier is gekeken naar OOo versie 1.0.2 en de API gedateerd op 04/02/2003 )

Algemeen

De bewerkingen van deling of samenvoegen kunnen worden herhaald voor nieuwe cellen. Maar de adressering wordt daar meer ingewikkelder door.

De kaders in een Writer document

In het Engels wordt het woord “ kader ” vertaald als “ frame ”.

Kader invoegen

Kijk hier hoe een kader in te voegen aannemende dat een Writer-document is geopend, met een tekstcursor geplaatst daar waar u een kader wilt invoegen :

Dim MijnKader As Object

MijnKader = MijnDocument.createInstance("com.sun.star.text.TextFrame")

MijnKader.Width = 10400 ' 104 mm breedte

MijnKader.Height = 2530 ' 25,3 mm hoogte

MijnTekst.insertTextContent( MijnCursor, MijnKader, false)

Het argument createInstance is een “ magische formule ” om probleemloos over te nemen.

De methode insertTextContent lat het invoegen van een object, ergens in de tekst, toe, op de plaats van de cursor. Hier is het object een kader. Het derde argument betekent :

false = invoegen in de tekst

true = overschrijven in de tekst

Het voorbeeld gebruikt minimale instructies. Praktisch moeten worden aangeduid :

of de hoogte van het kader zich aanpast aan de inhoud, of niet

vanaf waar het kader zich plaatst ( het anker van het kader ),

zijn absolute positie vanaf het anker, of

zijn relatieve positie, gedefinieerd door :

het bereik waar het kader geplaatst mag,

zijn horizontale positie in dat bereik (links, gecentreerd, rechts),

zijn verticale positie in dat bereik (boven, gecentreerd, beneden).

Elastische kaders

De hoogte van het kader kan zich aanpassen aan de inhoud van het kader, bijvoorbeeld als men meerdere regels tekst schrijft. Hier wordt dat gedefinieerd door de eigenschap SizeType :

MijnKader.SizeType = com.sun.star.text.SizeType.FIX

De verschillende mogelijke waarden zijn de volgende verschrikkelijke constanten :

Constante	Betekenis
VARIABLE	De hoogte is afhankelijk van de inhoud
FIX	De hoogte staat vast, ingesteld door Height
MIN	De hoogte is minimaal zoals aangeduid door Height (standaardwaarde)

De verschillende ankers voor kaders

De keuzes uit de ankertypen zijn zo :

MijnKader.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE

De mogelijke ankerwaarden zijn de verschrikkelijke constanten, opgesomd in de tabel hieronder.

Constante	Betekenis
AT_PARAGRAPH	Anker aan de alinea aangeduid door de cursor (standaardwaarde)
AS_CHARACTER	Anker als het kader een teken is; de hoogte van de regel past zich aan aan de maat van het kader
AT_PAGE	Anker aan de pagina AnchorPageNo bevat het paginanummer; Standaardwaarde is de pagina waar de tekstcursor zich bevindt.
AT_FRAME	Anker aan een kader AnchorFrame bevat het kader dat dient als ankerplaats; zie voorbeeld verderop
AT_CHARACTER	Anker aan door de cursor aangeduid teken

Gebruikte methoden bij plaatsen van een kader

Een kader wordt geplaatst :

op de absolute manier, met een afstand van 1/100 van een millimeter tussen de linkerbovenhoek van het anker en de linkerbovenhoek van het kader.

Op de relatieve manier, dat wil zeggen en beschreven met betrekking tot een bereik dat wordt verenigd met het kader. Het gehele bereik moet ook worden gedefinieerd.

De absolute of relatieve positie kan onafhankelijk worden gekozen voor de horizontale en verticale positie.

Het aantal mogelijke combinaties van ankerplaats / verenigd bereik / relatieve positie geven soms identieke resultaten, maar zijn slechts zichtbaar als de afmetingen van het kader en de alinea overeenkomen. Probeer het maar.

Als u handmatig een kader invoegt in een tekst, geeft een rechtsklik in het kader toegang tot zijn eigenschappen : ankeren en uitlijning. De uitlijning correspondeert met de relatieve positie van het kader.

Absolute plaatsing van het kader

Plaatsing horizontaal :

MijnKader.HoriOrient = com.sun.star.text.HoriOrientation.NONE

MijnKader.HoriOrientPosition = 2500 ' 25 mm

Plaatsing verticaal :

MijnKader.VertOrient = com.sun.star.text.VertOrientation.NONE

MijnKader.VertOrientPosition = 5500 ' 55 mm

De verschrikkelijke constanten xxx.NONE dient om aan te geven dat de positie absoluut is.

Relatieve horizontale plaatsing

Verenigd bereik

Het verenigde bereik wordt gespecificeerd door de eigenschap HoriOrientRelation die de verschrikkelijke constanten gebruikt, voorbeeld :

MijnKader.HoriOrientRelation = com.sun.star.text.RelOrientation.PAGE_LEFT

De mogelijke waarden voor HoriOrientRelation hangen af van het type van de ankerplaats.

Mogelijke waarden voor een ankerplaats AT_PARAGRAPH :

Constante	Betekenis
FRAME	De gehele alinea, met inbegrip van de marges
PRINT_AREA	De gehele alinea, zonder zijn marges (standaardwaarde)
PAGE_LEFT	In de linker-paginamarge; in principe moet het kader klein gehouden worden om te passen binnen die marge
PAGE_RIGHT	In de rechter-paginamarge; zelfde opmerking
FRAME_LEFT	In de linker-alineamarge; zelfde opmerking
FRAME_RIGHT	In de rechter-alineamarge; zelfde opmerking

Mogelijke waarden voor een ankerplaats AT_PAGE :

Constante	Betekenis
PAGE_LEFT	In de linker-paginamarge; in principe moet het kader klein gehouden worden om te passen binnen die marge
PAGE_RIGHT	In de rechter-paginamarge; zelfde opmerking
PAGE_FRAME	Gehele pagina, met inbegrip van de marges
PAGE_PRINT_AREA	Gehele pagina zonder de marges (standaardwaarde)

Mogelijke waarden voor een ankerplaats AT_FRAME :

zoals voor AT_PARAGRAPH, maar in dit geval bevindt de tekstalinea zich binnen het eerste kader.

Situatie met betrekking tot een verenigd bereik

De eigenschap HoriOrient definieert hoe het kader horizontaal wordt geplaatst, met betrekking tot het verenigd bereik. Zij gebruikt de verschrikkelijke constanten, voorbeeld :

MijnKader.HoriOrient = com.sun.star.text.HoriOrientation.LEFT

De mogelijke waarden :

Constante	Betekenis
RIGHT	Kader uitgelijnd aan de rechtermarge
LEFT	Kader uitgelijnd aan de linkermarge
CENTER	Kader gecentreerd in de beschikbare ruimte

Relatieve verticale plaatsing

Verenigd bereik

Het verenigd bereik wordt gespecificeerd door de eigenschap HoriOrientRelation die de verschrikkelijke constanten gebruikt, bijvoorbeeld:

MijnKader.VertOrientRelation = com.sun.star.text.RelOrientation.PAGE_LEFT

De mogelijke waarden voor VertOrientRelation hangen af van het type van de ankerplaats.

Mogelijke waarden voor een anker AT_PARAGRAPH :

Constante	Betekenis
FRAME	De gehele alinea, met inbegrip van de marges
PRINT_AREA	De gehele alinea, zonder zijn marges (standaardwaarde)

Mogelijke waarden voor een anker AT_PAGE :

Constante	Betekenis
PAGE_FRAME	De gehele pagina, met inbegrip van de marges
PAGE_PRINT_AREA	De gehele pagina, zonder zijn marges (standaardwaarde)

Mogelijke waarden voor een anker AT_FRAME :

zoals voor AT_PARAGRAPH, maar in dit geval bevindt de tekstalinea zich binnen het eerste kader.

Situatie met betrekking tot het verenigd bereik

De eigenschap VertOrient definieert hoe het kader horizontaal wordt geplaatst, met betrekking tot het verenigd bereik. Zij gebruikt de verschrikkelijke constanten, voorbeeld :

MijnKader.VertOrient = com.sun.star.text.VertOrientation.TOP

Mogelijke waarden voor een verenigd bereik AT_PAGE :

Constante	Betekenis
TOP	Kader boven aan de pagina
CENTER	Kader gecentreerd op de pagina
BOTTOM	Kader beneden aan de pagina

Mogelijke waarden voor een verenigd bereik AT_PARAGRAPH en relatieve oriëntatie PRINT_AREA :

Constante	Betekenis
TOP	De bovenzijde van het kader wordt gecentreerd aan de bovenzijde van de tekstregel
CENTER	De hoogte van het kader wordt gecentreerd aan het midden van de tekstregel
BOTTOM	De onderzijde van het kader wordt gecentreerd aan de onderzijde van de tekstregel

Voorbeeld complete invoeging van een kader

In dit voorbeeld creëert men een klein kader, geplaatst in de linkermarge van de pagina, rechts geplaatst en midden op de pagina. Daarna schrijft men de letter X in het kader.

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

Dim MijnKader As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

rem - - plaats de cursor waar u wilt - -

MijnKader = MijnDocument.createInstance("com.sun.star.text.TextFrame")

With MijnKader

.Width = 1000

.Height = 800

.SizeType = com.sun.star.text.SizeType.FIX

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE

.VertOrient = com.sun.star.text.VertOrientation.CENTER

.VertOrientRelation = com.sun.star.text.RelOrientation.PAGE_FRAME

.HoriOrient = com.sun.star.text.HoriOrientation.RIGHT

.HoriOrientRelation = com.sun.star.text.RelOrientation.PAGE_LEFT

End With

MijnTekst.insertTextContent( MijnCursor, MijnKader, false)

MijnKader.Text.String = "X"

Tekst schrijven in een kader

Alle tekstverwerking mogelijkheden die bestaan voor normale tekst zijn ook beschikbaar voor het schrijven in een kader. Het is voldoende om een variabele tekst en een tekstcursor te gebruiken, zoals hier :

Dim MijnTekst1 As Object, MijnCursor1 As Object

rem - - initialisatie en invoegen van het kader - -

MijnTekst1 = MijnKader.Text

MijnCursor1 = Mijntekst1.createTextCursor

MijnTekst1.insertString(MijnCursor1, "Tekst in het kader", false)

Invoegen meerdere kaders

Bij elke invoeging van een kader is het noodzakelijk om een nieuw TextFrame aan te roepen, zelfs als men meerdere malen hetzelfde kader invoegt. Ook moeten elke keer de eigenschappen van het kader worden gedefinieerd. In dit voorbeeld voegt men twee kaders in met dezelfde afmetingen, kleur en positie in twee alinea's in een Writer document :

MijnKader = MijnDocument.createInstance("com.sun.star.text.TextFrame")

With MijnKader

.Height = 1500

.Width = 4000

.BackColor = RGB(255,200,255)

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH

.HoriOrient = com.sun.star.text.HoriOrientation.NONE

.HoriOrientPosition = 2500 ' eenheid : 1/100 mm

End With

MijnTekst.insertTextContent( MijnCursor, MijnKader, false)

MijnKader.Text.String = "Invoeging 1"

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextParagraph(false)

MijnKader = MijnDocument.createInstance("com.sun.star.text.TextFrame")

With MijnKader

.Height = 1500

.Width = 4000

.BackColor = RGB(255,200,255)

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH

.HoriOrient = com.sun.star.text.HoriOrientation.NONE

.HoriOrientPosition = 2500 ' unité : 1/100 mm

End With

MijnTekst.insertTextContent( MijnCursor, MijnKader, false)

MijnKader.Text.String = "Invoeging 2"

Voorbeeld van een kader in een kader

Men kan perfect een kader in een ander kader plaatsen, goed verondersteld.

Dim MijnDocument As Object, MijnTekst As Object, MijnTekst1 As Object

Dim MijnCursor As Object, MijnCursor1 As Object

Dim MijnKader1 As Object, MijnKader2 As Object

Dim AlineaEinde As Integer

AlineaEinde = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

rem - - plaats de cursor waar u wilt - -

MijnKader1 = MijnDocument.createInstance("com.sun.star.text.TextFrame")

With MijnKader1

.Width = 9400 ' 94 mm breed

.Height = 2530 ' 25,3 mm hoog

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH

End With

MijnTekst.insertTextContent( MijnCursor, MijnKader1, false)

MijnTekst1 = MijnKader1.Text

with MijnTekst1

MijnCursor1 = .createTextCursor

.insertString(MijnCursor1, "Tekst in kader 1", false)

.insertControlCharacter(MijnCursor1, AlineaEinde, false)

.insertString(MijnCursor1, "Tekst regel 2", false)

.insertControlCharacter(MijnCursor1, AlineaEinde, false)

.insertString(MijnCursor1, "Tekst regel 3", false)

end with

MijnKader2 = MijnDocument.createInstance("com.sun.star.text.TextFrame")

With MijnKader2

.Width = 1000

.Height = 1000

.AnchorFrame = MijnKader1

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_FRAME

.HoriOrient = com.sun.star.text.HoriOrientation.LEFT

End With

MijnTekst1.insertTextContent( MijnCursor1, MijnKader2, false)

MijnKader2.Text.String = "X"

De instructies With dienen om herhaling van MijnTekst1 of MijnKader2 te vermijden.

Men kan ook een MijnCursor2 creëren om de gehele tekst in te voegen, en zelfs een derde kader invoegen, enzovoort, op voorwaarde dat er genoeg plaats is op de pagina...

Achtergrondkleur van een kader

Standaard erft het kader de achtergrondkleur van het invoegbereik. Om een kleur toe te voegen :

MijnKader.BackColor = RGB(255,200,255)

Kader bij zijn naam vinden

U kunt het schrijven van tekst via de macro aanzienlijk vereenvoudigen als u een voorgedefinieerd document invult (of een documentsjabloon) die de vaste structuur van het document bevat en de reeds gevormde, maar lege, tabellen, die zullen worden ingevuld door een macro. Herinner u dat elke tabel een naam heeft (standaard : Kader1, Kader2, etc, op aanmaakvolgorde). Met de Navigator kunt u elke tabel een eigen, meer specifieke, naam geven.

Vervolgens is het voldoende om in de macro de tabel met zijn naam aan te duiden :

MijnKader = MijnDocument.TextFrames.getByName("BlauwKader")

Nu kunt u alle voorgaande instructies gebruiken om het kader in te vullen of te wijzigen. Natuurlijk moet de macro de naam van het kader en het type informatie dat hij in moet vullen, weten. De naam van het kader moet exact zo worden geschreven als in zijn definitie.

De instructie getByName levert een foutmelding op als er geen enkel kader bestaat met die naam. U kunt het bestaan van het kader ook als volgt testen :

if MijnDocument.TextFrames.hasByName("BlauwKader") then

rem Het kader bestaat

end if

Enfin, men hernoemt een kader zeer simpel :

MijnKader = MijnDocument.TextFrames.getByName("BlauwKader")

MijnKader.Name = "MijnMooieKader"

Een naam van een kader mag geen spaties bevatten.

Tekenen in Writer

Hier, roept men een vorm (Engels : shape) een elementair tekenelement op, bijvoorbeeld een rechthoek, een ellips, etc.

De tekenpagina van Writer

De API signaleert dat de vormen in Writer moeten verschijnen op een unieke tekenpagina (Engels : draw page). Het onthoudt de bladen die men wil zien in een Draw of Impress document.

Praktisch gezien bestaat deze unieke tekenpagina in Writer uit het gehele document : u mag de vormen in een willekeurig aantal pagina's tekst invoegen. De directe invoeging van een vorm op de tekenpagina is mogelijk, maar de plaatsing wordt verplicht verankerd aan de pagina, hetgeen beperkingen oplegt.

U kunt ook tekeningen invoegen binnen kaders in een Writer document.

Om een tekenpagina te krijgen in een Writer document :

Dim TekenPagina As Object

Tekenpagina = MijnDocument.DrawPage

Een tekenvorm invoegen

Kijk hoe u een rechthoek invoegt, uitgaande van een geopend Writer-document, met een tekstcursor geplaatst daar waar u de vorm wilt invoegen :

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

Dim MijnVorm As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

Grootte1.Width = 1000

Grootte1.Height = 800

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

MijnVorm.Size = Grootte1

MijnTekst.insertTextContent( MijnCursor, MijnVorm, false)

In tegenstelling tot kaders bestaat er geen eigenschap Width of Height voor een vorm. De instructie Dim Grootte1 creëert een object van het type Grootte (in Engels: Size) die dient om de grootte van de toekomstige vorm weer te geven. Basic staat directe wijzigingen in de eigenschap Size van een vorm niet toe.

Het argument createInstance is een verschrikkelijke constante die het type van de tekenvorm aanduidt.

De verschillende basisvormen worden opgesomd in het hoofdstuk Tekenen van vormen, dat geldig is voor alle toepassingen.

De methode insertTextContent laat een willekeurig object invoegen in de tekst, op de positie van de cursor. Hier is het object een vorm, (een tekenelement). Het derde argument betekent :

false = invoegen in de tekst

true = overschrijven in de tekst

Het voorbeeld gebruikt een minimum aan instructies. Praktisch gezien geeft hij aan :

vanaf waar de vorm wordt geplaatst (de ankerplaats van de vorm ),

zijn absolute positie vanaf het anker

De verschillende ankers van een vorm

De keuze van de ankerplaats is als volgt :

MijnVorm.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE

De mogelijke waarden van de ankers zijn verschrikkelijke constanten, opgesomd in het overzicht hieronder.

Constante	Signification
AT_PARAGRAPH	Anker aan de alinea waar de cursor staat , marges inbegrepen
AS_CHARACTER	Anker alsof de vorm een teken is; de hoogte van de regel past zich aan aan het formaat van de vorm (standaardwaarde)
AT_PAGE	Anker aan de gehele pagina met de marges AnchorPageNo bevat het nummer van de pagina; standaard is dat de pagina waar de tekstcursor zich bevindt.
AT_CHARACTER	Anker aan het door de cursor aangeduide teken

Plaatsing van de vorm

In tegenstelling tot kaders, is voor de vormen slechts de absolute positie mogelijk. De afstanden worden uitgedrukt in 1/100 van een millimeter, gemeten van de linkerbovenhoek van het anker tot de linkerbovenhoek van de vorm.

Niettegenstaande het feit dat de absolute plaatsingsinstructies van een kader zullen worden geaccepteerd, verdient het aanbeveling een methode te gebruiken die refereert naar een variabele positie. Voorbeeld :

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

Dim MijnVorm As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

Grootte1.Width = 1000

Grootte1.Height = 800

Positie1.x = 5500

Positie1.y = 12000

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

With MijnVorm

.Size = Grootte1

.Position = Positie1

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE

End With

MijnTekst.insertTextContent( MijnCursor, MijnVorm, false)

Meerdere vormen invoegen

Bij elke invoeging van een vorm is het nodig om een nieuwe xxxShape te krijgen, zelfs als men meerdere malen hetzelfde type vorm invoegt. Het is ook nodig om elke keer de eigenschappen van de vorm op te geven. In het voorbeeld voegt men tweemaal dezelfde ellips in op dezelfde positie, op pagina 4, daarna op pagina 1 van het Writer document :

Grootte1.Width = 5400

Grootte1.Height = 2530

Positie1.x = 5500

Positie1.y = 12000

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.EllipseShape")

With MijnVorm

.Size = Grootte1

.Position = Positie1

.FillColor = RGB(200, 150, 200)

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE

.AnchorPageNo = 4

End With

MijnTekst.insertTextContent( MijnCursor, MijnVorm, false)

MijnVorm.String = "invoeging 1"

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.EllipseShape")

With MijnVorm

.Size = Grootte1

.Position = Positie1

.FillColor = RGB(200, 150, 200)

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE

.AnchorPageNo = 1

End With

MijnTekst.insertTextContent( MijnCursor, MijnVorm, false)

MijnVorm.String = "invoeging 2"

Andere functionaliteiten rondom de vorm

De eigenschappen SurroundAnchorOnly, SurroundContour, ContourOutside, Opaque, hebben geen overeenkomende invloed op de toepassing van tekst in een vorm, ongeacht het anker.

De andere functionaliteiten zijn identieke voor Writer en de andere toepassingen. Zij worden omschreven in een algemeen hoofdstuk :

Algemene eigenschappen

Verschillende tekenvormen

Tekstverwerking in de vorm

Een vorm een naam geven

Afbeeldingen in Writer

Een afbeelding invoegen

Opmerking : in de Engelse versie van de API, wordt de term Graphic gebruikt om een afbeelding aan te duiden van het type “ bitmap ” of vector. Er is geen enkele relatie met het Nederlandse afbeeldingenconcept.

Zie hier een eerste methode om een afbeelding in te voegen, die voldoet voor afbeeldingen waarvan u de afmetingen niet wilt wijzigen, bijvoorbeeld een kleine afbeelding zoals:

Uitgaande van een geopend Writer document, met de tekstcursor geplaatst waar u de afbeelding wilt invoegen :

Dim MijnAfbeelding As Object

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.text.GraphicObject")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeeldingen\tip.gif")

MijnTekst.insertTextContent(MijnCursor, MijnAfbeelding, false)

Het argument createInstance is een “ magische formule ” om zonder problemen in te voegen.

De methode insertTextContent laat u een object ergens in de tekst invoegen, op de positie van de cursor. Hier is het object een afbeelding. Het derde argument betekent :

false = invoegen in de tekst

true = overschrijven in de tekst

Opmerking

De instructies voegen niet de afbeelding in het Writer-document in, maar alleen een koppeling naar de afbeelding. Als u het refererende afbeeldingbestand hernoemt, verplaatst of verwijderd, laat het document een verbroken koppeling met het URL-adres van het bestand zien .

Hieronder staat een actuele opsomming van de API.

Om effectief afbeeldingen via een macro in het document in te voegen, volg de volgende procedure :

Menu Bewerken > Koppelingen...

selecteer alle koppelingen naar afbeeldingen

klik op de knop Ontkoppelen; bevestigen

Sla het document op

Plaatsen van een afbeelding

De plaatsingsprincipes zoals beschreven voor de kaders zijn ook geldig voor afbeeldingen.

In dit voorbeeld voegt men een kleine afbeelding in, geplaatst in de linkermarge van de pagina, rechts geplaatst en in het midden van de pagina :

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnAfbeelding As Object

Dim MijnCursor As Object

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.text.GraphicObject")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeeldingen\belangrijk.gif")

With MijnAfbeelding

.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE

.VertOrient = com.sun.star.text.VertOrientation.CENTER

.VertOrientRelation = com.sun.star.text.RelOrientation.PAGE_FRAME

.HoriOrient = com.sun.star.text.HoriOrientation.RIGHT

.HoriOrientRelation = com.sun.star.text.RelOrientation.PAGE_LEFT

End With

MijnTekst.insertTextContent(MijnCursor, MijnAfbeelding, false)

Afmetingen van een afbeelding

De invoegmethode van een afbeelding zoals we die hebben gezien kan problemen opleveren voor het aanpassen van de afmetingen van een afbeelding. De tweede, hier beschreven, methode staat aanpassen van afmetingen toe, maar vereist altijd opgave van de afmetingen. Voorbeeld :

Dim MijnAfbeelding As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeeldingen\Medor.jpg")

MijnTekst.insertTextContent(MijnCursor, MijnAfbeelding, false)

Grootte1.Width = 6000 ' breedte in 1/100 mm

Grootte1.Height = 6000 ' hoogte in 1/100 mm

MijnAfbeelding.Size = Grootte1

De instructies voegen niet de afbeelding in het Writer document in, maar alleen een koppeling naar de afbeelding. De hierboven vermelde opmerking is ook hier van toepassing.

Uiteraard zal, als de originele afbeelding niet dezelfde proporties heeft, de afbeelding in het document worden vervormd. Om de proporties te behouden voegt men enkele instructies toe :

Dim MijnAfbeelding As Object, DeBitmap As Object

Dim Proportie As Double

Dim Grootte1 As New com.sun.star.awt.Size

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeeldingen\Medor.jpg")

MijnTekst.insertTextContent(MijnCursor, MijnAfbeelding, false)

DeBitmap = MijnAfbeelding.GraphicObjectFillBitmap

Grootte1 = DeBitMap.Size ' grootte in pixels !

Proportie = Grootte1.Height / Grootte1.Width

Grootte1.Width = 6000 ' breedte in 1/100 mm

Grootte1.Height = Grootte1.Width * Proportie

MijnAfbeelding.Size = Grootte1

Om de afmetingen aan te passen van de afbeelding zonder de proporties te veranderen, herstelt men de afmetingen van de afbeelding in pixels. Dit is niet meer mogelijk na de instructie insertTextContent. De berekende proportie stelt een vaste hoogte in na berekening van de breedte. De twee afmetingen worden vermeld in 1/100 mm.

Opmerking

De relatieve plaatsing werkt niet met deze methode van het invoegen van een afbeelding. Alleen de absolute plaatsing werkt.

Meerdere afbeeldingen invoegen

Bij elke invoeging van een afbeelding is het nodig een nieuwe GraphicObject te krijgen, zelfs als men meerdere malen dezelfde afbeelding invoegt. Voorbeeld, met de eenvoudigste methode van invoegen :

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.text.GraphicObject")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeeldingen\Medor.jpg")

MijnTekst.insertTextContent(MijnCursor, MijnAfbeelding, false)

rem verplaatsen van de cursor naar ergens anders in de tekst

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextParagraph(false)

MijnCursor.gotoNextParagraph(false)

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.text.GraphicObject")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeeldingen\Medor.jpg")

Mijntekst.insertTextContent(MijnCursor, MijnAfbeelding, false)

Vinden van een afbeelding door zijn naam

Om een afbeelding terug te vinden is een goede methode om hem een naam te geven. Als de afbeelding eenmaal is ingevoegd in het document is het voldoende om te gebruiken de eigenschap Name :

MijnAfbeelding.Name = "Mijn kat"

Daarna kan men de afbeelding terugvinden met de methoden hasByName en GetByName :

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnAfbeelding As Object, DeAfbeeldingen As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnDocument = ThisComponent

DeAfbeeldingen = MijnDocument.GraphicObjects

if DeAfbeeldingen.hasByName("Mijn kat") then

MijnAfbeelding = DeAfbeeldingen.getByName("Mijn kat")

Grootte1.Width = 6000 ' breedte in 1/100 mm

Grootte1.Height = 3000 ' hoogte in 1/100 mm

MijnAfbeelding.Size = Grootte1

else

print "Naam bestaat niet !"

end if

Tekenen in Draw

Hier roept men een vorm (Engels : shape) aan, een tekenelement, bijvoorbeeld een rechthoek, een ellips, etc.

Vinden van de Tekenpagina

Elke Tekenpagina in Draw bevat een tab. De naam van de tabs is standaard, in de gelokaliseerde Nederlandse versie, Pagina 1, Pagina 2, etc. Het nummer van de pagina is de volgorde van de tab, van links naar rechts. Als u met de muis een niet hernoemde pagina verplaatst, zal de naam van de tab veranderen om zijn positie weer te geven, evenals voor de volgende niet-hernoemde pagina's.

Met de API kan men ook zo op een pagina komen :

Dim MijnDocument As Object

Dim EenPagina As Object, DePaginas As Object

MijnDocument = ThisComponent

DePaginas = MijnDocument.Drawpages

print "Aantal pagina's : "; DePaginas.Count

EenPagina = DePaginas(0) ' Eerste tekenpagina

DrawPages verschaft de verzamelde pagina's van het document. Count geeft het aantal bestaande pagina's. Elke pagina is toegankelijk via een index.

Men zou de variabele DePaginas ook kunnen toekennen zoals beschreven in de regel hieronder :

EenPagina = MijnDocument.Drawpages(0) ' Eerste tekenpagina

Attentie

Voor de API worden de pagina's genummerd vanaf nul, in de volgorde waarin zij worden weergegeven door de Draw interface. Ook als de gebruiker de volgorde van de bladen verandert, de geschreven macro blijft voor het blad bij de rang n.

Een betere methode bestaat uit het terugvinden van het blad via een gegeven naam :

Dim MijnDocument As Object

Dim EenPagina As Object, DePaginas As Object

MijnDocument = ThisComponent

DePaginas = MijnDocument.Drawpages

EenPagina = DePaginas.getByName("Proef-1")

Men kan testen of een pagina met de opgegeven naam bestaat :

if DePaginas.hasByName("Proef-1") then

rem de pagina bestaat al !

end if

Attentie

De API staat u toe de naam van de tab terug te vinden via de eigenschap Name van de pagina.
Voor de niet-hernoemde pagina's, is de teruggevonden naam : page1, page2, etc. De spatie is verdwenen en de naam begint met een kleine letter.

Draw weet dat de tab is hernoemd, maar de API verschaft die informatie niet.

Creëren, hernoemen, dupliceren en verwijderen van een pagina

De API behandelt de pagina's van Draw op dezelfde wijze als de bladen van Calc.

Creëren van een ongerepte pagina

Men voegt een nieuwe pagina op een bepaalde positie in tussen de pagina's van het document.

Dim MijnDocument As Object

Dim NieuwePagina As Object, DePaginas As Object

MijnDocument = ThisComponent

DePaginas = MijnDocument.Drawpages

' voeg een pagina in na de tweede pagina

NieuwePagina = DePaginas.insertNewByIndex(1)

De nieuwe pagina zal de naam Pagina n krijgen met n corresponderend aan de waarde+1 van de gebruikte index bij het maken. In dit voorbeeld, zal dat zijn : Pagina 2.

Hernoemen van een pagina

Hernoemen van een pagina bestaat uit het veranderen van de eigenschap Name van de pagina.

EenPagina = DePaginas.getByName("Proef-1")

EenPagina.Name = "Inhoudsopgave"

Verplaatsen van een pagina

De functies van de API staan het aanpassen van de volgorde van de pagina's niet toe.

Dupliceren van een pagina

Dim MijnDocument As Object

Dim EenPagina As Object, DePaginas As Object

Dim DuplPagina As Object

MijnDocument = ThisComponent

DePaginas = MijnDocument.Drawpages

EenPagina = DePaginas.getByName("Proef-1")

DuplPagina = MijnDocument.Duplicate(EenPagina)

De nieuwe pagina is een exacte kopie van de pagina die als argument werd opgegeven, met diens inhoud. De tab van die nieuwe pagina wordt rechts geplaatst naast de referentie-pagina, hij zal worden genoemd Pagina n met voor n de rang van de nieuwe tab. Men kan daarna de pagina hernoemen.

Verwijderen van een pagina

Dim MijnDocument As Object

Dim EenPagina As Object, DePaginas As Object

MijnDocument = ThisComponent

DePaginas = MijnDocument.Drawpages

EenPagina = DePaginas.getByName("Proef-1")

DePaginas.remove(EenPagina)

De pagina zichtbaar voor de gebruiker

Dit voorbeeld maakt de pagina zichtbaar voor de gebruiker, geeft de naam van die pagina weer, en geeft in plaats daarvan de pagina “ TestPagina ” weer.

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object, GebruiktePagina As Object

MijnDocument = ThisComponent

rem herstellen van de zichtbare pagina

GebruiktePagina = MijnDocument.CurrentController.CurrentPage

Print "De weergegeven pagina is : "; GebruiktePagina.Name

EenPagina = MijnDocument.DrawPages.getByName("TestPagina")

rem veranderen van zichtbare pagina

MijnDocument.CurrentController.CurrentPage = EenPagina

Eigenschappen van een Tekenpagina

Een tekenpagina bevat de volgende essentiële eigenschappen :

Eigenschap	Betekenis
Name	tekenreeks,de weergegeven paginanaam op de tab (zie opmerking)
BorderLeft	Linkermarge in 1/100 mm
BorderRight	rechtermarge in 1/100 mm
BorderTop	Bovenmarge in 1/100 mm
BorderBottom	Ondermarge in 1/100 mm
Height	Totale hoogte van de pagina in 1/100 mm
Width	Totale breedte van de pagina in 1/100 mm
Number	Nummer van de pagina op tabvolgorde, genummerd vanaf 1
Orientation	Portret : com.sun.star.view.PaperOrientation.PORTRAIT of Landschap : com.sun.star.view.PaperOrientation.LANDSCAPE

Voorbeeld voor gebruik :

Dim MijnDocument As Object

Dim EenPagina As Object

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

With EenPagina

print "Marges G, D", .BorderLeft , .BorderRight

print "Marges H, B", .BorderTop, .BorderBottom

print "Afmetingen van de pagina H, B", .Height, .Width

print "Paginanummer", .Number

Select Case .Orientation

Case com.sun.star.view.PaperOrientation.PORTRAIT

print "Portret"

Case com.sun.star.view.PaperOrientation.LANDSCAPE

print "Landschap"

end select

end with

De tekenvormen in Draw

Een tekenvorm invoegen

Dit minimale voorbeeld voegt een rechthoek in op de tekenpagina, genaamd “ Proef-1 ” :

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("Proef-1")

Grootte1.Width = 13400 ' 134 mm breedte

Grootte1.Height = 2530 ' 25,3 mm hoogte

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

With MijnVorm

.Size = Grootte1

.FillColor = RGB(137, 111, 87)

End With

EenPagina.add(MijnVorm)

De instructie Dim Grootte1 creëert een objecttype Grootte (in Engels : Size) die dient voor de afmetingen van de toekomstige vorm. Basic staat geen directe wijzigingen toe in de eigenschap Size van een vorm.

Het argument createInstance is een verschrikkelijke constante die het type tekenvorm aanduid.

De verschillende basisvormen worden opgesomd in het hoofdstuk Tekenen van vormen, dat geldig is voor alle toepassingen.

Als de tekenvorm eenmaal is toegevoegd aan de pagina kan men zijn eigenschappen veranderen, zoals hieronder opgesomd.

Plaatsen van de vorm

Het voorgaande voorbeeld heeft de vorm helemaal linksboven op de pagina geplaatst.

De plaatsing wordt aangeroepen door een tussen-variabele, die een punt definieert met de coördinaten x en y. Dat is de positie van de linkerbovenhoek van de vorm. De coördinaten worden uitgedrukt in 1/100 mm, relatief aan de linkerbovenhoek van de tekenpagina.

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("Proef-1")

Grootte1.Width = 13400 ' 134 mm de large

Grootte1.Height = 2530 ' 25,3 mm de haut

Positie1.x = 2500 ' 25 mm rechts van de linkerbovenhoek van de pagina

Positie1.y = 5300 ' 53 mm onder de linkerbovenhoek van de pagina

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

With MijnVorm

.Size = Grootte1

.Position = Positie1

.FillColor = RGB(137, 111, 87)

End With

EenPagina.add(MijnVorm)

Opmerking

Als u met rechts klikt op een vorm geeft het zijn positie weer, de waarden worden aangegeven met betrekking tot de marges van de pagina. Omdat de door de macro ingevoegde plaatsing relatief is aan de gehele pagina.

Andere functionaliteiten van vormen

De andere functionaliteiten zijn identiek voor Draw e de andere toepassingen. Zij worden beschreven in een algemeen hoofdstuk :

Algemene eigenschappen

Verschillende vormen tekenen

Tekstbewerking in de vorm

Een vorm een naam geven

Als u zich wilt verdiepen in het programmeren van tekeningen in Draw, bekijk dan eens de Engelse site van Danny Brewer :

http://kosh.datateamsys.com/~danny/OOo/DannysDrawPowerTools

Wat u voornamelijk ziet:

hoe een “ schildpad ” te programmeren die in wisselende lijnen op de tekenpagina wordt getekend.

een geanimeerde tekening maken met stuiterende cirkels in de marges van de tekenpagina

veel macrovoorbeelden voor het tekenen.

Afbeeldingen in Draw

Invoegen van een afbeelding

Opmerking : in de Engelse API versie wordt de term Graphic gebruikt om een “ bitmap ” of vector-afbeelding aan te duiden. Dit is niet van toepassing op het Nederlandse concept van afbeeldingen.

Dit voorbeeld voegt een afbeelding in :

Dim MijnDocument As Object

Dim EenPagina As Object

Dim MijnAfbeelding As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages(2) ' pagina 3 van Draw

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeelding\Hoogspanning.jpg")

EenPagina.add(MijnAfbeelding)

Grootte1.Width = 6000 ' breedte in 1/100 mm

Grootte1.Height = 6000 ' hoogte in 1/100 mm

MijnAfbeelding.Size = Grootte1

Als de originele afbeelding niet dezelfde afmetingen heeft, wordt de afbeelding in het document vervormd. Wij zullen verderop laten zien hoe u de afmetingen kunt aanpassen en de originele proporties kan behouden.

Deze instructies voegen niet de afbeelding in het Draw document in, maar slechts een koppeling naar die afbeelding. Als u het afbeeldingbestand, waarmee gekoppeld, verplaatst, hernoemt of verwijdert, laat het document een verbroken koppeling met het adres van de URL zien.

Dit is een actuele beperking van de API.

Om effectief, via een macro, afbeeldingen in te voegen in het document, volg deze procedure :

Menu Bewerken > Koppelingen...

selecteer alle getoonde koppelingen naar afbeeldingen

klik op de knop Ontkoppelen; bevestigen

Sla het document op.

Plaatsen van een afbeelding

Ankerplaats en de plaatsing van een afbeelding en een vorm zijn identiek. Kijkt u naar het hoofdstuk betreffende de plaatsen van de vorm in Draw.

Afmetingen aanpassen van een afbeelding

Om de afmetingen van een afbeelding te wijzigen zonder zijn proporties te veranderen, heeft men de afmetingen van de afbeelding in pixels nodig. Hier is dat niet mogelijk dan na de instructie PageDessin.add(MijnAfbeelding). De berekende proportie worden ingesteld met vaste hoogte en breedte. Deze twee afmetingen worden aangeduid in 1/100 mm.

Dit voorbeeld plaatst de afbeelding in de pagina en stelt de daarvoor opgegeven breedte in en berekent de hoogte, met behoud van de proporties :

Dim MijnDocument As Object

Dim EenPagina As Object

Dim MijnAfbeelding As Object

Dim DeAfbeelding As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

Dim Proportie As Double

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages(2) ' pagina 3 van Draw

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

MijnAfbeelding.GraphicURL = ConvertToURL(" C:\Afbeelding\Hoogspanning.jpg ")

Positie1.x = 2500 ' 25 mm rechts van de linkerbovenhoek van de pagina

Positie1.y = 5300 ' 53 mm onder de linkerbovenhoek van de pagina

EenPagina.add(MijnAfbeelding)

DeAfbeelding = MijnAfbeelding.GraphicObjectFillBitmap

Grootte1 = DeAfbeelding.Size ' grootte in pixels !

Proportie = Grootte1.Height / Grootte1.Width

Grootte1.Width = 6000 ' breedte in 1/100 mm

Grootte1.Height = Grootte1.Width * Proportie

MijnAfbeelding.Size = Grootte1

MijnAfbeelding.Position = Positie1

Meerdere afbeeldingen invoegen

Bij elke invoeging van een afbeelding is het nodig een nieuw GraphicObjectShape aan te roepen, zelfs als men meerdere keren dezelfde afbeelding invoegt, zoals in het voorbeeld dat volgt. Het bevat een sub-routine die de afmetingswijzigingen verzorgd.

Sub Invoegen2IdentiekeAfbeeldingen

Dim MijnDocument As Object, DeBladen As Object

Dim TekenPagina As Object

Dim MijnAfbeelding As Object

Dim Positie1 As New com.sun.star.awt.Point

MijnDocument = ThisComponent

Tekenpagina = MijnDocument.drawPages(2) ' pagina 2 van DRAW

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

Positie1.x = 3000

Positie1.y = 6000

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeelding\Hoogspanning.jpg")

MijnAfbeelding.Position = Positie1

TekenPagina.add(MijnAfbeelding)

GrootteProp(MijnAfbeelding, 6000)

MijnAfbeelding = MijnDocument.createInstance("com.sun.star.drawing.GraphicObjectShape")

Positie1.x = 10000

Positie1.y = 8000

MijnAfbeelding.GraphicURL = ConvertToURL("C:\Afbeelding\Hoogspanning.jpg")

MijnAfbeelding.Position = Positie1

TekenPagina.add(MijnAfbeelding)

GrootteProp(MijnAfbeelding, 3500)

End Sub

Sub GrootteProp( EenAfbeelding As Object, Breedte As Long)

Dim DeAfbeelding As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Proportie As Double

DeAfbeelding = EenAfbeelding.GraphicObjectFillBitmap

Grootte1 = DeAfbeelding.Size ' grootte in pixels !

Proportie = Grootte1.Height / Grootte1.Width

Grootte1.Width = Breedte ' breedte in 1/100 mm

Grootte1.Height = Grootte1.Width * Proportie

EenAfbeelding.Size = Grootte1

end sub

Een afbeelding bij zijn naam vinden

Om een afbeelding terug te vinden, is een goede manier om hem te benoemen. Als een afbeelding eenmaal in het document is ingevoegd, is het voldoende om de eigenschap Name te gebruiken :

MijnAfbeelding.Name = "Mijn kat"

Alle afbeeldingen ( en de vormen ) van een pagina zijn toegankelijk via een index, bijvoorbeeld :

EenVorm = EenPagina(3)

Hier een weinig praktisch, maar in Draw bestaat geen API-methode om een vorm bij zijn naam terug te vinden.

Geen probleem, we gaan de functie FindObjectByName gebruiken, beschreven in een ander hoofdstuk. Met die functie kunnen we een afbeelding terugvinden en die aanpassen :

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnAfbeelding As Object

Dim EenPagina As Object

Dim Grootte1 As New com.sun.star.awt.Size

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

MijnAfbeelding = FindObjectByName(EenPagina, "Mijn Kat")

if IsNull(MijnAfbeelding) then

print "Naam bestaat niet !"

else

Grootte1.Width = 6000 ' breedte in 1/100 mm

Grootte1.Height = 3000 ' hoogte in 1/100 mm

MijnAfbeelding.Size = Grootte1

end if

Attentie : deze methode vindt een object ergens op de pagina, vermijd dan ook om een vorm en een afbeelding, op dezelfde pagina, dezelfde naam te geven.

Presentatie in Impress

Identieke functies als Draw

De functionaliteiten van Draw, zoals de benaming van de pagina, het tekenen, de afbeeldingen, zijn op dezelfde wijze te gebruiken voor een Impress-presentatie.

Specifieke functies in Impress

Men kan specificeren dat een actie wordt uitgevoerd door een klik op een object in de huidige dia. Deze actie kan bestaan uit het uitvoeren van een macro, wat allerlei mogelijkheden geeft.

Wanneer er specifieke eigenschappen voor vormen in Impress bestaan, zijn zij relatief aan de effecten en worden zij waarschijnlijk slechts geconfigureerd bij het ontwerpen van de dia's.

De vormen : algemene functies voor alle toepassingen

Eigenschappen van vormen

Achtergrondkleur van de vorm

Zonder speciale instructie wordt de vorm gecreëerd met een uniforme achtergrondkleur, waarbij de kleur een standaardwaarde is. Om een andere kleur toe te passen :

MijnVorm.FillColor = RGB(255,200,255)

Maar men kan ook niet-uniforme kleuren hebben of helemaal geen kleur, afhankelijk van de waarde van de eigenschap FillStyle.

MijnVorm.FillStyle = com.sun.star.drawing.FillStyle.NONE

De waarden zijn weer verschrikkelijke constanten :

Constante	Betekenis
NONE	transparant
SOLID	Uniforme kleur( standaardwaarde )
GRADIENT	kleurverloop – zie de API voor details
HATCH	patronen – zie de API voor details
BITMAP	Gebruik van een Afbeelding – zie de API voor details

Voor een SOLID kleur kan men de transparantie regelen met de eigenschap FillTransparence :

MijnVorm.FillTransparence = 60 ' percentage

De waarde is een percentage, 0 voor een opaque-kleur, 100 voor een totaal transparante kleur.

Vorm met een schaduw

Schaduw (Engels : shadow) dient om weer te geven alsof de vorm boven het werkblad « drijft » .

With MijnVorm

.Shadow = true

.ShadowColor = RGB(100, 100, 100)

.ShadowXDistance = -250

.ShadowYDistance = 250

end with

De parameter Shadow is een boolean die aangeeft dat een schaduw nodig is (zonder standaardwaarde)

De parameter ShadowColor geeft de kleur van de schaduw aan ( zwart als standaard)

De twee volgende duiden de uitzetting van de schaduw vanaf de vorm aan, uitgedrukt in 1/100 mm. Een negatieve waarde bij X plaatst de schaduw links, een negatieve waarde bij Y plaatst de schaduw naar onderen. Men kiest ook de belichtingshoek.

Rotatie van de vorm

MijnVorm.RotateAngle = 4500 ' 25 graden

De hoek wordt uitgedrukt in 1/100 graden met betrekking tot de horizontale; een positieve waarde correspondeert op trigonometrische wijze (tegen de wijzers van de klok in).

Effect parallelogram

Dit effect transformeert een rechthoek in een parallellogram .

MijnVorm.ShearAngle = 3000 ' 30 graden verplaatsing

De hoek wordt uitgedrukt in 1/100 graden met betrekking tot de verticale zijde van een rechthoek, een positieve waarde correspondeert met anti-trigonometrische wijze (met de wijzers van de klok mee). Voor een ander type vorm is het effect hetzelfde.

Verschijning van de omtreklijn

De lijn die de omtrek van de vorm weergeeft heeft meerdere eigenschappen. Zie hier de belangrijkste.

Lijnstijl

MijnVorm.LineStyle = com.sun.star.drawing.LineStyle.DASH

De waarden zijn verschrikkelijke constanten :

Constante	Betekenis
NONE	De lijn is onzichtbaar
SOLID	Doorlopende lijn (standaardwaarde)
DASH	Onderbroken lijn; de vorm van de onderbreking hangt af van de eigenschap LineDash

De eigenschap LineDash is een samengesteld element :

Onder-Eigenschap	Betekenis
Style	De vorm van de onderbreking ( constante com.sun.star.drawing.DashStyle.xxx)
Dots	Geheel getal; aantal stippen in de onderbreking
DotLen	Lengte van de stippen in 1/100 mm
Dashes	Geheel getal; aantal lijnen in de onderbreking
DashLen	Lengte van een onderbreking in 1/100 mm
Distance	Afstand tussen de punten in 1/100 mm

De verschillende vormen van onderbreking :

Constante	Signification
RECT	Een rechthoek
ROUND	Een rondje
RECTRELATIVE	Een rechthoek proportioneel aan de lengte van de lijn
ROUNDRELATIVE	Een rondje proportioneel aan de lengte van de lijn

Een voorbeeld verheldert misschien een beetje :

Dim DeOnderbrekingen As New com.sun.star.drawing.LineDash

With DeOnderbrekingen

.Style = com.sun.star.drawing.DashStyle.RECT

.Dots = 3

.DotLen = 50

.Dashes = 2

.DashLen = 200

.Distance = 100

end with

With MijnVorm

rem ( andere instellingen van de vorm )

.LineStyle = com.sun.star.drawing.LineStyle.DASH

.LineDash = DeOnderbrekingen

end with

Lijnkleur

MijnVorm.LineColor = RGB(250, 0, 0)

Lijndikte

MijnVorm.LineWidth = 100

De dikte wordt uitgedrukt in 1/100 mm.

Recapitulerend voorbeeld

Dit voorbeeld neemt de meeste tekenmogelijkheden over. De verkregen vorm is hieronder zichtbaar en gebruikt een zoom van 200% om de details goed te kunnen zien.

Option Explicit

Sub VoorbeeldVoorDocIntroAPI

Dim MijnDocument As Object, MijnTekst As Object

Dim MijnCursor As Object

Dim MijnVorm As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

Dim DeOnderbrekingen As New com.sun.star.drawing.LineDash

MijnDocument = ThisComponent

MijnTekst = MijnDocument.Text

MijnCursor= MijnTekst.createTextCursor

MijnCursor = MijnDocument.Bookmarks.getByName("ResultaatVoorbeeldTekening").getAnchor

Grootte1.Width = 7400

Grootte1.Height = 2530

Positie1.x = 4500

Positie1.y = 12300

With DeOnderbrekingen

.Style = com.sun.star.drawing.DashStyle.RECT

.Dots = 3

.DotLen = 50

.Dashes = 2

.DashLen = 200

.Distance = 150

end with

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

MijnVorm.Size = Grootte1

MijnTekst.insertTextContent( MijnCursor, MijnVorm, false)

With MijnVorm

.String = "OpenOffice"

.Shadow = true

.ShadowColor = RGB(100, 100, 100) ' donkergrijs

.ShadowXDistance = 800

.ShadowYDistance = 250

.RotateAngle = 1500 ' 15 graden

.ShearAngle = 3000 ' 30 graden

.FillColor = RGB(200, 150, 200)

.LineStyle = com.sun.star.drawing.LineStyle.DASH

.LineDash = DeOnderbrekingen

.LineColor = RGB(250, 0, 0) ' rood

.LineWidth = 80

' .FillStyle = com.sun.star.drawing.FillStyle.NONE

end with

End Sub

Resultaat

OpenOffice

Tekenen van vormen

De verschillende basisvormen

De belangrijkste elementaire vormen, beschikbaar in com.sun.star.Drawing zijn :

Vorm	Betekenis
CaptionShape	Etiket
ClosedBezierShape	Gesloten Bézier-boog (1)
ConnectorShape	Verbindingen
EllipseShape	Ellips of cirkel
GraphicObjectShape	Grafisch object
LineShape	Lijn
MeasureShape	Meetlat
OpenBezierShape	Open Bézier-boog (1)
PolyLineShape	Gebroken lijn
PolyPolygonShape	Veelhoek
RectangleShape	Rechthoek of vierkant
TextShape	Tekst

(1) Ik ben nog niet toegekomen aan het tekenen van deze vormen, niet in OOo 1.0.2 en niet 1.1RC.

De rechthoek

Zoals reeds gezien in het basisvoorbeeld, wordt hij gedefinieerd door zijn grootte (hoogte, breedte) en zijn positie op de pagina. Als de hoogte gelijk is aan de breedte krijgt u natuurlijk een vierkant.

Een specifieke eigenschap is CornerRadius die de afronding van de hoeken instelt. De waarde is de straal van de kwart cirkel bepaald door de vier hoeken.

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

Grootte1.Width = 13400 ' 134 mm breed

Grootte1.Height = 2530 ' 25,3 mm hoog

Positie1.x = 2500 ' 25 mm rechts van de linkerbovenhoek van de pagina

Positie1.y = 5300 ' 53 mm onder de linkerbovenhoek van de pagina

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.RectangleShape")

With MijnVorm

.Size = Grootte1

.Position = Positie1

.CornerRadius = 250 ' 2,5 mm

.FillColor = RGB(137, 111, 87)

End With

EenPagina.add(MijnVorm)

De ellips

Zoals reeds gezien in het basisvoorbeeld, wordt hij gedefinieerd door zijn grootte (hoogte, breedte) en zijn positie op de pagina. Als de hoogte gelijk is aan de breedte krijgt u natuurlijk een cirkel.

Meerdere eigenschappen stellen u in staat een ellipssector te tekenen.

Eigenschap	Betekenis
CircleKind	Type ellips
CircleStartAngle	Beginhoek van de boog van de sector
CircleEndAngle	Eindhoek van de boog van de sector

De hoeken worden gemeten in 1/100 graden, positieve waarden op trigonometrische wijze ( tegen de wijzers van de klok in). De nul-positie van de hoek is de horizontale, met het rotatiepunt gelegen links van de boog. In de tekening hieronder is de beginhoek 0 graden en de eindhoek is 100 graden.

Het type van de ellips is een verschrikkelijke constante, waarvan de standaardwaarde is :

com.sun.star.drawing.CircleKind.FULL

Met de waarde FULL zijn de eigenschappen van de waarde van de hoek niet van betekenis. Zie hier de andere mogelijke constanten :

ARC CUT SECTION FULL

Voorbeeld voor het tekenen van een cirkelsector :

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

Grootte1.Width = 3000 ' 30 mm breed

Grootte1.Height = 3000 ' 30 mm hoog

Positie1.x = 2500 ' 25 mm rechts van de linkerbovenhoek van de pagina

Positie1.y = 5300 ' 53 mm onder de linkerbovenhoek van de pagina

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.EllipseShape")

With MijnVorm

.Size = Grootte1

.Position = Positie1

.CircleKind = com.sun.star.drawing.CircleKind.SECTION

.CircleStartAngle = 0

.CircleEndAngle = 10000 ' hoek in 1/100 van graden

.FillColor = RGB(137, 111, 87)

End With

EenPagina.add(MijnVorm)

De rechte lijn

Een rechte lijn wordt gedefinieerd door de coördinaten van zijn uitersten. De volgende macro tekent deze lijn :

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

Dim CoordPt(1) As New com.sun.star.awt.Point

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.LineShape")

CoordPt(0).X = 11000 ' positie met betrekking tot de pagina

CoordPt(0).Y = 8000

CoordPt(1).X = 16000

CoordPt(1).Y = 6000

EenPagina.add(MijnVorm)

MijnVorm.PolyPolygon = Array(CoordPt())

MijnVorm.LineColor = RGB(200, 220, 20)

MijnVorm.LineWidth = 100 ' 1 mm

De gebroken lijn

Men beschrijft de gebroken lijn met de coördinaten van zijn successieve punten. De beschrijving van de zal worden ingevuld na de invoeging van de vorm in de pagina. De volgende macro tekent deze gebroken lijn :

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

Dim CoordPt(7) As New com.sun.star.awt.Point

Const Y1 = 6000, Y2 = 8000, Ecart = 1000 ' eenheid 1/100 mm

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.PolyLineShape")

CoordPt(0).X = 11000 ' positie met betrekking tot de pagina

CoordPt(0).Y = Y2

CoordPt(1).X = CoordPt(0).X + Ecart

CoordPt(1).Y = Y1

CoordPt(2).X = CoordPt(1).X + Ecart

CoordPt(2).Y = Y2

CoordPt(3).X = CoordPt(2).X + Ecart

CoordPt(3).Y = Y1

CoordPt(4).X = CoordPt(3).X + Ecart

CoordPt(4).Y = Y2

CoordPt(5).X = CoordPt(4).X + Ecart

CoordPt(5).Y = Y1

CoordPt(6).X = CoordPt(5).X + Ecart

CoordPt(6).Y = Y2

CoordPt(7).X = CoordPt(6).X + Ecart

CoordPt(7).Y = Y1

EenPagina.add(MijnVorm)

MijnVorm.PolyPolygon = Array(CoordPt())

MijnVorm.LineColor = RGB(200, 220, 20)

MijnVorm.LineWidth = 100 ' 1 mm

In feite zijn LineShape en PolyLineShape uitwisselbaar in de twee laatste macro's.

De Veelhoek

Men beschrijft de veelhoek met de coördinaten van zijn successievelijke punten, daarop volgend zal het laatste punt automatisch worden verbonden met het eerste. De beschrijving van de de punten zal worden ingevuld na het invoegen van de vorm op de pagina. De volgende macro tekent de veelhoek :

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

Dim CoordPt(7) As New com.sun.star.awt.Point

Const Y1 = 6000, Y2 = 8000, Ecart = 1000 ' eenheid 1/100 mm

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.PolyPolygonShape")

CoordPt(0).X = 11000 ' posite met betrekking tot de pagina

CoordPt(0).Y = Y2

CoordPt(1).X = CoordPt(0).X + Ecart

CoordPt(1).Y = Y1

CoordPt(2).X = CoordPt(1).X + Ecart

CoordPt(2).Y = Y2

CoordPt(3).X = CoordPt(2).X + Ecart

CoordPt(3).Y = Y1

CoordPt(4).X = CoordPt(3).X + Ecart

CoordPt(4).Y = Y2

CoordPt(5).X = CoordPt(4).X + Ecart

CoordPt(5).Y = Y1

CoordPt(6).X = CoordPt(5).X + Ecart

CoordPt(6).Y = Y2

CoordPt(7).X = CoordPt(6).X + Ecart

CoordPt(7).Y = Y1

EenPagina.add(MijnVorm)

MijnVorm.PolyPolygon = Array(CoordPt())

MijnVorm.FillColor = RGB(200, 220, 20)

Meerdere vormen combineren

In werkelijkheid kan men in een keer meerdere elementaire vormen van hetzelfde type invoegen. Dat is de reden waarom de instructie Array(...) gebruikt is. Het resultaat is een enkele gecombineerde vorm. Zoals in het voorbeeld, nemen we de veelhoek over, en voegen die voor de tweede maal in op dezelfde hoogte :

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

Dim CoordPt(7) As New com.sun.star.awt.Point

Dim CoordPt2(7) As New com.sun.star.awt.Point

Const Y1 = 6000, Y2 = 8000, Ecart = 1000 ' eenheid 1/100 mm

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

MijnVorm = MijnDocument.createInstance("com.sun.star.drawing.PolyPolygonShape")

CoordPt(0).X = 11000 ' positie met betrekking tot de pagina

CoordPt(0).Y = Y2

CoordPt(1).X = CoordPt(0).X + Ecart

CoordPt(1).Y = Y1

CoordPt(2).X = CoordPt(1).X + Ecart

CoordPt(2).Y = Y2

CoordPt(3).X = CoordPt(2).X + Ecart

CoordPt(3).Y = Y1

CoordPt(4).X = CoordPt(3).X + Ecart

CoordPt(4).Y = Y2

CoordPt(5).X = CoordPt(4).X + Ecart

CoordPt(5).Y = Y1

CoordPt(6).X = CoordPt(5).X + Ecart

CoordPt(6).Y = Y2

CoordPt(7).X = CoordPt(6).X + Ecart

CoordPt(7).Y = Y1

CoordPt2(0).X = 11500 ' positie met betrekking tot de pagina

CoordPt2(0).Y = Y2

CoordPt2(1).X = CoordPt2(0).X + Ecart

CoordPt2(1).Y = Y1

CoordPt2(2).X = CoordPt2(1).X + Ecart

CoordPt2(2).Y = Y2

CoordPt2(3).X = CoordPt2(2).X + Ecart

CoordPt2(3).Y = Y1

CoordPt2(4).X = CoordPt2(3).X + Ecart

CoordPt2(4).Y = Y2

CoordPt2(5).X = CoordPt2(4).X + Ecart

CoordPt2(5).Y = Y1

CoordPt2(6).X = CoordPt2(5).X + Ecart

CoordPt2(6).Y = Y2

CoordPt2(7).X = CoordPt2(6).X + Ecart

CoordPt2(7).Y = Y1

EenPagina.add(MijnVorm)

MijnVorm.PolyPolygon = Array(CoordPt(), CoordPt2())

MijnVorm.FillColor = RGB(200, 220, 20)

De uiteindelijke afbeelding is zoals deze :

Let op het combinatie-effect, die de overlappende gedeelten van de twee elementaire vormen “ uitsnijdt ” .

Door deze gewoonte kan men via een macro precieze tekeningen realiseren, welke met de grafische interface zeer moeilijk handmatig te maken zouden zijn. De grafische creatievelingen onder ons zullen hier een onuitputtelijke bron van inspiratie vinden.

Relatieve verplaatsing van de vormen

Een vorm kan worden verborgen achter een andere. Dit is afhankelijk van de volgorde waarin zij worden weergegeven. Deze volgorde wordt gedefinieerd door de eigenschap ZOrder, een bepaalde vorm kan worden verborgen achter allen die een lagere ZOrder bevatten.

Aansluitend past ZOrder van uw vormen de volgorde van weergave aan zoals u dat wenst, onafhankelijk van de volgorde waarin u ze heeft getekend.

Groeperen van vormen

Onderstaande macro groepeert drie vormen.

Dim MijnDocument As Object

Dim MijnVorm1 As Object, MijnVorm2 As Object, MijnVorm3 As Object

Dim EenPagina As Object

Dim Grootte1 As New com.sun.star.awt.Size

Dim Positie1 As New com.sun.star.awt.Point

Dim Groepeer1 As Object, MijnGroep As Object

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

Grootte1.Width = 4000

Grootte1.Height = 4000

Positie1.x = 3000

Positie1.y = 5300

MijnVorm1 = MijnDocument.createInstance("com.sun.star.drawing.EllipseShape")

MijnVorm1.Size = Grootte1

MijnVorm1.Position = Positie1

EenPagina.add(MijnVorm1)

Positie1.x = 9000

Positie1.y = 5300

MijnVorm2 = MijnDocument.createInstance("com.sun.star.drawing.EllipseShape")

MijnVorm2.Size = Grootte1

MijnVorm2.Position = Positie1

EenPagina.add(MijnVorm2)

Grootte1.Width = 5600

Grootte1.Height = 8000

Positie1.x = 5200

Positie1.y = 6500

MijnVorm3 = MijnDocument.createInstance("com.sun.star.drawing.EllipseShape")

MijnVorm3.Size = Grootte1

MijnVorm3.Position = Positie1

EenPagina.add(MijnVorm3)

Groepeer1 = createUnoService("com.sun.star.drawing.ShapeCollection")

Groepeer1.Add(MijnVorm1)

Groepeer1.Add(MijnVorm2)

Groepeer1.Add(MijnVorm3)

MijnGroep = EenPagina.group(Groepeer1)

Het is dan mogelijk de uiteindelijke vorm te verplaatsen of de afmetingen te wijzigen, maar het is niet mogelijk via een macro de andere karakteristieken te veranderen : lijn, kleur, tekst. Effectueeer dus die opmaak voor het groeperen van de vormen.

Tekst in de vorm schrijven

Als een vorm eenmaal is ingevoegd met de instructie Add, schrijft men een simpele tekst als volgt :

MijnVorm.String = "OpenOffice"

Deze manier staat ons echter niet toe de opmaak van de tekst te kiezen. Om meer uitgebreide mogelijkheden te krijgen, gebruikt men dezelfde tekstfunctionaliteiten als in Writer. De volgende instructies schrijven twee lijnen in de vorm, kiezen de grootte van de vette karakters en veranderen het huidige lettertype; dit alles is duidelijk als u de eerste hoofdstukken over Writer heeft gelezen.

Dim MijnTekst1 As Object, MijnCursor1 As Object

Dim AlineaEinde As Integer

AlineaEinde = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK

rem - initialisatie en invoegen van de vorm, zie hierboven -

Mijntekst1 = MijnVorm.Text

MijnCursor1 = MijnVorm.createTextCursor

MijnCursor1.CharHeight = 16

MijnTekst1 = MijnVorm.Text

Mijntekst1.InsertString(MijnCursor1, "OpenOffice", false)

MijnTekst1.InsertControlCharacter(MijnCursor1, AlineaEinde, false)

MijnCursor1.CharFontName = "Arial"

MijnCursor1.CharHeight = 24

MijnCursor1.CharWeight = com.sun.star.awt.FontWeight.BOLD

MijnTekst1.InsertString(MijnCursor1, "Vet, lettertype Arial", false)

Vinden van een vorm

Vinden van geselecteerde vormen door de gebruiker

De gebruiker kan een of meerdere vormen selecteren. De eigenschap CurrentSelection verschaft een lijst van geselecteerde vormen en afbeeldingen op de pagina. Maar let op: als er niets is geselecteerd, wordt deze eigenschap misschien niet gebruikt! Men zou daarvoor het bestaan daarvan moeten testen.

Dit voorbeeld veegt de geselecteerde vormen schoon en past een vervangende kleur toe. Dit gebeurt uiteraard slechts voor die vormen die dat ook toestaan.

Dim MijnVorm As Object, DeVormen As Object

Dim EenPagina As Object

Dim s1 As Long

MijnDocument = ThisComponent

EenPagina = MijnDocument.CurrentController.CurrentPage

DeVormen = MijnDocument.CurrentSelection

for s1 = 0 to DeVormen.Count -1

MijnVorm = DeVormen(s1)

MijnVorm.FillColor = RGB(100,200, 100)

next

Een vorm een naam geven

Om een vorm terug te vinden is een goede manier om het een naam te geven. Als de vorm eenmaal in het document is ingevoegd, is het voldoende om de eigenschap Name te gebruiken :

MijnVorm.Name = "Eerste Object"

Attentie : u kunt zo dezelfde naam aan meerdere objecten op dezelfde pagina geven !

In versie 1.0.x, de API heeft een voordeel op de gebruikers-interface, die het niet toestaat een simpele vorm te hernoemen. In versie 1.1 is deze beperking opgeheven.

Na openen van de Navigator kunt u de benoemde objecten op de pagina bekijken; eventueel moet u een dubbelklik geven op het pagina-icoon, in de Navigator.

Een vorm terugvinden bij zijn naam

Alle vormen (en de afbeeldingen) op een pagina zijn toegankelijk via een index, bijvoorbeeld :

EenVorm = EenPagina(3)

Hier een weinig praktisch, maar er bestaat geen API-methode om een vorm bij zijn naam terug te vinden. Geen probleem, we zullen een zeer algemene functie schrijven, geïnspireerd op het opmerkelijke werk van Danny Brewer, zie zijn website (in het Engels) :

http://kosh.datateamsys.com/~danny/OOo/DannysDrawPowerTools

Function FindObjectByName(DePagina As Object, NaamVorm As String ) As Object

Dim vormX As Object

Dim f1 As Long

For f1 = 0 To DePagina.Count - 1

vormX = DePagina(f1)

If vormX.Name = NaamVorm Then

FindObjectByName = vormX

Exit Function

EndIf

Next

rem hier geeft de functie NUL weer

End Function

Nu kunnen we de vorm terugvinden en aanpassen :

rem - voorbeeld voor een Draw document -

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

MijnVorm = FindObjectByName(EenPagina, "Eerste Object")

if IsNull(MijnVorm) then

print "Naam bestaat niet !"

else

MijnVorm.FillColor = RGB(207, 150, 180)

end if

Attentie : deze methode vindt een object ergens op de pagina, vermijd daarom om dezelfde naam te geven aan een vorm en een afbeelding op dezelfde pagina.

Zichtbaar selecteren van een vorm

We gaan een vorm selecteren die we hebben teruggevonden bij zijn naam. Deze macro is geschreven voor Draw; waarbij we er van uitgaan dat de vorm op een andere pagina staat dan die welke wordt weergegeven.

Dim MijnDocument As Object

Dim MijnVorm As Object

Dim EenPagina As Object

MijnDocument = ThisComponent

EenPagina = MijnDocument.drawPages.getByName("TestPagina")

MijnVorm = FindObjectByName(EenPagina, "Eerste Object")

if IsNull(MijnVorm) then

print "Naam bestaat niet !"

else

MijnDocument.CurrentController.CurrentPage = EenPagina

MijnDocument.CurrentController.Select(MijnVorm)

end if

Het is nodig, zoals we hebben gedaan, de tekenpagina weer te geven waar de vorm zich bevindt, omdat anders de selectie niet wordt uitgevoerd.

Aanvullende informatie

Basic vereenvoudigt het gebruik van de API

Als u op forums of andere documenten heeft gelezen dat Basic-macro's de API gebruiken, heeft u kunnen zien dat de constructies een beetje verschillen van die welke hier beschreven zijn. De reden daarvoor is dat er meerdere manieren in Basic zijn om hetzelfde te bereiken en bepaalde macro's zijn gebaseerd op de taal Java, die bepaalde zware constructies niet accepteert.

De optionele haken

Wanneer een methode in het geheel geen argument bevat, zijn de haken niet nodig.

MijnDocument.Store()

Vereenvoudiging in Basic

MijnDocument.Store

De getXxxx en setXxxx

De API gebruikt een overvloed aan methoden met getXxxx om een informatie te verkrijgen en met setXxxx om de informatie aan te passen.

Basic verschaft pseudo-eigenschappen in de vorm van een Xxxx toegang voor lezen en/of schrijven. Gebruikte geschrevene strikt volgens API :

tx3 = EenCel.getString()

EenCel.setString("Goedenavond")

Vereenvoudiging in Basic :

tx3 = EenCel.String

EenCel.String = "Goedenavond"

String is geen geldige eigenschap voor een cel en wordt niet beschreven in de API-documentatie. Het is een faciliteit die wordt aangeboden door OpenOffice Basic.

Toegang tot eigenschappen

De meeste eigenschappen zijn toegankelijk voor schrijven en lezen. Daarom kan men in het algemeen de actuele waarde van een eigenschap aanpassen of terugvinden. Bijvoorbeeld :

kleur = EenCel.CellBackColor ' vindt de actuele waarde terug

EenCel.CellBackColor = RGB(255,255,204) ' pas een waarde aan

U kunt in de literatuur een meer complexe, maar eenduidige, manier vinden om een eigenschap te veranderen :

kleur = EenCel.getPropertyValue("CellBackColor")

EenCel.setPropertyValue("CellBackColor", RGB(255,255,204))

In dit geval moet de naam van de eigenschap hoofdlettergevoelig zijn (Hoofd-/kleine letters,).

Wat is een woord?

Een woord is een reeks tekens tussen twee woordscheidingstekens ! Oke, maar wat is een woordscheidingsteken ? Dat is een spatie, een Alineaeinde-teken of Regeleinde-teken, of een teken behorende tot de tekenreeks WordSeparator die een eigenschap van het document is.

U kunt deze tekenreeks zien en bewerken in een geopend Writer document, door te openen het menu Bestand > Eigenschappen, tab Statistiek. Open de on-line Help voor meer uitleg. Het aantal woorden in een document staat in de eigenschap WordCount.

De woordbetekenis is een beetje afwijken voor het cursorbeheer. U zult dit gewaar worden als u de zichtbare cursor verplaatst door te drukken Control+Pijl naar rechts. De cursor blijft staan op de tekens zoals “ + / , ”. Dit is ook het geval met gotoNextWord.

De documenteigenschap WordCount verricht een ingewikkelde woordberekening die helaas niet toegankelijk is als onafhankelijke routine. Als u het aantal woorden in een selectie wilt tellen, zoek dan niet hoe u een macro kunt maken, want daar zullen steeds andere resultaten uitkomen. Vervolg door een leeg Writer-document te openen, zet de selectie daar in en lees het aantal woorden af van de Tab Statistiek in het menu Eigenschappen.

De verschrikkelijke constanten

De API maakt veel gebruik van constanten of opsommingswaarden; dat zijn in feite eenvoudige numerieke waarden zoals 1, 2, 3, 4. U kunt deze nummers niet gebruiken, omdat zij pas worden berekend bij de implementatie. Tegengesteld daaraan zijn de namen van de constanten zeer stabiel.

Maar hetzelfde geldt voor de naamgeving van de constanten in de verschillende modules. Bijvoorbeeld als u in de index van de API zult zoeken naar de definities van LEFT : ongeveer 26 onafhankelijke definities, met de werkelijke waarden dikwijls zeer verschillend.

Om de relatieve constanten tussen twee modules te onderscheiden, is het nodig om de naam van een constante aan te duiden met de complete naam van de module, die hiërarchiek wordt gedefinieerd.

Deze hiërarchie is ook die van de boomstructuur in de HTML-pagina's van de API. Wanneer u aankomt op een pagina die de opsommingswaarden beschrijft, zult u zoiets zien als :

Adres van de HTML-pagina : blabla/com/sun/star/table/CellHoriJustify.html

Aan het begin van die HTML-pagina zult u zien :

:: com :: sun :: star :: table ::

enum CellHoriJustify

En verschillende waarden zoals STANDARD LEFT CENTER etc.

De omschrijvingsregel van een Basic-constante wordt eenvoudig duidelijk in dit voorbeeld :

Dim mijnUitlijn As Integer

rem gebruiken van een tussenvariable om makkelijker te lezen

mijnUitlijn = com.sun.star.table.CellHoriJustify.STANDARD

EenCel.HoriJustify = mijnUitlijn

rem Direct gebruiken van de constante

EenCel.HoriJustify = com.sun.star.table.CellHoriJustify.STANDARD

Attentie

De complete naam van de constante moet exact worden overgenomen, Hoofdletters en kleine letters.

De kleuren

In OpenOffice wordt een kleur gedefinieerd door drie gehele getallen, allemaal tussen 0 en 255, die de intensiteit van de primaire kleuren Rood, Groen, Blauw (in Engels : Red, Green, Blue) weergeven.

Elke kleur wordt vertegenwoordigd in een octet (groep van 8 bits), de drie octetten worden gecombineerd in de vorm van een lang geheel getal ( weergavetype : Long).

Door de waarde van elke primaire kleur te kennen, kan men de OpenOffice-waarde van de resultaatkleur bepalen :

Dim kleur As Long

Dim deelRood As Integer, deelGroen As Integer, deelBlauw As Integer

deelRood = 120

deelBlauw = 60

deelGroen = 220

kleur = RGB(deelRood, deelGroen, deelBlauw)

Door de waarde van de kleur te kennen, kan men de waarde van elke primaire kleur terugvinden :

Dim kleur As Long

Dim deelRood As Integer, deelGroen As Integer, deelBlauw As Integer

kleur = 8253534

deelBlauw = Blue(kleur)

deelGroen = Green(kleur)

deelRood = Red(kleur)

Tip

Bewerking van het kleurpalet, toegankelijk via het menu Extra / Opties / OpenOffice.org / Kleuren stelt u in staat om de drie waarden, corresponderend met de kleur van uw keuze, terug te vinden. Klik op de knop Bewerken, klik op de kleur van uw keuze in de regenboog, schrijf op een papiertje de waarden van Rood-Groen-Blauw die verschijnen en sluit het venster met Annuleren.

Raadplegen van de API

De hier beschreven procedures en functies zijn niet meer dan een beperkt uittreksel van de beschikbare. Om meer te willen weten, moet u de documentatie van de API raadplegen . Maar die is groot en omslachtig, moeilijk te hanteren, en alleen in het Engels. Zie hier enkele kleine hulpjes om te lezen.

Het nieuwe document van Sun : StarOffice 6.0 Software Basic Programmer's Guide , alleen beschikbaar in het Engels, bevat veel aanwijzingen voor de migratie van Visual Basic naar OpenOffice Basic, een goede introductie naar de API, en behandelt bepaalde API-onderwerpen die hier zijn weggelaten.

De Extra Xray, beschikbaar op de site http://fr.openoffice.org/Documentation/Macros/indexmac.html , staat u toe de mogelijkheden om API-objecten te manipuleren in uw macro's te leren kennen. In versie 2, kunt u daarmee de API raadplegen.

De SDK is beschikbaar via de site http://api.openoffice.org/ meer precies op de pagina http://www.openoffice.org/dev_docs/source/sdk/ .
De versie OpenOffice.org SDK 1.1.0, beschikbaar op de datum van dit document, bedraagt 40,5 Mb voor Windows, 27,9 Mb voor Linux en 29,2 Mb voor Solaris.

Hij wordt uitgepakt in een enorme boomstructuur die de API, de Developer's Guide en een groot aantal andere documenten bevat.

De Developer’s Guide is beschikbaar in de SDK in PDF-formaat (een pad van 900 onverteerbare pagina's) en in HTML-vorm zeer praktisch te raadplegen, met koppelingen naar de API-documentatie, eveneens in HTML. U kunt in de Guide informatie vinden over de “ filosofie ” van de API en twee hoofdstukken over zijn implementatie met Basic. Praktisch gezien is de Guide alleen toegankelijk voor informatica-specialisten; de voorbeelden zijn in het algemeen verschaft in Java.

De API alleen is alleen beschikbaar in de vorm van meer dan 4000 HTML-pagina's, on line te raadplegen . De koppelingen geven vele ingangen tot de verschillende elementen, en een goede navigator is nodig (bijvoorbeeld Opera, die de opening van meerdere vensters tegelijkertijd toestaat). De beschikbare pagina's on-line hebben een licht afwijkend presentatie dan die van de gecomprimeerde bestanden.

Gebruik de index-pagina's om snel die dingen te bereiken die u interesseren en om nieuwe elementen te vinden.

Men kan hetzelfde genoemde procedures en functies vinden in verschillende contexten, met lichtelijk variërende functionaliteiten .

Het overzicht op de volgende pagina verschaft enkele vondsten.

Onderwerp	Waar staat de informatie
Document	com > sun > star >Document
Tekst	com > sun > star > text
Werkblad	com > sun > star > sheet
Diagrammen	com > sun > star >chart
Tekenen	com > sun > star > drawing
Presentatie (Impress)	com > sun > star > presentation
Alinea en celopmaak	com > sun > star > style
Tabellen, in het algemeen (Calc, Writer)	com > sun > star > table
Eigenschappen van teksttabellen (Writer)	index > TextTableRow
Celinhoud	index > XCell
Celopmaak	index > CellProperties ( table voor Calc) index > CellProperties ( text voor Writer)
Methoden voor celbereiken	index > XCellRange
Tekstbereik	index > XTextRange TextRangeCompare XTextRangeMover
Cursor om van cel tot cel te gaan	index > XCellCursor ( voorCalc) index > XTextTableCursor (voor Writer)
Eigenschappen van een tekstkader	index > TextFrame > BaseFrame
Eigenschappen van een alinea en een teken in een tekst	com > sun > star > text > Paragraph
Eigenschappen van tekstalinea’s	index > ParagraphProperties
Vorm (tabel, kader, tekenen)	index > Shape
Lijneigenschappen (tekenen)	index > LineProperties
Vullen van een vorm (achtergrondkleur)	index > FillProperties

Credits

Auteur: Bernard Marcelly

Dank:

Bewerkt door : Sophie Gautier

Laatste wijziging: 2003/11/10

Contact : Projet Documentation OpenOffice.org http://fr.openoffice.org

Vertaling NL: Dick Groskamp

Licentie

Appendix

Public Documentation License Notice

The contents of this Documentation are subject to the Public Documentation License Version 1.0 (the "License"); you may only use this Documentation if you comply with the terms of this License. A copy of the License is available at http://www.openoffice.org/licenses/PDL.html.

The Original Documentation is : L’API OpenOffice.org (presque) sans peine

The Initial Writer of the Original Documentation is Bernard Marcelly

Copyright (C) 2003. All Rights Reserved. (Initial Writer contact(s): marcelly@club-internet.fr )

Contributor(s): ______________________________________.

Portions created by ______ are Copyright (C)_________[Insert year(s)].

All Rights Reserved. (Contributor contact(s):________________[Insert hyperlink/alias]).

NOTE: The text of this Appendix may differ slightly from the text of the notices in the files of the Original Documentation. You should use the text of this Appendix rather than the text found in the Original Documentation for Your Modifications.

Appendix

Publieke Documentatie Licentie Opmerking

De inhoud van deze Documentatie is onderwerp van de Public Documentation License Version 1.0 (de "Licentie"); u mag deze Documentatie alleen gebruiken als u instemt met de bepalingen van deze Licentie. Een kopie van de Licentie is beschikbaar op http://www.openoffice.org/licenses/PDL.html.

De Originele Documentatie is : L’API OpenOffice.org (presque) sans peine

De Initiële Schrijver van de Originele Documentatie is Bernard Marcelly

Copyright (C) 2003. Alle rechten Voorbehouden. (Initiële Schrijver contact(en): marcelly@club-internet.fr )

Toevoeging(en): ______________________________________.

Gedeelten gecreëerd door ______ zijn Copyright (C)_________[Voeg jaar in].

Alle Rechten Voorbehouden. (Toevoeging(en) contact(en):________________[Voeg hyperlink/alias in]).

OPMERKING: De tekst van deze Appendix kan licht afwijken van de tekst van de bepalingen in de bestanden van de Originele Documentatie. U kunt beter de tekst van deze Appendix gebruiken dan de gevonden tekst in de originele Documentatie voor Uw Aanpassingen.

OpenOffice.org Documentatie Project How-To

http://nl.openoffice.org/	96

API OpenOffice (bijna) zonder moeite

api macro OpenOffice

2003-11-12T21:46:02