Etusivu Aloitus Kontrollit Metodit Muuttujat Ohjausrakenteet Silmukat Matematiikka Debuggaus Virheenkäsittely Vuorovaikutus Valikot Tiedostonkäsittely Ikkunat Leikepöytä Drag and Drop Tiedostopäätteet Linkkejä Harjoitukset
Huom! Huomaa, että "perus" pudota ja raahaa -toiminnoilla voit raahata yhtä kontrollia oman ohjelmasi sisällä. Jos haluat raahata ohjelmaasi tietoa toisista ohjelmista, tulee sinun käyttää OLE Drag & Drop - toimintoa.
Option Explicit
Private Sub Label1_DragDrop(Source As Control, X As Single, Y As Single)
    ' Raahattava kontrolli on pudotettu otsikkokontrollin päälle
    Label1.BackColor = vbYellow
End Sub
Private Sub Form_Load()
    Label1.BackColor = vbYellow
End Sub
Private Sub Label1_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
    ' Ollaanko raahaamassa kontrollin päälle vai kontrollista pois
    Select Case State
        ' Kontrolliin päin
        Case vbEnter
            Label1.BackColor = vbRed
        ' Kontrollista pois
        Case vbLeave
            Label1.BackColor = vbYellow
    End Select
End Sub
Käydäänpä esimerkki läpi, aloitetaan Form_Load -tapahtumasta. Ohjelman käynnistyessä asetetaan
otsikkokentän taustaväriksi keltainen. Kun käyttäjä raahaa (esim. tekstikenttää) otsikkokentän
päälle, muutetaan otsikkokentän taustaväri punaiseksi (toinen mahdollisuus olisi asettaa
raahattavan kontrollin DragIcon erilaiseksi Source.DragIcon = LoadPicture("ikoni.ico")
-metodia käyttämällä).

Drag&Drop -esimerkki, raahataan kuvakontrollia toisen kuvakontrollin päälle.
Tutkitaanpa miten ohjelma toimii. Ensinnäkin, jos haluat, että kontrollia pystyy raahaamaan, täytyy DragMode asettaa Automatic -arvoon. Entäpä miten voimme havaita mitä tai minkätyyppistä kontrollia olemme raahaamassa? Kun raahaamme kontrollia, syntyy DragOver -tapahtuma. Tapahtumalla on Source -tyyppinen parametri, jolta voimme kysyä tyyppiä TypeOf -metodia käyttäen:
If TypeOf Source Is PictureBox Then MsgBox "Raahattava kontrolli on PictureBox -tyyppinen!" Else MsgBox "Raahattava kontrolli ei ole PictureBox -tyyppinen." End IfEsimerkissä tutkimme onko raahattava kontrolli PictureBox -tyyppinen (koska hyväksymme tässä esimerkissä vain em. tyyppiset kontrollit). Toinen tapa tutkia mikä kontrolli on tulossa on käyttää jokaisessa kontrollissa olevaa Tag -ominaisuutta (eli aseta kontrollin tag -arvoksi jotain, jolla tunnistat kontrollin). Äskeisessä esimerkissä välkyttelimme kontrollin taustaväriä sen merkiksi ottaako kontrolli raahattavan kontrollin vastaan tai ei. Voimme käyttää myös hiiren kursoria tähän merkinantoon:
Set Source.DragIcon = LoadPicture("c:\temp\kylla.ico")
Esimerkissä asetamme raahattavan kontrollin hiiren kursoriksi halutun kursorin.
Voit käyttää tätä ja tätä ikonia ohjelmassa kopioimalla
sen c:\temp\ -kansioon (tai muuttamalla ohjelmakoodia siten, että ikonit haetaan esim. ohjelman
asennushakemistosta.
If TypeOf Source Is PictureBox Then ' Kyllä, näytetään "vihreää" valoa Picture1.Picture = Source.Picture End IfKannattaa toki varmistaa (kuten esimerkissämme olemme tehneetkin), että raahattava kontrolli on oikean tyyppinen. Voit käyttää tähän TypeOf -funktiota. If -lauseessa tutkimme onko raahattava kontrolli (Source) PictureBox -tyyppinen.
Voit kokeilla automaattista OLE Drag & Drop:ia luomalla uuden Standard EXE -projektin ja lisäämällä siihen tekstikentän. Aseta tekstikentän OLEDragMode ja OLEDropMode -ominaisuudet arvoon Automatic. Käynnistä ohjelma ja raahaa jotain tekstiä suoraan tekstikenttään.
Manuaalisessa OLE Drag & Drop:ssa tulee sinun itse huolehtia ohjelmakoodin kirjoittamisesta joka huolehtii siitä, että kontrolli osaa tarvittaessa ottaa vastaan "raahattavan" tiedon.
Seuraavassa esimerkissämme testaamme OLE Drag & Drop:ia käytännössä. Luo uusi Standard EXE -projekti ja lisää siihen kuvakontrolli. Aseta kuvakontrollin OLEDragMode ja OLEDropMode -ominaisuuden arvoksi Manual. Lisää seuraava ohjelmakoodi:
Private Sub Picture1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
On Error Resume Next
    ' Hyväksytään vain jos on yksi tiedosto
    If Data.Files.Count = 1 Then
        MsgBox "Yritetään ladata tiedostoa '" & Data.Files(1) & "' kuvana!", vbInformation
        Set Picture1.Picture = LoadPicture(Data.Files(1))
    Else
        MsgBox "Vain yksi tiedosto, kiitos!", vbInformation
    End If
End Sub
Käydäänpäs esimerkkiä läpi. Tieto jota raahaamme, voi olla esim. tiedosto resurssienhallinnasta.
Voit selvittää raahattavien tiedostojen määrän käyttämällä Data -objektin Files -taulukon Count
-ominaisuutta joka kertoo montako tiedostoa on raahattavana. Sallimme kontrolliimme raahattavan
vain yhden tiedoston kerrallaan. Yritämme ladata em. tiedoston kontrolliimme kuvana (jos se vain
onnistuu).