Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Luokan kutsuminen VB6

JoreSoft [20.11.2008 23:39:50]

#

Tuli eteen outo ongelma.

Kutsun pääohjelmasta luokkaa, joka puolestaan kutsuu activeX-kontrollia.
Kun kutsussa on parametrejä, niin jostain syystä luokka nollaa ne syötemuuttujat.

Onko se luokan tapa, vai onko koodissani jossain piilevä vika?

'PL
B = Pyr.Tarkista(CardIndex, pTable)' Pyr on luokan globaali kutsu-kahva 'Global Pyr As New C_Pyramid'
    If .Card(CardIndex).Value = 1 Then Soita "Jipii.wav"
...

'Pyr -luokka (class)
Public Function Tarkista(CardInd As Integer, FromPlace As enumPlaces) As Boolean
    PL.M1.Move_ToStack4 CardInd, L1.Suit + 1, 20, False 'Kutsutaan activeX
...
'ActiveX
Public Sub Move_ToStack4(ByVal CardIndex As Integer, ByVal StackIndex As Integer, ByVal Speed As Integer, Optional ByVal EmptyCard As Boolean = False)

Kun suoritus palautuu takaisin PL-formille, on esim CardIndex nollautunut...
eli rivi 'If .Card(CardIndex).Value = 1 Then Soita "Jipii.wav"' aiheuttaa jo virheen...

groovyb [21.11.2008 02:24:32]

#

millainen virhe tulee?

JoreSoft [21.11.2008 02:48:37]

#

Siis ton muuttujan (CardIndex) nollautuminen on se virhe =)
kun ei sitä koodissa nollata missään...

Grez [21.11.2008 09:49:33]

#

Näillä lähtötiedoilla ei kyllä saa mitään aikaiseksi. Voitko pistää koko projektin johonkin tai tehdä esimerkkiprojektin, jossa sama ongelma tulee esille.

Sitä paitsi, testiohjelmani kertoo että "CardIndex ei vaihtunut, JoreSoft valehtelee"

JoreSoft [21.11.2008 13:32:01]

#

Ohjelma, josta kerroin on korttipeli moottori, joka hoitaa kaiken pakoista, pinoista liikkumisesta jne jne... löysin sen virheenkin =)
Koodia on liikaa ja vielä keskeneräistä, kun taas aloitin koko homman uudestaan...
versio 3 tai 4 alkaa olla =)

Luulin että toi ByVal estää muuttujan muuttumisen kutsupäässä...

Julkaisen tään ilmaisena, jahka saan valmiiksi =) eihän VB6:lla tehtyä voi myydä...

tässä Kolme Tornia pasianssipelin koodi. aika lyhyt, kun moottori hoitaa suurimman osan...

Option Explicit


Sub Start()
Dim S$, I%, Koko As t_Size
    With PL.E1
        'Play if you dare!!! =)
        'PL.B1.BassPlayMusic "Päivänsäde ja menninkäinen.it", True
        'PL.E1.Visible = True 'Laitetaan näkyville
        Soita "Mix.wav"
        .Run True
        PL.G1.ShowIndex = False ' no Debug
        I = .LoadTable(PeliTiedosto(0, Game), , , , 20)
        If I = -1 Then Exit Sub
        Koko = PL.F1.GetPictureSizeTwip()
        PL.Width = Koko.W 'Asetetaan formin koko samaksi kuvan kanssa
        PL.Height = Koko.H
        .Width = Koko.W
        .Height = Koko.H
        .WaitUntilAllCardsStop 'Odotetaan, että kaikki kortit on saavuttaneet paikkansa

        PL.F1.Wait 200              'Näytetään kortteja oikeinpäin hetki
        For I = 1 To 18 'käännetään kolme ylintä riviä
            .Table_TurnCardOver I, False
        Next I
        .PrintAll
        .WaitUntilAllCardsStop

        Gameover = False      'Peli ei ole päättynyt
        AnnaKortti

        'PL.G1.ShowIndex = True   'Debug mode

    End With
End Sub

Sub Tarkista(C As Integer, Table As Integer)
Dim I%
    With PL.E1
        Soita "card.wav"
        I1 = .Card(C)
        If Not I1.Face Then: Exit Sub
        K1 = PL.S1.TableStack_Card()
        If Not I1.Face Then Ena: Exit Sub 'Ei lukittuja kortteja
        CMove = False
        If I1.Value - 1 = K1.Value Or I1.Value + 1 = K1.Value Then CMove = True
        If (I1.Value = 1 And K1.Value = 13) Or (I1.Value = 13 And K1.Value = 1) Then CMove = True
        If CMove Then
            I = PL.S1.TableStack_CardIndex()
            If I = -1 Then Exit Sub
            PL.M1.Move_ToStack I, 20
            PL.M1.Move_ToTableStack C, 20
            .WaitUntilAllCardsStop
            NäytäPiiloitettu
            'Ylin rivi
            If Table >= 1 And Table <= 3 Then Soita "Jipii.WAV"
        Else

            Soita "error.WAV"
        End If
    End With
End Sub

Private Sub NäytäPiiloitettu()
Dim I%, J%, K%
With PL.E1

    .Table_ShowHidedCard 19, 27, -10, True
    .Table_ShowHidedCard 10, 11, -7, True
    .Table_ShowHidedCard 13, 14, -8, True
    .Table_ShowHidedCard 16, 17, -9, True

'Ylin kerros
    If Not .Table_CardOn(4) And Not .Table_CardOn(5) And .Table_CardOn(1) Then .Table_TurnCardOver 1, True
    If Not .Table_CardOn(6) And Not .Table_CardOn(7) And .Table_CardOn(2) Then .Table_TurnCardOver 2, True
    If Not .Table_CardOn(8) And Not .Table_CardOn(9) And .Table_CardOn(3) Then .Table_TurnCardOver 3, True

End With

End Sub

Sub OnkoPeliOhi()
Dim I%, J%, K%
If Gameover Then Exit Sub
'Tarkistetaan menikö peli läpi
    NäytäPiiloitettu
With PL.E1

If Not .Table_CardOn(2) And Not .Table_CardOn(3) And Not .Table_CardOn(1) Then
    Soita "Jipii.wav"
    'DisableNapit
    PeliLäpi = True
    Soita "APPLAUSE.wav"
    .WaitUntilAllCardsStop
    MsgBox "Sait pelin läpi"
    PL.Lopputoimet
    Exit Sub
End If
'Tarkistetaan loppuiko peli kesken

    CMove = False
    If .Deck_Counter() > 0 Then Exit Sub
    For I = 27 To 1 Step -1
        J = .Table_Ind(I)
        If .Table_CardOn(I) Then
            J = .Card(J).Value
            K = PL.S1.TableStack_Card.Value
            If J - 1 = K Or J + 1 = K Then CMove = True
            If (J = 1 And K = 13) Or (J = 13 And K = 1) Then CMove = True
        End If
    Next I
    Soita "TAPS.wav"
    .WaitUntilAllCardsStop
End With

    MsgBox "Peli ohi!!"
    PL.Lopputoimet

End Sub

Sub Demo()
Dim I As Integer
    If Gameover Then Exit Sub
With PL.E1
    .WaitUntilAllCardsStop
    DL = DL - 1
    'Onko pöydällä yhtään korttia?
    CMove = False
    For I = 1 To 28
        If .Table_CardOn(I) Then CMove = True: Exit For
    Next I
    'Jos pakka loppu, eikä pöydälläkään kortteja, lopetetaan peli
    If .Deck_Counter = 0 And Not CMove Then PL.Lopputoimet: Exit Sub
    If DL <= 0 And .Deck_Counter > 0 Then
        PL.E1_DeckClick 1, 0
        DL = 29
        Exit Sub
    End If
    If DL <= 0 And .Deck_Counter = 0 Then DL = 29

    If .Table_CardOn(DL) Then                  'Onko pöytäpaikassa korttia?
        If .Table_Ind(DL) > 0 Then          'Onhan sen kortin index suurempi kuin 0 ?
            I1 = .Card(.Table_Ind(DL))
            If I1.Face Then  ' Onko kortti valittavissa?
                CMove = False ' Siirtolippu
                If PL.S1.TableStack_Counter() > 0 Then
                    K1 = PL.S1.TableStack_Card()
                    'onko kortti +1 suurempi tai -1 pienempi?
                    If I1.Value - 1 = K1.Value Or I1.Value + 1 = K1.Value Then CMove = True
                    If (I1.Value = 1 And K1.Value = 13) Or (I1.Value = 13 And K1.Value = 1) Then CMove = True
                    If CMove Then
                        'Clikataan pöytäkorttia ja siirrä kortti pöytäpinoon
                        PL.E1_TableClick 1, .Table_Ind(DL), DL
                        DL = 29
                    End If
                End If
            End If
        End If
    End If
End With
End Sub

Vastaus

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

Tietoa sivustosta