Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB6]aliohjelma toisen aliohjelman parametrina ? (VBA)

Sivun loppuun

jaanas [15.05.2009 09:50:33]

#

Hei,
miten voin välittää aliohjelman toiselle aliohjelmalle parametrina ?

Grez [15.05.2009 10:26:11]

#

Laitat aliohjelman luokkaan, ja annat luokan parametrina.

Voit tietenkin myös antaa aliohjelman osoitteen (addressof) mutta sitä ei sitten saa kutsuttua samalla tyylillä kuin aliohjelmia yleensä, joten joudut kikkailemaan aika paljon.

jaanas [15.05.2009 10:53:46]

#

miten luokka tehdään ja miten aliohjelma laitetaan sinne ?

Merri [15.05.2009 11:49:02]

#

Voit käyttää CallByName-funktiota, jolloin kutsuttavan funktion nimi voidaan välittää merkkijonona.

neau33 [15.05.2009 11:58:55]

#

Heippa jaanas!

olisiko esim. tällaisesta viritelmästä...

'Class1 (Class Module)
Private xmsg As String

Property Let msg(ByVal str As String)
   xmsg = str
End Property

Property Get msg() As String
   msg = xmsg
End Property
'Form1
Dim cl As New Class1

Private Sub Form_Load()
   cl.msg = "testi"
End Sub

Private Sub Command1_Click()
   Test (cl.msg)
End Sub

Sub Test(ByVal str As String)
   MsgBox str
End Sub

...kenties jotakin hyötyä..?

Grez [15.05.2009 12:53:58]

#

Merri kirjoitti:

Voit käyttää CallByName-funktiota, jolloin kutsuttavan funktion nimi voidaan välittää merkkijonona.

No eikös tuosta silti pidä tehdä objekti, jotta voi kutsua?

neau33 [15.05.2009 13:42:24]

#

Heippa taas!

edellä esittämäni property-paskan voi hoidella myös yhdellä funktiolla...

'Class1 (Class Module)
Private xmsg As String

Function msg(Optional ByVal str As String) As String
   If str <> "" Then
      xmsg = str
   Else
      msg = xmsg
   End If
End Function
'Form1
Dim cl As New Class1

Private Sub Form_Load()
   cl.msg ("testi")
End Sub

Private Sub Command1_Click()
   MsgBox cl.msg
End Sub

neau33 [15.05.2009 15:40:58]

#

Heippa taas!

tässä vielä hieman lisäkiemuroita...

'Class1 (Class Module)
Private xmsg As String

Public Event ShowMsg()

Private Sub MsgCall()
   RaiseEvent ShowMsg()
End Sub

Function msg(Optional ByVal str As String) As String
   If str <> "" Then
      xmsg = str
      Call MsgCall()
   Else
      msg = xmsg
   End If
End Function
'Form1
Public WithEvents cl As Class1

Private Sub Form_Load()
   Set cl = New Class1
End Sub

Private Sub Command1_Click()
   cl.msg (Text1.Text)
End Sub

Private Sub cl_ShowMsg()
   MsgBox cl.msg
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Set cl = Nothing
End Sub

Merri [15.05.2009 16:28:02]

#

Grez: oma muistini sanoo, että proseduurin julkisuus riittäisi, mutta en voi juuri nyt testata kun olen vähän viikonloppulomailemassa eikä koneella ole VB6:tta.

Grez [15.05.2009 16:34:41]

#

Olet oikeassa, näyttää se toimivan kunhan proseduuri on julkinen.

Mutta siis privaattifunktiota ei voi tuolla käyttää.

jaanas [18.05.2009 14:56:53]

#

Kiitos vastauksista. Sain sen toimimaan tuolla merrin kuvaamalla tavalla, mutten niin että pelkästään proseduurin julkisuus riittäisi.

Grez [18.05.2009 21:02:41]

#

No mitä muuta se sitten vaati?

jaanas [19.05.2009 08:02:50]

#

Miten sitä funktiota CallByName voi kutsua ilman sitä objektia ?

Merri [19.05.2009 08:42:20]

#

En pääse tälläkään kertaa testaamaan, mutta semmoinen kutina olisi että ensimmäisen parametrin kohdalle syötetään Nothing. Tosin Googlesta urkkimalla näyttäisi ettei kovin usein moista harrasteta.

Grez [19.05.2009 08:55:04]

#

Miksi sitä pitäisi kutsua ilman objektia ja jos se onnistuisikin, niin pitäisikö sen valita objekti satunnaisotannalla?

Siis useinhan sille voi sanoa "Me" jos haluat samassa objektissa olevaa metodia kutsua.

Nothingin laittaminen aiheuttaa "Invalid procedure call or argument" virheen. En kyllä näe tosiaan mitään ongelmaa tuossa objektin vaatimisessa, paitsi jos koodi on moduulissa, jossa tapauksessa en keksi miten callbynamea voisi käyttää.

neau33 [19.05.2009 10:55:10]

#

Heippa taas!

vielä hieman lisää aivan tosi-järkeviä lisäkiemuroita...(VBA-versio)

'UserForm1
Dim cl As New Class1

Private Sub CommandButton1_Click()
   Static i As Integer
   i = i + 1:
   If i = 2 Then
     i = 0: cl.aliohjelma2 Me.TextBox1, "Move", 10, 10
   Else
     aliohjelma Me.TextBox1, "Move", 100, 100
   End If
End Sub
'Module1
Sub aliohjelma(obj As Object, cmd As String, param1, param2)
   CallByName obj, cmd, VbMethod, param1, param2
End Sub
'Class1
Sub aliohjelma2(obj As Object, cmd As String, param1, param2)
   CallByName obj, cmd, VbMethod, param1, param2
End Sub

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta