søndag den 13. november 2016

Dialog med brugeren

Når vi programmerer makroer i LibreOffice, vil vi fra tid til anden, gerne involvere brugeren. Resultatet af brugerens valg kan vi så anvende til at regne videre eller dirigere programmet hen i den rigtige retning.

Vi har flere forskellige metoder:

Print

Print-funktionen er den simpleste måde at kontakte brugeren på. Du sender en besked i form at en tekst, men får ikke noget resultat tilbage.


Print-funktionen printer enkeltlinjer som særskilte dialoger. Hver af følgende vil derfor resultere i to små dialoger:

Print "expression1" & chr(13) & "expression2"    'chr(13) svarer til "Enter" (Carriage return)
Print "expression1" & chr(10) & "expression2"    'chr(10) svarer til "Skift" + "Enter" (Line feed)


Print bruges ofte til at vise resultatet af en variabel:

Print date(now)

Print kan håndtere alle dataformater, så det er ligemeget om du printer en dato, en tekst eller et tal. Dog er det ikke muligt at kombinere variable med forskellige datatyper. Derfor skal du selv konvertere f.eks. en dato, før du kan kombinere den med en tekst.

Selv bruger jeg kun Print til debugging, hvor jeg indsætter en masse print-sætnigner i koden, som udskriver variabel-værdier.

Der er flere parametre for Print-sætnignen som jeg ikke kommer mere ind på. Du kan selv kigge i hjælpen for mere information.

MsgBox

MsgBox er mere egnet for egentlig bruger-dialog. Dialogen består i at du kan lytte til hvad brugeren svarer tilbage (hvilekt vlag brugeren gjorde).



Syntaks:

MsgBox (Text As String [,Type As Integer [,DialogTitle As String]])

Resultatet af brugerens valg kan du få fat i ved at tilknytte MsgBox til en variabel:

Result= MsgBox ("Tekst", type "Overskrift")

Teksten kan, til forskel fra Print, godt indeholde linjeskift, hvilket er praktisk, hvis du f.eks. skal vise en liste over værdier. Men det mest interessante er parameteren 'Type', som giver dig kontrol over, hvordan dialogen ser ud.

Ikoner og knapper som brugeren kan trykke på kontrolleres sådan:

0 : Vis kun knappen OK.
1 : Vis knapperne OK og Annuller.
2 : Vis knapperne Annuller, Prøv igen og Ignorer.
3 : Vis knapperne Ja, Nej og Annuller.
4 : Vis knapperne Ja og Nej.
5 : Vis knapperne Prøv igen og Annuller.
16 : Føj stop-ikonet til dialogen.
32 : Føj spørgsmåls-ikonet til dialogen.
48 : Føj udråbs-ikonet til dialogen.
64 : Føj informations-ikonet til dialogen.
128 : Første knap i dialogen som standardknap.
256 : Anden knap i dialogen som standardknap.
512 : Tredje knap i dialogen som standardknap.

Hvis du ønsker at kombinere valgmulighederne, skal du lægge værdierne sammen, f.eks. 3+64=67 svarer til "Vis knapperne Ja, Nej og Annuller" og "Føj informations-ikonet til dialogen".

Returværdier (returneres til dig i variablen):
1 : OK
2 : Annuller
3 : Afbryd
4 : Prøv igen
5 : Ignorer
6 : Ja
7 : Nej

Om du angiver parameteren Type som et tal eller et regnestykker er det samme:

Result= MsgBox ("Tekst", 67+512, "Overskrift")
Result= MsgBox ("Tekst", 579, "Overskrift")


Resultatet vil dog altiv være 6 (Ja), 7 (Nej) eller 2 (Annuller).

MsgBox returnerer altid resultater fra en afgrænset mængde af muligheder, og Select...Case er dermed en oplagt måde at håndtere resultatet på. Eksempel:

REM  *****  BASIC  *****

Sub Main
Resultat = MsgBox("Tryk på en tast", 67, "Tastetryk")

Select Case Resultat

Case 6
    Print "Du trykkede på Ja"
Case 7
    Print "Du trykkede på Nej"
Case 2
    Print "Du trykkede på Annuller"

end Select
End Sub


InputBox

Med InputBox kan du bede brugeren om at indtaste en tekst, som du så modtager retur. Syntaksen er:

InputBox (Msg As String[, Title As String[, Default As String[, x_pos As Integer, y_pos As Integer]]]])

Returværdien er altid en tekststreng, også selvom brugeren skriver et tal. Hvis du beder brugeren om at indtaste et tal, skal du selv konvertere tekststrengen til et tal.

Et eksempel:

    sText = InputBox ("Indtast en sætning:","Kære bruger","Jeg gætter på")
    Print sText




Læg mærke til at resultatet kan aflæses af variablen sText.

Endnu et eksempel:
   
Sub InputBoxTest
    Resultat = InputBox("Indtast et tal","Tal", 8)
    ResultatTal = Val(Resultat)
    Print Resultat + 12        '812
    Print ResultatTal + 12    '20
End Sub



Jeg bruger InputBox i eksemplet i artiklen "Regneark i Calc (Årskalender)", som du kan læse her: http://libreofficedk.blogspot.dk/2016/10/regneark-i-calc-arskalender.html

this_year = InputBox ("Indtast årstal mellem 1583 og 3000", "Vælg årstal", year(date))
If (1583 > val(this_year) OR val(this_year) > 3000) then
    MsgBox("Årstallet skal være mellem 1583 og 3000", 48, "Fejl")
Stop
End If


I eksemplet bruger jeg year(date) som standardværdi (indeværende år).

Dialog

Det er muligt at designe sine helt egne dialoger i LibreOffice. Det emne er lidt mere kompliceret, og det vil jeg behandle i en særskilt artikel senere.