|
Windows API - Bileşik Giriş Kutusu Kontrolünün Oluşturulması ve Kullanımı 2
Jul 26,2007 00:00
by
canawar
Kaldığımız yerden makalemize devam edelim... Uygulamada iki tane aşağıya açılabilir listeleme kutusu oluşturduk. Bu bileşik giriş kutularından ilkini kullanıcıya şehir seçeneklerini sunmak için kullanacağız. Diğerini ise kullanıcının kaydettiği kişi bilgilerini listelemek amacıyla kullanacağız. Standart kontrollerin oluşturulmasından sonra FillComboBox1Elements ve FillComboBox2Elements isimli fonksiyonları çağırarak bileşik giriş kutularımıza bazı elemanlar ekliyoruz. Şimdi bu fonksiyonların tanımlamalarına bakarak nasıl bir işlem yapıldığını kavramaya çalışalım :
FillComboBox1Elements isimli fonksiyonda, ilk bileşik giriş kutusu kontrolüne öncelikle kendi belirlediğimiz elemanları ekledik. Ardından bu elemanlara ilişkin alan kodu bilgilerini atadık. Bileşik giriş kutusu kontrolüne eleman eklemek için kontrole CB_ADDSTRING mesajını gönderdik. Bu mesajı gönderirken wParam parametresine sıfır, lParam parametresine ise kontrole eklenecek elemanın karakter katarı ifadesini geçtik. Bileşik giriş kutusu kontrolünün elemanlarına veri atamak amacıyla, kontrole CB_SETITEMDATA mesajını gönderdik. Bu mesajı gönderirken wParam parametresine verinin ilişkilendirileceği elemanın sıra numarasını, lParam parametresine ise elemanla ilişkilendirilecek veriyi geçtik. Kullanıcı kontrolden herhangi bir elemanı seçtiğinde, o elemana ilişkin alan kodu bilgisini elemanın verisine erişmek suretiyle öğrenebileceğiz. FillComboBox2Elements isimli fonksiyonda ise daha önceden kullanıcı tarafından girilmiş kayıtlarınv saklanacağı Numaralar.txt isimli dosyayı açarak, bu dosyada yer alan elemanları sırasıyla kontrole ekledik. Program ilk defa çalıştırıldığında böyle bir dosya olmayacağı için, başlangıçta bileşik giriş kutusu kontrolümüzün hiç elemanı olmayacaktır. Ancak daha önce uygulama çalıştırılmış ve kayıt girilmişse, bu kayıtları dosyadan okuyarak kontrolüme ekledik. İkinci bileşik giriş kutusu kontrolümüze, daha önce oluşturulmuş olan kayıtlara ilişkin kişi adı bilgilerini eleman olarak ekledik. Bunu niçin kontrole CB_ADDSTRING mesajını gönderdik. Ardından, eklenen elemanlarla, kişiye ait telefon numarası bilgisini eşleştirdik. Kontrolün elemanlarının numara bilgisiyle eşleştirilmesi sırasında dinamik bellek tahsisatı yaptık. Uygulama sonlanırken ayırdığımız bu alanları serbest bırakmak için, tahsis ettiğimiz adresleri global bir dizide sakladık. Kontrole eleman eklenmeden önce ComboBox2SelectionControl değişkenine FALSE değerini, eleman ekleme işleminin ardından ise TRUE değerini ekledik. Bu işlemi yapmamızın amacı, uygulama ilk çalıştırıldığında kontrole eleman eklenmesi sırasında, kontrolün SelChange olayının çalışmasına engel olmaktır. Kontrolün SelChange isimli olayı gerçekleştiğinde çağırdığımız fonksiyonda, bu değişkenin değerini kontrol edeceğiz.
ClearForm isimli fonksiyonda, formumuz üzerinde kullanıcının bilgi girmesi amacıyla oluşturduğumuz kontrollerin içeriklerini temizleyerek ekranı yeni bir kayda hazır hale getiriyoruz. Bu amalçla veri girişi amacıyla kullanılacak kişi adı ve telefon numarası kontrollerinin içeriğine, SetWindowText API fonksiyonu ile boş bir karakter katarı ifadesi atadık. Şehir seçimi amacıyla oluşturulmuş bileşik giriş kutusu kontrolünde hiçbir elemanın seçili olmamasını sağlayabilmek için, kontrole CB_SETCURSEL mesajını -1 wParam parametresi değeri ile yolladık. Bu fonksiyonu çağrılmasının ardından formumuz yeni bir kayda hazır hale gelmiştir. Kulanıcı ilk bileşik giriş kutusu kotnrolünde listelenen elemanlardan birisini seçtiğinde (kontrolün seçim değişimi olayında) çalışmasını istediğimiz fonksiyonu, pencere fonksiyonunun WM_COMMAND mesajını işlediği durumda çağırmıştık. Bu fonksiyonda, seçilen şehre ilişkin alan kodu numarasını, kontrolün hemen yanında bulunan yazı kutusu kontrolünde göstereceğiz. Alan kodu bilgisini, kontrolün elemanları ile eşleştirmiştik. Şimdi bu fonksiyonu inceleyelim :
Fonksiyonun hemen başında ComboBox1SelectionControl değişkeninin değerini kontrol ederek, değişkenin FALSE değerine sahip olması durumunda fonksiyondan çıkılmasını sağladık. Bu şekilde, fonksiyonun bazı durumlarda çalışmasını bazı durumlarda çalışmamasını sağladık. Örneğin kontrol ilk oluşturulduğunda ve kodlama yolu ile kontrole eleman eklendiğinde, bu fonksiyonun çalışmaması gereklidir. Fonksiyon sadece kullanıcı seçili olan elemanı değiştirdiğinde veya bir eleman seçimi yaptığında çalışmalıdır. Bu amaçla kontrole eleman eklenmesi sırasında ComboBox1SelectionControl deişkenine FALSE değerini ve eleman ekleme işleminin bitmesinin ardından değişkene TRUE değerini atamıştık. Bu şekilde fonksiyonun çalışmasını kontrol etmiş olduk. Diğer adımlarda yapılan işlemlere bakacak olursak, öncelikle kontrolün seçili olan elemanının sıra numarasını öğrenmek amacıyla kontrole CB_GETCURSEL mesajını gönderdik. Eğer geri dönen değer sıfırdan küçük bir değer ise, herhangi bir eleman seçilmemiştir, bu durumda fonksiyonu sonlandırdık. Eğer kontrolün bir elemanı seçilmiş durumda ise, bu defa kontrole CB_GETITEMDATA mesajını, seçili olan elemanın sıra numarası değerini wParam parametresi olarak vererek gönderdik. Bu mesaj bize, seçili olan eleman ile ilişkilendirilmiş veriyi döndürecektir. Bu değer de, kullanıcının seçmiş olduğu şehre ilişkin alan kodu bilgisidir. Bu bilgiyi areaCode isimli integer türünden değişkende sakladık. Daha sonra bu bilgiyi yazı kutusu kontrolünde gösterebilmek amacıyla itoa fonksiyonu ile karakter katarına dönüştürdük. Ardından SetWindowText API fonksiyonu ile yazı kutusu kontrolünde bu karakter katarının görüntülenmesini sağladık. Artık kullanıcı kontrolde listelenen elemanlardan herhangi birisini seçtiği zaman, bu elemana ilişkin veri yazı kutusu kontrolünde gösterilecektir. Aşağıdaki şekilde bu durum gösterilmiştir :
Kullanıcı gerekli bilgileri girdikten sonra Kaydet düğmesine bastığında, girilen bilgileri hem bir dosyaya kaydedeceğiz, hem de ikinci bileşik griş kutusu kontrolüne ekleyeceğiz. Kullanıcı düğme kontrolüne bastığında OnPshButtonClick fonksiyonunun çalışmasını istediğimizi, pencere fonksiyonunun WM_COMMAND mesajını işlediği durumda bildirmiştik. Bu fonksiyonu incelemeden önce, fonksiyondan çağırdığımız CreatePersonPhone ve WritePersonPhone fonskiyonlarına bakalım :
CreatePersonPhone fonksiyonu, PersonPhone türünden dinamik bir nesne oluşturarak parametre olarak geçilen isim ve numara bilgilerini, bu nesnenin veri elemanlarına atamaktadır. WritePersonRecord fonksiyonu, parametre olarak geçilen person adresindeki kişi bilgilerini, name parametresiyle bir dosya açarak o dosyaya yazmaktadır. Şimdi kayıt işleminin nasıl yapıldığını inceleyelim :
Kayıt işleminin ilk adımında, kişiye ilişkin isim ve numara bilgilerini form üzerindeki alanlardan alarak bir yapı nesnesinde saklamak istiyoruz. Numarayı, kullanıcının gireceği yedi haneli numara bilgisinin başına, yine kullanıcı tarafından seçilecek şehre ilişkin alan kodu bilgisini ekleyerek oluşturacağız. Bu amaçla öncelikle şehirleri listeleyen bileşik giriş kutusu kontrolünde seçili olan elemanın sıra numarasını, kontrole CB_GETCURSEL mesajını göndererek öğrendik. Daha sonra bu sıra numarasında yer alan eleman ile eşleştirilmiş veriyi öğrenebilmek amacıyla kontrole CB_GETITEMDATA mesajını gönderdik. Kullanıcının yazı kutusu kontrolüne girmiş olduğu numara bilgisinin başına, alan kodu bilgisini strcat fonksiyonu ile ekledik. Şimdi elimizde 11 haneli telefon numarası bilgisi bulunmaktadır. CreatePersonPhone fonksiyonunu, isim ve numara değerlerini parametre değişkeni olarak geçerek çağırdık ve bir Person Phone göstericisi elde ettik. WritePersonPhone isimli fonksiyona bu göstericiyi ve kullanmak istediğimiz dosyanın adını parametre olarak geçerek kayıt işlemini gerçekleştirmiş olduk. Kayıt işleminin ardından ikinci bileşik giriş kutusu kontrolüne CB_ADDSTRING mesajı göndererek, yeni yapılmş kayıt bilgisini ekledik ve CB_SETITEMDATA mesajı göndererek bu kayda ilişkin numara bilgisini eşleştirdik. Bu işlemlerin ardından ClearForm fonksiyonunu çağırarak formdaki alanları temizledik ve formu yeni bir kayda hazır hale getirdik. Burada ComboBox2SelectionControl değişkenine sırasıyla FALSE ve TRUE değerlerini atayarak, kontrolün SelChange olayını kontrol ettiğimize dikkat edelim. Son adım olarak, ikinci bileşik giriş kutusu kontrolünde yapılacak seçim işlemine göre kullancıya kaydı gösterme işlemini gerçekleştireceğiz. Bu işlem, OnComboBox2SelChange fonksiyonunda yapılmaktadır. Şimdi bu fonksiyonu inceleyelim :
Bu fonksiyon ikinci bileşik giriş kutusu kontrolünde yapılan seçime göre, kayıt bilgilerini kullanıcıya göstermektedir. (Ayrıca uygulamanın yüklenmesi sırasında daha önce oluşturulmuş kayıtlar da bu kontrol de listelenmektedir.) Bu amaçla öncelikle kontrolde seçili olan elemanın sıra numarasını öğrendik, ardından bu elemanla ilişkilendirilmiş veriyi alarak kontrolün altında yer alan statik kontrollere bu bilgileri atadık. Artık bileşik giriş kutusu kontrolünde eleman seçimi işlemi yapıldıkça ilgili bilgiler, statik kontrollerde listelenmektedir. Uygulamanın çalışır hali aşağıda görülmektedir :
Uygulamayı buradan indirebilirsiniz.. Kaynak: Çiğdem Çavdaroğlu |