Introducció a la Programació d'Aplicacions amb LibreOffice...

55
Introducció a la Programació d'Aplicacions amb LibreOffice Basic

Transcript of Introducció a la Programació d'Aplicacions amb LibreOffice...

Page 1: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions ambLibreOffice Basic

Page 2: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

(c) Artur Guillamet SabatéAbril - 2014

Page 3: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

ÍNDEX:Pàg.

1.- Introducció. 2

2.- Creació de macros. 2

3.- Interacció bàsica. Llegir i escriure a cel·les. 7

4.- Interacció bàsica. Quadres de diàleg estàndard. 10

5.- Associació de macros a botons, menús i esdeveniments del document. 13

6.- Tipus de dades. Variables i estructures de informació. 16

6.1.- Tipus de dades. 17

6.2.- Variables i constants. 17

6.3.- Cadenes de text. 19

6.4.- Arrays. 19

7.- Operadors. 21

8.- Estructures de programació. 23

8.1.- Estructures condicionals bàsiques. 24

8.2.- Estructures iteratives bàsiques. 27

8.3.- Altres estructures. 30

9.- Subrutines i funcions. 31

10.- Interacció avançada: Quadres de diàleg. 33

11.- Creació d'aplicacions. Programes d'exemple. 38

12.- Exercicis. 52

Pàg. no. 1

Page 4: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

1.- Introducció.LibreOffice Basic és un llenguatge de programació complet que es basa en el llenguatge deprogramació Basic. Aquest també és totalment compatible amb OpenOffice.org Basic

Aquest es troba implementat dins la suite LibreOffice i permet crear programes informàtics queinteraccionen visualment amb l'usuari i suporten el control sobre els objectes específics deLibreOffice com ara el full de càlcul, processador de text, base de dades, etc.

En aquest dossier és pretén introduir els conceptes bàsics per crear aplicacions visuals interactivesamb LibreOffice i el seu llenguatge de programació Basic en l'entorn del Full de càlcul Calc.

2.- Creació de macros.La paraula macro, en el context de LibreOffice Basic, és una reducció de la paraula“macroinstrucció”. Les macros són programes estructurats en forma de subrutines i funcions ques'executen dins l'entorn de LibreOffice. Per defecte, aquest es protegeix contra programesmaliciosos i cada cop que s'executa la macro es sol·licita confirmació o és bloqueja automàticament.En el nostre cas, per fer els exercicis del dossier hem d'evitar aquest bloqueig per defecte, peraixò modificarem a: “Eines/Opcions/LibreOffice.org/Seguretat” i al botó: “Seguretat de lesmacros” seleccionarem “Baixa”.

En aquest apartat crearem la primera macro, aquesta serà un programa molt senzill que obrirà undiàleg amb el text “Hola món!”. L'objectiu es mostrar tot el procés d'edició i execució en detall, jaque en els exercicis següents s'incidirà més en el programa per si mateix que no pas en el procés dedesenvolupament.

Accedirem a l'entorn de gestió i edició de macros. Per això, en un document nou de full de càlculque desarem amb el nom: “ExercicisLOBasic.ods”, accedim a: “Eines/Macros/Organitza lesmacros/LibreOffice.org Basic”.

Pàg. no. 2

Page 5: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Podem ubicar les macros a diversos llocs: A “Les meves macros” aquestes s'ubicaran dinsl'ordinador de l'usuari i estaran disponibles des de tots els documents LibreOffice de l'usuari dinsl'ordinador actual. A “Macros de LibreOffice” aquestes s'ubicaran dins l'espai d'instal·lació deLibreOffice i estaran disponibles per tots els usuaris de l'ordinador on estigui instal·lat elLibreOffice.

En aquests dos casos anteriors, les macros queden dipositades dins l'ordinador de treball i en elmoment de enviar els fitxers de treball a altres ordinadors, les macros ja no estaran disponibles.En el tercer cas, assenyalat amb una fletxa, tenim disponible el fitxer de full de càlcul de treballobert. Si ubiquem les macros dins aquest fitxer, quan canviem el fitxer d'ordinador, les macroscontinuaran accessibles ja que aquestes queden desades dins el mateix fitxer. Aquesta darrera opcióserà la que utilitzarem per defecte per garantir que les macros es transmetran conjuntament amb elfitxer quan es distribueixi.

En clicar sobre “Nou” ens sol·licita un nom per al mòdul que encabirà aquesta macro, ho deixemamb el nom “Practiques”:

Seguidament accedim a l'espai de treball i edició de la macro. Aquest espai s'anomena IDE(Integrated Development Environment, Entorn de desenvolupament integrat) que incorpora l'ediciódel codi del programa i les eines per fer-ne la depuració i execució:

Pàg. no. 3

Page 6: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Esborrem el contingut de la finestra i escrivim el següent text:

Sub macro01 MsgBox "Hola món!"End Sub

Un cop escrit, Desem i Tanquem la finestra d'edició de macros.

Observem que el programa s'introdueix entre les línies “Sub nommacro” i “End Sub”. Aquestescorresponen al començament i acabament d'una macro i indiquen que es tracta d'una subrutina (mésendavant distingirem entre subrutina i funció). Amb nommacro indiquem el nom de la macro iaquest ha de ser únic.

Per executar-la, accedim a: “Eines/Macros/Executa una macro” i obtindrem el següent quadre“Selector de macros”, on ens mostra les macros disponibles per executar:

Pàg. no. 4

Page 7: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

En clicar sobre “Executa”, ens apareix:

També podem executar la macro des de dins el mateix entorn IDE si tenim posat el cursor a sobre

de la mateixa macro i premem el botó: (Executa el BASIC, F5). En condicions de disseny,escriptura i depuració de les macros, dins l'entorn IDE, sempre l'executarem amb aquest botó percomprovar el seu funcionament. En canvi, el “Selector de macros” solament l'utilitzarem en casd'execució esporàdica.

Creació de programes informàtics:Els programes informàtics bàsics que interaccionen amb l'usuari, consten de tres fases d'execució:

1.- La introducció de dades.2.- El processament de les dades segons l'objecte del programa.3.- La presentació dels resultats obtinguts

Pàg. no. 5

1. Introducció de dades

2. Processament dedades

3. Presentació de resultats

Page 8: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Les fases 1 i 3 corresponen a la interacció amb l'usuari. En aquest cas cal establir un diàleg desol·licitud d'informació i presentació de resultats. En ocasions aquestes dades s'obtenen i retornenels resultats en les mateixes cel·les del full de càlcul, en canvi, en altres ocasions poden sersol·licitades i presentades directament a l'usuari mitjançant quadres de diàleg. Els quadres de diàlegpoden ser: Estàndard1 o Avançats2 En els apartats 3, 4 i 10 següents veurem aquests tipusd'interacció. La classificació resumida de la interacció amb l'usuari és la següent:

- Lectura i escriptura de dades en elmateix full de càlcul

Interacció amb l'usuari(fases 1 i 3)

- Quadres de diàleg estàndard

- Quadres de diàleg avançats

En un mateix programa, segons sigui la seva necessitat, pot interaccionar amb l'usuari mitjançant undels tres sistemes indicats o també amb una combinació entre ells.

La fase 2 és la que realitzarà el programa amb l'objectiu de realitzar les operacions adients a la sevafuncionalitat manipulant les dades adequadament fins obtenir el resultat desitjat. Aquesta faseconstarà de més o menys instruccions segons sigui la complexitat d'aquesta funcionalitat.

Els Comentaris: En la creació de programes informàtics és molt habitual introduir texts explicatiusdel que realitzen les instruccions del programa. Aquests texts s'anomenen “comentaris”. En Basicintroduïm un comentari segons dos formes diferents:

– posant un apòstrof (') al principi del text que es vol que sigui comentari, o bé, – escrivim la paraula “Rem” al principi del text a comentar.

Per exemple:Rem Això és un comentari.' Aquest text també és un comentari per que comença per apòstrof.

En l'escriptura de programes, normalment escriurem una sola instrucció per línia. D'aquesta formafacilitem la interpretació del codi. Però, si convé posar més d'una instrucció per línia, també éspot fer, llavors cal separar cada instrucció, entre elles, mitjançant dos punts (:).

També és important utilitzar la indentació de línies per facilitar la interpretació del codi. Aixòconsisteix en que si una instrucció o instruccions és troben enniuades dins una altra de nivellsuperior, aquestes línies es començaran a escriure més cap a la dreta.

1 Quadre de diàleg estàndard serà aquell que estarà format, bàsicament per instruccions MsgBox i InputBox.2 Quadre de diàleg avançat serà aquell format per múltiples controls de formulari com ara: camps de text, etiquetes, llistes desplegables, etc. ubicats en una finestra específica.

Pàg. no. 6

Page 9: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Per exemple:

Sub macroExempleIndentacioInstrucció 1Instrucció 2Inici Instrucció 3

Instrucció 5Instrucció 6

Fi Instrucció 3Instrucció 4

End Sub

En aquest exemple, totes les instruccions es troben dins de la Subrutina “macroExempleIndentacio”,per aquest motiu, totes es troben indentades cap a la dreta. A més, les instruccions 5 i 6 també estandins la instrucció 3, per tant, també estan indentades més cap a la dreta.

3.- Interacció bàsica. Llegir i escriure a cel·les.En aquest apartat s'indicarà com podem utilitzar les cel·les del full de càlcul per llegir-ne el seucontingut (i per tant, rebre les dades que contenen) i escriure'n la presentació dels resultatsobtinguts. Amb això implementen la primera i tercera fase d'execució d'un programa segonss'indica en l'apartat 2 en la “Creació de programes informàtics”.

L'acció de obtenir les dades d'una cel·la s'anomena “get” i l'acció de assignar un valor a la cel·las'anomena “set”.

Les cel·les que formen part d'un full de càlcul es poden referenciar segons el seu nom (format per lalletra de la columna i el número de la fila, ex. “B4”) o bé, es pot referenciar segons la posició decolumna-fila ocupada dins el full, amb la numeració iniciada en la cel·la superior esquerra que técom a posició: (0,0) i incrementant-se les columnes cap a la dreta i les files cap abaix. Per exemple,la cel·la “B4” estaria referenciada com a posició: (1,3).

Per cada cas utilitzarem getCellRangeByName(nom) per referenciar al nom de la cel·la igetCellByPosition(columna,fila) per referenciar a la posició de la cel·la segons les coordenadescolumna-fila.

Pàg. no. 7

Page 10: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Amb ThisComponent fem referència al document de full de càlcul que esta actualment actiu.

Amb Sheets(no. de full) fem referència a la llista de fulles que té el document Calc actiu. Laprimera fulla es referència amb 0, la segona amb 1, la tercera amb 2, etc. També podem ferreferència al nom del full de la següent forma: Sheets.getByName(nom)Si volem fer referència al full actualment actiu, independentment del seu nom o posició, ho podemfer amb: ... getCurrentController().getActiveSheet()

Per formar la referència a una cel·la determinada, unirem els elements indicats prèviamentmitjançant un punt “.”. Per exemple, amb: ThisComponent.Sheets(0).getCellRangeByName(“C4”)estem fent referència a la cel·la C4, del primer full, del document Calc que està actualment actiu. Encanvi, amb: ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName(“C4”)fem el mateix, però, sobre el full actualment actiu, independentment del seu nom o posició.

En cada cas de lectura (get) o escriptura (set) a una cel·la, distingirem si ho fem amb un valornumèric (Value), de cadena (String) o bé, de fórmula (Formula) mitjançant els mètodes de lectura:getValue(), getString() i getFormula() i els mètodes d'escriptura: setValue(), setString() isetFormula().

Llegir el contingut de les cel·les d'un full de càlcul:

Per llegir el contingut numèric d'una cel·la i assignar-lo a la variable de nom valor, utilitzem:

valor=ThisComponent.Sheets(0).getCellRangeByName("A5").getValue()

Per llegir el contingut alfanumèric d'una cel·la i assignar-lo a la variable de nom cadena, utilitzem:

cadena=ThisComponent.Sheets(0).getCellRangeByName("A5").getString()

Per llegir la fórmula d'una cel·la i assignar-ho a la variable de nom cadena, utilitzem:

cadena=ThisComponent.Sheets(0).getCellRangeByName("A5").getFormula()

També ens podem referir a la cel·la amb una referencia columna-fila, tant per llegir un valornumèric, alfanumèric (cadena), o fórmula, i assignar-ho a les variables valor i cadena,respectivament:

valor=ThisComponent.Sheets(0).getCellByPosition(0,4).getValue()cadena=ThisComponent.Sheets(0).getCellByPosition(0,4).getString()cadena=ThisComponent.Sheets(0).getCellByPosition(0,4).getFormula()

Pàg. no. 8

Page 11: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Escriure el contingut de les cel·les d'un full de càlcul:

Si desitgem assignar valors numèric, de cadena o fórmula a una cel·la ho fem de la següent forma:

ThisComponent.Sheets(0).getCellByPosition(0,4).setValue(10.2)ThisComponent.Sheets(0).getCellRangeByName("A8").setValue(5)

Pel cas de voler-hi assignar un text (o formula, començada per = i amb les funcions amb el seu nomanglès), ho podem fer amb:

ThisComponent.Sheets(0).getCellRangeByName("A5").setString("Text de prova")ThisComponent.Sheets(0).getCellRangeByName("A5").setFormula("=A4+INT(A3)")

Els valors assignats als “set's” també poden ser directament el valor contingut en una variable:

Thiscomponent.Sheets(0).getCellRangeByName("A8").setValue(valor)Thiscomponent.Sheets(0).getCellRangeByName("A5").setString(cadena)

Referent als fulls, en els exemples anteriors, es fa la selecció de full segons el seu ordre en la llistade fulls, començant per 0. Però, també podríem fer la selecció del full mitjançant el seu nom. Peraixò hem d'utilitzar el mètode “getByName(nomFull)”. Llavors, alguns dels exemples anteriorsquedaria de la següent forma:

valor=ThisComponent.Sheets.getByName("Full1").getCellRangeByName("A5").getValue()cadena=ThisComponent.Sheets.getByName("Full1").getCellByPosition(0,4).getString()Thiscomponent.Sheets.getByName("Full1").getCellRangeByName("A8").setValue(valor)

Quan s'ha d'escriure molts cops aquestes referències a un full del full de càlcul podem observar ques'efectua moltes repeticions. Aquestes referències tan llargues és poden simplificar si prèviament hoassignem a una variable que contingui l'objecte full. Llavors, repetint alguns dels exemples prèvis,veurem com la línia queda més curta i queden de la següent forma:

full=ThisComponent.Sheets.getByName("Full1") 'es crea l'objecte “full”.valor=full.getCellRangeByName("A5").getValue()cadena=full.getCellByPosition(0,4).getString()full.getCellRangeByName("A8").setValue(valor)

Exemple

Sub macro02 Rem En aquest exemple s'utilitza la majoria de les formes d'accés a cel·les indicades Rem en aquest apartat. També s'utilitzen diferents formes d'inserir comentaris per Rem explicar el codi. Rem --------------------------------------------------------------------------------- full=ThisComponent.Sheets.getByName("Full1") 'Es crea l'objecte full Rem Escric un text a la cel·la A6 full.getCellRangeByName("A1").setString("Operacions:") Rem Escric el valor 6'3 a la cel·la A8: ThisComponent.Sheets(0).getCellRangeByName("A2").setValue(6.3)

Pàg. no. 9

Page 12: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

'Llegeixo el valor de la mateixa cel·la: valor=full.getCellByPosition(0,1).getValue() Rem Assigno el triple del valor llegit a la cel·la A10: ThisComponent.Sheets(0).getCellByPosition(0,3).setValue(valor*3) 'Assigno una fórmula a la cel·la A12: ThisComponent.Sheets(0).getCellRangeByName("A6").setFormula("=A2+INT(A4)") End Sub

En aquest exemple, les línies que comencen amb “Rem” o apòstrof (') són comentaris explicatiusdel que fa el programa i no tenen cap efecte en la seva execució.

4.- Interacció bàsica. Quadres de diàleg estàndard.Els quadres de diàleg estàndard més simples són MsgBox i InputBox. El primer mostra un missatgei uns botons a clicar, i el segon sol·licita una dada alfanumèrica a l'usuari.

En les descripcions següents es descriu la sintaxis d'aquestes dues instruccions MsgBox i InputBox.

La sintaxis descriu la forma genèrica en que es pot utilitzar la instrucció i el tipus de dades queretorna. Els elements de sintaxis que es troben entre claudàtors [ ] són opcionals, és a dir, no esobligatòria la seva utilització i els elements entre claus separats per barra { | } són alternatius.

MsgBoxAquest quadre de diàleg mostra un missatge a l'usuari. La seva sintaxi és:

Integer resposta = MsgBox (Missatge As String, [Tipus As Integer], [Titol As String] )

La sintaxis ens indica que aquesta instrucció pot tenir fins a tres paràmetres: Missatge, Tipus i Titol.El primer és de tipus cadena, el segon és un enter i el tercer també és de tipus cadena. També indicaque ens retorna el valor numèric (Integer) que correspon al número de botó que s'ha premut.Aquesta sintaxis correspon a l'estructura de funció, on la instrucció retorna un valor, i els paràmetresestan tancats entre parèntesi. Però, també és pot utilitzar la forma de instrucció, on s'elimina elparèntesi i ja no retorna cap valor. Els paràmetres entre claudàtors [ ], són opcionals. En la sevaexpressió com a instrucció queda com:

MsgBox Missatge As String, [Tipus As Integer], [Titol As String]

Com a exemple en la seva mínima expressió podria ser: MsgBox “Hola món!”, tal com es va utilitzaren la macro01.

El Missatge és el missatge que es vol mostrar a l'usuari.Amb Títol indiquem el nom que tindrà la finestra on es mostrarà el missatge.Amb Tipus indiquem el tipus de quadre de missatge i la icona que el representarà. Els valorsnumèrics possibles són:

Pàg. no. 10

Page 13: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Per les icones, tenim els valors:

16: 32: 48: 64:

I pels tipus de quadre de diàleg tenim els valors següents:

0 Mostra solament el botó “D'acord”

1 Mostra els botons “D'acord” i “Cancel·la”

2 Mostra els botons “Interromp”, “Reintenta” i “Ignora”

3 Mostra els botons “Sí”, “No” i “Cancel·la”

4 Mostra els botons “Sí” i “No”

5 Mostra els botons “Reintenta” i “Cancel·la”

Per indicar el botó actiu per defecte, utilitzem els valors: 128, 256 i 512, per al primer, el segon i el tercer botó, respectivament, disponible en el diàleg. Si no s'indica, l'actiu serà el primer botó.

Els valors de: tipus de icona, tipus de quadre de diàleg i botó actiu, s'han de sumar entre ells performar el diàleg desitjat. Per exemple, si volem una icona amb el símbol d'admiració i els botons“Si” i “No”, amb “No” actiu per defecte, haurem de sumar els valors 48 + 4 + 256 per formar elvalor del paràmetre Tipus.

Segons el botó que es premi, es retornarà un valor numèric dels que s'indiquen a continuació:

Valor retornat per MsgBox,número de botó Botó premut

1 D'acord

2 Cancel·la

3 Interromp

4 Reintenta

5 Ignora

6 Sí

7 No

Pàg. no. 11

Page 14: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Exemple d'ús:

MsgBox("Estas d'acord amb el resultat?", 128+48+4, "Solució")

MsgBox("No s'ha trobat el valor desitjat.", 32+2, "Avís")

InputBoxAquest quadre de diàleg sol·licita un text a l'usuari. La seva sintaxis és:

String texte=InputBox(Pregunta As String, [Titol As String], [Resposta As String])

Pregunta és una cadena de text que sol·licita a l'usuari la introducció d'un text.Títol és opcional i correspon al títol que apareixerà en la finestra del diàleg.Resposta és opcional i correspon a la resposta que s'introdueix per defecte.

El valor introduït per l'usuari es retorna i quedarà desat en la variable tipus String corresponent.

Exemple:

nomusuari = InputBox("Com et dius?", "Nom de l'usuari")

En prémer sobre el botó “D'acord” es retornarà el text introduït per l'usuari i quedarà desat en lavariable nomusuari.

Pàg. no. 12

Page 15: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Cal tenir en compte que aquesta instrucció sempre retorna un valor textual. Per tant, si el que essol·licita és un valor numèric, el número que haurà introduït l'usuari també serà considerat com untext i no es podrà fer operacions aritmètiques amb ell. En aquest cas, cal aplicar una conversió devalor textual a valor numèric (per exemple, usant Val, CInt, CLng, CDbl, etc.)

En els texts dels quadres de diàleg MsgBox i InputBox podem concatenar cadenes de caràcters i/ovariables alfanumèriques amb el símbol & . Si volem introduir salts de línia, ho hem de concatenaramb: Chr(13). Per exemple: “Primera línia “ & Chr(13) & “Segona línia” ens mostrarà dos línies,una sota l'altra.

Exemple. El següent exemple estableix un diàleg interactiu amb l'usuari:

Sub macro03 nom=InputBox("Hola, com et dius?", "Diàleg") edat=InputBox(nom & ", quants anys tens?", "Diàleg") MsgBox nom & ", et falten:" & Chr(13) & (100-Val(edat)) & " anys" & Chr(13) & "per arribar a 100 anys.",64,"Diàleg"End Sub

5.- Associació de macros a botons, menús i esdeveniments del document.Ja tenim unes macros creades, però, ens adonem que per executar-les és necessari que accedim al'espai del “Selector de macros” o clicar F5 o el botó “Executa la macro” en el IDE. Això no ésmassa còmode quan ja no s'ha de fer la creació del programa ni la seva edició.

Habitualment, les macros són executades a partir dels esdeveniments que es podenproduir en el document que les conté. Així, és possible associar una macro a un omés esdeveniments del document i objectes continguts.

Un esdeveniment és una acció feta sobre un objecte dels que formen part del'aplicació, per exemple, un objecte podria ser una imatge, un full, un botó, el propidocument, etc. i, un esdeveniment sobre un d'aquests objectes podria ser: fer-hi clicamb el ratolí, passar-hi per sobre amb el cursor del ratolí, agafar o perdre el focus,obrir el document, desar el document, etc.

Als esdeveniments que es poden produir en cadascun dels objectes (documents,menús, botons de barres d'eines, fulls, objectes de formulari, etc.) se'ls hi potassignar macros.

Assignar una macro a un element de formulari: BotóEl cas més simple és associar una macro a l'esdeveniment clic d'un botó ubicatsobre el full. A continuació es descriu com fer-ho, pas a pas.

Primer hem de fer visible la barra d'eines dels controls de formulari amb:“Visualitza / Barra d'eines / Controls de formulari”. Un cop és visible veurem unabarra flotant com la de la imatge lateral.

Pàg. no. 13

Page 16: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

El botó serveix per commutar entre els modes disseny activat idisseny desactivat. En cas que el disseny estigui activat, ens permetràinserir elements de formulari sobre l'espai actiu del full de càlcul, tambéens permetrà modificar les seves propietats i assignar macros alsesdeveniments.Quan el mode disseny està desactivat, ja no es possible modificar lespropietats i els esdeveniments dels elements de formulari seleccionats.Solament és pot utilitzar.

Amb el mode disseny activat, seleccionarem l'objecte de formulari “Botóper prémer” i el situarem a sobre de l'espai del full de càlcul.

Un cop tenim ubicat el botó a sobre de l'espai del full de càlcul, podremaccedir a les seves propietats. Per això, amb el mode disseny activat,cliquem amb el botó de la dreta a sobre del nou botó creat i seleccioneml'opció “Control” en el menú contextual que apareix. Se'ns obrirà unanova finestra que mostrarà, en dos pestanyes, les propietats generals delcontrol i els esdeveniments.

En el nostre cas, modificarem la propietat“Etiqueta” per que mostri el nom de lamacro que ha d'executar i, en la pestanya“Esdeveniments” l'adjuntarem a la macroque ja tenim creada amb el nom de“macro01”. La següent imatge mostra laseqüència d'accions a fer per associar lamacro desitjada al botó que hem creat.

En passar al “Mode disseny desactivat” elbotó recupera la funcionalitat normal i, enclicar sobre ell, s'executarà la macro que

conté associada.

Les macros creades espoden associar a moltsaltres objectes deldocument, en els seusesdeveniments, tal comho hem fet en aquestexemple simple sobreun Botó. La sevautilització es veurà mésendavant en l'apartat de“Quadres de diàlegavançats”.

Pàg. no. 14

Page 17: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Podem crear un botó per a cadascuna de les macros fetes fins ara i quedarà de la següent forma:

Assignar una macro a un esdeveniment del document.En accedir a l'opció de menú: “Eines/Personalitza” trobem diverses pestanyes, una d'elles és la pestanya “Esdeveniments”. Aquesta permet assignar macros a esdeveniments del document. Per exemple, si assignem una macro a l'esdeveniment “Obre un document”, cada cop que s'obri el document s'executarà la macro indicada.

Assignar una macro a un element de menú.

Si accedim a la pestanya “Menús” podrem crear un nou element de menú i afegir-li ítems assignats a les macros desitjades. En l'exemple següent afegim un element de menú “Pràctiques” i tres ítems que executen les macros creades prèviament, seguint els passos de (1) a (12):

Pàg. no. 15

(1)

(2)

(3)

(1)

(4)

(3)

(2)

(6) (8)

(7)

(5)

Page 18: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

El pas (11) el repetirem tres cops per a les macros 01, 02 i 03.

Trobarem el nou element de menú personalitzat a la barra de menús, amb els ítems que enllacen amb les macros seleccionades de forma similar a la imatge següent:

Llegir o escriure en un “Quadre de Text” de “Formulari”.

Des de la barra d'eines de controls de formulari (Visualitza/Barra d'eines/Controls de formulari),podem inserir al full, entre altres coses, els Quadres de Text. Des de Basic podrem llegir i escriure-hi dades segons les formes següents, respectivament:

Full=ThisComponent.getCurrentController().getActiveSheet()sVar=Full.getDrawPage().getForms().getByName("Formulari").getByName("Quadredetext1").TextFull.getDrawPage().getForms().getByName("Formulari").getByName("Quadredetext1").Text=sVar

6.- Tipus de dades. Variables i estructures de informació.Tots els programes informàtics tenen la funció de fer un tractament adient de la informació que se lisubministra amb l'objectiu d'obtenir un resultat d'aquest tractament segons sigui la funcionalitat delprograma.

Un conjunt de dades, si esta correctament estructurat, formarà la informació amb la que ha detreballar el programa. En canvi, si les dades no tenen una estructura adient, no seran útils peltractament del programa.En aquest apartat s'estudiarà els principals tipus de dades i alguna estructura bàsica de lainformació.Les dades s'encabeixen en el programa en els elements anomenats variables i constants.

Pàg. no. 16

(9)

(10)

(11)

(12)

Page 19: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

6.1.- Tipus de dades.Alguns tipus bàsics de dades són:

– Booleà – Aquest tipus pot contenir el valor True o False.– String – També anomenat cadena. És un tipus que pot contenir dades alfanumèriques,

cadenes de text formades per els símbols de les lletres, números i símbols especials fins a65.535 caràcters.

– Integer – Són els números enters entre -32.768 i +32.767– Long – Són els números enters entre -2.147.483.648 i +2.147.483.647– Double – Són els números amb decimals i notació científica entre 1'79769313486232x10308

i 4'94065645841247x10-324 .– Variant – És un tipus de dada especial que pot correspondre, dinàmicament, a qualsevol

tipus de les anteriors. És el tipus amb que es declara, per defecte, a una variable quan no s'hiespecifica expressament un tipus concret.

– Object – Aquest tipus és utilitzat per encabir referències a objectes. Com a exemple, unobjecte pot ser una finestra, un botó, un full, una cel·la, etc.

6.2.- Variables i constants.Una variable és un espai de la memòria de l'ordinador reservada per encabir un tipus de dada.Aquest espai és referenciat per un nom de la variable.El nom de la variable pot estar format per lletres i números, però, no es permeten els caràctersespecials (espais, accents, etc.) i no es permet que el nom comenci per un número. És aconsellableque el nom de la variable sigui significatiu respecte del contingut que ha d'encabir, en cas de tenirmés d'una paraula, és habitual, però no obligatori, utilitzar les primeres lletres en majúscula.Exemple de noms de variables correctes:

m, edat, preuMesIva, auxiliar1, aux2, diaSetmanaNum, Opcio4, segon_preu

Exemple de noms de variables incorrectes:

peça, año, preuMésIva, 2opcio, Dia Setmana, dies/any

El contingut de la variable pot canviar durant l'execució del programa a mesura que aquest vaevolucionant.

Una constant és també una referència nominal a una dada que té la particularitat que mai canviaràdurant l'evolució de l'execució del programa.

Obligació de declarar prèviament les variablesPer defecte, Basic no obliga a declarar les variables. És a dir, podem utilitzar directament unavariable sense indicar-ne prèviament la seva utilització ni el seu tipus. Llavors, el programa en fauna declaració implícita en el primer moment en que s'utilitza i li assigna automàticament el tipuscorresponent al tipus de dades que s'hi encabeix, si no és possible establir el tipus, li assigna el tipusVariant.

Pàg. no. 17

Page 20: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Aquesta forma de procedir solament és adequada quan es fan petits programes de prova, però, estotalment desaconsellable quan el programa ja té una determinada envergadura i es vol tenir unfuncionament òptim de la memòria.És convenient que les variables i les constants és declarin i s'indiqui el seu tipus en començarl'execució del programa per optimitzar-ne el funcionament.

És pot obligar a declarar sempre les variables utilitzant la instrucció Option Explicit ubicada forade qualsevol subrutina o funció. En aquest cas, si s'utilitza una variable no declarada s'adverteixamb un error.

En els exemples anteriors d'aquest dossier no s'ha fet cap declaració de les variables. Això és coneixamb “Declaració implícita”, és a dir, el tipus de la variable i espai de la memòria reservada esdetermina automàticament en el primer ús de la variable. Aquest tipus de declaració implícita no ésmassa òptim quan el programa comença a ser més gran. Llavors el millor es fer la “Declaracióexplicita”, és a dir, declarar cada variable i constant, indicant el seu tipus al principi del programa,abans de la seva utilització.

La “Declaració explicita” és la més recomanada i per tant, a partir d'ara, en tots els programa que esfan en aquest dossier en farem la declaració prèvia de les variables i constants.

Les variables es declaren amb Dim i les constants amb Const.

Els noms de les variables i les constants no poden contenir cap espai ni caràcter especial, tampocpoden començar per un número.

Exemples de declaració de constants:Const PI As Double = 3.14159265Const FASES = 100Const OPCIO_1 As Integer = 4

Les constants declarades no poden canviar mai el seu valor durant l'execució del programa. És uncostum molt generalitzat entre programadors, encara que no és obligatori, escriure el nom de lesconstants sempre en majúscules.

Exemples de declaració de variables:Encara que no és obligatori, el nom de les variables s'acostuma a escriure en minúscules. Quan elnom de les variables està format per més d'una paraula, com que no pot tenir espais, cada paraulas'acostuma a començar per majúscula. A vegades, també se sol posar una primera lletra al nom perindicar el tipus de dades declarat per la variable, com és el cas de la d de dPreuMesIva o la s desNomClientAntic.

Dim a As IntegerDim comptador As IntegerDim obj As ObjectDim dPreuMesIva As DoubleDim sNomClientAntic As String

Pàg. no. 18

Page 21: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Una declaració de variable, on no s'indica el tipus, aquest tipus quedarà assignat per defecte aVariant. També es pot declarar més d'una variable en la mateixa línia separant-les amb coma (,) .

Dim F 'Per defecte, F ha estat declarada tipus Variant.Dim cami As String, aux As Integer, voltes As DoubleDim iFiles As Integer, oSegonFull As Object

Àmbit de les variablesLes variables es poden declarar dins d'una subrutina o funció o bé, fora.Si la variable es declara dins la subrutina o funció, llavors solament existirà dins l'àmbit d'execuciód'aquesta subrutina, és a dir, es crearà en iniciar-se la seva execució. Quan la subrutina hauràfinalitzat, llavors la variable deixarà d'existir. En aquest cas, es diu que és una variable d'àmbitlocal.

En canvi, si la variable es declara fora d'una subrutina o funció, aquesta variable existirà sempre iconservarà el mateix valor en qualsevol subrutina, és a dir, serà comuna a totes les subrutines. Enaquest altres cas, és diu que és una variable d'àmbit global.

6.3.- Cadenes de textS'entén per cadenes aquelles dades del programa que són del tipus String. Estan formades perconjunts de caràcters alfanumèrics: lletres, números i/o símbols especials acotats entre cometes “ “.

Podem crear una variable tipus String i assignar-hi un text de la forma següent:

Dim sParaules As StringsParaules = "Això és un text assignat a una variable de tipus cadena"

6.4.- ArraysEls arrays són variables multidimensionals. És a dir, amb un únic nom poden contenir múltiplesdades del mateix tipus o tipus diferents, indexades mitjançant un o més índexs.

Els arrays poden ser d'una dimensió, dos dimensions, tres dimensions, etc.

A l'array d'una dimensió també se'l sol anomenar “vector” i al de dos dimensions també tenen elnom alternatiu “matriu”.

Declaració d'un array de una dimensió amb 10 elements tipus Double indexats de 1 fins a 10:

Dim a(1 To 10) As Double

Declaració d'un array de 11 elements tipus Long indexats des de 0 fins a 10 :

Dim b(10) As Long

Pàg. no. 19

Page 22: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Podem accedir al contingut del seus elements referenciant-los com:

a(1), a(2), a(3), a(4), a(5), a(6), a(7), a(8), a(9) i a(10)b(0), b(1), b(2), b(3), b(4), b(5), b(6), b(7), b(8), b(9), b(10)

Observeu que si no s'indica el valor del index dels seus elements, aquest index comença per 0, talcom es veu en el cas del array b.

Podem assignar un valor al element 3 del array a de la següent forma: a(3)=25.12

Per declarar un array de dos dimensions (o matriu), ho podem fer de la forma següent:

Dim c (2,3) As Boolean

L'array c conté 3x4=12 elements tipus Boolean, són els següents: c(0,0) c(0,1) c(0,2) c(0,3) c(1,0)c(1,1) c(1,2) c(1,3) c(2,0) c(2,1) c(2,2) c(2,3) . Observem que els index comencen a comptar des de0 en cada dimensió.

També podem declarar un array on els seus índexs estan definits prèviament:

Dim d(-1 To 1, 2 To 3)

Aquest array d conté 3x2=6 elements que són els següents: d(-1,2) d(-1,3) d(0,2) d(0,3) d(1,2) d(1,3)

També podem declarar un array i assignar-hi dades directament. En l'exemple següent declarem dosarrays i els hi assignem dades directament.

e és un array amb totes les dades del mateix tipus (Integer) i f és un array amb dades de tipus diferents (Integer, String i Double), indexades, per defecte, de 0 a 5 i de 0 a 4 respectivament:

Dim e As Variant, f As Variante=Array(2, 3, 5, 4, 8, 9)f=Array(245, "Hola", 5.43, "Frase", 87)

En els apartats següents veurem exemples d'utilització de arrays. Principalment per la sevaestructura de dades, mitjançant els índexs, fàcilment es pot fer recorreguts del seu contingut amb lesinstruccions iteratives que s'estudien més endavant.

Pàg. no. 20

Page 23: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

7.- Operadors.Els operadors poden ser: aritmètics, relacionals i lògics.També existeix l'operador de concatenació de cadenes &, encara que aquest el considerem al margedels altres tres grups.

Operadors aritmètics:El resultat obtingut en l'aplicació d'aquest operador és un valor aritmètic en format tipus: Integer,Long, Double, etc.

^ Exponenciació a^4

* Multiplicació a*b

/ Divisió a/b

\ Divisió entera a\b

Mod Residu de la divisió

a Mod b

+ Suma a + b

- Resta a - b

Operadors relacionals:El resultat obtingut aplicant aquests operadors és un valor lògic: solament True o False (veritat ofals). La representació numèrica de True i False són el 0 i el -1, respectivament. El testeig de larelació sempre és en clau interrogativa.

= És igual? 3 a=b

<> És diferent? a<>b

< És menor? a<b

> És major? a>b

<= És menor o igual? a<=b

>= És major o igual? a>=b

Operadors lògics:Aquests operadors lògics s'apliquen a valors lògics i retornen, també un valor lògic True o False.

Not Negació Not a

And I lògic a And b

Or O lògic a Or b

3 L'operador = s'utilitza tant en operacions relacionals com d'assignació a variables. El llenguatge distingeix automàticament cada cas segons el context d'utilització on es trobi. Segons el context en determina l'operació a efectuar.

Pàg. no. 21

Page 24: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Precedència d'operacions:Quan dos o més operadors es troben en la mateixa operació s'aplica la precedència següent, enl'ordre indicat. L'operació de més a l'esquerra s'efectuarà abans que l'operació de més a la dreta:

^, *, /, \, Mod, +, -, =, <>, <, >, <=, >=, Not, And, Or, Xor, Eqv, Imp

Si en una operació on intervenen dos o més operadors es necessari modificar l'ordre de precedènciaindicat per defecte, llavors caldrà utilitzar els parèntesi ( ).

Exemple d'operacions aritmètiques i lògiques:Sub macro04

ThisComponent.Sheets(0).getCellRangeByName("A8").setString("Operacions")ThisComponent.Sheets(0).getCellRangeByName("A9").setValue(4^2)ThisComponent.Sheets(0).getCellRangeByName("A10").setValue(5\2)ThisComponent.Sheets(0).getCellRangeByName("A11").setValue(5 Mod 2)ThisComponent.Sheets(0).getCellRangeByName("A12").setValue(3 < 6)ThisComponent.Sheets(0).getCellRangeByName("A13").setValue(True And False)ThisComponent.Sheets(0).getCellRangeByName("A14").setValue(Not (False Or True))

End Sub

Operadors de cadena:Amb les dades tipus String (cadenes alfanumèriques) també es pot fer algunes operacionsespecífiques d'aquest àmbit. La més important és la concatenació de cadenes que es pot fer ambl'operador &. També és pot usar l'operador + per concatenar cadenes, en aquest cas, s'entén que esvol fer una concatenació per que els termes de l'operació són tots tipus String o una cadenaalfanumèrica. Les cadenes alfanumèriques les encabim entre cometes.

&, + Concatenar cadenes

a & ba + b“Hola “ & nom

També podem concatenar cadenes o variables tipus String amb els valors ASCII4 dels caràcters.Això és especialment útil quan volem introduir caràcters no imprimibles, com ara el salt de línia(Chr(13)), o unes cometes dobles dins de la cadena encabida entre cometes dobles (Chr(34)). Ésindiferent utilitzar el & o el + per fer les concatenacions de cadenes. Per exemple:

“Això és un text entre cometes que conté “ & Chr(34) & “ cometes en el seu interior”“Això és un text que conté” + Chr(13) + “un salt de línia”

Una altra forma d'introduir cometes dobles dins una cadena de text encabida entre cometes doblesés escrivint les cometes dobles dos cops seguits. Per exemple:

“Això és un text entre cometes que conté “” cometes en el seu interior”

4 ASCII és una codificació de caràcters que associa un valor numèric equivalent per cada caràcter alfanumèric (http://ca.wikipedia.org/wiki/ASCII)

Pàg. no. 22

Page 25: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Operacions amb cadenes:(suposem que txt és una variable tipus String que conté una cadena alfanumèrica)

Left(txt, n) Retorna els primers n caracters de txt

Right(txt, n) Retorna els darrers n caracters de txt

Mid (txt, m, n) Retorna els primers n caracters de txt començant per la posició m.

Len(txt) Retorna la quantitat de caracters que té la cadena txt

Trim(txt) Elimina els caracters en blanc que hi hagi al principi i final detxt.

InStr(PosInicial, txt, txtCerca)

Cerca un text txtCerca dins una cadena txt, començant per PosInicial i retorna la posició inicial de txtCerca, començant per 1, o retorna 0 si no l'ha trobat.

Exemple d'operacions amb cadenes:Sub macro05

Dim txt As Stringtxt="Això és una cadena de text de prova"MsgBox "Els 7 primer caracters de txt són: """ + Left(txt,7) + """."MsgBox "Els 12 darrers caracters de txt són: """ + Right(txt,12) + """."MsgBox "Els 8 caracters a partir del 3r, de txt són: """ + Mid(txt, 3, 8) + """."MsgBox "La paraula cadena comença a la posició: """ + InStr(1, txt, "cadena") + """."MsgBox "La longitud de la frase txt és: """ + Len(txt) + """ caracters."

End Sub

8.- Estructures de programació.L'estructura més bàsica és l'estructura seqüencial. A l'estructura seqüencial, les instruccionss'executen seqüencialment, una rere l'altra.

Instrucció 1Instrucció 2Instrucció 3Instrucció 4....Instrucció N

Però, en el llenguatge de programació, tenim altres estructures que permeten modificar l'estructuraseqüencial. Aquestes són les estructures condicionals i les iteratives, entre altres. A continuació lesveurem amb més detall.

En moltes d'aquestes estructures de programació s'han de fer tests lògics per determinar quinabifurcació elegir o bé, quan finalitzar un conjunt d'iteracions.Un test lògic sobre una condició consisteix en avaluar la condició per determinar si ens dona elvalor: True o False.En funció del resultat obtingut del test de la condició, és decideix fer una cosa, o no fer-la. O bé, esdecideix entre fer una cosa o fer-ne una altra.

Pàg. no. 23

Evolució seqüèncial

Page 26: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

8.1.- Estructures condicionals bàsiquesLes estructures condicionals bàsiques són: If ... Then i Select .... Case

Estructura condicional: If ... ThenAquesta estructura ens permet prendre decisions binàries (si o no). Per això es testeja una condiciói, si es certa fem una cosa, sinó en fem una altra. Dins una estructura If pot haver altres estructuresIf, de tal manera que podem elegir múltiples opcions entre les diferents combinacions de If.

Sempre cal interpretar-la en clau condicional interrogant a la condició, el seu pseudocodi és:

Si condició es certa? Fes Accions Cert; Sinó Fes Accions Fals; Fi SiLa sintaxi completa de la estructura condicional If és la següent:Sintaxi:

If condició Then 'Codi si condició és cert Instruccions 1 ......[ ElseIf condició2 Then ] 'Codi si condició2 és cert Instruccions 2 ......[ Else ] 'Codi si totes les condicions anteriors són falses Instruccions 3 ......End If

Pseudocodi: Si condició és certa fes Instruccions 1, sinó, si condició 2 és certa fes Instruccions 2, sinó fes Instruccions 3.

Algorisme:

Cal observar que tots els elements de la sintaxis que estan entre claudàtors [ ] són opcionals isolament els utilitzem si ens fan falta. En el diagrama, les parts opcionals estan indicades en colorgroc.

Pàg. no. 24

Condició?

Condició2?

Instruccions 3 Instruccions 2 Instruccions 1

Cert

Fals

Cert

Fals

Page 27: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Tenint en compte les parts opcionals de la sintaxis completa de If, podem obtenir altrescombinacions més simplificades de ús molt habitual:

Sintaxi:If condició Then 'Codi si condició és cert Instruccions 1 ......End If

Pseudocodi: Si condició és certa, fes Instruccions 1.

Algorisme:

Sintaxi:If condició Then 'Codi si condició és cert Instruccions 1 ......Else 'Codi si condició és fals Instruccions 2 ......End If

Pseudocodi: Si condició és certa, fes Instruccions 1, sinó, fes Instruccions 2.

Algorisme:

Exemples If ... Then:Sub macro06 'Exemple de If, solament tenim en compte la condició certa

Dim valor As Integervalor=InputBox("Escriu un número enter més petit que 10")If (valor < 10) Then

MsgBox "Ok, el número és: " & valorEnd If

End Sub

Sub macro07 'Exemple de If, tenim en compte la condició certa i el seu contrari

Dim valor As Integervalor=InputBox("Escriu un número enter més petit que 10")If (valor < 10) Then

MsgBox "Ok, el número és: " & valorElse

MsgBox "Ep! No has escrit un número menor 10"End If

End Sub

Pàg. no. 25

Condició?

Instruccions 1

Cert

Fals

Condició?

Instruccions 2

Instruccions 1

Cert

Fals

Page 28: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Sub macro08 'Exemple de If, tenim en compte múltiples condicions

Dim valor As Integer

valor=InputBox("Escriu un número enter")If (valor < 10) Then

MsgBox "El número és menor que 10"ElseIf (valor >=10 And valor<100) Then

MsgBox "El número és troba entre 10 i 99"Else

MsgBox "El número introduït, és més gran o igual que 100"End If

End Sub

Estructura condicional: Select ... Case

Sintaxi:

Select Case valor Case Expresió1 Instruccions 1 [Case Expresió2 Instruccions 2 ] ...... [Case ExpresióN Instruccions N ] [Case Else Instruccions per defecte ] End Select

Pseudocodi: Pel contingut de valor, en cas de valer Expresió 1 fes Instruccions 1, en cas de valer Expresió 2 fes Instruccions 2, ... en cas de valer Expresió n fes Instruccions N, en qualsevol altre cas, fes Instruccions per defecte.

Algorisme:

Els elements entre claudàtors [ ] són opcionals. Aquesta part opcional esta representada en eldiagrama amb el color groc.

Exemple Select ... CaseSub macro09

Dim nota As Integer

'Posem la nota com a valor numèric enter, si també'hi posem decimals, s'ignoraran per que nota es tipus Integer'Si posem un valor alfanumèric, el considerarà com a 0nota=InputBox("Indica el valor de la nota numèrica")Select Case nota

Case 0,1 MsgBox "Això és un Molt Deficient"

Pàg. no. 26

Valor=Expresió1

Valor=Expresió2

Valor=ExpresióN

Instruccions 1

Instruccions 2

Instruccions N

Instruccions perdefecte

Cert

Cert

Cert

Fals

Fals

Fals

Page 29: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Case 2 To 4MsgBox "Això és un Insuficient"

Case 5MsgBox "Això és un Suficient"

Case 6MsgBox "Això és un Bé"

Case 7,8MsgBox "Això és un Notable"

Case 9,10 MsgBox "Això és un Excel·lent"

Case ElseMsgBox "Això no és una nota vàlida"

End SelectEnd Sub

8.2.- Estructures iteratives bàsiquesLes estructures iteratives també s'anomenen Bucles. En aquest apartat analitzem les estructuresiteratives: For .... Next i Do .... Loop.Els bucles o iteracions repeteixen contínuament un mateix conjunt d'instruccions durant unaquantitat finita d'iteracions.

La determinació del nombre d'iteracions a efectuar en el bucle pot ser conegut o desconegut abansd'iniciar-se. L'estructura For...Next correspon al primer cas i determina el nombre d'iteracionssegons el valor d'una variable comptadora, en canvi, l'estructura Do...Loop correspon al segon cas idetermina el nombre d'iteracions mentre aquestes es van produint en funció del valor lògic d'unadeterminada condició.

S'entén per variable comptadora aquella variable numèrica que en el funcionament del programava incrementant o decrementant el seu propi valor en funció del nombre d'iteracions que esprodueix. Per exemple:

Dim c As Integerc=c+1

Cada cop que s'executa el codi c=c+1, el contingut de la variable c s'incrementa una unitat. Tambépodríem fer que la variable decrementi el seu valor o bé, en fes increments/decrements diferents dela unitat. Per exemple:

c=c-1 'Decrementa d'un en un.c=c+2 'Incrementa de dos en dosc=c-10 'Decrementa de 10 en 10etc.

Pàg. no. 27

Page 30: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Estructura iterativa: For...NextAquesta estructura repeteix un nombre de vegades, conegut prèviament, el conjunt d'instruccions corresponent.

Sintaxis:

For c=inici To fi [Step pas] instruccions [Exit For] instruccionsNext [c]

Pseudocodi: Per c igual a inici, fins a fi, a cada iteració repeteix les instruccions i incrementa c amb el valor de pas.

Algorisme:

c és una variable comptadora que s'inicia al valor de inici i s'incrementa, a cada iteració, segons elvalor indicat a pas. A cada iteració s'executen les instruccions internes de l'estructura For...Next i esmodifica el valor de la variable comptadora segons sigui el valor de pas. Les iteracions es farancontinuadament mentre la variable comptadora c no hagi superat el valor indicat per fi.

L'execució de la part opcional “Exit For” provoca la finalització de les iteracions del bucle abansd'arribar al final del comptatge de la variable comptadora.

Exemple For...NextSub macro10

Dim i As Integer

MsgBox "Primer bucle For." & Chr(13) & " Comptant de 0 a 20"For i=0 To 20

MsgBox "Iteració no. " & iNext i

MsgBox "Segon bucle For." & Chr(13) & " Descomptant de 2 en 2"For i=15 To -5 Step -2 MsgBox iNext

End Sub

Estructura iterativa: Do ... LoopRepeteix un conjunt d'instruccions mentre, o, fins que, una determinada condició sigui certa.

En aquesta estructura iterativa no se sap prèviament quantes iteracions es faran. Per tant, és moltimportant tenir en compte que en el bloc d'expressions a repetir és necessari que es modifiqui lacondició per garantir que en algun moment s'aturaran les iteracions. De cas contrari podem entrar enun bucle infinit que provocaria el mal funcionament del programa.

Pàg. no. 28

c>fi? instruccionsc=c+pas

c=inici

no

si

Page 31: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Veiem que la sintaxis té dos formes possibles: la primera forma avalua la condició abans d'iniciarles iteracions, per tant, cap la possibilitat que, segons la condició, aquestes instruccions no s'arribina executar mai, en canvi, en la segona forma, es veu com la condició s'avalua al final, per tant, esgaranteix que el conjunt d'instruccions s'executin, com a mínim, una vegada.

També observem que en la sintaxis, la condició està precedida per: {While | Until} en aquest cas,això vol dir que en la instrucció, si es posa aquesta part opcional pels [ ], cal triar entre dos opcions:o posar While, o posar Until. Amb While es llegeix: “mentre condició sigui certa” i amb Until esllegeix: “fins que la condició sigui certa”. Aquesta diferència tan simple fa que canviï totalment lafuncionalitat d'aquesta instrucció iterativa i es pugui adaptar a moltes situacions diferents.

Sintaxis:

1ª forma:Do [{While | Until} condició = True] instruccions [Exit Do] instruccionsLoop

Pseudocodi:(while) Mentre la condició sigui certa repeteix les instruccions.(until) Fins que la condició sigui certa, repeteix les instruccions.

2ª forma:Do instruccions [Exit Do] instruccionsLoop [{While | Until} condició = True]

Pseudocodi:(while) Repeteix les instruccions mentre la condiciósigui certa.(until) Repeteix les instruccions fins que la condiciósigui certa.

Algorisme:

1ª forma:

2ª forma:

Si entre les instruccions internes del bucle s'hi executa la instrucció opcional “Exit Do”, es provocala finalització i sortida del bucle independentment de quin sigui l'estat de la condició.

Pàg. no. 29

Instruccions

Condició?

si

no

(while)

Instruccions

Condició?

no

si

(until)

Instruccions

Condició?

si

no(while)

Instruccions

Condició?

no

si(until)

Page 32: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Exemple Do...LoopSub macro11

Dim i As Integer

MsgBox "Inici Bucle no. 1. Primera forma (while)"i=11Do While i>10

i=InputBox("Bucle 1. Introdueix un número. Solament s'aturarà si el número es menor de 10")

Loop

MsgBox "Fi Bucle no. 1" : MsgBox "Inici Bucle no. 2. Primera forma (until)"Do Until i>10

i=InputBox("Bucle 2. Introdueix un número. Solament s'aturarà si el número es major de 10")

Loop

MsgBox "Fi Bucle no. 2" : MsgBox "Inici Bucle no. 3. Segona forma (while)"

Doi=InputBox("Bucle 3. Introdueix un número. Solament s'aturarà si el número

es menor de 10")Loop While i>10

MsgBox "Fi Bucle no. 3" : MsgBox "Inici Bucle no. 4. Segona forma (until)"

Doi=InputBox("Bucle 4. Introdueix un número. Solament s'aturarà si el número

es major de 10")Loop Until i>10

MsgBox "Fi Bucle no. 4"End Sub

8.3.- Altres estructures.En aquest apartat s'indica l'existència de altres estructures del llenguatge Basic que no es descriuenen detall i la majoria no s'utilitzen en els exemples, però, es pot trobar la descripció detallada de laseva funcionalitat a la bibliografia més especialitzada (p.e.http://help.libreoffice.org/Basic/Controlling_Program_Execution/ca)

Instrucció Descripció

IIF Avalua una expressió i retorna la corresponent expressió segons sigui True o False.Sintaxis: IIf (Expresió, Expresió True, Expresió False)

While... Wend Executa les instruccions mentre la condició és certaSintaxis: While condició [Instruccions] Wend

GoSub ... Return Crida una subrutina

GoTo Continua l'execució d'un programa dins una Sub o Funció a la línia de procediment indicada per una etiqueta.

Pàg. no. 30

Page 33: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

On...GoSubOn...GoTo

Es bifurca cap a una de les diverses línies especificades al codi del programa, segons el valor d'una expressió numèrica.

Call Transfereix el control del programa a una subrutina, una funció o un procediment DLL.

Choose Torna el valor seleccionat d'una llista d'arguments.

Declare Declara i defineix una subrutina en un fitxer de DLL que voleu executar des del LibreOffice Basic.

End Finalitza un procediment o un bloc.

Exit Surt de Do...Loop, For...Next, d'una funció o d'una subrutina.

FreeLibrary Allibera les DLL que es van carregar amb una expressió Declare. Una DLL alliberada es recarrega automàticament si es crida una de les seves funcions.

Function Defineix una subrutina que es pot utilitzar com a expressió per determinar un tipus de retorn.

Rem Especifica que una línia de programa és un comentari.

Stop Atura l'execució del programa del Basic.

Sub Defineix una subrutina.

Switch Avalua una llista d'arguments, que consta d'una expressió seguida d'un valor. Lafunció Switch torna un valor que s'associa amb l'expressió que passa aquesta funció.

With...End With Estableix un objecte com l'objecte per defecte. A menys que es declari un altre nom d'objecte, totes les propietats i els mètodes fan referència a l'objecte per defecte fins que s'arriba a l'expressió End With.

9.- Subrutines i funcions.Les subrutines descriuen accions i les funcions retornen un valor. Totes dos estructures poden rebreuns paràmetres.

La paraula “macro” utilitzada en l'entorn de programació és una abreviació de la paraula querealment li correspon: “Macroinstrucció”. La macroinstrucció és un conjunt més o menys extens deinstruccions correctament seqüenciades amb la intenció de efectuar una acció conjunta. Amb aixòcal entendre que aquest conjunt de instruccions que formen la macroinstrucció s'han d'agruparreferenciades amb un sol nom. Aquesta agrupació pot ser, de forma general una subrutina o bé, unafunció.

La principal diferència entre subrutina i funció és que la funció és un conjunt d'instruccions quepoden rebre uns paràmetres, si s'escau, operen sobre ells i retornen un únic resultat final a l'elementinvocador de la funció. En canvi, la subrutina és també un conjunt d'instruccions, però, no tenen perquè rebre cap paràmetre ni tampoc retornar cap resultat a l'element invocador.

Pàg. no. 31

Page 34: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Tal com hem fet en exercicis anteriors, declarem les subrutines amb:

Sub nomsubrutina [ ( paràmetres ) ]variablesinstruccions[Exit Sub]instruccions

End Sub

En canvi, les funcions han de ser declarades i desenvolupades de la següent forma, indicant el tipusde valor retornat:

Function nomFuncio ( [paràmetres] ) As tipusRetornatvariablesinstruccions[Exit Function]instruccionsnomFuncio= valor que retorna la funció

End Function

Com es pot veure, la diferència entre Subrutina i Funció no és massa gran. Cal dir que altresllenguatges de programació com C i els seus derivats solament contemplen l'existència de lesFuncions.

Si des d'una Subrutina volem executar una altra subrutina ho podem fer escrivint el nom d'aquestasubrutina com si fos una instrucció més o bé, anomenar-la com a paràmetre de la instrucció Call:

Call nomSubrutina

Respecte a les Funcions és pot dir el mateix, només que l'element invocador ha de poder rebre itractar el resultat retornat per la funció.

Function areaCercle ( radi As Double ) As DoubleConst PI As Double = 3.14159265358979 areaCercle = Pi * radi ^ 2

End Function

Un cop creada una funció, aquesta es pot utilitzar des de dins una altra funció, o subrutina o comuna funció d'una formula dins una cel·la d'un full de càlcul.

Sub calculaAreaCercleDim r As Doubler = InputBox("Introdueix el valor del radi en mts.")MsgBox "L'àrea val: " & areaCercle(r) & " m2"

End Sub

Pàg. no. 32

Page 35: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

També és pot utilitzar una funció Basic des d'una cel·la del Full de Càlcul com si fos una funció mésdins una fórmula, per exemple: “=areaCercle(A4)” o “=areaRectangle(2; 4)”, amb la diferència quela separació de paràmetres aquí es farà amb “;” en lloc de “,”, com és habitual quan les mateixesfuncions són utilitzades des del mateix programa.

Altrament, des del programa Basic podem utilitzar les funcions específiques del full de càlculutilitzant el seu nom original en anglès. Com a exemple, veiem l'ús de les funcions SUMA,POTENCIA i REPT, els seus paràmetres els posem com a membres d'un Array:Sub macro12 Dim funcionsCalc As Object funcionsCalc = createUnoService( "com.sun.star.sheet.FunctionAccess" ) MsgBox funcionsCalc.callFunction( "SUM", Array(2, 4, 8.2) ) MsgBox funcionsCalc.callFunction( "POWER", Array(7, 2) ) MsgBox funcionsCalc.callFunction( "REPT", Array("Hola", 4))End Sub

10.- Interacció avançada: Quadres de diàleg.Els quadres de diàleg són finestres que incorporen elements de formulari i ofereixen a l'usuari d'unainterfície interactiva que millora la corresponent als Quadres de diàleg estàndard: MsgBox iInputBox.Per crear un diàleg ho farem clicant amb el botó de la dreta del ratolí, sobre les pestanyes inferiorsde l'IDE de programació de LibreOffice Basic, llavors seleccionem “Insereix / Diàleg del Basic”.

També ho podem crear des de “Eines / Macros / Organitza els diàlegs”

On amb les opcions “Nou” i/o “Edita” podem crear i modificar els diàlegs.

Pàg. no. 33

Page 36: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Un cop creat el diàleg se'ns mostra l'editor de diàlegs:

En aquest editor de diàlegs tenim una finestra buida en el centre, on posarem els controls de diàlegcorresponents (que es troben en la barra inferior) adaptant les seves propietats fins obtenir eldisseny de diàleg desitjat. A la barra inferior trobem tots els controls disponibles:

Posant el ratolí a sobre de cada element ens apareix el tooltip indicant el seu nom.

Per començar crearem un diàleg senzill utilitzant els objectes: “Botó” ,“Camp d'etiqueta” i

“Quadre de text” . Aquest diàleg mostrara un missatge de salutació o comiat segons sigui elbotó que s'hagi clicat. La finestra del diàleg ha de quedar de la forma següent:

Pàg. no. 34

Page 37: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

El botó ens permetrà veure com queda el disseny del quadre de diàleg mentre l'estemconstruint.

Clicant a sobre del botó: accedirem a les Propietats (i Esdeveniments) de cadascun dels cincobjectes que hem creat (2 botons, 1 quadre de text, 1 camp d'etiqueta i també, la mateixa finestra deldiàleg que els encabeix a tots). Per exemple, les propietats del control “Quadre de text” són:

També podem veure les propietats dels botons i del camp d'etiqueta si cliquem sobre ells. Per veureles propietats de la finestra també cal seleccionar-la, però, en aquest cas, la selecció es fa clicantamb el ratolí sobre la fina vora dels límits de la finestra, aquesta vora és difícil d'encertar i calprovar-ho diverses vegades fins aconseguir seleccionar-la.

Les propietats dels objectes poden ser moltes i diverses segons sigui el tipus d'objecte, però, en totcas, modificant les propietats, en fem la modificació de la seva presentació, posició, contingut,colors, imatges, continguts per defecte, etc. La primera propietat “Nom” és molt important ja quecorrespon al nom amb que ens referirem a aquest objecte des de les instruccions del programa. Demoment deixarem per a cada objecte el nom que li ha assignat per defecte, però, en projectes mésgrans, amb molts més controls, és adient anomenar cada objecte amb un nom més apropiat segonssigui la seva funció.

Proveu les diferents propietats de tots els controls i comproveu l'efecte que produeix sobre la formadel control.

De moment, modificarem les propietats de cadascun dels controls i també la finestra fins aconseguirla posició, mida, forma, color, etc. igual a com es veu en la imatge següent (evitem modificar elnom per defecte dels controls ja que és el nom que s'utilitzarà posteriorment en el codi delprograma):

Pàg. no. 35

Page 38: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

El resum de propietats i esdeveniments assignats als objectes està indicat en el quadre següent.Les propietats i esdeveniments no indicats, no son rellevants i es deixen al seu valor per defecte.

Objecte Paràm./Esdev. Valor Objecte Paràm./Esdev. Valor

Dialog Nom Dialog1 Label Nom Label1

Títol Diàleg no. 1 Etiqueta Primer diàleg d'exe...

Amplada 148 TextField Nom TextField1

Alçada 69 Text

Color de fons Blau 8 Color de fons Groc

CommandButton Nom CommandButton1 CommandButton Nom CommandButton2

Etiqueta Salutació Etiqueta Acomiat

Esdev.: Executa l'acció ClicHola Esdev.: Executa l'acció ClicAdeu

Fins aquí hem creat un diàleg de nom: “Dialog1” que conté uns controls que tenen com a nom:“Label1”, “TextField1”, “CommandButton1” i “CommandButton2”. Aquests noms els utilitzaremper accedir a les propietats dels controls des del mateix codi del programa.

La majoria de les propietats que hem vist i modificat prèviament poden ser accedides per llegir-neel seu contingut, o bé, modificar-lo, directament des del programa. D'aquesta forma, cada propietatd'un element del diàleg es pot referenciar segons una estructura del tipus:“NomDialeg.Model.NomControl.NomPropietat”. Per exemple, per llegir a una variable el contingutdel Camp de text, o per escriure un text a aquest mateix camp de text, ho farem de la forma següent,respectivament:

valor = dialog1.Model.TextField1.Textdialog1.Model.TextField1.Text = "Text de mostra"

Per provocar l'obertura de la finestra del diàleg ho farem utilitzant una macro de la següent forma:

Dim dialeg1 As ObjectSub obreDialeg1 DialogLibraries.LoadLibrary("Standard") dialeg1=CreateUnoDialog(DialogLibraries.Standard.getByName("Dialog1")) dialeg1.execute() 'inicia el diàleg. dialeg1.dispose() 'Un cop tancat el dialeg, allibera memòriaEnd Sub

Observem com estem declarant una variable de nom “dialeg1” com a tipus Object fora de laSubrutina, es a dir, és una variable global. Això és així per que volem que aquesta variable tambésigui accessible des de altres macros que faran accions sobre els elements del diàleg creat.

Pàg. no. 36

Page 39: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Dins la macro executem les ordres per obrir la finestra del diàleg. Per qualsevol finestra de diàlegque vulguem obrir, sempre utilitzarem aquest mateix codi, això si, modificant el nom del diàleg i elnom de la variable global que el representa, en cada cas.

Si executem la macro anterior podem veure com s'obre la finestra de diàleg que hem creat. Però, noes produeix cap acció ja que encara no estan programades. Per facilitar l'obertura de la finestrapodem crear un botó sobre el full de càlcul que serveixi per executar aquesta macro i, en definitiva,obrir la finestra del diàleg.

A continuació hem de crear les macros que definiran el comportament de la finestra de diàleg.Introduïm les dues macros següents:

Sub ClicHoladialeg1.Model.TextField1.Text="Hola, que tal"

End Sub

Sub ClicAdeudialeg1.Model.TextField1.Text="Adéu. Fins una altra"

End Sub

La programació d'aplicacions amb LibreOffice Basic està basada en la detecció de esdeveniments.Un esdeveniment és una acció que passa sobre un determinat control que es troba en el diàleg. Perque l'esdeveniment tingui efecte, cal que li assignem una macro que serà executada. La llistad'esdeveniments, per a cada objecte, la tenim disponible al quadre de Propietats de l'objecte, a lapestanya “Esdeveniments”.

A continuació, associarem les dues macros creades prèviament als esdeveniments Clic que s'efectuïsobre el botó. Per això, en cada botó, en mostrarem les seves Propietats i en la pestanya

“Esdeveniments”, clicarem a sobre el botó selector de macro de “Executa l'acció” i accedirem aseleccionar la macro “ClicHola” i “ClicAdeu” respectivament per a cada botó del diàleg.

Pàg. no. 37

Page 40: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Un cop feta l'associació de les macros als esdeveniments indicats, ja tindrem el diàleg totalmentfuncional, en clicar a sobre del botó “Salutació” ens mostrara el text de salutació i en clicar sobre elbotó “Acomiat” ens mostrarà el text d'acomiat.

Fins aquí hem creat un quadre de diàleg simple, amb l'objectiu de mostrar, bàsicament, com fer lacreació d'un diàleg que serveixi per interactuar amb l'usuari. Posteriorment, en els exemples es faràús dels quadres de diàlegs interactius amb l'usuari per crear aplicacions una mica més elaborades.

11.- Creació d'aplicacions. Programes d'exemple.La creació d'aplicacions informàtiques consisteix en un procés format perdiverses fases.

– La primera serà el disseny de l'aplicació. Habitualment s'utilitza elpseudocodi i/o algorismes o diagrames de flux. Mitjançant la mesclade codi, paraules textuals i algorismes, es pretén representar la ideaconceptual de la solució considerada òptima.

– La segona fase consisteix en la codificació de l'aplicació,implementant el disseny de la fase anterior segons la sintaxiscorresponent al llenguatge.

– La tercera fase consisteix en efectuar l'execució i depuració delprograma.

El procés de depuració consisteix en solucionar els errors de sintaxis i elserrors de disseny. Aquest procés pot ser extens en el cas de programes grans,ja que cal repetir-lo moltes vegades: modificant en cada ocasió, el disseny iel codi per evitar els errors de sintaxis i els errors de disseny.

L'algorisme o diagrama de flux lateral ens indica, a grans trets, aquestesfases de creació d'una aplicació informàtica. Hi veiem la primera fase“Disseny de l'aplicació”, la segona “Codificació de l'aplicació” i el procésde depuració resolen errors de sintaxis i disseny repetint múltiples vegadesla primera i segona fase fins aconseguir que el programa funcioni segons desitja el programador.

Segons quina sigui la complexitat del programa, pot passar que el procés de depuració trigui méstemps que el de disseny i codificació.Per ajudar a la depuració del programa, el IDE de LibreOffice Basic disposa d'unes eines forçaimportants que permeten fer el seguiment del programa i analitzar-ne el funcionament, són lessegüents:

Pàg. no. 38

Page 41: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

– L'execució pas a pas.Aquesta consisteix en executar el programa línia a línia, fent que s'aturi després de cada línia. Això permet observar el seu funcionament per si hi hagués algun error. Utilitzem els

controls: per fer l'avanç pas a pas. El primer salta la funció o subrutina enniuada, la segona entra en la subrutina o funció enniuada i la tercera surt de la funció.

– Els punts de ruptura.

Aquest són controlats per: i introdueixen, en la línia indicada pel cursor, un punt onel programa s'atura i permet continuar-ne l'execució pas a pas. Això és útil en programes grans on, fer-ne l'execució pas a pas des del principi seria molt pesat. Llavors, es posa el punt de ruptura en la línia, a partir de la qual es vol analitzar amb més detall, i l'execució s'aturarà en aquesta per facilitar l'anàlisi i continuar l'execució pas a pas.

– L'observació de la traça de les variables.La traça de les variables consisteix en “veure” el valor que tenen les variables seleccionades durant l'execució pas a pas del programa. Per això tenim un espai on podem posar-les i

veure el seu valor. Amb afegim una variable a l'espai d'observació de la traça de variables.

A continuació es descriu la realització d'un conjunt de programes d'exemple. En ells s'aplica bonapart dels continguts explicats prèviament en aquest dossier. En aquests programes d'exemple tambés'utilitza algunes instruccions que no s'han comentat fins ara. Aquestes instruccions són les següents(es pot trobar la descripció de moltes altres instruccions a https://help.libreoffice.org/Basic/Run-Time_Functions/ca):

Format().- Aquesta és una funció amb una sintaxis molt extensa, serveix per a donar format a lesdades que és desitja presentar en pantalla, la seva sintaxis reduïda és:

Format ( expressió, format)d’on expressió és qualsevol valor numèric o operació aritmètica, format és la plantilla on s’indica laforma en que s’han de representar les dades numèriques de expressió. Aquesta plantilla és aplicablea formats numèrics, de dates, hores, percentatges, etc. Per exemple, en una plantilla de representació

Pàg. no. 39

Subrutines i funcions enniuades

Punt de rupturaCursor pas a pas

Control execució pas a pas Control punts de

ruptura

Afegeix variable a la traça

Inici i aturada del programa

Observador Traça de variables

Page 42: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

de dades numèriques com la següent: “##0.00” indica que del valor numèric de expressió ésrepresentarà sempre (0) dos decimals, i fins a tres dígits sencers significatius (si hi són, #), també ésmostrarà el dígit 0 corresponent a les unitats en cas que aquest valgui 0. Al igual que aquestaplantilla d’exemple se’n pot fer moltes més combinacions per a d’altres formats dels indicatsanteriorment. La funció Format sempre retorna una cadena alfanumèrica.

Sqr().- És una funció numèrica que retorna l’arrel quadrada del número que se li passa com aargument. La seva sintaxis és Sqr(Número)

Rnd().- Aquesta funció retorna un valor aleatori entre 0 i 1 (el 0 és inclòs i el 1 és exclòs). Perreiniciar la llavor aleatòria s'utilitza Randomize.

Str().- Aquesta funció converteix un valor numèric en una cadena de caràcters. La seva sintaxis és:Str(número) , on numero és qualsevol expressió numèrica vàlida. És molt útil per a convertir valorsnumèrics a alfanumèrics i així poder-los concatenar amb d’altres cadenes alfanumèriques per aformar frases.

Beep.- Aquesta instrucció emet un so per l’altaveu de l’ordinador. No utilitza cap paràmetre

RGB(r,g,b).- Retorna el valor long corresponent a una combinació de components de color R,G,B,on r, g i b són valors entre 0 i 255.

Chr(n).- Retorna un caràcter alfanumèric segons sigui el valor de n obtingut de la taula ASCII5

Asc(char).- Retorna el valor numèric ASCII del primer caràcter indicat a char

Programes d'exemple.

11.1.- Programa que mostra una llista de nombres parells entre un número mínim i un màxim sol·licitats a l'usuari mitjançant quadres de diàleg estàndard.

Sub llistaParellsRem Mostra una llista de nombres parells Dim valorInicial As Integer, valorFinal As Integer, it As IntegervalorInicial=InputBox("Introdueix un número inicial")valorFinal=InputBox("Introdueix el número final")For it=valorInicial To valorFinal

If ( it Mod 2 = 0) Then MsgBox it

End IfNext it

End Sub

5 Taula ASCII. Taula de codificació de caràcters. Cada caràcter té assignat un valor numèric. (http://ca.wikipedia.org/wiki/ASCII)

Pàg. no. 40

Page 43: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

11.2.- Programa que mostra una llista de nombres múltiples de 3, en cel·les del full de càlcul, d'entreun número mínim i un número màxim sol·licitat a l'usuari mitjançant quadres de diàleg estàndard.

Sub llistaMultiples3Rem Crea una llista, a partir de la cel·la B1 (1,0) de valors múltiples de 3Dim valorInicial As Integer, valorFinal As Integer, it As IntegerDim fila As Integer, columna As Integer

valorInicial=InputBox("Introdueix el número inicial")valorFinal=InputBox("Introdueix el número final")fila=0For it=valorInicial To valorFinal

If ( it Mod 3 = 0) Then ThisComponent.Sheets(0).getCellByPosition(1, fila).setValue(it)fila=fila+1

End IfNext it

End Sub

11.3.- Funció que, donat un número enter, retorna cert o fals segons sigui un nombre primer, o no.Sabem que un nombre és primer si solament és divisible per ell mateix o per 1. Llavors, per cada número entre 2 i n/2 comprovem si es divisible, es a dir, si el residu de la divisió dona 0. Si això no passa, vol dir que no és primer.Function esPrimer(n As Integer) As Boolean

Rem Retorna True si n és primer o False si no ho és.Dim primer As Boolean, a As Integerprimer = TrueFor a=2 To (n/2)

If (n Mod a = 0) Thenprimer = FalseExit For

End IfNext aIf (primer) Then

esPrimer = TrueElse

esPrimer = FalseEnd If

End Function

11.4.- Programa que utilitza la funció “esPrimer” per determinar si un número és primer, per això, sol·licita el valor del número a l'usuari i en retorna la resposta mitjançant quadres de diàleg estàndard.

Sub diguemSiEsPrimerDim valor As Integer

valor=InputBox("Introdueix un numero")If(esPrimer(valor)) Then

MsgBox(valor & " es primer")Else

MsgBox(valor & " no es primer")End If

End Sub

Pàg. no. 41

Page 44: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

11.5.- Programa que retorna la llista de nombres primers entre dos límits, superior i inferior, sol·licitats a l'usuari mitjançant quadres de diàleg estàndard. S'utilitza la funció “esPrimer”. La llistaés mostra a la columna B d'un full de càlcul.Sub llistaPrimers

Rem Crea una llista, a partir de la cel·la B1 amb nombres primersDim valorInicial As Integer, valorFinal As Integer, it As IntegerDim fila As Integer, columna As Integer

valorInicial=InputBox("Introdueix un número inicial")valorFinal=InputBox("Introdueix el número final")fila=0For it=valorInicial To valorFinal

If (esPrimer(it)) Then ThisComponent.Sheets(0).getCellByPosition(1, fila).setValue(it)fila=fila+1

End IfNext it

End Sub

11.6.-Dissenya una interfície com la següent en un full de càlcul. Aplica-li els formats corresponents per que es vegi com a la imatge. En introduir un número a la cel·la combinada C4 i clicar sobre el botó, s'ha d'obtenir, a la cel·la combinada C9, el valor del factorial del número introduït.

La subrutina corresponent per calcular el factorial és la següent i cal associar-la al esdeveniment corresponent del botó.

Sub calculaFactorialRem Calcula el valor factorial de número indicat en la cel·la C4Rem Retorna el resultat en la cel·la C9Dim numero As Integer, i As Integer, aux As Double, full As Object

full=ThisComponent.Sheets.getByName("Full2")numero=full.getCellRangeByName("C4").getValue()aux=numeroFor i=numero-1 To 2 Step -1

aux=aux*iNext ifull.getCellRangeByName("C9").setValue(aux)

End Sub

Pàg. no. 42

Page 45: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

11.7.-En una finestra de diàleg com la següent, implementa un programa que sol·liciti una frase i una paraula a l'usuari, posteriorment, ha de indicar la quantitat de caràcters de la frase i la posició d'inicide la paraula dins la frase, en cas que s'hi trobi.

Objectes del quadre de diàleg, principals paràmetres i esdeveniment:

Objecte Paràm./Esdev. Valor Objecte Paràm./Esdev. Valor

Label Nom Label1 TextField Nom TextField2

Etiqueta Escriu una frase FixedLine Nom FixedLine1

Label

Nom Label2 Etiqueta Resultat:

Etiqueta Escriu una paraula TextField Nom TextField3

CommandButton Nom CommandButton1 Amplada 137

Etiqueta Calcula Alçada 36

Esdev.: Executa l'acció ClicCalcula Entrada de línies múltiples

Si

TextField Nom TextField1 Dialog Nom Dialog2

En aquest codi utilitzem una variable acumuladora de nom aux. Aquesta acumula, concatenant, el valor que ja té amb la nova cadena que s'hi afegeix.

Dim dialeg2 As Object

Sub obreDialeg2 DialogLibraries.LoadLibrary("Standard") dialeg2=CreateUnoDialog(DialogLibraries.Standard.getByName("Dialog2")) dialeg2.execute() dialeg2.dispose()End Sub

Pàg. no. 43

Page 46: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Sub ClicCalculaDim frase As String, paraula As String, aux As String, pos As Integer

frase=dialeg2.Model.TextField1.Textparaula=dialeg2.Model.TextField2.Text

aux=""aux=aux & "La longitud de la frase és: " & Len(frase) & " caracters."aux=aux & Chr(13)pos = inStr(1, frase, paraula)If pos<>0 Then

aux=aux & "La paraula: " & paraula & ", comença a la posició: " & pos & "."Else

aux=aux & "La paraula: " & paraula & " no s'ha trobat."End Ifdialeg2.Model.TextField3.Text=aux

End Sub

11.8.- Programa que calcula la lletra d'un DNISub lletraDNI

Rem Calcula la lletra del DNIDim lletres As String, valor As Long, residu As Integer

lletres="TRWAGMYFPDXBNJZSQVHLCKE"Do

valor=InputBox("Escriu els números del DNI o 0 per acabar.")If valor=0 Then MsgBox "Adéu!"

Exit SubEnd IfIf Len(cStr(valor))<>8 Then

MsgBox "Tens que posar 8 dígits"Else

residu = valor Mod 23MsgBox "La lletra és: " & Mid(lletres, residu+1, 1)

End IfLoop

End Sub

11.9.-Màxim comú divisor de dos números. Per resoldre això ho farem creant una funció que implementa l'algorisme d'Euclides i a partir de dos números introduïts com a paràmetres, retorna el Mcd d'aquests. Per fer la interacció crearem una subrutina addicional que sol·licitarà el números, invocarà la funció mcd i retornara el resultat.

Function mcd(a As Integer, b As Integer) As IntegerRem Retorna el màxim comú divisor (mcd) de dos números segons l'Algorisme

d'EuclidesDim residu As Integer, aux As IntegerIf a<b Then

aux=aa=bb=aux

End If

Pàg. no. 44

Page 47: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

If a Mod b = 0 Thenresidu=b

End IfDo While a Mod b <> 0

residu=a Mod ba=bb=residu

Loopmcd=residu

End Function

Sub calculaMcdDim n1 As Integer, n2 As Integern1=InputBox("Escriu el primer numero")n2=InputBox("Escriu el segon numero")MsgBox "El MCD de " + n1 + " i " + n2 + " és: " + Chr(13) + Chr(13) + mcd(n1,n2) + "."

End Sub

11.10.-Colors aleatoris és un programa que, inicialment, genera tres colors representats en els labels superiors. Posteriorment, per a cada color, també genera aleatòriament els colors en els labels inferiors repetidament fins que siguin iguals als superiors, moment en que s'atura.

Objectes del quadre de diàleg, principals paràmetres i esdeveniments:Objecte Paràm./Esdev. Valor Objecte Paràm./Esdev. Valor

Dialog Nom Dialog3 Label Nom Label1

Títol Colors aleatoris Etiqueta Colors aleatoris

Label Nom Label2 Label Nom Label3

Etiqueta Label2 Etiqueta Label3

Label Nom Label4 Label Nom Label5

Etiqueta Label4 Etiqueta Label5

Label Nom Label6 Label Nom Label7

Etiqueta Label6 Etiqueta Label7

CommandButton Nom CommandButton1

Etiqueta Inici

Esdv.: Executa l'acció colorsAleatoris

Pàg. no. 45

Page 48: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Dim dialeg3 As Object

Sub obreDialeg3 DialogLibraries.LoadLibrary("Standard") dialeg3=CreateUnoDialog(DialogLibraries.Standard.getByName("Dialog3")) dialeg3.execute() dialeg3.dispose()End Sub

Function aleatori(x As Integer, y As Integer) As IntegerRem retorna un numero aleatori entre x i y (ambdós inclosos)Randomizealeatori=Int((y+1-x)*Rnd+x)

End Function

Sub colorsAleatorisDim i As Integer, c1 As String, c2 As String, c3 As StringDim rr As Integer, gg As Integer, bb As IntegerDim rr2 As Integer, gg2 As Integer, bb2 As Integer

dialeg3.Model.Label5.Label="Label5"dialeg3.Model.Label6.Label="Label6"dialeg3.Model.Label7.Label="Label7"

rr=aleatori(0,255) : gg=aleatori(0,255) : bb=aleatori(0,255)dialeg3.Model.Label2.backgroundColor=RGB(rr,gg,bb)c1=rr & gg & bbrr=aleatori(0,255) : gg=aleatori(0,255) : bb=aleatori(0,255)dialeg3.Model.Label3.backgroundColor=RGB(rr,gg,bb)c2=rr & gg & bbrr=aleatori(0,255) : gg=aleatori(0,255) : bb=aleatori(0,255)dialeg3.Model.Label4.backgroundColor=RGB(rr,gg,bb)c3=rr & gg & bb

i=0do

rr2=aleatori(0,255) : gg2=aleatori(0,255) : bb2=aleatori(0,255)If(dialeg3.Model.Label5.Label="Label5") Then

dialeg3.Model.Label5.backgroundColor=RGB(rr2,gg2,bb2)If(c1 = rr2 & gg2 & bb2) Then

dialeg3.Model.Label5.Label=iEnd If

End Ifif(dialeg3.Model.Label6.Label="Label6") Then

dialeg3.Model.Label6.backgroundColor=RGB(rr2,gg2,bb2)if(c2 = rr2 & gg2 & bb2) Then

dialeg3.Model.Label6.Label=iEnd If

End Ifif(dialeg3.Model.Label7.Label="Label7") Thendialeg3.Model.Label7.backgroundColor=RGB(rr2,gg2,bb2)if(c3 = rr2 & gg2 & bb2) Then

dialeg3.Model.Label7.Label=iEnd If

End Ifi=i+1

Loop Until i>6000End Sub

Pàg. no. 46

Page 49: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

11.11.- Programa per endevinar el número amagat entre 1 i 10 durant 5 intents.Sub jocNumeroAmagat

Dim i As Integer, naleat As Integer, n As Integernaleat=aleatori(1,10)

MsgBox ("Intenta encertar el número amagat entre 1 i 10. Tens 5 intents")For i=1 To 5

n=InputBox("Introdueix un número entre 1 i 10. Intent no. " & i)If(n=naleat) Then Beep MsgBox("Enhorabona. Ho has encertat en l'intent no. " & i & ". El numero

amagat és: " & naleat) Exit SubElse If i<5 Then

MsgBox("No és el " & n & ". Torna-ho a provar.") End IfEnd If

Next iMsgBox("S'han acabat els intents i no ho has encertat. El número amagat era el " &

naleat)End Sub

11.12.- Emplena una superfície quadrada de 5x5 cel·les d'un full de càlcul i escriu una lletra minúscula aleatòria en cadascuna d'elles. Posteriorment, en una segona fase, reemplena la mateixa superfície de cel·les, on cada cel·la ha de contenir la lletra minúscula posada prèviament i la seva corresponent en majúscula.

Sub emplenaLletresRem En la taula ASCII, a...z correspon als números: 97...122 iRem els A...Z correspon als números: 65...90. Determinen la Rem majúscula restant-li 32 a la minúscula.Rem utilitza la funció aleatori() per generar nos. aleatoris.

Dim i As Integer, j As Integer, aux As String'Comença a la cel·la A17'Utilitzem un doble iterador enniuatFor i=16 To 20 'Itera files

For j=0 To 4 ' Itera columnesThisComponent.Sheets(0).getCellByPosition(j,

i).setString(Chr(aleatori(97,122)))Next j

Next iMsgBox("Ja està emplenat amb lletres minúscules. Clica per afegir les

majúscules.")For i=16 To 20

For j=0 To 4aux=ThisComponent.Sheets(0).getCellByPosition(j, i).getString()ThisComponent.Sheets(0).getCellByPosition(j, i).setString(aux & "-" &

Chr(Asc(aux)-32))Next j

Next iEnd Sub

Pàg. no. 47

Page 50: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

11.13.- Càlcul del mínim comú múltiple. Per això es crea una funció que utilitza a la funció mcd i una subrutina que implementa la interacció amb l'usuari.Function mcm(a As Integer, b As Integer) As Integer

Rem Calcula el mínim comu múltiple (mcm) de dos numeros a i b passats com a paràmetres

Rem es basa en la relació: mcm(a,b) = a*b/mcd(a,b)mcm=a*b/mcd(a,b)

End Function

Sub calculaMcmDim n1 As Integer, n2 As Integern1=InputBox("Escriu el primer numero")n2=InputBox("Escriu el segon numero")MsgBox "El mcm de " + n1 + " i " + n2 + " és: " + Chr(13) + Chr(13) + mcm(n1,n2) + "."

End Sub

11.14.- Programa que resol equacions de 2n grau.

Objectes del quadre de diàleg, principals paràmetres i esdeveniments:

Objecte Paràm./Esdev. Valor Objecte Paràm./Esdev. Valor

Dialog Nom Dialog4 Label Nom Label2

Label Nom Label1 Etiqueta a·x^2 + b·x + c

Etiqueta Resolució d'equaci... Label Nom Label3

Color de fons Diagrama3 Etiqueta a:

Vora Pla Label Nom Label4

TextField Nom TextField1 Etiqueta b:

Text Label Nom Label5

TextField Nom TextField2 Etiqueta c:

Text FixedLine Nom FixedLine1

TextField Nom TextField3 Etiqueta

Text TextField Nom TextField4

CommandButton Nom CommandButton1 Text

Etiqueta Calcula Ample 144

Esdv.: Executa l'acció resolEq2nGrau Alt 50

Color de fons Blau9

Entrada de línies múltiples

Si

Pàg. no. 48

Page 51: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Dim dialeg4 As Object

Sub obreDialeg4 DialogLibraries.LoadLibrary("Standard") dialeg4=CreateUnoDialog(DialogLibraries.Standard.getByName("Dialog4")) dialeg4.execute() dialeg4.dispose()End Sub

Sub resolEq2nGrauDim a As Double, b As Double, c As DoubleDim result As String

a=Val(dialeg4.Model.TextField1.Text)b=Val(dialeg4.Model.TextField2.Text)c=Val(dialeg4.Model.TextField3.Text)result ="Equació: " & a & "·x² + " & b & "·x + " & c & " = 0" & Chr(13)If(a=0 And b=0) Then result=result & "Error: a i b no poden ser zero simultàniament."Else If (a=0) Then result=result & "Equació de 1r grau. Una solució: " & Format((-c/b),

"##,##0.###") Else If ((b^2 - 4*a*c) >= 0 ) Then

result=result & "Equació amb solucions reals" & Chr(13) & Chr(13)result=result & "x1 = " & Format((-b + Sqr(b^2 - 4*a*c))/(2*a), "##,##0.###") &

Chr(13)result=result & "x2 = " & Format((-b - Sqr(b^2 - 4*a*c))/(2*a), "##,##0.###")

Elseresult=result & "Equació amb solucions complexes" & Chr(13) & Chr(13)result=result & "x1 = " & Format((-b/(2*a)), "##,##0.###") & " + "result=result & Format(((Sqr(-(b^2 - 4*a*c)))/(2*a)), "##,##0.###") & "j" &

Chr(13)result=result & "x2 = " & Format((-b/(2*a)), "##,##0.###") & " - "result=result & Format(((Sqr(-(b^2 - 4*a*c)))/(2*a)), "##,##0.###") & "j"

End If End IfEnd Ifdialeg4.Model.TextField4.Text = result

End Sub

11.15.-La sèrie de Fibonacci és una sèrie on els dos primers números valen 1, tots els següents són la suma dels dos anteriors, per exemple:

1, 1, 2, 3, 5, 8, 13, 21, .....

El següent programa genera els 25 primers termes de la sèrie de Fibonacci i els mostra en ordre ascendent i descendent. Per això, en la creació ascendent, es desa els termes en un array per poder-los mostrar posteriorment de forma ascendent.

Pàg. no. 49

Page 52: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Sub fibonacciDim fibc(25) As LongDim i As Integer, acum As String

acum="Sèrie de Fibonnacci ascendent:" & Chr(13)fibc(0)=1acum=acum & fibc(0) & " "fibc(1)=1acum=acum & fibc(1) & " "For i=2 To 25

fibc(i)=fibc(i-1)+fibc(i-2)acum=acum & fibc(i) & " "

Next iacum=acum & Chr(13) & Chr(13) & "Sèrie de Fibonnacci descendent:" & Chr(13)For i=25 To 0 Step -1

acum=acum & fibc(i) & " "Next iMsgBox acum

End Sub

11.16.- Programa convertidor de temperatures Celsius – Farenheit – Kelvin.

Objectes del quadre de diàleg, principals paràmetres i esdeveniments:Objecte Paràm./Esdev. Valor Objecte Paràm./Esdev. Valor

Dialog Nom Dialog5 Label Nom Label5

Títol Conversor de temp Etiqueta ºF

Label Nom Label1 Label Nom Label6

Etiqueta Celsius: Etiqueta ºK

Label Nom Label2 Label Nom Label7

Etiqueta Farenheit: Etiqueta 100ºC

Label Nom Label3 Label Nom Label8

Etiqueta Kelvin: Etiqueta -100ºC

Label Nom Label4 TextField Nom TextField1

Etiqueta ºC Text

Esdv. Executa l'acció canviCels

Pàg. no. 50

Page 53: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

TextField Nom TextField2 TextField Nom TextField3

Text Text

Esdv. Executa l'acció canviFarh Esdv. Executa l'acció canviKelv

Scrollbar Nom Scrollbar1

Valor de desplaçament 0

Valor mínim de desplç. -100

Valor màxim de desplç. 100

Esdv. En ajustar canviBarra

En aquesta aplicació obtindrem el valor corresponent a la temperatura convertida a Celsius, Farenheit i Kelvin simultàniament sempre que posem el valor numèric corresponent en qualsevol dels tres formats indicats.

Amb la barra de desplaçament, també podrem variar el contingut de la temperatura en Celsius.

Ajustarem els esdeveniments “Executa l'acció” dels controls “TextField1”, “TextField2” i “TextField3” a les subrutines “canviCels”, “canviFarh” i “canviKelv” respectivament.

Per a la barra de desplaçament, Scrollbar1, ajustarem les seves propietats “Valor de desplaçament: 0”, “Valor mínim de desplaçament: -100”, “Valor màxim de desplaçament: 100” i associarem l'esdeveniment “En ajustar” amb la subrutina “canviBarra”.

Dim dialeg5 As Object

Sub obreDialeg5 DialogLibraries.LoadLibrary("Standard") dialeg5=CreateUnoDialog(DialogLibraries.Standard.getByName("Dialog5")) dialeg5.execute() dialeg5.dispose()End Sub

Sub canviCelsDim cels As Double, kelv As Double, farh As Double

cels=Val(dialeg5.Model.TextField1.Text)kelv=cels+273.16dialeg5.Model.TextField3.Text=Format(kelv, "##,##0.###")farh=32+9*cels/5dialeg5.Model.TextField2.Text=Format(farh, "##,##0.###")

End Sub

Sub canviKelvDim cels As Double, kelv As Double, farh As Double

kelv=Val(dialeg5.Model.TextField3.Text)cels=kelv-273.16dialeg5.Model.TextField1.Text=Format(cels, "##,##0.###")farh=32+9*cels/5dialeg5.Model.TextField2.Text=Format(farh, "##,##0.###")

End Sub

Pàg. no. 51

Page 54: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

Sub canviFarhDim cels As Double, kelv As Double, farh As Double

farh=Val(dialeg5.Model.TextField2.Text)cels=5*(farh-32)/9dialeg5.Model.TextField1.Text=Format(cels, "##,##0.###")kelv=cels+273.16dialeg5.Model.TextField3.Text=Format(kelv, "##,##0.###")

End Sub

Sub canviBarradialeg5.Model.TextField1.Text=dialeg5.Model.ScrollBar1.ScrollValueCall canviCels

End Sub

12.- Exercicis.1.- Crea un programa que escrigui números, entre dos marges sol·licitats a l'usuari, que siguin múltiples de 5.

2.- Crea un programa que empleni una àrea de 10x10 cel·les d'un full de càlcul amb números aleatoris entre dos marges, mínim i màxim, que s'han de llegir d'unes altres cel·les del mateix full. Després empleni una nova àrea 10x10 cel·les del mateix full, amb el valor del contingut de la mateixa cel·la de la primera àrea elevat al quadrat.

3.- Crea un programa que sol·liciti una frase i després mostri els 5 primers i els 5 últims caràcters dela frase.

4.- Crea un programa que, donada la base i l'alçada d'un triangle, en calculi l'àrea.

5.- Crea un programa que, donat el radi d'un cercle, calculi l'àrea i el perímetre.

Pàg. no. 52

Page 55: Introducció a la Programació d'Aplicacions amb LibreOffice ...institutgiligaya.cat/deptecno/ProgramacioLibreOfficeBasic.pdf · Introducció a la Programació d'Aplicacions amb LibreOffice

Introducció a la Programació d'Aplicacions amb LibreOffice Basic Artur Guillamet

6.- Crea un programa que, donades el numerador i el denominador d'una fracció, en retorni la mateixa fracció, però, simplificada al màxim. Cal fer-ho amb: a/b = a/mcd(a,b) / b/mcd(a,b).

7.- Crea un programa que faci sumes de dos fraccions i en retorni la fracció resultant simplificada. Primer cal fer la suma amb aquest procediment:

(a/b + c/d) = (a*(mcm(b,d)/b) + c*(mcm(b,d)/b)) / mcm(b,d)després cal simplificar el resultat, igual com s'ha fet en l'exercici anterior.

8.- Crea un programa que, donades dos fraccions, en retorni la suma, la resta, la multiplicació i la divisió simplificades.

9.- Crea un programa que generi la taula de multiplicar indicada per l'usuari.

10.- Crea un programa que sol·liciti a l'usuari un número de terme, menor que 25, de la sèrie de Fibonacci i, posteriorment, mostri el valor d'aquest terme a l'usuari.-------------------------------------------------------------------------

Pàg. no. 53