Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Ajon aikana luotujen nappien Click-tapahtuma

vesimies [06.12.2008 21:47:34]

#

Miten saadaan ajon aikana luoduille Buttoneille tehtyä tapahtumankäsittelijä? Tässä esimerkissä laitetaan pari nappia FlowLayoutPanel-tyyppiseen kehyskontrolliin. Lisäys onnistuu hienosti, mutta tapahtumat?

Public Class TestiLomake

    Private Sub TestiLomake_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LisääNappi("Mikki")
        LisääNappi("Minni")
    End Sub

    Private Sub LisääNappi(ByVal otsikko As String)
        Dim lisättäväNappi As New Button
        With lisättäväNappi
            .Width = 60
            .Height = 28
            .Text = otsikko
            ' ja jotain muita tarpeellisia ominaisuuksia...
        End With
        FlowLayoutPanel1.Controls.Add(lisättäväNappi)
    End Sub

    Private Sub NapinKlikkaus(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              'Handles Minkä?.Click

        Dim painettuNappi As Button = CType(sender, Button)

        MsgBox("Klikkasit nappia " + painettuNappi.Text + ".")
    End Sub

End Class

Edit: Korjasin NapinKlikkaus-metodin argumentteja, kopsin ne aluksi Paint-tapahtumasta... (Oli: ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Tarviiko edes noita sender- ja e-argumentteja? Koetan tässä saada tolkkua AddHandler-jutusta mutten saa kiinni ideasta. Apua kaivataan.

vesimies [06.12.2008 23:41:21]

#

No voi vitsi, oliko se näin yksinkertaista... Aikani kun turasin niin löysinkin itse ratkaisun:

Private Sub LisääNappi(ByVal otsikko As String)
    Dim lisättäväNappi As New Button
    With lisättäväNappi
        .Width = 60
        .Height = 28
        .Text = otsikko
    End With
    FlowLayoutPanel1.Controls.Add(lisättäväNappi)
    ' Tässä samantien lisätään käsittelijä:
    AddHandler lisättäväNappi.Click, AddressOf NapinKlikkaus
End Sub

Private Sub NapinKlikkaus(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim painettuNappi As Button = CType(sender, Button)
    MsgBox("Klikkasit nappia " + painettuNappi.Text + ".")
End Sub

neau33 [06.12.2008 23:47:20]

#

Heippa vesimies!

tsekkaa tämä...myös nappulan koodi on mahdollista luoda lennossa tuomalla MSScriptControl (jos ei löydy koneelta niin löytyy netistä) COM-objektina projektiin ja käyttää hyväksi sen suomia mahdollisuuksia (jää muutama rivi vähemmän koodattavaa verrattuna delegaattien kanssa tuhraamiseen)...osviittaa käytöstä VBA-projektin ja VB-projektin näkökulmasta...

vesimies [08.12.2008 21:14:03]

#

Kiitos Nea. En vaan vielä ole ymmärtänyt miten MSScriptControl:n kanssa tarvitsisi vähemmän koodia, minusta vaikuttaa ihan päinvastoin olevan.

Entä onko tarpeellista käyttää RemoveHandler kontrollia poistettaessa? Jos ei käytä niin häviääkö käsittelijä siinä kätevästi samalla vai jääkö jonnekin kummittelemaan?

neau33 [08.12.2008 23:28:48]

#

Heippa taas vesimies!

Tohon ekaan: voit esim. kirjoitella sen suoritettavan koodin lennossa vaikka tekstiboxiin (scriptiä ei tarvitse välttämättä hakea tiedostosta)...
tokaan: jos et poista käsittelijää niin jäähän niitä kummittelemaan joka kerta, kun luot yhden instanssin lisää...

vesimies [09.12.2008 12:38:00]

#

OK, nyt näyttää kuitenkin siltä että on kevyempi ratkaisu käyttää yksi rivi Addhandleriin ja toinen RemoveHandelriin... Mutta sikäli hyvä että mainitsit tuosta MSScriptControl:sta, saatan hyvinkin tarvita jossain muualla.

Vastaus

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

Tietoa sivustosta