Voiko funktiolle määrittää useamman ulostulevan muuttujan, että saisi yhdellä funktiokutsulla haettua useamman tarvittavan arvon? Jos voi, miten funktio määritellään? Esimerkki olisi hyvä...
Saakos sub:n palauttamaan arvoja?
ei mun tietääkseni. Ja subi on functio joka ei palauta mitään. Jos haluat subin palauttamaan jotain ni teet vaan samanlaisen function.
Tässä on esimerkki, joka toimii ainakin VB6:ssa.
Private Type TIEDOT
eka As Integer
toka As Long
kolmas As String
End Type
'oman tietotyypin palauttaminen
Private Function MoniPalautus1() As TIEDOT
Dim palautus As TIEDOT
palautus.eka = 12
palautus.toka = 837634
palautus.kolmas = "testi"
MoniPalautus1 = palautus
End Function
'taulukon palauttaminen
Private Function MoniPalautus2() As Variant
Dim palautus(3) As Variant
palautus(0) = 4
palautus(1) = 63
palautus(2) = 18
palautus(3) = 55
'tai: palautus = Array(4, 63, 18, 55)
MoniPalautus2 = palautus
End Function
Sub Form_Load()
Dim tiedot1 As TIEDOT
Dim tiedot2() As Variant
tiedot1 = MoniPalautus1
tiedot2 = MoniPalautus2
MsgBox tiedot1.toka '837634
MsgBox tiedot2(1) ' 63
End SubHuomaa, että tietotyypin palauttavan funktion täytyy olla paikallinen (Private) ja taulukon palauttavassa funktiossa taulukon tyypin täytyy olla Variant.
Hyvä. Kiitos vinkeistä!
Jos function tai aliohjelman parametrit varustaa ByRef määreellä (oletus vb6) niin tällöin välitetään vain osoitin muuttujaan (pointteri), jolloin kaikki parametriin tehdyt muutokset heijastuvat myös kutsukohtaan, eli pieni esimerkki:
' Tässä aliohjemassa luodaan kaksi muuttujaa, jotka lähetetään
' aliohjelmalle, jonka parametrit on ByRef (by reference) määreellä.
' Aliohjelma (OmaViitaus) sijoittaa muuttujiin arvot ja ne heijastuvat
' kutsukohdan muuttujiin
Private Sub Kutsuja()
Dim strNimi As String
Dim iIka As Integer
' käydään "täyttämässä" muuttujat
OmaViittaus strNimi, iIka
' tulostetaan muuttujien arvot
Debug.Print strNimi & "," & iIka
End Sub
Private Sub OmaViittaus(ByRef strNimi As String, ByRef iIka As Integer)
strNimi = "Matti Meikäläinen"
iIka = 60
End SubTaulukot, oliot, tyypit ja komponentit (esim. ComboBox) menevät aina referenssinä.
Eli vastaus siihen voiko functiolle/sub määrätä useamman kuin yhden ulostulevan arvon niin vastaus on: kyllä.
Luettavuuden ja ylläpidettävyyden kannalta yllä oleva esimerkki ei ole hyvä. Parempi olisi tehdä OmaViittaus subista functio. Functio palauttaisi esim. Collection, joka sisältäisi pyydetyt arvot.
Aihe on jo aika vanha, joten et voi enää vastata siihen.