Favorilerine Ekle | Giriş Sayfan Yap | Tavsiye Et

 

Kurs Tanıtım Sayfası | Süper Üye Kimdir? | Menü Tasarımı Konulu Örnek Ders
Kod İndir| Hazır Kodlar | Makaleler| İpuçları | VB .NET Kursu | Dersler | Forum | Alt Bölümler | Servisler
    Merhaba Misafir
    anasayfa » visual basic makaleleri » CLASS Oluşturma ve SHGetFileInfo API Kullanımı
Üye Girişi
Kullanıcı Adı:  
Şifre : 
Kaydet ?
Siteden tam olarak faydalanabilmek için üye olmalısınız.
Unuttuğunuz şifrenizi öğrenebilmek için kayıt sırasında verdiğiniz Hatırlatma Cevabı'nı bilmeniz gereklidir.
Şifre hatırlatma işlevini sadece 3 defa kullanma hakkınız vardır.
Kullanıcı adını ve şifresini unutan üyelere email ile yardım verilmez.

Aktivasyon Gelmedi mi?Aktivasyon mesajınız email adresinize gelmedi mi?
Buraya tıklayarak bir kez daha aktivasyon mesajı gönderilmesini sağlayabilirsiniz.
Lütfen email hesabınızın BULK ve SPAM klasörlerini de kontrol ediniz.
Rastgele Makale

Windows Script Host Kontroller

Yazar: Crox
istenilen Dosya Yı Çalıştırma Ve Geri Değer Gönderme


Webmasterlar
Sitenize Ekleyin!
Sitenizde "Son Eklenen 10 Visual Basic Yazısı"'nı göstermek ve içeriğini zenginleştirmek için buraya tıklayınız.

Vbasicmaster.com'a link verin!
Aşağıdaki minik banneri sitenize eklemek için tıklayın!

Üye Sayısı:
Ziyaretçiler nerede?
Yayın № : 12154
Yayın Tar:20.10.2010
Yazar : scorpio3713
Hit :2360

Bu Yazarın Yazıları Sadece bu yazarın makale göster
Bu Yazıyı Tavsiye Et

Arkadaşlar merhaba,

Öncelikle söylemeliyim ki; bu yazıyı hazırlamamda bana çok yardımı olan www.glassocean.net adlı siteye teşekkürlerimi sunarım.
Bu yazıyla birlikte, Windows Shell ikonlarını API yardımıyla VB.NET çatısı altında nasıl kullanabileceğinizi açıklamaya çalışacağım.
Öncelikle bir class oluşturacağız ve böylece bu class'ı projede tekrar tekrar her istediğimizde kullanabileceğiz.
Bu class ne işe mi yarayacak?
Hemen açıklamaya çalışayım. Yeni Class'ımız ile, istediğimiz bir yol altındaki dosya ve/veya klasörleri,
geçerli ikonları ve tam yol adlarıyla birlikte bir DataGridView'a aktaracağız.
Tabii şimdilik bununla yetiniyoruz, gerisi sizin hayal gücünüze kalmış.

Artık başlayabiliriz sanırım...

Öncelikle .NET'i açarak yeni bir proje oluşturuyoruz.
Daha sonra yeni bir Class ekliyoruz projemize.
Ben bu Class'a 'Dosya_Yoneticisi' adını verdim.
Daha sonra bu Class'ı kullanırken de aynı isimle çağıracağız.

Şimdi Dosya_Yoneticisi ikonlarımız için bir HashTable oluşturacağız.
Class'ın kod kısmına öncelikle aşağıdaki kodları ekleyelim.

Public Class Dosya_Yoneticisi
Dim DY_Ikonlari As New Hashtable 'Dosya_Yoneticisi İkonları manasında ;)
End Class

Daha sonra dosya ikonları için gerekli API'yi (ki bu API SHGetFileInfo'dur) ve
API için gerekli değişkenler ve Structure'ı tanıtıyoruz.
Bu arada .NET'te structure, VB6'da kullandığımız Type ile aynıdır.
Bu da kısa bir bilgi olsun...
Çünkü genelde VB6'dan .NET'e geçerken ve özellikle de VB6'da API kullanıyorsak,
bu sorun ile sıkça karşılaşıldığına şahit oldum...
Neyse; sözü fazla uzatmadan tanımlamalarımızı yapalım...

Class'ımızın içine aşağıdaki kodları yazıyoruz...
Yani 'Dosya_Yoneticisi Declarations' kısmına:

' API SHGetFileInfo deklare ediliyor, Dosya bilgisi okumak için...
Public Declare Auto Function SHGetFileInfo Lib "shell32.dll" (ByVal pszPath As String, ByVal dwFileAttributes As Integer, ByRef psfi As SH_DOSYA_BILGISI, ByVal cbFileInfo As Integer, ByVal uFlags As Integer) As IntPtr
' API için gerekli sabitler tanımlanıyor...
Public Const SHGFI_IKON As Integer = &H100
Public Const SHGFI_KUCUKIKON As Integer = &H1
' SH_DOSYA_BILGISI Yapısı (Tipi) deklare ediliyor (sisteme tanıtılıyor)...
Structure SH_DOSYA_BILGISI
Public hIkon As IntPtr
Public iIkon As Integer
Public dwAttributes As Integer
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szGoruntuAdi As String '260 Karakterlik bir STRING değşiken tanımladık...
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTurAdi As String '80 Karakterlik bir STRING değşiken tanımladık...
End Structure

Ve böylece artık API'miz kullanıma hazır....
Dosya Ikonlarını alabiliriz artık...
Bunun için Class'ımız içinde (Dosya_Yoneticisi) bir fonksiyon tanımlıyoruz...
Aşağıdaki kodlar bu işe yarayacak... Class'ımıza ekleyelim...

Function Temp_DosyaIkonuGetir(ByVal Temp_DosyaYolu As String) As Image
Dim Temp_DosyaBilgisi As SH_DOSYA_BILGISI
Dim Temp_KucukIkon As IntPtr
Dim Temp_Ikon As System.Drawing.Icon
Dim Son_Goruntu As Image

' WINSHELLden dosyayı ve küçük ikonunu alalım...
Temp_DosyaBilgisi = New SH_DOSYA_BILGISI
Temp_DosyaBilgisi.szGoruntuAdi = New String(Chr(0), 260)
Temp_DosyaBilgisi.szTurAdi = New String(Chr(0), 80)
Temp_KucukIkon = SHGetFileInfo(Temp_DosyaYolu, 0, Temp_DosyaBilgisi, System.Runtime.InteropServices.Marshal.SizeOf(Temp_DosyaBilgisi), SHGFI_IKON Or SHGFI_KUCUKIKON)
' aldığımız ikonu HANDLE bilgisi yardımıyla yaratalım...
Try
Temp_Ikon = System.Drawing.Icon.FromHandle(Temp_DosyaBilgisi.hIkon)
Son_Goruntu = Temp_Ikon.ToBitmap
Catch ex As Exception
' Exception yakalarsa döndürmek için siyah 16x16 boyutunda bir resim yaratalım...
Son_Goruntu = New Bitmap(16, 16)
End Try
' Sonucu döndürelim...
Return Son_Goruntu
End Function

Göreceğiniz gibi, fonksiyonumuz bir Image döndürüyor.
Şimdi yeni bir Fonksiyon oluşturarak, Aldığımız Image'ı HashTable'ımıza ekleyelim...
Aşağıdaki kodlar bu işe yarayacaktır:

Function Ikonu_Getir(ByVal DosyaYolu As String) As Image
Dim DosyaAciklamasi As String = System.IO.Path.GetExtension(DosyaYolu)
' ikon yoksa ekleyelim...
If DY_Ikonlari.ContainsKey(DosyaAciklamasi) = False Then
DY_Ikonlari.Add(DosyaAciklamasi, Temp_DosyaIkonuGetir(DosyaYolu))
End If
' ikonu döndürelim...
Return DY_Ikonlari(DosyaAciklamasi)
End Function

Böylece içinde iki fonksiyon barındıran bir class oluşturduk arkadaşlar...
Herşey bitti mi? Tabii ki HAYIR...
Şimdi oluşturduğumuz Class'ı projemizde nasıl kullanacağımıza bakalım...

Hemen bir Form Class ekleyelim projemize...
Ben kendi tanımlamalarıma göre anlatacağım, siz istediğiniz gibi kullanabilirsiniz...
Formumun adı 'DosyaIconuAl.vb'.
Formuma bir GroupBox ve içine üç adet RadioButton, bir Label, bir TextBox ve bir DataGridView ekledim.
Şimdi kontrol isimlerini ve Text değerlenini sıralıyorum:

Kontrol | Kontrol Ismi | Text Değeri (Caption)
------- | ------------ | ---------------------

GroupBox | Grp_Tur | Dosya Türleri
RadioButton | RBtn_Klasor | Klasörler
RadioButton | RBtn_Dosya | Dosyalar
RadioButton | RBtn_Hepsi | Tümü
Label | Lbl_Yol | Dosya Yolu
TextBox | Txt_Yol
DataGridView | DGV

Dizayn kısmı tamamen size kalmış :)

Şimdi de yapacağımız işlemi basitçe anlatayım...
RadioButton'lardan herhangi birini seçerek TextBox'a yazdığımız bir dosya yolunun, içinde
barındırdığı dosya/klasör ya da tümünü DataGridView'umuzda listelemek.
Bunun için DataGridView'umuza iki kolon ekliyoruz...
İlk kolonu 'DataGridViewImageColumn' diğerini ise 'DataGridViewTextBoxColumn' olacak şekilde ayarlıyoruz...
Bundan sonrası gayet basit arkadaşlar...

Dosya_Yoneticisi Class'ımız için Formumuza bir Private değişken tanımlayalım...
Formun Declarations kısmına:

Private Temp_DosyaYoneticisi As New Dosya_Yoneticisi

yazıyoruz.

Daha sonra Formun kod kısmına birkaç subroutine tanımlayacağız...
İlki, DataGridView'umuzu temizleyecek:

Private Sub listeyitemizle()
Me.DGV.Rows.Clear()
End Sub

Ve diğerlerinin görevi, oluşturduğumuz Class'ı kullanarak dosyaları/klasörleri ve ikonlarını getirmek ve DatagridView'umuza eklemek olacak...

Bunun için ilk subroutine'imiz klasörleri;

Private Sub klasorlerigetir()
For Each DosyaYolu As String In My.Computer.FileSystem.GetDirectories(Me.Txt_Yol.Text)
Me.DGV.Rows.Add(Temp_DosyaYoneticisi.Ikonu_Getir(DosyaYolu), DosyaYolu)
Next
End Sub

Diğeri ise dosyaları ekleyecek;

Private Sub dosyalarigetir()
For Each DosyaYolu As String In My.Computer.FileSystem.GetFiles(Me.Txt_Yol.Text)
Me.DGV.Rows.Add(Temp_DosyaYoneticisi.Ikonu_Getir(DosyaYolu), DosyaYolu)
Next
End Sub

Hata kontrolü için bir subroutine;

Private Sub hatagetir(ByVal hatano As Integer, ByVal aciklama As String)
MsgBox("Beklenmeyen Bir Hata Oluştu:" & vbNewLine & _
"Hata Kodu : " & hatano & _
"Hata Açıklaması : " & aciklama, _
MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "..:: HATA ::..")
End Sub

Ve en nihayet hepsini toparlayalım;

Private Sub islemkontrol()
If Not Me.Txt_Yol.Text = "" Then
listeyitemizle()
Try
If Me.RBtn_Dosya.Checked Then
dosyalarigetir()
ElseIf Me.RBtn_Klasor.Checked Then
klasorlerigetir()
Else
klasorlerigetir()
dosyalarigetir()
End If
Catch e As Exception
hatagetir(Err.Number, Err.Description)
End Try
End If
End Sub

Görüldüğü gibi, bu subroutine TextBox'ımızda yazı olup olmadığını ve işlem hataya düşerse ne yapması
gerektiğini programa anlatıyor...

Şimdi de FormLoad olayımıza TextBox'ımızın içini boş STRING ile dolduracak formulümüzü tanıtaltım:

Private Sub DosyaIconuAl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Txt_Yol.Text = ""
End Sub

Artık; kontrollerimize işlemimizi yaptırabiliriz:

Önce TextBox'ımızdan Focus'umuzu ayırdığımızda;

Private Sub Txt_Yol_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Txt_Yol.Leave
islemkontrol()
End Sub

Sonra da RadioButton'larımız değiştiğinde;

Private Sub RBtn_Klasor_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBtn_Klasor.CheckedChanged
islemkontrol()
End Sub

Private Sub RBtn_Dosya_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RBtn_Dosya.CheckedChanged
islemkontrol()
End Sub

Private Sub RBtn_Hepsi_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RBtn_Hepsi.CheckedChanged
islemkontrol()
End Sub

Ve hatta TextBox'ımızdayken ENTER tuşu davranışı;

Private Sub Txt_Yol_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Txt_Yol.KeyUp
If e.KeyCode = Keys.Return Then
Me.DGV.Focus()
End If
End Sub

Evet arkadaşlar, umarım bu yazı, bana yardımcı olduğu kadar size de yardımcı olur...

Sağlıcakla,




Bu sayfa için henüz yorum eklenmemiş.

© Hakan Ersöz 2000-2013| Üyelik Sözleşmesi | | Ödeme Bildirimi
Sitemizden yenilikleri hemen öğrenin, pop upları engelleyin, chat yapın... ToolBarımızı indirin:
Vasicmaster Toolbar'ı indirin