polinom katsayı / Lineer Cebir Ders 4 - Ters Matrisler PDF | PDF

Polinom Katsayı

polinom katsayı

Значение слова "cebirsel ifade" в словаре турецкий языка

НОВОСТИ, В КОТОРЫХ ВСТРЕЧАЕТСЯ ТЕРМИН «CEBIRSEL IFADE»

Здесь показано, как национальная и международная пресса использует термин cebirsel ifadeв контексте приведенных ниже новостных статей.

TEOG sınavları ne zaman? TEOG çıkacak sorular

Fiilimsi eklerini ezberlemeden anlamsal olarak ne ifade ettiğini anlayınız. ... cebirsel ifadelerde işlemler, denklemler, silindir, koordinat sistemi) mutlaka tekrar ... «Ülke Haber, Окт 15»

Ortak sınavlara girecek öğrenciler için ipuçları hazırlandı [168 …

*2. ortak sınavlarda konuların daha yoğun olması sebebiyle 7. sınıfın bazı konuları (rasyonel sayılar da işlemler, cebirsel ifadelerde işlemler, denklemler, silindir, ... «Haberahval! Haber, iş ve yaşam portalı, Окт 15»

TEOG çıkacak sorular, TEOG sınav tarihleri 4 Ekim

*2. ortak sınavlarda konuların daha yoğun olması sebebiyle 7. sınıfın bazı konuları (rasyonel sayılar da işlemler, cebirsel ifadelerde işlemler, denklemler, silindir, ... «Haber7.com, Окт 15»

TEOG sınavları ne zaman başlıyor, TEOG tarihleri

Fiilimsi eklerini ezberlemeden anlamsal olarak ne ifade ettiğini anlayınız. ... cebirsel ifadelerde işlemler, denklemler, silindir, koordinat sistemi) mutlaka tekrar ... «Haber7.com, Окт 15»

TEOG tarihleri: TEOG sınavları ne zaman başlıyor?

Fiilimsi eklerini ezberlemeden anlamsal olarak ne ifade ettiğini anlayınız. ... cebirsel ifadelerde işlemler, denklemler, silindir, koordinat sistemi) mutlaka tekrar ... «Haber7.com, Окт 15»

TEOG çıkacak sorular TEOG sınav tarihleri ne zaman

Fiilimsi eklerini ezberlemeden anlamsal olarak ne ifade ettiğini anlayınız. ... cebirsel ifadelerde işlemler, denklemler, silindir, koordinat sistemi) mutlaka tekrar ... «Haber7.com, Окт 15»

TEOG boş kontenjanlar ek yerleştirme tarihleri

*2. ortak sınavlarda konuların daha yoğun olması sebebiyle 7. sınıfın bazı konuları (rasyonel sayılar da işlemler, cebirsel ifadelerde işlemler, denklemler, silindir, ... «Haber7.com, Окт 15»

ULUDERELİ MUHAMMET ENCUNUN PROJESİ İLGİ GÖRDÜ - VAN …

Projesini anlatan Encu, “Projemin amacı aslında matematiğin önemli konularından biri olan tam sayılar ve cebirsel ifadeler konularına yeni yaklaşımları ... «HaberVan, Май 15»

Ortak sınavlara girecek öğrenciler için ipuçları hazırlandı [152] haberi

*2. ortak sınavlarda konuların daha yoğun olması sebebiyle 7. sınıfın bazı konuları (rasyonel sayılar da işlemler, cebirsel ifadelerde işlemler, denklemler, silindir, ... «Haberahval! Haber, iş ve yaşam portalı, Май 15»

TEOG Türkçe Sınav Soruları ve Cevapları 29 Nisan 2015

Elif'in kısa mesaja ifadeler ekleyerek gönderdiği soruda Elif'in çözüm bulduğu iletişim sorunu: B) ... SORU: A – Cebirsel ifade çarpanlara ayrılırsa a+b = 7 olacak. «e Okul Meb, Апр 15»


ССЫЛКИ

« EDUCALINGO. Cebirsel ifade [онлайн]. Доступно на <https://educalingo.com/ru/dic-tr/cebirsel-ifade>. Июн 2023 ».

 Nihat Demirli


74 downloads 813 Views 12MB Size Report

This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!

Report copyright / DMCA form

DELPHI 7

II

ZİRVEDEKİ BEYİNLER

Nihat DEMİRLİ

Yüksel İNAN

DELPHI 7

Yayınları

Kitap Yazarları Nihat DEMİRLİ MCP-MCSE-MCDBA-MCSD-MCAD [email protected] M. Yüksel İNAN MCP-MCP+INT-MCSA-MCSE-MCDBA-MCSD-MCT-MCAD [email protected] Teknik Editör Sibel YANAR MCP-MCSE ISBN: 975-92267-0-7 Prestie Education Center Merkez Halitağa Cd. Kıvanç Sok. No: 1/5 Kadıköy/İSTANBUL Tel: 0216. 330 06 50 (pbx) 0216. 449 54 78 0216. 345 71 75 Fax: 0216. 345 71 75 Şube Gazi Üniversitesi Mühendislik-Mimarlık Fakültesi Maltepe / ANKARA Tel: 0312. 231 74 00 / 1031 (Dahili) mail: [email protected] web: www.prestigeturk.com Yayına Hazırlayan – Kapak Selman Ali METİN Baskı Ümit Ofset Matbaacılık Büyük Sanayi 1. Cad. 107/32-39-40-54 İskitler / ANKARA Tel: 0312. 384 26 27 – 384 17 07 Ankara, 2003 Kitabın tüm hakları Prestij Bilişim Eğitim-Öğretim Turizm Hiz. Tic. Ltd. Şti.’ne aittir. İzinsiz olarak kısmen veya tamamen kullanılması, kopyalanması ve çoğaltılması yasaktır.

IV

ÖNSÖZ

Zirvedeki Beyinler serisine ait beşinci kitabımızla karşınızdayız. Serimizi tamamlama aşamasında bizlere göstermiş olduğunuz ilgiye, öneri ve isteklerinize teşekkürlerimizi sunuyoruz. Bu sefer Microsoft ürünü olmayan bir yazılım dili üzerine birikimlerimizi sizlerle paylaşmak istedik. Delphi'yi çok sevdiğinizi bu hususta kaynak sıkıntısı çektiğinizi biliyoruz. Amacımız bu kadar fazla sevilen bir dil hususunda mümkün olduğu kadar geniş çaplı bir inceleme yapıp sonuçları sizlerle paylaşmaktan ibarettir. Delphi ile yazılmış birçok uygulamamızın halen aktif olarak büyük ve orta ölçekli firmalarda kullanıldığını,kodlarının Kitabın bazı bölümlerinde ufak modüller halinde sizlere sunulduğunu göreceksiniz. Diğer kitaplarımıza göstermiş olduğunuz ilgiyi aynen bu kitaba da göstermeniz temennisiyle "Delphi 7 İle Veritabanı ve Network Uygulamaları" Kitabımızda görüşmek üzere. Bütün Hayalleriniz Gerçek Olsun.........

Sibel YANAR Teknik Editör

VI

TEŞEKKÜR Üniversitemize bağlı olarak çalışan Prestige firmasının üniversitemiz bünyesinde öğrencilerimize ve akademik personelimize sağladığı eğitim olanakları ve yaptığı çalışmalar için Sayın Nihat DEMİRLİ ve Yüksel İNAN’a teşekkür ederim.

Prof. Dr. Hüsnü CAN G.Ü. Müh.-Mim. Fak. DEKANI

TEŞEKKÜR Bakım-onarım işlerimizin bilgisayar ortamında dosyalama ve takibi ile ilgili program çalışmasına yaptığı yardım için Sayın Nihat DEMİRLİ ve Yüksel İNAN’a teşekkür ederim.

T. KARLIDAĞ Migros Türk T.A.Ş. İnş. Emlak Müd.

IX

TEŞEKKÜR Bankamız Güvenlik Sistemleri ve Kredi Kartı Uygulama çalışmalarına yönelik yazılım+danışmanlık hizmetlerinden dolayı Nihat DEMİRLİ ve Yüksel İNAN’a teşekkür ederiz.

Burak AKTAŞ INTERBANK İnş. Emlak Md.

XII

İÇİNDEKİLER BÖLÜM 1 DELPHI’YE GİRİŞ .............................................................................................. 1 Delphi 7’ye Giriş ..................................................................................... 3 Component Palette ................................................................................... 4 Object Inspector ....................................................................................... 6 Events’lara Erişebilmek........................................................................... 6 Kod Penceresine Ulaşmak ....................................................................... 7 Kod (Unit) Penceresinin Özellikleri ........................................................ 8 Ctrl+Space Tuşunun Beraber Kullanılması............................................. 8 Kod Penceresinde “.” Karakterinin Kullanılması.................................... 8 Object TreeView Penceresi ..................................................................... 9 Delphi Dosya Uzantıları .......................................................................... 10 Kod Penceresine Ait Font Ayarları.......................................................... 11 Uses İfadesi.............................................................................................. 12 Project Manager Penceresi....................................................................... 14 Window List Penceresi ............................................................................ 15 BÖLÜM 2 DELPHİ’NİN TEMELLERİ................................................................................ 17 Örnekleri Yapabilmeniz İçin Gerekli Olan Pratik Kodlar....................... 19 Aktif Formu Kapatmak............................................................................ 23 Alt Satırdaki Kodların İşlemesini Engellemek ........................................ 23 Programı Sonlandırmak ........................................................................... 24 Programı İkinci Formdan Başlatmak....................................................... 24 Herhangi Bir Exe Uygulamasını Çalıştırmak .......................................... 25 Ağdaki Bir Bilgisayarda Bulunan Exe Uzantılı Dosyayı Çalıştırmak .... 25 Değişkenler .............................................................................................. 26 Değişken Tanımlarken Dikkat Edilecek Olan Hususlar.......................... 27 Tam Sayı Değişken Tipleri............................................... ....... 29 Reel Sayı Değişken Tipleri............................................... ....... 31 String Değişken Tipleri..................................................... ....... 33 Boolean Tip Değişken Tanımlamak ................................. ....... 34 Tarihsel İçerikli Değişken Tanımlamak ........................... ....... 34 Delphi’de Sabit Değişken Tanımlamak............................ ....... 35 Local Static Değişken Tanımlamak.................................. ....... 35 Tüm Alt Yordamlar Tarafından Kullanılabilecek Değişken Tanımlamak ............................................................................................. 37 Tüm Formlar Tarafından Kullanılabilecek Değişken Tanımlamak ........ 39 Tip Tanımlamaları ................................................................................... 41 Enumerated Types ............................................................ ....... 41 Subrange Types................................................................. ....... 46

Set Types........................................................................... ....... 47 Record Types .................................................................... ....... 50 With-do bloğu .......................................................................................... 50 Dizi Değişkenler ...................................................................................... 52 Sabit Uzunluklu Dizi Değişken Tanımlamak................... ....... 52 Sabit Uzunluklu İki Boyutlu Dizi Tanımlamak................ ....... 55 Değişken Uzunluklu (Dinamik) Dizi Değişken Tanımlamak .. 58 Çok Boyutlu Dinamik Dizi Tanımlamak.......................... ....... 60 Dinamik Dizileri Yeniden Boyutlandırmak ..................... ....... 62 BÖLÜM 3 DELPHI’DE ATAMA İŞLEMLERİ & OPERATÖRLER .............................. 63 Delphi’de Kullanılan Operatörler ............................................................ 65 Matematiksel Operatörler ................................................. ....... 65 Logical Operatörler........................................................... ....... 66 Delphi’de Diğer Atama İşlemleri ............................................................ 68 BÖLÜM 4 DELPHI’DE DALLANMA & DÖNGÜ KOMUTLARI ................................... 73 IF Yapısının Delphi’de Kullanım Şekilleri ............................................. 75 Tek Satırda Birden Fazla Şartı Kontrol Etmek (And & Or).................... 80 Is Operatörü Kullanarak Karşılaştırma Yapmak ..................................... 85 Case Yapısının Delphi’de Kullanım Şekilleri ......................................... 86 Döngüler .................................................................................................. 89 For Döngüsü ..................................................................... ....... 89 Repeat Until Döngüsü....................................................... ....... 96 While Do Döngüsü ........................................................... ....... 99 Sıralama Algoritmaları ............................................................................ 100 Bubble Sort ....................................................................... ....... 101 Bubble Sort ...................................................................... ....... 103 Shell Sort........................................................................... ....... 104 Selection Sort.................................................................... ....... 105 Quick Sort ......................................................................... ....... 106 Döngü Yönlendirme Komutları ............................................................... 107 Continue............................................................................ ....... 107 Break ................................................................................. ....... 108 Exit.................................................................................... ....... 108 Halt.................................................................................... ....... 109 Application.Terminate ...................................................... ....... 110 Sleep Komutu ................................................................... ....... 112 Application.ProcessMessages........................................... ....... 113

XIV

BÖLÜM 5 DELPHI’DE FONKSİYON & PROSEDÜRLER.............................................. 115 Delphi’de Prosedürler .............................................................................. 117 Prosedürleri Diğer Yordamlara Bildirmek ....................... ....... 119 Parametre İçeren Prosedür Tanımlamak........................... ....... 119 Birden Fazla Parametreli Prosedür Tanımlamak.............. ....... 121 Dizi Parametreli Prosedür Tanımlamak ........................... ....... 123 Dinamik Dizi Parametreli Prosedür Tanımlamak ............ ....... 124 Opsiyonel Parametreli Prosedür Tanımlamak.................. ....... 125 Delphi’de Fonksiyonlar ........................................................................... 127 Fonksiyonlarda Aşırı Yükleme......................................... ....... 128 Dizi Parametreli Fonksiyon Tanımlamak......................... ....... 130 Okek Hesaplayan Fonksiyon ............................................ ....... 131 Obeb Hesaplayan Fonksiyon ............................................ ....... 133 Fonksiyonlara Birden Fazla Değer Hesaplatmak ............. ....... 135 Delphi’de Rekürsif Fonksiyonlar ..................................... ....... 139 BÖLÜM 6 BİLGİLENDİRME PENCERELERİ ................................................................. 141 Mesaj Pencereleri..................................................................................... 143 ShowMessage ................................................................... ....... 143 ShowMessagePos.............................................................. ....... 144 ShowMessageFmt............................................................. ....... 145 MessageDlg ...................................................................... ....... 147 Basılan Düğmeye Göre Kod Satırlarını İşletmek .................................... 153 MessageDlgPos................................................................. ....... 155 Application.MessageBox.................................................. ....... 156 InputBox Fonksiyonu .............................................................................. 164 InputQuery Fonksiyonu ........................................................................... 170 Idle Olayı Yaratarak Projeyi Kontrol Etmek ........................................... 173 İki Kontrolün Aynı Eventı Kullanması.................................................... 176 BÖLÜM 7 DELPHİ’DE HATA YAKALAMA ..................................................................... 179 Delphi’de Oluşabilecek İllegal Durumları Çözmek ................................ 181 Lokal Hata Yakalama ....................................................... ....... 181 Try-except-End ...................................................... ....... 181 Try-Finally-End ...................................................... ....... 185 Genel Hata Yakalama ....................................................... ....... 185

XV

BÖLÜM 8 DELPHI’DE UNIT KAVRAMI........................................................................... 189 Unit Penceresi: ......................................................................................... 191 Uygulama 1....................................................................... ....... 193 Uygulama 2....................................................................... ....... 194 BÖLÜM 9 DELPHİ’DE CLASS YAPISI .............................................................................. 203 Delphi’de Class Uygulamaları................................................................. 205 Adım Adım Class Oluşturmak.......................................... ....... 205 Class İçerisinde Tanımlanan Değişkene Erişmek ............ ....... 208 Class İçesisinde Tanımlanan Fonksiyona Erişmek .......... ....... 210 Class içerisinde oluşturulmuş Olan Prosedüre Erişmek... ....... 214 Class lara Özellik Eklenmesi ............................................ ....... 218 Form Kullanmayan Windows Uygulamaları Geliştirmek....................... 222 BÖLÜM 10 İŞARETÇİLER & KATARLAR ......................................................................... 225 Delphi’de Pointer Değişkenlerin Yeri ..................................................... 227 İşaretçi Bildirimi ............................................................... ....... 227 İşaretçilere Adres Göstermek ........................................... ....... 228 İşaretçilere Değer Atamak ................................................ ....... 228 İşaretçileri Aritmetik İşlemlerde Kullanmak.................... ....... 231 Kullanıcı Tanımlı Tip Değişkeni Olarak Pointer Kullanmak .. 232 İşaretçilerin Dizi Değişkenlerle Beraber Kullanılması..... ....... 233 İşaretçi İle Dizi Elemanları Arasında Dolaşmak .............. ....... 235 İşaretçi Fonksiyon İlişkisi................................................. ....... 238 İşaretçi Prosedür İlişkilendirilmesi ................................... ....... 240 İşaretçi Class İlişkisi ......................................................... ....... 241 Katarlar .................................................................................................... 242 Katar Bildiriminin Yapılması ........................................... ....... 242 Karakterler Arasında Gezinmek ....................................... ....... 244 Katarları Char Tipli Dizi Değişken Olarak Tanımlamak . ....... 246 BÖLÜM 11 DLL DOSYALARI OLUŞTURMAK ................................................................. 249 DLL Ne İşe Yarar .................................................................................... 251 Dll İçerisinde Prosedür Oluşturmak ........................................................ 253 Dll İçerisindeki Prosedüre Programdan Ulaşmak ................................... 253 Dll İçerisinde Fonksiyon Oluşturmak...................................................... 254 Dll İçerisindeki Fonksiyona Programdan Erişmek.................................. 255

XVI

BÖLÜM 12 DELPHİ FONKSİYONLARI .............................................................................. 259 Fonksiyonlara Giriş.................................................................................. 261 Matematiksel Fonksiyonlar .............................................. ....... 261 Abs .......................................................................... ....... 261 Ceil.......................................................................... ....... 262 Floor........................................................................ ....... 262 Trunc....................................................................... ....... 263 Frac ......................................................................... ....... 264 Exp .......................................................................... ....... 264 Int............................................................................ ....... 265 IntPower.................................................................. ....... 265 Ln ............................................................................ ....... 266 Log10...................................................................... ....... 266 Log2........................................................................ ....... 267 LogN ....................................................................... ....... 267 Max ......................................................................... ....... 268 Min.......................................................................... ....... 268 Muldiv..................................................................... ....... 269 Pi ............................................................................. ....... 269 Poly ......................................................................... ....... 270 Power ...................................................................... ....... 271 Round...................................................................... ....... 271 RoundTo ................................................................. ....... 272 Sign ......................................................................... ....... 273 SimpleRoundTo...................................................... ....... 274 Sqr........................................................................... ....... 274 Sqrt.......................................................................... ....... 275 Inc ........................................................................... ....... 275 Dec .......................................................................... ....... 276 Div .......................................................................... ....... 277 Mod......................................................................... ....... 277 Shl ........................................................................... ....... 278 Shr........................................................................... ....... 278 Tarih – İçerikli Fonksiyonlar ............................................ ....... 283 CompareDate .......................................................... ....... 283 CompareDateTime.................................................. ....... 283 CompareTime ......................................................... ....... 284 CurrentYear ............................................................ ....... 284 Date......................................................................... ....... 284 DateOf..................................................................... ....... 285 DateTimeToStr ....................................................... ....... 286 DateToStr................................................................ ....... 286 XVII

DayOfWeek ............................................................ ....... 287 DayOf ..................................................................... ....... 288 DayOfTheMonth .................................................... ....... 288 DayOfTheWeek...................................................... ....... 289 DayOfTheYear ....................................................... ....... 289 DaysBetween .......................................................... ....... 289 DaysInMonth .......................................................... ....... 290 DaysInAMonth ....................................................... ....... 290 DaysInAYear .......................................................... ....... 291 DaysInYear ............................................................. ....... 291 DaySpan.................................................................. ....... 292 DecodeDate............................................................. ....... 292 DecodeDateDay...................................................... ....... 293 DecodeDateMonthWeek ........................................ ....... 293 DecodeTime............................................................ ....... 294 EncodeDate............................................................. ....... 295 EncodeDateDay ...................................................... ....... 295 EncodeDateMonthWeek......................................... ....... 296 EncodeDateWeek ................................................... ....... 296 EncodeDayOfWeekInMonth.................................. ....... 297 EncodeTime............................................................ ....... 297 EndOfADay ............................................................ ....... 297 EndOfAMonth ........................................................ ....... 298 EndOfAWeek ......................................................... ....... 298 EndOfAYear ........................................................... ....... 299 FormatDateTime..................................................... ....... 299 IncAMonth.............................................................. ....... 300 IncDay..................................................................... ....... 300 IncMonth................................................................. ....... 301 IncWeek.................................................................. ....... 301 IncYear ................................................................... ....... 302 IsInLeapYear .......................................................... ....... 302 IsLeapYear.............................................................. ....... 303 IsToday ................................................................... ....... 303 IsValidDate ............................................................. ....... 304 MonthOf ................................................................. ....... 304 MonthOfTheYear ................................................... ....... 305 MonthsBetween ...................................................... ....... 305 Now......................................................................... ....... 306 NthDayOfWeek ...................................................... ....... 306 RecodeDate............................................................. ....... 306 RecodeYear............................................................. ....... 307 ReplaceDate............................................................ ....... 308 XVIII

StartOfADay ........................................................... ....... 308 StartOfAMonth ....................................................... ....... 309 StartOfAWeek ........................................................ ....... 309 StartOfAYear.......................................................... ....... 310 StartOfTheMonth.................................................... ....... 310 StartOfTheWeek ..................................................... ....... 310 StrToDate................................................................ ....... 311 StrToDateDef.......................................................... ....... 311 StrToDateTime ....................................................... ....... 312 StrToDateTimeDef ................................................. ....... 312 StrToTime............................................................... ....... 313 StrToTimeDef......................................................... ....... 313 Time-GetTime ........................................................ ....... 314 TimeOf.................................................................... ....... 314 TimeToStr............................................................... ....... 315 Today ...................................................................... ....... 315 Tomorrow ............................................................... ....... 316 WeekOf................................................................... ....... 316 WeekOfTheMonth.................................................. ....... 316 WeeksBetween ....................................................... ....... 317 WeeksInAYear ....................................................... ....... 317 YearOf .................................................................... ....... 318 YearsBetween ......................................................... ....... 318 Yesterday ................................................................ ....... 319 String – İçerikli Fonksiyonlar........................................... ....... 320 AnsiCompareStr ..................................................... ....... 320 AnsiCompareText................................................... ....... 320 AnsiDequotedStr .................................................... ....... 321 AnsiLeftStr ............................................................. ....... 322 AnsiLowerCase ...................................................... ....... 322 AnsiMidStr ............................................................. ....... 323 AnsiPos ................................................................... ....... 324 AnsiReplaceStr ....................................................... ....... 325 AnsiReplaceText .................................................... ....... 326 AnsiReverseString ................................................. ....... 326 AnsiRightStr ........................................................... ....... 327 AnsiUpperCase ....................................................... ....... 327 CompareStr ............................................................. ....... 328 CopmpareText ........................................................ ....... 328 Concat ..................................................................... ....... 329 Copy........................................................................ ....... 329 Delete...................................................................... ....... 330 DupeString.............................................................. ....... 330 XIX

Insert ....................................................................... ....... 331 LeftBStr .................................................................. ....... 331 Length ..................................................................... ....... 332 LowerCase .............................................................. ....... 332 MidStr ..................................................................... ....... 332 Pos........................................................................... ....... 333 RightStr................................................................... ....... 333 SetLength................................................................ ....... 334 SetString ................................................................. ....... 334 Str............................................................................ ....... 335 StringOfChar .......................................................... ....... 335 StringReplace.......................................................... ....... 336 StuffString............................................................... ....... 337 Trim ........................................................................ ....... 337 TrimLeft.................................................................. ....... 338 TrimRight ............................................................... ....... 338 UpperCase............................................................... ....... 338 WrapText ................................................................ ....... 339 Chr .......................................................................... ....... 339 Ord .......................................................................... ....... 340 Val........................................................................... ....... 341 StrToInt................................................................... ....... 342 StrToIntDef............................................................. ....... 343 StrToFloat ............................................................... ....... 344 StrToFloatDef ......................................................... ....... 344 IntToStr(sayi)-FloatToStr....................................... ....... 345 FloatToStrF............................................................. ....... 345 FormatFloat............................................................. ....... 347 Rasgele Sayı Üretim Fonksiyonları.................................. ....... 348 RandomFrom .......................................................... ....... 349 RandomRange ........................................................ ....... 350 Sayısal Loto Programı ............................................ ....... 350 Dizi Fonksiyonları ............................................................ ....... 352 Mean ....................................................................... ....... 352 Sum ......................................................................... ....... 352 SumInt..................................................................... ....... 353 SumOfSquares ........................................................ ....... 353 SumsAndSquares.................................................... ....... 354 TotalVariance ......................................................... ....... 354 Variance.................................................................. ....... 355 EnsureRange ........................................................... ....... 355 High ........................................................................ ....... 355 Low ......................................................................... ....... 356 XX

MaxIntValue ........................................................... ....... 357 MaxValue ............................................................... ....... 357 MinIntValue............................................................ ....... 358 MinValue ................................................................ ....... 358 Klasör ve Dosya Fonksiyonları ........................................ ....... 360 ChDir ...................................................................... ....... 360 CloseFile ................................................................. ....... 360 CreateDir................................................................. ....... 361 DeleteFile................................................................ ....... 361 DirectoryExists ....................................................... ....... 362 DiskFree.................................................................. ....... 362 DiskSize.................................................................. ....... 363 FileAge ................................................................... ....... 363 FileDateToDateTime .............................................. ....... 363 FileExists ................................................................ ....... 364 FileGetAttr.............................................................. ....... 364 FileIsReadOnly ....................................................... ....... 365 FileSearch ............................................................... ....... 366 FileSetAttr............................................................... ....... 366 FindFirst.................................................................. ....... 367 FindNext ................................................................. ....... 367 ForceDirectories ..................................................... ....... 368 GetCurrentDir ......................................................... ....... 369 GetDir ..................................................................... ....... 369 RemoveDir.............................................................. ....... 369 RenameFile ............................................................. ....... 370 SelectDirectory ....................................................... ....... 371 ExtractFileDir ......................................................... ....... 372 ExtractFileDrive ..................................................... ....... 373 ExtractFileExt ......................................................... ....... 373 ExtractFileName ..................................................... ....... 374 ExtractFilePath ....................................................... ....... 374 ExtractShortPathName ........................................... ....... 375 WinExec ................................................................. ....... 375 Fonksiyonları Network Ortamında Kullanmak ................ ....... 377 Klasörün Paylaşıma Açılması................................. ....... 377 UNC Path Nasıl Belirtilir ....................................... ....... 377 Makineler Arası Dosya Transferi ........................... ....... 378 Diğer Makinedeki Dosyayı Silmek ........................ ....... 378 Diğer Makinedeki “exe” Uygulamasını Çalıştırmak...... 379 Log Dosyası Oluşturmak: ................................................. ....... 380 “TextFile” Kullanarak Dosyadan Veri Okumak .... ....... 383 “TextFile” Kullanarak Dosyaya Veri Yazmak...... ....... 384 XXI

BÖLÜM 13 DELPHİ KONTROLLERİ .................................................................................. 387 Form Özellikleri....................................................................................... 389 MDI Form Oluşturmak ............................................................................ 403 Label Kontrolü ......................................................................................... 405 Edit Kontrolü ........................................................................................... 408 Button Kontrolü ....................................................................................... 425 BitBtn Kontrolü ....................................................................................... 428 CheckBox Kontrolü ................................................................................. 430 RadioButton Kontrolü.............................................................................. 433 GroupBox Kontrolü ................................................................................. 434 Panel Kontrolü ......................................................................................... 437 ListBox Kontrolü ..................................................................................... 438 ComboBox Kontrolü................................................................................ 460 ImageList Kontrolü.................................................................................. 465 ListView Kontrolü ................................................................................... 466 TreeView Kontrolü .................................................................................. 472 TabControl Kontrolü................................................................................ 482 DateTimePicker Kontrolü........................................................................ 489 MonthCalendar Kontrolü......................................................................... 492 ScrollBar Kontrolü................................................................................... 495 Splitter Kontrolü ...................................................................................... 498 UpDown Kontrolü ................................................................................... 500 TrackBar Kontrolü ................................................................................... 504 ProgressBar Kontrolü .............................................................................. 507 ToolBar Kontrolü..................................................................................... 510 Basılı Kalabilen Button Oluşturmak................................. ....... 514 Açılabilir Button Oluşturmak ........................................... ....... 514 Grup Halinde Çalışan Buttonlar Oluşturmak: .................. ....... 516 StatusBar Kontrolü .................................................................................. 519 Timer Kontrolü ........................................................................................ 524 MainMenu Kontrolü ................................................................................ 529 Alt Menüler Yaratmak ...................................................... ....... 530 Menü Seçeneklerine Kod Yazmak ................................... ....... 531 Menü Seçeneklerine CheckBox Eklemek ........................ ....... 531 Menü Seçeneklerine Resim Eklemek ............................... ....... 532 PopupMenu Kontrolü .............................................................................. 533 MaskEdit Kontrolü .................................................................................. 535 Gauge Kontrolü........................................................................................ 536 OpenDialog Kontrolü .............................................................................. 539 SaveDialog Kontrolü ............................................................................... 543 XXII

FontDialog Kontrolü................................................................................ 546 ColorDialog Kontrolü .............................................................................. 548 Memo Kontrolü........................................................................................ 549 BÖLÜM 14 DELPHI YORDAMLARI .................................................................................... 551 Yordamlar ................................................................................................ 553 OnClick ............................................................................. ....... 553 OnDblClick Yordamı........................................................ ....... 554 OnChange Yordamı .......................................................... ....... 554 Mous Tuşları İle Tetikleyebileceğiniz Yordamlar................................... 558 OnMousDown Yordamı ................................................... ....... 558 OnMousUp Yordamı ........................................................ ....... 560 OnMouseMove Yordamı .................................................. ....... 561 OnClose Yordamı .................................................................................... 562 OnCreate Yordamı ................................................................................... 563 OnEnter Yordamı..................................................................................... 564 OnExit Yordamı....................................................................................... 565 OnActivate Yordamı................................................................................ 566 OnDeactivate Yordamı ............................................................................ 567 OnDragDrop-OnDragEnd-OnDragOver ................................................. 567 OnResize Yordamı................................................................................... 567 Klavye Tuş Vuruşlarıyla Tetiklenen Yordamlar ..................................... 568 OnKeyDown Yordamı...................................................... ....... 568 OnKeyUp Yordamı........................................................... ....... 571 OnKeyPress Yordamı ....................................................... ....... 571 OnDestroy Yordamı................................................................................. 573 OnShow Yordamı .................................................................................... 573 OnHide Yordamı...................................................................................... 573 BÖLÜM 15 DELPHI’DE DRAG & DROP ............................................................................. 575 Drag & Drop (Sürükle-Bırak).................................................................. 577 OnDragOver Yordamı ...................................................... ....... 581 OnDragDrop Yordamı ...................................................... ....... 582 BÖLÜM 16 DELPHI’DE KONTROLLERİ & YORDAMLARI KODLA OLUŞTURMAK.................................................................................................... 589 Kontrolleri ve Yordamları Kodla Oluşturmak......................................... 591 İki Kontrolun Aynı Yordamı Kullanması................................................ 595

XXIII

BÖLÜM 17 DELPHI’DE VERİTABANI ................................................................................ 601 VeriTabanı Uygulamaları: ....................................................................... 603 BDE Kontrolleri....................................................................................... 604 Table Kontrolü.................................................................. ....... 604 Query Kontrolü ................................................................. ....... 604 StoredProc Kontrolü ......................................................... ....... 604 Database Kontrolü ............................................................ ....... 605 Paradox Tablolarına Bağlantı .................................................................. 605 Alias Tanımlamak.................................................................................... 605 Paradox’ta Tablo Oluşturmak.................................................................. 607 Tablo Yapısında Değişiklik Yapmak....................................................... 609 DataBase Destop’ı Kullanarak Tabloya Kayıt Girmek ........................... 609 Uygulamanızdan Paradox Tablolarına Bağlanmak ................................. 610 Resimli veya CheckBox İçeren Tablo Sütunlarıyla Bağlantı.................. 611 Wizard Kullanarak Veri Tabanına Bağlanmak........................................ 611 DBNavigator Kontrolü ............................................................................ 615 DBNavigator Kontrolü İçin Tıklanan Düğmeye Kod Yazmak ............... 617 Kayıtları DataGrid Nesnesinde Göstermek ............................................. 619 Kayıt İşlemlerini Kodla Yapmak............................................................. 620 Bağlantı İşlemlerinin Kodla Yapmak ...................................................... 622 Veri Tabanında Olmayan Sütunlar Yaratmak ......................................... 631 Yaratılan Sütun Değerlerini Tablonuzda Hesaplatmak ........................... 633 DataGrid Kontrolüne Ait Özellikler ........................................................ 634 DataGrid Kontrolüne Ait Sütun Başlıklarını Belirlemek . ....... 635 DataGrid Sütun Başlıklarının Ortalanması....................... ....... 636 DataGrid Sütun Genişliklerini Ayarlamak ....................... ....... 637 DataGrid Sütunlarını ReadOnly Yapmak......................... ....... 637 DataGrid Sutununu ComboBox Şeklinde Kullanmak...... ....... 637 DataGrid Kontrolüne Ait Sütun Başlıklarını Renklendirmek .. 638 DataGrid Sütunlarını Renklendirmek ............................... ....... 638 DataGrid Font Ayarları..................................................... ....... 638 DataGrid Kontrolünde İşe Yaramayan Sütunları Gizlemek..... 639 DataGrid Kontrolünde Sütun Başlıklarını Gizlemek ....... ....... 640 Kayıt Filtreleme İşlemleri........................................................................ 641 Filtrelenmiş Kayıtlar Arasında Gezinmek ............................................... 644 Filtreli Kayıtlarda Bir Sonrakini Git................................. ....... 644 Filtreli Kayıtlarda Bir Öncekine Git ................................. ....... 645 Filtreli Kayıtlarda İlk Kayda Git ...................................... ....... 645 Filtreli Kayıtlarda Son Kayda Git..................................... ....... 645 Tarih Aralığına Göre Filtre Uygulamak ........................... ....... 645 Secondary Index Tanımlamak .......................................... ....... 645 Parasal Aralığa Göre Filtre Uygulamak ........................... ....... 648 XXIV

Kayıt Arama İşlemleri ............................................................................. 651 Locate Methodu ................................................................ ....... 651 Birden Fazla Sütuna Göre Arama Yaptırmak................... ....... 653 SetKey-GotoKey Methodları............................................ ....... 654 SetKey-GotoNearest Methodları ...................................... ....... 655 Lookup Methodu............................................................... ....... 656 Transaction İşlemi.................................................................................... 658 Database Kontrolü ................................................................................... 658 Database1.StartTransaction .............................................. ....... 659 Database1.Commit............................................................ ....... 659 Database1.Rollback .......................................................... ....... 660 Query Kontrolü ........................................................................................ 664 Query Kontrolüne Ait Yordamlar..................................... ....... 667 Wizard Kullanarak Query Kontrolüyle Tabloya Bağlanmak... 669 Query Kontrolüne Parametre Değeri Göndermek ............ ....... 670 Parametre Olarak Tarih İçerikli Değişken Kullanmak..... ....... 673 Parametre Olarak Parasal İçerikli Değişken Kullanmak .. ....... 674 Birden Fazla Parametre Değeri Göndermek..................... ....... 675 Opsiyonel Parametreli Sorgu Oluşturmak........................ ....... 676 Birden Fazla Tablo İle Çalışmak ............................................................. 678 Master Detail Form Yapısını Mauel Oluşturmak .................................... 682 Master-Detail Tablolarda Kayıt Arama İşlemleri.................................... 683 Lookup İşlemleri...................................................................................... 685 DBLookupComboBox Kontrolü ...................................... ....... 685 DBLookupListBox Kontrolü ............................................ ....... 689 Tabloda Lookup Sütunları Yaratmak ...................................................... 691 Rapor Dosyaları Oluşturmak ................................................................... 695 QuickRep Kontrolü........................................................... ....... 696 QRSubDetail Kontrolü ..................................................... ....... 696 QRBand Kontrolü ............................................................. ....... 696 QRGroup Kontrolü ........................................................... ....... 696 QRLabel Kontrolü ............................................................ ....... 696 QRDBText Kontrolü ........................................................ ....... 696 QRExpr Kontrolü.............................................................. ....... 696 QRSysData Kontrpolü ...................................................... ....... 696 QRMemo Kontrolü ........................................................... ....... 696 QRRichText Kontrolü ...................................................... ....... 697 QRShape Kontrolü............................................................ ....... 697 QRImage Kontrolü ........................................................... ....... 697 QRDBImage Kontrolü...................................................... ....... 697 Gruplandırılmış Rapor Dosyası Oluşturmak ........................................... 702 Rapor Dosyasına Uygulamanızdan Erişmek ........................................... 709

XXV

BÖLÜM 18 REGISTRY İŞLEMLERİ .................................................................................... 711 Registry .................................................................................................... 713 Registry’ye Veri Yazdımak .............................................. ....... 714 Alt Klasöre Veri Eklemek ................................................ ....... 717 Ana Root’a Alt Klasör Eklemek....................................... ....... 718 Alt Klasöre Değişken Eklemek ........................................ ....... 719 Registry’den Kayıt Okutmak............................................ ....... 719 Ana Root Altındaki Bir Değişkenin Değerini Öğrenmek ....... 720 Alt Klasörden Değişken Değeri Okutmak........................ ....... 720 Windows Registry Bilgilerini Okutmak ........................... ....... 721 Alt Klasör Silmek ............................................................. ....... 722 Alt Klasör İçerisindeki Değişkeni Silmek ........................ ....... 722 Ana Root Altındaki Değişkenleri Öğrenmek ................... ....... 723 AnaRoot Altındaki Alt Klasörleri Öğrenmek................... ....... 723 BÖLÜM 19 KONTROL OLUŞTURMAK .............................................................................. 727 Delphi’de Kontrol Oluşturmak ................................................................ 729 Kontrolü Compenent Paletine Yerleştirmek..................... ....... 731 Active Formu Test Etmek................................................. ....... 733 ActiveX Control Oluşturmak................................................................... 734 ActiveX Control’e Function Eklemek .............................. ....... 735 ActiveX Contrel’e Prosedür Eklemek .............................. ....... 736 ActiveX Control’ün Derlenmesi....................................... ....... 737 AvtiveX Control’ün Component Paletine Eklenmesi ...... ....... 737 Yaratılan ActiveX Control’üm Projelerde Kullanılması.. ....... 738 BÖLÜM 20 EXCEL & .NET TEKNOLOJİSİ........................................................................ 741 Excel Uygulamaları ................................................................................. 743 Excel Dosyası Yaratmak................................................... ....... 743 Excel Dosyasına Yeni Bir Sayfa Eklemek ....................... ....... 743 Excel’deki Aktif Sayfanın İsmini Öğrenmek ................... ....... 744 Excel Dosyasındaki Sayfa Sayısını Öğrenmek ................ ....... 744 Excel Dosyasını Kapatmak............................................... ....... 745 Excel Hücrelerine Veri Aktarmak .................................... ....... 745 Excel Hücrelerinden Veri Okumak .................................. ....... 746 Excel Sayfasında bir Hücreyi Aktif Hale Getirmek ......... ....... 747 Excel Sayfasında Çoklu Hücre Seçtirmek........................ ....... 748 Excel Hücresine Formül Aktarmak .................................. ....... 748 Excel Dosyasından Aktif Sayfayı Silmek ........................ ....... 749 Var Olan Bir Excel Dosyasını Açmak.............................. ....... 749 XXVI

Excel’de Grafik Çizdirmek............................................... ....... 750 .Net Teknolojisi........................................................................................ 752 BÖLÜM 21 UZMANLAR İÇİN BEYİN JİMNASTİĞİ ........................................................ 755 Birazda Beyin Jimnastiği ......................................................................... 757 Uygulama 1....................................................................... ....... 757 Uygulama 2....................................................................... ....... 757 Uygulama 3....................................................................... ....... 758 Uygulama 4....................................................................... ....... 758 Uygulama 5....................................................................... ....... 759 Uygulama 6....................................................................... ....... 759 Uygulama 7....................................................................... ....... 760 Uygulama 8....................................................................... ....... 761 Uygulama 9....................................................................... ....... 762 Uygulama 10..................................................................... ....... 763 Uygulama 11..................................................................... ....... 764 Uygulama 12..................................................................... ....... 765 Uygulama 13..................................................................... ....... 765 Uygulama 14..................................................................... ....... 766 Uygulama 15..................................................................... ....... 767 Uygulama 16..................................................................... ....... 769 Uygulama 17..................................................................... ....... 776 Uygulama 18..................................................................... ....... 777 Uygulama 19..................................................................... ....... 778 Uygulama 20..................................................................... ....... 779 Uygulama 21..................................................................... ....... 781 Uygulama 22..................................................................... ....... 782 Uygulama 23..................................................................... ....... 785 Uygulama 24..................................................................... ....... 785 Uygulama 25..................................................................... ....... 786 Uygulama 26..................................................................... ....... 787 Uygulama 27..................................................................... ....... 790 Uygulama 28..................................................................... ....... 797 Uygulama 29..................................................................... ....... 798 Uygulama 30..................................................................... ....... 799 BÖLÜM 22 SETUP PROJESİ OLUŞTURMAK.................................................................... 801 Setup Projesi Oluşturmak ........................................................................ 803 Setup Projesinin Diğer Bilgisayarlara Yüklenmesi ................................. 811

XXVII

BÖLÜM 1 DELPHI’YE GİRİŞ

2

Delphi 7’ye Giriş: “Delphi 7’ye hoşgeldiniz.” diyerek, kitabımın ilk kısmına geçmek istiyorum. Çok gelişmiş bir yazılım diliyle karşı karşıya olduğunuzun sanıyorum siz de farkındasınız. Gerek veri tabanı uygulamaları, gerekse diğer uygulamalarda (Internet, Intranet, XML, HTML ve .NET desteği) son derece gelişmiş projeler oluşturmak, Delphi ile çok kolaylaşmıştır (çok da güvenilirdir). Bu yüzden ticari yazılımların ülkemizde (diğer bir çok ülkede de) en yaygın olanı sanıyorum Delphi’dir. Kitapta uygulama ve geliştirme alanında kullanabileceğiniz tüm konulara değinilecektir. Eğer herhangi bir kısımda uzmanlaşmak isterseniz, (işiniz gereği vs.) daha fazla teknik bilgiye ihtiyacınız olursa “e-mail” adresimize başvurabilir veya direkt olarak Prestige Education Center’dan yazılım desteği alabilirsiniz (Gerek piyasada bulunan projelerimizle, gerekse de yetiştirdiğimiz binlerce öğrencimizden sonra; bu hususta çok güvenilir bir kaynak olduğumuzu düşünüyoruz). Kitapta; temel konular ve diğer uzmanlık alanlarını da içeren bir çok konu detaylı örneklerle önünüze sunulacaktır. Tecrübemiz; size hikaye anlatmaktan çok, örnek kodlarla beraber detaylı açıklamalarda bulunmamız gerektiğini göstermiştir. Mümkün olduğu kadar bu amacın dışına çıkmamaya çalışacağız. Artık Delphi ekranını tanıyarak, basitten zora doğru kod yazma işlemine geçebiliriz. “Delphi 7” programını bilgisayarınıza kurduktan sonra, aşağıdaki adımları izleyerek (Start-> Programs-> Borland Delphi 7-> Delphi 7) kolayca çalıştırabilirsiniz.

Yukarıdaki adımları izledikten sonra, karşınıza “Delphi 7” açılışına ait (Bilgisayarınızın hızına bağlı olarak ekranda biraz kalabilir.) pencere gelecek, arkasından tasarım ekranına ulaşılacaktır. Bu ekran, hepinizin bildiği gibi Windows Formlarından (veya diğer nesnelerinden) oluşmaktadır. Diğer

3

yardımcı nesneleri bu formlara ekleyerek proje geliştirebilmekteyiz (Windows Formları olmadan da proje geliştirilebilir). Aşağıda karşınıza açılan penceredeki Windows Formlarına ait nesneler gösterilmiştir:

Bu ekran bir çok Windows nesnesinden oluşmakta olup, şimdi sizlere bu pencerelerin ne tür işlemler için kullanılabileceklerinden bahsetmek istiyorum. Component Palette: Bu pencere, “Delphi 7” içerisinde uygulama geliştirebilmeniz için kullanabileceğiniz form dışındaki tüm kontrolleri (Kullanım amaçlarına göre gruplandırma yapılarak ayrı ayrı yapraklar halinde verilmişlerdir.) içerisinde barındıran bir nesnedir.

4

Bu yapraklardan birtanesine tıkladığınız zaman, o gruba ait tüm kontrolleri görebilirsiniz. Hangisini projenizde kullanacaksanız üzerine mousun sol tuşuyla çift tıklayıp, formunuzun üzerine ekletebilirsiniz. Örnek olması açısından “Standart” yaprağında bulunan “Button” kontrolünün üzerine çift tıklayın, formunuzun üzerine eklendiğini göreceksiniz. Boyutlarını ve koordinatlarını mousunuzla kolayca değiştirebilirsiniz. Şimdi de aynı işlemi “Edit” kontrolü için yapın, formunuz aşağıdaki hali alacaktır.

Burada asıl göstermek istediğim; eklemiş olduğunuz her kontrolün kullanacağı kütüphaneyi Delphi’nin otomatik olarak projeye dahil ettiğidir. Peki ama bu kodu nereye ekledi? Tabii ki aşağıdaki “Unit.pas” penceresinin (Formun üzerine çift tıklarsanız erişebilirsiniz.) içerisine (“pas” uzantılı dosyalar yazmış olduğunuz kodları saklarlar.) dosyayı kaydettikten sonra bu kodlar “pas” uzantılı olarak yeni bir dosya oluşturmaktadır.

Buradaki mantık “Nesneden nesne yaratma (Object Oriented)” şeklinde işlemektedir. Daha detaylı olarak açıklayacak olursak, “TButton” Delphi içerisinde bu kontrole ait tüm özelliklerin ve metodların tanımlandığı bir class’tır. “Button1” de, bu Class’tan türetilen yavru üyenin adıdır. Dolayısıyla 5

bu sınıfa ait statik olmayan (Daha sonra açıklanacaktır.) tüm yöntemleri de bünyesinde barındıracaktır. Delphi’nin tüm kontrollere ait kütüphaneleri projenize başlangıç anında eklememesinin sebebi, performansı en üst düzeyde tutmak istemesinden kaynaklanmaktadır (Kullanılmayan bir class’ın projeye eklenmesi sanırım pek hoş olmayacaktır). Neyse son derece teknik olan bu hususlara daha sonraki bölümlerde detaylı olarak değinecek olup, şimdiden kafanızı fazla şişirmek istemiyorum. Object Inspector, Exploring Unit.pas: Bu pencereden projenize eklemiş olduğunuz form ve diğer nesneleri (Button, Edit vs.) izleyebilirsiniz. Şayet buradaki nesnelerden herhangi birtanesinin üzerine mous ile çift tıklarsanız, “Unit.pas” penceresinde o nesnenin tanımlanmış olduğu satıra ulaşabilirsiniz.

Alt kısımda yer alan diğer pencereden de eklemiş olduğunuz kontrole ait özellikleri “Properties” yaprağından değiştirebilirsiniz. Eğer bu pencere ekranda gözükmüyorsa, “View->Object Inspector” adımlarını izleyerek gözükmesini sağlayabilirsiniz. Events’lara Erişebilmek: Delphi içerisinde kod yazabileceğiniz yordamlara (Tetikleyiciler) ulaşabilmek için yukarıdaki pencerenin (Object Inspector) “Events” yaprağına tıklayabilirsiniz. Bu yaprakta hangi yordama kod yazacaksanız, sağında yer alan beyaz kutunun içerisine mous ile çift tıklamalısınız. 6

Aşağıda “Events” yaprağına ait görüntü ekranı verilmiştir. Burada Form’a ait (Seçili eleman form olduğu için) bir çok tetikleyici görüntülenecektir. Bunlar daha sonra detaylı olarak kitabın ilerleyen kısımlarında anlatılmıştır.

Kod Penceresine Ulaşmak: Yukarıdaki pencerede herhangi bir yordama (İsimlerinin sağındaki beyaz alana) mous ile çift tıklarsanız, kodları yazabileceğiniz ekrana kolayca ulaşabilirsiniz. Aşağıdaki pencereye “OnCreate” yordamı çift tıklanılarak ulaşılmıştır.

Bu yordama ait işleteceğiniz kodları yukarıda işaretlenen yerlere yazmalısınız. 7

Kod (Unit) Penceresinin Özellikleri: Yukarıda açmış olduğunuz “Unit” penceresi, görsel dillerle beraber kullanılmaya başlayan bir çok özelliği de beraberinde getirmektedir. Bu ekran bir Editör programının parçası olup, epeyce kullanışlı özelliği bulunmaktadır. Aşağıda en önemli özelliklerinden bahsedilmektedir. • Ctrl+Space Tuşunun Beraber Kullanılması: Unit penceresinde kodlarınızı yazarken herhangi bir komutun baş harflerini hatırlamanız, satırı tamamlamanız için yeterli olacaktır (Kodun doğru yazılabilmesi için devamlı kullanmanızı tavsiye ederim). Aşağıdaki pencerede izlenen adımlara dikkat ediniz.

Bu ekranda “Edi” yazıp “Ctrl+Space” tuşlarına beraberce basarsanız, eklenmiş olan kütüphanelere ait yazabileceğiniz tüm komutları listeleyen yeni bir pencereyle karşılaşacaksınız. Enter tuşuna basarak bu pencereden istediğiniz komutu seçebilirsiniz. • Kod Penceresinde “.” Karakterinin Kullanılması: Yukarıda anlatılan şekilde (Ctrl+Space), kullanacağınız komutun ismini tam olarak yazdırdıktan sonra (Ezbere de yazabilirsiniz tabii ki) klavyeden “.” tuşuna basarsanız, o kontrole (veya komuta) ait tüm özellik ve metodların içerisinde bulunduğu yeni bir listeyle karşılaşırsınız. Hangi özelliği (veya metodu) kullanacaksanız “Enter” tuşuyla seçebilirsiniz (Bu özellik kod yazma kolaylığı açısından gerçekten devrim sayılabilecek bir olaydır). Burada dikkat edeceğiniz husus, eğer bir kontrole ait tüm özellikleri listelemek istiyorsanız; o kontrolün sürüklenip (veya kodla eklenmesi gerekir) formun üzerine bırakılması

8

gerektiğidir. Projeye tanıtılmamış bir kontrolün özelliğini listelemeniz mümkün olmamaktadır. Aşağıda bu olay örneklendirilmiştir.

Kod yazarken bu pencere sizi devamlı olarak yönlendirecektir. Sonuç olarak her zaman doğru kod satırları oluşturmuş olacaksınız. Açılan pencerenin sol kısmına dikkat edecek olursanız komutun bir özellik, procedure veya function olduğu da belirtilmektedir. Sağ tarafta ise metodun veya özelliğin döndürdüğü tip gösterilmektedir. Object TreeView Penceresi: Bu pencere, eklemiş olduğunuz kontrollere ait bilgileri ağaç yapısı şeklinde listelemek için kullanılabilmektedir. Herhangi bir kontrolün üzerine mousun sol tuşuyla tıklarsanız, o kontrolün aktifleşmesini sağlayabilirsiniz. Aynı şekilde mous ile çift tıklama yaparsanız sizi kod sayfasına ulaştıracaktır.

. Eklemiş olduğunuz tüm kontrolleri bu pencereden takip edebilirsiniz. 9

Eğer ekranınızda bu pencere gözükmüyorsa “View->Object TreeView” adımlarını izleyerek gözükmesini sağlayabilirsiniz. Yukarıdaki pencereleri dilerseniz üst üste mous ile yerleştirerek tek bir pencerede gösterilmesini de sağlayabilirsiniz. Uygulama açısından pencerelerin nerede olduğu Delphi’yi fazla ilgilendirmemektedir, hangisi kolayınıza geliyorsa o şekilde kullanabilirsiniz.

Pencereye dikkat edecek olursanız üç farklı yaprağın bulunduğunu görecekseniz. Ekranınızda daha rahat çalışabilmeniz için bu yöntemi uygulamanızı tavsiye ederim. Delphi Dosya Uzantıları: Oluşturduğunuz Delphi projesi aşağıdaki uzantılı dosyaları otomatik olarak oluşturacaktır.

10

Bu uzantılı dosyaları açıklamaya çalışalım. Dosya Uzantısı Dof Dfm Res Pas Dpr

İçeriği Pencere Ayarları Windows Formlarına ait bilgileri Tutar Grafiksel kaynak kodlarını tutar (resim vs.) Unit lere ait kodları Tutar Projeye ait Bilgiler Tutulur

Projenizi kaydedip bir kere çalıştırdıktan sonra aşağıdaki iki dosyada klasörünüze eklenecektir. Dosya Uzantısı İçeriği Exe Tek başına çalıştırılabilir Dosya Dcu Unit kodlarınızın derlendikten sonra tutulduğu dosyadır

Bu iki dosyayı silerek projelerinizi diskete kaydedebilirsiniz. Uygulamanızı her çalıştırdığınızda, bu dosyalar yeniden Delphi tarafından oluşturulacaktır. Kod Penceresine Ait Font Ayarları: Delphi, sizlere Unit penceresine yazacağınız kodları belirlemiş olduğu grup dahilinde değişik formatlarda yazmanıza imkan tanımaktadır. Mesela aynı pencere içerisinde kod satırları ile açıklama satırlarının farklı renkte olması (veya farklı kalınlıkta) bu sayede mümkün olabilmektedir. Dilerseniz tamamen sizin hoşunuza gidebilecek bir düzende oluşturabilirsiniz. Aşağıda kod penceresine ait Editör ayarlarını nasıl yapabileceğiniz açıklanmıştır.

11

“Tools->Editor Options” adımlarından sonra karşınıza aşağıdaki “Editor Properties” penceresi açılacaktır. Bu pencerenin “Color” yaprağını aktif hale getirin.

“Elements” kısmında gruplandırılmış olarak bulunan seçeneklerden bir tanesini seçip, o elemana ait tüm font ayarlarını belirleyebilirsiniz. Yapacağınız değişiklikler sadece “Elements” kısmından seçmiş olduğunuz gruba etki edecektir. Diğer grupta bulunan elemanlar bu değişikliklerden etkilenmeyecektir. Uses İfadesi: Uses deklarasyonu sayesinde, Delphi içerisinde tanımlı olan kütüphaneler (veya sizin oluşturduğunuz diğer Unit leri çağırmak) projeye dahil edilebilirler. Bu sayede kütüphanelerin içerisinde tanımlı olan fonksiyon, değişken, procedure ve özellikleri kolayca kullanabilirsiniz. Uygulamanızın ilk çalışması anında en çok kullanılan kütüphaneleri Delphi otomatik olarak projenize dahil edecektir. Fakat bazı durumlarda sizin dahil edilmeyen kütüphaneler içerisinde tanıtılmış olan metodlara ihtiyacınız olacaktır. İşte bu kütüphaneleri uygulamanıza ancak “Uses” bildirisiyle çağırabilirsiniz. “Uses” bildirisinin nasıl yapılacağı aşağıda gösterilmiştir.

12

Pencereye dikkat edecek olursanız tek bir “uses” deklarasyonu sayesinde araya “,” konularak bir çok kütüphane uygulamanıza dahil edilmiştir (Dahil edilen bu kütüphaneler sadece Unit1 tarafından kullanılabilir). Uses bildirimini daha iyi anlamanız için aşağıdaki örneği dikkatlice inceleyiniz. Örnekte Buttona tıklanılarak kullanıcıya basit bir mesaj iletilmesi istenmiş olup, bu amaçla aşağıdaki kod satırı eklenmiştir.

Programı çalıştırıp Button2’ye tıklayacak olursanız aşağıdaki pencereyle belirtmiş olduğunuz uyarı kullanıcıya iletilecektir.

Peki neden bu uyarı gözüktü? Hemen izah edeyim, çünkü “ShowMessage” fonksiyonu “Dialog” kütüphanesinin içerisinde tanımlanmıştır (Dilerseniz Ctrl tuşu basılıyken mousun sol tuşu ile “ShowMessage” yazısının üzerine tıklayın) . 13

Uses satırında da bu kütüphane projenize dahil edildiği için, Buttona her tıkladığınızda mesaj ayrı bir pencere olarak karşınıza gelecektir.

Şimdi Uses satırında yer alan kütüphanelerden “Dialogs” olanını silip uygulamanızı çalıştırırsanız (çalıştıramayacaksınız) “ShowMessage” fonksiyonunu bulamadığına dair uyarıyı sizlere iletecektir. Project Manager Penceresi: Bu pencere sayesinde projeniz için oluşmuş olan dosyaların kayıtlı oldukları adresleri izleyebilirsiniz. Burada gözüken bir proje grubudur ve bu gruba ait bir çok Delphi dosyasının bulunduğu sanıyorum dikkatinizi çekmiştir.

Şayet bu pencere ekranda gözükmüyorsa “View->Project Manager” adımlarını izleyerek ekranda açtırabilirsiniz. “New” komutuyla ekleme, “Remove” komutuyla da silme işlemini gerçekleştirebilirsiniz.

14

Window List Penceresi: Ekranda gözüküyor konumda olan tüm nesneleri izleyebileceğiniz bir penceredir.

Bu pencereden herhangi bir nesneyi seçip “OK” Buttonuna tıklarsanız, seçmiş olduğunuz pencereniz aktifleşecektir. Şayet bu pencere ekranda gözükmüyorsa “View->Windows List” adımlarını izleyerek gözükmesini sağlayabilirsiniz.

15

16

BÖLÜM 2 DELPHI’NİN TEMELLERİ

17

18

Örnekleri Yapabilmeniz İçin Gerekli Olan Pratik Kodlar: EditBox’ın içerisinde bulunan değeri tamsayı tipli değişkene aktarmak

Koda dikkat edecek olursanız ilk olarak “x” isminde tamsayı değişkeni tanımlanmakta olup, kontroldeki değeri alabilmesi için “StrToInt” (Stringi Tamsayıya çevir) tip çeviri fonksiyonuna ihtiyaç duyulmaktadır. Eğer bu tip dönüştürme işlemini yapmazsanız, Delphi size sonucu hesaplayamayacağına dair hata mesajı iletecektir. TamSayı tipli değişkenin değerini yazdırmak

Tamsayı tipli bir değişkeni yazdırabilmek için muhakkak “String”e çevirmelisiniz. Bu dönüşümü yapabilmeniz için Delphi’de “IntToStr” fonksiyonu kullanılabilmektedir. Uyarı:Bu tür tip dönüştürme işlemlerinde kullandığınız atama operatörünün (“:=”) solundaki ve sağındaki verinin tiplerinin aynı olması gerekmektedir. 19

Ayrıca kontroller üzerinde klavye ile girilebilen veri tiplerinin string olduğunu da unutmayınız. EditBox’ın içerisinde bulunan değeri Reel Sayı tipli değişkene aktarmak

Uygulanan yöntem şu; atama operatörünün sol ve sağında yer alan veri tiplerinin aynı olmasını sağlamak için “Edit” kontrolünün içerisinde yer alan değer “StrToFloat” fonksiyonu sayesinde reel sayı tipine çevrilmekte, ondan sonra atama işlemi gerçekleştirilebilmektedir. Reel Sayı Tipli Bir Değişkenin Değerini Yazdırmak:

Aynı mantık uygulanarak reel sayı değişkeni “FloatToStr” tip dönüştürme fonksiyonu sayesinde stringe çevrilip, arkasından da EditBox’ın içerisinde yazdırılmaktadır (Herhangi bir tipteki matematiksel değişkenin değerini yazdırabilmeniz için muhakkak stringe dönüştürmeniz gerekir. Aksi halde Delphi size hata mesajı iletecektir). 20

EditBox’ın İçerisine String Veri Yazdırmak: String tipli bir değişkenin değerini (veya direkt string i) EditBox kontrolünde yazdırabilmeniz için (‘) operatöründen faydalanabilirsiniz. Aşağıda her iki durum içinde örneklendirme yapılmıştır.

Aşağıda verilen örnekte ise procedure içerisinde string tipli bir değişken tanımlanarak, bu değişkene aktarılacak olan içerik yazdırılmaktadır.

Burada kullanılan “x” değişkeninin tipi string olarak verildiği için atama (:=) operatörünün sol ve sağındaki tipler aynı olmaktadır. Bu yüzden tip dönüşüm işlemi uygulamak zaten mantıksız olurdu. EditBox’ın içerisinde bulunan değeri Tarihsel tipli değişkene aktarmak Bir çok uygulamanızda tarihsel veri içeren değerlerle işlem yapmak zorunda kalacaksınız. Bu elinizdeki tarihsel değişkenin değerini yazdırmak, veya tarihsel 21

değer barındıran bir kontrolün içeriğini değişkene aktarmak şeklinde olabilir. Şimdi sizlere EditBox’ın içerisinde bulunan string (Ama tarihe dönüştürülebilir) içeriği tarihsel bir değişkene nasıl aktarabileceğinizi göstereceğim.

Kodu inceleyecek olursak, kontrolün içerisindeki string tipli veri “StrToDate” fonksiyonu sayesinde tarihsel içeriğe dönüştürülüp bir gün eklenmektedir. Ardından tekrar ters dönüşüm yapılarak (tarihten-stringe), formunuzun başlığında yazdırılmaktadır. Tarihsel Değişkenin Değerini Yazdırmak: Tarihsel içerikli bir değişkenin değerini aşağıdaki şekilde oluşturacağınız bir kod satırı sayesinde kolaylıkla yazdırabilirsiniz.

Tip dönüştürme işlemlerine lütfen dikkat ediniz.

22

Aktif Formu Kapatmak: Çalışan aktif formu kapatmak (Eğer tek formunuz varsa aynı zamanda programınız da sonlanacaktır.) için aşağıda gösterilen şekilde basit bir kodlama kullanabilirsiniz.

Alt Satırdaki Kodların İşlemesini Engellemek: Bazı durumlarda procedure içerisinde belirlediğiniz bir koşul oluştuğu anda alt satırlardaki kodların işlemesini istemeyip, kod okumayı sonlandırabilirsiniz. (C++ daki return, veya Visual Basic deki Exit Sub). Şimdi bu tür kodlamaya örnek vereceğim.

Şayet “exit” komut satırı olmasaydı formun başlığında “Yüksel İnan” stringi yazacaktı. Fakat “exit” sayesinde altta yer alan iki satır kod okutulmamakta, bundan dolayı formun başlığında “Nihat Demirli” içeriği yazdırılmaktadır (Bir çok durumda çok fazla işinize yarayacak bir komuttur).

23

Programı Sonlandırmak: Aktif formla beraber diğer tüm formları da kapatmak için aşağıdaki şekilde bir kod satırı kullanabilirsiniz.

Programı İkinci Formdan Başlatmak: Şayet uygulamanızda birden fazla Windows formu varsa ve siz projenizi ikinci (veya diğer herhangi bir formda olabilir) formunuzdan başlatmak istiyorsanız, belirtilen adımları izlemelisiniz.“Project->Options” menü adımlarından sonra aşağıdaki pencere açılacaktır.

Bu pencerenin “Forms” yaprağını aktifleştirin. Bu yaprakta bulunan “Main 24

Form kısmından programın ilk çalıştırılacağı formu seçebilirsiniz (Bu pencerede uygulamanıza dahil edilmiş olan tüm pencereler listeli halde bulunacaktır). Herhangi Bir Exe Uygulamasını Çalıştırmak: Aşağıdaki gibi projenize ekleyeceğiniz tek satırlık kodla, istediğiniz “exe” (Dosya yolunu doğru giriniz.) uzantılı dosyayı kolaylıkla çalıştırabilirsiniz.

Burada hatırlatmak isterim. Şayet yetki probleminiz yoksa, aşağıdaki gibi “UNC” (Network adresi) path belirterek de dilediğiniz bir bilgisayardaki dosyayı da çalıştırabilirsiniz. Ağdaki Bir Bilgisayarda Bulunan Exe Uzantılı Dosyayı Çalıştırmak: Başka bir bilgisayardaki dosyayı çalıştırmak istiyorsanız bu durumda “UNC” path i kullanmalısınız.

“UNC” path\\makineadı\\klasörpaylaşımadı\\dosyaadı şeklinde kullanılmaktadır. Yukarıdaki kod satırında Efsane isimli bilgisayarda, paylaşıma açılmış olan WINNT klasörünün içerisindeki, Notepad.exe dosyası çalıştırılmak istenmektedir. 25

Değişkenler: Paket yazılımların her firma için (veya kişi) farklı sonuçlar oluşturması, programın içerisinde değişkenlerin kullanılmasından kaynaklanmaktadır. Zaten böyle olmasaydı yazılımların hiç bir anlamı kalmazdı. Delphi’de değişken temeline dayalı yazılım dilidir ve bu hususta sanıyorum varılabilecek en üst noktaya ulaşmış bulunmaktadır. Bu kadar önemli olan bir konuda tabiidir ki dikkat edilecek birtakım önemli hususlar vardır. Şimdi sizlere bu hususlardan bahsetmek istiyorum. Delphi’de değişken kullanılacaksa muhakkak programa bildirilmelidir. Bir değişkeni programa bildirmek için iki yöntem bulunur. Bunlardan birincisi procedure’un dilediğiniz yerinde değerini değiştirebilmenizi sağlayan “Var” bildirisi, diğeri ise tanımlandığında atanacak olan değer dışında başka değer alamayan (İstisnaları vardır. Daha sonra izah edilecektir.) “Const” bildirisidir. Ayrıca Delphi’de değişkenlerinizi rastgele yerlerde tanımlayamazsınız, değişken tanımlayabilmeniz için size procedure’un içerisinde bir blok sunmaktadır.

Delphi size procedure-begin arasında değişken tanımlama imkanı vermektedir. Başka rastgele bir yerde değişken tanımlamanız mümkün olmamaktadır. Bu blokta Const’la tanımlanmış değişkenlere ilk değerini atama dışındaki işlemleri yapamazsınız (Bu tür kodsal işlemler sadece procedure’den sonra gelen beginend bloğu içerisinde yapılabilir). Aşağıdaki kod penceresinde, procedure içerisinde local (Sadece o procedure tarafından kullanılabilen ve işlem bittikten sonra bellekten atılan değişkenlerdir.) değişkenlerin nasıl tanımlanabileceği gösterilmiştir. Belirtilen blok içerisinde tanımlanan tüm değişkenler local değişken olarak adlandırılırlar. Bir değişkenin local olması diğer procedure’ler tarafından kullanılamaması ve yordam bir kere işletildikten sonra o değişkenin bellekten atılacağı anlamını taşımaktadır. Pencereyi dikkatlice inceleyiniz.

26

Delphi’de aynı satırda araya ”,” koyarak aynı tipte birden fazla değişken tanımlanabilmektedir. Ayrıca tek bir “var” bildirisi kullanarak birden fazla satırda değişken tanımlamakta mümkündür (Aynı işlem const içinde mümkün olmaktadır). Değişken Tanımlarken Dikkat Edilecek Olan Hususlar: Değişkeninizi tanımlarken aşağıdaki hususlara dikkat etmelisiniz. • Değişken isimleri kesinlikle rakamla başlayamaz. Fakat ismin içerisinde veya sonunda rakam kullanılabilir. Var //Değişken bildirisi için gereklidir. 5nih:integer; //Yanlış tanımlanmış bir değişken nih55:integer; //Doğru tanımlanmış bir değişken • Değişken isimleri içerisinde değişik karakterler kullanamazsınız (Başında veya sonunda da olamaz). Var Nih#dem:integer; //Yanlış tanımlanmış bir değişken Nih#3:AnsiString; //Yanlış tanımlanmış bir değişken • Değişken isimlerinde araya space tuşuyla boşluk bırakamazsınız. Yani değişkeninizin ismi birden fazla kelimeden oluşamaz. Eğer böyle bir değişken (Adı ve soyadını ayrık yazmak isteyebilirsiniz) tanımlamak zorunda kalırsanız, iki kelime arasına “_” karakterini yerleştirin. 27

Var N demirli:AnsiString; N_demirli:AnsiString;

//Yanlış bir değişken tanımlandı //Doğru bir değişken tanımlaması

• Delphi içerisinde kullanılan herhangi bir komut değişken ismi olarak kullanılamaz. Var Not:integer; //Yanlış bir değişken tanımlandı Not1:integer; //Doğru bir değişken tanımlaması • Var bildirisiyle tanımlanan bir değişkene tanımlandığı anda değer ataması yapılamaz. Var Sayi:integer=100; Numara:Double=200.25

//Yanlış bir atama //Yanlış bir atama

Sayısal bir değişken tanımlandığı anda ilk değer olarak belirtilen tipe göre rastgele bir değer almaktadır (0 değil). • Const ile yapılan bildiri sonucu tanımlanmış olan değişkene ilk değerini atamak zorunludur. Const Pi:Double; Pi:Double=3.14;

//Yanlış bir değişken tanımlaması //Doğru bir değişken tanımlaması

• Var bildirisiyle tanımlanmış değişkene procedure içerisinde istenildiği anda yeni bir atama yapılabilir. • Const ile bildirilmiş sabit değişkenlere procedure içerisinde yeni değer aktarılamaz (Bunun istisnası vardır. Özel bildiriler eklenerek değişkene yeni değer aktarılabilmektedir, fakat bu konu daha sonra detaylı olarak işlenecektir). • Local değişkenker procedure işlemeye başladığı oluşturulup, kod sonlandığı anda da bellekten atılırlar. Şimdi Delphi içerisindeki değişken tiplerini inceleyelim. 28

anda

bellekte

Tam Sayı Değişken Tipleri: Delphi içerisinde sadece tam sayı değeri atayabileceğiniz değişken tipleri aşağıda sırasıyla sizlere aktarılmaktadır. • Shortint (-128)-(+128) arasında değer alabilen tam sayı tipli bir değişkendir. Eğer bu değerlerin dışında bir sayı aktarılmaya çalışılırsa taşma (owerflow) hatası verecektir. Bu değişken bellekte 1 Byte (8 bit) lik yer işgal eder. Var Yas:Shortint; //Sadece -128 ile 128 arasında değer atanabilir. • Smallint (-32768)-(+32768) arasında tam sayı değeri atanabilen değişken tipidir. Bellekte 2 Byte (16 bit) lık yer işgal edecektir. Var Sayi:Smallint; //Sadece -32768 ile 32768 arasında tam sayı değeri atanabilir

• Longint (-2147483648)-(+2147483647) arasında tam sayı değerleri alabilen bir değişken tipidir. Bellekte 4 Byte (32 bit) yer işgal edecektir. Var Sayi:Longint; //Sadece -2147483648 ile 2147483648 arasında değer atanabilir. • Integer (-2147483648)-(+2147483647) arasında tam sayı değerleri alabilen bir değişken tipidir. Bellekte 4 Byte (32 bit) yer işgal edecektir. Var Sayi:Integer; //Sadece -2147483648 ile 2147483648 arasında değer atanabilir.

29

• Int64 (-2^63)-(2^63-1) arasında tam sayı değeri atanabilen değişken tipidir. Bellekte 8 Byte (64 bit) yer işgal edilecektir. Var Sayi:Int64; //Sadece -2^63 ile 2^63 arasında değer atanabilir. • Byte 0-255 arasında pozitif tam sayı değeri alabilen değişken tipidir. Bellekte 1 Byte (8 bit) lık yer işgal edecektir. Var Sayi:Byte; //Sadece 0-255 arası pozitif tam sayı değeri alabilir. • Word 0-65535 arası pozitif değer alabilen değişken tipidir. Bellekte 2 Byte (8 bit) lık yer işgal edecektir. Var Sayi:Word; //Sadece 0-65535 arası değer atanabilir. • Longword 0-4294967295 arası pozitif değer atanabilen değişken tipidir. Bellekte 4 Byte (32bit) lık yer işgal edilecektir. Var Sayi:Longword; //Sadece 0-4294967295 arası değer atanabilen değişken tipidir. • Cardinal 0-4294967295 arası pozitif değer atanabilen değişken tipidir. Bellekte 4 Byte (32bit) lık yer işgal edilecektir. Var Sayi:Cardinal; //Sadece 0-4294967295 arası değer atanabilen değişken tipidir.

30

Reel Sayı Değişken Tipleri: Delphi içerisinde ondalıklı sayı değeri atayabileceğiniz değişken tipleri aşağıda sırasıyla sizlere aktarılmaktadır. • Real48 (+-2.9*10^-39) ve (+-1.7*10^38) arasında değer alabilen reel sayı tipidir. Ondalıklı kısımdan 11-12 dijite kadar hassas çalışabilir. Bellekte 6 Byte (48 bit) yer işgal etmektedir. Var Sayi:Real48; //Sadece yukarıdaki sınırlar içerisinde değer alabilir. • Single (+-1.5 x 10^-45) ve (+-3.4 x 10^38) arasında değer alabilen reel sayı tipidir. Ondalıklı kısımdan 7-8 dijit hassasiyetiyle işlem yapabilir, ve bellekte 4 Byte (32 bit) lık yer işgal eder. Var Sayi:Single; //Sadece yukarıda belirtilen sınırlar içerisinde değer alabilir. • Double (+-5.0 x 10^-324) ve (+-1.7 x 10^308) arasında değer alabilen reel sayı tipidir. Ondalıklı kısımdan 15-16 dijite kadar hassasiyetle işlem yapabilmektedir. Ayrıca bellekte bu değişken 8 Byte (64 bit) lık yer işgal edecektir. Var Sayi:Double; //Sadece yukarıda belirtilen sınırlar içerisinde değer alabilir. • Real (5.0 x 10^-324) ile (1.7 x 10^308) arasında değer saklayabilen reel sayı tipidir. Bellekte 8 Byte (64 bit) lık yer işgal edecektir. Var Sayi:Real; //Sadece yukarıdaki sınırlar arasında değer alabilir.

31

• Extended (+-3.6 x 10^-4951) ve (+-1.1 x 10^4932) arasında değer alabilen reel sayı değişken tipidir. Ondalıklı kısımdan 19-20 dijite kadar hassasiyetle işlem yapabilir. Ayrıca bellekte 10 Byte (80 bit) lık yer işgal edecektir. Var Sayi:Extended; //Sadece yukarıda belirtilen sınırlar içerisinde değer alabilir • Comp (-2^63+1) ile( 2^63 -1) değer alabilen değişken tipidir. Ondalıklı kısımda 19-20 dijit hassasiyeti ile değer saklayabilir. Ayrıca bellekte 8 Byte (64 bit) lik yer işgal edecektir. Var Sayi:Comp; //Sadece yukarıda belirtilen sınırlar içerisinde değer alabilir. • Currency Parasal veriler için kullanılabilen bu değişken tipi (-922337203685477.5808) (922337203685477.5807) arasında değer alabilen 19-20 dijitlik bir değişken tipidir (Ondalıklı kısımdan 4 basamak hassasiyetiyle çalışır). Ayrıca bellekte 8 Byte (64 bit) lik yer işgal edecektir. Var Para:Currency; //Ondalıklı kısımdan sadece 4 basamak tutar. Değişkenlerinizi en ekonomik tipte tanımlamanız, size daha hızlı sonuca ulaşabilme özelliği kazandıracaktır. Bu yüzden değişken tanımlarken nasıl olsa Extended hepsini kapsıyor, bu tip tanımlayıp işlemlerimi yaptırayım düşüncesinden her zaman uzak durmalısınız. Bir adamın yaşını aktaracağınız değişkeni Double tanımlamanız sanıyorum size de fazla mantıklı gelmeyecektir. Bu kısma kadar olan değişkenlerin hepsi sayısal içerikliydi, buradan sonraki kısımda ise sayısal içeriği olmayan diğer değişkenler incelemeye alınacaktır. Öncelikle String tipler.

32

String Değişken Tipleri: Bu bölümde karakter işlemlerinde kullanabileceğiniz değişken tiplerinden bahsedeceğim. Matematiksel ve Tarihsel içeriği olmayan değerleri tutmak için kullanılan tiplerdir. • ShortString 255 Kraktere kadar veri alabilen string değişken tipidir.

Bu tipteki değişkene (‘’) içerisinde bilgi aktarıldığına dikkat ediniz. • AnsiString Yaklaşık olarak 2^31 karaktere kadar değer atanabilen (en çok kullanacağınız) ve Ansi karakter desteği olan bir değişken tipidir. Kullanımı ShortString değişkeniyle aynıdır. • WideString Yaklaşık olarak 2^31 karaktere kadar (Unicode) değer atanabilen değişken tipidir. Var Ad:WideString; //String değişken tanımlandı String tipte değer alacak olan değişkenlerinizi yukarıdaki üç tipten birtanesiyle tanımlayabilirsiniz.

33

Boolean Tip Değişken Tanımlamak: Bir değişkeniniz sadece true veya false değerlerini alacaksa bu durumda değişkeninizi Boolean tip tanımlamalısınız. Bu tip değişkenlerde üçüncü bir durum söz konusu değildir. Ayrıca değişken tanımlandığı anda varsayılan değeri false dır. Var Sonuc:Boolean; //true veya false değerini alabilir. Tarihsel İçerikli Değişken Tanımlamak: Delphi içerisinde tarih bilgisi içeren değerleri tutabilecek olan değişkenler, TDate class’ından türetilerek kullanılabilir. Aşağıda bu husus örneklendirilmiştir.

Burada tarihsel değişken olarak kullanılan iki değişken aşağıdaki şekilde tanımlanmıştır. Var İlktarih,sontarih:TDate; //Tarihsel değişkenler tanımlanıyor. Daha sonra bu iki değişkene tip dönüştürme işlemi uygulanarak EditBox kontrollerinden değer atanmıştır. Son olarak iki tarih arasındaki fark hesaplanıp başlıkta yazdırılmıştır.

34

Delphi’de Sabit Değişken Tanımlamak: Bazı durumlarda değeri hiç değişmeyen sabit bir değişken tanımlamak isteyebilirsiniz. Mesela matematikteki pi sayısı veya logaritmada kullanılan e sayısı gibi, işte bu tip değişkenleri özel bir bildirimle yapmalısınız. Aşağıda bu husus örneklendirilmiştir.

Const’la tanımlamış olduğunuz değişkenin değerini procedure içerisinde değiştiremezsiniz (Özel birim ile yapabilirsiniz). Local Static Değişken Tanımlamak: Procedure içerisinde (Global değişken olabilmesi için özel tanımlama blokları mevcuttur, daha sonraki kısımlarda incelenecektir.) tanımlanan bir değişken, kod işletildiği anda bellekte yaratılır, kodun tamamı işletildikten sonra da bellekten atılır. Procedure’ü ikinci kez tekrar işlettiğiniz zaman aynı işlemler tekrarlanacaktır. Bu durumda şöyle bir problemle karşı karşıya kalırız. Procedure’ü ilk işlettiğimiz zaman değişkenimize en son atanan değeri, ikinci işleteceğimiz zaman kullanmak istersek (Yani değişkenin en son aldığı değeri bir sonraki çağrılmada hatırlamak istersek) ne yapabiliriz? Cevabı çok basit, o değişkeni static olarak tanımlarsınız. Local bir değişkenin static olarak tanımlanması, o procedure’ü ikinci kez (veya daha fazla) işlettiğiniz zaman önceki tur bulduğu değeri kullanmasını sağlayacaktır. Bu olay bir çok durumda işinize tahmininizden daha fazla yarayacaktır. Aşağıda bu husus örneklendirilmiştir.

35

Formunuza bir adet button kontrolü ekleyip aşağıdaki kodu Clik Yordamına yazın. Projeyi çalıştırdıktan sonra arka arkaya buttona tıklayın, formun başlığındaki metne dikkat ederseniz en son bırakılan değerlerin bir sonraki procedure işletilmesi sırasında hatırlandığını göreceksiniz.

Pencerede kullanılan {$j+} satırı, Const ile tanımlanan sabit değişkenin değerinin procedure içerisinde yeniden atanabilmesi (değiştirilebilmesi) için gerekli olan bir kod parçasıdır. Bu satırı eklemezseniz, Delphi size Const ile tanımlanan bir değişkenin değerini değiştiremeyeceğinize dair hata mesajı iletecektir. Hatırlatalım bu satırı procedure içerisinde de tanımlayabilirsiniz (Ama Const tan sonra bildirmeniz anlamsız olacaktır).

36

Tüm Alt Yordamlar Tarafından Kullanılabilecek Değişken Tanımlamak: Sanıyorum hepiniz biliyorsunuz, bu işleme global değişken tanımlama adını veriyoruz. Bu olayı örneklendirecek olursak; birinci buttona tıkladığınız zaman değişkene atadığınız değeri, ikinci buttona tıkladığınız zaman kullanmak isterseniz o değişkeni global olarak tanımlamalısınız. Aşağıdaki Delphi Unit’i içerisinde global değişkenleri nasıl tanımlayabileceğiniz örneklendirilmiştir. Formunuzun üzerine iki adet button kontrolü ekleyip, aşağıdaki kodları da gerekli olan yordamlara yazınız.

Görüldüğü gibi iki procedure’de aynı “deger” isimli değişkeni kolaylıkla kullanabilmektedir. Global değişkenler procedure’ün işletilmesi bittiği anda bellekten atılmadıkları için, bir procedure’ün sonundaki değişkenin değeri diğer procedure içerisinde hatırlanabilmektedir. Şimdi uygulamanızı çalıştırıp her iki buttona tıklayın, değişkenin değerinin hatırlandığı sanıyorum dikkatinizi çekecektir. Burada şunu sorabilirsiniz neden bütün değişkenleri burada tanımlamıyoruz? Cevabı son derece basittir. Birincisi bu değişkenler bellekte devamlı yer işgal edeceklerinden performansı etkileyeceklerdir. İkincisi ise hangi değişkenin hangi procedur’ler için tanımlandığı büyük uygulamalar için karmaşa yaratacaktır. Bu sebeplerden dolayı önceliği hep local değişken tanımlamaya veriniz.

37

Global değişken tanımlamak için Delphi size başka bir blok daha sunmaktadır. Dilerseniz Sadece o Unit içerisinde kullanmak üzere değişkeninizi Private Declarations kısmında tanımlayabilirsiniz. Eğer global değişkeninizi bu blokta tanımlayacaksanız, o zaman var veya const bildirisini kullanamazsınız.

Yukarıdaki pencereye dikkat edecek olursanız “deger” isimli değişken Unit in Private Declarations kısmında tanımlanmış olup, tüm alt procedure lerin kullanımına sunulmuştur. Formunuza iki adet button ekleyin, aşağıdaki kodları da gerekli olan yerlere yazıp projenizi tekrar çalıştırınız.

Şimdi iki buttona arka arkaya tıklayıp sonucu görebilirsiniz. 38

Tüm Formlar Tarafından Kullanılabilecek Değişken Tanımlamak: Bazı durumlarda birinci formda tanımlamış olduğunuz bir değişkenin en son değerini ikinci forma ait herhangi bir prosedürde kullanmak isteyebilirsiniz. Bu tip durumlarda aşağıdaki yöntemi uygulamalısınız. //Form1 e ait Unit1 type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; var x:Integer;//İkinci form bu değişkeni kullanabilir implementation uses Unit2;//Eklemeyi unutmayınız {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin form2.show;//Form2 yi aç end; procedure TForm1.FormCreate(Sender: TObject); begin x:=155; end; Aşağıdaki kod bloğunu da ikinci forma ekleyiniz. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Unit1;//Eklemeyi Unutmayınız.

39

procedure TForm2.FormCreate(Sender: TObject); begin Form2.Caption:=IntToStr(x);//155 yazar end; Programı çalıştırıp Button kontrolüne tıklarsanız Form2 niz açılacaktır. Bu aşamada başlığa dikkat ederseniz “155” değerinin yazdığını görürsünüz.

40

Tip Tanımlamaları: Delphi hesaplamalarınızı gerçekleştirebilmeniz için size bir çok seçenek (class, değişken, yapı vs.) sunmaktadır. Bu seçenekler çoğu kez işinizi görmekle beraber bazı durumlarda kendinize has yeni tipler tanımlamak zorunda kalabilirsiniz. Şimdi sizlere kendi tip tanımlamalarınızı nasıl yapabileceğinizi göstermek istiyorum. Delphi’de kendinize has yeni bir tip tanımlayacaksanız, bunu type komutuyla gerçekleştirebilirsiniz. Bu komutla class, yapı, dizi değişkenleri çok kolaylıkla tanımlayabilirsiniz. Tip tanımlaması sırasında (ğ,ş vs.) karakterlerinden kullanmayınız. • Enumerated Types Type Ad=(birinci=0,ikinci=1,ucuncu=2,dorduncu=3,............) Yapılan tanımlamada ilk elemanın sayısal değeri 0, sonrakilerde sırasıyla birer artarak devam edecektir. Dilerseniz aşağıdaki şekilde bir tip tanımlaması da yapabilirsiniz. Type Ad=(birinci=10,ikinci=20,ucuncu=30,dorduncu=40..............) Aşağıda bu foksiyona ait örneklendirme yapılmıştır.

41

Burada atanan elemanların sayısal değerlerini yazdırmak için Ord fonksiyonu kullanılır. Kodu inceleyecek olursak öncelikle Haftanın yedi gününün belirlendiği yeni bir (Enumerated) tip tanımı yapılmış olup, bu tanımlamadan sonra tüm alt yordamlar tarafından kullanılabilmesi için “gun” isminde bu tipten türetilmiş değişkenimiz bildirilmiştir. Procedure içerisinde bu değişkene “Cuma” değeri aktarıldığı için (type içerisinde herhangi bir değer ataması yapılmadığı için değişkenlerin değerleri sıra numaralarına eşittir. İlk elemanın sıra numarasının “0” olduğunu unutmayınız.) bu eleman 5. sırada bulunmaktadır. Buradan hareketle ilk elemanın numarasının “0” olduğunu hatırlarsak, formumuzun başlığında “4” değerini yazdıracaktır. Aşağıda Enumerated tip tanımlaması yapılarak haftanın günlerinin ingilizce karşılıkları kullanıcıya iletilebilmektedir. Aşağıdaki form tasarımını oluşturunuz.

Şimdi de programda tıkladığınız günün İngilizce karşılığını mesaj penceresi şeklinde kullanıcıya iletebilmek için aşağıdaki kodları gerekli olan yordamlara ekleyiniz. Burada Option buttonlarından birtanesini seçtiğiniz zaman yeni tanımlamış olduğumuz tip değişkenimizin değeri de otomatik olarak 42

değişecektir. Tanımlamış olduğumuz değişken global olduğu için, form kapatılana kadar son seçilen gün bellekte tutulmuş olacaktır. Tabii bu uygulamayı daha değişik yöntemlerle yeni tip tanımlaması yapmadan da çözebilirdiniz. Bu tip çözümler size daha anlaşılır bir yapı sağlayacaktır. Aynı işlemi projenizin başka bir yerinde tekrar yapmak zorunda kalırsanız; tekrar tekrar aynı kodları yazmak zorunda kalmazsınız.

Tip tanımlamasından sonra haftanın gününün (Türkçe olarak bilinen) İngilizce karşılığını kullanıcıya iletmek için gerekli olan procedure tanımlamasına geçilmiştir (Procedure lere ait işlemler sonraki bölümlerde çok detaylı olarak incelenecektir). Yeni tanımladığımız tipe (hafta) ait değerler if yapısıyla teker teker değerlendirmeye alınmış olup, tüm Türkçe kelimelerin İngilizce karşılıkları belirlenmiştir.

43

Şimdi aşağıdaki gibi seçilen option buttonu sayesinde, gün değerini yeni tanımladığımız tip değişkenimize aktaracak aşağıdaki kodları da programınıza ekleyiniz.

Artık programınızı çalıştırıp sonuçları görüntüleyebilirsiniz. Tetikleyicilerde önce değerin atandığına, sonra da daha önce tanımladığımız procedure’ün işletildiğine dikkat ediniz.

44

Bu tip içerisinde elemanlar arası geçiş işlemlerini “inc” (bir sonraki) ve “Dec” (bir önceki) komutlarıyla kolayca gerçekleştirebilirsiniz. Programınıza yeni bir button ekleyerek, aşağıdaki kod satırlarını da belirtilen yordama yazın.

Programı çalıştırıp buttona tıklarsanız formun başlığındaki değerin devamlı arttığını göreceksiniz. Procedure ün kodunu aşağıdaki şekilde değiştirirseniz, bu seferde bir önceki eleman değerine ulaşabilirsiniz.

İlk elemana ulaştıktan sonra tekrar tıklarsanız 255 değerini yazacaktır. 45

• Subrange Types Bu şekilde yapacağınız bir tip tanımlaması sayesinde, aynı tipten türeteceğiniz yeni değişkenin belirlediğiniz aralık dışında değer almasını engelleyebilirsiniz (Direkt atamalar için geçerlidir. Dolaylı olarak aralık dışı değer atanabilmektedir). Type Karakter=’A’..’Z’; //Sadece büyük harf karakter girilebilir Sayi=0..100; //Sadece 0-100 arası değer atanabilir. Yukarıda yapılan tip tanımlaması sayesinde, kullanacağınız değişkenlerin değerlerinin belirli bir aralıkta olmasını sağlayabilirsiniz. Aşağıda bu husus örneklendirilmiştir. type karakter='A'..'Z'; //Tipler Tanımlanıyor. sayi=0..100; procedure TForm2.Button6Click(Sender: TObject); var yeni:karakter; notlar:sayi; begin yeni:=a; //Delphi size hata mesajı verecektir. yeni:='K'; //Hata Vermez notlar:=500; //Delphi size Hata Verecektir notlar:=55; //Hata Vermez end; Bu tip tanımlaması sonucu türetmiş olduğunuz değişkene, aralık dışında kalan değeri direkt olarak atamaya çalışırsanız hata verecektir. Aşağıdaki gibi bir kod satırı yazarsanız; programınızın çalışması anında EditBox içerisine aralık dışında bir değer girseniz bile, program kırılmadan çalışmasına devam edecektir. notlar:=StrToInt(Edit1.Text); //Hata Vermez Yanlışlıkla girebileceğiniz değerleri engellemek amacıyla kullanabileceğiniz bir tiptir.

46

Set Types: Toplu işlemler gerçekleştirebilen bir tip tanımlamasıdır. Aşağıda bu tip bir deklarasyonu nasıl gerçekleştirebileceğiniz açıklanmıştır. Type Ad:Set of char; //Toplu eleman işlemleri için tip tanımlama Bu yapıyı anlamanız için aşağıdaki form tasarımını oluşturup gerekli olan kodları da ekleyiniz.

Burada basılan her tuş (KeyPress Event ına yazıldığı için) Key parametresine aktarılmakta, ardından tanımlanan tipe ait belirtilen aralıkta olup olmadığı kontrol edilmektedir. Key:=#0; satırı ise basılan tuşun iptali için kullanılmaktadır. Şimdi örneği biraz daha değiştirip sadece büyük ve küçük harflere izin verebilecek olan bir program yapalım. İlk yapacağımız işlem büyük harf ve küçük harf aralığını belirleyecek olan yeni tiplerimizi tanımlamak olmalıdır. Daha sonra, basılan karakterin bu aralıklardan bir tanesine ait olup olmadığını kontrol edeceğiz. Aşağıdaki uygulama için formunuzun üzerine sadece bir adet EditBox kontrolü eklemeniz yeterli olacaktır.

47

Kodu inceleyecek olursanız, ilk olarak büyük harf aralığını gösteren değişkenimiz, ardından da küçük harf aralığını gösteren ikinci değişkenimiz belirlenerek basılan tuşun bu aralıklardan bir tanesinde bulunup bulunmadığı kontrol edilmektedir. Bu Kod yüzünden silme işlemini yapan (BackSpace) tuşu kullanılamayacaktır. Eğer bu tuşu da kullanmak isterseniz, kodu aşağıdaki şekilde değiştirmelisiniz.

Artık uygulamanızda BackSpace tuşunu kullanarak yanlış yazılan karakterleri silebilirsiniz. 48

Bu tip tanımlamasını aşağıdaki şekilde de kullanabilirsiniz. type aralik = 1..500; //Aralık belirleniyor deger = set of aralik; //Aralığı kullanabilecek olan değişken tanımlanıyor. veya type deger = set of 1..250; //Bu şekildede tanımlanabilir. Daha sonra bu değişkene programın içerisinden aşağıdaki şekilde toplu değer de atayabilirsiniz. var ilk, son: deger; ... ilk := [1, 3, 5, 7, 9]; //Toplu değerler atanıyor son := [2, 4, 6, 8, 10]; //Toplu değerler atanıyor. Bu şekilde bir tip tanımlaması yaptığınız zaman (Değişken toplu değerleri göstereceğinden dolayı) karşılaştırma yapacağınız değerin, aralığın içinde olup olmadığını “in” operatörüyle kontrol ettirmelisiniz (Biz de öyle yaptık). İf ‘a’ in tip then //içinde varsa begin //’a’ tip değişkeninin gösterdiği aralıktaysa end; else begin //’’ tip değişkeninin gösterdiği aralıkta değilse end; veyada İf not(‘a’ in tip) then //içinde yoksa begin //’a’ tip değişkeninin gösterdiği aralıkta değilse end; “not” kullanılarak da olumsuz durum kontrol ettirilebilir. Tercih burada tamamen programcıya kalmıştır. 49

• Record Types Kayıt işlemleri mantığıyla kullanılabilen ve programcı tarafından tanımlanabilen bir tiptir. Aşağıda bu husus örneklendirilmiştir.

type birey = record yil: Integer; ay:(Ocak,Şubat,Mart,Nisan,Mayis,Haziran,Temmuz,Agustos,Eylul,Ekim, Kasim, Aralik); gun: 1..31; end; Programın içerisinden de aşağıdaki şekilde değer ataması yapabilirsiniz. var birey1: birey; //Tanımlanan tipe üye değişken tanımlanıyor. ..... Record1.yil := 1973; //Doğum yılını gir Record1.ay := Mayis; //Doğduğu ayı gir Record1.gun := 1; //Döğduğu günü gir With-do bloğu Yukarıdaki değer atama işlemini kolaylık açısından aşağıdaki şekilde With – do deyimiyle de gerçekleştirebilirsiniz. with birey1 do begin yil := 1973; ay := Mayis; gun := 1; end;

//Doğum yılını gir //Doğduğu ayı gir //Döğduğu günü gir

Yukarıdaki satırlara dikkat edecek olursanız alt alta üç kere “birey1.” yazmak yerine, tek bir kerede hepsinin birey1 in özelliğinin olduğunu with – do deyimiyle kolaylıkla belirtebilmekteyiz. Büyük uygulamalarda satırların çoğalacağını düşünürseniz işinizi epeyce kolaylaştıracaktır (Karmaşayı da azalttığını sanıyorum).

50

Record tip tanımlamasının daha iyi anlaşılabilmesi için aşağıdaki örnek pencereyi dikkatlice inceleyiniz.

Yapılan tip tanımlamasından sonra bu tipe ait bir değişken tanımlarsanız belirlemiş olduğunuz tüm özellikleri sağ tarafında “.” karakterine basarak listeletebilirsiniz.

Proramı çalıştırırsanız arka arkaya 3 kere InputBox penceresi açılarak değerleri gerekli değişkenlere aktarmanız sağlanacaktır.

51

Dizi Değişkenler: Tüm dillerde olduğu gibi, Delphi de dizi mantığına çok önem vermektedir. Değişkenlerin dizi olarak tanımlanabilmesi (Her zaman mümkün olmayabilir.) programı hızlandıracağı gibi, kod satırlarının da kısalmasını sağlayacaktır (Yirmi tane öğrencinin notunu dizi değişken kullanmadan InputBox penceresiyle istettiğinizi düşünsenize). Sabit ve değişken uzunluklu olmak üzere iki çeşit dizi mevcuttur. Şimdi bu dizi çeşitlerini detaylıca inceleyelim. • Sabit Uzunluklu Dizi Değişken Tanımlamak: Sabit uzunluklu dizi değişken, tanımlandığı anda boyutunun belirlenmesi şeklinde tanımlanabilir. Belirtilen bu boyut programın içerisinden kesinlikle değiştirilemez. Aşağıdaki şekillerde sabit uzunluklu dizi değişken tanımlayabilirsiniz. var dizi:Array[0..10] of Integer; // 11 elemanlı dizi değişken tanımlandı veya type diziler = array[1..10] of Real; var dizi:diziler; // Bu şekildede dizi değişken tanımlanabilir. Burada tanımlanan dizi değişkenlerde alt ve üst sınır dahil olacaktır (Yukarıdaki satırda 11 eleman tanımlanmıştır). Yani dizi[0] ile dizi[10] arasındaki tüm elemanlar Delphi tarafından bellekte oluşturulacaktır.

52

Aşağıdaki şekilde de aynı elemanlara sahip dizi değişken oluşturabilirsiniz.

Tanımladığınız dizi değişkenin boyutunu programın içerisinde değiştirme şansınızın bulunmadığını, böyle bir teşebbüste bulunursanız Delphi’nin size hata mesajını ileteceğini hatırlatmak isterim. Sabit uzunluklu dizi değişkenlere tanımlandıkları yerde ilk değerlerini aşağıdaki şekilde atayabilirsiniz. Const //Var la ilk değer ataması yapamazsınız dizin:Array[0..2] of AnsiString=('Mavi','Yeşil','Sari'); veya const //Var la ilk değer ataması yapamazsınız. dizin:Array[0..2] of Integer=(10,20,30); Aşağıdaki şekilde de sabit uzunluklu dizi tanımlayıp ona ilk değerini atayabilirsiniz. type diziler = array[0..2] of Real; //Reel tip tanımlanıyor .... Const dizi:diziler=(10,20,30); //3 elemanlı reel değişken tanımlandı Şimdi de basit bir örnek yapalım.

53

Aşağıdaki kod satırlarını projenizin gerekli olan yerlerine ekleyiniz.

Dizi değişkenlere tanımlandıkları anda değer atanabilmesi için, mutlak “const” bildirisiyle tanımlanmış olmalıdırlar. Aksi takdirde Delphi sizlere hata mesajı iletecektir. Dizi değişkenleri const ile tanımlarsanız, procedure içerisinde değerini değiştirmek için aşağıdaki ek kod satırını ilave etmelisiniz.

Artık procedure içerisinde dizi değişkeninizin istediğiniz elemanına değer ataması yapabilirsiniz. Burada yapılan işlemin local static dizi değişken tanımlamaktan hiç de farklı bir şey olmadığını sanıyorum fark etmişsinizdir. Yapacağınız yeni atamaların procedure ün bir sonraki işletilmesi sırasında kullanılabileceği meydandadır.

54

Şimdide aşağıdaki örneği incelemenizi istiyorum. Henüz for döngüsünü anlatmadık ama sanıyorum bir çoğunuzun bu hususta bir fikri olacaktır. Kodun ne kadar anlaşılır ve teknik olduğu hemen dikkatinizi çekecektir.

Yeni tip tanımlamanın kodun anlaşılabilirliğini ne kadar artırdığını sanıyorum fark ettiniz. Size de bu tür yapı tanımlarını kullanmanızı önemle tavsiye ediyoruz. Sabit Uzunluklu İki Boyutlu Dizi Tanımlamak: Özellikle matris işlemleri ve tablo oluşturmak için en çok bilinmesi gereken yapıdır. Tablolar, satır ve sütun numaraları kullanılarak kesişimleri bir hücre değerini gösterecek şekilde tasarlanmışlardır. Bu yüzden bir çok veri tabanı işlemi iki boyutlu dizi mantığı kullanılarak kolayca çözülebilmektedir (Tablonuzun tüm hücre değerlerine ulaşabilmek için yapmanız gereken işlem, iki adet for döngüsü içerisinde iki boyutlu tanımlamış olduğunuz dizi değişkenin satır ve sütun numaralarıyla oynamaktan ibarettir. Bu hususa veri tabanı kısmında detaylı, hem de çok detaylı olarak değinilecektir). Aşağıda iki boyutlu bir dizinin nasıl tanımlanabileceği gösterilmektedir.

55

var ikib_dizi:Array[0..2] of Array[0..1] of Integer; //iki boyutlu dizi tanımlandı Yukarıdaki satırda gerçekleşen işlem aşağıda şematize edilmeye çalışılmıştır. Tanımlamaya dikkat edecek olursanız ilk boyut için [0..2] (3 eleman), ikinci boyut içinde [0..1] (2 eleman) belirtilmiştir. Şu halde bellekte aşağıdaki gibi 6 eleman otomatik olarak oluşacaktır. ikib_dizi[0,0] ikib_dizi[1,0] ikib_dizi[2,0]

ikib_dizi[0,1] ikib_dizi[1,1] ikib_dizi[2,1]

Bu elemanlardan istediğinize değer ataması yapabilirsiniz.

Bu diziyi aşağıdaki şekilde de tanımlayabilirdiniz. type i_dizi=Array[0..2] of Array[0..1] of Integer; //Yeni tip tanımlandı ....... var cok_dizi:i_dizi; // 6 elemanlı dizi değişken tanımlandı Yapılan işlemi açıklayacak olursak, ilk olarak “i_dizi” isminde altı (6) elemandan oluşan dizi değişkene sahip bir tip tanımlandı. Daha sonra bu yeni tipten “cok_dizi” isminde çok boyutlu bir dizi değişken türetildi. Artık procedure içerisinde istediğiniz bölümde bu dizi değişkenin elemanlarına değer atayabilirsiniz. Aşağıda bu husus örneklendirilmiştir. 56

Bir çok uygulamada karşılaşacağınız en büyük dizi boyutu iki (2) olacaktır, ama biz yine de daha yüksek boyutta dizi değişkenleri nasıl tanımlayabileceğinizi gösterelim. Aşağıdaki şekilde kolayca üç boyutlu dizi değişken tanımlayabilirsiniz. var u_dizi:Array[0..2] of Array[0..2] of Array[0..1] of Integer; Yukarıdaki kod satırıyla 3 boyutlu, 18 elemanlı bir dizi değişken tanımlanmıştır. Bu elemanlardan dilediğinize aşağıdaki şekilde değer ataması yapabilirsiniz. u_dizi[0,0,0] u_dizi[0,2,0] u_dizi[0,1,1] u_dizi[1,1,1] u_dizi[2,0,0] u_dizi[2,1,1]

u_dizi[0,0,1] u_dizi[0,2,1] u_dizi[1,0,1] u_dizi[1,2,0] u_dizi[2,0,1] u_dizi[2,2,0]

u_dizi[0,1,0] u_dizi[1,0,0] u_dizi[1,1,0] u_dizi[1,2,1] u_dizi[2,1,0] u_dizi[2,2,1]

Tanımlamayı aşağıdaki şekilde de yapabilirsiniz. type boyutdizi=Array[0..2] of Array[0..2] of Array[0..1] of Integer; ..... var dizi:boyutdizi; //Dizi değişken tanımlandı

57

Çok boyutlu dizi değişken tanımlarken yukarıdaki yöntemlerden dilediğinizi seçebilirsiniz. Herhalikarda sonuçlar aynı olacaktır. Benim size tavsiyem her zaman tip tanımlaması yaparak kullanmanız (ikinci kez tanımlamanız gerekirse daha kolay olacaktır). Değişken Uzunluklu (Dinamik) Dizi Değişken Tanımlamak: Okulunuza bir program yazdığınızı düşünün. Öğrencilerin notlarıyla (ve diğer konularla da) ilgili işlemleri yapabilecek, karnelerini basabilecek bir program olsun. Uygulamanızda şöyle bir problemle karşılaşırsınız; bütün sınıfların mevcutları aynı olmadığı için sınıf mevcutlarını belirlerken oluşturacağınız dizinin eleman sayısı sizin için sıkıntı yaratacaktır. Düşünülebilecek en güzel çözüm en fazla öğrencisi olan sınıfa göre eleman tanımlamak olacaktır. Bu durumda da belleği boş yere işgal eden kullanılamaz değişkenleriniz oluşması kaçınılmazdır (Tabii uygulamanızda çıkabilecek diğer problemlerden bahsetmiyorum). İşte bu tür sorunları halledebilmeniz için Delphi sizlere değişkenlerinizin boyutlarını programın içerisinde değiştirebilme imkanı sunmaktadır. Bu işleme, Dinamik dizi değişken tanımlama adını veriyoruz. Aşağıda dinamik dizileri nasıl tanımlayabileceğiniz ve programın içerisinden onların boyutunu nasıl belirleyebileceğinizi göstereceğim. var dinamikdizi:Array of Integer; //Dizi değişken tanımlandı

58

Dikkat ettiyseniz sabit uzunluklu dizi değişkenden tek farkı dizinin eleman sayısının belirtilmemesidir. Bu şekilde tanımlanan bir dizi değişken Delphi tarafından Dinamik dizi olarak kullanılacaktır. Programın içerisinden belirleyebilirsiniz.

dizi

SetLength(dinamikdizi,10);

değişkenin

boyutunu

aşağıdaki

şekilde

// 0-9 on elemanlı dizi değişken

SetLength komutunu kullanarak dizinize boyut değerini verebilirsiniz. Aşağıdaki basit örneği inceleyiniz.

Dilerseniz dinamik dizinizi aşağıdaki şekilde de tanımlayabilirsiniz. type din_dizi=Array of Integer; //Dinamik dizi içeren tip tanımlaması yapıldı Program içerisinde aşağıdaki şekilde bir kullanım mümkün olacaktır. var yeni_dizi:din_dizi; //Tanımlana tipten dinamik dizi değişkeni türetildi. .... SetLength(yeni_dizi,10);// 10 elemanlı olarak dinamik dizi boyutlandırıldı. Aşağıdaki örneği dikkatlice inceleyiniz.

59

İzleyeceğiniz yol tamamen size kalmıştır. Çok Boyutlu Dinamik Dizi Tanımlamak: Yukarıda tanımlanan dinamik diziler tek boyutlu olarak belirlenmiştir. Şimdi sizlere iki ve daha fazla boyutlu dinamik dizileri nasıl tanımlayıp kullanabileceğinizi göstereceğim. Aşağıdaki şekilde iki boyutlu dinamik bir dizi değişken tanımlayabilirsiniz. var dizi:Array of Array of Integer; //İki boyutlu dizi değişken tanımlandı Tanımlamış olduğunuz iki boyutlu dinamik dizi değişkenini yine aynı SetLength komutuyla boyutlandırabilirsiniz. SetLength(dizi,5,3); // 15 elemanlı oldu Burada dikkat edeceğiniz husus ilk elemanın dizi[0,0] son elemanında dizi[4,2] olduğudur (Burada üst sınırlar kullanılamamaktadır. Çalışma anında hata mesajıyla karşılaşırsınız). Yukarıdaki kod satırı sayesinde Delphi dizi değişkeniniz için 15 elemanlık boş bellek yeri ayıracaktır (Dizi değişkenler bellekte arka arkaya bulunurlar. Hızlı işlem yapmalarının bir sebebi de budur). Artık istediğiniz elemana değer atayabilirsiniz. Aşağıdaki örneği dikkatlice inceleyiniz. 60

Aynı işlemi aşağıdaki şekilde de yaptırabilirsiniz. İzleyeceğiniz yol tamamen size kalmıştır.

Bu kod penceresinde kullanılan SetLength(dizi,5,3); satırı sayesinde dizi[0,0] dan dizi[4,2] ye kadar 15 eleman için bellekte boş yer ayrılacaktır. Bu tip dinamik diziler (Tam sayı tiptekiler) oluşturuldukları anda ilk değer olarak “0” alırlar. Yukarıdaki uygulama için Form3.Caption:=IntToStr(dizi[3,0]);// 0 yazacaktır.

61

Dinamik Dizileri Yeniden Boyutlandırmak: Delphi’de boyutlandırmış olduğunuz dinamik diziyi yeniden boyutlandırırsanız, eski dizi elemanları değerlerini aynen koruyacaktır (Tabii ki elemanın numarasından daha küçük bir boyut vermezseniz). Aşağıda bu husus örneklendirilmiştir.

Bazı durumlarda yukarıdaki kod penceresinde olduğu gibi boyutlandırmış olduğunuz bir dinamik diziyi (Sınıfa yeni bir öğrenci daha eklenebilir veya oyuna yeni bir şahıs daha katılabilir.) yeniden boyutlandırma gereği duyabilirsiniz. Bu durumlarda, Delphide daha önceden değer alan değişkenler değerlerini aynen saklı tutacaktır. Yukarıdaki örnekte de bu tema işlenmiştir. İki kere boyutlandırılan dizi değişken önceki boyutlandırmadan sonra atanan değerini, ikinci boyutlandırmadan sonra hatırlayıp korumaktadır (Yeni boyutlanan dizinin üst sınırı o elemanın indexinden daha büyük olmalıdır). Bir çok projede Dizi işlemlerini Dinamik dizilerle çözmek zorunda kalacaksınız. Bu yüzden bu kısmı çok iyi öğrenmelisiniz. Her zaman söylerim, dizilerle döngüleri çok iyi kullanabilen programcıların geleceğinin parlak olacağından eminim. Sizde anlatılan hikayelerden ziyade (Emin olun karşılıklı konuşacağınız bir çok konu başlıkçısı olacaktır. Bu konu başlıkçıları, genellikle kodlardan haberleri olmayıp öteden beriden (dergi, gazete vs) duydukları hikayeleri sizlere yutturmaya çalışan şahıslardan ibaret olacaktır. Bu tip şahısları her zaman beyaz tahtanın başına kod yazmaya davet edecek kadar kendinize güven duyacak seviyeye gelmek en önemli hedefiniz olmalıdır) tahtaya yazdıracağınız kodlara ve o kodu yazan şahıslara değer veriniz.

62

BÖLÜM 3 DELPHI’DE ATAMA İŞLEMLERİ & OPERATÖRLER

63

64

Delphi’de Kullanılan Operatörler: Bu kısımda sizlere, Delphi’de kullanabileceğiniz operatörleri gruplandırarak bilgi verelim. • Matematiksel Operatörler: Matematiksel işlemlerde kullanabileceğiniz operatörler tablo halinde verilmiştir. Operatör + * / Mod Div = > < >= 50) then if(yas=50) then if(yasson; //şart sağlanırsa bitir Aşağıdaki örnek projede, daha önce “for” döngüsüyle çözmüş olduğumuz girilen iki sayı arasındaki sayıların toplamını hesaplayan projenin “Repeat – Until” döngüsüyle çözülmüş hali verilmiştir.

Şimdi de yine daha önceden “for” ile yazdığımız fakat iyi çözüm olmadığını belirttiğimiz girilen iki sayı arasındaki çift olanları toplayan programın kodlarını verelim (Tabiiki çözümü Repeat-Until ile gerçekleştireceğiz). 96

Bu arada tekrar hatırlatalım. Inc() fonksiyonunu kullanabilmeniz için, fonksiyona giren iki değerinde tam sayı tipli değişken olması gerekmektedir. Aksi takdirde “toplam:=toplam+ilk” yazmalısınız. Şimdi de programı çalıştırdığımız anda bize şifre soracak, eğer şifreyi bilemezsek yeniden girmemizi isteyecek pencereyle karşılaşacağımız bir program yapalım. Şifre isteme işlemlerinin yapılacağı en uygun Event “FormCreate” yordamıdır. Bu yüzden kodumuzun tamamını bu procedure’e yazacağız. Şifre isteme işlemini döngü içerisinde yapacağımız için, şifreyi doğru girene kadar arka arkaya şifre penceresi ile karşılaşacaksınız. Bahsettiğimiz bu tür uygulamaları, şarta bağlı olarak işletilebilen döngülerle çözmek çok uygun bir çözüm yolu olacaktır. Şifre uygulaması için aşağıdaki kodları projenizin gösterilen yordamlarına ekleyiniz.

97

Şimdi de uygulamamızı biraz daha geliştirerek, kullanıcının sadece üç kere şifre girebileceği, üç hakkında da bilemezse programın kapatılacağı bir hale dönüştürelim.

Döngü içerisinde kullanılan “Application.Terminate” komut satırı programı kapatmak için kullanılmaktadır. Yanlız burada ufak bir incelik var. Delphi “Application.Terminate” komutunu gördüğü zaman programı bitirir ama döngü tamamlandıktan sonra. Bu yüzden “exit” komutunu eklemezseniz, garip durumlarla karşılaşabilirsiniz (Döngü içerisinde Application.Terminate komutunu kullanırkan dikkat etmelisiniz). 98

• While Do Döngüsü: Bu döngü belirtilen şart gerçekleştiği sürece devamlı olarak işler. Repeat – Until döngüsünden farkı, şartın döngü çıkışında değil, girişinde kontrol edilmesidir. Belirtilen şart sağlanmıyorsa bu bloğa yazacağınız kod hiç işlemeyebilir. Aşağıdaki döngü için kullanacağınız yapı verilmiştir. while ilk= 10000 then begin Halt; //Programı kapat end; end;end;

111

“Halt” komutu döngü içerisinde hiç bir extra kod istemeden uygulamayı sonlandırmakta, “Application.Terminate” ise döngünün bitmesini bekledikten sonra programı kapatabilmektedir. • Sleep Komutu: Özellikle döngülerde çok hızlı işleyen kodları izleyebilmek veya zaman kazanmak amaçlı kullanılan bir komuttur. Parametre olarak girilen değer “milisaniye” cinsindendir (Saniyenin binde biri). Komutu anlayabilmeniz için aşağıdaki iki kod bloğunu ayrı ayrı çalıştırıp sonucu izleyiniz.

Şimdi de kodu aşağıdaki hale dönüştürüp tekrar çalıştırın.

112

Programın öncekine göre çok daha ağır çalıştığını göreceksiniz. Bunun sebebi eklemiş olduğunuz “sleep(1000)” kod satırından kaynaklanmaktadır. Bu komut bilgisayarı her seferinde bir saniye uyutacaktır. • Application.ProcessMessages: Uygulamanıza yoğun bir işlem yaptırırken (mesela döngü komutları işletilirken) diğer bir komuta programınız yanıt veremeyecektir. Bu durum sizin için sıkıcı, hatta bunaltıcı olacaktır. Bir döngü kodunu işletirken, dikkat ettiniz mi bilmiyorum, diğer hiç bir komutu tetikleyemezsiniz (Programı kapatamaz, formu taşıyamaz veya başka bir buttona tıklayamazsınız). “Application.ProcessMessages” böyle durumlara çözüm yaratmak için Delphi’ye dahil edilmiştir. Aşağıdaki iki kod bloğunu işletip aradaki farkı görmeye çalışın.

Buttona tıkladıktan sonra deneyin; formunuzu taşıyamayacak, kapatamayacak ve başka bir buttona tıklayamayacaksınız. Bu durumun iki çözümü bulunmaktadır. Bunlardan birincisi “Application.ProcessMessages” dır. Delphi “Application.ProcessMessages” satırını gördüğü zaman kontrolü kısa bir süre için windows’a bırakarak, kullanıcıya diğer isteklerini yerine getirebilme şansı vermektedir (Formu taşıyabilir, başka bir buttona tıklayabilirsiniz vs.). Diğer bir yöntemse (Bu çok gelişmiş bir tekniktir. Thread yaratarak sadece o uygulamanın çalışabileceği bir kanal yaratmaktır.) sadece sizin istediğiniz komutlara cevap verecek bir kanal

113

yaratmaktır (Bu konuya daha sonraki kısımlarda değinilecektir). Uygulamanız da ne kadar çok kanal yaratırsanız, performansınızı o oranda düşürürsünüz. Şimdi yukarıdaki kod bloğunu aşağıdaki hale çevirip uygulamanızı tekrar çalıştırınız.

Artık uygulamanız döngü komutları işlerken sizin komutlarınıza da cevap verebilecektir. Programı çalıştırdıktan sonra, button kontrolüne tıklayıp formunuzu taşımayı deneyin. Başarılı olduğunuzu göreceksiniz.

114

BÖLÜM 5 DELPHI’DE FONKSİYON & PROSEDÜRLER

115

116

Delphi’de Prosedürler: Aynı kodun işletileceği durumlarda, işletilecek olan kodu tek bir yerde tanımlayıp gerekli yerlerden bu kodlara erişim sağlayabilirsiniz. Bu işlemler için genellikle kullanılan iki yöntem bulunmaktadır. Geriye değer döndürmeyen (aslında istenirse döndürtülebilir) bloğa procedure (buradan sonra prosedür olarak kullanılacaktır) adı verilmektedir. Aşağıdaki bölümde Delphi içerisinde bir prosedürün nasıl tanımlanabileceğini, tanımlanan prosedüre projenizden nasıl erişebileceğinizi göstereceğim. Fakat daha önce Delphi’nin kullandığı forma ait prosedürlere bir örnek verelim. Formunuzun üzerine bir adet button kontrolü yerleştirip, üzerine mous ile çift tıklarsanız, çalışma anında bu buttona tıklanılması durumunda işletilecek kodun yazılabileceği prosedüre ulaşırsınız.

Yukarıdaki işlem kitabın tamamında defalarca işlendiği için detaylara daha fazla değinmeden, sizin tanımlamak zorunda kalacağınız prosedürlerden bahsedelim. Kullanıcı tanımlı bir prosedürü aşağıdaki şekilde kolaylıkla tanımlayabilirsiniz.

117

Bu şekilde tanımladığınız prosedüre, sadece bu classa üye olan diğer prosedürler tarafından ulaşılabilir. Eğer oluşturduğunuz bu prosedürü dışarıdan çağırmak istiyorsanız (ikinci formdan), o zaman biraz daha beklemeniz gerekecektir. Aşağıda mesaj ismiyle tanımlanan prosedüre “procedure TForm1.Button1Click (Sender: TObject)” yordamından nasıl erişebileceğinize dair örnek vereceğim.

Şimdi buttona tıklarsanız, mesaj isimli prosedürde belirtilen uyarıyla karşılaşırsınız.

Kullanıcı tanımlı prosedürler normal şartlar altında sadece tanımlandıkları yerden sonraki yordamlar tarafından çağrılabilirler. Aksini yaparsanız, Delphi size komutu tanımadığına dair uyarı mesajı iletecektir. Peki bu işlemin başka bir yolu yok mu? Tabii ki var. Hemen izah edelim.

118

Prosedürleri Diğer Yordamlara Bildirmek: Bir prosedürü tanımlandığı satırdan daha önceki bölümlerden çağırmaya kalkarsanız, Delphi’nin sizi hata mesajıyla uyaracağını yukarıda belirtmiştik. Bu hatayı engellemenin ikinci yolu (İlk yol en üstte tanımlanması gerektiğidir.) prosedürü “forward” ile declare etmektir. Aşağıdaki kod bloğunda, öncelikle “mesaj” prosedürünün varlığı declare edilerek alttaki satırlarda tanımlansa bile, diğer yordamlar tarafından kullanılabilmektedir.

Her ne kadar sorun çözüldü gibi gözüksede ufak bir hususa dikkat etmelisiniz. Yazmış olduğunuz “procedure mesaj;forward;” kod satırının “mesaj” isimli prosedürün çağrıldığı satırdan önce yazılmış olması gerekmektedir. Parametre İçeren Prosedür Tanımlamak: Bazı durumlarda işleteceğiniz prosedür içerisinde kullanılmak üzere parametre (veya parametreler) göndermek isteyebilirsiniz. Bu gibi durumlarda prosedürünüzü parametreli olarak tanımlamalısınız. Prosedüre birden fazla parametre değeri gönderebileceğinizi de belirtmekte fayda var. Aşağıda tek parametre içeren bir prosedürün nasıl tanımlanabileceği, daha sonra

119

projeden tanımlamış olduğunuz aktarabileceğiniz gösterilmiştir.

prosedüre

nasıl

parametre

değeri

Şimdi de projenize bir adet button ve bir adet Edit kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz.

Bu örnekteki amaç buttona tıklanıldığı zaman EditBox’ın içerisindeki veriyi “bildir” isimli prosedüre parametre olarak göndermektir. Ardından prosedürdeki kod işletilerek, ekranda gözüken uyarıyı kullanıcıya iletmektir. Burada “bildir” isimli prosedürün içerisine yazmış olduğunuz kodu “procedure TForm1.Button2Click(Sender: TObject)” yordamına da yazabilirdiniz. Aynı sonucu almakla beraber, burada extra bir incelik bulunmaktadır. Şayet bu kodu başka yerlere de yazmanız gerekirse, hele de prosedür içerisindeki kodlar uzun ve karmaşıksa sizin için çok sıkıcı bir durum (Amerikayı ikinci kez keşfetmek sanıyorum fazla zevk vermeyecektir. Hatta sıkıcı bile olabilir.) yaratacaktır. Onun için tekrarlanacak olan kod satırlarını bir prosedür içerisinde depolayıp saklarsanız, dilediğiniz zaman çağırıp kullanabilirsiniz. Aşağıda tek parametre içeren bir prosedür tanımlanmış olup, buttona tıklanınca işletilebilmektedir. 120

Şimdi buttona tıklarsanız, EditBox kontrolü içerisindeki bilginin mesaj penceresi içeriği olarak karşınıza geldiğini göreceksiniz. Birden Fazla Parametreli Prosedür Tanımlamak: Bazı durumlarda prosedürünüz birden fazla parametre kullanmak zorunda kalabilir. Bu tip durumlarda izleyeceğiniz yol aşağıda belirtilmiştir. procedure kimlik(değişken1:AnsiString; değişken2:Integer); begin // İşletilecek Olan Kod Buraya Yazılacak end; Birden fazla parametreli prosedür tanımlamak, tek parametreli prosedür tanımlamaktan hiçte zor değil. Aralarına “;” koyarak dilediğiniz sayıda parametre belirleyebilirsiniz. Tanımladığınız prosedürün sonuna “;” eklemeyi unutmayınız, hatırlatmasını da yeri gelmişken yapalım. Şimdi formunuzun üzerine iki adet Edit, bir adet Button kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz. Ardından projenizi çalıştırıp text kutularına değerleri girin ve buttona tıklayınız.

121

Örneğimiz için prosedür içerisine iki adet parametre (isim ve yaşı) yollanarak blok kodunun işletilmesi sağlanmaktadır.

Aşağıdaki kodları da formunuza ait Unit içerisinde gerekli olan yerlere ekleyiniz.

Prosedürde kullanılan “#13#10” kod parçası, mesaj penceresinde ikinci satıra atlayıp, yazı yazmaya devam etmek için eklenmiştir. Bu komutları eklemezseniz, mesaj pencereniz bütün içeriği tek satırda göstermek zorunda kalacaktır. Bu ve buna benzer komutlar neredeyse bütün dillerde aynı amaçla bir çok kere kullanılmaktadır.

122

Dizi Parametreli Prosedür Tanımlamak: Oluşturacağınız prosedür içerisinde parametre olarak kullanabilirsiniz. İzlemeniz gereken yol aşağıda verilmiştir.

dizi

değişkende

type hocalar=Array[0..2] of AnsiString; //Önce tip Tanımlamayı unutmayınız procedure egitmenler(isim:hocalar); //Prosedür tanımlanıyor. begin //Prosedürün işleteceği kodlar buraya yazılacak. end; Bu arada aşağıdaki şekilde tanımlayacağınız dizi değişkenli prosedürü Delphi kabul etmeyecektir. Dikkatli olunuz. Procedure egitmenler(isim:Array[0..2] of AnsiString); //Delphi hata mesajı verir.

123

Dinamik Dizi Parametreli Prosedür Tanımlamak: Prosedürünüzün parametrelerini (birden fazla da olabilir) dinamik dizi olarak tanımlayabilir, prosedür içerisinde kolayca boyutlandırabilirsiniz. Aşağıda dinamik dizi parametreli prosedüre örnek verilmiştir. procedure sertifika(isim:Array of AnsiString); //Dinamik dizi parametre //Dinamik dizi için hata vermez Hata vermez begin // Gerekli olan prosedür kodları buraya yazılacak. end; Şimdi konuyu anlamak açısından formunuza bir adet button kontrolü ekleyerek aşağıdaki kodları çalıştırınız.

Görüldüğü gibi prosedür içerisinde dinamik dizi değerlerini kullanmak hiç de zor değildir. Olay sadece programcının hayal gücüne kalmıştır. 124

Opsiyonel Parametreli Prosedür Tanımlamak: Prosedür tanımlarken bazı parametrelerin opsiyonel olmasını isteyebilirsiniz. Yani kullanıcı bu parametreye dilerse değer gönderir, eğer gerek görmezse sadece diğer parametrelere programdan değer göndererek prosedürü işletebilir. procedure eleman(isim:AnsiString;vasif:AnsiString=''); //opsiyonel parametreli prosedür tanımlanıyor begin //İşletilecek olan kod buraya yazılacak. end;

Aşağıdaki “eleman” isimli prosedürü oluşturup, button kontrolünün “procedure TForm1.Button6Click(Sender: TObject)” yordamına tıklandığı zaman işleteceğiniz kodu yazın.

125

Şimdi aşağıdaki form tasarımını oluşturup projenizi çalıştırınız. Ardından elemanın isminin girileceği kutuyu doldurup (Mesleği kısmını boş bırakın) buttona tıklayın. Karşınıza aşağıdaki ekran görüntüsü gelecektir (Adı Soyadı var, meslek bilgisi vasıfsız işçi). Prosedürün tek parametreyle işletildiği sanıyorum dikkatinizi çekmiştir.

Bu sefer de “Meslek” bilgisinin yazılacağı text kutusuna değer girin ve projenizi çalıştırın. Aşağıdaki gibi hem “Adı Soyadı”, hem de “Meslek” bilgisinin yazılı olduğu mesaj penceresi kullanıcıyı bilgilendirecektir.

İkinci durumda prosedürün iki parametreyle işletildiğini sanıyorum belirtmeye gerek yok (ama biz yine de belirtelim). Opsiyonel parametreli bir prosedür tanımlamak için yapmanız gereken tek şey, prosedür içerisinde opsiyonel değer alacak olan parametrelere default değer atamaktır. Default değer aktardığınız parametrelere programdan değer göndermek veya göndermemek tamamen kullanıcıya kalmıştır. Örneğimizde dikkat ettiyseniz; prosedür, mesleği kısmı boş bırakılırsa (vasıfsız eleman) tek parametreyle, doldurulursa iki parametreyle işletilerek kullanıcı bilgilendirilmektedir. Bu tip prosedürlerde opsiyonel parametre sayısı tamamen programcıya kalmıştır. Dilediğiniz kadar oluşturabilirsiniz. 126

Delphi’de Fonksiyonlar: Fonksiyon tanımlama işlemi prosedür tanımlamaya çok benzer. Aralarındaki tek fark fonksiyondan geriye dönen değerin olmasıdır (Aslıda prosedürden de istenirse değer döndürülebilir. Örneklerde alternatif olarak çözümler verilmiştir). Aşağıda Delphi’de fonksiyonların nasıl tanımlanacakları gösterilmiştir. function hesapla(ilk:Integer;son:Integer):Real; begin //Kodlar Buraya Yazılacak. //result:=Döndürülecek değer end; “Function fonsiyon_adi(degiske1:Tip;degisken2:Tip):fonksiyon_Tipi;” satırı ile iki parametreli fonksiyon tanımlanabilir. Fonksiyonun programdan çağrılmasını aşağıdaki şekilde yaptırabilirsiniz. procedure TForm3.Button1Click(Sender: TObject); var x,y:Integer; sonuc:Real; begin // kodlar buraya yazılacak //sonuc:=hesapla(x,y); //Fonksiyona parametreler yollanıyor. end; Şimdi olayı örnek üzerinde izah edelim. Aşağıdaki form tasarımını oluşturup programı çalıştırınız.

Editlere öğrencinin vize notlarını girip buttona tıklayın. Vize ortalamasının hesaplanıp, başlıkta yazdırıldığını göreceksiniz. 127

Programın işleyişini sağlayan kodlar aşağıda verilmiştir. Pencerede ortalama değerin tanımlanmış olan fonksiyon tarafından hesaplattııldığına dikkatinizi çekmek istiyorum.

Kod satırlarını inceleyecek olursak, Edit’lere girilen değerler değişkenlere aktarılıp parametre olarak “hesapla” isimli fonksiyona yollanmaktadır. Sırasıyla fonksiyon bu parametreleri “ilk” ve “son” isimli değişkenlerinin yerlerine koyarak sonucu hesaplamaktadır. Hesaplanan değer, sonuc (Geriye dönen değerle bu kastedilmektedir.) isimli değişkene aktarılarak başlıkta yazdırılmaktadır. Fonksiyonlarda Aşırı Yükleme: Delphi aynı isme sahip farklı parametreli birden fazla fonksiyonu tanımlamanıza izin vermektedir (Bu olaya fonksiyonlarda aşırı yükleme denir). Kod içerisinde işleteceği fonksiyona, parametre sayılarına ve tiplerine bakarak karar verir. Her ne kadar Delphi aynı isme sahip farklı parametreli fonksiyon tanımlanmasına izin versede, bunu programda bildirmelisiniz. Yani normal şartlar altında aynı isme sahip iki fonksiyon bildirisi, program tarafından hata mesajı iletisi verilmesine sebep olacaktır. Bu hata mesajını engellemek için “overload” bildirisini yapmanız (hem de iki fonksiyon için yapmanız) gerekecektir. Bu bildiriden sonra programınız artık hata mesajı vermeyip, yazdığınız kodları işleterek sonuçları döndürecektir.

128

Aşağıdaki gösterimde, “ortalama” isimli aynı ada sahip iki fonksiyon tanımlanmıştır. function ortalama(ilk:Integer;son:Integer):Real;overload;//bildiri yapıldı begin //Gerekli kodlar buraya yazılacak //result:=Geriye dönecek değer end; function ortalama(ilk:Integer;orta:Integer;son:Integer):Real;overload;//bildiri begin //result:=Geriye dönecek değer end; Sanıyorum fark ettiniz; fonksiyonlarda geriye dönecek olan değer “result” ifadesiyle belirlenmektedir (c++ da return).

Önemli olduğu için tekrar hatırlatalım, iki fonksiyonun sonuna da “overload” bildirisi ekleyerek aynı isimle iki fonksiyon tanımlayabilirsiniz. 129

Dizi Parametreli Fonksiyon Tanımlamak: Bazı durumlarda fonksiyonunuza bir dizi değişken gönderip, elemanların değerleriyle ilgili işlemler yaptırabilirsiniz. Dizi değişkenli fonksiyonları aşağıdaki yaklaşımla tanımlayabilirsiniz. function hesapyap(x:Array of Integer):Real; //Dizi parametresi içeriyor var //Değişken Tanımlamaları begin //Gerekli kodlar buraya yazılacak //result:=Dönüş değeri; end;

Şimdi de göndereceğimiz dizi elemanlarının toplamını hesaplayacak bir fonksiyon yazalım. Aşağıdaki kod satırlarını projenize ekleyip çalıştırınız.

130

Okek Hesaplayan Fonksiyon: Aşağıdaki fonksiyonla, fonsiyona gönderilen dizi elemanlarının “okek” lerini hesaplayabilirsiniz. Program için verilen form tasarımını oluşturup programı çalıştırınız.

Fonksiyonda kullanılan “Floor” ve “MaxIntValue” fonksiyonları “math” kütüphanesinde tanımlı olduğu için, bu kütüphaneyi “uses” satırına eklemelisiniz. Eklendikten sonra uses satırı aşağıdaki gibi olmalıdır. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,math; //Eklemeyi unutmayın 131

Şimdi “okek” isimli bu fonksiyonu programdan nasıl çağırabileceğinizi göstereceğim. Aşağıdaki örnek tasarımı oluşturup, programınızı çalıştırınız.

Eklemiş olduğunuz Button kontrolünün “procedure TForm4.Button2Click (Sender: TObject);” yordamına da aşağıdaki kodları ekleyin.

Button kontrolüne mous ile tıklama yaparsanız “okek” değerinizin hesaplanıp etiketinizde gösterildiğini göreceksiniz. Yapılan işlem; ListBox kontrolündeki elemanları bir dinamik dizi değişkenine aktarıp, fonksiyona parametre olarak göndermekten ibarettir.

132

Obeb Hesaplayan Fonksiyon: Bu kısımda ortak bölenlerin en büyüğü olarak adlandırılan “Obeb” fonksiyonunu yazacağız. Fonksiyona ait kodlar aşağıda verilmiştir.

Fonksiyonda ilk olarak dizinin en küçük elemanının bulunması gerekmektedir. Bu işlem “deger:=MinIntValue(dizi)” satırıyla gerçekleşmektedir. Ardından dizinin elemanlarının hepsi en küçük elemana bölünmektedir. Şayet bir tanesi bile tam bölünemiyorsa, değer bir azaltılarak yine dizinin elemanlarının tamamını tam bölüp bölmediği kontrol edilmektedir. Bütün dizi elemanlarını bölen ilk sayı “Obeb” değeri olarak, prosedüre geri yollanmaktadır. Bu fonksiyonda kullanılan “MinIntValue” fonksiyonu “math” kütüphanesi olmadan kullanılamayacağı için “uses” satırına ekleme yapılmalıdır. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,math; //Eklemeyi unutmayın. 133

Şimdi de aşağıdaki tasarımı oluşturup, ilgili yordamlara gerekli olan kodları ekleyiniz.

Eklemiş olduğunuz Button kontrolünün “procedure TForm4.Button3Click (Sender: TObject);” yordamına da aşağıdaki kodları ekleyin.

Artık programınızı çalıştırıp button kontrolüne tıklayabilirsiniz. Tıklamadan sonra ListBox kontrolünde mevcut olan elemanlar, bir dinamik dizi değişkenine aktarılarak parametre olarak “Obeb” fonksiyonuna gönderilmektedir.

134

Fonksiyonlara Birden Fazla Değer Hesaplatmak: Delphi’de tek bir fonksiyon içerisinde birden fazla değer hesaplatıp, programa gönderebilirsiniz. Dikkat etmeniz gereken birden fazla değer hesaplattıracağınız için yapıyı “Function” şeklinde değil, “procedure” şeklinde tanımlamanız gerektiğidir. Aşağıda bu hususta örneklendirme yapılmıştır. Procedure hesapla(parametre1:Integer;var Ilk:Integer;var son:Integer); Begin //Kodlar buraya yazılacak. Ilk:=Geriye dönecek olan ilk değer Son:=Geriye dönecek ikinci değer End; Dikkat edeceğiniz bir başka hususta, programa göndereceğiniz (Geriye dönecek olan değerler) değişkenleri prosedür içerisinde “var” ile tanımlamanız gerektiğidir. Yukarıdaki prosedür projeden aşağıdaki şekilde çağrılabilecektir. procedure TForm5.Button1Click(Sender: TObject); var x:Integer; //Parametre olarak fonksiyona gönderilecek birinci,ikinci:Integer; begin x:=StrToInt(Edit1.Text); hesapla(x,birinci,ikinci); //prosedür işletiliyor. //Diğer kodlar Buraya yazılacak end; Buradaki hassa nokta, prosedürü çağırdığınız zaman belirtmiş olduğunuz parametrelerden sadece “x” fonksiyona parametre olarak gönderilir. Fonksiyon bu değeri alır (birden fazla da olabilir) blok kodlarını işletip “ilk” ve “son” isimli değişkenlerine değerlerini aktarır. Ardından sırasıyla bu değerleri “birinci” ve “ikinci” isimli prosedürdeki değişkenlere yazdırır. Buradan sonraki kısım tamamen size kalmış, hesaplanmış olan “birinci” ve “ikinci” isimli değişkenlerin değerlerini istediğiniz şekilde kullanabilirsiniz. Önemli Husus: Prosedür içerisinde geriye dönecek olan değerleri tutacak olan değişkenler muhakkak “var” bildirisiyle beraber tanımlanmalıdır. Aksi takdirde sonuç sizin için hayal kırıklığı yaratabilir.

135

Şimdi olayı basit bir örnekle izah etmeye çalışalım. Örneğimizde prosedüre gönderilen değişkenin yarısını ve iki katını hasaplayacak tek bir prosedür tanımlayalım.

Yap isimli prosedür içerisinde geriye dönecek olan değişkenlerin değerini tutmak için “var” bildirisiyle “kat” ve “yari” isminde iki adet değişken tanımlanmıştır (Ayrıca parametre olarak gönderilecek değeri tutacak olan deger isimli değişken de tanımlandı). Daha sonra bu değişkenlerin gösterecekleri değerleri hesaplamaları için gerekli kod satırları eklenmiştir. Program içerisinden çağrılan prosedüre “x” değişkeninin değeri parametre olarak gönderilmiş olup, hesaplatılan “kat” ve “yari” isimli değişkenlerin değerleri de sırasıyla “ikikat” ve “yarisi” isimli diğer değişkenlere aktarılmıştır. Artık bu değişkenlerin değerlerini alt prosedür (ButtonClick) içerisinde dilediğiniz şekilde kullanabilirsiniz. Şimdi biraz daha zor ve çok daha güzel bir örnek yapalım. Örneğimizde prosedüre gönderilecek olan dinamik dizi değişkenine ait elemanların Minimum, Maximum, Ortalama ve Toplam değerlerini hesaplatalım.

136

İlk olarak aşağıdaki form tasarımını oluşturunuz. Ardından prosedür kodlarını yazma işlemine geçebilirsiniz.

İkinci adımda oluşturacağımız tek prosedürle dizi elemanına ait (Dizi değerlerini ListBox tan alacak) olan “Min” – “Max” – “Ortalama” ve “Toplam” değerlerini hesaplatacağız.

Şimdi de bu prosedürü programdan çağırabilmeniz için eklemeniz gereken kodları verelim.

137

Aşağıdaki prosedürün çalıştırılabilmesi için “uses” satırının “math” kütüphanesini eklemeyi unutmayınız (Nasıl ekleneceği yukarıda açıklanmıştır).

Artık button kontrollerine teker teker tıklayarak sonuçlarınızı görebilirsiniz. Bu tür çözümler, sizlere aynı projeyi belli bir zaman sonra tekrar inceleme gereği duyduğunuzda anlaşılabilirlik açısından çok büyük kolaylık sağlayacaktır. O yüzden iyi derecede anlamanızı ve bol bol benzer örnekleri çözmenizi tavsiye etmekteyiz. 138

Delphi’de Rekürsif Fonksiyonlar: Tanımlamış olduğunuz fonksiyon, kod bloğu içerisinde, kendi kendisini çağırıyorsa bu tip fonksiyonlara “Rekürsif” fonksiyon denir. Aşağıdaki faktöryel hesaplayan örnek fonksiyonda, bu yapıya ait kullanım şekli gösterilmektedir.

Rekürsif fonksiyonların projeden çağrılması, diğer fonksiyonların çağrıldıkları şekilde olup herhangi extra bir işlem uygulanmamaktadır. Aşağıdaki projede, bu fonksiyonu nasıl çağırabileceğiniz gösterilmiştir.

139

Fonksiyonlar kendi kendilerini çağırabilecekleri gibi, aynı işlemi prosedürler de yapabilmektedir. Aşağıdaki örnek yapıda, prosedür kendi içerisinde tekrar tekrar kendisini çağırarak sonsuz döngü gibi davranabilmektedir.

Projenizi çalıştırıp button kontrolüne tıklarsanız ‘Prestige Education Center’ mesajı devamlı olarak ekranınızda gözükecektir. Rekürsif fonksiyon veya prosedürler bazı durumlarda çalışma hızı açısından yavaş kalabilirler. Oluşturacağınız fonksiyon ve prosedürler için bu hatırlatmayı hiç unutmayınız.

140

BÖLÜM 6 BİLGİLENDİRME PENCERELERİ

141

142

Mesaj Pencereleri: Daha önceki örneklerimizde basitçe yer verdiğimiz mesaj pencerelerini, bu bölümde detaylı olarak inceleme imkanı bulacaksınız. Delphi’de kullanıcıyı uyarmak, ikaz etmek veya yönlendirmek için birden fazla method tanımlanmıştır. Bu methodlardan hangisini kullanacağınız tamamen size kalmıştır. Şimdi bu methodları teker teker inceleyelim. • ShowMessage: Basit anlamda kullanıcıyı bilgilendirme amaçlı kullanılabilen bir methoddur. Method içerisinde sadece tek parametre kullanılabilmektedir. ShowMessage(‘Mesaj’); Program içerisinde kullanımına ait örnek aşağıda verilmiştir.

Programı çalıştırıp button kontrolüne tıklarsanız, aşağıdaki pencereyle karşılaşırsınız.

Bu methodda açılan pencerenin başlık ismini belirlemeniz mümkün olmamaktadır. Pencerenizin başlık ismi, projenizin ismi olarak Delphi tarafından varsayılan ve değiştirilemeyen değer olarak belirlenmektedir. Ayrıca “OK” düğmesinden başka tıklayacak seçeneğinizde yoktur.

143

• ShowMessagePos: Bu method da basit anlamda kullanıcıyı bilgilendirmek amaçlı kullanılabilmektedir. “ShowMessage” methodundan farkı ise pencerenin açılacağı koordinatları belirleyebilmenizdir (Pencereyi ekranda istediğiniz koordinatta açtırabilirsiniz). Girilecek olan koordinat değerleri pencerenin sol üst köşesinin ekrandaki yerini belirleyecektir. İki koordinata da “0” değerini verirseniz, pencere ekranın sol üst köşesinde açılacaktır. Aşağıda yapıya ait kullanım şekli verilmiştir. ShowMessagePos('mesaj',x koordinatı,y koordinatı) Methodda yer alan ikinci ve üçüncü parametre, pencerenin sol üst köşesinin ekrandaki koordinatlarıdır. Aşağıda proje içerisindeki kullanımına ait örneklendirme yapılmıştır.

Projeyi çalıştırıp button kontrolüne tıklarsanız aşağıdaki aynı pencerenin açılmasını sağlarsınız.

Sadece pencerenin açıldığı noktaya dikkat ederseniz, diğer methoddan farkını göreceksiniz. Pencere başlığı ve oluşturulan button Delphi tarafından belirlenip, değiştirilme imkanı bulunmamaktadır.

144

• ShowMessageFmt Yine basit anlamda bilgilendirme yapabileceğiniz, bir methoddur. İkinci parametrede kullanacağınız değişkenler ile ilgili değerleri ilk string içerisinde kullanabilirsiniz. ShowMessageFmt('mesaj’,params) Şimdi methodu daha iyi anlayabilmeniz için bir örnek çözelim.

Programı çalıştırdıktan sonra button kontrolüne tıklarsanız, aşağıdaki gibi bir pencereyle karşılaşırsınız.

Bu methodda mesaj içerisinde kullanılan “%d” ler ile, ikinci parametrede belirtilen (sıralamaları önemli) “a” ve “b” değişkenleri arasında bağlantı oluşturulup, bu değişkenlerin değerlerinin mesaj penceresinde yazdırılmaları sağlanmaktadır. “%d” yerine kullanabileceğiniz diğer seçenekler ve anlamları aşağıda tablo şeklinde verilmiştir. 145

%d

= Decimal (integer)

%e

= Scientific

%f

= Fixed

%g

= General

%m

= Money

%n

= Number (floating)

%p

= Pointer

%s

= String

%u

= Unsigned decimal

%x

= Hexadecimal

Şimdi aynı örneği parasal değerler için yapalım, sanıyorum daha net bir şekilde anlama imkanı bulacaksınız. Aşağıdaki kodları formunuza ekleyip uygulamanızı çalıştırınız.

Şimdi button kontrolüne tıklarsanız ekran görüntünüz aşağıdaki şekilde olacaktır.

Değerleri yazdırmak için “%m” parametresi kullanıldığı için, değişkenler parasal içerikli olarak (binlik ayıraç biçemli ve sonunda para birimi yazılı şekilde) mesaj penceresinde gösterileceklerdir. 146

• MessageDlg: Kullanıcıya seçme şansı veren pencereler açmak için kullanılan bir methoddur. Pencere açıldığı zaman üzerinde birden fazla button yerleştirilebileceği için, basılan düğmenin numarasının aktarılacağı tamsayı tipli bir değişkene ihtiyaç duyar. Aşağıdaki yapıyı dikkatlice inceleyiniz. var num : Integer; //Tam sayı tipli değişkene aktarılmalı begin num := MessageDlg('Mesaj',icon,Düğme, 0); Şimdi de bu işlemi örneklendirelim.

Yazmış olduğumuz “num := MessageDlg('Delphiyi Sevdiniz mi!',mtCustom,[mbYes,mbNo], 0);” satırını inceleyecek olursak: Kullanılan ilk parametrede (Delphiyi Sevdiniz mi) pencerede çıkacak olan mesaj belirlenmektedir. Burada uyarınızı ‘’ içerisinde belirtebileceğiniz gibi AnsiString tipte bir değişken değeri de kullanabilirsiniz (Eğer tamsayı veya başka tipteki matematiksel bir değişkeni yazdıracaksanız, tip dönüşümü uygulamalısınız). var num : Integer; mesaj:AnsiString; begin mesaj:=Edit1.Text; num := MessageDlg(mesaj,mtCustom,[mbYes,mbNo], 0);

147

Şayet string bir içerikle matematiksel bir değişkenin değerini yanyana pencerede yazdırmak zorunda kalırsanız, aşağıdaki şekilde bir yöntem izlemelisiniz.

Programı çalıştırdıktan karşılaşırsınız.

sonra

buttona

tıklarsanız

aşağıdaki

pencereyle

Sayısal ifadenin pencerede yazdırılabilmesi için “IntToStr” , “FloatToStr” , “CurrToStr” veya “DateTimeToStr” vs. tip dönüştürme fonksiyonlarından faydalanmalısınız. Ayrıca iki string değişkeni yanyana yazdırmak için “+” operatöründen faydalanmaktayız. Gelelim ikinci parametreye (mtCustom), buraya aktaracağınız değerle pencerenizde çıkmasını istediğiniz iconu belirleyebilirsiniz. Parametre olarak kullanabileceğiniz standart icon sayısı “4” taneden oluşmaktadır. Aynı anda iki icon değeri kullanamayacağınızı belirterek, aşağıdaki tabloda tüm seçenekler ve anlamları sizlere sunulmuştur (Pencerelerinizde kullanacağınız iconları programınızın akışına uygun olacak şekilde belirlemelisiniz. Asla rastgele icon değeri kullanmayınız).

148

Kullanabileceğiniz parametre değerleri ve anlamları aşağıda verilmiştir. Icon Seçenekleri

Oluşacak olan icon

mtWarning

Arama Iconu

mtError

Hata Iconu

mtInformation

Danışma Iconu

mtConfirmation

Bilgilendirme Iconu

mtCustom

Genel

Biz bunlardan “mtWarning” seçeneğini kullanarak penceremizde arama iconunun çıkmasını sağlayalım.

Programı çalıştırdıktan sonra buttona tıklarsanız aşağıdaki ekran görüntüsüyle karşılaşırsınız.

Bu methodda pencerenizin başlığını belirleme şansınız yok. Dikkat ettiyseniz Delphi pencere başlığı olarak icon ismini varsayılan ve değiştirilemeyen değer olarak belirlemiştir. Şimdi ikinci parametreyle ilgili güzel bir örnek yapalım. Aşağıdaki form tasarımını oluşturup gerekli kod satırlarını da ekleyiniz. 149

Şimdi de aşağıdaki kodları formunuzun gerekli event larına ekleyiniz.

150

Programınızı çalıştırdıktan sonra icon seçeneklerinden birisini seçin ve button kontrolüne basın. Mesaj penceresinde seçmiş olduğunuz icona ait resim gözükecektir. Şimdi de pencerede çıkmasını istediğiniz buttonları belirleyebileceğiniz üçüncü parametremize geçelim ([mbYes,mbNo]). Aşağıdaki tabloda yaratabileceğiniz tüm düğmeler ve bu düğmelere ait değerler verilmiştir. İçlerinden hangilerini isterseniz ekleyebilirsiniz. Düğme Seçenekleri

Oluşacak Olan Düğme

mbYes

'Yes' button

mbNo

'No' button

mbOK

'OK' button

mbCancel

'Cancel' button

mbAbort

'Abort' button

mbRetry

'Retry' button

mbIgnore

'Ignore' button

mbAll

'All' button

mbNoToAll

'No to all' button

mbYesToAll

'Yes to all' button

mbHelp

'Help' button

Aşağıda “Yes” “No” ve “Cancel” buttonlarını oluşturabileceğiniz kodlamayı veriyorum.

Programı çalıştırdıktan sonraki ekran görüntüsü aşağıda verilmiştir. Dilerseniz daha fazla button oluşturabilirsiniz. Mesaj penceresinde oluşturabileceğiniz düğmelere ait güzel bir örnek yapmak istiyorum. 151

Şimdi aşağıdaki kodları formunuzun gerekli olan event larına ekleyip projenizi çalıştırın.

Buradaki kodların yazıldığı form tasarımı aşağıda verilmiştir. Programı çalıştırdıktan sonra “Düğme Seçenekleri” nden bir tanesini işaretleyerek, Button kontrolüne tıklayınız. Şayet herhangi bir hata yapmadıysanız, seçmiş olduğunuz düğmelerin mesaj pencerenizin üzerinde oluşmuş olmaları gerekmektedir.

152

Gelelim dördüncü parametreye (Bizim şablonda değeri 0), bu parametre help dosyası hazırlanmış olan projeler için önem arz etmektedir (Help dosyası hazırlamayla ilgili konular daha sonra izah edilecektir). Buraya girilecek değer help dosyasında aynı numarayla linkli olarak çalışacak, yardım alınmak istenirse bu değer kullanılarak direkt açıklamaya ulaşmanız mümkün olacaktır (Bu değere “0” verilmesi help dosyasının olmadığı anlamını taşımaktadır). Basılan Düğmeye Göre Kod Satırlarını İşletmek: Birden fazla düğmenin olduğu mesaj pencerelerinde her buttona tıklanılması farklı kodların işletilmesini sağlayacaktır (Zaten öyle olmasa birden fazla button oluşturmak manasız olurdu). Methodun hangi düğmeye basıldığını gösterebilmesi aktarıldığı tam sayı tipli değişken sayesinde gerçekleşebilmektedir. Bu yüzden, bu methoddan geriye dönen değer kesinlikle bir değişkene aktarılmalıdır. Değişkenin değeri dallanmaya (if veya case) tabi tutularak, basılan düğmeye göre istenilen kod işletilebilir. Aşağıda bu olay örneklendirilmiştir.

Programı çalıştırıp button kontrolüne tıklarsanız, aşağıdaki ekran görüntüsüyle karşılaşırsınız. Bu pencerede her değişik düğmeye tıklamanız farklı bir kod işletmenizi sağlayacaktır.

153

Basılan düğme değerlerine ait tablo aşağıda verilmiştir. Aslında tek yapmanız gereken “mr” karakterlerini düğme isminin başına eklemekten ibaret olacaktır. Basılan Düğme

Açıklama

mrYes

'Yes' button tıklandı

mrNo

'No' button tıklandı

mrOK

'OK' button tıklandı

mrCancel

'Cancel' button tıklandı

mrAbort

'Abort' button tıklandı

mrRetry

'Retry' button tıklandı

mrIgnore

'Ignore' button tıklandı

mrAll

'All' button tıklandı

mrNoToAll

'No to all' button tıklandı

mrYesToAll

'Yes to all' button tıklandı

mrHelp

'Help' button tıklandı

Basılan düğme yukarıdaki değerini değişkene aktarmaktadır. Daha sonra aktarılan değer kıyaslanarak, işletilmesi gereken kodlar o bloğa yazılmaktadır. Basılan düğmelerin tam sayı değer karşılıkları da mevcuttur. Aşağıda bu değerlerde verilmektedir. Basılan Düğme

Sayısal Karşılığı

mrYes

=6

mrNo

=7

mrOK

=1

mrCancel

=2

mrAbort

=3

mrRetry

=4

mrIgnore

=5

mrAll

=8

mrNoToAll

=9

mrYesToAll

= 10

Bu durumda yukarıda yazmış olduğumuz kod satırlarını aşağıdaki şekilde değiştirebilirsiniz. Sayısal değerleri hafızanızda tutamayacağınız için, ilk karşılıklarıyla işlem yapmanız daha kolay olacaktır. Ama tercih tamamen sizlere kalmıştır. 154

Yine aynı şekilde tıkladığınız düğmeye ait kod bloğunu kolaylıkla işletebilirsiniz. • MessageDlgPos: Bu method, seçenekli mesaj pencerelerinin açılmasını sağlamaktadır. “MessageDlg” yönteminden tek farkı ekleyeceğiniz iki parametreyle pencerenin açılacağı yerin kordinatlarını belirleyebilmenizdir. Aşağıda bu methoda ait örneklendirme yapılmıştır.

155

num := MessageDlgPos(mesaj,mtWarning,[mbYes,mbNo], 0,x,y) Üst satırda “MessageDlgPos” metodunun kullanım şekline ait yapı gösterilmektedir. Son eklenen iki parametre (x ve y) formun sol üst köşesinin ekrandaki koordinat değerleridir. İkisine de “0” verirseniz, mesaj pencereniz ekranınızın sol üst köşesine yapışık vaziyette yerleşecektir. • Application.MessageBox: En çok kullanılan ve en iyi performansı veren methoddur. Kullanıcıya seçenekli mesaj penceresi açmak için kullanılır. Bu methodda kullanıcının tercih edebileceği düğme sayısı birden fazla olduğu için, basılan düğmenin değerini tutabilecek tam sayı tipli bir değişkene ihtiyaç vardır. Kullanım şekline ait yapı aşağıda verilmiştir. Var Num:Integer; begin num:=Application.MessageBox('Mesaj',Başlık,seçenekler); Methodda opsiyonel (istenirse parametre gönderilmeyen) parametre olmadığı için, tüm parametrelere değer göndermek zorunludur. Şimdi tüm parametreleri basitten zora doğru inceleyelim. Birinci parametrede (Mesaj) pencerede gösterilmesi istenen açıklama satırı belirtilmelidir.

Yukarıdaki kod satırıyla kullanıcıya ‘Kayıt Değiştirilsin mi’ açıklama satırını 156

ileten (Başlık satırı ve düğmelerde oluşturulmuştur, bunlar birazdan incelenecektir.) bir pencere açılmasını sağlayabilirsiniz. Programın düğmeye tıklandıktan sonraki ekran görüntüsü aşağıda verilmiştir.

Kodda belirtilen açıklama satırının pencerenin ortasında yer aldığına dikkat ediniz. Gelelim ikinci parametreye (Başlık), buraya gireceğiniz metni, kullanıcı formun başlığında görecektir. Yukarıdaki pencereye dikkat edecek olursanız, formun başlığının bu metinle aynı olduğunu göreceksiniz. Üçüncü parametremiz (Seçenekler) ise kendi arasında bir çok opsiyonel parametresi bulunan bir seçenekler kümesidir. Bu seçeneklerden en az bir tanesini methodda belirtmelisiniz. Aksi takdirde uygulamanız çalışmayacaktır. Şimdi bu seçenekleri teker teker inceleyelim. num:=Application.MessageBox('Kayıt Değiştirilsinmi','Değiştir', MB_YESNOCANCEL); İlk olarak çıkarabileceğiniz buttonları burada belirleyebilirsiniz. Yazabileceğiniz seçenekler aşağıda verilmiştir. Düğme Seçenekleri

Açıklama

MB_OK

Ok button

MB_OKCancel

Ok – Cancel button

MB_YesNo

Yes – No button

MB_YesNoCancel

Yes-No-Cancel button

MB_RetryCancel

Retry – Cancel button

MB_AbortRetryIgnore

Abort – Retry – Ignore button

Yukarıdaki kod satırının ekran görüntüsü üst tarafta verilmiştir. Şimdi seçenek kümemizdeki ikinci alternatifimize bakalım. Pencerede standart iconlarımızdan bir tanesini kullanmayı deneyelim. 157

Kodu aşağıdaki şekilde değiştirip uygulamanızı tekrar çalıştırın. num:=Application.MessageBox('Kayıt Değiştirilsinmi','Değiştir', MB_YESNOCANCEL+MB_ICONSTOP);

Buttona tıkladıktan sonraki ekran görüntünüz aşağıdaki gibi icon resmi içeren bir hal almalıdır.

Kullanabileceğiniz diğer icon seçeneklerini de tablo halinde sizlere verelim. Projenize uygun olanını kullanabilirsiniz. Icon Seçenekleri

Açıklama

MB_ICONSTOP MB_ICONQUESTION MB_ICONINFORMATION MB_ICONHAND MB_ICONEXCLAMATION MB_ICONASTERISK MB_ICONWARNING MB_ICONERROR MB_ICONMASK

Şimdi de üçüncü seçeneğimizi inceleyelim. Tehlikeli işlemlerde (silme veya değiştirme vs.) kullanıcının yanlışlıkla klavyeden bir tuşa basıp “Yes” buttonunu 158

işletmesi çok kötü sonuçlar doğurabilir. Bu yüzden pencere açıldığı zaman aktif buttonun “No” düğmesi olmasını sağlamak, sizin için bir alışkanlık olmalıdır. Bu işlemi nasıl yapabileceğiniz aşağıda gösterilmiştir.

“MB_DEFBUTTON2” parametresi pencere açıldığı zaman klavyeden enter tuşuna basılması durumunda “No” düğmesine girilen kodun işletilmesini sağlayacaktır. num:=Application.MessageBox('Kayıt Değiştirilsinmi','Değiştir', MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2); Kullanabileceğiniz diğer alternatifler tablo halinde aşağıda verilmiştir. Default Button Seçenekleri

Açıklama

MB_DEFBUTTON1

İlk Button Aktif

MB_DEFBUTTON2

İkinci button aktif

MB_DEFBUTTON3

Üçüncü button aktif

MB_DEFBUTTON4

Dördüncü button aktif

Seçenek kümemizde yer alan dördüncü parametremiz, açılacak olan mesaj penceresinin diğer uygulamaların en üstünde mi yoksa altında mı kalacağını belirlemektedir. Aşağıda yapının kullanımına ait örneklendirme yapılmıştır. num:=Application.MessageBox('Kayıt Değiştirilsinmi', 'Değiştir',MB_YESNOCANCEL +MB_ICONMASK+MB_DEFBUTTON2+ MB_SYSTEMMODAL); “MB_SYSTEMMODAL” seçeneği mesaj pencerenizin diğer uygulamaların önünde (en üstte) yer almasını sağlayacaktır. Sonucu görmek için mesaj

159

pencereniz açıkken “Calc” (veya herhangi) programını çalıştırınız. Sonuç aşağıdaki gibi olacaktır.

Burada kullanabileceğiniz iki seçeneğiniz var. Birincisi mesaj pencerenizin en üstte kalmasını sağlayacak olan “MB_SYSTEMMODAL”, ikincisi ise diğer uygulamalarınızın mesaj penceresinin üzerinde olmasını sağlayacak (Varsayılan değer budur. Yazılmazsa da bunu kabul edecektir.) “MB_APPLMODAL” dır. Seçenekleri yinede tablo halinde vermek sanırım yararlı olacaktır. Seçenekler

Açıklama

MB_SYSTEMMODAL

Hep En Üstte

MB_APPLMODAL

Arkada

MB_TASKMODAL

Arkada

Seçenek kümemizin beşinci parametresi, mesaj penceresinde yer alacak olan metni sağa dayalı yazmak için kullanılır. Aşağıda bu husus örneklendirilmiştir. num:=Application.MessageBox('Kayıt Değiştirilsinmi','Değiştir', MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2+MB_TASK MODAL+MB_RIGHT); “MB_RIGHT” parametresi pencerede yer alan metnin sağa dayalı yazılmasını sağlar. Aşağıdaki kodu projenize ekleyip çalıştırırsanız, açıklama metninizin sağa dayalı yazıldığını göreceksiniz.

160

Buttona tıkladıktan sonraki ekran görüntünüz aşağıda verilmiştir. Burada pencere başlığının da sağa dayalı yazıldığını dikkatinizden kaçırmayın.

Dilerseniz aşağıdaki seçeneği de ekleyerek kapat düğmesi ve eklenen düğmelerin yerlerini de değiştirebilirsiniz.

161

Kapat düğmesini iptal etmek (pasif hale getirmek) içinde aşağıdaki seçeneği ekleyebilirsiniz.

“MB_PRECOMPOSED” seçeneğini ekleyerek, mesaj penceresinde kapat düğmesinin pasif hale gelmesini sağlayabilirsiniz. num:=Application.MessageBox('Kayıt Değiştirilsinmi','Değiştir', MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2+MB_TASK MODAL+MB_RIGHT+MB_PRECOMPOSED); Son eklediğimiz seçenekleri de tablo halinde verip, bu kısmı kapatmak istiyorum. Yazacağımız bu seçenekler birbirlerine alternatif değildir. Hepsinin görevi farklı olup, tabloda bu husus açıklanmıştır. Seçenekler

Açıklama

MB_RIGHT

Yazı ve Başlık Sağa Dayalı

MB_PRECOMPOSED

Kapat Düğmesini Sola Al

MB_COMPOSITE

Kapat Düğmesini Pasif Yap

Açılan mesaj penceresi alternatifli düğmelerden oluşacağı için, basılan düğmenin değerinin aktarılacağı değişken bizim için oldukça önemlidir. Aynen “MessageDlg” methodunda olduğu gibi burada da elimizdeki bu değişkeni dallandırma (if veya case) işlemine tabi tutarak her düğme için farklı kodların işletilmesini sağlayabiliriz. Aşağıdaki uygulamada bu husus örneklendirilerek, her düğme için farklı kodların işletilebilmesi sağlanabilmektedir. Programı çalıştırdıktan sonra button kontrolüne tıklayabilirsiniz.

162

Dilerseniz dallandırma işlemini “case” yapısıyla da gerçekleştirebilirsiniz. O zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz.

Kıyaslama işleminde kullanacağınız yapı tamamen programcıya kalmıştır. Bizim bu hususta herhangi bir tavsiyemiz olmayacaktır. Dilediğinizi seçebilirsiniz.

163

InputBox Fonksiyonu: Bu fonksiyon sayesinde, içerisinde bilgi girişi için text kutusunun bulunduğu bir pencere açtırmak mümkündür. Bu pencere sayesinde text kutusuna kullanıcı tarafından girilecek olan içerik, programın içerisinde diğer işlemler için kullanılabilir. Bir anlamda; kullanıcının programa parametre göndermek için kullanabileceği bir pencerenin açılmasını sağlar da diyebiliriz. Aşağıda kullanımını gösteren yapı gösterilmiştir. var deger:AnsiString; begin deger:=InputBox(pencere_başlığı,Açıklama,varsayılan_değer); Fonksiyonda girilen değeri, program içerisinde kullanabilmek için muhakkak AnsiString tipte tanımlanmış bir değişkene aktarılması gerekmektedir. Şayet tam sayı tipli bir değişkene aktarılacaksa, o zaman aşağıdaki gibi tip dönüştürme işlemi uygulamanız gerekmektedir. var deger:Integer; begin deger:=StrToInt(InputBox(pencere_başlığı,Açıklama,varsayılan_değer)); Eğer tarihsel bir değer girilecekse, o zaman aşağıdaki şekilde bir tip dönüşüm işlemi uygulamalısınız. var deger:TDate; //Tarihsel değişkene aktarılacak begin deger:=StrToDate(InputBox(pencere_başlığı,Açıklama,varsayılan_değer)); Girilecek değer tarihsel bir değişkene aktarılacaksa o zamanda aşağıdaki gibi bir dönüşüm işlemi uyglamalısınız. var deger:Currency; begin deger:=StrToCurr(InputBox(pencere_başlığı,Açıklama,varsayılan_değer)); Dönüşüm işlemlerini gösterdikten sonra, şimdi de içerisinde kullandığı üç parametreyi inceleyelim. 164

Birinci parametre, pencere başlığının alacağı değeri belirlemek için kullanılır. Buraya yazacağınız içerik pencerenin başlığında gözükecektir. var deger:AnsiString; begin deger:=InputBox('Firma İsimleri','',''); //Pencere başlığı belirlendi.

Programı çalıştırıp button kontrolüne tıklarsanız, aşağıdaki gibi sadece pencere başlığının belirlenmiş olduğu bir pencere açılacaktır.

Fonksiyonu doğru olarak kullanabilmeniz için, içerisindeki üç parametreye de değer atamanız gerekmektedir. Yukarıdaki işlemde ilk parametreye değer atayıp diğer parametrelerin ‘’ içerisinde null değer almasını sağladık (Null değeri atamakta sonuçta parametreye değer gönderildiği anlamını taşır). Kısacası InputBox fonksiyonunda opsiyonel parametre bulunmayıp, tüm parametrelere kullanıcı tarafından değer gönderilmesi gerekmektedir. Parametrelerden bir tanesini bile eklemezsiniz, Delphi sizi hata mesajıyla uyaracaktır.

165

Gelelim ikinci parametreye; buraya gireceğiniz içerik, mesaj pencerenizin açıklama bilgisi olarak kullanıcı tarafından gözükecektir. Aşağıda kullanım şekline ait yapı ve örneği gösterilmiştir. var deger:AnsiString; begin deger:=InputBox('Firma İsimleri','Firma Adını Giriniz',''); //pencere başlığı ve açıklama metni belirlendi

Programınızı çalıştırıp button kontrolüne tıklarsanız, aşağıdaki gibi başlık ve açıklama bilgisinin belli olduğu bir pencerenin açılmasını sağlarsınız.

Üçüncü parametrede, pencere açıldığı anda henüz hiç bir bilgi girilmeden text kutusunun içerisindeki default değeri belirlemek için kullanılır. Eğer kullanıcı hiç bir değişiklik yapmadan “OK” buttonuna tıklarsa, belirtilen default değer değişkenin içeriğine aktarılacaktır. Default değer belirlemek istemiyorsanız, o zaman buraya iki tek tırnak işareti koymalısınız. Aksi takdirde Delphi sizlere hata mesajı iletecektir. Aşağıda yapının kullanımına ait örneklendirme yapılmıştır.

166

var deger:AnsiString; begin deger:=InputBox('Firma İsimleri','Firma Adını Giriniz', 'Prestige'); Son (üçüncü) parametreyle, pencere açıldığı anda text kutusunun içerisinde bulunacak olan default değer belirlenmiş oldu.

Programı çalıştırıp button kontrolüne tıklarsanız, pencere başlığı, açıklama ve default değerin belirlenmiş olduğu aşağıdaki pencere açılacaktır.

Kullanıcı text kutusunun içeriğini değiştirip “OK” buttonuna tıklarsa, yeni girmiş olduğu değer değişkene aktarılacaktır. Şayet hiçbir değişiklik yapmadan “OK” buttonuna tıklama yaparsa, varsayılan olarak belirlenen değer değişkene aktarılacaktır. Önemli Uyarı: Varsayılan değer belirledikten sonra, text kutusunun içeriğini isterseniz değiştirip, isterseniz değiştirmeden “Cancel” buttonuna tıklarsanız, default değeriniz değişkene her koşulda aktarılacaktır. Aşağıdaki örneği dikkatlice inceleyiniz. 167

Örnekte şimdiye kadar yaptıklarımıza ters düşen hiç bir şey yoktur. Fakat açıklamalarımı izleyerek programı çalıştırın.

Programı çalıştırdıktan sonra button kontrolüne tıklayın. Aşağıdaki pencere açılacaktır.

Açılan pencerede default olarak belirlenen (prestige) içeriği, “Gazi Üniversitesi” olarak değiştirip “Cancel” buttonuna tıklayın. Evet formunuzun başlığında ne yazdı? Belirlemiş olduğunuz default değer olan “Prestige” yazısı, işte InputBox fonksiyonunun böyle bir handikapı var. Bu handikaptan kurtulmanın yolu aşağıda detaylı olarak incelemeye tabi tutulan InputQuery fonksiyonunu kullanmaktır. Konuyu daha iyi anlamanız açısından aşağıdaki örneği yapıp, InputBox fonksiyonunu inceleme işlemini sonlandırmak istiyorum. Örnekte; öğrenciye ait vize ve final notlarından hesaplanacak olan ortalamayı dallanmaya tabi tutarak, ulaşacağımız sonuç değerinin öğrencinin sınıfını geçmesine yetip yetmeyeceğini, kullanıcıya uyarı olarak bildirecek bir uygulama geliştireceğiz. Tüm kod aşağıda verilmiştir. 168

Şimdi bilgi giriş işlemlerinde kullanılabilen ikinci fonksiyonumuzu yani InputQuery fonksiyonunu inceleyeceğiz. Bizim size tavsiyemiz, uygulamalarınızda hep bu fonksiyonu tercih etmeniz yönünde olacaktır. Fakat tercih tamamen size kalmıştır.

169

InputQuery Fonksiyonu: Açılan bilgi giriş penceresinde “OK” veya “Cancel” buttonlarına tıklanıldığı zaman, farklı kodlar işletilecekse “InputQuery” fonksiyonu kullanılmalıdır. Bu fonksiyonda dikkat edeceğiniz iki tane çok önemli husus var. Bunlardan birincisi, fonksiyon “Ok” e basılması durumunda “true”, “Cancel” a basılması durumunda “false” değerini alacak olan “Boolean” tip bir değişkene aktarılmalıdır. İkincisi ise; kullanıcının gireceği değerin, aktarılacağı değişkenin üçüncü parametre olarak fonksiyona gönderilmesi gerektiğidir. Aşağıda kullanım şekline ait yapı verilmiştir. var dugme:Boolean; //Ok veya cancel a basıldığı bu değişken de deger:AnsiString;//Girilecek değer bu değişkende saklanacak begin dugme:=InputQuery(Başlık,Açıklama,deger); //Klavyeden girilecek olan //içerik deger isimli değişkende tutulacak.

InputQuery fonksiyonu üç parametre alabilmektedir. İlk iki parametre “InputBox” fonksiyonunda olduğu gibi pencere başlığını ve açıklama bilgisini içermektedir. Üçüncü parametre ise kullanıcının gireceği içeriği barındıracak olan AnsiString tipli bir değişken adı olmak zorundadır. İşleyiş şöyle olacak, text kutusuna gireceğiniz metin “deger” isimli değişken tarafından, bastığınız düğmenin ne olduğuda “dugme” isimli Boolean tipli diğer değişken tarafından tutulacaktır. Fonksiyonu kullandıktan sonra hangi düğme tıklanarak pencerenin kapatıldığını öğrenmek için, Boolean tip değişkeni dallanma işlemine (if veya case) tabi tutarak gerekli kodları eklemelisiniz. Şayet pencere “Ok” buttonu

170

tıklanarak kapatıldıysa “dugme” isimli değişken “true” değerini, “Cancel” tıklanarak kapatıldıysa “false” değerini alacaktır. Şimdi olayın daha iyi anlaşılması için aşağıdaki kodları formunuza ekleyerek programınızı çalıştırınız.

Burada bilmeniz gereken çok önemli bir husus var. “Cancel” düğmesine tıklamanız “deger” isimli değişkenin varsayılan değeri almasını engellemez. Sadece bu buttona tıkladığınız zaman, değişkenin aldığı değeri kullanmadığınız için sonuç farklı olacaktır. Açıklamamı daha iyi anlamanız için, kodunuzu aşağıdaki gibi değiştirip uygulamanızı tekrar çalıştırın. else begin ShowMessage('Cancel Buttonuna Basıp İşlemi İptal Ettiniz'); Form1.Caption:=deger; //Varsayılan değeri yaz end; Koda dikkat edin “Cancel” düğmesine tıklanılması durumunda da değişkenin değeri yazdırılmak istenmektedir. Bu durumda formunuzun başlığında daha önceki satırlarda belirlemiş olduğunuz varsayılan değeri yazdıracaktır (Eğer varsayılan değer belirlemediyseniz null değeri alacaktır).

171

Uygulamaya ait tüm kod satırları aşağıda verilmiştir. Açıklamaları ve örnek kodları çok iyi izleyerek sonuçlar arasındaki farka dikkat ediniz.

172

Idle Olayı Yaratarak Projeyi Kontrol Etmek: Aslında bu konunun dialog pencereleriyle bir ilgisi yok, ama ben burada anlatmayı uygun gördüm. Delphi işlemcinizin hareketsiz kalması durumunda projeyi denetlemek için size bir imkan sunmaktadır. “Idle” olayları adını verdiğimiz bu işlemde kodlar işletildikten sonra işlemcinin (bu program için) hareketsiz kalması durumunda, işleteceği event ları nasıl yaratabileceğinizi göstermek istiyorum. Aşağıdaki adımları izleyerek “Idle” olayını yaratarak, yazdığınız kodları işletme şansını bulabilirsiniz. • Yeni bir proje başlatın. • Unit inizin Private kısmına aşağıda belirtildiği gibi “IdleOlayi” (herhangi bir isimde olabilir) adında bir prosedür yaratın.

• Üçüncü adımda imleç bu satırda iken “Ctrl+Shift+C” tuşlarına beraberce basarak aşağıdaki prosedürün Delphi tarafından otomatik olarak oluşturulmasını sağlayın (Bu hususlara Delphi de class yapısı konusunda detaylı olarak değineceğim).

173

• Unit iniz aşağıdaki şekilde gözükecektir. Yani “procedure TForm4.IdleOlayi(Sender: TObject; var deger: Boolean);” prosedürünü Delphi otomatik olarak oluşturacaktır.

• Bu adımda formunuza birer adet Button ve Edit kontrolü ekleyip aşağıdaki kodları belirtilen event lara girin.

174

• Şimdi de eklemiş olduğunuz kontrolleri formunuza aşağıdaki şekilde yerleştirip projenizi çalıştırınız.

Programı çalıştırdıktan sonra, Edit kontrolünün içerisindeki karakter sayısına bağlı olarak Button kontrolünün aktif veya pasif olması sağlanabilmektedir. Yani EditBox ın içerisinde hiç veri yoksa button kullanılamaz (Formun başlığına bakınız) halde olacak, klavyeden veya kodla karakter aktarıldığı zaman Button kontrolü aktifleşebilecektir.

175

İki Kontrolün Aynı Event ı Kullanması: Tüm kodu tek bir Event a yazıp, diğer kontrollere bu event ı referans gösterebilirsiniz. Birden fazla kontrol aynı event ı kullanacağı için tetiklemenin hangi kontrolden geldiği önem arz edecektir. İşte kontrollerin event larında tanımlı bulunan “Sender” parametresi bu işlem için kullanılmaktadır. Konuyu daha iyi anlamanız için formunuza iki adet button kontrolü yerleştirip aşağıdaki adımları izleyiniz.

Kodu Button16 ya ait event a yazdığımız için Button17 ye de bu event ı referans göstermemiz gerekecektir. Referans gösterme işlemi için aşağıdaki adımları izlemelisiniz. Diğer button kontrolünü mous ile seçip “Object Inspector” penceresinden “OnClick” Event ının sağ tarafındaki oka tıklayın.

Açılan pencereden kodu yazmış olduğunuz diğer kontrolün yordamını seçip projenizi çalıştırın. Şimdi iki buttonada arka arkaya tıklarsanız, yapmış olduğunuz işlemin sonucunu görebilirsiniz. 176

Buttonlara arka arkaya tıklarsanız, program size aşağıdaki iki mesaj penceresini iletecektir:

Alt yordamlarda kullanılan “Sender” parametresi, tetiklemeyi gerçekleştiren kontrole ait özellikleri tutabilmektedir. Yapacağınız basit bir dallanmayla hangi kontrole tıklanıldığını kolayca öğrenebilirsiniz.

177

178

BÖLÜM 7 DELPHI’DE HATA YAKALAMA

179

180

Delphi’de Oluşabilecek İllegal Durumları Çözmek: Yazmış olduğunuz kodlar içerisinde tahmin edebildiğiniz veya edemediğiniz, hata oluşturmaya müsait bir çok durum olabilir. Bu hatalardan bir kısmını bildiğimiz kodlarla engellemek mümkün olmakla beraber, diğerleri için bu mümkün olmayabilir (Mesela Edit kutusu içerisindeki verinin sayısal olup olmadığını daha başka yollarla kontrol etmek mümkün olabilir). Bu yüzden bu tip durumlarda, aşağıda göstereceğim lokal ve genel hata yakalama yöntemlerinden bir tanesini (veya ikisini de) kullanmalısınız. Lokal Hata Yakalama: Lokal hata yakalama tek bir prosedür içerisinde oluşabilecek hataları programa bildirme amaçlı kullanılan bir yöntemdir. Aşağıda seçenekleri incelenmektedir. • Try-except-End : Try //Hata oluşturabilecek kod bloğu exept begin //Hata oluştuğu anda işleyecek olan kod satırları end; end; //try –end ile kapatılmalı Aşağıdaki gibi bir kodunuzun var olduğunu düşünün. Bu kodda Edit içerisine girilen içerik tamsayıya çevrilerek, tamsayı tipli bir değişkene aktarılmaktadır. Burada girilen değer içerisinde sayısal olmayan bir karakterin olması programın kırılmasına (Bir programın kırılması çökmesi demek değildir. Çalışmaya aynen devam edebilirsiniz. Ama hiç hoş olmayan bir durumun olduğu da meydandadır.) sebep olacaktır.

181

Programı çalıştırıp button kontrolüne tıklayın. Edit kontrolünün içerisinde tamsayıya çevrilecek bir değer bulamayacağı için, aşağıdaki çirkin mesajı verecektir.

Bu pencerenin çıkmasını engellemek için izleyeceğiniz yol aşağıda verilmiştir. Kodunuzu ve tasarım şeklinizi gösterildiği şekilde değiştiriniz.

182

Programınızı çalıştırdıktan sonra Edit kontrolünün içerisine sayısal olmayan bir içerik girerek button kontrolüne tıklayınız. Delphi, size hata yakalama kodlarını eklemenize rağmen, ilk başta verdiği çirkin mesajı yine verecektir. Peki o zaman bu kodları neden yazdık. Açıklayalım, buradaki Delphi’ye ait mesaj “exe” uygulamanızı çalıştırdığınız zaman kaybolacaktır. Yani uygulamanızın “exe” versiyonunu (Kayıtlı olduğu aktif klasörde oluşmuştur) çalıştırırsanız, sadece kendinizin eklemiş olduğu mesaj iletisiyle karşılaşacaksınız (hemen deneyiniz). Delphi içerisinden bu sonucu görmeniz için, hata mesajını verdikten sonra tekrar “Run” düğmesine tıklamanız gerekir. “Try-except-end” bloğunun işleme mantığı, hata oluşturabilecek kodların “tryexcept” arasına yazılması gerektiğidir. Şayet bu blok içerisine yazılan kodlarda hata oluşacak olursa, Delphi size “except” ten sonraki “begin-end” bloğu içerisinde bulunan kodları işletecek, aksi takdirde, yani hata oluşmaz ise “except” ten sonraki “begin – end” bloğu içerisindeki kodlar asla işlemeyecektir. Aşağıdaki örnekte Edit kontrolünün içerisine sayısal içerik girilene kadar kontrolü kaybetmemesi sağlanmaktadır.

Aşağıdaki tasarımı oluşturun. Yukarıda verilmiş olan kodları gerekli olan (Edit1Exit) yordamlara ekleyip programınızın “exe” sini çalıştırınız. Edit kontrolünün içerisine sayısal karakter dışında giriş yapıp kontrolden tab tuşuyla 183

ayrılmaya kalkışırsanız, aşağıdaki şekilde bir pencereyle Delphi sizi uyaracaktır. Bu sayede programınız da kırılmaktan kurtulacaktır.

Şayet sistemin kendi mesajını da (pek kullanacağınızı sanmıyorum ama gene de verelim) kullanıcıya göstermek isterseniz, o zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz.

Burada kullanılan “HandleCreateException” komut satırı sayesinde sistemin ingilizce olarak vereceği uyarı mesajını da kullanıcıya iletebilirsiniz. Türkçe yapacağınız bir uygulama için sanıyorum uygun olmayacaktır. Ama yine de siz bilirsiniz. “C++” birden fazla “catch” (except in yerine kullanılır) yapısına izin vermektedir. Fakat Delphi’de birden fazla “except” kullanmanız mümkün değildir. 184

• Try-Finally-End: Hata olsa da olmasa da işletilecek olan kod satırlarınız varsa, bunları “Finally” bloğuna yazmalısınız. Yani Finally bloğu hata olsa da olmasad a program tarafından işletilecektir. Yapı aşağıda verilmiştir. Try //Hataya müsait Kodlar Buraya Yazılacak Finally begin //Hata olsada olmasada işleyecek olan kod bloğu end; end; Genellikle yaratılmış olan objeleri bellekten atma işlemi bu blokta yapılır. Çünkü hata olsa da olmasa da nesnelerin bellekte kalmaları istenmez. Genel Hata Yakalama: Tüm uygulamanın kullanacağı genel hata yakalama işlemi uygulayacaksanız, (Windows un yapmış olduğu “Program geçersiz bir işlem yürüttü kapatılacak” gibi) aşağıdaki gibi hata olduğu zaman işleyecek olan bir prosedür tanımlamalısınız. Ardından hata olduğu zaman işletilmesi gerektiğini programa bildirmeniz gerekecektir. Aşağıda bu işlemi adım adım izah edeceğim, lütfen dikkatlice uygulayınız. Birinci adımda, programınızın Unit bölümüne geçerek “yakala” ismindeki prosedürü tanımlayın.

185

İkinci adımda imleç prosedürün tanımlandığı satırda iken “Ctrl+Shift+C” tuşlarına basarak, aşağıdaki prosedürün Delphi tarafından otomatik olarak oluşturulmasını sağlayın.

Üçüncü adımda hata oluştuğu anda işleyecek olan kodu bu prosedür içerisine yazmalısınız. Biz şimdilik aşağıdaki kod satırlarını ekliyoruz.

Dördüncü adımda, hata oluştuğu zaman yukarıda oluşturulan prosedürün işletilmesi gerektiğini belirtmeliyiz. Bu iş için en uygun yordamın “OnCreate” olduğunu düşünüyorum.

186

Artık programınızı çalıştırabilirsiniz. Programınızda oluşan tüm hatalar “yakala” isimli prosedürde belirtilen kodları işletecektir. Tüm kod aşağıda verilmiştir.

Önemli Uyarı: Bir uygulamada hem lokal hem de global hata yakalama kodları kullanıldıysa, lokal hata yakalama komutlarının önceliğinin olduğunu bilmelisiniz. Yani lokal hata yakalama komutlarıyla yakalanan bir hata mesajı, global hata yakalama komutlarına yakalanmaz.

187

188

BÖLÜM 8 DELPHI’DE UNIT KAVRAMI

189

190

Unit Penceresi: Bu bölümde kod penceresine (Bu pencere Delphi de Unit olarak adlandırılmaktadır.) ait tüm özellikleri sizlere izah edeceğim. Projenize eklemiş olduğunuz her formun kodlarının yazıldığı bir Unit i mevcuttur (Ama tersi geçerli değildir. Yani her Unit in formu olmak zorunda değildir. Formu olmayan Unit ler de bulunmaktadır). Aşağıdaki adımları izleyerek formunuza ait Unit penceresine ulaşabilirsiniz. “View->Units” adımlarından sonra karşınıza Unit inize ait pencere gelecektir. Eğer hiç bir kod eklemediyseniz görüntüsü aşağıdaki şekilde olacaktır.

Pencereye dikkat ettiyseniz tüm önemli kalıplar satır numaralarıyla (Bu numaralandırmayı biz yaptık) adlandırılmış haldedir. Bu numaraları kullanarak tüm satırların ne işe yaradığını, nasıl değişiklik yapılabileceğini, ekleme silme işlemlerinin nasıl yapılacağını anlatacağım. Şimdi birinci satırdan itibaren inceleme işlemimize başlayalım.

191

I.SATIR: Unit Unit1; Bu satır Unit inizin ismidir. Her formun bir Unit i olduğu için, adlandırmada aynı sıralamayla Delphi tarafından otomatik olarak yapılmaktadır. Yani ilk formun Unit ismi “Unit1”, ikinci formun Unit ismi “Unit2” vs. Delphi Unit isimlerini değiştirmeye şu aşamada imkan vermemektedir. Eğer ismini değiştirirseniz hatayla karşılaşırsınız . II.SATIR: İnterface Delphi Unit içerisindeki bölümleri programcılara blok blok göstermek için “interface” yapısı geliştirmiştir. Bu sayede Unit inizde yapmış olduğunuz genel, yerel tanımlamalarınızı kolayca izleyebilirsiniz. Şayet bu satırı silerseniz uygulamanız çalışmayacaktır. III.SATIR uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; Programınızda kullandığınız tüm methodlar bu satır sayesinde kullanılabilmektedir. Delphi nesneden nesne yaratma (Object Oriented) mantığını desteklediği için, kullandığınız methodlar burada belirtilen kütüphaneler içerisinde tanımlıdırlar. Dolayısıyla kod bloklarınızda rahatlıkla kullanabilmektesiniz. Tek bir “uses” bildirisiyle araya “,” koyarak istediğiniz kadar kütüphaneyi projenize ekleyebilirsiniz. Hiç bir methodu kullanılmayacak olan kütüphaneleri projeye eklemek hem karmaşa yaratacak, hem de performansınızı düşürecektir. Bu amaçla Delphi sadece en çok kullanacağınız kütüphaneleri varsayılan olarak eklemiştir. Diğer kütüphanelerden faydalanmanız gerekirse, sizin manual olarak eklemeniz gerekmektedir. “uses” bildirisiyle Linux veya Windows işletim sistemlerine ait kütüphaneleri ekleyip çıkarabilirsiniz. Bu olayı anlamanız için iki tane örnek yapacağım. Bunlardan birincisi, “ShowMessage” methodunun tanımlı olduğu class ı (Dialogs) projeden silerek kullanmayı deneyeceğim. İkincisinde ise yukarıdaki class ların içerisinde tanımı olmayan bir methodun class ını ekleyerek nasıl kullanabileceğinizi göstereceğim.

192

UYGULAMA 1: Bu örnekte “uses” satırında varsayılan olarak eklenmiş halde bulunan “Dialogs” kütüphanesini silerek aşağıdaki kodu projenize ekleyin. uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms; //Dialogs’u sildim Şimdi formunuzun üzerine yerleştireceğiniz button kontrolünün “OnClick” yordamına aşağıdaki kodu ekleyiniz.

Şimdi de programınızı çalıştırın. Daha önce çok kolay bir şekilde çalıştırdığınız uygulamanız hata mesajı verecektir. Sebebi çok basit “ShowMessage” methodu “Dialogs” class ı içerisinde tanımlıdır. Bu class ı projeden sildiğiniz için artık uygulamanız bu methodu bulamayacak, tanımayacak ve çalıştıramayacaktır.

Uyarı mesajına dikkat ederseniz; ShowMessage ın declare edilmediğini, bu yüzden de uygulamanızı çalıştıramayacağını bildirmektedir.

193

Önemli Uyarı: Bir methodun tanımlı olduğu kütüphanesine ulaşmak için, Mous ile o komutun üzerine gidin “ctrl” tuşu basılıyken (mousun şekli değişecektir) mousun sol tuşuyla üzerine tıklayın, sizi tanımlandığı kütüphaneye yönlendirecektir. UYGULAMA 2: Bu bölümde normal şartlarda kullanamayacağımız (kütüphanesi ekli olmadığı için) bir methodu, gerekli olan class ı “uses” satırına ekleyerek nasıl kullanabileceğinizi göstereceğim. İlk olarak formunuzun üzerine iki adet button kontrolü yerleştirerek, aşağıdaki tasarımı oluşturunuz.

Şimdi de “uses” satırına “MMSystem” class ını ekleyin. Bu class ı eklemezseniz yukarıdaki hata mesajıyla karşılaşırsınız. uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, StdCtrls,Dialogs,MMSystem;//Eklemeyi unutmayın Cd Rom kapağını açıp kapamak için “mciSendString” methodu kullanılmaktadır. “MMSystem” kütüphanesini eklemeden aşağıdaki kodları çalıştırırsanız, Delphi sizi bu fonksiyonları tanımadığına dair hata mesajıyla uyaracaktır. Bu yüzden ilk yapacağınız işlem “mciSendString” fonksiyonunun içerisinde tanumlandığı kütüphaneyi projeye dahil etmek olmalıdır. Eklemiş olduğunuz button kontrollerinin “OnClick” yordamlarına aşağıdaki kodları yazıp uygulamanızı çalıştırabilirsiniz. Program çalıştıktan sonra ilk buttona tıklarsanız Cd Rom kapağı açılacak, şayet ikinci buttona tıklarsanız bu durumda da Cd Rom kapağınız kapanacaktır. Unit inize aşağıdaki kod satırlarını ekleyin. 194

Sanıyorum olayın mantığını anladınız. Bir methodu kullanmak için öncelikle onun tanımlanmış olduğu kütüphaneden müsaade almalısınız (Onu projenize dahil ederek). Aksi takdirde methodu proje içerisinde kullanamazsınız. IV.SATIR: type TForm1 = class(TForm) Bu satır Wimdows Form uygulamalarının temelini oluşturmaktadır. Object Oriented mantığı kullanılarak class tan yavru üye türetilmektedir. Yaratılan yavru üyenin ismi “TForm1”, yaratıldığı ana class ise “TForm” (Windows formlarına ait tüm özellik ve methodlar “TForm” class ında tanımlanmıştır) adını taşımaktadır. Yavru üye kalıtımsal olarak yaratıldığı class a ait tüm özellikleri ve methodları üzerine alacaktır. Bir sonraki bölümde class yapısı detaylı olarak incelenecektir. Bu yüzden bu satıra ait izahat ve örnekleri o kısımda bulabilirsiniz. Görsel dillerde kod yazma işlemi çok basit olduğu için, formunuzun üzerine sürüklediğiniz kontrollerle örnekler geliştirebildiğinizi, bir çok kodu ezbere yazdığınızı maalesef biliyorum. Class kısmında yazılan kod satırlarından çoğunun ne içerdiği hakkında bilgisi olmayan programcıların olduğunu hatta 195

bazılarının işi abartıp kitap bile yazdıklarını maalesef görüyoruz (Hatta kapaklarında 4. veya 5. baskı bile yazan var). Bu kitabı hazırlamamdaki asıl amaç, Fakülte içerisinde verdiğim derslere kaynak bulamadıkları için bu kalitesiz kitapları koltuğunun altına alıp gelen (Öğrencilerimi bu hususta suçlamıyorum) öğrencilerime ışık tutabilmek maksatlı olmuştur (Referanslarımız hakkında ufak bir fikir edinebilmeniz için kitabun açılış sayfalarına bakınız). Şimdi tekrar konumuza dönerek Unit satırlarımızı izah etmeye devam edelim. V.SATIR: private { Private declarations } Sadece o Unit tarafından (Buradaki Unit Forma ait olduğu için sadece form kontrolleri tarafından da denilebilir. Genel anlamda hangi class a aitse) kullanılabilecek değişken ve methodların declare edilebileceği bloktur. Burada tanımladığınız bir değişkeni diğer formlardan (veya Unit lerden) çağıramazsınız. Private bloğu içerisinde yapmış olduğunuz tanımlamalar “Implementation” dan sonra yapılanlardan farklıdır (class kısmında inceleyebilirsiniz). Burada tanımlayacağınız bir değişkeni proje içerisinde nasıl kullanabileceğinizi göstermek istiyorum. type TForm2 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private deger:Integer; //Buradaki değişken tanımlamasında var kullanılmaz Tanımlamış olduğunuz “deger” isimli değişken bütün alt yordamlar tarafından kullanılabilecektir. Fakat başka bir Unit içerisinden bu değeri kullanabilmek mümkün değildir. Bu tip değişkenler devamlı olarak (Form kapatılana kadar) bellekte tutuldukları için son değerleri her zaman hatırlanacaktır. Yani Button1 “OnClick” olayında bu değişkene aktardığınız değeri, Button2 “OnClick” olayında rahatlıkla kullanabilirsiniz. Aşağıdaki kod satırlarını formunuzun gerekli yordamlarına ekleyip programınızı çalıştırınız.

196

“deger” isimli değişkeni, Unit inizin “private” kısmında tanımladığınız için tüm alt yordamlar tarafından kullanılabilecektir. Bu kısımda ayrıca göstermek istediğim bir hususta “private” kısmında tanımlanan bir değişken (Bu proje için Form2 ye aittir) o formun diğer kontrolleri gibi davranacaktır.

Yukarıdaki şekilde “private” kısmında tanımlanan değişkenin “Form2” yazıp “.” tuşuna basılınca açılan pencerede diğer methodlar (özellikler, kontroller vs.) gibi gözükeceğine dikkat ediniz.

197

Şimdi de “private” kısmında bir prosedür tanımlayarak Unit içerisinde nasıl kullanabileceğimizi görelim. Aşağıdaki gibi “private” kısmında yeni prosedürünüzü tanımlayın. type TForm2 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private deger:Integer; //Değişken tanımlandı procedure uyar();//Prosedür tanımlanıyor. Prosedürü bu şekilde tanımlayıp programı çalıştırmaya kalkarsanız, Delphi sizi hata mesajıyla uyaracaktır. Bu yüzden şimdi anlatacağım adımları gerçekleştirdikten sonra uygulamanızı çalıştırın. İmleç prosedürün tanımlandığı satırda iken “Ctrl+Shift+C” tuşlarına beraberce basın. Aşağıdaki gibi Unit in içerisinde Formun üyesi olan prosedür bloğunu oluşturacaktır.

Artık programınızın çalıştırılması sırasında hata oluşmayacaktır (Delphi tanımlanmış prosedür bloklarının yaratılmış olmasını istemektedir). Burada hatırlatalım private bloğunda tanımlanan prosedüre diğer Unit lerden erişmek mümkün olamayacaktır. Prosedür Unit in “Private” kısmında tanımlandığı için “Form2.uyar” komutu kullanılarak prosedür işletilebilmiştir. Prosedürünüzün içerisine yazacağınız kodları, diğer yordamlardan aşağıdaki şekilde kolayca işletebilirsiniz.

198

Burada değinmek istediğim diğer bir noktada, bu prosedüre formun diğer methodlarına nasıl erişebiliyorsanız o şekilde erişebileceğinizdir. Yani “Form2” yazıp “.” tuşuna basarsanız açılacak olan pencerede prosedürün ismi gözükecektir.

“Private” bloğunda fonksiyon tanımlaması da yapabilirsiniz. Fakat değişken ve prosedürde olduğu gibi başka bir unitten ulaşılması mümkün olmayacaktır. Sadece tanımlandığı Unit içerisinde bulunan kontrollere ait yordamlardan çağrılabilecektir. Bu blokta fonksiyon tanımlamak için aşağıdaki adımları izlemelisiniz.

199

type TForm2 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); private deger:Integer; //Değişken tanımlandı procedure uyar(); function hesapla(ilk:Integer;son:Integer):Real;//Function tanımlandı { Private declarations } Prosedür kısmında yaptığınız gibi, imleç fonksiyonun tanımlandığı satırda iken “Ctrl+Shift+c” tuşlarına beraberce basıp aşağıdaki bloğun oluşmasını sağlayın.

Hesapla isimli fonksiyonun “Form2” classının üyesi olduğunu sanıyorum söylememize gerek yok. Fonksiyona ait “begin-end” bloğu içerisinde hesaplama işlemini yapacak olan kod satırlarını yazabilirsiniz. Programa gönderilecek olan değer aynı şekilde “Result” ifadesiyle yakalanabilir. Şimdi fonksiyonumuzun kodlarını ekleyerek uygulamamızı çalıştıralım.

200

Hatırlatmak istediğim diğer bir hususta, tanımlanan fonksiyon “Form2” class ında türetildiği için Editör de “Form2” yazıp “.” tuşuna basarsanız, aşağıdaki gibi açılacak olan pencerede fonksiyonunuzu bulabileceksiniz.

Class içerisinde değişken, prosedür ve fonksiyon tanımlama işlemleri class yapısı kısmında daha detaylı olarak incelenecek ve örneklendirilecektir. Şimdilik bu kısmı kapatıp “Unit” penceremizde yer alan diğer satırları incelemeye devam edelim.

201

VI.SATIR: public { Public declarations } end; Proje içerisinde bu bloğun kullanım mantığı “private” ile tamamen aynıdır. Aralarındaki tek fark “public” bloğunda tanımlanan değişken, prosedür veya fonksiyona diğer Unitler den de ulaşılabilmesidir. Yani bu blokta tanımlanan bir değişken ait olduğu Unit inin eklendiği tüm formlardan (aslında Unitlerden) kolaylıkla çağrılabilmektedir. VII.SATIR: end; Bu satır, class a ait tanımlamaların bittiği yeri göstermektedir (TForm2). VIII.SATIR: var Form2: TForm2; “TForm2” class ından Object Oriented mantığı kullanılarak Form2 isminde yeni bir değişken türetilip kullanıma sunulmaktadır. Hatırlatalım “TForm2” nin tüm özellikleri bu yeni değişkene de aktarılmış olacaktır. IX.SATIR: implementation Forma ait Event lar için yazılacak olan kodlar bu satırdan itibaren başlar. Eğer Unit içerisinden silerseniz uygulamanız çalışmayacaktır. X.SATIR: {$R *.dfm} “.dfm” uzantılı dosyaya yazılacak olan kodları belirleyen çok önemli bir bildiridir. Sakın Unit inizin içerisinden silmeyiniz. Silerseniz uygulamanızın çalıştırılması başarısızlıkla sonuçlanacaktır.

202

BÖLÜM 9 DELPHI’DE CLASS YAPISI

203

204

Delphi’de Class Uygulamaları: C’den gelme bir davranış olan class işlemleri, görsel diller açısından bir çığır yaratmıştır. Class uygulamaları dil için en verimli çalışma ortamını sunmaktadır. Çünkü bir çok yerde kullanılacak olan nesneler tek bir yerde tanımlanıp diğer uygulamalar tarafından çağrılabilme özelliği göstermektedir. Uygulamalarınız için sizde benzer olan özellikleri tek bir çatı altında toplayıp (aynı kodları tekrar tekrar yazmamak için), diğer nesnelerinizi oluşturmuş olduğunuz bu yapıdan türetmek çok uygun bir hareket olacaktır. Class işlemleri programcılar tarafından anlaşılması en zor konu olma özelliğini taşımaktadır. Fakat anlaşılmasının zorunlu olduğunu düşünüyorum (Her ne kadar Delphi bu hususta size yardımcı oluyorsa da, büyük uygulamalarda muhakkak geliştirmek zorunda kalacaksınız). Projenize ekleyeceğiniz bir Unit içerisinde nasıl Class oluşturabileceğiniz hususu şu anki konumuzu oluşturmaktadır. Çok teknik bir konu olduğu kesin ve bir çoğunuzun ilgisini çekmeyebilir. Class oluşturabilmeniz için, öncelikle projenize aşağıdaki adımları izleyerek bir Unit (Formu olmayan) ekleyin. “File->New->Unit” adımlarını seçtikten sonra karşınıza Class ekleyebileceğiniz aşağıdaki Unit penceresi açılacaktır.

Adım Adım Class Oluşturmak: Burada göstereceğim adımlarla kolayca class oluşturma işleminin nasıl gerçekleşebildiğini öğreneceksiniz. Oluşturacağımız class’ı Unit inizin ismini (uses satırına) eklediğiniz tüm Formlardan (veya diğer nesnelerden) 205

çağırabileceğinizi belirtmek isterim. Şimdi diğer adımlara geçerek daha detaylı açıklamalarda bulunalım. Unit pencerenizdeki kod satırlarına aşağıdaki eklentiyi yapın. Interface satırının hemen altına “class” yazıp “Ctrl+j” tuşlarına beraberce basarsanız, aşağıdaki açıklama penceresi Unit inize eklenecektir.

Oluşturacağınız class a ait yapıyı bu üç seçenekten bir tanesini seçerek belirleyebilirsiniz. Biz şimdilik “classc” yi mous ile seçip enter tuşuna bastık. Unit pencereniz aşağıdaki hali alacaktır.

206

Yukarıda oluşturduğumuz yapıyı aşağıdaki hale dönüştürüp içerisine kod satırlarını eklemeye başlayalım.

Yukarıda yaptığımız değiştirme işleminin sonunda “Gazi” isminde (başka hiç bir özelliği olmayan) bir class tanımlamış olduk. Buradan sonra yapacaklarımız ise bu class a ait değişken, fonksiyon, prosedür ve özellikleri tanımlamak olacaktır. Öncelikle şu ana kadar yaptığımız işlemin sonucunu görmek için Unit1 yaprağına geçin ve uses satırına Unit2 yi ekleyin

207

“Unit1” penceresine “Unit2” yi ekledikten sonra formunuza bir adet button kontrolü yerleştirerek “OnClick” yordamında “Ga” harflerine bastıktan sonra “Ctrl+Space” tuşlarına beraberce basın. Aşağıdaki gibi içerisinde Unit2 de tanımlamış olduğunuz “Gazi” isimli class ın yer aldığı açıklama penceresi açılacaktır.

Açıklama penceresinde seçilebilecek olan nesneye ait tip özellikleri de gösterilmektedir. Class İçerisinde Tanımlanan Değişkene Erişmek: Yukarıda oluşturmuş olduğumuz (Unit2içerisinde) classa bir değişken ekleyerek formumuzdan (Unit1den) bu değişkenin değerini kullanalım. Aşağıdaki gibi Gazi isimli class ın Public kısmına “Rektor” isimli değişkeni ekleyiniz.

208

Şimdi eklemiş olduğumuz bu değişkene formdan nasıl erişebileceğimizi görelim.

Gazi isimli sınıftan türetmiş olduğumuz yeni isimli değişken sayesinde bu değişkene kolayca ulaşılabilmektedir. Basit bir örnekle olayı pekiştirelim. Formunuzun üzerine birer adet Edit ve Button kontrolü yerleştirin.

Şimdi de aşağıdaki kodları Button kontrolünün “OnClick” yordamına ekleyiniz.

209

Class İçesisinde Tanımlanan Fonksiyona Erişmek: Aşağıda “Gazi” class ının üyesi olan ve not ortalamasını hesaplayan bir fonksiyon tanımlaması yapılmaktadır. Adım adım inceleyiniz (Buradaki tüm kodlar class ınızı oluşturduğunuz Unit2 ye yazılacak). • Birinci adımda fonksiyonunuzun ismini “public” kısmında tanımlayın. public Rektor:AnsiString;//public dışarıdan erişilebilir. Function notortalamasi(vize:Integer;final:Integer):Real; //Fonksiyon tanımla end; • İkinci adımda imleç fonksiyonun tanımlandığı satırda iken “Ctrl+Shift+C” tuşlarına tıklayarak “notortalamasi” isimli fonksiyona ait kod bloğunu yaratınız. function Gazi.notortalamasi(vize, final: Integer): Real; begin //Fonksiyona ait kodlar buraya yazılacak. end; • Üçüncü adımda aşağıdaki kodları fonksiyon bloğunuzun içerisine yazınız.

210

Şimdi eklemiş olduğunuz bu fonksiyona formunuzdan nasıl erişebileceğinizi göstereceğim. Dikkatlice inceleyiniz.

Artık “Gazi” class ı içerisinde tanımlanmış olan “notortalamasi” isimli fonksiyonu formumuzdan çağırabilen bir örnek yapalım. Örneğimizde bu fonksiyon kullanılarak vize ve final notlarının ortalaması hesaplanmaktadır (%30-%70). Aşağıdaki tasarımı oluşturunuz.

Edit1 e gireceğiniz değeri vize notu, Edit2 ye gireceğiniz değeri de final notu olarak “Gazi” isimli class ta tanımlanmış olan iki parametreli “notortalamasi” isimli fonksiyona göndereceğiz. Fonksiyonun hesaplamış olduğu değeri de kullanıcıya göstermek amaçlı formun başlığında yazdıracağız. Aşağıdaki kodların tamamını class ınızın içerisinde tanımlanmış olduğu Unit2 penceresine ekleyiniz.

211

Şimdi de buradaki fonksiyonu programdan çağıracak olan kodları ekleyelim. Aşağıdaki kodları formunuza ait Unit (Unit1) penceresine ekleyin.

Programı çalıştırdıktan sonra vize notu ile final notunu gösterilen Edit kutularına giriniz. Arkasından button kontrolüne tıklayarak vize ve final notu ortalamasının (vize notunun %30 u ile final notunun %70 i) formun başında yazılmasını sağlayınız.

212

Proje içerisinde iki adet daha değişken tanımlamak zorunda kaldınız. Aslında class ınızı aşağıdaki şekle getirerek, değişkenlerinizi class ınızda tanımlayıp projeden çağırırsanız çok daha teknik bir çözüm gerçekleştirmiş olursunuz.

Tanımlanan fonksiyonu formunuzdan aşağıdaki şekilde çağırınız.

Önceki koda nazaran çok daha temiz bir kodun olduğu kesindir. Çünkü program içerisinde yeniden değişken tanımlamak zorunda kalmıyorsunuz (Bir çok yerde aynı işlemi yapmanız gerektiğini düşünün). Ayrıca kodlar daha da anlaşılır hale gelmiştir.

213

Class içerisinde oluşturulmuş Olan Prosedüre Erişmek: Şimdiki konumuz, “Gazi” class ı içerisinde oluşturacağımız prosedürler sayesinde öğrencinin sınıfını geçip geçmediğine dair mesajları kullanıcıya iletmek olacaktır. Bu amaçla “Gazi” class ı içerisinde iki adet prosedür yaratacağız. Birinci prosedür, ortalama notunun “50” den büyük olması durumunda sınıfını geçtiğini belirten gmesaj”, ikinci prosedür ise ortalamanın “50” nin altında olması durumunda sınıfta kaldığını iletecek olan “kmesaj” prosedürleridir. Ortalamanın hesaplanacağı değişkeni de class içerisinde tanımlarsak sanıyorum daha güzel bir kodlama yapmış olacağız. Unit2 niz içerisinde bulunan “Gazi” isimli class a ait kodları aşağıdaki şekilde değiştiriniz.

Class ta yapılan değişikleri izah edecek olursak, öncelikle “public” kısmında iki adet prosedür tanımlandı. Ardından “Ctrl+Shift+C” tuşları beraberce

214

kullanılarak, prosedür blokları oluşturulup gerekli kodları girildi. Son olarakta “ShowMessage” methodunun çalışabilmesi için “uses” satırına “Dialogs” kütüphanesi eklenmiştir. Şimdi class ta yapmış olduğumuz değişikliğin etkisini görebilmek amacıyla formunuza dönüp türeteceğiniz “yeni” isimli değişkeninizle bu prosedürlere nasıl ulaşabileceğinizi görün.

Yukarıdaki pencere class içerisinde tanımlanmış olan prosedürlere nasıl erişebileceğinizi göstermektedir. Sonucu görmek için formunuzdaki kodları aşağıdaki şekilde değiştiriniz.

215

Programı çalıştırıp Edit kutularına vize ve final notlarını aşağıdaki şekilde girerseniz “kmesaj” isimli prosedürün işletilmesini sağlarsınız.

Eğer notları aşağıdaki gibi sınıfını geçecek şekilde değiştirirseniz, bu durumda da aşağıdaki gibi “gmesaj” fonksiyonunu işletmiş olacaksınız.

Oluşturmuş olduğunuz çözüm tamamen doğru olmakla beraber, acaba daha güzeli oluşturulabilir miydi? Kodlamaya dikkat ettiyseniz formunuzda “ortalama” isimli bir değişken daha tanımlamak zorunda kaldık. Peki bu değişkeni de “Gazi” class ı içerisinde tanımlayamaz mıydık? Tabii ki tanımlardık. Hem bu durumda kodunuz çok daha teknik olurdu. İkinci bir kodlama yaparak class ımızı değiştireceğiz. Yapacağımız kodlamada “ortalama” isimli değişkeni “Gazi” class ının “private” kısmında tanımlayacağız. Neden private derseniz, bu değişkenin değerini “notortalamasi” fonksiyonu içerisinde class ın kendi değişkenleriyle hesaplatacağız da ondan. (Yani formdan bu değişkene değer göndermeyeceğiz) Peki “public” tanımlansaydı sonuç değişir miydi? Hemen yanıtlayalım değişmezdi. Fakat değer gönderemeyeceğiniz bir değişkeni “.” tuşuna bastıktan sonra açılacak olan pencerede görmek sanıyorum pek hoşunuza gitmeyecektir (Sakın unutmayın private da yapacağınız tanımlamalara sadece o unit içerisinden ulaşabilirsiniz).

216

“Gazi” classına ait kodunuzu aşağıdaki şekilde değiştiriniz.

Formunuza ait kodu da aşağıdaki şekilde değiştiriniz.

217

Category:Polynomials

English: Polynomials

Македонски: Полиноми

Português: Polinômios

日本語: 多項式

формальная сумма одночленов

Polynomialdeg5.svg
Медиафайл
Произношение (звуковой файл)
Подкласс от
  • сумма (одночлен)
  • алгебраическая сумма (одночлен)
Является частью
Не путать с
Отредактировать данные карточки в Викиданных

Подкатегории

В этой категории отображается 13 подкатегорий из имеющихся 13.

Страницы в категории «Polynomials»

Эта категория содержит единственную страницу.

Çarpanlara: Перевод с турецкого на русский, значение, синонимы, антонимы, примеры предложений

Примеры предложений: çarpanlara

Pratikte karşılaşılançoğucebirseldenklemintamsayıveyarasyonelkatsayılarıvardır ve biriaynıtürdenfaktörlerle çarpanlaraayırmaisteyebilir. Большинство алгебраических уравнений, которые встречаются на практике, имеют целочисленные или рациональные коэффициенты, и может потребоваться факторизация с факторами того же рода. Yakın zamanda 2017 - 2018 arasındayayınlananbirazdahayeni bir yapı, formun Lambert serisi çarpanlaraayırmateoremleriyleilgilidir. Несколько более новая конструкция, недавно опубликованная в течение 2017-2018 годов, относится к так называемым теоремам факторизации рядов Ламберта вида. Çarpanlara ayırma, matematiksel bir nesnenindahaküçükveyadahabasitnesnelerinürününedahagenelayrıştırılmasına da atıftabulunabilir. Факторизация может также относиться к более общим разложениям математического объекта на продукт более мелких или более простых объектов. Q'nun her iki taraftançıkarılması ve çarpanlaraayrılmasısonucuverir. Вычитание Q из обеих сторон и факторинг дает результат. Lambert serisi çarpanlaraayırmateoremleriüzerineyapılan bu çalışma, formundahagenelaçılımlarınagenişletilmiştir. Эта работа по теоремам факторизации рядов Ламберта распространяется на более общие разложения формы. Matris çarpanlaraayırma, önerisistemlerindekullanılan bir işbirliğinedayalıfiltrelemealgoritmalarısınıfıdır. Факторизация матрицы - это класс алгоритмов совместной фильтрации, используемых в рекомендательных системах. Bu, Weierstrass çarpanlaraayırmateoreminin bir sonucudur. Это результат теоремы факторизации Вейерштрасса. Yeterli bir istatistiktarafındansağlananbilgi, X örneklemininkiyleaynıdır. Bu, yeterli bir istatistikiçin Neyman'ın çarpanlaraayırmakriterikullanılarakgörülebilir. Информация, предоставляемая достаточной статистикой, такая же, как и в выборке X. Это можно увидеть, используя критерий факторизации Неймана для получения достаточной статистики. Aksine, iki farklıasal çarpanlaraayırmayasahip bir tamsayıolduğunuvarsayalım. Предположим, что существует целое число, которое имеет две различные простые факторизации. Bir sayıyıasalsayıların çarpımıolarakyazmaya, sayınınasal çarpanlaraayırmasıdenir. Запись числа как произведения простых чисел называется факторизацией числа на простые множители. Büyük seyrekmatrisleri çarpanlaraayırmakiçinözelalgoritmalargeliştirilmiştir. Были разработаны специальные алгоритмы факторизации больших разреженных матриц. İndirgenemezler olarak çarpanlaraayırmanınesasenbenzersizolduğuhalkalarabenzersiz çarpanlaraayırmaalanlarıdenir. Кольца, в которых факторизация на неприводимые по существу единственна, называются уникальными областями факторизации. Sylvester dizisindekisayıların çarpanlaraayrılmasıhakkında pek çok şey bilinmiyor. Многое остается неизвестным о факторизации чисел в последовательности Сильвестра. Benzersiz çarpanlaraayırmaözelliğinesahip bir değişmelihalkayabenzersiz bir çarpanlaraayırmaalanıdenir. Коммутативное кольцо, обладающее свойством уникальной факторизации, называется областью уникальной факторизации. Bu gerçekveyakarmaşık çarpanlaraayırmalarıhesaplamakiçin, polinomunköklerinibilmekgerekir. Для вычисления этих действительных или комплексных факторизаций необходимо знать корни многочлена. Weierstrass'ın çarpanlaraayırmateoreminedayanarak Hadamard, sonsuzürüngenişlemesiverdi. На основе теоремы факторизации Вейерштрасса Адамар дал разложение бесконечного произведения. Bir n tamsayısının çarpanlaraayrılmasınıhesaplamakiçin, n'nin bölen q'sunu bulmakveya n'nin asalolduğunakararvermekiçin bir algoritmayaihtiyaçvardır. Для вычисления факторизации целого числа n нужен алгоритм для нахождения делителя q числа n или определения того, что n является простым. Bazı moduloişlemleri, diğermatematikselişlemlerebenzerşekilde çarpanlaraayrılabilirveyagenişletilebilir. Некоторые операции по модулю могут быть учтены или расширены аналогично другим математическим операциям. Çarpanlara ayırmabulmakiçinçeşitliyöntemler geliştirilmiştir; bazılarıaşağıdaaçıklanmıştır. Для нахождения факторизаций были разработаны различные методы; некоторые описаны ниже. Son yıllarda, mevcutetkileşimverilerinin ve kullanımdurumlarınıngiderekartanmiktarından ve çeşitliliğindenyararlanmakiçinbirçokbaşkamatris çarpanlaraayırmamodeligeliştirilmiştir. В последние годы было разработано множество других моделей матричного факторизации для использования постоянно растущего количества и разнообразия доступных данных о взаимодействии и вариантов использования. Lambert serisi çarpanlaraayırmateoremiaçılımlarının bir başkakarakteristikformu ile verilmiştir. Другая характерная форма разложений теоремы факторизации в ряд Ламберта дается формулой. Bu çarpanlaraayırmaaçısından, XTX matrisiyazılabilir. В терминах этой факторизации можно записать матрицу XTX. Bu örneklerin, çarpanlaraayrılmış bir Gauss dağılımınınseçiminedeniyleaşırıderecedegürültülüolduğugösterilmiştir. Эти образцы оказались чрезмерно шумно из-за выбора факторизованного распределения Гаусса. Bu benzersiz çarpanlaraayırmaeksikliği, Diophantine denklemleriniçözmekiçinbüyük bir zorluktur. Отсутствие уникальной факторизации - главная трудность при решении диофантовых уравнений. Çarpanlara ayırma ilk olarakeski Yunan matematikçilertarafındantamsayılardurumunda ele alındı. Факторизация была впервые рассмотрена древнегреческими математиками в случае целых чисел. P'nin katsayılarıgerçekse, genelliklefaktörleringerçekkatsayılarasahipolduğu bir çarpanlaraayırmaister. Если коэффициенты P реальны, то обычно требуется факторизация, где факторы имеют действительные коэффициенты. Bileşik bir girdinin çarpanlaraayrılmasınızorunlukılmaksızın, bir sayınınasal mı yoksabileşik mi olduğunubelirleyebilenbirkaçbilinenasallıktestivardır. Существует несколько известных тестов на простоту, которые могут определить, является ли число простым или составным, не обязательно раскрывая факторизацию составного ввода. Ancak bu, q1'in uygun bir çarpanlaraayırmayasahipolduğuanlamınagelir, bu nedenleasalsayıdeğildir. Но это означает, что q1 имеет правильную факторизацию, поэтому это не простое число. Tamsayı çarpanlaraayırmayadayalışifrelemesistemlerineözgü bir zayıflıktanyararlandılar. Они использовали уникальную уязвимость криптосистем, основанную на целочисленной факторизации. Aritmetiğin temelteoreminegöre, her pozitif tam sayınınbenzersiz bir asal çarpanlaraayırmasıvardır. По основной теореме арифметики каждое натуральное число имеет уникальную простую факторизацию. Bir tamsayıhalkası her zaman bir Dedekind alanıdır ve bu nedenleideallerinasalideallerebenzersiz çarpanlaraayrılmasıvardır. Кольцо целых чисел всегда является областью Дедекинда, и поэтому имеет уникальную факторизацию идеалов в простые идеалы. Kategori 2, İkinci Kategori veya Kraitchik ailesialgoritmasıolarak da bilinengenelamaçlı bir çarpanlaraayırmaalgoritması, yalnızca çarpanlaraayrılacaktamsayınınboyutunabağlıolan bir çalışmasüresinesahiptir. Алгоритм факторинга общего назначения, также известный как алгоритм категории 2, второй категории или алгоритм семейства Крайчика, имеет время работы, которое зависит исключительно от размера факторизуемого целого числа.

nest...

batman iftar saati 2021 viranşehir kaç kilometre seferberlik ne demek namaz nasıl kılınır ve hangi dualar okunur özel jimer anlamlı bayram mesajı maxoak 50.000 mah powerbank cin tırnağı nedir