Makale Özeti

Mouse ile sürükle-bırak işlemlerinin anlatımı

Makale

SÜRÜKLE – BIRAK (DRAG AND DROP) ISLEMLERI

Görsel programlamanin en güzel özellikleriklerinden bir taneside kullanicilara kolay bir ortam saglamasidir. Biz programcilar mouse kullanmayi pek sevmesekte kullanicilar bir çok isi mouse ile halletmeyi tercih ederler. Bu sebeple onlara verebilecegimiz en güzel özelliklerden bir taneside yazdigimiz uygulamalarin mouse agirlikli kullanilmasidir herhalde. Bu sebeple tipki Windows’daki kullanim gibi yazdigimiz uygulamalarida mouse ile sürükle – birak islemleri ile halledebiliriz.
.NET ile bu islemleri gerçeklestirmek çok kolaydir. Visual Basic 6.0’da iki türlü sürükle – birak islemi mevcuttur. Kontroller arasi standart sürükle – birak ve uygulamalar arasi OLE sürükle – birak. Bu iki islem .NET Framework ile tek baslik altinda toplanmistir. Visual Basic.NET Upgrade wizard ile OLE sürükle – birak güncellenmemektedir.
Standart sürükle – birak Visual Basic 6.0’in çalismasi ile benzer çalisir. Aralarindaki ana farklilik DoDragDrop metodunun Visual Basic.NET’de senkronize çalismasidir. Sürükle – birak islemi tamamlanana ya da iptal edilene kadar geri dönmez.
Otomatik sürükle – birak desteklenmemektedir. Kaynak kontrol islemine basladigi zaman kod yazmaniz gerekmektedir. Ve ayni sekilde hedef kontrolünüzün islemi alabilmesi için AllowDrop özelligini True yapmaniz gerekmektedir. Bu özelligin True olarak belirlenmesi sonucunda hedef kontrol üzerinde dört tane olay (event) kullanabilir duruma gelirsiniz. DragEnter, DragOver, DragLeave, ve DragDrop olaylari. DragDrop olayi sadece mouse’un isi hedef kontrol üzerinde tamamlandigi zaman devreye girer.
Örnek ile bu konuyu pekistirelim. Örnegimizde tatlilarin listesi olsun ve diger alana da istedigi tatlilari yerlestircegi bir alanimiz olsun.
Forma iki tane TreeView kontrolü yerlestirelim.



Içerilerine bilgileri istediginiz gibi yerlestirin.
Her iki kontrolünde AllowDrop özelligini True yapalim.



Forma yerlestirecegimiz kodlar;
Private Sub TreeView_ItemDrag(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles Tatlilar.ItemDrag    If e.Button = MouseButtons.Left Then
      Dim DragDropResult As DragDropEffects
      DragDropResult = DoDragDrop(e.Item, DragDropEffects.Move Or DragDropEffects.Copy)
      If DragDropResult = DragDropEffects.Move Then
         CType(sender, TreeView).Nodes.Remove(CType(e.Item, TreeNode))
      End If
   End If
End Sub
Private Sub TreeView_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles IstenilenTatlilar.DragEnter
   If (e.Data.GetDataPresent(GetType(TreeNode))) Then
      If CBool(e.KeyState And 8) Then
         e.Effect = DragDropEffects.Copy
      Else
       e.Effect = DragDropEffects.Move
     End If
   Else
     e.Effect = DragDropEffects.None
  End If
End Sub
Private Sub TreeView_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles IstenilenTatlilar.DragDrop
   Dim nodeSource As TreeNode = CType(e.Data.GetData(GetType(TreeNode)), TreeNode)
   Dim tvw As TreeView = CType(sender, TreeView)
   Dim pt As Point = tvw.PointToClient(New Point(e.X, e.Y))
   Dim nodeTarget As TreeNode = tvw.GetNodeAt(pt)
   nodeTarget.Nodes.Add(CType(nodeSource.Clone, TreeNode))
  nodeTarget.Expand()
End Sub

Tüm sürükle – birak olaylarina gerçeklestirilecek islemleri yaziyoruz. Ilk önce Tatlilar kontrolündeki bilgiler için sürükle isleminin baslatilmasi aninda gerçeklestirilecek islemleri yaziyoruz. Mouse ile islem basladigi anda yani kaynak kontrol üzerinde mouse’un sol tusuna basildigi anda DoDragDrop islemi baslatiliyor ve birinci kontrolden bilgi silinip ikinci kontrole bilgi aktariliyor.
Önemli olan bir diger noktada e.KeyState degerleri e.KeyState degeri mouse’un hangi tusuna bastigimizi ve veya ctrl + shift tuslarindan hangisine baktigimizi kontrol eden ve sadece DragOver özelligine ait degerlerdir. Alabilecegi degerler;
1 : Mouse’un sol tusuna basilmasi.
2 : Mouse’un sag tusuna basilmasi.
5 : Shift tusuna basilmasi.
9 : Ctrl tusuna basilmasi.

Yeliz Korkmaz
yeliz.korkmaz@bilisimanadolu.com