Makale Özeti

Bu yazıda Visual Basic ile uygulama geliştiren ve uygulamalarını Visual Basic .NET’e taşımayı düşünen geliştiricilere yardımcı olacağını umduğum bazı noktaları ele alacağız.

Makale

 

Gerek çevremizde, gerek yazgeliştir / forum sayfalarında .NET konusunda en sık karşılaşılan problemlerden biri VB6 ile geliştirilen uygulamaların VB.NET’ e geçişi. Bu yazıda Visual Basic ile uygulama geliştiren ve uygulamalarını Visual Basic .NET’e taşımayı düşünen geliştiricilere yardımcı olacağını umduğum bazı noktaları ele alacağız.

 

Çoğu zaman Visual Basic .NET, Visual Basic 6.0 projelerinizi açacak ve VB.NET’e yükseltecektir (Bildiğiniz gibi vs.net vb6 projelerini vb.net’e yükseltmek için bir araç içermektedir) . Ancak çoğu zaman, özellikle büyük projelerde bu yükseltme işleminden sonra bazı değişiklikler yapmanız gerekecektir. Bu yazının amacı, bu değişiklikleri en az seviyede tutmanıza, gerekli değişikliklikleri en hızlı/kolay şekilde gerçekleştirmenize yardımcı olacak bazı bilgileri iletmek.

 

Visual Basic .NET Nedir?

Arkadaşlarımız VB.NET kategorisi altında bu sorunun cevabını defalarca ve oldukça detaylı bir şekilde verdiler. Ancak bu yazıda da, konu bütünlüğü sağlayabilmek amacıyla kısaca bu konuya değinmemiz gerekiyor.

 

Visual Basic .NET, Visual Basic 6.0’dan sonra çıkmış olan, Visual Basic’in yeni sürümüdür. Ancak VB.NET ile birlikte VB’nin gelişimi, daha önceki üst versiyonlarda yapılanın aksine birkaç yeni özellik eklenmesi ile sınırlı tutulmadı, Microsoft Visual Basic’i, Web uygulamaları, enterprise n-tier sistemler gibi “distributed applications” geliştirme işini, şimdiye dek olmadığı kadar kolay ve hızlı bir hale getirebilmek için baştan sona yeniden inşaa etti. Daha sade bir açıklama ile Microsoft Visual Basic’i, .NET fikri çerçevesinde uygulamaların masaüstü ile sınırlı kalmasına son verecek ve masaüstünü web’e taşımayı kolaylaştıracak şekilde geliştirdi. Visual Basic .NET iki yeni Form paketi ile birlikte geliyor. Windows Forms ve Web Forms. Aynı zamanda verilere ulaşmak için kullandığımız ADO’nun yeni sürümü ADO.NET ve dilin yapısında, verimliliği artırmaya yönelik gerçekleştirilmiş iyileştirmeler, yazım hatalarının denetimi ve giderilmesi konusunda yapılmış yenilikler ve bu paragrafı daha fazla uzatmamak için yazmadığım pek çok yenilik..

 

Yukarıda saydığım veya saymadığım özellikler, Visual Basic geliştiricilerine Web Forms ve ADO.NET kullanarak gelişmiş ve esnek web sitelerini hızlı ve kolay bir şekilde geliştirme imkanı sağlıyor. Kalıtsal özellikler (inheritance) ile visual basic artık tamamen object oriented bir dil halini alıyor.

 

Visual Basic .NET artık diğer Visual Studio .NET dilleri ile tamamen bütünleşmiş durumda. Artık sadece farklı dillerle geliştirilmiş uygulama bileşenleri geliştirmekle sınırlı değilsiniz, kullandığınız sınıflar, cross-inheritance ile farklı dillerle yazılmış sınıfların özelliklerini kullanabiliyor. İçerdiği bütünleşik hata ayıklama aracı ile uygulamaları yazıldığı dilden ve çalıştığı ortamdan (local / remote) bağımsız olarak düzenleyebilirsiniz. Son olarak .NET Framework size, masaüstü ve Internet uygulamaları için bugüne kadar hiçbir dilin sağlamadığı kadar çok API sunar.

 

Visual Basic .NET, önceki sürümlerle neden %100 uyumlu değil?

Visual Basic 6 ve daha önceki dillerde projelerin üst sürüme aktarılması çok büyük bir sorun oluşturmuyordu. Genellikle daha önceden olmayan bazı özellikler eklendiğinden varolan ifadelerde değişiklik yapılması gerekmiyor, böylece yükseltme işleminde programcıya düşen iş yok denebilecek kadar az oluyordu. Ancak Visual Basic .NET’te durum değişiyor. Projelerin yükseltilmesi bazen .NET’e geçişi engelleyebilecek kadar büyük bir sorun halini alabiliyor (ya da öyle görünebiliyor) .

 

Visual Basic .NET’in tasarım aşamasında iki seçenek vardı. Ya eski kod yapısı korunacak ve Visual Basic .NET Framework üzerinde çalışacak, ya da dil baştan aşağı yeniden tasarlanacak böylece .NET Framework’ün tüm özellikleri ve avantajlar kullanılabilecekti. Müşterilerin (kolayca tahmin edilebilecek bazı nedenlerle birlikte) inheritance, threading gibi en çok talep ettikleri özellikleri verebilmek, platforumun özelliklerini bütünüyle kullanabilmek ve Visual Basic dilini Web uygulamaları geliştirilmesinde .NET öncesinde olduğu gibi en sık kullanılan programlama dili olarak tutabilmek amacıyla Microsoft ikinci seçeneği tercih etti ve dili tamamen yeniden inşaa etti.

 

Örnek olarak Windows Forms da yer alan pek çok yeni özellik mevcut kod yapısına yeni kontroller veya özellikler olarak eklenebilirdi. Ancak bu dili, visual inheritance ve güvenlik başta olmak üzere  Windows Forums un pek çok özelliğinden mahrum bırakırdı.

 

En önemli hedeflerden biri Visual Basic ile yazılmış kodların, Visual C# veya Visual C++ ile yazılmış olan kodlar ile tamamen uyumlu çalışmasını sağlamak ve Visual Basic geliştiricilerinin .NET Framework’ün gücünden kolayca faydalanabilmelerini sağlamaktı. Visual Basic, fixed-length strings ve non-zero based arrays gibi bazı özellikleri çıkartmak zorunda kalsak da, yine aynı değişken türlerine (variables), dizilere (arrays), kullanıcı tanımlı türlere (user-defined types), sınıflara (classes) ve Visual C++ gibi Common Language Runtime’ı kullanan diğer diller ile aynı arabirime sahip.

 

Visual Basic artık gerçek anlamda object oriented bir dil. GoSub/Return ve DefInt gibi çelişkili veya gereksiz bazı özellikler kaldırıldı.

 

Sonuç olarak karşınızda, önceden olduğu gibi Windows uygulamaları geliştirmek için en kullanışlı araç olmayı sürdürecek, buna ek olarak yeni nesil Web uygulamaları geliştirmek için kullanabileceğiniz en iyi araç olan, tamamen yeniden yaratılmış bir dil var.

 

Visual Basic.NET ‘e Geçiş

Visual Basic.NET, yeni nesil web ve n-tier uygulamaların geliştirilmesi için geleneksel Windows geliştirme modelinde bazı değişiklikler getiriyor. Bu nedenle, önceki Visual Basic sürümleri ile yazdığınız kodların Visual Basic.NET’in gelişmiş özelliklerini kullanabilmesi için bir yükseltme aşamasından geçmesi gerekiyor.

 

Bu yükseltme işlemi, bir Visual Basic 6.0 projesi açtığınız zaman otomatik olarak gerçekleşiyor. Visual Basic.NET Yükseltme Aracı (VB.NET Upgrade Wizard) VB6 projenizi adım adım ilerleyerek VB.NET’e yükseltmenizi sağlıyor ve oluşturulan VB.NET projesini kaydediyor. (Bu işlem sırasında eski projenizde bir değişiklik gerçekleştirilmiyor. Sadece o proje VB.NET ile yeniden oluşturularak kaydediliyor.) Bu işlemin tersi mümkün değildir. Yani VB.NET ile geliştirilmiş bir proje, Visual Basic 6.0 ile açılamaz.

 

Yükseltme işlemi tamamlandığında, Visual Basic 6.0 Formlarınız Windows Forms’a dönüştürülür ve VB 6.0 projenizdeki kodlarınızda ise gerekli syntax değişiklikleri yapılır. Çoğu zaman, özellikle büyük boyutlu projelerde yükseltme işlemi tamamlandıktan sonra bazı düzeltmeler yapmanız gerekir. Bunun nedeni, bazı nesnelerin ve dil özelliklerinin VB.NET’te karşılıklarının olmaması veya var olan karşılığın yükseltme sihirbazının gerekli değişiklikleri gerçekleştiremeyeceği kadar farklı olmasıdır. Tabii yükseltme işleminden sonra, Visual Basic.NET’in avantajlarından yararlanmak için uygulamanızda değişiklikler yapmak isteyebilirsiniz.

 

Örneğin, Windows Forms control anchoring özelliğine sahiptir, böylece Visual Basic 6.0 projenizden Form Resize kodlarınızı çıkartmak isteyebilirsiniz.

 

 


Şekil 1 – VB.NET control anchoring özelliğine sahiptir.

 

Gerekli değişiklikleri gerçekleştirmenize yardımcı olmak amacıyla Visual Basic.NET, yükseltme işlemi tamamlandıktan sonra size bir “upgrade report” sağlar. Böylece hem yükseltme işlemi esnasındaki problemler size bildirilir hem de size değişiklik yapılması gereken ifadeleri size bildiren yorumlar iletir. Bu ifadelerin yeni Task List penceresinde yapılması gerekenler olarak listelenmesi sayesinde ne gibi değişikliklerin yapılması gerektiğini kolayca görebilir, kod penceresinde ilgili bölüme, görevin üzerine çift tıklayarak ulaşabilirsiniz. Upgrade Report da yer alan her görev için size bu kodun neden değiştirilmesi gerektiği ve neler yapmanız gerektiği konularında daha fazla yardım sağlamayı amaçlayan bir “online help” linki yer almaktadır.

 

Bu yazıda yer alan önerileri izleyerek, yükseltme işleminden sonra yapmanız gerekecek değişiklikleri en aza indirebilir, kimi durumlarda sıfıra indirebilirsiniz. Bu öneriler çoğu zaman iyi-programlama alıştırmaları şeklinde olacaktır. Aynı zamanda bu yazıda VB.NET te karşılığı olmayan nesne ve methodların bir listesi ve Visual Basic.NET’e yükseltmeyi düşündüğünüz projelerinizde az kullanılması gereken nesne ve mothodlar ile ilgili de açıklamalar yer alacak.

 

Visual Basic 6.0 ve Visual Basic.NET ile Aynı Anda Çalışmak

Visual Basic.NET VB 6.0 projelerini VB.NET’e yükseltmeyi destekliyor. Eğer daha önceki Visual Basic sürümleri (1-5) ile geliştirdiğiniz bir projeniz varsa, bunu VB.NET’e yükseltmeden önce VB 6.0 ile açmanızı (ActiveX kontrollerini yükseltmeyi seçerek) ve VB 6.0 ile kaydetmenizi öneriyoruz.

 

Şu an bu yazıyı yazdığım bilgisayarda olduğu gibi, Visual Basic 6.0 ve Visual Basic.NET bir bilgisayara aynı anda kurulabilir ve kullanılabilir. Aynı şekilde Visual Basic 6.0 ve Visual Basic.NET ile yazılmış uygulamalarda aynu bilgisayara kurulabilir ve kullanılabilir. Visual Basic.NET ile yazılmış bileşenler (components) Visual Basic’in önceki sürümleri veya farklı programlama dilleri ile yazılmış COM nesneleri ile birlikte çalışabilir. Örnek olarak, Visual Basic 6.0 ile yazılmış bir ActiveX kontrolünü, bir Visual Basic.NET Windows Form u üzerinde kullanabilir, bir Visual Basic 6.0 COM nesnesini bir Visual Basic.NET sınıf kütüphanesinde (class library) kullanabilir veya Visual Basic 6.0 uygulamasından bir Visual Basic.NET kütüphanesine referans verebilirsiniz.

Visual Basic.NET ile compile edilen bileşenlerin, Visual Basic 6.0 ile compile edilmiş bileşenlerden güç farkedilen bazı çalışma zamanı farklılıkları vardır. Örneğin VB.NET nesneleri, nesnelerin yokedilmelerinin ardından hafızadan kaldırılmalarısı öncesinde oluşabilecek lag’ı önleyen garbage collection ile yürütülür (bu cümle pek doğru olmadı. Umarım kastedileni anlatabiliyordur). Buna ek olarak ileride açıklayacağımız variant/object değişiklikleri gibi pek çok değişiklik vardır. Bütün bu değişikliklerin ortak sonucu olarak Visual Basic.NET uygulamaları, Visual Basic 6.0 uygulamaları ile benzer fakat tamamen aynı olmayan çalışma zamanı özelliklerine sahiptir.

 

Bileşenler önceden hiç olmadığı kadar güçlü sürümlendirme ve yayınlama sistemine sahipler. Dosyalar artık sadece bir klasöre kopyalanarak yayınlanabilirler (no more RegSvr32) ve bir bileşeni yeni sürümü ile değiştirmek için yapmanız gereken tek şey yeni dosyayı eskisinin yerine kopyalamak. Yapmanız gereken tek şey sınıf ve methodların önceki versiyon ile uyumlu olmalarını sağlamak.

 

Mimari Öneriler

.NET Framework kendisinden önceki mimariyi büyük oranda geliştirerek, distrubuted-applications, veri erişimi, http-tabanlı mesaj transferi ve dosya kopyalamaya dayanan (bileşen) yayınlama (bileşenleri kayıt etmeye gerek kalmadan) konularında daha fazla destek sağlar.

 

Browser Tabanlı Uygulamalar

Visual Basic 6.0 ve Visual Studio 6.0, browser tabanlı uygulamaların geliştirilmesine yönelik pek çok imkan sağlıyordu:

  • Web Sınıfları (webclasses)
  • DHTL Projeeri
  • ActiveX Dokumanları
  • Active Server Pages (ASP)

Visual Basic.NET, ASP’nin geliştirilmiş bir sürümü olan ASP.NET’i sunar ve Visual Basic olayları (events) içeren HTML dosyaları olan Web Forms mimarisini getirir. Mimari sunucu tabanlıdır.

 

Aşağıdaki liste, Visual Basic 6.0 ile sorunsuzca Visual Basic.NET’e yükseltilebilecek browser tabanlı uygulamalar geliştirebilmeniz için bazı tavsiyelerden ve mimari önerilerden oluşmaktadır:

 

  • DHTML uygulamaları DHTML sayfalarını ve Client-Side DLL leri içerir. Bu uygulamalar otomatik olarak Visual Basic.NET’e yükseltilemezler. Size bu uygulamaları Visual Basic 6.0’da bırakmanızı öneririz.

 

  • ActiveX dokumanları Visual Basic.NET tarafından desteklenmemektedirler ve DHTML projeleri gibi otomatik olarak yükseltilememektedirler. Size önerimiz ActiveX dokumanlarını da Visual Basic 6.0 da bırakmanız veya mümkünse bunları “user control”ler ile değiştirmeniz.

 

  • Visual Basic 6.0 ActiveX dokumanları ve DHTML uygulamaları, Visual Basic.NET teknolojileri ile uyumlu olarak çalışabilirler. Örneğin, bir Visual Basic.NET Web Form dan, bir Visual Basic 6.0 DHTML sayfasına geçiş yapabilirsiniz.. ve benzeri işlemleri.

 

  • WebClass lar Visual Basic.NET’te yer almıyor. WebClass uygulamaları ASP.NET’e yükseltileceklerdir ancak upgrade işleminden sonra bazı değişiklikler yapmanız gerekecektir. Önceki WebClass uygulamaları, Visual Basic.NET Web Forms ve ASP uygulamaları ile uyumlu olarak çalışabilirler ancak yeni projeler için size ASP - Windows DNA Platformunu (Visual Basic 6.0 business nesnelerini içeren) kullanmanızı öneririz.

 

Microsoft multi-tier mimarisi ile uygulama geliştirme konusunda daha fazla bilgi için http://www.microsoft.com/dna/ adresine gözatın.

Client/Server Projeleri

Visual Basic 6.0 client/server uygulamaları geliştirebilmek için pek çok teknoloji sunmuştu:

  • Visual Basic Forms
  • Microsoft Transaction Server (MTS)/COM+ middle-tier nesneleri
  • User Controls

Visual Basic.NET ile birlikte yeni bir form sınıfı geliyor: Windows Forms. Windows Forms, Visual Basic 6.0 formlarından daha farklı bir nesne modeline sahip fakat Windows Forms ve Visual Basic 6.0 Forms büyük oranda uyumlular. Proje yükseltme işlemi esnasında Visual Basic Formlarınız Windows Forms a dönüştürülecektir.

 

Visual Basic.NET, middle-tier MTS ve COM+ component service bileşenleri geliştirme konusunda daha fazla destek sağlar. Bütünleşik debugger ı kullanarak bir istemci uygulamadan MTS/COM+ bileşenlerine ulaşabilirsiniz.

 

Visual Basic bize yeni bir middle-tier bileşen sunuyor: WebServices (web servisleri). Web Servisleri ASP.NET ile sunulup, istemlerin firewall lardan sorunsuzca geçmesini sağlayan http iletişim methodunu kullanıyor. WebServisleri veriyi, diğer dil ve platformların kolayca ve sorunsuzca erişebilmesi için endüstri standartı olan XML şeklinde iletir. MTS işlemlerini desteklemedikleri halde, distributed işlemlere (transactions) ihtiyaç duymadığınız ancak diğer platformlarla kolayca ve uyumlu bir şekilde çalışmak istemeniz halinde, MTS/COM+ bileşenlerinizi Web Servislerine dönüştürmek isteyebilirsiniz. Bu işlem için bir otomatik yükseltme yöntemi olmadığı halde, projenizin yükseltme işlemi tamamlandıktan sonra sadece basit birkaç sürükle ve bırak işlemi ile birkaç dakika içinde gerçekleştireilirsiniz.

 

Projeniz Visual Basic.NET’e yükseltildiğinde, user control’leriniz de Windows Controls’e yükseltilecektir ancak Özelleştirilmiş Özellik Etiken Seçenekleri ve “Accelerator Keys Assignments” yükseltilmeyecektir.

 

Single-tier Uygulamalar

Visual Basic 6.0 ile pek çok single-tier uygulama geliştirilebiliyor.

  • Single-tier veritabanı uygulamaları
  • Visual Basic add-ins
  • Utility programları ve Oyunlar

Single-tier veritabanı uygulamaları, Visual Basic uygulamalarının verileri Access veritabanında tutmasının tipik bir örneğidir. Bu uygulamalar Visual Basic.NET’e, ileride Veri başlığı altında inceleyeceğimiz bazı kısıtlamalarla yükseltilmektedir.

 

Artık Visual Basic.NET IDE si, Visual Studio.NET IDE si ile bütünleşmiş bir halde ve dilden bağımsız bir genişleme modeline sahip. Visual Basic.NET add-in leri artık, Visual Studio.NET add-in leri böylece Visual Basic.NET ile birlikte diğer tüm Visual Studio.NET dillerinide otomatize edebilir, özellikler ekleyebilirsiniz. Yani artık kullandığınız bir add-in, diğer tüm Visual Studio.NET dilleri için geçerli olacak. Bu özelliği sağlamak için Visual Basic.NET in önceki genişleme modeli tamamen değiştirildi ve bu yeni özelliklerin sağladığı avantajları uygulamalarınızda kullanabilmeniz için önceden kullandığınız genişletilebilirlik nesnelerinizi değiştirmeniz gerekiyor.

 

Pek çok uygulama Utility kategorisine giriyor. Utility uygulamaları, dosyaları, registry ayarlarını kendi amaçları doğrultusunda beceriyle kullanabiliyorlar ve ek bir değişikliğe ihtiyaç olmadan yükseltilebiliyorlar. Yükseltme işleminden sonra faydalanmak isteyebileceğiniz pek çok yeni özellik mevcut. Örneğin registry’i yönetmek için .NET Framework’ün sunduğu Registry sınıflarını gösterebiliriz. Bu uygulamalarda dikkat etmeniz gereken bir nokta, arcade oyunlar gibi bazı uygulamaların Visual Basic 6.0’ın spesifik performans karakteristiğine bel bağlamış olmaları. Bu tür uygulamalarda büyük ihtimalle Visual Basic.NET’e yükseltme işleminden sonra, Visual Basic.NET’in Visual Basic 6.0’a göre dafa farklı performans karakteristine sahip olmasından dolayı, birtakım değişiklikler yapmanız gerekecektir. Visual Basic.NET’te oyunlar için DirectX 7’yi veya GDI’ın yeni sürümünü kullanabilirsiniz. GDI+, tüm 2-D grafik işlemleri için Alpha Blending desteği ve genişletilmiş grafik dosya formatı desteği gibi pek çok yeni özellikle birlikte geliyor.

 

Veri

Visual Basic 6.0’da veriye üç farklı yoldan erişebiliyorduk:

  • ActiveX Data Objects (ADO)
  • Remote Data Objects (RDO)
  • Data Access Objects (DAO)

Visual Basic.NET size ADO’nun geliştirilmiş sürümü olan ADO.NET’i sunar. ADO:NET disconnected veriye erişimi sağlar ve distributed uygulamalarda ADO’ya nazaran büyük performans kazancı sağlar. ADO:NET, Windows Forms için read/write veri erişimi, Web Forms için ise read-only veri erişimi sağlar.

 

DAO, RDO ve ADO, Visual Basic.NET ile birkaç önemsiz modifikasyon ile hala kullanılabilmektedir. Ancak Visual Basic.NET, kontrollere DAO ve RDO ile veri aktarımını, data kontrollerini ve RDO user-connection ı desteklemez. DAO ve RDO kullandığınız uygulamalarınız ile ilgili size önerimiz bu projeleri Visual Basic 6.0’da bırakmanız veya DAO ve RDO kullandığınız bölümleri yükseltme işlemi öncesinde, Windows Forms tarafından desteklenen ADO’ya çevirmeniz. Bu dönüştürme işleminin nasıl yapılacağına dair detaylı bilgi, Visual Basic 6.0 Yardım Dokumantasyonunda mevcuttur.

 

Özet olarak, Visual Basic.NET’e yükseltmeyi düşündüğünüz (veya düşünmediğiniz) Visual Basic uygulamalarınızda ADO kullanmanızı öneririz.

 

Yükseltme

Kodlarınızın yükseltme işlemi bittiğinde, Visual Basic.NET yükseltilmiş kodlardan oluşan yeni bir proje oluşturur ve gerekli dil ve nesne değişikliklerinin büyük kısmını gerçekleştirir. Aşağıdaki bölümler, Visual Basic 6.0 kodlarınızın yükseltilmesi ile ilgili bazı açıklama ve örnekleri içermekte.

 

Variant à Object

Visual Basic’in önceki versiyonları fixed-lenght strings dışındaki tüm veri türleri yerine kullanılabilen Variant veri türünü destekliyorlardı. Visual Basic.NET’te Variant ve Object türlerinin tüm özellikleri tek bir veri türünde birleştirildi: Object. Object türü tüm veri türleri yerine, empty, nothing ve bir Object için pointer olarak kullanılabilir.

 

Projeniz Visual Basic.NET’e yükseltildiğinde, Variant olarak deklare edilmiş tüm değişlenleriniz Object olarak değiştirileceklerdir. Aynı zamanda kod, editöre aktarıldığında Variant keywordude Object ile değiştirilecektir.

 

Integer à String

Visual Basic 6.0’da 16-bitlik tamsayılar için kullanılan veri türü Visual Basic.NET’te Short, 32-bitlik tamsayılar ise Integer (Long artık 64-Bit). Projeniz yükseltildiğinde değişiklikler aşağıdaki gibi olacaktır.

 

Dim x As Integer            =>        Dim x As Short

Dim y As Long                =>        Dim y As Integer

 

Property Sözdizimi

Property ifadeleriniz, yükseltme işleminde aşağıdaki örnekteki gibi değiştirileceklerdir.

 

Property Get MyProperty() As Integer

            M_MyProperty = MyProperty

End Property

Property Let MyProperty(NewValue As Integer)

            M_MyProperty = MewValue

End Property

 

Yükseltildiğinde aşağıdaki gibi olacaktır.

 

Property MyProperty() As Short

            Get

                        M_MyProperty = NewValue

            End Get

            Set

                        M_MyProperty = Value

            End Set

End Property

 

Visual Basic Forms à Windows Forms

Visual Basic.NET yeni form paketi, erişilebilirlik ve in-place menu editörüne sahip olan Windows Forms’a sahiptir. Önceki Visual Basic Formlarınız Windows Forms’a dönüştürüleceklerdir.


Şekil 2 – Windows Forms in-place Menü Editörü

Arabirimler

Visual Basic in önceki versiyonlarında public sınıfların arabirimleri kullanıcıdan gizlenmiş durumdaydı. Visual Basic.NET’te bu sınıflar görüntülenebilir ve kod editörü aracılığıyla düzenlenebilirler. Projenizin yükseltilmesi sırasında, public sınıflar için gerekli arabirim deklarasyonları otomatik olarak oluşturulacaktır.

 

Upgrade Rapor ve Yorumları (Comments)

Projenizin yükseltme işlemi tamamlandığında oluşturulacak yeni .NET projenize, yapmanız gereken tüm değişiklikleri ayrıntılarıyla belirten bir upgrade raporu eklenecektir. Bu rapora ek olarak sizi olası problemlere karşı önceden uyaran bazı yorumlar eklenecektir (gerekmesi halinde). Bu yorumlar Visual Studio.NET TaskList’te görüntüleneceklerdir.


Şekil 3 – Yükseltme Yorumları visual basic kodlarına ve TaskList’e eklenecektir.

 

Programlama Önerileri

Bu bölüm, Visual Basic.NET’e yükseltme sonrasında yapmanız gerekecek değişiklikleri en aza indirmek için nasıl kodlama yapmanız gerektiği konusunda size öneriler içermektedir.

 

Early-Binding Kullanın

Hem Visual Basic 6.0, hem de Visual Basic.NET late-bound nesneleri desteklemektedirler. Ancak bazen late-bound objects, yükseltme işlemi esnasında varsayılan özelliklerin çözülmesi aşamasında veya nesne modeli değiştiğinde ve özelliklerin, methodların ve eventlerin dönüştürülmesi gerektiğinde problemlere neden olabiliyorlar. Örneğin, üzerinde Label1 adlı bir labela sahip olan Form1 adlı bir formunuz olduğunu varsayın; aşağıdaki kod Labelın değerini “YazGelistir” olarak değiştirecektir.

 

Dim o As Object

Set o = Me.Label1

o.Caption = “YazGelistir”

 

Visual Basic.NET’te, label kontrolünün Caption özelliği “text” olarak değişmiş durumda. Kodunuz yükseltilirken tüm Caption özellikleri Text olarak değiştirileceklerdir, ancak bir late-bound nesne, type-less olduğundan, Visual Basic bu object’in türünü veya değiştirilmesi gereken herhangi bir özellik olup olmadığını tesbit edemeyecek ve kodu yükseltme işlemi sonrasında sizin değiştirmeniz gerekecektir.

 

Eğer kodu early-bound objects kullanarak yazarsanız, kodunuz kendiliğinden yükseltilecektir:

 

Dim o As Label

Set o = Me.Label1

o.Caption = “YazGelistir”

 

Visual Basic 6.0 kodunuzda Object ve Variant değişkenler kullandığınız durumlarda, değişlenleri atadığınızda, değişkenler üzerinde işlemler yaptığınızda veya değişkenleri bir fonksiyona ilettiğinizde size belirgin türler kullanmanızı öneririz. Bir örnekle açıklayalım: Aşağıdaki kodda kullandığımız ‘+’ işaretinin işlevi bellli değil.

 

Dim Var1 As Variant

Dim Var2 As Variant

Dim Var3 As Variant

Var1 = “3”

Var2 = 4

Var3 = Var1 + Var2        ‘Sorun: Amaç ne, belli değil..

Var1 ve Var2 string olarak mı, integer olarak mı kullanılmak isteniyor?

 

Yukarıdaki örnekteki kod, Visual Basic.NET’te bir run-time hatasına neden olabilir. Şimdi kodun sorunsuz olarak çalışmasını sağlamak amacıyla net ifadeler (explicit conversion) kullanarak kodun son bölümünü tekrar yazalım:

Var3 ) Cınt(Var1) + Cınt(Var2)                 ‘Doğru: Net ifadeler.

 

Visual Basic.NET parametre türüne dayalı overloading işlemlerini ( overloading functions) destekler. Örneğin, Environ fonksiyonunun artık iki biçimi var:

Environ(Expression As Integer) As String

Environ(Expression As String) As String

 

Visual Basic.NET, parametre türüne göre hangi fonksiyonun kullanılacağına karar verir: Eğer bir integeri Environ() a aktarırsanız, integer türü kullanılır, eğer bir string aktarırsanız, string türü kullanılır. Variant veya Object türü aktaran kodlar bir çalışma zamanı veya compile hatasına neden olabilirler. Aşağıdaki örnekte olduğu gibi net ifadeler kullanarak kodunuzun Visual Basic.NET’e geçtikten sonra da planladığınız gibi çalışmasını sağlayacaktır.

 

Dim a As String

Dim y As Variant

V = “Path”

A = Environ(CStr(v))                   ‘Net ifadeler

 

Net ifadeler kullanmak  projenizi Visual Basic.NET’e taşımanızı her zaman kolaylaştıracaktır.

 

Tarihleri saklamak için Date türünü kullanın

Visual Basic’in önceki sürümleri tarih bilgilerini saklamak ve kullanmak için Double veri türünün kullanımını destekliyordu ancak bunu Visual Basic.NET’te yapmamalısınız çünkü tarih bilgileri artık Double türünde olduğu gibi dahili olarak saklanmıyorlar. Örnek olarak aşağıdaki kod Visual Basic 6.0 için doğrudur ancak Visual Basic.NET’te kullanıldığında bir compile hatası verecektir.

 

Dim dbl As Double

Dim dat As Date

Dat = Now

Dbl = dat                                   ‘HATA: Double türü, bir tarih değerine atanamaz.

Dbl = DateAdd(“d”, 1, dbl)           ‘HATA: Double türü, tarih fonksiyonlarında kullanılamaz.

Dat = CDate(dbl)                        ‘HATA: CDate Double türündeki bir veriyi tarihe çeviremez.

 

.NET Framework, tarih ve double türleri arasında dönüşüm yapabilmek için ToOADate ve FromOADate fonksiyonlarını sunar. Kodunuzun Visual Basic.NET’e yükseltilmesi esnasında, tarih bilgilerini saklamak amacıyla kullanılan Double türlerinin, ne amaçla kullanıldığının tesbit edilmesi güç olacaktır. Kolayca önlenebilecek bu problemle hiç karşılaşmamak ve yükseltme işlemi sonra gereksiz kod değişiklikleri ile zaman kaybetmemek için tarih değerlerini saklamak için her zaman Date türünü kullanın.

 

BOOLEAN ve AND/OR/NOT

AND ve OR ifadeleri, Visual Basic.NET’te Visual Basic 6.0’dakinden farklı çalışırlar. Visual Basic 6.0’da AND kelimesi mantıksal bir AND işlevi görür, operandların türüne göre Bitwise AND işlvi de görebilir. Visual Basic.NET’te ise AND kelimesi sadece mantılsak bir AND işlevi görür. Visual Basic.NET’te Bitwise işlemler için bazı yeni operandlar eklenmiştir: BitAnd, BitOr ve BitXor.

 

Aşağıdaki örnek, bahsettiğim farklılıkları açıklıyor:

 

Dim a As Integer

Dim h As Integer

Dim c As Boolean

 

a = 1

b = 2

c = a And b

MsgBox (“Sonuç ” & c)

 

Bu kod Visual Basic 6.0’da çalıştırıldığında sonuç False (BitWise AND) olacaktır ancak Visual Basic.NET’te ise True (Logical AND) olacaktır. Bu kodun yükseltme sonrasında da aynı işlevi görmesini sağlamak için Visual Basic.NET Visual Basic 6.0 ile uyumluluk sağlayacak bazı fonksiyonlar içermektedir. Visual Basic.NET; Visual Basic 6.0’daki AND/OR/NOT fonksiyonları ile aynı işlevi gören (operandlara bağlı olarak logical veya Bitwise)  “VB6.And”, “VB6.Or” ve “VB6.Not” fonksiyonlarını içermektedir. Yukarıdaki kod yükseltildiğinde sonuç aşağıdakine yakın olacaktır.

 

Dim a As Short

Dim b As Short

Dim c As Boolean

a = 1

b = 2

c = VB6.And(a, b)

Msgbox (“Sonuç ” & c)

 

Yükseltilmiş kodun vereceği sonuç da, Visual Basic 6.0 kodunun verdiği sonuç gibi False tur.

Kodunuzun yükseltilmesi esnasında uyumluluk fonksiyonlarının kullanılmasını önlemek için AND/OR/NOT ifadelerinizin Boolean karşılaştırmalar kullanmasına dikkat edin. Örneğin yukarıdaki örnek aşağıdaki gibi değiştirilirse:

 

Dim a As Integer

Dim b As Integer

Dim c As Boolean

 

a = 1

b = 2

c = a <> 0 And b <> 0

MsgBox (“Sonuç: ” & c)

 

Yükseltme sonrası kodumuz aşağıdaki gibi değişecektir:

 

Dim a As Short

Dim b As Short

Dim c As Boolean

 

a = 1

b = 2

c = a <> 0 And b <> 0

MsgBox (“Sonuç: ” & c)

 

Buradaki fark, her operatörün Boolean ifadeler olarak karşılaştırılmasıdır. Bu nedenle Visual Basic 6.0da bu kod logical AND kullanır. Logical And, Visual Basic 6.0’da ve Visual Basic.NET’te aynı sonucu verir bu nedenle kod değiştirilmemiştir. Bu, Visual Basic 6.0 kodlarınızı kopyala-yapıştır yöntemi ile Visual Basic.NET’e taşıyabileceğiniz anlamına geliyor. Aynı zamanda uyumluluk fonksiyonları yerine doğal AND operatörünü kullandığınız için kodlarınız Visual Basic.NET’te daha hızlı çalışacaktır.

 

Visual Basic.NET, AND/OR/NOT işlemlerindeki fonksiyonları Visual Basic 6.0’dan daha farklı bir şekilde kullanır. Aşağıdaki örneği inceleyin:

 

Dim b As Boolean

B = Function1() And Function2()

 

Visual Basic 6.0’da, her iki fonksiyonda değerlendirilirdi. Visual Basic.NET’te ise function1 True değerini alır ve sadece function2 değerlendirilir. Bu mantıksal operatörlerde short-circuiting olarak adlandırılır. Tek fark, çoğu zaman çalışma esnasında, short circiuted versiyonlar daha hızlı çalışır ancak function2 nin, veritabanı yönetimi veya global değişken gibi görevleri varsa, ifade, Visual Basic 6.0’dan daha farklı çalışma zamanı davranışları gösterecektir. Bu problemi önlemek için, AND/OR/NOT ifadeleriniz fonksiyonlar, mothodlar veya propert ler içeriyorsa, kodunuz yükseltilirken bu kısımlar aynı görevi icra edecek uyumluluk fonksiyonlarını kullanacak şekilde değiştirilir. Bir örnek verelim:

 

Dim b As Boolean

b = VB6.AND(Function1(), Function2())

 

Kodunuzun yükseltme işlemi esnasında uyumluluk fonksiyonlarını kullanacak şekilde değiştirilmesini önlemek için aşağıdaki değişiklikleri yapın:

 

Dim b As Boolean

Dim c As Boolean

Dim d As Boolean

 

c = Function1()

d = Function2()

e = c And d

Dikkat etmeniz gereken bir diğer nokta ise, Visual Basic.NET’te, TRUE değerinin geriplandaki değerinin -1 den 1 e değiştirildiğidir. Bu değişiklik, Visual Basic uygulamalarının diğer .NET dilleri ile birarada, uyumlu bir şekilde çalışmasını sağlamak amacıyla yapılmıştır ve bu değişiklik nihayet, Visual C++ ile Visual Basic arasındaki bir eşitsizliği çözmüş oluyor. Bu değişiklik nedeniyle, Visual Basic 6.0 uygulamalarınızda -1 yerine True sabitini, Boolean değerleri tutmak içinde Integer türü yerine Boolean türünü kullanmanız gerekiyor. Bu konunun önemini daha iyi anlatabilmek için Visual Basic 6.0’da TRUE, Visual Basic.NET’te ise False değerini veren bir örnek verelim:

 

Dim i As Integer

i = True

 

if i = -1 Then

            MsgBox (“True”)

Else

            MsgBox (“False”)

End If

 

Bu kodu Boolean türünü kullanacak şekilde değiştirirsek hem kodumuzun Visual Basic 6.0 ve Visual Basic.NET’te aynı sonucu vermesini hem de daha kolay okunabilir hale gelmesini sağlamış oluruz. Yapalım hemen:

 

Dim i As Boolean

 

i = True

 

If i = True Then

            MsgBox (“True”)

Else

            MsgBox (“False”)

End If

 

Bu örnekten öğrenmemiz gereken ve unutmamamız gereken en önemli şeyler:

  • 0 ve -1 değerleri yerine her zaman True ve False sabitlerini kullanmamız gerekiyor.
  • Boolean değerleri saklamak için her zaman Boolean veri türünü kullanmamız gerekiyor.

Eğer bunları yapmazsanız, programınızı cadılar yer. Cadılar yemese bile yükseltme işleminden sonra çok sayıda değişiklik yapmanız gerekir.

 

Avoid Null Propagation

Visual Basic’in önceki versiyonları Null-propagation ı destekliyordu. Null propagation: bir ifadede Null kullanıldığı zaman, ifadenin sonucu Null olacaktır. Bunu bir örnek ile açıklayalım: aşağıdaki kodda, V nin değeri her zaman Null olacaktır.

 

Dim V

V = 1 + Null

V = Null + RightĤ(“YazGelistir”, 1)

V = Right(“YazGelistir”, 0)

 

Null propagation Visual Basic.NET’te de destekleniyor. 1+Null ifadesi, Visual Basic.NET’te tür uyuşmazlığına (type mismatch) neden olacaktır.Ek olarak, Visual Basic 6.0’da left fonksiyonunun; Left$ à String, Left à Null değeri alabilen Variant olmak üzere iki versiyonu varken, Visual Basic.NET bu iki fonksiyondan sadece String türünde dönen versiyonuna sahiptir.

 

Hem Visual Basic 6.0, hem de Visual Basic.NET ile uyumlu olması için Null propagation a güvenmek yerine, Null için test kodları yazmanız gerekir.  Bunlara ek olarak, aşağıdaki fonksiyonlar Visual Basic.NET’ten itibaren Null olarak geri dönmeyeceklerdir.

 

Chr

Mid

Command

Oct

CurDir

Right

Date

RTrim

Environ

Space

Error

Str

Hex

Time

LCase

Trim

LTrim

UCase

 

Null propagation genel olarak, herhangi bir alanın (field) Null içerip içermediğini denetlemeniz gereken veritabanı uygulamalarında kullanılır. Bu gibi durumlarda IsNull() fonksiyonunu kullanarak sonucu denetlemeniz ve uygun eylemi gerçekleştirmeniz gerekir.

 

Zero Bound Dizileri Kullanın (Zero Bound Arrays)

Visual Basic 6.0, dizileri bir tam sayının alt veya üst sınırları ile tanımlamanıza izin veriyordu. Aynı zamanda bir variant ı dizi olarak atamak için ReDim ifadesini kullanabiliyorduk. Diğer dillerle uyumlu çalışabilmek için Visual Basic.NET’te dizilerin alt sınırı artık sıfır olarak belirlenmelidir. Aynı zamanda değişken önceden Dim As Array şeklinde deklare edilmediği sürece ReDim ifadesi kullanılamaz. Bu dizilerin tanımlanmasını bir ölçüde sınırlıyor olsa da, Visual Basic.NET’teki bir diziyi, herhangi bir diğer .NET dilinde kullanmanıza izin veriyor. Bir örnek verelim:

 

Dim a(1 To 10) As Integer                       ‘Hata: Lbound 0 olmalı

Dim v

ReDim v(10)                                          ‘Hata: Dim kullanılmadan Redim kullanılamaz.

Dim b(10) As Integer                              ‘OK: 10 Integerden oluşan bir Dizi oluşturur.

ReDim b(5) As Integer                            ‘OK: Dim ile Daha önceden tanımlanmış değişken Redim ile yeniden deklare edilebilir.

 

Ek olarak, Visual Basic 6.0’da Dim (0 To 10) As Integer ifadesi, 11 adet Integerden oluşan 0 dan 10a kadar olan (0,1,2,3,4,5,6,7,8,9,10) bir dizi oluşturuyordu. Aynı ifade Visual Basic.NET’te 10 Integerden oluşan bir dizi oluşturur. Sıfırdan dokuza kadar (0,1,2,3,4,5,6,7,8,9).

 

Option Base 0|1, dilden çıkartılmıştır.

 

Projeniz yükseltilirken, option base ifadeleri kodunuzdan çıkartılır. Eğer dizi zero-bound ise değiştirilmez ancak değilse, aşağıdaki örnekte olduğu gibi bir array wrapper class a yükseltilir.

 

Dim a(1 To 10) As Integer

 

Değişiklikler:

 

Dim a As Object = New VB6.Array(GetType(Short), 1, 10)

 

Array wrapper class, native array den dafa yavaştır ve iki dizi türünü aynı uygulamada kullanma konusunda bazı kısıtlamalara sahiptir. Örnek olarak: bir wrapper array i, Visual C# veya Visual C++ sınıfına aktaramazsınız.

 

Bu nedenle Visual Basic 6.0 kodlarınızda dizi deklarasyonunda ReDim ve option Base 1 kullanımından kaçınarak, zero-bound diziler kullanmalısınız.

 

Underlying Değerler yerine Sabitleri kullanın

Kod yazarken, sabitlerin underlying değerleri yerine kendilerini kullanın. Örneğin bir formu runtime da maximize ediyorsanız:

 

Me.WindowState = vbMaximized             ‘İyi: Sabit kullanılmış

Şeklinde kod yazmayı,

 

Me.WindowStyle = 2                                          ‘Kötü: Underlying değer

Me.WindowStyle = x                                           ‘Kötü: Değişken

 

Şeklinde kodlara tercih edin. (Burada Doğru, yanlış kelimeleri yerine iyi, kötü kelimelerini kullanmamın nedeni, tercih edilmemesine rağmen diğer kullanım şekillerininde fonksiyonel olması)

 

Visual Basic.NET’te, bazı özellik ve sabitlerin değerleri, bazılarınınsa adları değişti. Örneğin True sabitinin değeri -1 iken 1 oldu. Projeniz yükseltilirken sabitlerin büyük bölümü sizin için otomatik olarak değiştirilecektir ancak underlying değerler veya değişkenler kullanmanız halinde bazı hallerde kodunuz otomatik olarak yükseltilemez. Sabitleri kullanmak, yükseltme sonrasında yapacağınız değişikliklerin sayısını azaltacaktır.

 

Diziler ve Kullanıcı Tanımlı Türlerde Fixed-Length Stringler

Yapılan değişiklikler sonucunda Visual Basic.NET dizi ve structure ları, diğer .NET dilleri ile tamamen uyumlu hale geldi ve fixed-length string ler artık Visual Basic.NET tarafından desteklenmemektedir. Çoğunlukla bu bir problem değildir çünkü Visual Basic.NET bu konuda, fixed-length string görevi gören bir uyumluluk (compability) sınıfı içermektedir. Şimdi sıra nerde? Evet, bir örnek kod:

 

Dim MyFixedLengthString As String * 100

 

Bu kod yükseltme işlemi sonucunda nasıl bir hal alıyor?..

 

Dim MyFixedLengthString As New VB6.FixedLengthString(100)

 

Bu tür bir seçenek mevcut olsa da, fixed-length string ler, kullanıcı tanımlı türlerde kullanıldığında sorunlara neden oluyorlar. Bu hatanın nedeni, kullanıcı tanımlı tür oluşturulduğunda, fixed-length string sınıfının otomatik olarak oluşturulmamasıdır. Bu probleme ek olarak bir başka problem ise kullanıcı tanımlı türler oluşturulduğunda, fixed-string (arrays) diziler oluşturulamamasıdır.

 

Kodunuz yükseltilirken, fixed-length stringler içeren kullanıcı tanımlı türleriniz veya dizileriniz, size bu fixed-length string veya dizileri, kullanıcı tanımlı türleri kullanmadan önce initialize etmeniz konusunda uyarıda bulunan yorumlar ile işaretleneceklerdir. Bu değişiklikten korunmak için, Visual Basic 6.0’daki kullanıcı tanımlı türlerinizi fixed-length stringler yerine stringler kullanacak şekilde değiştirebilir ve fixed-size diziler yerine uninitialized diziler kullanabilirsiniz. Örnek verelim:

 

Private Type MyType

            MyArray(5) As Integer

            MyFixedLengthString As String * 100

End Type

 

Sub Bar()

            Dim MyVariable As MyType

End Sub

 

Şeklindeki bir kod, şu şekilde değiştirilebilir:

 

Private Type MyType

            MyArray() As Integer

            MyFixedString As String

End Type

 

Sub Bar()

            Dim MyVariable As MyType

            ReDim MyVAriable.MyArray(5) As Integer

            MyVariable.MyFixedString = String$(100, “ “)

End Sub

 

Legacy Özelliklerden Kaçının

Bu özellikler dilden çıkartılmış olduğundan aşağıdaki keyword leri kullanmalısınız.

 

  • Def<type>
  • Computed SoTo/GoSub
  • GoSub/Return
  • Option Base 0|1
  • VarPtr, ObjPtr, StrPtr
  • Lset

 

Bunları daha detaylı olarak inceleyeceğiz ilerideki paragraflarda.

 

Def<type>

Visual Basic’in önceki sürümlerinde bir değişkenler dizisini, kesin (certain) bir tür olarak tanımlamak için DefBool, DefByte, DefInt, DefLng, DefCur, DefSng, DefDbl, DefDec, DefDate, DefStr, DefObj ve DefVar kullanıyorduk. Örneğin:

 

DefInt A-C

 

İle A, B veya C (As Integer) ile başlayan tüm değişkenleri deklare ederdik. Def<type> ifadesi yerine, değişkenleri net olarak deklare etmelisiniz.

 

Computed GoTo/GoSub

Computed GoTo/GoSub ifadeleri, aşağıdaki gibi:

 

On x GoTo 100,200, 300

 

Bu gibi kodlar Visual Basic.NET tarafından desteklenmemektedir. Bunlar yerine If ifadeleri ve Select Case yapıları (construct) kullanmalısınız.

 

GoSub/Return

GoSub ve Return ifadeleri Visual Basic.NET’te desteklenmemektedir. Çoğu zaman bunları fonksiyon ve prosedürlerle değiştirebilirsiniz.

 

Option Base 0|1

Bir dizinin alt sınırını (lower bound) belirtmek için Option Base 0|1 kullanıyorduk. Önceki paragraflardan bazılarında üzerinde durduğumuz gibi bu ifade Visual Basic.NET’ten kaldırılmıştır. Visual Basic.NET’te dizilerin alt sınırı sadece 0 (sıfır) olabiliyor. Sıfır olmayan alt sınırlı diziler, bir wrapper class aracılığı ile desteklenmektedir.

 

VarPtr, ObjPtr, StrPtr

VarPtr, VarPrtArray, VarPtrStringArray, ObjPtr ve StrPtr fonksiyonları değişkenlerin memory adreslerini edinmemizi sağlayan belgelenmemiş fonksiyonlardır. Bu fonksiyonlar Visual Basic.NET tarafından desteklenmemektedirler (yerlerine yeni belgelenmemiş fonksiyonlar eklenmiştir J )

 

LSet

Visual Basic 6.0’da LSet ifadesi, kullanıcı tanımlı bir türün bir değişkenini, farklı bir kullanıcı tanımlı türe değişken olarak atamakta kullanılırdı. Tahmin edebileceğiniz gibi bu ifade de Visual Basic.NET’te desteklenmemektedir.

 

Windows API leri

Kullandığınız çoğu API yi Visual Basic 6.0’daki ile aynı şekilde kullanabilirsiniz. Yapmanız gereken tek şey yükseltme işlemi öncesinde veri türlerinizi bir sonraki cümleyi dikkate alarak gerekli değişiklikleri yapmak. Visual Basic 6.0’daki Long veri türü Visual Basic.NET’te Integer ve Visual Basic 6.0’daki Integer veri türü Visual Basic.NET’te Short veri türü şeklinde değişmiş durumda. Yükseltme sırasında bu değişiklikler sizin için gerçekleştirilecek ve basit API ler Visual Basi 6.0’daki ile aynı şekilde sorunsuzca çalışacaktır. Örnek?..

 

Private Declare Function GetVersion Lib “kernel32” () As Long

 

Function GetVer()

            Dim Ver As Long

            Ver = GetVersion()

            MsgBox (“Kullanılan sistemin versiyonu: ” & Ver)

End Function

 

Şu şekilde değiştirilecektir:

 

Private Declare Function GetVersion Lib “kernel32” () As Integer

 

Function GetVer()

            Dim Ver As Integer

            Ver = GetVersion()

            MsgBox (“Kullanılan sistemin versiyonu: ” & Ver)

End Function

 

Ek olarak numerik veritürü yükseltmeleri konusunda; Visual Basic 6.0 Visual Basic.NET’te desteklenmeyen fixed-length string veri türüne sahipti. Bu tür kodlar fixed-length string wrapper sınıfına yükseltilecektir. Visual Basic 6.0’da çoğu durumda aynı işlemi bir normal string kullanarak da yapabilirsiniz. Örnek..

 

Private Declare Function GetUserName Lib “advapi32.dll” Alias _

“GetUserNameA” (ByVal lpBuffer As String, ByRef nSize As Long) As Long

 

Function GetUser()

            Dim Ret As Long

            Dim UserName As String

            Dim Buffer As String * 25

            Ret = GetUserName(Buffer, 25)

UserName = Left$(Buffer, InStr(Buffer, Chr(0)) – 1)

 

MsgBox (UserName)

 

End Function

 

Bu kodu fixed-lentgh string yerine normal string kullanarak nasıl yazacağımızı inceleyelim:

 

            Dim Buffer As String

            Buffer = String$(25, “ “)

 

Bu kod Visual Basic.NET’e aşağıdaki gibi yükseltilecektir.

 

Declare Function GetUserName Lib “advapi32.dll” Alias _

“GetUserNameA” (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer

 

Function GetUser()

            Dim Ret As Integer

            Dim UserName As String

            Dim Buffer As String

 

            Buffer = New String(Cchar(“ “), 25)

            Ret = GetUserName(Buffer, 25)

            UserName = Left(Buffer, InStr(Buffer, Chr(0)) – 1)

 

MsgBox(UserName)

 

End Function

 

Bazı durumlarda Visual Basic.NET stringlerin API lere geçişini daha iyi yapabilir. Bunu stringlerin ANSI ve UNICODE keywordler ile nasıl aktarılacağınızı kendiniz deklare edene kadar Visual Basic.NET yapmaya devam edecektir.

 

Bazı değişiklikler yapmak isteyebileceğiniz üç sınıf vardır. İlki fixed-length string veya byte arrays içeren kullanıcı tanımlı türleri API lere aktarmak. Kodunuzu değiştirmeniz ve her fixed-length string ve kullanıcı tanımlı türlerdeki byte array lere MarshallAs özniteliğini (System.Runtime.InteropServices den) eklemeniz gerekebilir. İkinci durum: Declare ifadesinde As Any değişken türünün kullanılmasıdır. Bu Visual Basic.NET’te desteklenmez. As Any türü değişkenler, string veya Null olan bir değişkenin aktarımında kullanılır. Bu Visual Basic 6.0 kullanımını API’yi biri long biri string olan iki şeklilde deklare ederek değiştirebilirsiniz. Örneğin GetPrivateProfileString APIsi Any türünde bir parametreye (lpKeyName) sahiptir.

 

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

 

“As Any”yi, deklarasyonu, biri long, diğeri string kabul eden iki farklı ifade kullanacak şekilde değiştirerek kaldırabilirsiniz. Yapalım:

 

Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

 

Private Declare Function GetPrivateProfileStringNullKey Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Long, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

 

API’ye Null değerini aktarmak istediğinizde, GetPrivateProfileStringNullKey şeklindekini kullanmalısınız. Kodu bu şekilde yazmak, fonksiyonu Visual Basic.NET’e yükseltmek için yeterlidir.

 

Değişiklik yapmak isteyebileceğiniz son bölüm: Thread Creation, Windows Subclassing, message queque hooking vb. işlemler yapan API ler. Bu fonksiyonlardan bazıları Visual Basic.NET’te run-time hatalarına neden olabilir. Bu tür API’lerin pek çoğunun Visual Basic.NET’te veya .çNET Framework’te aynı işlemi gerçekleştiren denkleri mevcuttur. Maalesef bu tür API’leri kendiniz değiştirmek zorundasınız.

 

Form ve Kontroller ile ilgili dikkat edilmesi gerekenler

  • Son başlığı yazmış olmanın ve yaklaşık birbuçuk saattir durmadan yazıyor olmanın verdiği rehavetle son başlıktan merhabalar. Windows Forms ile Visual Basic 6.0 Formları arasındaki farkları inceleyeceğiz. Başlayalım:

 

  • Windows Forms, OLE container kontrolünü desteklemez. Bu kontrolün kullanımını, Visual Basic.NET’e yükseltmeyi planladığınız uygulamalarınızda kullanmaktan kaçınmalısınız.

 

  • Windows Forms’da herhangi bir Shape Control yoktur. Yatay ve dikey çizgiler (line) label lara dönüştürülür. Köşegen çizgiler ise yükseltilmez. Bunları kullanmaktan kaçınmalısınız.

 

  • Windows Forms, Form methodları Circle, CLS, Pset, Line ve Point ile ilgili yeni komutlara sahiptir. Visual Basic 6.0 ile aradaki object model farklılığından dolayı bu methodlar yükseltilmezler.

 

  • Timer kontrolündeki Interval özelliğini 0 olarak ayarlamak timer’ı disable etmez.  Visual Basic 6.0 projelerinizde Interval değerini 0 olarak ayarlamak yerine Enabled değerini False olarak ayarlamalısınız.

 

  • Windows Forms, iki menu kontrolüne sahiptir: MainMenu ve ContextMenu ancak Visual Basic 6.0, MainMenu veya ContextMenu olarak açılabilen tek bir menu kontrolüne sahiptir. Menu kontrolleri MainMenu kontrollerine yükseltilir fakat bunları ContextMenu olarak kullanma imkanınız yoktur. ContextMenu lerinizi yeniden oluşturmanız gerekmektedir.

 

  • Windows Forms Dynamic Data Exchange (DDE) desteğine sahip değildir.

 

  • Windows Forms Form.PrintForm methodunu desteklememektedir.

 

  • Windows Forms sürükle-bırak işlevini desteklese de, nesne modeli Visual Basic 6.0’dan biraz farklıdır. Bu nedenle Visual Basic 6.0 sürükle-ve-bırak özellik ve methodları yükseltilemezler.

 

  • Formlarınızın doğru boyutlarla yükseltildiğinden emin olmak için her zaman scalemode olarak twip kullanmalısınız. Yükseltme işlemi sırasında Visual Basic.NET form koordinatlarınızı twips den pixel e çevirir.
  • .NET Framework Clipboard nesnesini (System.WinForms.Clipboard) pek çok yeni ve kullanışlı özellik ile ve Visual Basic 6.0 Clipboard nesnesinden daha fazla sayıda clipboard formatı destekleyecek şekilde oldukça geliştirdi. Nesne modellerindeki farklılıklar nedeniyle clipboard ifadeleri otomatik olarak yükseltilemezler.

 

 

Kadir Sümerkent  

kadir@postmaster.co.uk