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
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
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"
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
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 :)
Molemmat vaihtoehdot tuli kokeiltua. Taisin ymmärtääkin.
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
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