Shared Add-in oluşturmak

Shared Add-in oluşturmak

Add-in ler nedir ne işe yarar ?

Add-inin manası var olan bir paket programın üzerine, o paket programın dll  ini kullanarak yaratılan yardımcı alt programcıklardır.

 

Add-inlerin manasından da anlaşıldığı gibi, paket programların bizim istediğimiz şekilde yeni özellikler kazandırılmasıyla kullanıcıların daha rahat bir şekilde işlemlerini yapmasında ve zamandan tasarruf etmelerinde bize yarar sağlarlar.

 

Office 2000 ve üstü programlar için Visual Studio ile iki şekilde add-in yazabiliriz. Birinci yol Shared Add-inleri kullanmak, ikinci yol ise VSTO (Visual Studio Tools for Office) component ini kullanmak. Ben birinci yolu tercih edenlerdenim. İkinci yol da yabana atılır bir component değil kesinlikle. Microsoft tarafından geliştirilmiş gerçekten güzel olan bir araç. Tabiî ki ikisinin de kendilerine göre avantajları ve dezavantajları var.

 

VSTO daha az kod yazmayı genel olarak direkt program üstünde işlemler yapmamızı sağlıyor (bkz. http://www.yazgelistir.com/Arama/Arama.aspx?q=vsto , bkz. http://msdn2.microsoft.com/en-us/office/aa905533.aspx) .

 

Shared Add-Inler de ise daha çok kod parçacıkları kullanıyoruz fakat ekstra bir component kullanmıyoruz.

 

Ben size şu şekilde bir senaryo sunmak ve bu senaryo üzerinde çalışmak itiyorum.

 

Senaryo: Daha önceden başka bir dilde yazılmış bir programımız var ve bu program veri tabanına bir takım bilgiler yazmamıza ve bu bilgileri görmemize yardımcı oluyor. Ama eksik bir yönü var, o da her hangi bir Office programına aktarım yapamıyor ve bu programın tedarikçisi, kaynak kodlarını bize sunmamış. Bu yüzden içinde değişiklik yapamıyoruz sadece bize sunulan kısıtlamalarla o programı kullanıyoruz.

 

İş yerimizde bulunan kullanıcılarımız iyi derece Excel formüllerini kullanabiliyor ve bu kullanıcılar bunları teker teker elle yazmak yerine otomatik olarak Excel e aktarılmasıyla ilgili bir talepte bulunuyorlar.

 

Kullanıcılar bizden Excel de sadece bir tuşa basıldığında, isim, soy isim ve bakiye bilgilerinin satırlara yazılmasını istiyor ve bu satırlarla ilgili daha sonra kendileri işlemler yapacaklar.

 

Senaryomuz hazır peki biz ne gibi adımlardan geçip add-inimizi yazmaya başlayacağız?

 

Öncelikle Shared Add-in lerin interface ve event larından bahsetmek lazım.

 

IDTExtensibility2 Interface – Bu interface Microsoft Add-in Designer type library (Msaddndr.dll) nin bir parçası olduğunu tanıtmak için kullanılır. Tüm Office add-inlerinde bu interface i inherit metoduyla implemente etmemiz gerekmektedir.

 

OnConnection – Bu event, add-inin ilk yüklendiği anda hangi olay veya olayların olacağını tanımlayacağımız event dır. İletişime geçtiğinde başlar, kullanıcı sonlandırdığında ise biter. Eğer bir hata mesajıyla karşılaşılırsa uygulama sona ere ve obje kapatılır.

 

4 parametresi vardır. Bunlar;

 

Application – Referans alınacak obje.

ConnectMode – Bağlantı tipini belirler ve 4 tipdedir.

ext_cm_AfterStartup – Kullanıcının bir iletişim kutusu sayesinde başlatması için kullanılır.

ext_cm_CommandLine – Komut satırı ile bağlantı yapar. Office uygulamalarında kullanılmaz.

ext_cm_External – Başka uygulamaların bu add-inle haberleşmesi için kullanılır. Office uygulamalarında kullanılamaz.

ext_cm_Startup – Uygulama başlatıldığı anda başlar kontrolü registry de atanan değer sağlar.

AddInInst – Uygulama için COMAddIns koleksiyonundan referans alan COMAddin objesidir.

Custom – Variant tipinde dizi değişken alan, kullanıcı tarafından belirtilmiş değerleri alır.

 

OnDisconnection – Bağlantı koptuğunda, hafızadan bilgiler silinmeden bir önceki adımda gerçekleşecek olaylar burada belirtilir. Tüm kodun temizlenmesi ve restore işleminin gerçekleşmesi için kullanılır.

 

2 parametresi vardır. Bunlar;

 

RemoveMode – Sabit tipte değerler alır ve iki şekilde bağlantı kesilmesi sağlanır

            ext_dm_HostShutDown – Uygulama kapatıldığında gerçekleşir.

            ext_dm_UserClosed – Kullanıcı tarafından kapatıldığında gerçekleşir.

Custom – Variant tipinde dizi değişken alan, kullanıcı tarafından belirtilmiş değerleri alır.

 

OnAddInsUpdate – Kayıt defterine yazılmış olan değerin değişmesi durumunda olacak olaylar buraya belirtilir. Add-in güncellendiğinde veya silindiğinde tetiklenir.

 

OnStartUpComplete ve OnBeginShutDown – Yükleme tamamlandığında ve hafızadan artık bilgiler silindiğinde gerçekleşecek olaylar bu kısımlarda belirtilir.

 

Eventlarımızı ve interface imizi anlattıktan sonra geçiyoruz add-inimizi yaratma adımına.

 

Projemizi nasıl oluşturacağız ?

 

File / New Project / Other Project Type / Extensibilty  / Shared Add-in kısmına gelip projemizin adını yazıyoruz ve ok tuşuna basıyoruz.

 

 Bu adımdan sonra karşımıza kullanmamız için bir sihirbaz geliyor ve bize shared add-inimizi oluşturmamızda yardımcı oluyor.

Bu adımda bize hangi programlama diliyle yolumuza devam edeceğimiz soruluyor. Ben size Visual Basic ile anlatacağım için bu seçeneği seçiyorum.

 

Gördüğünüz gibi hangi uygulama için add-in imizi yapacaksak o uygulamayı seçiyoruz.

Buraya add-in ismini ve açıklamasını giriyoruz. Dll imiz artık bu isim ve açıklamayla anılacaktır. Aynı şekilde kayıt defterinde de bu değerler yer alır.

 

Son olarak iki seçeneği de aktif hale getiriyoruz.

 

 

Ve karşımıza şu ana kadar geçtiğimiz adımların yer aldığı liste geliyor ve kontrol ediyoruz herhangi bir hata var mı diye. Eğer hiçbir hata göremiyorsak. Finish tuşuna basıp programlama adımına geçiyoruz.

 

Karşımıza ilk olarak connect.vb class ımız geldi. Bu classımıza Office çekirdeğini eklememiz gerekiyor ki add-in için bir buton ekleyebilelim.

 

imports Extensibility

imports System.Runtime.InteropServices

Imports Microsoft.Office.Core

 

Görüldüğü üzere tüm eventlar Connect class ı içinde yaratılmış. Tek yapmamız gereken bu eventların içini doldurmak ve ilgili kütüphaneleri class ımıza eklemek.

 

Bir buton eklemek için clasımız içerisine Dim WithEvents MyButton As CommandBarButton

şeklinde MyButton adlı butonumuzu tanıtmalıyız.

 

Excel sayfaları ve hücreleri içerisinde işlem yapabilmek için ise Microsoft Excel 11.0 Object Library yi referans olarak eklememiz gerekiyor. Solution Explorer ı açıyoruz, MyAddin projemizin üstünde sağ tıklayıp Microsoft Excel 11.0 Object Library kütüphanesini seçip ok e basıyoruz. Ve daha sonra Excel kütüphanesini projemize import ediyoruz.

 

imports Extensibility

imports System.Runtime.InteropServices

Imports Microsoft.Office.Core

Imports Excel

 

Classımızın üst kısmı bu şekilde olmalı.

 

Kütüphanelerimizi ekledikten sonra artık işin programlama kısmına geçebiliriz.

 

Ben sayfa ve hücreler içinde işlem yapmak istediğim için Dim sayfa As Worksheet şeklinde sayfa adında bir worksheet ve uygulama içinse Dim yeni As Application şeklinde yeni adında bir application tanımlıyorum.

 

Karşımda ilk olarak OnBeginShutDown eventı duruyor. Yukarıda size bu eventları anlatmıştım.

 

Public Sub OnBeginShutdown(ByRef custom As System.Array) Implements _Extensibility.IDTExtensibility2.OnBeginShutdown

        MyButton.Delete()

        MyButton = Nothing

End Sub

 

add-inimiz sonlandırıldığında benim hazırlamış olduğum butonun silinmesini ve içinin boşaltılmasını istiyorum ki hafızada herhangi bir şey kalmasın ve tekrar excel sayfası açıldığında hata vermesin.

 

Update kısmına hiçbir şey istemiyorum.

 

Artık add-inimiz yüklendiğinde neler olacak bunları yazabiliriz.

 

  Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete

 

        Dim oCommandBars As CommandBars

        Dim oStandardBar As CommandBar

 

        On Error Resume Next

        " Standart çubuğa düğmemin yüklenmesini istiyorum.

        oCommandBars = applicationObject.CommandBars

        yeni = applicationObject.Workbook

        If oCommandBars Is Nothing Then

            " Eğer herhangi bir command bar yoksa geçerli barı kullanmak istiyoruz

            oCommandBars = applicationObject.ActiveExplorer.CommandBars

        End If

 

        oStandardBar = oCommandBars.Item("Standard")

        If oStandardBar Is Nothing Then

            " eğer standart bar yüklenmemişse Database barına yüklemek istiyorum düğmemi

            oStandardBar = oCommandBars.Item("Database")

        End If

 

        MyButton = oStandardBar.Controls.Item("Aktar")

 

        If MyButton Is Nothing Then

 

            MyButton = oStandardBar.Controls.Add(1)

            With MyButton

                .Caption = "Aktar"

                .FaceId = 230

                .Enabled = True

                " Bu değerler opsiyoneldir.

                " Size ayrıca tüm faceid lerin yeraldığı bir dosya sunacağım.

 

                .Tag = "Aktarım"

 

                "Bu kısımda addinimizin connect methodunu çağırıyoruz.

 

                .OnAction = "!"

                .Visible = True

            End With

        End If

End Sub

 

 

 

Görüldüğü üzere Aktarım adında, FaceID (Buton görüntüsü) si 230 olan bir button yarattık şimdi kodumuza devam ediyoruz. Bundan sonraki kısımlarda bağlantı kesildiğinde, butona tıklandığında ve bağlantı sağlandığında ne gibi olaylar işleyecek onu anlatacağım.

 

Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection

 

        On Error Resume Next

        If RemoveMode <> Extensibility.ext_DisconnectMode.ext_dm_HostShutdown Then _

           Call OnBeginShutdown(custom)

        applicationObject = Nothing

 

End Sub

 

 

Public Sub OnConnection(ByVal application As Object, ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection

        applicationObject = application

        addInInstance = addInInst

 

        " Eğer start up gerçekleşmemişse manuel olarak start up ı gerçekleştiriyoruz

        If (connectMode <> Extensibility.ext_ConnectMode.ext_cm_Startup) Then _

           Call OnStartupComplete(custom)

End Sub

 

Connection ve disconnection durumlarını da tanımladık. Şimdi butona tıkladığımızda ne yapmak istiyoruz. MyButton_Click yordamında göstereceğim.

 

Not : Benim kendime ait bir baglantı adında class ım var ve bu class dan bağlantımı gerçekleştiriyorum. Onu da Dim bag As New baglanti şeklinde tanıttım.

 

Private Sub MyButton_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean) Handles MyButton.Click

 

        Dim cmd As SqlClient.SqlCommand

        Dim rdr As SqlClient.SqlDataReader

        Dim j As Integer = 0

        Try

            "sayfa ya geçerli olan Worksheet i aktarıyoruz

            sayfa = CType(Me.applicationObject.ActiveSheet, Worksheet)

            "bağlantımızı gerçekleştiriyoruz

            bag.Bagla()

            cmd = bag.Cmd

            cmd.CommandText = "SELECT B_AdSoyad, B_Bakiye From D_Bakiyeler"

            j = 1

            "1. satırdan başlamak istiyorum j benim satır sayım

            rdr = cmd.ExecuteReader

            While rdr.Read

                "sayfamın 1. satır 1. sütunundan başlayarak işlem yapmak istiyorum

                "ve 1 er sütun arttırarak devam etmek istiyorum.

                "sayfa.Cells(satır, sütun) kullanımı bu şekildedir

                sayfa.Cells(j, 1) = rdr("B_Adsoyad")

                sayfa.Cells(j, 2) = rdr("B_Bakiye")

                j = j + 1

            End While

            "Bağlantımı kesiyorum

            bag.Kes()

        Catch ex As Exception

            MsgBox(ex.Message, MsgBoxStyle.Critical, "Hata")

            bag.Kes()

        End Try

    End Sub

 

Evet butonun yapacağı işleri de burada açıklayarak kod parçacığını verdim. Şimdi tek yapmamız gereken kurulum dosyalarını ayarlamak. Ama burada çok önemli, dikkat etmemiz gereken bir husus var.

 

Microsoft yayınladığı düzeltme paketlerinin birinde add-in leri kullanılamaz hale getirmiştir. Daha sonra tekrar yayınladığı düzeltme paketinde ise bu soruna çare bulmuştur.

 

http://download.microsoft.com/download/b/6/7/b6711d3b-b509-4567-8599-98bf3473310f/vs2005-kb908002-enu-x86.exe öncelikle bu paketi bilgisayarınıza indirin ve kurun.

 

Daha sonra Solution Expolere penceresinde setup projenizin üstüne gelin, sağ tuş properties , prerequisites butonuna basın ve Shared Add-in Support Update for the Microsoft .NET Framework 2.0 (KB908002) ‘ ı işaretleyin.

 

Build menüsünden Build MyAddin Setup ı tıklayın ve setup projenizi oluşturun. Tekrar Solution Explorer penceresinden setup projenizin üstünde sağ tuşa basın ve install ı seçin ve kurulumunuzu gerçekleştirin.

 

Dikkat edeceğimiz son bir adım kaldı. Registry kayıtlarımıza geliyoruz (başlat/çalıştır/regedit).

HKEY_LOCAL_MACHINE / Software / Microsoft / Office / Excel / AddIns / MyAddin.Connect bu kısma gelip LoadBehavior DWORD üne çift tıklıyoruz ve değer verisini 3 yapıyoruz.

 

 

Artık add-in imiz hazır. Büyüterek gösterdiğim buton bizim kendi hazırlamış olduğumuz face id si 230 olan buton

 

Artık sizde kendize ait yeni add-in ler yaratabilir bunları paylaşabilirsiniz.

Döküman Arama

Başlık :

Kapat