Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Drag'n'Drop ListBoxissa

BadSource [06.02.2004 09:18:10]

#

Seuraavanlainen ongelma.

ListBoxissa on lista tiedostoista (ei siis FileListBox) ja niiden järjestystä pitää voida muuttaa DragDrop menetelmällä. Minne pitää lisätä tarvittava koodi? En tunnu saavan kiinni oikeasta eventistä...

ListBoxissa on päällä seuraavat asetukset: OLEDragMode Automatic, OLEDropMode Manual. Eli visuaalisesti näyttää hyvältä.

Ja ennen kuin kukaan ihmettelee et miksi tiedostonimet on tavallisessa ListBoxissa, niin osa pitää pystyä poistamaan valinnasta ilman että ne deletoidaan tyystin.

setä [06.02.2004 13:23:28]

#

DragDrop droppaa koko listboxin. Käytä ListIndex ominaisuutta sekä remove- ja additem-metodeja. Esim. näin

Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  I = List1.ListIndex
  m = List1.List(I)
  List1.RemoveItem I
End Sub

Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  List1.AddItem m, List1.ListIndex
End Sub

Aihe siirtyy raahaamalla uuteen paikkaan

Antti Laaksonen [06.02.2004 22:15:14]

#

Tällä koodilla kahden rivin sisältö vaihtuu keskenään.

Dim aloitus As Integer

Private Sub Form_Load()
    'laitetaan listalle pari riviä esimerkin vuoksi
    List1.AddItem "Rivi 1"
    List1.AddItem "Rivi 2"
    List1.AddItem "Rivi 3"
    List1.AddItem "Rivi 4"
End Sub

Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'jos painettiin hiiren vasenta nappia...
    If Button = 1 Then
        '...otetaan talteen valitun rivin indeksi
        aloitus = List1.ListIndex
    End If
End Sub

Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim vaihto As String
    'jos hiiren vasen nappi päästettiin...
    If Button = 1 Then
        '...vaihdetaan nykyisen kohdan ja aloituskohdan teksti keskenään
        vaihto = List1.List(aloitus)
        List1.List(aloitus) = List1.List(List1.ListIndex)
        List1.List(List1.ListIndex) = vaihto
    End If
End Sub

Tällä koodilla koko listan sisältö liukuu alemmas tai ylemmäs:

Dim aloitus As Integer

Private Sub Form_Load()
    'laitetaan listalle pari riviä esimerkin vuoksi
    List1.AddItem "Rivi 1"
    List1.AddItem "Rivi 2"
    List1.AddItem "Rivi 3"
    List1.AddItem "Rivi 4"
End Sub

Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'jos painettiin hiiren vasenta nappia...
    If Button = 1 Then
        '...otetaan talteen valitun rivin indeksi
        aloitus = List1.ListIndex
    End If
End Sub

Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim vaihto As String, lopetus As Integer
    'jos hiiren vasen nappi päästettiin...
    If Button = 1 Then
        lopetus = List1.ListIndex
        'jos riviä siirretään ylemmäs...
        If lopetus < aloitus Then
            List1.AddItem List1.List(aloitus), lopetus
            List1.RemoveItem aloitus + 1
        'jos riviä siirretään alemmas...
        ElseIf lopetus > aloitus Then
            List1.AddItem List1.List(aloitus), lopetus + 1
            List1.RemoveItem aloitus
        End If
    End If
End Sub

Testeissäni huomasin, että joissain tapauksissa rivien siirtäminen ei onnistunut, vaan hiiren osoitin muuttui kieltomerkiksi. Tähän ongelmaan en löytänyt ratkaisua.

BadSource [10.02.2004 12:12:51]

#

Setä:

lainaus:

DragDrop droppaa koko listboxin.

Huomasin kans saman, kun yritin saada homman toimimaan.

Kiitos molemmille vinkeistä. Pääsen näillä taas eteenpäin. =)

BadSource [18.02.2004 13:10:09]

#

Setä ja Antti vastasivat kysymykseeni, mutta ne ei ollut aivan sitä mitä etsin. Seuraavassa koodi ListBoxin Drag'n'Dropin ohjaukseen.

Formilla ListBox (List1), jonka MultiSelect = 2.

Option Explicit

Private fromIndex As Integer

Private Sub Form_Load()
    Dim i As Integer

    Set Me.Font = List1.Font
    With List1
        For i = 1 To 20
            .AddItem "hello " & Format(i, "00")
        Next i
        .OLEDragMode = 1
        .OLEDropMode = 1
    End With
End Sub

Private Sub List1_OLEDragDrop(Data As DataObject, _
                              Effect As Long, _
                              Button As Integer, _
                              Shift As Integer, _
                              X As Single, _
                              Y As Single)
    Dim dropRowNum As Integer, visRows As Integer, i As Integer
    Dim abu As Integer, abuRowNum As Integer
    Dim midData As String

    dropRowNum = List1.ListIndex
    abuRowNum = dropRowNum
    Select Case dropRowNum

        Case Is = fromIndex
            Beep
        Case Is > fromIndex
            i = 1
            abu = InStr(i, Data.GetData(1), vbCrLf)
            If abu > 0 Then
                Do
                    midData = Mid(Data.GetData(1), i, (abu - i))
                    abuRowNum = abuRowNum + 1
                    List1.AddItem midData, abuRowNum
                    i = abu + 2
                    abu = InStr(i, Data.GetData(1), vbCrLf)
                Loop Until abu = 0
                midData = Mid(Data.GetData(1), i, Len(Data.GetData(1)))
                abuRowNum = abuRowNum + 1
                List1.AddItem midData, abuRowNum
                i = 0
                Do Until i > List1.ListCount - 1
                    Do Until Not List1.Selected(i)
                        List1.RemoveItem i
                    Loop
                    i = i + 1
                Loop
            Else
                List1.AddItem Data.GetData(1), dropRowNum + 1
                i = 0
                Do Until i > List1.ListCount - 1
                    Do Until Not List1.Selected(i)
                        List1.RemoveItem i
                    Loop
                    i = i + 1
                Loop
            End If
            List1.ListIndex = dropRowNum
            List1.Refresh
        Case Is < fromIndex
            i = 1
            abu = InStr(i, Data.GetData(1), vbCrLf)
            If abu > 0 Then
                abuRowNum = abuRowNum - 1
                Do
                    midData = Mid(Data.GetData(1), i, abu - i)
                    abuRowNum = abuRowNum + 1
                    List1.AddItem midData, abuRowNum
                    i = abu + 2
                    abu = InStr(i, Data.GetData(1), vbCrLf)
                Loop Until abu = 0
                midData = Mid(Data.GetData(1), i, Len(Data.GetData(1)))
                abuRowNum = abuRowNum + 1
                List1.AddItem midData, abuRowNum
                i = List1.ListCount - 1
                Do Until i = 0
                    If List1.Selected(i) Then List1.RemoveItem i
                    i = i - 1
                Loop
            Else
                List1.AddItem Data.GetData(1), dropRowNum
                i = List1.ListCount - 1
                Do Until i = 0
                    If List1.Selected(i) Then List1.RemoveItem i
                    i = i - 1
                Loop
            End If
            List1.ListIndex = dropRowNum
            List1.Refresh
    End Select

End Sub

Private Sub List1_OLEDragOver(Data As DataObject, _
                              Effect As Long, _
                              Button As Integer, _
                              Shift As Integer, _
                              X As Single, _
                              Y As Single, _
                              State As Integer)
    Dim selRow As Integer

    selRow = CInt((Y / Me.TextHeight("Hello1")))
    If selRow > (List1.ListCount - 1) Then: selRow = List1.ListCount - 1
    List1.ListIndex = selRow

End Sub

Private Sub List1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)

    fromIndex = List1.ListIndex
    AllowedEffects = 2

End Sub

setä [18.02.2004 18:35:27]

#

jumalattoman pitkä koodi. Jos vain järjestystä piti voida muuttaa, niin miksi ihmeessä näin paljon koodia. Omassa koodissani oli kyllä se vika, että valintamahdollisuus jäi tuollaisenaan pois, koska klikkaus aina poisti aiheen. Jos koodiin lisää, että on painettava Shift alas, niin silloin ilman Shiftiä voi tehdä valinnan. Kyllä se ainakin minulla toimi.

BadSource [19.02.2004 11:14:30]

#

lainaus:

jumalattoman pitkä koodi. Jos vain järjestystä piti voida muuttaa, niin miksi ihmeessä näin paljon koodia.

Jokainen tekee tyylillään. ;) Pääasia kuitenkin, että saa ohjelman tekemään sen mitä haluaa...

Vastaus

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

Tietoa sivustosta