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