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

Johdanto ja tavoite

Tässä osiossa opetellaan käyttämään pudota ja raahaa -toimintoa. Tämän osion jälkeen opiskelija tietää miten sisällyttää em. ominaisuudet omaan ohjelmaansa. Lisäksi käsitellään OLE Drag&Drop:ia lyhyesti.

Pudota ja raahaa

Pudota ja raahaa -toiminto on hyvin yleinen Windows -maailmassa ja onkin hyvä opetella käyttämään sitä. Toiminto tarkoittaa yksinkertaisuudessaan sitä, että voimme A) raahata jonkin ohjelmassamme olevan kontrollin (jos em. kontrollin DragMode -ominaisuus on asetettu Automatic -tilaan) jonkin toisen ohjelmassamme/muussa ohjelmassa olevan kontrollin päälle ja B) saamme selville jos kontrollia raahataan oman ohjelmamme kontrollin päälle. Ymmärrät edellisen esimerkin paremmin jos kokeilet alla olevaa ohjelmaa, kopioi ohjelmakoodi uuteen Standard EXE -projektiin ja lisää ikkunaan tekstikenttä ja otsikkokontrolli tai lataa esimerkkiohjelma täältä.

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ä).

DragOver

Jos haluamme omassa ohjelmassa olevan kontrollin (esim. tekstikenttä) olevan "raahattavissa", tulee kontrollin DragMode -ominaisuus asettaa Automatic -arvoon. Kun kontrolli on raahattu toisen kontrollin päälle (esim. kuva), syntyy DragOver -tapahtuma. Jos pudotamme (eli päästämme hiiren vasemman painikkeen alas em. kontrollin päällä), syntyy DragDrop -tapahtuma. Seuraavaksi tutkimme em. tapahtumat ja niiden sisältämät parametrit. DragOver on hyvin käyttökelpoinen tapahtuma jos haluamme osoittaa, että tänne voi/ei voi raahata (ja tätä myöten pudottaa) raahattavan kontrollin. Otetaan esimerkkinä tilanne, jossa haluamme kertoa käyttäjälle hiiren kursorin muutoksella, että esim. kuvakontrolliin voi raahata toisen kuvakontrollin mutta ei esim. tekstikontrollia. Kopioi esimerkkiohjelma ja suorita se. Lisää oikeanpuolimmaiseen kuvakontrolliin joku kuva suunnittelutilassa. Käynnistä ohjelma ja yritä raahata se vasemmanpuolimmaisen kuvakontrollin päälle. Tuloksena punainen väri kuvakontrollissa. Raahaa sitten oikeanpuolimmainen kuvakontrolli vasemmanpuolimmaisen päälle, tuloksena vihreä kuva. Pudota raahamaasi kuvakontrolli, nyt molemmissa kuvakontrolleissa on sama kuva.

Drag&Drop esimerkki
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 If
Esimerkissä 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.

DragDrop

Loppuhuipennus on tietysti raahattavan kontrollit pudottaminen haluttuun kontrolliin. Tällöin voidaan suorittaa halutut toimenpiteet, esim. esimerkissämme asetamme kontrollin kuvaksi raahatun kontrollin kuvan:
If TypeOf Source Is PictureBox Then
	' Kyllä, näytetään "vihreää" valoa
	Picture1.Picture = Source.Picture
End If
Kannattaa 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.

OLE Drag & Drop

OLE Drag & Drop:ssa siirretään kontrollin sijasta tietoa. Voit esim. kopioida kuvatietoa, Excel:in soluissa olevaa tietoa, jne. Jotkin VB:n kontrollit tukevat OLE Drag & Drop:ia suoraan kun asetat niiden OLEDragMode ja OLEDropMode -ominaisuudet arvoon Automatic.

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).
Tehtävä 25