Ei onnistu Visual Basic

Ajatus solmussa. Aloittelen VB-ohjelmointia itsekseni. Yritin muuntaa objekteja siirtävää koodia niin, että objektit siirtyvät ensin oikelle siirryttyään vasemmalle niin kauan kuin on tilaa, mutta juutuin siihen, että objektit siirtyvät edestaikaisin. Kuinka If lause pitää kirjoittaa, että objektit siirtyvät takaisin vasemmalle, niinkauan,kuin lomakkeella on tilaa?

Private Sub cmdButton_Click()
For Each ctrl In Controls
If ctrl.Tag "Button" Then
If ctrl.Left < 3000 Then
ctrl.Left = ctrl.Left 250
Else
If ctrl.Left > 300 Then
ctrl.Left = ctrl.Left - 250
End If
End If
End If
Next ctrl
End Sub
8565
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

Tuossa koodissa pätkällä: "If ctrl.Left > 300 Then" ei ole mitään merkitystä, koska siihen mennään vain kun lefty on suurempi tai yhtäsuuri kuin 3000. Eli lause toteutuu aina.

Eli mitä tuo koko koodi tekee? Se siirtää yli 3000 leftyt vasemmalle ja alle olevat oikealle. Eli joka klikkauksella lefty lähenee 3000. Kunnes esim tilanteessa 2900 se menee yli -> 3150, jonka jälkeen se taas palaa ->2900. Eli kaikki buttonit lähestyvät 3000 ja jäävät vatkaamaan sen ympärille.

En nyt oikein ymmärrä mihin pyrit ohjelmalla: "siirtyvät ensin oikelle siirryttyään vasemmalle niin kauan kuin on tilaa"

Äänestä
  • Niinhän siinä käy(oikeassa olet) vaan ei pitäisi. Tarkoitus oli siirtää leftyt joka klikkausella vasemmalle sinne 3000 asti. Sen jälkeen pitäisi siirtyä jokaisella klikkauksella oikealle niin pitkään, kunnes taas lefty on 300 kieppeillä ja sen jälkeen alkaa siirtyminen oikealle uudestaan...

    mutta juutuin siihen välittömään edestakaisuuteen, kun en osannut kirjoittaa koodia oikein

    kyse on vain ohjelmoinnin opettelusta

    Äänestä

  • Raili kirjoitti:

    Niinhän siinä käy(oikeassa olet) vaan ei pitäisi. Tarkoitus oli siirtää leftyt joka klikkausella vasemmalle sinne 3000 asti. Sen jälkeen pitäisi siirtyä jokaisella klikkauksella oikealle niin pitkään, kunnes taas lefty on 300 kieppeillä ja sen jälkeen alkaa siirtyminen oikealle uudestaan...

    mutta juutuin siihen välittömään edestakaisuuteen, kun en osannut kirjoittaa koodia oikein

    kyse on vain ohjelmoinnin opettelusta

    Dim Vasen As Boolean
    Private Sub cmdButton_Click()

    For Each ctrl In Controls
    If ctrl.Tag "Button" Then
    Select Case ctrl.Left
    Case Is > 3000
    Vasen = True
    Case Is < 300
    Vasen = False
    End Select

    If Vasen Then
    ctrl.Left = ctrl.Left - 25
    Else
    ctrl.Left = ctrl.Left 25
    End If
    End If

    Next ctrl
    End Sub

    Äänestä

  • Raili kirjoitti:

    Niinhän siinä käy(oikeassa olet) vaan ei pitäisi. Tarkoitus oli siirtää leftyt joka klikkausella vasemmalle sinne 3000 asti. Sen jälkeen pitäisi siirtyä jokaisella klikkauksella oikealle niin pitkään, kunnes taas lefty on 300 kieppeillä ja sen jälkeen alkaa siirtyminen oikealle uudestaan...

    mutta juutuin siihen välittömään edestakaisuuteen, kun en osannut kirjoittaa koodia oikein

    kyse on vain ohjelmoinnin opettelusta

    Näin saat kaikki liikkumaan yhtenä ryhmänä edestakaisin Eli kasvatetaan kaikkien left-arvoa kunnes jokin menee yli 3000. Sen jälkeen piennennetään arvoja kunnes jokin menee alle 300.

    Jos tarkoitus on, että jokainen nappi liikkuu siellä ihan omaa tahtiaan, niin sitten pitää jokaiselle tallentaa oma arvonsa Askel.


    Dim Askel As Integer

    Private Sub Form_Load()
    Askel = 250
    End Sub

    Private Sub Command1_Click()

    For Each ctrl In Controls
    If ctrl.Tag "Button" Then
    If ctrl.Left > 3000 Then Askel = -250
    If ctrl.Left < 300 Then Askel = 250
    End If
    Next ctrl

    For Each ctrl In Controls
    If ctrl.Tag "Button" Then
    ctrl.Left = ctrl.Left Askel
    End If
    Next ctrl

    End Sub

    Äänestä

  • Lennart Lösö kirjoitti:

    Näin saat kaikki liikkumaan yhtenä ryhmänä edestakaisin Eli kasvatetaan kaikkien left-arvoa kunnes jokin menee yli 3000. Sen jälkeen piennennetään arvoja kunnes jokin menee alle 300.

    Jos tarkoitus on, että jokainen nappi liikkuu siellä ihan omaa tahtiaan, niin sitten pitää jokaiselle tallentaa oma arvonsa Askel.


    Dim Askel As Integer

    Private Sub Form_Load()
    Askel = 250
    End Sub

    Private Sub Command1_Click()

    For Each ctrl In Controls
    If ctrl.Tag "Button" Then
    If ctrl.Left > 3000 Then Askel = -250
    If ctrl.Left < 300 Then Askel = 250
    End If
    Next ctrl

    For Each ctrl In Controls
    If ctrl.Tag "Button" Then
    ctrl.Left = ctrl.Left Askel
    End If
    Next ctrl

    End Sub

    Vaikea tietää mitä tahdotaan...
    Tietenkin tein sen vain yhdelle kontrollille ja noin han se menee useammalla :)

    Äänestä

  • Lennart Lösö kirjoitti:

    Näin saat kaikki liikkumaan yhtenä ryhmänä edestakaisin Eli kasvatetaan kaikkien left-arvoa kunnes jokin menee yli 3000. Sen jälkeen piennennetään arvoja kunnes jokin menee alle 300.

    Jos tarkoitus on, että jokainen nappi liikkuu siellä ihan omaa tahtiaan, niin sitten pitää jokaiselle tallentaa oma arvonsa Askel.


    Dim Askel As Integer

    Private Sub Form_Load()
    Askel = 250
    End Sub

    Private Sub Command1_Click()

    For Each ctrl In Controls
    If ctrl.Tag "Button" Then
    If ctrl.Left > 3000 Then Askel = -250
    If ctrl.Left < 300 Then Askel = 250
    End If
    Next ctrl

    For Each ctrl In Controls
    If ctrl.Tag "Button" Then
    ctrl.Left = ctrl.Left Askel
    End If
    Next ctrl

    End Sub

    Molemmat vaihtoehdot tuli kokeiltua. Taisin ymmärtääkin.

    Äänestä

Private Sub Form_Load()

'luo formille Textbox, PicturBox ja kaksi CommandButtonia

Set Command1.Container = Picture1
Set Command2.Container = Picture1

With Picture1
.Visible = True
.BorderStyle = vbBSNone
.Height = Command1.Height
.Width = Command1.Width Command2.Width
End With

Command1.Move Picture1.ScaleLeft, Picture1.ScaleTop
Command2.Move Command1.Width, Picture1.ScaleTop

End Sub

Private Sub Form_Resize()

Dim xM As Long 'ei tarvitse välittää scalemodesta
Dim yM As Long 'twipsejä tai pixeleitä
On Error Resume Next

If Me.WindowState = vbMinimized Then Exit Sub

If Me.ScaleMode = vbTwips Then
yM = 2 * Screen.TwipsPerPixelY
xM = 2 * Screen.TwipsPerPixelX
Else
yM = 2
xM = 2
End If

Picture1.Move Me.ScaleWidth - Picture1.Width, _
Me.ScaleHeight - Picture1.Height

Text1.Move Me.ScaleLeft, _
Me.ScaleTop, _
Me.ScaleWidth, _
Me.ScaleHeight - Picture1.Height - yM


End Sub

Äänestä
  • Edellisen etuna on se ettei tarvitse välittää onko formin scalemode twipseinä tai pixeleinä. Käytetään vain niitä lukuja joita ao. containerilla (Picture1, Form1) on.

    ' ******* älkää ikinä viitatko Formiin nimellä!!!!

    ' Vaan jos se jostain halutaan ladata.....

    dim myFrm1 as Form1
    Set myFfrm1 = new Form1
    load myfrm1
    myfrm1.Show

    .... Form1:n sisällä...

    Me.Picture1.Height = xxxxxx

    Äänestä

Kommentoi aloitusta


Raili kirjoitti:

Ajatus solmussa. Aloittelen VB-ohjelmointia itsekseni. Yritin muuntaa objekteja siirtävää koodia niin, että objektit siirtyvät ensin oikelle siirryttyään vasemmalle niin kauan kuin on tilaa, mutta juutuin siihen, että objektit siirtyvät edestaikaisin. Kuinka If lause pitää kirjoittaa, että objektit siirtyvät takaisin vasemmalle, niinkauan,kuin lomakkeella on tilaa?

Private Sub cmdButton_Click()
For Each ctrl In Controls
If ctrl.Tag "Button" Then
If ctrl.Left < 3000 Then
ctrl.Left = ctrl.Left 250
Else
If ctrl.Left > 300 Then
ctrl.Left = ctrl.Left - 250
End If
End If
End If
Next ctrl
End Sub

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu