Firefox comments

Semantic (anlamsal) webin önemli unsurlarından biri de web sayfalarının URL’lerinin (URI mi deseydik acaba?) kısa, öz ve kullanıcı tarafından da anlaşılabilir olmasıdır. Bilgisayarlar açısından bir sorun yok, onlar kurallara uygun olduğu sürece bize doğru sayfayı gösterir ama bu adreslerin kullanıcılar tarafından da anlaşılabilir olması, sadece bir sitenin domain kısmının değil alt sayfalarının da akılda tutularak adres çubuğuna elle girilebilir olması hoş olmaz mı? Son zamanlarda biraz da Web 2.0 furyasının sayesinde web sitesi geliştiricileri sitelerinin URL yapısına dikkat etmeye başladı. Böylelikle URL’ler kısaldı, bir kaç kırılımdan oluşan bir şekil aldı ve en önemlisi sadece bilgisayarların anlam vereceği abidik gubidik karakter silsileleri olmaktan çıktı. Bununla beraber kendimden örnek vermem gerekirse bir sitede bir yerden başka yere geçerken sayfada gideceğim yeni sayfaya uygun link bulmaya çalışmaktansa, gider elle adres çubuğuna o alt sayfanın adresini girer oldum. Sanki bilgisayarımın sabit diskinde dolaşırmış gibi. Veya bulunduğum sayfa hiyerarşisine göre bir üst seviyeye geçmek istediğimde adres çubuğunda şu an bulunan adresin son segmentini silerek bu sayfaya gitmeye çalışır oldum, ve genelde de gidebildim. Hani nasıl derler, URL hackerı oldum çıktım :)

Eğer siz de kendinize bu şekilde URL’ler ile haşır neşir buluyorsanız ve Firefox web tarayıcısını kullanıyorsanız size süper bir eklenti tavsiye etmek istiyorum: Locationbar². Bu eklenti yardımı ile adres çubuğunuzda bulunan URL segmentlerini tıklanabilir linkler haline getirebilir ve bu segmentlerin görünümün daha anlaşılır bir hale sokabilirsiniz. Benim eklenti ayarlarım şu şekilde:

Bu ayarlar ile fare imlecinizi adres çubuğunun alt kısmına yaklaştırdığınızda adres link şeklini alıyor ve o segmente kadar olan URL’ye tıklamanız suretiyle gidebiliyorsunuz. Başta biraz kullanım zorluğu çekebilirsiniz ancak sonraları alışkanlık yapıyor ve kullandığınız her tarayıcıda arar oluyorsunuz.

.NET comments

Genellikle programların About dialog pencerelerinde görürüz bu şekilde çizgileri. Etched (kazınmış demekmiş) 3 boyutlu görüntüsü ile kullanıldığı yere göre pencereye modern bir hava katıyor. Firefox’un About penceresi mesela:

Firefox 3 About dialog penceresi

Butonların hemen üstündeki çizgi pencerenin beyaz arkaplanlı üst ve gri arkaplanlı alt kısımlarını ayırmada kullanılmış ve 3 boyutlu bir görünüm kazandırmış. Visual Basic 6 ile böyle bir şeyi yapmak için Line kontrollerini kullanırdık. Birer adet gri ve beyaz renkli Line kontrolünü aralık bırakmadan alt alta gelecek şekilde formumuza yerlerştirdiğimizde bu görünümü elde edebilirdik. Visual Studio’nun .NET sonrası versiyonlarında böyle bir kontrol gelmemekte. Bana kalırsa gerek de yok çünkü Form üzerine Line tarzı kontroller koymak gereksiz yere tasarım ortamını karıştırıyor. Bunun yerine Windows Forms’un nimetlerinden yararlanarak bu sorunu çok daha şık bir şekilde çözebiliriz.

Yapmamız gereken Panel kontrolünün OnPaint metodunu override edip bize sağlanan Graphics nesnesini kullanarak ControlPaint.DrawBorder3D static metodu ile istediğimiz kenara, istediğimiz tarzda bir border ekleyebiliriz. C# ile anlatacak olursam:

class EtchedBorderedPanel : Panel
{
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
 
        ControlPaint.DrawBorder3D(e.Graphics, 
            this.ClientRectangle, 
            Border3DStyle.Etched, 
            Border3DSide.Top);
    }
}

Bu kontrolü daha sonra penceremizin alt kısmına Dock edebiliriz. En son hafta sonu projem FxLibrarian için yaptığım About dialog penceresi:

FxLibrarian About dialog penceresi

CodeProject‘teki şu makale de böyle bir kontrolü nasıl yapacağınızı anlatıyor. Biraz eski ama tekrar kullanılabilir bir kontrol yapma konusunda güzel bilgiler içeriyor.

Genel comments

Dün akşam Windows Vista yüklü bilgisayarıma bir Font yüklemeye çalıştığımda aşağıdaki dialog karşıma çıktı:

Gelmiş geçmiş Windows’ların içinde (Millenium Edition da dahil) en fiyakalısı olan Vista’da hala bu dialog neden bulunuyor? Atlamışlar heralde… Neyse bunu gördükten sonra bir başka tarihi eser olan moricons.dll de hala yerinde mi diye baktım. Yanlış hatırlamıyorsam C:\Windows klasöründe olması gerekiyordu ama yoktu. Klasör içinde arama yapınca System32 klasöründe olduğunu gördüm:

Eğer moricons.dll içindeki 32×32 büyüklüğünde ve tamı tamına 16 renk derinliğine sahip simgelere bağımlılığı bulunan uygulamalarınız varsa korkmayın, Windows Vista altında da uygulamalarınız sorunsuz bir şekilde çalışacaktır (UAC’yi saymazsak). Backward compatibility bu olsa gerek.

.NET comments

Gerek Windows Forms ile gerekse de Web Forms ile bir kullanıcı arayüzü tasarlarken sıkça Label ve TextBox kontrol çiftlerini kullanırız. Bir TextBox koyarız ki kullanıcıdan bir değer alabilelim, soluna da bir Label koyarız ki kullanıcıdan ne bilgisi istediğimiz belli olsun. Ancak bazen ya yer darlığından ya da estetik kaygıdan dolayı TextBox kontrolünün işlevini belirleyen Label kontrolü gözümüze batar, kaldırmak isteriz. Böylelikle Label kontrolünden kurtuluruz kurtulmasına da bir şekilde kullanıcıya TextBox kontrolüne ne gireceği hakkında bilgi vermemiz gerekir. İşte bu noktada Cue Banner Text kullanmamız gereken fonksiyonalitedir. Peki nedir bu Cue Banner Text? Hani bazı web sitelerinin Login bölümlerinde kullanıcı adı ve parola gireceğiniz metin kutularının üstüne gelince Kullanıcı Adı ve Parola yazıları kayboluverir ki siz kendi kullanıcı adı ve parola değerlerini girebilirsiniz. İşte metin kutularının içine o kutulara ne girileceğini yazmak ve kutuya tıklayınca (veya bir şeyler yazmaya başlayınca) bu yazılara yok etme yöntemine Cue Banner Text deniyor. Eğer web ortamında bu yöntemi kullanarak erişilebilir formlar oluşturmak istiyorsanız A List Apart’taki Making Compact Forms More Accessible makalesini okuyarabilirsiniz.

Cue Banner Text yöntemi uygulanmış örnek bir web formu

Masaüstü uygulamalarında da bu tarz TextBox kullanımını görmemiz münkün. Mesela Windows Vista’da her bir Explorer penceresinin sağ üst köşesinde ve Internet Explorer 7′de bulunan arama kutularında bu kullanım mevcut:

Windows Vista Explorer arama kutusu
IE7 arama kutusu

Yine Windows Vista’da başlat menüsünün alt kısmında çıkan arama kutusunda da bunu görmekteyiz:

Windows Vista başlat menüsü arama kutusu

Sizin de bu yöntemi .NET ve Windows Forms kullanarak geliştirdiğiniz uygulamalarda kullanmanız mümkün. Ne yazık ki .NET ile gelen TextBox kontrolünün böyle bir özelliği yok, bir şekilde bunu kendimiz yapmamız gerek. İlk akla gelen yöntemlerden biri kullandığımız TextBox kontrolünün Enter ve Leave eventlerini yakalayıp yazıyı gösterme/göstermeme işlemini gerçekleştirebilirsiniz. Benzer bir yöntemle ama bu sefer biraz daha alt seviyede TextBox kontrolünü subclass ederek yeni bir kontrol oluşturabilir ve OnGotFocus/OnLostFocus metodlarını override ederek benzer işlevi yeni kontrole kazandırmanız da mümkün. Ama tahmin edebileceğiniz gibi bu yöntemler pek de temiz gibi görünmüyor. Hem yazacağımız kod gereğinden fazla karışık ve yönetilemez olacak, hem de kontrolün temiz/sorunsuz bir kullanımı olmayacak. Geçiniz…

Peki nasıl yapalım biz bu işi? Şöyle oluyor efendim; EM_SETCUEBANNER mesajını TextBox kontrolümüze User32.dll kütüphanesindeki meşhur SendMessage fonksiyonu ile göndererek. Aynen yukarıda örnek verdiğim Windows uygulamalarının da yaptığı gibi. Eğer programınız Windows XP veya sonrası bir işletim sisteminde çalışıyorsa bu yöntemi kullanarak acısız ve ağrısız bir şekilde TextBox kontrollerinize Cue Banner Text özelliği kazandırabilirsiniz.

SendMessage User32 sistem kütüphanesinde export edilmiş bir fonksiyon olduğu için bu fonksiyonu .NET içerisinden Platform Invocation veya kısaltacak olursak P/Invoke ile çağırmamız mümkün. EM_SETCUEBANNER sabitinin değeri ve SendMessage fonksiyonunun kullanacağımız versiyonu şu şekilde:

internal const uint ECM_FIRST = 0x1500;
internal const uint EM_SETCUEBANNER = ECM_FIRST + 1;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr SendMessage(
    HandleRef hWnd, 
    uint msg, 
    bool wParam, 
    string lParam);

Fonksiyonun parametrelerinin ne işe yaradığınız özetlemek gerekirse; HandleRef tipindeki hWnd parametresi ile TextBox kontrolümüzün Handle değerini, msg parametresi ile EM_SETCUEBANNER sabitini, wParam ile Cue Banner metninin kontrol üzerinde iken de gösterilip gösterilmeyeceğini ve son olarak lParam ile de Cue Banner metnini göndereceğiz. Burada 3. parametre olan wParam için özel bir durum var. Windows Vista’ya kadar EM_SETCUEBANNER mesajını gönderirken bu parametre göz ardı ediliyordu. Ancak Vista ile beraber buraya true değeri göndermemiz durumunda Cue Banner metni kontrol üzerinde iken de görünüyor, ta ki kullanıcı ilk karakteri girene kadar. Eğer Windows Vista kullanıyorsanız bu özelliği başlat menüsündeki arama kutusunda deneyebilirsiniz. Aşağıdaki kod txtSearch isminde bir TextBox kontrolüne Cue Banner olarak “Search” metnini atıyor:

SendMessage(
    new HandleRef(txtSearch, txtSearch.Handle), 
    EM_SETCUEBANNER, 
    false, 
    "Search");

Kodu bu haliyle Windows Formunuzun constructoruna veya Form_Load eventine yerleştirmeniz mümkün. Ama bir kaç satır kod yazarak TextBox kontrolünden türeyen ve Cue Banner Text özelliği olan yeni bir TextBox kontrolü oluşturabiliriz. Böylelikle projenizin farklı yerlerinde böyle bir kontrol kullanacak olursanız sanki formunuza normal bir TextBox kontrolü yerleştirirmiş gibi bu kontrolü yerleştirip Properties penceresinden de Cue Banner metnini belirleyebilirsiniz.

CueBannerTextBox kontrol demosu

Fark ettiyseniz Windows Explorer, IE7 ve başlat menüsünde bulunan arama kutularındaki Cue Banner metinleri gri renkte ve italik yazı tipi ile yazılmış, bizim oluşturduğumuz ise gri olmasına rağmen italik değil. Channel 9 Forumlarında littleguru adındaki kullanıcının daha önceden oluşturmuş olduğu benzer bir kontrolde ek olarak Cue Banner fontunu belirleme seçeneği de koymuş. OnGotFocus/OnLostFocus metodlarını override ederek TextBox’un o anki font değerini değiştiriyor. Ancak program çalıştığı esnada bu değerlerin (Cue Banner metni ve fontu) değişmesi gibi bazı durumunda kontrol pek sağlıklı çalışmıyor. Ayrıca bahsettiğim Vista ile gelen yeni özellik de o kontrolde uygulanmış değil. O yüzden bu işi yapan kontrolü tekrar yazmaya karar verdim. Tekrar yazmak dediysem pek de bir şey yapmadım hani, littleguru’nun kodunu baz alarak bir kaç değişiklik yaptım. Vista ile gelen özellikten de Kenny Kerr‘in Ağustos ayında MSDN Magazine’de yayınlamış olduğu Windows Vista Control Enhancements yazısını okuyunca haberim oldu.

Kontrolü ve demosunu içeren Visual Studio 2008 projesi (12kb)

Genel comments

RapidShare gibi sitelerden Premium hesap sahibi olmadan ücretsiz olarak dosya indiriyorsanız daha kısa zamanda daha fazla dosya indirebilmek için sık sık modeminize reset atmak zorunda kalıyorsunuzdur. Böylelikle modeminiz yeni bir IP alıyor ve sanki bambaşka biriymişçesine RapidShare’den dosyalarınızı indirmeye devam edebiliyorsunuz. Bir programcı olduğumu ve programcıların da tembel olduğunu göz önüne aldığımızda modemin elektrik kablosunu çıkarmak ve tekrar takmak oldukça zahmetli bir iş benim için. İşte bu yüzden bu sorunu tek tıkla çözen bir komut satırı uygulaması geliştirdim. Eğer sizin de AirTies marka bir ADSL modeminiz varsa bu aracı kullanarak modeminize reset atabilir, yeni bir IP adresi alabilirsiniz. Modem arayüzüne 192.168.2.1 adresinden ve boş bir şifre ile ulaştığınızı varsayarsak programı hiçbir parametre göndermeden, çift tıklayarak, kullanabilirsiniz. Ancak modem arayüzüne eriştiğiniz IP adresiniz farklı ve/veya modeme erişmede bir şifre kullanıyorsanız ilgili /ip ve /password parametlerini kullanmanız gerekir. Programı çalıştırabilmeniz için .NET Framework 2.0 veya üstü bilgisayarınızda yüklü olduğundan emin olun.

AirTies modem resetleme aracı ekran görüntüsü

AirTies ADSL Modem Reset Utility 1.0.0.0 (3,40 KB)

Not: Programı sadece kullanmakta olduğum AirTies RT-205 modeli ile test edebildim ancak diğer modeller ile de sorunsuz çalışacağını ümit ediyorum.

Güncelleme: Programın C# kaynak kodunu görebilirsiniz.