|
Kitapları Şişirmek! |
||
|
Programcılık kitaplarını kaleme alırken en çok zorlandığım konu kitabın içeriğine karar vermektir. Her ne kadar hoca bildiğini okur sözü çoğu zaman geçerli olsa bile bildiklerimden çok, okurun öğrenmesi gerektiğini düşündüğüm veya öğrenmek isteyeceğini sandığım konulara öncelik veririm. Deyim ki Delphi ile az çok program yazdınız ve kendinizi geliştirmek için Delphi 2007 for Win32 kitabımı aldınız. Bu durumda belki IntToStr() fonksiyonu hakkında yazılan 2 cümle sizi sıkacaktır.
Diğer yandan Delphi’yi henüz öğrenmeye başlayan okurun birisi kitabın henüz ilk bölümlerinde nesnelerin kod yazılarak bir formdan bir başkasına nasıl taşındığının anlatıldığı sayfalarda belki bunalacaktır. İşin özü şudur: Nasıl ki satın aldığınız gazetenin her sayfasını okumuyorsanız aldığınız programcılık kitabındaki her konunun ilgi alanınıza gireceğini düşünmeyin derim. Delphi 2007 kitabımı kaleme alırken hangi veritabanına ağırlık vereceğimi kara kara düşünmüştüm. Bu gibi durumlarda bazen orta yol seçilir. Veritabanı konularına ayrılabilinen sayfalar değişik veritabanları arasında bölüştürülür. Tabii bu durumda bütün veritabanları hakkında kısıtlı bilgi verilmiş olunur.
Forumları takip ettiğim için biliyorum: Bazen forumlara son derece basit sorular yazılır. Programcılık kitaplarının ilk sayfalarına yazılan konularda forumlara soru soran olduğu zaman o kişinin programcılık kitabı okumadığını(en azından kendi yazdığım kitabı okumadığını..) anlamak benim için zor olmaz. Örneğin birkaç gün önce forumun birisinde C# ile ilgili şöyle bir soru vardı: “Ben bir butona tıkladığımda textbox ta "selam" yazmasını istiorum.bunu nasıl yapabilirim?” Şimdi bu soruyu soran arkadaşa kızalım mı onu kınayalım mı? Kesinlikle hayır.
Bu arkadaş bilmediği bir konuda samimi bir şekilde foruma sorusunu yazmış. Tabii ki bu arkadaşa kitap okuması önerilebilir. Benim asıl üzerinde durmak istediğim konu şudur: C# kitabımın ilk sayfalarında olay kavramını anlatmak üzere forma TextBox ve Button yerleştirip düğme tıklandığı zaman TextBox’a bilgi aktarmayı denediğimde kitabım C# hakkında az çok bilgisi olanlar tarafından değersiz olarak görülmeyecek mi? Bugün okurun birisi şikayet ediyordur: Diyor ki kitabında “…. OK düğmesini tıklaman gerek” gibi şeyler yazmışsın.. Örneğe devam edelim; formda bir düğme ve TextBox var. Düğmenin Click olayını temsil eden metoda bir satır yazıp TextBox’a bilgi aktaracağım." Şimdi kitap metnine düğmeyi tıklarsanız bu metot işletilir dersem kitabı şişirmiş mi olacağım?
Yıllardır kitaplarımı ekran görüntüleri ile doldurup şişirdiğim söylenir. Aslında bu suçlamanın nedenini tahmin etmek benim için zor değil; ama olsun okurlarımı aydınlatmak görevim. Şimdi size Begin-End deyimleri hariç toplam 6 satır kodun olduğu Delphi 7 kitabımdan alınma bir ekran görüntüsü vereceğim.
Delphi kitabımdan aldığım bu ekran görüntüsünü Word belgesine yapıştırdıktan sonra büyüklüğünü %30 oranında düşürdüm ve alt kısmından yarım cm kadarını kırptım. Bu ekran görüntüsünün Delphi'den alınmış halinin %30 oranında küçültülmüş ve alt kısmından biraz kırpılmış halidir. Bu ekran görüntüsünün Word belgesi içindeki yüksekliği tam 3,8 cm’dir.
Bazı kitaplarda ve dergilerde ekran görüntüleri orijinalinden daha fazla küçültüldükleri için büyüteçsiz okumak mümkün olmuyor. Birkaç yıl öncesine kadar ekran çözünürlüğü 1024*768 iken aldığım ekran görüntülerini %25 oranında küçültüp öyle kullanıyordum. Tabii bu durumda ekran görüntüleri daha net ve kolay okunuyordu. Kitapların sayfa sayılarını hiç olmazsa %5 azaltmak için 5 yıl önce küçültme oranını %30’a çıkırdım. Hatta bazen ekran görüntüsü sayfaya sığsın diye küçültme oranını %35’e kadar çıkardığım olur. Aşağıda verdiğim kodu yakın bir zamanda yayınlanan Delphi 2007 kitabımda kullandım. Bu kod satırları işlev olarak Delphi 7 kitabımda kullandığım ekran görüntüsündeki koddan farklı değildir.
procedure TForm1.FormCreate(Sender: TObject); begin Form1.Show; Form1.Canvas.Font.Size := 18; Form1.Canvas.TextOut(30, 30, 'Turbo Delphi'); Form1.Canvas.Font.Name := 'Courier New'; Form1.Canvas.Font.Size := 22; Form1.Canvas.TextOut(30, 60, 'Turbo Delphi'); end;
Kitap metninde 10 punto kullanırken kod satırlarında genellikle 9 punto büyüklüğe sahip Verdana fontunu tercih ediyorum. Anlayacağınız bu kodu Delphi 2007 kitabımdan orijinal biçim özellikleri ile buraya aldım. Sizce kod satırlarını Word belgesine direk yapıştırmak yerine Delphi penceresinden kod yazılan pencerenin ekran görüntüsünü kullanmak arasında çok fark var mıdır? Yani ekran görüntüsünü tercih ettiğimde kitabı şişirmiş olur muyum?
Bunlardan hangisinin kitapta daha çok yer kapladığını net olarak göstermek için 2 sütunlu bir tablo hazırlayıp hücrenin birisine direk kodu diğerine ise aynı kodu içeren ekran görüntüsünü yerleştirdim. Evet arkadaşlar bu durumda ekran görüntüsünü tercih etmiş olmakla kitabın bu sayfasını yaklaşık 0,4 cm’lik kadar şişirmiş oluyorum.
Aslında ölçüleri tam olarak tutturamadım ama söylediklerim doğru. Resimleri kitaptan alıp buraya alınca ölçüler değişti biraz. Ancak tekrar etmem gerekise kitapta ekran görüntüsü yerine kodun kendisini tercih etmiş olsaydım yaklaşık 0,4 cm yer kazanırdım. O zaman bazıları soracaklardır: Madem bu konuda hep suçlandın neden ekran görüntüsünü tercih ettin? Cevap son derece basit: Ekran görüntüsü olarak verilen kısa kodları izlemek kolaydır ve ayrıca normal kitap metnini daha kolay okunmasını sağlıyor. Gerçekte yazar için kod satırlarını kitap metni içine alması daha pratiktir. Buna rağmen Memik Yanık'ı kitaplarını ekran görüntüsü ile dolduruyor diye suçlamaya devam edecekler.
Konumuz Delphi'de kod yazarak kontrolleri ilk yerleştirildikleri formdan başka bir forma taşımak olsun. Amacınız okurun hayal gücünü geliştirmek değilse yapmak istediğiniz işlemi bir iki cümle ile ortaya koyduktan sonra 2 forma sahip bir Delphi projesi hazırlarsınız. Tabii kitabı şişirmeme gibi bir kaygınız varsa ekran görüntülerini kitap metni içinde kullanacağınız formların boyutlarına dikkat edersiniz.
Bazıları çıkıp diyecekler ki yukarıda bold yapılan cümle yeterince açık değil mi? Eğer okurunuz tıpkı üniversite seçme sınavındaki gibi konuya odaklanmışsa bu cümlenin yeterince açık ve anlaşılır olduğu söylenebilir. Daha doğrusu kolay okunma diye bir kaygınız yoksa veya hemen anlaşılma, hızlı okunma amaçlarınız yoksa yukarıdaki cümleden sonra formdan forma kontrol taşıyan kodu verirsininiz olur biter.
Aslında şunu yapabilirdim: Önce başka yazarların bu konuyu nasıl anlattıklarını "aynen" buraya alırdım. Sonra ise aynı konuyu nasıl anlattığımı sizinle paylaşırdım. Bu durumda hemen birileri çıkıp "senin haddine mi düşmüş yabancı yazarları eleştirmek, yabancı yazarların anlatımını beğenmemek?" Hemen eklerlerdi "bilgisayar programclığında kariyerin nedir?" Neyse biz yabancı yazarların bilgisayarcılıklarından öte Shakespeare ve Aldous Huxley gibi kalem ustaları olduklarını varsayıp konumuzu anlatmaya devam edelim. Tabii bu arada eklemeden geçmeyeyim: Bu yabancı yazarların çevirmenleri Ayseli Usluata, Cevap Çapan ve A. Turan Oflazoğlu gibi aynı zamanda birer Türkçe dil ustası olduklarını varsaymadan geçmeyelim. Aşağıda verilen metni kendi cümlelerimle yazmış olmakla birlikte kaleme alırken başka yazarları taklit etmeye çalıştım. Taklit etmeyi başardığımı söyleyemem.
Delphi'de bir formdaki kontrolleri başka bir forma taşırken RemoveComponent ve InsertComponent metotlarını kullanabilirsiniz. Form1'deki Edit1 ve Edit2’nin Parent özelliklerinde değişiklik yapılırsa Form2’nin üzerinde görüntülenirler.
procedure TForm1.AktarClick(Sender: TObject); begin Edit1.Parent := Form2; Edit2.Parent := Form2; end;
Şimdi ise Form2’de görüntülenen ilk 2 nesnenin silinmesini sağlayacağım.
procedure TForm1.SilClick(Sender: TObject); begin Form1.Components[1].Free; Form1.Components[0].Free; end;
Bu 2 satır sayesinde Form1’deki ilk 2 kontrol silinir. Koda dikkat ederseniz Edit1 ve Edit2 nesneleri Form2’nin üzerinde görünürken bu kontroller henüz Form1’e aittir veya Edit1 ile Edit2’nin sahibi Form1’dir. Bu nedenle Free metodu ile silme işlemini yaparken Form2 yerine Form1’ın adını yazdım. Şimdi RemoveComponent ve InsertComponent metotlarını bir yordama alıp öyle işleteceğim.
procedure TForm1.Uzaklastir(Bilesen: TComponent; Sahip: TComponent); begin Bilesen.Owner.RemoveComponent(Bilesen); Sahip.InsertComponent(Bilesen); end;
“Uzaklastir” adını verdiğim yordamı bu şekilde hazırladıktan sonra aşağıdaki gibi hazırlık yaptım. Bu kod sayesinde Form1’deki 2 Edit Form2’ye aktarılır.
procedure TForm1.AktarClick(Sender: TObject); begin Form1.Edit1.Parent := Form2; Form1.Edit2.Parent := Form2; Uzaklastir(Edit1, Form2); Uzaklastir(Edit2, Form2); end;
Aslında bu metin Delphi uzmanları için son derece anlaşılırdır. Ne ki Delphi uzmanları dönüp bu metne bakmazlar bile. Onların burada yazılanları anlamaları için koda uzaktan bir kaç saniye bakmaları yeterlidir. Biz yazarlar uzmanlar için kitap yazmadığımız için, başka bir deyişle yazdıklarımızla hiç ilgilenmeyecekleri baştan belli olanları gözeterek konuları kaleme almadığımız için uzmanların böyle bir metin karşısındaki yaklaşımlarını ölçü olarak alamayız. Hemen söyleyeyim ki yukarıda verilen kısacak metin ve birkaç satırlık kod Delphi'nin bileşen kavramının temelini oluşturuyor. Bu nedenle oldukça önemlidir. Önemli olduğu için de okurun yazılanları kavraması için ek açıklamalar getirilmelidir.
Bu metni okuyan kişi Delphi uzmanı değilse(ki Delphi uzmanı zaten böyle bir metne dönüp bakmaz) yapılan işlemlerin geri planını merak eder. Belki de işin içinden çıkamaz. Bu konu bu şekilde anlatıldığı zaman anlaşılmama olasılığına karşı, başka bir deyişle anlaşılmayı garanti etmek için Memik YANIK bu konuyu aşağıdaki gibi anlatır. Bir kez okursunuz, hem de hızlıca okursunuz ikna olmuş, konuyu kavramış halde başka konuya geçersiniz. Elbette Delphi hakkında ortalamanın üzerinde bilgisi olan birisi bu metni gördüğünde kitabı şişirmiş, ekran görüntüleri ile doldurmuş diyecektir. Bu ekran görüntülerinin %35 oranında küçültülüp ondan sonra kitap metni içine kullanıldıklarını hatırlatmak isterim.
Nesneleri Bir Formdan Diğerine Taşımak
Bir formdaki kontrolleri başka bir forma taşırken RemoveComponent ve InsertComponent metotlarını kullanabilirsiniz. Bu 2 metodun nasıl kullanıldığını anlatmak için 2 forma sahip bir proje hazırladım.
Çalışma anında ilk formdaki “Göster” düğmesi tıklandığında “Form2” ekrana getirilecek. Bu amaçla Unit2’yi Uses bloğunda Unit1’e dahil ettikten sonra “Goster” düğmesi için aşağıda verdiğim kodu yazdım.
procedure TForm1.GosterClick(Sender: TObject); begin Form2.Show; end;
Çalışma anında “Aktar” düğmesi tıklandığında Edit1 ve Edit2’nin Parent özelliklerinde değişiklik yapılıp Form2’nin üzerinde görüntülenmesini sağlayacağım.
procedure TForm1.AktarClick(Sender: TObject); begin Edit1.Parent := Form2; Edit2.Parent := Form2; end;
Aşağıda verilen ekran görüntüsünü önce “Göster”, sonra “Aktar” düğmelerini tıkladıktan sonra aldım. Bu sırada Edit1 ve Edit2’yi projedeki 2. form görüntülüyor olsa bile bu 2 nesnenin sahibi Form1’dir.
Çalışma anında Sil düğmesi tıklandığında Form2’de görüntülenen ilk 2 nesnenin silinmesini sağlayacağım. Bu amaçla “Sil” düğmesinin Click metodunu aşağıdaki gibi düzenledim.
procedure TForm1.SilClick(Sender: TObject); begin Form1.Components[1].Free; Form1.Components[0].Free; end;
“Sil” düğmesinin Click metoduna yazılan bu 2 satır sayesinde Form1’deki ilk 2 kontrol silinir. Koda dikkat ederseniz Edit1 ve Edit2 nesneleri Form2’nin üzerinde görünürken bu kontrollerin henüz Form1’e aittir veya Edit1 ile Edit2’nin sahibi Form1’dir. Bu nedenle Free metodu ile silme işlemini yaparken Form2 yerine Form1’ın adını yazdım.
Burada yapılması gereken Parent özelliği ile nesnenin görüntülenmesinden sorumlu olacak formu değiştirdikten sonra Owner özelliğini de değiştirmektir. Bu işlemi yapmak için aşağıda verdiğim kodu yazdım.
procedure TForm1.AktarClick(Sender: TObject); begin Form1.Edit1.Parent := Form2; Form1.Edit1.Owner.RemoveComponent(Edit1); Form2.InsertComponent(Edit1); Form1.Edit2.Parent := Form2; Form1.Edit2.Owner.RemoveComponent(Edit2); Form2.InsertComponent(Edit2); end;
Bu kod hakkında bilgi vermeden bu kodun hataya neden olacağını söylemeliyim. Bu kodda önce Form1’deki “Edit1” nesnesi RemoveComponent metodu ile Form1’den uzaklaştırılıp InsertComponent metodu ile Form2’ye eklenmektedir. Ancak Edit’ler ve diğer nesneler RemoveComponent metodu ile Form1’den uzaklaştırıldığı anda bellekten silinmiş olmaktadır. Dolayısıyla olmayan bir nesneyi InsertComponent metoduna parametre olarak vermek hataya neden olur.
Bu sorunu gidermek için ilk akla gelen yöntem bu işlemi yapacak bir procedure hazırlamaktadır. Daha önce Türkiye’de yayınlanan bir kitapta bu yöntem anlatıldığı için öncelikle söz konusu Edit nesnesini RemoveComponent metodu ile Form1’den uzaklaştırmadan önce bir değişkene aktaracağım.
procedure TForm1.AktarClick(Sender: TObject); Var E :TEdit; begin Form1.Edit1.Parent := Form2; E := Form1.Edit1; Form1.Edit1.Owner.RemoveComponent(Edit1); Form2.InsertComponent(E); Form1.Edit2.Parent := Form2; E := Form1.Edit2; Form1.Edit2.Owner.RemoveComponent(Edit2); Form2.InsertComponent(E); end;
Bu kod sayesinde Edit1 ve Edit2’nin Form1 ile bir ilişkisi kalmaz. Bu kod işletildikten sonra Edit1 ile Edit2’nin hem Owner’ı hem de Parent’ı Form2olur. Bu şartlarda, yani Form2’de yalnızca 2 nesne varken “Sil” düğmesi için yazılan kodda önce Edit2 silinmelidir yoksa hata meydana gelir.
procedure TForm1.SilClick(Sender: TObject); begin Form2.Components[1].Free; Form2.Components[0].Free; end;
Şimdi ise RemoveComponent ve InsertComponent metotlarını bir yordama alıp öyle işleteceğim. Hazırlayacağım yordam TComponent tipinde 2 parametreye sahip olacaktır.
procedure TForm1.Uzaklastir(Bilesen: TComponent; Sahip: TComponent); begin Bilesen.Owner.RemoveComponent(Bilesen); Sahip.InsertComponent(Bilesen); end;
“Uzaklastir” adını verdiğim yordamı bu şekilde hazırladıktan sonra “Aktar” düğmesinin Click yordamını aşağıdaki gibi düzenledim. Bu kod sayesinde Form1’deki 2 Edit Form2’ye aktarılır.
procedure TForm1.AktarClick(Sender: TObject); begin Form1.Edit1.Parent := Form2; Form1.Edit2.Parent := Form2; Uzaklastir(Edit1, Form2); Uzaklastir(Edit2, Form2); end;
Birinci anlatım daha kısa oldu. Delphi konusunda belli bir düzeye gelmiş kişilere, daha doğrusu artık kitap almayıp, Memik YANIK tarafından kaleme alınmış metinlere dönüp bakmayanlara göre kısa olanı tercih etmek gerekir. Nasıl olsa onların bu konuyu öğrenme gibi bir derdi yok. |