Hei,
miten voin välittää aliohjelman toiselle aliohjelmalle parametrina ?
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.
miten luokka tehdään ja miten aliohjelma laitetaan sinne ?
Voit käyttää CallByName-funktiota, jolloin kutsuttavan funktion nimi voidaan välittää merkkijonona.
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ä..?
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?
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
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
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.
Olet oikeassa, näyttää se toimivan kunhan proseduuri on julkinen.
Mutta siis privaattifunktiota ei voi tuolla käyttää.
Kiitos vastauksista. Sain sen toimimaan tuolla merrin kuvaamalla tavalla, mutten niin että pelkästään proseduurin julkisuus riittäisi.
No mitä muuta se sitten vaati?
Miten sitä funktiota CallByName voi kutsua ilman sitä objektia ?
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.
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ää.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.