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 nihadd@prestigeturk.com M. Yüksel İNAN MCP-MCP+INT-MCSA-MCSE-MCDBA-MCSD-MCT-MCAD yuksel@yukselinan.com 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: prestige@prestigeturk.com 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

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

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

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

2 .

size hikaye anlatmaktan çok. karşınıza “Delphi 7” açılışına ait (Bilgisayarınızın hızına bağlı olarak ekranda biraz kalabilir. Delphi ile çok kolaylaşmıştır (çok da güvenilirdir). Intranet. basitten zora doğru kod yazma işlemine geçebiliriz. HTML ve . Bu yüzden ticari yazılımların ülkemizde (diğer bir çok ülkede de) en yaygın olanı sanıyorum Delphi’dir. Çok gelişmiş bir yazılım diliyle karşı karşıya olduğunuzun sanıyorum siz de farkındasınız.NET desteği) son derece gelişmiş projeler oluşturmak.” diyerek. Tecrübemiz. XML. Yukarıdaki adımları izledikten sonra. Bu ekran. örnek kodlarla beraber detaylı açıklamalarda bulunmamız gerektiğini göstermiştir. gerekse de yetiştirdiğimiz binlerce öğrencimizden sonra. Kitapta.) 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. Gerek veri tabanı uygulamaları. “Delphi 7” programını bilgisayarınıza kurduktan sonra. Artık Delphi ekranını tanıyarak.) pencere gelecek. Kitapta uygulama ve geliştirme alanında kullanabileceğiniz tüm konulara değinilecektir.Delphi 7’ye Giriş: “Delphi 7’ye hoşgeldiniz. aşağıdaki adımları izleyerek (Start-> Programs-> Borland Delphi 7-> Delphi 7) kolayca çalıştırabilirsiniz. Eğer herhangi bir kısımda uzmanlaşmak isterseniz. Diğer 3 . temel konular ve diğer uzmanlık alanlarını da içeren bir çok konu detaylı örneklerle önünüze sunulacaktır. bu hususta çok güvenilir bir kaynak olduğumuzu düşünüyoruz). hepinizin bildiği gibi Windows Formlarından (veya diğer nesnelerinden) oluşmaktadır. arkasından tasarım ekranına ulaşılacaktır. kitabımın ilk kısmına geçmek istiyorum. (işiniz gereği vs. Mümkün olduğu kadar bu amacın dışına çıkmamaya çalışacağız. gerekse diğer uygulamalarda (Internet.

yardımcı nesneleri bu formlara ekleyerek proje geliştirebilmekteyiz (Windows Formları olmadan da proje geliştirilebilir). 4 . 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. Component Palette: Bu pencere.) içerisinde barındıran bir nesnedir. şimdi sizlere bu pencerelerin ne tür işlemler için kullanılabileceklerinden bahsetmek istiyorum. “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.

bu Class’tan türetilen yavru üyenin adıdır. Daha detaylı olarak açıklayacak olursak. Burada asıl göstermek istediğim. Dolayısıyla 5 .Bu yapraklardan birtanesine tıkladığınız zaman. formunuzun üzerine ekletebilirsiniz. “TButton” Delphi içerisinde bu kontrole ait tüm özelliklerin ve metodların tanımlandığı bir class’tır. o gruba ait tüm kontrolleri görebilirsiniz. Boyutlarını ve koordinatlarını mousunuzla kolayca değiştirebilirsiniz. eklemiş olduğunuz her kontrolün kullanacağı kütüphaneyi Delphi’nin otomatik olarak projeye dahil ettiğidir.) içerisine (“pas” uzantılı dosyalar yazmış olduğunuz kodları saklarlar. Buradaki mantık “Nesneden nesne yaratma (Object Oriented)” şeklinde işlemektedir. formunuzun üzerine eklendiğini göreceksiniz.pas” penceresinin (Formun üzerine çift tıklarsanız erişebilirsiniz. Peki ama bu kodu nereye ekledi? Tabii ki aşağıdaki “Unit. Şimdi de aynı işlemi “Edit” kontrolü için yapın. “Button1” de. Örnek olması açısından “Standart” yaprağında bulunan “Button” kontrolünün üzerine çift tıklayın. formunuz aşağıdaki hali alacaktır.) dosyayı kaydettikten sonra bu kodlar “pas” uzantılı olarak yeni bir dosya oluşturmaktadır. Hangisini projenizde kullanacaksanız üzerine mousun sol tuşuyla çift tıklayıp.

Bu yaprakta hangi yordama kod yazacaksanız. 6 . şimdiden kafanızı fazla şişirmek istemiyorum. 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.pas: Bu pencereden projenize eklemiş olduğunuz form ve diğer nesneleri (Button. performansı en üst düzeyde tutmak istemesinden kaynaklanmaktadır (Kullanılmayan bir class’ın projeye eklenmesi sanırım pek hoş olmayacaktır). Delphi’nin tüm kontrollere ait kütüphaneleri projenize başlangıç anında eklememesinin sebebi. Eğer bu pencere ekranda gözükmüyorsa. Alt kısımda yer alan diğer pencereden de eklemiş olduğunuz kontrole ait özellikleri “Properties” yaprağından değiştirebilirsiniz.pas” penceresinde o nesnenin tanımlanmış olduğu satıra ulaşabilirsiniz. “Unit.bu sınıfa ait statik olmayan (Daha sonra açıklanacaktır. sağında yer alan beyaz kutunun içerisine mous ile çift tıklamalısınız. Neyse son derece teknik olan bu hususlara daha sonraki bölümlerde detaylı olarak değinecek olup. “View->Object Inspector” adımlarını izleyerek gözükmesini sağlayabilirsiniz. Şayet buradaki nesnelerden herhangi birtanesinin üzerine mous ile çift tıklarsanız.) izleyebilirsiniz. Object Inspector. Edit vs.) tüm yöntemleri de bünyesinde barındıracaktır. Exploring Unit.

Bunlar daha sonra detaylı olarak kitabın ilerleyen kısımlarında anlatılmıştır. Bu yordama ait işleteceğiniz kodları yukarıda işaretlenen yerlere yazmalısınız. Aşağıdaki pencereye “OnCreate” yordamı çift tıklanılarak ulaşılmıştır. 7 .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. kodları yazabileceğiniz ekrana kolayca ulaşabilirsiniz. Kod Penceresine Ulaşmak: Yukarıdaki pencerede herhangi bir yordama (İsimlerinin sağındaki beyaz alana) mous ile çift tıklarsanız.

eğer bir kontrole ait tüm özellikleri listelemek istiyorsanız.” tuşuna basarsanız. satırı tamamlamanız için yeterli olacaktır (Kodun doğru yazılabilmesi için devamlı kullanmanızı tavsiye ederim). o kontrolün sürüklenip (veya kodla eklenmesi gerekir) formun üzerine bırakılması 8 . Burada dikkat edeceğiniz husus.” Karakterinin Kullanılması: Yukarıda anlatılan şekilde (Ctrl+Space). • Kod Penceresinde “. o kontrole (veya komuta) ait tüm özellik ve metodların içerisinde bulunduğu yeni bir listeyle karşılaşırsınız. kullanacağınız komutun ismini tam olarak yazdırdıktan sonra (Ezbere de yazabilirsiniz tabii ki) klavyeden “. Enter tuşuna basarak bu pencereden istediğiniz komutu seçebilirsiniz. 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). Bu ekranda “Edi” yazıp “Ctrl+Space” tuşlarına beraberce basarsanız. görsel dillerle beraber kullanılmaya başlayan bir çok özelliği de beraberinde getirmektedir. epeyce kullanışlı özelliği bulunmaktadır.Kod (Unit) Penceresinin Özellikleri: Yukarıda açmış olduğunuz “Unit” penceresi. Aşağıda en önemli özelliklerinden bahsedilmektedir. Aşağıdaki pencerede izlenen adımlara dikkat ediniz. • Ctrl+Space Tuşunun Beraber Kullanılması: Unit penceresinde kodlarınızı yazarken herhangi bir komutun baş harflerini hatırlamanız. eklenmiş olan kütüphanelere ait yazabileceğiniz tüm komutları listeleyen yeni bir pencereyle karşılaşacaksınız. Bu ekran bir Editör programının parçası olup.

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

Pencereye dikkat edecek olursanız üç farklı yaprağın bulunduğunu görecekseniz. hangisi kolayınıza geliyorsa o şekilde kullanabilirsiniz. Delphi Dosya Uzantıları: Oluşturduğunuz Delphi projesi aşağıdaki uzantılı dosyaları otomatik olarak oluşturacaktır. 10 . 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.Eğer ekranınızda bu pencere gözükmüyorsa “View->Object TreeView” adımlarını izleyerek gözükmesini sağlayabilirsiniz. Ekranınızda daha rahat çalışabilmeniz için bu yöntemi uygulamanızı tavsiye ederim.

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. Kod Penceresine Ait Font Ayarları: Delphi. 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. 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. bu dosyalar yeniden Delphi tarafından oluşturulacaktır.) 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. sizlere Unit penceresine yazacağınız kodları belirlemiş olduğu grup dahilinde değişik formatlarda yazmanıza imkan tanımaktadır.Bu uzantılı dosyaları açıklamaya çalışalım. Uygulamanızı her çalıştırdığınızda. Dilerseniz tamamen sizin hoşunuza gidebilecek bir düzende oluşturabilirsiniz. 11 . Aşağıda kod penceresine ait Editör ayarlarını nasıl yapabileceğiniz açıklanmıştır.

Bu pencerenin “Color” yaprağını aktif hale getirin. 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. o elemana ait tüm font ayarlarını belirleyebilirsiniz. “Elements” kısmında gruplandırılmış olarak bulunan seçeneklerden bir tanesini seçip. Diğer grupta bulunan elemanlar bu değişikliklerden etkilenmeyecektir. “Uses” bildirisinin nasıl yapılacağı aşağıda gösterilmiştir. Yapacağınız değişiklikler sadece “Elements” kısmından seçmiş olduğunuz gruba etki edecektir. İşte bu kütüphaneleri uygulamanıza ancak “Uses” bildirisiyle çağırabilirsiniz. Bu sayede kütüphanelerin içerisinde tanımlı olan fonksiyon. Uses İfadesi: Uses deklarasyonu sayesinde. Fakat bazı durumlarda sizin dahil edilmeyen kütüphaneler içerisinde tanıtılmış olan metodlara ihtiyacınız olacaktır. Delphi içerisinde tanımlı olan kütüphaneler (veya sizin oluşturduğunuz diğer Unit leri çağırmak) projeye dahil edilebilirler.“Tools->Editor Options” adımlarından sonra karşınıza aşağıdaki “Editor Properties” penceresi açılacaktır. 12 . değişken.

Uses bildirimini daha iyi anlamanız için aşağıdaki örneği dikkatlice inceleyiniz.Pencereye dikkat edecek olursanız tek bir “uses” deklarasyonu sayesinde araya “. 13 . bu amaçla aşağıdaki kod satırı eklenmiştir. çü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) .” konularak bir çok kütüphane uygulamanıza dahil edilmiştir (Dahil edilen bu kütüphaneler sadece Unit1 tarafından kullanılabilir). Örnekte Buttona tıklanılarak kullanıcıya basit bir mesaj iletilmesi istenmiş olup. Peki neden bu uyarı gözüktü? Hemen izah edeyim. Programı çalıştırıp Button2’ye tıklayacak olursanız aşağıdaki pencereyle belirtmiş olduğunuz uyarı kullanıcıya iletilecektir.

Buttona her tıkladığınızda mesaj ayrı bir pencere olarak karşınıza gelecektir. “New” komutuyla ekleme.Uses satırında da bu kütüphane projenize dahil edildiği için. Ş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. “Remove” komutuyla da silme işlemini gerçekleştirebilirsiniz. 14 . Project Manager Penceresi: Bu pencere sayesinde projeniz için oluşmuş olan dosyaların kayıtlı oldukları adresleri izleyebilirsiniz. Şayet bu pencere ekranda gözükmüyorsa “View->Project Manager” adımlarını izleyerek ekranda açtırabilirsiniz. Burada gözüken bir proje grubudur ve bu gruba ait bir çok Delphi dosyasının bulunduğu sanıyorum dikkatinizi çekmiştir.

15 . Bu pencereden herhangi bir nesneyi seçip “OK” Buttonuna tıklarsanız.Window List Penceresi: Ekranda gözüküyor konumda olan tüm nesneleri izleyebileceğiniz bir penceredir. Şayet bu pencere ekranda gözükmüyorsa “View->Windows List” adımlarını izleyerek gözükmesini sağlayabilirsiniz. seçmiş olduğunuz pencereniz aktifleşecektir.

16 .

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

18 .

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. 19 .Ö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. Eğer bu tip dönüştürme işlemini yapmazsanız. Delphi size sonucu hesaplayamayacağına dair hata mesajı iletecektir. kontroldeki değeri alabilmesi için “StrToInt” (Stringi Tamsayıya çevir) tip çeviri fonksiyonuna ihtiyaç duyulmaktadır. 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.

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). 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. EditBox’ın içerisinde bulunan değeri Reel Sayı tipli değişkene aktarmak Uygulanan yöntem şu. ondan sonra atama işlemi gerçekleştirilebilmektedir.Ayrıca kontroller üzerinde klavye ile girilebilen veri tiplerinin string olduğunu da unutmayınız. 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. 20 .

Bu elinizdeki tarihsel değişkenin değerini yazdırmak. veya tarihsel 21 . Aşağıda her iki durum içinde örneklendirme yapılmıştır. Bu yüzden tip dönüşüm işlemi uygulamak zaten mantıksız olurdu. Aşağıda verilen örnekte ise procedure içerisinde string tipli bir değişken tanımlanarak.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. 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. 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.

Ardından tekrar ters dönüşüm yapılarak (tarihten-stringe). formunuzun başlığında yazdırılmaktadır. kontrolün içerisindeki string tipli veri “StrToDate” fonksiyonu sayesinde tarihsel içeriğe dönüştürülüp bir gün eklenmektedir.değer barındıran bir kontrolün içeriğini değişkene aktarmak şeklinde olabilir. Kodu inceleyecek olursak. 22 . Tip dönüştürme işlemlerine lütfen dikkat ediniz. Ş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. 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.

Şayet “exit” komut satırı olmasaydı formun başlığında “Yüksel İnan” stringi yazacaktı. kod okumayı sonlandırabilirsiniz. veya Visual Basic deki Exit Sub). 23 . Fakat “exit” sayesinde altta yer alan iki satır kod okutulmamakta. (C++ daki return.) 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. Şimdi bu tür kodlamaya örnek vereceğim. 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).Aktif Formu Kapatmak: Çalışan aktif formu kapatmak (Eğer tek formunuz varsa aynı zamanda programınız da sonlanacaktır.

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. Bu yaprakta bulunan “Main 24 .“Project->Options” menü adımlarından sonra aşağıdaki pencere açılacaktır. Bu pencerenin “Forms” yaprağını aktifleştirin. belirtilen adımları izlemelisiniz.

) uzantılı dosyayı kolaylıkla çalıştırabilirsiniz. 25 . Şayet yetki probleminiz yoksa.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). paylaşıma açılmış olan WINNT klasörünün içerisindeki. 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. istediğiniz “exe” (Dosya yolunu doğru giriniz. Burada hatırlatmak isterim. Herhangi Bir Exe Uygulamasını Çalıştırmak: Aşağıdaki gibi projenize ekleyeceğiniz tek satırlık kodla. Yukarıdaki kod satırında Efsane isimli bilgisayarda. “UNC” path\\makineadı\\klasörpaylaşımadı\\dosyaadı şeklinde kullanılmaktadır. aşağıdaki gibi “UNC” (Network adresi) path belirterek de dilediğiniz bir bilgisayardaki dosyayı da çalıştırabilirsiniz.exe dosyası çalıştırılmak istenmektedir. Notepad.

Şimdi sizlere bu hususlardan bahsetmek istiyorum. Daha sonra izah edilecektir. Bunlardan birincisi procedure’un dilediğiniz yerinde değerini değiştirebilmenizi sağlayan “Var” bildirisi. Aşağıdaki kod penceresinde. 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. Ayrıca Delphi’de değişkenlerinizi rastgele yerlerde tanımlayamazsınız. diğeri ise tanımlandığında atanacak olan değer dışında başka değer alamayan (İstisnaları vardır. 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. Delphi size procedure-begin arasında değişken tanımlama imkanı vermektedir. Zaten böyle olmasaydı yazılımların hiç bir anlamı kalmazdı. Delphi’de değişken kullanılacaksa muhakkak programa bildirilmelidir. Başka rastgele bir yerde değişken tanımlamanız mümkün olmamaktadır. Belirtilen blok içerisinde tanımlanan tüm değişkenler local değişken olarak adlandırılırlar.) “Const” bildirisidir. 26 . Bir değişkeni programa bildirmek için iki yöntem bulunur. Bu kadar önemli olan bir konuda tabiidir ki dikkat edilecek birtakım önemli hususlar vardır.Değişkenler: Paket yazılımların her firma için (veya kişi) farklı sonuçlar oluşturması.) değişkenlerin nasıl tanımlanabileceği gösterilmiştir. procedure içerisinde local (Sadece o procedure tarafından kullanılabilen ve işlem bittikten sonra bellekten atılan değişkenlerdir. 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). programın içerisinde değişkenlerin kullanılmasından kaynaklanmaktadır. Pencereyi dikkatlice inceleyiniz. değişken tanımlayabilmeniz için size procedure’un içerisinde bir blok sunmaktadır.

iki kelime arasına “_” karakterini yerleştirin. //Yanlış tanımlanmış bir değişken Nih#3:AnsiString.” koyarak aynı tipte birden fazla değişken tanımlanabilmektedir.Delphi’de aynı satırda araya ”. Yani değişkeninizin ismi birden fazla kelimeden oluşamaz. Var //Değişken bildirisi için gereklidir. //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. 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 isimleri kesinlikle rakamla başlayamaz. Fakat ismin içerisinde veya sonunda rakam kullanılabilir. 27 . Eğer böyle bir değişken (Adı ve soyadını ayrık yazmak isteyebilirsiniz) tanımlamak zorunda kalırsanız. 5nih:integer. Değişken Tanımlarken Dikkat Edilecek Olan Hususlar: Değişkeninizi tanımlarken aşağıdaki hususlara dikkat etmelisiniz. //Yanlış tanımlanmış bir değişken • Değişken isimlerinde araya space tuşuyla boşluk bırakamazsınız.

Var Not:integer. • Const ile yapılan bildiri sonucu tanımlanmış olan değişkene ilk değerini atamak zorunludur. Özel bildiriler eklenerek değişkene yeni değer aktarılabilmektedir.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).Var N demirli:AnsiString. Var Sayi:integer=100. Const Pi:Double. 28 anda bellekte . Numara:Double=200. • Local değişkenker procedure işlemeye başladığı oluşturulup. • Const ile bildirilmiş sabit değişkenlere procedure içerisinde yeni değer aktarılamaz (Bunun istisnası vardır. Pi:Double=3. fakat bu konu daha sonra detaylı olarak işlenecektir). //Doğru bir değişken tanımlaması • Var bildirisiyle tanımlanan bir değişkene tanımlandığı anda değer ataması yapılamaz. Şimdi Delphi içerisindeki değişken tiplerini inceleyelim. //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. kod sonlandığı anda da bellekten atılırlar. N_demirli:AnsiString. //Yanlış bir değişken tanımlandı Not1:integer. //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.14.

Bellekte 4 Byte (32 bit) yer işgal edecektir. Var Sayi:Integer.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. Bellekte 4 Byte (32 bit) yer işgal edecektir. Bellekte 2 Byte (16 bit) lık yer işgal edecektir. //Sadece -2147483648 ile 2147483648 arasında değer atanabilir. //Sadece -128 ile 128 arasında değer atanabilir. Var Sayi:Longint. • Integer (-2147483648)-(+2147483647) arasında tam sayı değerleri alabilen bir değişken tipidir. Var Yas:Shortint. Eğer bu değerlerin dışında bir sayı aktarılmaya çalışılırsa taşma (owerflow) hatası verecektir. //Sadece -2147483648 ile 2147483648 arasında değer atanabilir. Var Sayi:Smallint. 29 . Bu değişken bellekte 1 Byte (8 bit) lik yer işgal eder. //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. • Smallint (-32768)-(+32768) arasında tam sayı değeri atanabilen değişken tipidir.

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

Var Sayi:Single. Ondalıklı kısımdan 7-8 dijit hassasiyetiyle işlem yapabilir. • Real48 (+-2.0 x 10^-324) ve (+-1. 31 .0 x 10^-324) ile (1. Ondalıklı kısımdan 15-16 dijite kadar hassasiyetle işlem yapabilmektedir. //Sadece yukarıda belirtilen sınırlar içerisinde değer alabilir. //Sadece yukarıdaki sınırlar arasında değer alabilir. • Single (+-1. Ayrıca bellekte bu değişken 8 Byte (64 bit) lık yer işgal edecektir. Var Sayi:Double. Ondalıklı kısımdan 11-12 dijite kadar hassas çalışabilir. Var Sayi:Real48. ve bellekte 4 Byte (32 bit) lık yer işgal eder. • Real (5. Bellekte 8 Byte (64 bit) lık yer işgal edecektir. Bellekte 6 Byte (48 bit) yer işgal etmektedir.4 x 10^38) arasında değer alabilen reel sayı tipidir.7*10^38) arasında değer alabilen reel sayı tipidir. • Double (+-5. Var Sayi:Real.9*10^-39) ve (+-1. //Sadece yukarıda belirtilen sınırlar içerisinde değer alabilir.7 x 10^308) arasında değer saklayabilen reel sayı tipidir.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. //Sadece yukarıdaki sınırlar içerisinde değer alabilir.7 x 10^308) arasında değer alabilen reel sayı tipidir.5 x 10^-45) ve (+-3.

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

Kullanımı ShortString değişkeniyle aynıdır. Var Ad:WideString. //String değişken tanımlandı String tipte değer alacak olan değişkenlerinizi yukarıdaki üç tipten birtanesiyle tanımlayabilirsiniz. Matematiksel ve Tarihsel içeriği olmayan değerleri tutmak için kullanılan tiplerdir.String Değişken Tipleri: Bu bölümde karakter işlemlerinde kullanabileceğiniz değişken tiplerinden bahsedeceğim. • WideString Yaklaşık olarak 2^31 karaktere kadar (Unicode) değer atanabilen değişken tipidir. • ShortString 255 Kraktere kadar veri alabilen string değişken tipidir. 33 . 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.

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. Burada tarihsel değişken olarak kullanılan iki değişken aşağıdaki şekilde tanımlanmıştır. TDate class’ından türetilerek kullanılabilir. Var Sonuc:Boolean.sontarih:TDate. Tarihsel İçerikli Değişken Tanımlamak: Delphi içerisinde tarih bilgisi içeren değerleri tutabilecek olan değişkenler. //Tarihsel değişkenler tanımlanıyor. //true veya false değerini alabilir. Daha sonra bu iki değişkene tip dönüştürme işlemi uygulanarak EditBox kontrollerinden değer atanmıştır. Aşağıda bu husus örneklendirilmiştir. Ayrıca değişken tanımlandığı anda varsayılan değeri false dır. Var İlktarih. 34 . Son olarak iki tarih arasındaki fark hesaplanıp başlıkta yazdırılmıştır.

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. Local Static Değişken Tanımlamak: Procedure içerisinde (Global değişken olabilmesi için özel tanımlama blokları mevcuttur. Const’la tanımlamış olduğunuz değişkenin değerini procedure içerisinde değiştiremezsiniz (Özel birim ile yapabilirsiniz). kod işletildiği anda bellekte yaratılır. Bu olay bir çok durumda işinize tahmininizden daha fazla yarayacaktır. Bu durumda şöyle bir problemle karşı karşıya kalırız. o procedure’ü ikinci kez (veya daha fazla) işlettiğiniz zaman önceki tur bulduğu değeri kullanmasını sağlayacaktır. Procedure’ü ikinci kez tekrar işlettiğiniz zaman aynı işlemler tekrarlanacaktır. o değişkeni static olarak tanımlarsınız. kodun tamamı işletildikten sonra da bellekten atılır. işte bu tip değişkenleri özel bir bildirimle yapmalısınız. Aşağıda bu husus örneklendirilmiştir. Procedure’ü ilk işlettiğimiz zaman değişkenimize en son atanan değeri. Aşağıda bu husus örneklendirilmiştir. Local bir değişkenin static olarak tanımlanması. Mesela matematikteki pi sayısı veya logaritmada kullanılan e sayısı gibi.) tanımlanan bir değişken. 35 . daha sonraki kısımlarda incelenecektir.Delphi’de Sabit Değişken Tanımlamak: Bazı durumlarda değeri hiç değişmeyen sabit bir değişken tanımlamak isteyebilirsiniz.

Bu satırı eklemezseniz. Delphi size Const ile tanımlanan bir değişkenin değerini değiştiremeyeceğinize dair hata mesajı iletecektir. Pencerede kullanılan {$j+} satırı. Hatırlatalım bu satırı procedure içerisinde de tanımlayabilirsiniz (Ama Const tan sonra bildirmeniz anlamsız olacaktır). 36 .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. 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.

37 . Bu sebeplerden dolayı önceliği hep local değişken tanımlamaya veriniz. aşağıdaki kodları da gerekli olan yordamlara yazınız. Formunuzun üzerine iki adet button kontrolü ekleyip. Burada şunu sorabilirsiniz neden bütün değişkenleri burada tanımlamıyoruz? Cevabı son derece basittir. Aşağıdaki Delphi Unit’i içerisinde global değişkenleri nasıl tanımlayabileceğiniz örneklendirilmiştir. Görüldüğü gibi iki procedure’de aynı “deger” isimli değişkeni kolaylıkla kullanabilmektedir. ikinci buttona tıkladığınız zaman kullanmak isterseniz o değişkeni global olarak tanımlamalısınız. değişkenin değerinin hatırlandığı sanıyorum dikkatinizi çekecektir. Global değişkenler procedure’ün işletilmesi bittiği anda bellekten atılmadıkları için. Bu olayı örneklendirecek olursak. İkincisi ise hangi değişkenin hangi procedur’ler için tanımlandığı büyük uygulamalar için karmaşa yaratacaktır. bir procedure’ün sonundaki değişkenin değeri diğer procedure içerisinde hatırlanabilmektedir.Tüm Alt Yordamlar Tarafından Kullanılabilecek Değişken Tanımlamak: Sanıyorum hepiniz biliyorsunuz. Birincisi bu değişkenler bellekte devamlı yer işgal edeceklerinden performansı etkileyeceklerdir. Şimdi uygulamanızı çalıştırıp her iki buttona tıklayın. birinci buttona tıkladığınız zaman değişkene atadığınız değeri. bu işleme global değişken tanımlama adını veriyoruz.

Şimdi iki buttona arka arkaya tıklayıp sonucu görebilirsiniz. Dilerseniz Sadece o Unit içerisinde kullanmak üzere değişkeninizi Private Declarations kısmında tanımlayabilirsiniz.Global değişken tanımlamak için Delphi size başka bir blok daha sunmaktadır. Formunuza iki adet button ekleyin. tüm alt procedure lerin kullanımına sunulmuştur. Yukarıdaki pencereye dikkat edecek olursanız “deger” isimli değişken Unit in Private Declarations kısmında tanımlanmış olup. aşağıdaki kodları da gerekli olan yerlere yazıp projenizi tekrar çalıştırınız. 38 . Eğer global değişkeninizi bu blokta tanımlayacaksanız. o zaman var veya const bildirisini kullanamazsınız.

Button1Click(Sender: TObject). private { Private declarations } public { Public declarations } end.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.dfm} procedure TForm1. Variants.FormCreate(Sender: TObject). Messages.//Eklemeyi unutmayınız {$R *. Graphics. //Form1 e ait Unit1 type TForm1 = class(TForm) Button1: TButton.//İkinci form bu değişkeni kullanabilir implementation uses Unit2.show. procedure TForm1. var Form1: TForm1.Dialogs. Bu tip durumlarda aşağıdaki yöntemi uygulamalısınız.//Form2 yi aç end. begin form2.//Eklemeyi Unutmayınız. Unit1. Controls. SysUtils. begin x:=155. uses Windows. procedure FormCreate(Sender: TObject). var x:Integer. Forms. 39 . Aşağıdaki kod bloğunu da ikinci forma ekleyiniz. end. procedure Button1Click(Sender: TObject). Classes.

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

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

) bu eleman 5. Aşağıda Enumerated tip tanımlaması yapılarak haftanın günlerinin ingilizce karşılıkları kullanıcıya iletilebilmektedir.Burada atanan elemanların sayısal değerlerini yazdırmak için Ord fonksiyonu kullanılır. 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. Ş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. İlk elemanın sıra numarasının “0” olduğunu unutmayınız. Aşağıdaki form tasarımını oluşturunuz. Burada Option buttonlarından birtanesini seçtiğiniz zaman yeni tanımlamış olduğumuz tip değişkenimizin değeri de otomatik olarak 42 . Buradan hareketle ilk elemanın numarasının “0” olduğunu hatırlarsak. sırada bulunmaktadır. Kodu inceleyecek olursak öncelikle Haftanın yedi gününün belirlendiği yeni bir (Enumerated) tip tanımı yapılmış olup. formumuzun başlığında “4” değerini yazdıracaktır.

Tabii bu uygulamayı daha değişik yöntemlerle yeni tip tanımlaması yapmadan da çözebilirdiniz. 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). Tanımlamış olduğumuz değişken global olduğu için. tekrar tekrar aynı kodları yazmak zorunda kalmazsınız. tüm Türkçe kelimelerin İngilizce karşılıkları belirlenmiştir. Aynı işlemi projenizin başka bir yerinde tekrar yapmak zorunda kalırsanız.değişecektir. 43 . form kapatılana kadar son seçilen gün bellekte tutulmuş olacaktır. Yeni tanımladığımız tipe (hafta) ait değerler if yapısıyla teker teker değerlendirmeye alınmış olup. Bu tip çözümler size daha anlaşılır bir yapı sağlayacaktır.

Şimdi aşağıdaki gibi seçilen option buttonu sayesinde. Artık programınızı çalıştırıp sonuçları görüntüleyebilirsiniz. gün değerini yeni tanımladığımız tip değişkenimize aktaracak aşağıdaki kodları da programınıza ekleyiniz. sonra da daha önce tanımladığımız procedure’ün işletildiğine dikkat ediniz. Tetikleyicilerde önce değerin atandığına. 44 .

Bu tip içerisinde elemanlar arası geçiş işlemlerini “inc” (bir sonraki) ve “Dec” (bir önceki) komutlarıyla kolayca gerçekleştirebilirsiniz. aşağıdaki kod satırlarını da belirtilen yordama yazın. Procedure ün kodunu aşağıdaki şekilde değiştirirseniz. bu seferde bir önceki eleman değerine ulaşabilirsiniz. Programınıza yeni bir button ekleyerek. 45 . İlk elemana ulaştıktan sonra tekrar tıklarsanız 255 değerini yazacaktır. Programı çalıştırıp buttona tıklarsanız formun başlığındaki değerin devamlı arttığını göreceksiniz.

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

İ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. Type Ad:Set of char. ardından tanımlanan tipe ait belirtilen aralıkta olup olmadığı kontrol edilmektedir. 47 . //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.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. basılan karakterin bu aralıklardan bir tanesine ait olup olmadığını kontrol edeceğiz. Key:=#0. satırı ise basılan tuşun iptali için kullanılmaktadır. Burada basılan her tuş (KeyPress Event ına yazıldığı için) Key parametresine aktarılmakta. Şimdi örneği biraz daha değiştirip sadece büyük ve küçük harflere izin verebilecek olan bir program yapalım. Aşağıdaki uygulama için formunuzun üzerine sadece bir adet EditBox kontrolü eklemeniz yeterli olacaktır. Daha sonra.

Bu Kod yüzünden silme işlemini yapan (BackSpace) tuşu kullanılamayacaktır. 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. 48 . Eğer bu tuşu da kullanmak isterseniz.Kodu inceleyecek olursanız. ilk olarak büyük harf aralığını gösteren değişkenimiz. kodu aşağıdaki şekilde değiştirmelisiniz. Artık uygulamanızda BackSpace tuşunu kullanarak yanlış yazılan karakterleri silebilirsiniz.

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

gun := 1. //Doğduğu ayı gir Record1. with birey1 do begin yil := 1973. gun: 1..yil := 1973.Temmuz. tek bir kerede hepsinin birey1 in özelliğinin olduğunu with – do deyimiyle kolaylıkla belirtebilmekteyiz..• Record Types Kayıt işlemleri mantığıyla kullanılabilen ve programcı tarafından tanımlanabilen bir tiptir. //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... Kasim. . gun := 1. Aşağıda bu husus örneklendirilmiştir. //Tanımlanan tipe üye değişken tanımlanıyor..Haziran.31. //Doğum yılını gir Record1. //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. ay := Mayis. type birey = record yil: Integer.Mayis. 50 . ay:(Ocak. end. 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). var birey1: birey.Şubat.Agustos.Nisan. end.Eylul. Aralik). Record1.” yazmak yerine. Programın içerisinden de aşağıdaki şekilde değer ataması yapabilirsiniz.Mart.Ekim.ay := Mayis.

51 .Record tip tanımlamasının daha iyi anlaşılabilmesi için aşağıdaki örnek pencereyi dikkatlice inceleyiniz. 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.” karakterine basarak listeletebilirsiniz. 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 “.

Dizi Değişkenler: Tüm dillerde olduğu gibi. 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. // Bu şekildede dizi değişken tanımlanabilir. tanımlandığı anda boyutunun belirlenmesi şeklinde tanımlanabilir. Sabit ve değişken uzunluklu olmak üzere iki çeşit dizi mevcuttur. Belirtilen bu boyut programın içerisinden kesinlikle değiştirilemez. var dizi:Array[0. 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. Şimdi bu dizi çeşitlerini detaylıca inceleyelim. • Sabit Uzunluklu Dizi Değişken Tanımlamak: Sabit uzunluklu dizi değişken. 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). var dizi:diziler.10] of Real. // 11 elemanlı dizi değişken tanımlandı veya type diziler = array[1. 52 .10] of Integer... Aşağıdaki şekillerde sabit uzunluklu dizi değişken tanımlayabilirsiniz.

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

54 .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. Artık procedure içerisinde dizi değişkeninizin istediğiniz elemanına değer ataması yapabilirsiniz. Dizi değişkenleri const ile tanımlarsanız. Aksi takdirde Delphi sizlere hata mesajı iletecektir. Yapacağınız yeni atamaların procedure ün bir sonraki işletilmesi sırasında kullanılabileceği meydandadır. 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. mutlak “const” bildirisiyle tanımlanmış olmalıdırlar. procedure içerisinde değerini değiştirmek için aşağıdaki ek kod satırını ilave etmelisiniz.

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. 55 . Henüz for döngüsünü anlatmadık ama sanıyorum bir çoğunuzun bu hususta bir fikri olacaktır. satır ve sütun numaraları kullanılarak kesişimleri bir hücre değerini gösterecek şekilde tasarlanmışlardır. Sabit Uzunluklu İki Boyutlu Dizi Tanımlamak: Özellikle matris işlemleri ve tablo oluşturmak için en çok bilinmesi gereken yapıdır. Size de bu tür yapı tanımlarını kullanmanızı önemle tavsiye ediyoruz. Kodun ne kadar anlaşılır ve teknik olduğu hemen dikkatinizi çekecektir.Şimdide aşağıdaki örneği incelemenizi istiyorum. hem de çok detaylı olarak değinilecektir). Bu hususa veri tabanı kısmında detaylı. Tablolar. 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. Aşağıda iki boyutlu bir dizinin nasıl tanımlanabileceği gösterilmektedir. Yeni tip tanımlamanın kodun anlaşılabilirliğini ne kadar artırdığını sanıyorum fark ettiniz.

2] of Array[0.2] (3 eleman). Daha sonra bu yeni tipten “cok_dizi” isminde çok boyutlu bir dizi değişken türetildi. //Yeni tip tanımlandı ...0] ikib_dizi[0.0] ikib_dizi[1.1] (2 eleman) belirtilmiştir. Bu diziyi aşağıdaki şekilde de tanımlayabilirdiniz.0] ikib_dizi[2. var cok_dizi:i_dizi.1] of Integer.2] of Array[0..1] of Integer. Şu halde bellekte aşağıdaki gibi 6 eleman otomatik olarak oluşacaktır. 56 . Tanımlamaya dikkat edecek olursanız ilk boyut için [0..1] ikib_dizi[2.. ikib_dizi[0... Aşağıda bu husus örneklendirilmiştir.var ikib_dizi:Array[0..1] ikib_dizi[1.. ikinci boyut içinde [0.1] Bu elemanlardan istediğinize değer ataması yapabilirsiniz. Artık procedure içerisinde istediğiniz bölümde bu dizi değişkenin elemanlarına değer atayabilirsiniz. //iki boyutlu dizi tanımlandı Yukarıdaki satırda gerçekleşen işlem aşağıda şematize edilmeye çalışılmıştır. type i_dizi=Array[0.. // 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ı..

2] of Array[0.2] of Array[0.1] u_dizi[1. Yukarıdaki kod satırıyla 3 boyutlu.0] u_dizi[1..1] Tanımlamayı aşağıdaki şekilde de yapabilirsiniz..0] u_dizi[2.0.0] u_dizi[2.0] u_dizi[0.1.2.2..1.1.0.1] u_dizi[0..2. .0.1. u_dizi[0.Bir çok uygulamada karşılaşacağınız en büyük dizi boyutu iki (2) olacaktır.0.0] u_dizi[1. Aşağıdaki şekilde kolayca üç boyutlu dizi değişken tanımlayabilirsiniz. var dizi:boyutdizi..1] u_dizi[1..0.2.0] u_dizi[2.2..2] of Array[0.2] of Array[0.0] u_dizi[0..1] u_dizi[2..1] of Integer.1] of Integer.1. var u_dizi:Array[0. Bu elemanlardan dilediğinize aşağıdaki şekilde değer ataması yapabilirsiniz. ama biz yine de daha yüksek boyutta dizi değişkenleri nasıl tanımlayabileceğinizi gösterelim. 18 elemanlı bir dizi değişken tanımlanmıştır.1] u_dizi[1.0. //Dizi değişken tanımlandı 57 .0] u_dizi[0.1] u_dizi[0.2..1] u_dizi[2.0] u_dizi[1. type boyutdizi=Array[0.1.1] u_dizi[2.

karnelerini basabilecek bir program olsun. Öğrencilerin notlarıyla (ve diğer konularla da) ilgili işlemleri yapabilecek. var dinamikdizi:Array of Integer. Bu işleme. Benim size tavsiyem her zaman tip tanımlaması yaparak kullanmanız (ikinci kez tanımlamanız gerekirse daha kolay olacaktır). 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. 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. 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). //Dizi değişken tanımlandı 58 . İş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. Değişken Uzunluklu (Dinamik) Dizi Değişken Tanımlamak: Okulunuza bir program yazdığınızı düşünün. Dinamik dizi değişken tanımlama adını veriyoruz.Çok boyutlu dizi değişken tanımlarken yukarıdaki yöntemlerden dilediğinizi seçebilirsiniz. Herhalikarda sonuçlar aynı olacaktır. Düşünülebilecek en güzel çözüm en fazla öğrencisi olan sınıfa göre eleman tanımlamak olacaktır. Uygulamanızda şöyle bir problemle karşılaşırsınız.

//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. // 0-9 on elemanlı dizi değişken SetLength komutunu kullanarak dizinize boyut değerini verebilirsiniz. Bu şekilde tanımlanan bir dizi değişken Delphi tarafından Dinamik dizi olarak kullanılacaktır. SetLength(yeni_dizi. . Programın içerisinden belirleyebilirsiniz. 59 .10). //Tanımlana tipten dinamik dizi değişkeni türetildi. dizi değişkenin boyutunu aşağıdaki şekilde SetLength(dinamikdizi. type din_dizi=Array of Integer.Dikkat ettiyseniz sabit uzunluklu dizi değişkenden tek farkı dizinin eleman sayısının belirtilmemesidir.10). Aşağıdaki örneği dikkatlice inceleyiniz. Dilerseniz dinamik dizinizi aşağıdaki şekilde de tanımlayabilirsiniz. Aşağıdaki basit örneği inceleyiniz..// 10 elemanlı olarak dinamik dizi boyutlandırıldı...

Çalışma anında hata mesajıyla karşılaşırsınız).İzleyeceğiniz yol tamamen size kalmıştır. 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. Şimdi sizlere iki ve daha fazla boyutlu dinamik dizileri nasıl tanımlayıp kullanabileceğinizi göstereceğim. SetLength(dizi.5. //İ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. 60 . // 15 elemanlı oldu Burada dikkat edeceğiniz husus ilk elemanın dizi[0. Artık istediğiniz elemana değer atayabilirsiniz. var dizi:Array of Array of Integer.2] olduğudur (Burada üst sınırlar kullanılamamaktadır. Aşağıdaki şekilde iki boyutlu dinamik bir dizi değişken tanımlayabilirsiniz.3). Aşağıdaki örneği dikkatlice inceleyiniz.0] son elemanında dizi[4. Hızlı işlem yapmalarının bir sebebi de budur). Çok Boyutlu Dinamik Dizi Tanımlamak: Yukarıda tanımlanan dinamik diziler tek boyutlu olarak belirlenmiştir.

5.2] ye kadar 15 eleman için bellekte boş yer ayrılacaktır. satırı sayesinde dizi[0.// 0 yazacaktır. Bu tip dinamik diziler (Tam sayı tiptekiler) oluşturuldukları anda ilk değer olarak “0” alırlar. İzleyeceğiniz yol tamamen size kalmıştır.Caption:=IntToStr(dizi[3.0]). Yukarıdaki uygulama için Form3. Bu kod penceresinde kullanılan SetLength(dizi.0] dan dizi[4.Aynı işlemi aşağıdaki şekilde de yaptırabilirsiniz.3). 61 .

gazete vs) duydukları hikayeleri sizlere yutturmaya çalışan şahıslardan ibaret olacaktır. 62 . Sizde anlatılan hikayelerden ziyade (Emin olun karşılıklı konuşacağınız bir çok konu başlıkçısı olacaktır.Dinamik Dizileri Yeniden Boyutlandırmak: Delphi’de boyutlandırmış olduğunuz dinamik diziyi yeniden boyutlandırırsanız. Her zaman söylerim. eski dizi elemanları değerlerini aynen koruyacaktır (Tabii ki elemanın numarasından daha küçük bir boyut vermezseniz). 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. Bu durumlarda. genellikle kodlardan haberleri olmayıp öteden beriden (dergi. Bir çok projede Dizi işlemlerini Dinamik dizilerle çözmek zorunda kalacaksınız. 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. İki kere boyutlandırılan dizi değişken önceki boyutlandırmadan sonra atanan değerini. Bu yüzden bu kısmı çok iyi öğrenmelisiniz. dizilerle döngüleri çok iyi kullanabilen programcıların geleceğinin parlak olacağından eminim. Yukarıdaki örnekte de bu tema işlenmiştir. Bu konu başlıkçıları. Aşağıda bu husus örneklendirilmiştir.) yeniden boyutlandırma gereği duyabilirsiniz. Delphide daha önceden değer alan değişkenler değerlerini aynen saklı tutacaktır. 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).

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

64 .

Zaten ilerleyen kısımlarda hepsini bolca kullanma imkanı bulacağız. • Matematiksel Operatörler: Matematiksel işlemlerde kullanabileceğiniz operatörler tablo halinde verilmiştir.Delphi’de Kullanılan Operatörler: Bu kısımda sizlere. Delphi’de kullanabileceğiniz operatörleri gruplandırarak bilgi verelim. 65 . Operatör + * / Mod Div = > < >= <= <> := Görevi Toplama Fark Çarpım Bölme Mod Tam Bölüm Eşitlik Büyüktür Küçüktür Büyük Eşittir Küçük Eşittir Eşit Değil Atama Örnek 10+20 30-20 20*50 10/5 10 mod 3 10 div 3 if(ad=’Nihat’) then if(yas>50) then if(yas<50) then if(yas>=50) then if(yas<=50) then if(yas<>50) then Ad:=’Nihat’ Sanıyorum diğer operatörler için örnek yapmaya gerek yok.

formun başlığında hiç bir zaman metninizi yazdıramazsınız. karşılaştırma işlemlerinde kullanılır. Boolean tip bir değişken tanımlandığı anda varsayılan değeri false dır.) durumlar için aynı anda birden fazla şartı sağlama amaçlı kullanılmaktadır. Eğer yukarıdaki if satırında “not” komutu kullanılmazsa. o Not Dönen değerin olumsuzunu belirtmek için kullanılan Mantıksal operatördür (Eğer true dönerse false. 66 . o And Aynı anda iki sonucu beraber değerlendirebilmek amaçlı kullanılan bir operatördür. Genellikle karşılaştırma gerektiren (if . Burada şunu da hatırlatalım. Genellikle dallanma. Aşağıda bu operatörlerden bahsedilmektedir. Genellikle karşılaştırma gerektiren (if – case) durumlar için şartlardan herhangi bir tanesinin sağlanmasının yeterli olduğu durumlar için kullanılır. False dönerse true). Aşağıda hem “and” hem de “or” için örneklendirme yapılmıştır.Case vs. o Or Belirtilen sonuçlardan herhangi bir tanesinin doğruluğunun yeterli olduğu durumlarda kullanılan bir operatördür.• Logical Operatörler: Mantıksal işlemlerinizde kullanabileceğiniz bir çok operatörü Delphi size sunmaktadır.

Dikkat edeceğiniz husus hem 50 den büyük. Şimdi de diğer operatörümüz olan “Or” seçeneğini örneklendirelim. Procedure içerisinde notlar isimli değişkenin değeri “100” den büyük olduğu için ikinci şart sağlanmakta. Dikkat edeceğiniz husus. hem de 100 den küçük olma zorunluluğudur. belirtilen şartlardan bir tanesinin true değeri döndürmesinin (doğru olması) uyarının verilmesi için yeterli olacağıdır. Örneğimizde notlar isimli değişkenin değeri kontrol edilerek. Örnekte notun 50 ile 100 arasında olması şartı aranmaktadır. formun başlığında kullanıcıya iletilmektedir. dolayısıyla (şartlardan birisi true olduğu için) if satırı true değerini döndürmekte ve uyarı mesajını da formun başlığında kullanıcıya göstermektedir. şayet “0” dan küçük veya “100” den büyük olması durumunda gerekli olan uyarı.İlk Olarak “and” operatörünü örneklendirelim. 67 .

Örneğimiz için kullandığım kod aşağıda verilmiştir. “7” Sayısının ikilik düzende karşılığı (devamlı bölüm değerini 2 ye bölün) alt satırda verilmiştir. Bellekte iki bayt (16 bit) yer tutan bir değişkene nasıl atama yapılabileceğini göstereceğim. 1 Artık bu ikisini kolaylıkla toplayacaktır. Yukarıdaki şekil x değişkenine ayrılan 16 bitlik yeri göstermektedir. Atama işleminin anlaşılması için ikilik düzendeki (Bilgisayar tüm işlemleri ikilik düzende gerçekleştirir. Fakat Delphi kendi fonksiyonlarını kullanarak daha hızlı atamalarda yapabilmektedir. 1 1 1 Aynı şekilde “5” sayısının ikilik düzendeki karşılığı da aşağıdaki satırda size verilmektedir.) aşağıdaki örnekleri dikkatlice inceleyiniz.Delphi’de Diğer Atama İşlemleri: Delphi’de atama işlemleri “:=” operatörüyle yapılabilmektedir. Bu hususu sanıyorum şu ana kadar yaptığımız örneklerden anlamışsınızdır. için iki sayıyı da ikilik düzene çevirip ondan sonra toplama işlemini yapmaktadır. Burada Delphi’nin ilk yaptığı iş “x” değişkenine bellekte 16 bitlik (her 0 veya 1 bir bit demektir) yer ayırmaktır (içerisinde de rastgele 0 – 1 ler bulunur). 68 0 1 . Daha sonra bu değişkene aktarılmak istenen “7+5” değeri.

ama bu yöntem gerçekten son derece kolaydır. 69 . Hiç bir matematiksel değerin bir fazlası kendisine eşit olamaz). end. Zaten böyle bir veritabanı oluşturmak her babayiğidin harcı olmayacaktır) sonucu kısa süre içerisinde verebilmektedir. //Sonuç x 11 oldu. x:=x+1. procedure TForm1. atama olduklarını tekrar hatırlatırım. • x:=a+b Ataması: “a” değişkeni ile “b” değişkeninin matematiksel değerleri toplanıp “x” değişkenine aktarılmaktadır. • x:=x+1 Ataması: Bu atama yöntemiyle “x” değişkeninin bir fazlası tekrar “x” değişkenine aktarılmaktadır (Burada eşitlik söz konusu değildir. Burada yapılan işlemlerin eşitlik değil. begin x:=20+70.Button6Click(Sender: TObject). begin x:=10. Kullandığınız hesap makineleri de sonuçları hep bu mantıkla hesaplamakta (Yoksa bütün çarpım sonuçları hafızada tutulmamaktadır. end. var x:Integer.1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 + 1 = 0 “7+5=13” satırını Delphi size yukarıdaki şekilde hesaplayabilmektedir. var x:Integer. procedure TForm1. İlk etapta size biraz karışık gelebilir.Button6Click(Sender: TObject). //Sonuç x 90 oldu.

Button6Click(Sender: TObject).Caption:=IntToStr(inc(x)). var x:Integer.Button6Click(Sender: TObject). inc(x).5) Ataması: x:=x+5. //inc(x).//Sonuç x 15 oldu. inc(x. var x:Integer. end. // Delphi bu atamaya izin vermez end. begin x:=10 . begin x:=10 . var x:Integer. //11 yazar. //Sonuç x değişkeninin değerini bir artır.Button6Click(Sender: TObject). procedure TForm1.Caption:=IntToStr(x). Form1.//Sonuç x 11 oldu. “x” değişkeninin değerini bir artırarak tekrar “x” değişkenine aktarır. procedure TForm1. Inc(x. Form1. • Inc(x. 70 . begin x:=10 . Form1.5).Caption:=IntToStr(x). Aşağıdaki şekilde bir kullanıma Delphi izin vermeyecektir.• Inc(x) Ataması: x:=x+1.5). satırında “5” in yerine herhangi bir değişkenin ismini de kullanabilirsiniz. “x” değişkeninin değerini beş (5) artırarak tekrar “x” değişkenine aktarır. procedure TForm1. //15 yazar end.

//9 yazar.Button6Click(Sender: TObject). end. Form1.Button6Click(Sender: TObject). procedure TForm1. “x” değişkeninin değerini “5” azaltarak tekrar “x” değişkenine atar.Caption:=IntToStr(x).Caption:=IntToStr(x). inc(x. değişken değeri kullanılarak da fonksiyon işlevini • Dec(x) Ataması: x:=x-1.Button6Click(Sender: TObject).//Sonuç x 25 oldu. “x” değişkeninin değerini bir azaltarak tekrar “x” değişkenine aktarır. begin x:=10 . Dec(x.//Sonuç x 5 oldu. • Dec(x. begin x:=10 . begin x:=10 . var x:Integer. procedure TForm1.deger). Görüldüğü gibi yapabilmektedir. Form1. Dec(x).5) Ataması: x:=x-5. var x:Integer. //5 yazar end. //25 yazar end.5). //Sonuç x değişkeninin değerini bir azalt. var x:Integer. const deger:Integer=15. Form1.Caption:=IntToStr(x). 71 .procedure TForm1.

Dilerseniz Dec(x,degisken) şeklinde de kullanabilirsiniz. Aşağıda bu husus örneklendirilmiştir. procedure TForm1.Button6Click(Sender: TObject); const deger:Integer=15; var x:Integer; begin x:=10 ; Dec(x,deger); //Sonuç x -5 oldu. Form1.Caption:=IntToStr(x); //-5 yazar end; Inc() ve Dec() fonksiyonuyla yapacağınız atamaların daha hızlı çalışacaklarını belirtip bu konuyu burada kapatmayı uygun gördüm.

72

BÖLÜM 4 DELPHI’DE DALLANMA & DÖNGÜ KOMUTLARI

73

74

IF Yapısının Delphi’de Kullanım Şekilleri: Programlarınızda oluşabilecek olan farklı dallanmaları çözüme kavuşturabilmeniz için kullanabileceğiniz en güvenli yol sanıyorum bu yapıdır. Bütün dillerde olduğu gibi Delphi komutları içerisinde de if yapısı gerçekten yeri doldurulamaz bir öneme sahiptir. Kullanımında herhangi bir zorluk sözkonusu değildir, fakat uygulamaları çok dikkatlice takip etmenizi tavsiye ederim. • Basit Anlamda if Yapısı: Şimdi sizlere if yapısının en basit kullanım şekillerinden bahsedeceğim. Buradaki kullanım sadece tek alternatifli durumlar için geçerlidir. İf şart then // Tek satırdan oluşan kod Bu yapıya ait örneklendirme aşağıda verilmiştir.

Şartın doğru olması durumunda işletilecek olan satır sayısı birden fazla ise bu durumda aşağıdaki yapıyı kullanmalısınız. İf şart then begin // Şart doğru olduğu zaman işleyecek kod //ikinci satır end;

75

Şart doğru olduğu zaman işleyecek olan kod satırları birden fazla olduğu için, bu satırlar begin-end bloğu içerisinde yazılmalıdır. Hatırlatalım tek satırlı kodlarıda begin-end bloğu içerisinde yazabilirsiniz.

Yukarıdaki if yapısında “begin-end” bloğu kullanmazsanız (hata vermez) “ad” ın “Prestige Education Center” dışındaki bir metne eşit olması durumunda bile “Doğru Eğitim Kurumundasınız” uyarısını her zaman alırsınız. • if – else Yapısı: Bu yapı alternatiflerin birden fazla olması durumunda kullanılması gereken bir kod bloğudur. Aşağıda bu husus örneklendirilmiştir. If şart then //Tek satır kod buraya yazılacak else //Tek satır kod buraya yazılacak. Burada şartın doğru olması durumunda işletilecek olan kod tek satırdan oluşuyorsa “begin – end” bloğu kullanmaya gerek yoktur. Fakat bu durumda if ile else arasına yazılmış olan satırın sonuna “;” konulmaz. Buradaki satırın sonunda “;” konulursa muhakkak “begin-end” bloğu içerisine alınmalıdır. Aşağıda bu hususların hepsine ait örneklendirmeler yapılmıştır. Dikkatlice inceleyiniz.

76

Yukarıdaki kodu aşağıdaki şekilde de yazabilirsiniz. Her ikiside aynı sonucu verecektir.

Uzmanlaşmadan önce yazacağınız kodları (if için) muhakkak “begin-end” bloğu içerisinde yazmaya gayret edin. Bu şekilde bir hareket, hata yapma şansınızı minimuma indirecektir. Daha sonra Delphi’ye hakim olursanız o zaman dilediğiniz şekilde kodlama yapabilirsiniz. Kodları Editor’ünüze yazarken de biraz dikkatli olursanız, daha sonra kodu incelerken sizin için çok büyük kolaylık sağlayacaktır.

77

Eğer if – else arasına yazılacak olan kod satırları birden fazla ise bu durumda “begin – end” bloğu kullanmak sizin için zorunlu olacaktır. if şart then begin //kod satırları //Kod satırları end //Burada “;” olmayacak else begin //kod satırları //kod satırları end; //Burada “;” olacak Aşağıda bu husus örneklendirilmiştir.

Buradaki “else” ifadesi, if’te belirtilen koşul dışındaki tüm durumlar için kullanılabilecek bir bloktur. Yani if’te belirtilen şart (Bu örnek için notun 50 den büyük olmasıdır) sağlanamadığı anda işleyecek olan kodlar else bloğu içerisinde yazılmalıdır. Bazı durumlarda, kalan tüm şartları ifade etmek mümkün olamayabilir (veya çok fazla irdeleme yapmak gerekebilir), bu durumlarda geriye kalan tüm şartları kastetmek için de else bloğu çok uygun olacaktır.

78

• If – else if – else Yapısı: Alternatiflerin ikiden fazla olması durumunda kullanılabilecek olan bir yapıdır. Alternatif durumuna göre “else if” blokları çoğaltılabilir. Tüm “else if” blokları için yeni bir şart belirtmek zorunludur. Eğer tüm şartları ifade edebildiyseniz (bir çok durumda edemeyeceksiniz) “else” kullanma zorunluluğunuz yoktur. Aşağıda bu husus örneklendirilmiştir. Dikkatlice inceleyiniz.

Koda dikkat edecek olursanız, personelin ikamet ettiği şehir kontrol ettirilmekte ona görede gerekli kod satırları işletilebilmektedir. Burada hem “if” in hem de “else if” lerden birtanesinin beraber işletilme şansı yoktur. Belirtilen bloklardan sadece bir tanesi işletilecektir. Yukarıdaki örneği dört farklı “if” yapısı kullanarak da çözebilirdiniz. Fakat siz birbiriyle alternatifli olan bu tür kodları “if-else if” bloğuyla çözün, hız kazanacaksınız. Sebebi çok basittir, şartlardan herhangi bir tanesi gerçekleştiği anda Delphi “if” in bitiş noktasını arayacak haliyle de diğer “else if” ler kontrol edilmeyecektir.

79

Tek Satırda Birden Fazla Şartı Kontrol Etmek (And & Or): Bir çok durumda tek satırda birden fazla şartı kontrol ettirebilirsiniz. Bu size kod satırlarınızın kısalmasını sağlayacaktır. Aşağıdaki örnekleri birbirleriyle kıyaslayınız.

Bu örnekte notun “0” dan küçük veya “100” den büyük olması aynı kodun işletilmesini sağladığı için bu iki şartı tek satırda kontrol edebiliriz.

“And” işleminde o satırdaki tüm şartların sağlanması gerekmektedir. 80

Şimdi de aynı problemi “Or” operatörünü kullanarak çözelim.

“Or” yapılan çözümde koşulların yerleri önem arz etmektedir. Yani “if” teki şartları “else if” e, “else if” teki şartları da “if” e alırsanız sonuçlarınızın bir çoğu yanlış olacaktır. Mesela “(notu<0) or (notu>100)” satırı ile “notu<50” satırlarını yer değiştirirseniz, “0” dan küçük olan sayılar zaten “50” den küçük olacağı için “else if” i işletme şansınız olmayacaktır (Aralık kesişmesi vardır). “And” için böyle bir durum söz konusu değildir, satırların yerlerini değiştirseniz bile sonuç değişmeyecektir (Çünkü aralık kesişmesi yoktur). Bu bölümde if yapısının detaylarını sizlere aktarmaya çalıştım. Bir yazılım dilinin en çok başvurduğu yapı sanıyorum budur. Bu yüzden hiç bir pürüz kalmadan kullanılabilecek tüm şekillerine adapte olmalısınız. Ne kadar karmaşık olursa olsun sorunun çözümünü yukarıdaki şekillerden bir tanesiyle gerçekleştireceksiniz. Bazı durumlarda if içerisinde başka bir if daha (belki onun içinde başka bir if yapısı daha vs.) olabilir. Bu tip durumlarda bloklara dikkat ederseniz hiç bir sorun yaşamazsınız. Şimdi sizlere if yapısı ile ilgili güzel bir örnek çözeceğim. Örneğimiz hala okullarımızda uygulanan sınıf geçme notuyla ilgili olacak. Formunuzun üzerine 4 adet EditBox, iki adette label yerleştirerek aşağıdaki tasarımı oluşturunuz. Geçme notu vizelerin %30 u ile final notunun %70 i toplanarak bulunacaktır.

81

Aşağıdaki tasarımı oluşturunuz.

Aşağıdaki kodları da projenizin gerekli yordamlarına ekleyiniz.

Yukarıdaki kod sayesinde ikinci GroupBox ta yer alan bütünlemeyle ilgili nesnelerin gözükmemesi sağlanmaktadır. Şimdi de girilen notları değerlendirecek olan Event’ları oluşturalım. Kodun yazıldığı event’lar Edit3 (Final notu) ile Edit4 (Bütünleme notu) ün Keypress leri olacaktır. “Keypress” yordamı klavyeden herhangi bir tuşa basılması durumunda otomatik olarak işleyen bir yordamdır. Bu yüzden her tuşa basılması bizim kodumuzu işletmesin diye Enter tuşu için (“Key=#13”) kontrol konulmuştur. Artık kodumuz sadece Enter tuşuna basıldığı zaman işleyecek, diğer tuşlar hesaplatma işlemini gerçekleştiremeyecektir. “Keypress” yordamı hakkında detaylı bilgileri Event’lar kısmında bulabilirsiniz. Şimdilik sadece Cursor o kontrolde iken klavyeden bir tuşa basılması durumunda işletileceğini bilin yeter. Artık aşağıda verilen kodlarıda projenize ekleyebilirsiniz. Kodların Edit3 ve Edit4 kontrolünün Keypress ine yazıldıklarını tekrar hatırlatalım. 82

Bu yordama yazılan kod sadece Final de geçen öğrencilerle ilgilidir. Girilen vize notlarının ortalamasının %30 u ile Final notunun %70 i toplanarak, bulunacak değerin “50” den büyük veya küçük olduğuna bakılacaktır. Eğer ortalama değeri 50 nin üzerinde ise öğrencinin başarılı olduğuna dair uyarı 4 numaralı etikette kullanıcıya bildirilecektir. Aksi takdirde öğrencinin finalde başarılı olamadığı uyarısı yine aynı etikette öğretmenine iletilecektir. Şayet öğrenci bütünlemeye kaldı ise; bu aşamadan sonra bütünlemeyle ilgili bilgiler gözükecektir. Bütünleme notu girildikten sonra, Enter tuşuna basınca aşağıdaki (Edit4 ün KeyPress yordamı) yordamın kodu işleyip bulunacak, yeni ortalamaya göre sınıfta kalıp kalmadığı belli olacaktır.

83

Bu tür bir programda if yapısı gerçekten programcının eli kolu gibidir. If yapısının anlaşılabilmesi için güzel bir örnek (Daha da güzelleştirilebilir. Onuda siz yapın) olduğunu düşünüyorum . Bir programın algoritmasını doğru bir şekilde tasarlarsanız, projeyi yazarken size çok büyük bir kolaylık sağlayacaktır. Baştan savma olarak bir işe asla soyunmayınız. Tüm olasılıkları düşünüp, hesaplayıp, alternatifler türettikten sonra uygulamaya girişiniz. En önemlisi de ustalarınızın tavsiyelerine muhakkak uyun. Aksi takdirde bir projeyi birkaç kere tekrar yapmak zorunda kalabilirsiniz. Bu da sizde hayal kırıklığı yaratacaktır.

84

Is Operatörü Kullanarak Karşılaştırma Yapmak: Nesneleri (Kontroller, classlar, type vs.) “=” operatörüyle kıyaslayamazsınız. Uygulamanızda bu tür kıyaslar yer alacaksa “Is” operatörünü kullanmalısınız. Aşağıda “Is” operatörörünün kullanımına ait yapı verilmiştir. if ActiveControl is TEdit then begin //Kodlar buraya yazılacak. end; Şimdi konuyu daha iyi anlayabilmeniz için aşağıdaki örnek uygulamayı yapalım. Örneğimiz için form tasarımı aşağıda verilmiştir.

Gerekli olan kodda aşağıda verilmiştir. Programı çalıştırdıktan sonra kontrolü alan Edit in içeriğinin silindiğini göreceksiniz. procedure TForm3.Edit1Enter(Sender: TObject); begin if ActiveControl is TEdit then //Aktif kontrol Editse TEdit(ActiveControl).Clear; //Aktif kontrolü temizle end; //Kontrolü kaybedince işler procedure TForm3.Edit2Enter(Sender: TObject); begin if ActiveControl is TEdit then TEdit(ActiveControl).Clear; //Aktif kontrolü temizle end;

85

Case Yapısının Delphi’de Kullanım Şekilleri: Bir çok durumda dallanma işlemlerinizi “if” ile gerçekleştireceksiniz. Fakat kodunuzun daha kolay anlaşılabilirliği (veya yazılması) açısından bazı durumlarda “case” yapısını kullanmanız uygun olacaktır. Şunu hiç bir zaman unutmayın “case” yapısı ile gerçekleştireceğiniz tüm kodları if yapısıyla yazabilirsiniz, ama tersi mümkün değildir. Yani if yapısıyla oluşturacağınız kodları “case” ile yazamayabilirsiniz. Aşağıda “case” yapısının kullanım şekilleri gösterilmiştir. case sayi of 1:ShowMessage('Girdiğiniz Sayı 1 dir'); 2:ShowMessage('Girdiğiniz Sayı 2 dir'); 3:ShowMessage('Girdiğiniz Sayı 3 dür'); 4:ShowMessage('Girdiğiniz Sayı 4 dür'); 5:ShowMessage('Girdiğiniz Sayı 5 dir'); else ShowMessage('Girdiğiniz Sayı Yanlış dır'); end;

“Case” yapısının davranışı şöyledir. Alternatifli değişkenin değerleri teker teker irdelenerek gerekli kodların işletilmesi sağlanır. 86

“Case” yapısıyla aralık kontrolü de yaptırabilirsiniz. Aşağıdaki örnekte bu husus incelenmiştir.

Şimdi başka bir örnek verelim.

Bu örnekte basılan tuşun asci değeri kontrol edilerek, aralığı belirlenmektedir. Ardından büyük harf aralığına uyuyorsa “Büyük Harfe Bastın” mesajı, küçük harf aralığına uyuyorsa “Küçük Harfe Bastın” mesajı, rakam aralığına uyuyorsa da “Rakam Tuşladınız” uyarısı kullanıcıya iletilmektedir. 87

Şimdide EditBox içerisine rakam girişi dışında değer girilmesini engelleyecek kodu “case” yapısıyla yazalım.

Aşağıdaki şekilde yazacağınız bir kodla da sadece büyük ve küçük harfleri yazdırabilen bir EditBox oluşturabilirsiniz.

“case” yapısı, string veriler için Delphi’de kullanılamamaktadır. Eğer dallanmaya uğrayacak değişkeniniz string veri içeriyorsa o zaman sorununuzu “if” yapısıyla çözmeyi deneyiniz. Hemen bir sürpriz daha yapalım, “case” yapısı ondalıklı sayılar içinde kullanılamaz.

88

Döngüler: Dögüler yazılım dilleri içerisinde çok önemli yer tutan komutlardır. Arka arkaya bir çok kez işletilmesi gereken kodların bulunduğu durumlarda, veya belirlediğiniz şartın gerçekleşmesine kadar, döngüler baş vurulması gereken tek seçenektir. Bilhassa dizilerle beraber kullanılabildikleri zaman güçleri korkunç derecede artabilmektedir. Bu yüzden üzerinde çokça zaman harcamalı, konuyu tam anlamıyla kavrayabilmelisiniz. Bu bölümde Delphi’de kullanılabilen tüm döngüler basitten, en karmaşığına doğru incelenecek ve detaylı örnekler verilecektir. • For Döngüsü: İlk olarak döngü sayaç sayının belli olduğu “for” döngüsünü inceleyeceğim. Bu döngü sayesinde, döngü bloğu içerisine yazacağınız kodları arka arkaya istediğiniz kadar işletebilirsiniz. Döngünün bilinen bir diğer özelliği de blok içerisindeki kodların en az bir kere işletileceğidir (Aslında tam olarak öyle değildir. Mesela başlangıç değerini bitiş değerinden büyük verirseniz, döngü içerisindeki kodlar hiç işlemeden döngü sona erecektir. Fakat diğer döngülerin bu tip durumlarda kullanılması daha uygun olacaktır). Aşağıda yapı verilmiştir. Dikkatlice inceleyiniz. for i:=baslangic to bitis do //Tek Satırlık Kod Buraya yazılacak; Hemen bu yapıyı örneklendirelim.

Şayet “for” bloğu içerisinde birden fazla satır kod işletilecekse, o zaman ayrıca “begin-end” bloğu kullanmalısınız. 89

For i:=baslangic to bitis do Begin //İşleyecek olan kod satırları //İşleyecek olan kod satırları end; Tek satır işleteceğiniz zamanlarda “begin-end” bloğu kullanırsanız yanlış olmayacaktır. İyice alışana kadar “begin-end” bloklarını tek satırlı durumlar içinde kullanmanızı öneririm (Alıştıktan sonra tek satırlı durumlar için bu bloğu kullanmayabilirsiniz). Şimdi bu döngü ile ilgili basitten zora doğru örneklendirmeler yapalım. Örnekler için formunuzun üzerine tetikleme amaçlı bir button yerleştirmeniz yeterli olacaktır (Zaten kodlamadan formun üzerine eklenen kontroller hakkında bir fikriniz olacaktır). Aşağıdaki örnekte “for” döngüsüyle “0-20” arasındaki sayıların toplamı hesaplanmaktadır.

Delphi’nin önceki versiyonlarında toplam değişkenine ilk değer olarak “0” atamak gerekiyordu, fakat burada buna ihtiyaç yoktur (Değer atanmadan işleme tabi tutulursa varsayılan değerini 0 yapmaktadır). Eğer ara değerleri de görmek isterseniz yukarıdaki iki satırı “begin-end” bloğu içerisinde yazdırmalısınız (Bilgisayar en fazla zamanı değerleri kontroller üzerinde göstermek için harcayacaktır. Bu yüzden gerekmediği sürece, asla böyle bir şey yapmayın. Performansınız korkunç derecede düşecektir). Biz örnek olması bağlamında bunu yapıyoruz. 90

“for” döngüsünde kullanılan sayaç değişkenini (bu örnekte “i”) muhakkak tam sayı tiplerinden bir tanesiyle tanımlamalısınız. Aksi takdirde Delphi size hata mesajı iletecek, programınızı çalıştırmayacaktır. Aynı örneği aşağıdaki şekilde de çözebilirdiniz.

Burada tekrar hatırlatalım, Form1.Caption:=FloatToStr(toplam); Satırını hız açısından “begin-end” bloğunun dışında tutmalısınız. Sayaç bitiş değerini artırırsanız, sonuç hesaplanmasının ne kadar gecikeceğini daha rahat izleyebilirsiniz. 91

Şimdi örneğimizi bir adım daha zorlaştırıp, “0” dan Edit kontrolüne girilecek olan değere kadar sayıları toplayacak bir proje yapalım.

Inc() fonksiyonunda kullanacağınız değişken tam sayı tipli olmalıdır. Aksi takdirde Delphi size işlemi yapamayacağına dair uyarı mesajı verecektir. Örneği bir adım daha zorlaştırarak, Edit’lere girilen değerler arasındaki sayıların toplamını hesaplatalım.

92

Bu örnekte Edit1 kontrolüne girilen değer, Edit2 kontrolüne girilen değerden daha büyükse döngü hiç çalışmayacak, başlıkta “0” değeri gözükecektir. Şimdi bu soruna da kontrol koyarak örneğimizi geliştirelim.

Programda kullanılan aşağıdaki blok, sayaç bitiş değerinin sayaç başlangıç değerinden küçük girilmesi durumunda, değişkenlerin yerlerini değiştirerek başlangıç değerinin bitiş değerinden her zaman küçük olmasını (Eşitte olabilir. Eşit olması durumunda döngü işletilecektir) sağlamaktadır. if ilk>son then //ilk sondan büyükse begin //yerlerini değiştir deger:=ilk; ilk:=son; son:=deger; end; Aynı şekilde “Inc(toplam,i);” satırı yerine, “toplam:=toplam+i;” de (Şayet toplamın reel sayı tanımlanma durumu varsa Inc() fonksiyonu zaten kullanılamaz) yazabilirsiniz. 93

Örneğimizi biraz daha zorlaştırarak girilen iki sayı arasındaki çift sayıları toplatan bir algoritma geliştirelim.

Bu örnekte eklenen kontrol, döngü içerisinde toplam değişkenine eklenecek olan sayının çift olup olmadığının kontrol edilmesi işlemidir. Şayet kontrol edilen sayaç değeri tek sayıysa ekleme işlemi yapılmamakta, çift sayıysa ekletilmektedir. Sonuç olarak da girilen iki sayı arasındaki değerlerin toplamı kolaylıkla hesaplatılabilmektedir. Bu soruyu “for” döngüsüyle çözmek iyi bir programcı için yanlış bir tercih olacaktır. Sebebi çok basittir, sonuç her zaman doğru çıkacaktır, fakat döngünün işletilme sayısı (Tek sayılar içinde sonuçta kontrol yapılmaktadır) iki kat fazla olacaktır. Bu yüzden bu tip problemleri, daha sonra gösterilecek olan diğer döngülerle çözünüz.

94

Delphi’de “for” döngüsü içerisinde sayaç değerine step verilemektedir. Yani sayacın ikişer ikişer artması maalesef mümkün olamamaktadır. Şayet sayaç artım değeri “1” den fazla ise diğer döngüleri kullanınız. Ayrıca “for” döngüsü içerisinde sayaç değerini değiştirmenize Delphi izin vermeyecektir. for i:=ilk to son do begin if i mod 2=0 then //Çift sayıysa ekle Inc(toplam,i); Inc(i); //Burada hata verir sayaç değerine for içerisinde manuel müdahale //edilemez end; Şimdi sizlere Döngü ve Dizileri iç içe kullanabileceğiniz sıralama algoritmalarından bahsetmek istiyorum. Lütfen dikkatlice İnceleyiniz.

95

• Repeat Until Döngüsü: Bazı durumlarda döngünüzün kaç kere işleyeceğini tahmin edemeyebilirsiniz. Yani döngünüz bir şarta (veya birden çok) bağlı olarak işleyecektir. Dolayısıyla bu işlemi “for” döngüsüyle çözemeyeceksiniz. Döngünüzün çalışma sayısı bir şarta bağlı olacaksa çözüm yollarından bir tanesi “Repeat-Until” döngüsüdür. Belirteceğiniz şart sağlanmadığı sürece döngünüz işlemeye devam edecektir.

repeat //Döngü içerisinde işletilecek kodlar buraya yazılacak. Until ilk>son; //ş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

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

Yanlız burada ufak bir incelik var. Delphi “Application. Bu yüzden “exit” komutunu eklemezseniz. üç hakkında da bilemezse programın kapatılacağı bir hale dönüştürelim.Terminate” komutunu gördüğü zaman programı bitirir ama döngü tamamlandıktan sonra.Şimdi de uygulamamızı biraz daha geliştirerek. 98 .Terminate” komut satırı programı kapatmak için kullanılmaktadır.Terminate komutunu kullanırkan dikkat etmelisiniz). kullanıcının sadece üç kere şifre girebileceği. Döngü içerisinde kullanılan “Application. garip durumlarla karşılaşabilirsiniz (Döngü içerisinde Application.

• While Do Döngüsü: Bu döngü belirtilen şart gerçekleştiği sürece devamlı olarak işler. girişinde kontrol edilmesidir. Aşağıda girilen iki sayı arasındaki çift sayıların toplamı bu döngü kullanılarak çözülmüştür. while ilk<=son do begin //Kodlar Bu araya yazılacak end. şartın döngü çıkışında değil. Belirtilen şart sağlanmıyorsa bu bloğa yazacağınız kod hiç işlemeyebilir. 99 . Yine bloktaki kodlar bir satırdan fazla ise begin-end bloğu kullanmak zorunlu olacaktır. Aşağıdaki döngü için kullanacağınız yapı verilmiştir. Repeat – Until döngüsünden farkı. Belirtilen şart sağlandığı sürece döngü komutları işlemeye devam edecektir.

Tüm sıralama algoritmalarını aşağıdaki form için oluşturacağız. 100 .Şimdi de şifre sorma uygulamasını “While-Do” döngüsüyle gerçekleştirelim. • Sıralama Algoritmaları: Bir dizi elemanlarını sıralamanın bir çok çeşidi bulunmaktadır. Şimdi bu çeşitleri sizlere aktarmak istiyorum.

o Bubble Sort: En son elemandan başlayarak her eleman ikinci elemana kadar (İkinci elemanın index numarası 1 dir. Programı çalıştırdıktan sonra “BubbleSort” Buttonuna tıklarsanız ekran görüntünüz aşağıdaki şekilde (Elemanlar listBox2 de sıralanmış halde) oluşacaktır. 101 . ait oldukları sıralamaya ait kodları ekleyelim. Şarta uyan dizi elemanları yer değiştirilerek dizinin sıralanması sağlanmaktadır. i sayacı bu yüzden birden başlatılmıştır) bir önceki ile karşılaştırılarak gerçekleştirilebilmektedir.Şimdi formumuza yerleştirdiğimiz buttonlara.

tek yapmanız gereken değişiklik. son elemanının da en büyük olmasını sağlamaktır (Aradakiler de sıralı halde tabii ki). 102 .Items. en sondaki “for” döngüsüyle ilgili olacaktı.Burada yapılan işlem dizinin ilk elemanının en küçük.Add(IntToStr(dizi[i])). Küçükten büyüğe doğru bir listeleme yapmak isteseydiniz. Şimdi buttona tıklarsanız yukarıdaki gibi küçükten büyüğe doğru sıralı halde bir liste elde edersiniz. for i:=adet-1 downto 0 do ListBox2.// Küçükten büyüğe doğru yaz.

103 . dizinin her elemanı kendisinden bir sonraki elemanla karşılaştırılarak. Daha hızlı çalışan diğer algoritmaları kullanın. koşula uyanların yerlerini değiştirmek suretiyle iş görmektedir. Çalışma mantığı şöyle. Bu sıralama algoritmasını kullanmanızı tavsiye etmiyorum.o Bubble Sort 2: Bu da ikinci sıralama yöntemimiz. ListBox taki elemanların fazla olması durumunda çok ağır kalacaktır.

Nedense hep böyledir.o Shell Sort: Şimdi de Shell Sort algoritmasının nasıl yazılabileceğine değineceğim. Üstteki algoritmalardan daha hızlı olduğunu belirtmek isterim. Karışık algoritmalı programlar. basit olanlardan daha hızlı çalışırlar. 104 .

o Selection Sort: Şimdi de bu sıralama algoritmasını hazırlayıp programınızı çalıştırabilirsiniz. yer değiştirilerek düzgün bir sıralama elde edilebilmektedir. belirtilen kurala uyan elemanlar. Buradaki mantık: Dizinin her elemanı kendisinden sonra gelen tüm elemanlarla karşılaştırılmaktadır. 105 . Şimdi de bu sıralama algoritmalarının en hızlısı olanı ile ilgili örneğimize geçelim. Karşılaştırma esnasında. Sanıyorum içlerinde en anlaşılır olanı budur.

Procedure'ün bazı şartlar sağlandığı anda kendi kendisini çağırması kafanızı fazla karıştırmasın. ilk etapta dikkatli olmanızı öneririm. Biraz karmaşık gelebilir.o Quick Sort: Sıralama algoritmalarının en hızlı olanıdır. 106 . Bu yüzden dizi elemanları global olarak başka bir procedure içerisinde boyutlandırılacaktır. Bu örnekte procedure kendi kendisini çağıracağı için her defasında diziyi yeniden boyutlandırmak isteyecektir.

Burada sayaç değişkeni değerini yine artıracaktır (for döngüsü için). dizinin orta elemanı (10 eleman varsa “10 div 2” ile 5. • Continue: Şartınızın sağlanması durumunda. alt ve üst serideki elemanlar index numaralarına göre karşılaştırılarak koşula uyanlar birbirleriyle yer değiştirmektedir. Yine belirtilen koşullar neticesinde procedure'ün kendi kendisini çağırması sağlanmaktadır. 107 . döngüden çıkmak veya tekrar başa (döngünün başına) dönmek isteyebilirsiniz. döngünün diğer kodlarını işletmeden tekrar başa dönülmesini sağlayan komuttur. Şimdi bu tip durumlarda kullanabileceğiniz komutlardan bahsedeceğim. belirlemiş olduğunuz şartın (veya şartların) gerçekleşmesi durumunda. eleman kastedilmektedir) bulunmakta.Bu algoritmada. Aşağıda girilen iki değer arasındaki çift sayıları toplatarak “Continue” komutunun işleyişini göstereceğim. Döngü Yönlendirme Komutları: Döngü kodlarınızın işletilmesi anında.

Aşağıda exit komutunun kullanılışına ait basit bir örneklendirme yapılmıştır. hem de alt satırlarda kalan diğer kod satırlarının okunması engellenir. istenen şart sağlandığı anda döngü komutları işletilmeyerek procedure sonlandırılmaktadır. • Break: Bu komut sayesinde. Aşağıdaki örnekte kaça kadar olan sayıların toplamının “100” ü ilk geçen değer olduğu hesaplanmakta. Break komutunun işleyiş mantığı. Çift sayı olması durumunda ise. procedure’e ait döngü dışındaki diğer kodlar okunmaya devam etmektedir. 108 . eğer çift sayı değilse ekleme işlemi yapılmadan tekrar başa dönülmektedir. Biz komutu anlamanız için böyle bir çözüme başvurduk.Yukarıdaki gibi bir örneği kesinlikle “for” döngüsüyle çözmeyin. koşul sağlandığı anda sadece o “for” (Diğer döngüler içinde kullanılabilir) döngüsünden çıkılmakta. belirttiğiniz şart sağlandığı anda döngünün diğer komutları işletilmeden bloktan çıkabilmeyi sağlayabilirsiniz. • Exit: Bu komutla hem döngüden çıkılması sağlanır. Örnekte aralıkta bulunan sayıların çift olup olmadıkları kontrol edilmekte. en son bulunan toplam değerine eklenmektedir.

hem de programı sonlandırabilecek Delphi komutlarını görelim. 109 . • Halt Programı sonlandırmak için kullanılan bir komuttur. Şayet notu “50” den büyük girerseniz. Şimdide hem döngüyü.Örnekte EditBox’a girilen not değerinin “50” den büyük olup olmadığı kontrol edilmektedir. ikinci mesajınız yani “Bütünlemede Ders Almanız Gerekmektedir” uyarısını “exit” komutu işletildiği için asla göremezsiniz. Kullanımına ait örnek aşağıda verilmiştir.

Aşağıdaki örneği dikkatli inceleyiniz. 110 .Terminate: Yine uygulamanızı sonlandırma amaçlı kullanabileceğiniz komutudur. Size çok normal gözüken fakat Delphi tarafından enteresan değerlendirmeye sebebiyet vermektedir. bir Delphi “Application. Aşağıda kullanımına ait örnek verilmiştir.• Application.Terminate” komutunu döngü içerisinde kullanırsanız dikkatli olmalısınız.

“exit” e ihtiyaç duymadan şart sağlandığı anda program kapatılacaktır. while true do //Sonsuz döngü yaratılıyor begin toplam:=toplam+ilk. Programın döngü sonlandıktan sonra kapatılacağı kesindir. if toplam>= 10000 then begin Halt. Aynı uygulama için “Halt” komutunu kullanırsanız.inc(ilk).toplam:Real. Eğer burada toplam değişkeninin değeri “10000” i geçtikten hemen sonra programın kapanması isteniyorsa kodu aşağıdaki gibi değiştirmelisiniz. 111 .son:=555555. Form1. begin ilk:=10. //Programı kapat end. var ilk. end.Caption:=FloatToStr(toplam).son:Integer.toplam:=0.Program sanki toplam değer “10000” den büyük olduğu anda kapanacak gibi gözüksede öyle değildir.end.

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

kullanıcıya diğer isteklerini yerine getirebilme şansı vermektedir (Formu taşıyabilir. Bu durumun iki çözümü bulunmaktadır. Bu durum sizin için sıkıcı. “Application. diğer hiç bir komutu tetikleyemezsiniz (Programı kapatamaz. formunuzu taşıyamayacak. Thread yaratarak sadece o uygulamanın çalışabileceği bir kanal yaratmaktır. • Application. Diğer bir yöntemse (Bu çok gelişmiş bir tekniktir.ProcessMessages” dır. Bunun sebebi eklemiş olduğunuz “sleep(1000)” kod satırından kaynaklanmaktadır.).ProcessMessages” böyle durumlara çözüm yaratmak için Delphi’ye dahil edilmiştir. formu taşıyamaz veya başka bir buttona tıklayamazsınız). Buttona tıkladıktan sonra deneyin.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. başka bir buttona tıklayabilirsiniz vs. dikkat ettiniz mi bilmiyorum.) sadece sizin istediğiniz komutlara cevap verecek bir kanal 113 . Bunlardan birincisi “Application. Bu komut bilgisayarı her seferinde bir saniye uyutacaktır. Bir döngü kodunu işletirken. hatta bunaltıcı olacaktır.Programın öncekine göre çok daha ağır çalıştığını göreceksiniz. Aşağıdaki iki kod bloğunu işletip aradaki farkı görmeye çalışın. Delphi “Application.ProcessMessages” satırını gördüğü zaman kontrolü kısa bir süre için windows’a bırakarak. kapatamayacak ve başka bir buttona tıklayamayacaksınız.

Programı çalıştırdıktan sonra. Artık uygulamanız döngü komutları işlerken sizin komutlarınıza da cevap verebilecektir. performansınızı o oranda düşürürsünüz. 114 . Uygulamanız da ne kadar çok kanal yaratırsanız.yaratmaktır (Bu konuya daha sonraki kısımlarda değinilecektir). Başarılı olduğunuzu göreceksiniz. button kontrolüne tıklayıp formunuzu taşımayı deneyin. Şimdi yukarıdaki kod bloğunu aşağıdaki hale çevirip uygulamanızı tekrar çalıştırınız.

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

116 .

Formunuzun üzerine bir adet button kontrolü yerleştirip. Kullanıcı tanımlı bir prosedürü aşağıdaki şekilde kolaylıkla tanımlayabilirsiniz. 117 .Delphi’de Prosedürler: Aynı kodun işletileceği durumlarda. 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. çalışma anında bu buttona tıklanılması durumunda işletilecek kodun yazılabileceği prosedüre ulaşırsınız. Fakat daha önce Delphi’nin kullandığı forma ait prosedürlere bir örnek verelim. tanımlanan prosedüre projenizden nasıl erişebileceğinizi göstereceğim. sizin tanımlamak zorunda kalacağınız prosedürlerden bahsedelim. üzerine mous ile çift tıklarsanız. Yukarıdaki işlem kitabın tamamında defalarca işlendiği için detaylara daha fazla değinmeden. Aşağıdaki bölümde Delphi içerisinde bir prosedürün nasıl tanımlanabileceğini. 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.

sadece bu classa üye olan diğer prosedürler tarafından ulaşılabilir. Kullanıcı tanımlı prosedürler normal şartlar altında sadece tanımlandıkları yerden sonraki yordamlar tarafından çağrılabilirler. 118 . Peki bu işlemin başka bir yolu yok mu? Tabii ki var. Hemen izah edelim. o zaman biraz daha beklemeniz gerekecektir. Şimdi buttona tıklarsanız. mesaj isimli prosedürde belirtilen uyarıyla karşılaşırsınız. Aşağıda mesaj ismiyle tanımlanan prosedüre “procedure TForm1. Aksini yaparsanız.Bu şekilde tanımladığınız prosedüre. Delphi size komutu tanımadığına dair uyarı mesajı iletecektir.Button1Click (Sender: TObject)” yordamından nasıl erişebileceğinize dair örnek vereceğim. Eğer oluşturduğunuz bu prosedürü dışarıdan çağırmak istiyorsanız (ikinci formdan).

diğer yordamlar tarafından kullanılabilmektedir. Aşağıda tek parametre içeren bir prosedürün nasıl tanımlanabileceği.forward.” kod satırının “mesaj” isimli prosedürün çağrıldığı satırdan önce yazılmış olması gerekmektedir. öncelikle “mesaj” prosedürünün varlığı declare edilerek alttaki satırlarda tanımlansa bile. Aşağıdaki kod bloğunda. 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üre birden fazla parametre değeri gönderebileceğinizi de belirtmekte fayda var. daha sonra 119 . Bu gibi durumlarda prosedürünüzü parametreli olarak tanımlamalısınız. Yazmış olduğunuz “procedure mesaj.Prosedürleri Diğer Yordamlara Bildirmek: Bir prosedürü tanımlandığı satırdan daha önceki bölümlerden çağırmaya kalkarsanız. Her ne kadar sorun çözüldü gibi gözüksede ufak bir hususa dikkat etmelisiniz.) prosedürü “forward” ile declare etmektir. Parametre İçeren Prosedür Tanımlamak: Bazı durumlarda işleteceğiniz prosedür içerisinde kullanılmak üzere parametre (veya parametreler) göndermek isteyebilirsiniz.

burada extra bir incelik bulunmaktadır. Ardından prosedürdeki kod işletilerek.) yaratacaktır. 120 . Şayet bu kodu başka yerlere de yazmanız gerekirse. Hatta sıkıcı bile olabilir. ekranda gözüken uyarıyı kullanıcıya iletmektir. Onun için tekrarlanacak olan kod satırlarını bir prosedür içerisinde depolayıp saklarsanız. Bu örnekteki amaç buttona tıklanıldığı zaman EditBox’ın içerisindeki veriyi “bildir” isimli prosedüre parametre olarak göndermektir. 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. 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. Burada “bildir” isimli prosedürün içerisine yazmış olduğunuz kodu “procedure TForm1. Aynı sonucu almakla beraber.Button2Click(Sender: TObject)” yordamına da yazabilirdiniz. buttona tıklanınca işletilebilmektedir.projeden tanımlamış olduğunuz aktarabileceğiniz gösterilmiştir. Aşağıda tek parametre içeren bir prosedür tanımlanmış olup. dilediğiniz zaman çağırıp kullanabilirsiniz.

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

122 . yazı yazmaya devam etmek için eklenmiştir. mesaj pencereniz bütün içeriği tek satırda göstermek zorunda kalacaktır. Bu komutları eklemezseniz. mesaj penceresinde ikinci satıra atlayıp. Prosedürde kullanılan “#13#10” kod parçası. Aşağıdaki kodları da formunuza ait Unit içerisinde gerekli olan yerlere ekleyiniz.Örneğimiz için prosedür içerisine iki adet parametre (isim ve yaşı) yollanarak blok kodunun işletilmesi sağlanmaktadır. Bu ve buna benzer komutlar neredeyse bütün dillerde aynı amaçla bir çok kere kullanılmaktadır.

.. //Delphi hata mesajı verir.Dizi Parametreli Prosedür Tanımlamak: Oluşturacağınız prosedür içerisinde parametre olarak kullanabilirsiniz. dizi değişkende type hocalar=Array[0. Dikkatli olunuz. Procedure egitmenler(isim:Array[0. //Önce tip Tanımlamayı unutmayınız procedure egitmenler(isim:hocalar).2] of AnsiString). end. //Prosedür tanımlanıyor.2] of AnsiString. begin //Prosedürün işleteceği kodlar buraya yazılacak. 123 . İzlemeniz gereken yol aşağıda verilmiştir. Bu arada aşağıdaki şekilde tanımlayacağınız dizi değişkenli prosedürü Delphi kabul etmeyecektir.

124 . Aşağıda dinamik dizi parametreli prosedüre örnek verilmiştir. Görüldüğü gibi prosedür içerisinde dinamik dizi değerlerini kullanmak hiç de zor değildir. procedure sertifika(isim:Array of AnsiString). prosedür içerisinde kolayca boyutlandırabilirsiniz. //Dinamik dizi parametre //Dinamik dizi için hata vermez Hata vermez begin // Gerekli olan prosedür kodları buraya yazılacak. Olay sadece programcının hayal gücüne kalmıştır. end.Dinamik Dizi Parametreli Prosedür Tanımlamak: Prosedürünüzün parametrelerini (birden fazla da olabilir) dinamik dizi olarak tanımlayabilir. Şimdi konuyu anlamak açısından formunuza bir adet button kontrolü ekleyerek aşağıdaki kodları çalıştırınız.

button kontrolünün “procedure TForm1.Opsiyonel Parametreli Prosedür Tanımlamak: Prosedür tanımlarken bazı parametrelerin opsiyonel olmasını isteyebilirsiniz. end. //opsiyonel parametreli prosedür tanımlanıyor begin //İşletilecek olan kod buraya yazılacak. procedure eleman(isim:AnsiString.vasif:AnsiString='').Button6Click(Sender: TObject)” yordamına tıklandığı zaman işleteceğiniz kodu yazın. Aşağıdaki “eleman” isimli prosedürü oluşturup. Yani kullanıcı bu parametreye dilerse değer gönderir. 125 . eğer gerek görmezse sadece diğer parametrelere programdan değer göndererek prosedürü işletebilir.

prosedür içerisinde opsiyonel değer alacak olan parametrelere default değer atamaktır. Opsiyonel parametreli bir prosedür tanımlamak için yapmanız gereken tek şey. Bu tip prosedürlerde opsiyonel parametre sayısı tamamen programcıya kalmıştır. hem de “Meslek” bilgisinin yazılı olduğu mesaj penceresi kullanıcıyı bilgilendirecektir. Aşağıdaki gibi hem “Adı Soyadı”. meslek bilgisi vasıfsız işçi). prosedür. Karşınıza aşağıdaki ekran görüntüsü gelecektir (Adı Soyadı var. Örneğimizde dikkat ettiyseniz. mesleği kısmı boş bırakılırsa (vasıfsız eleman) tek parametreyle. Ardından elemanın isminin girileceği kutuyu doldurup (Mesleği kısmını boş bırakın) buttona tıklayın.Şimdi aşağıdaki form tasarımını oluşturup projenizi çalıştırınız. İkinci durumda prosedürün iki parametreyle işletildiğini sanıyorum belirtmeye gerek yok (ama biz yine de belirtelim). Bu sefer de “Meslek” bilgisinin yazılacağı text kutusuna değer girin ve projenizi çalıştırın. Default değer aktardığınız parametrelere programdan değer göndermek veya göndermemek tamamen kullanıcıya kalmıştır. Prosedürün tek parametreyle işletildiği sanıyorum dikkatinizi çekmiştir. doldurulursa iki parametreyle işletilerek kullanıcı bilgilendirilmektedir. 126 . Dilediğiniz kadar oluşturabilirsiniz.

Vize ortalamasının hesaplanıp. başlıkta yazdırıldığını göreceksiniz. Fonksiyonun programdan çağrılmasını aşağıdaki şekilde yaptırabilirsiniz.Button1Click(Sender: TObject). procedure TForm3. Editlere öğrencinin vize notlarını girip buttona tıklayın. var x. begin // kodlar buraya yazılacak //sonuc:=hesapla(x. 127 . “Function fonsiyon_adi(degiske1:Tip.y). Aşağıda Delphi’de fonksiyonların nasıl tanımlanacakları gösterilmiştir. begin //Kodlar Buraya Yazılacak. Aşağıdaki form tasarımını oluşturup programı çalıştırınız.Delphi’de Fonksiyonlar: Fonksiyon tanımlama işlemi prosedür tanımlamaya çok benzer. function hesapla(ilk:Integer. Örneklerde alternatif olarak çözümler verilmiştir). 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. //Fonksiyona parametreler yollanıyor.son:Integer):Real.y:Integer. sonuc:Real.degisken2:Tip):fonksiyon_Tipi. Şimdi olayı örnek üzerinde izah edelim.” satırı ile iki parametreli fonksiyon tanımlanabilir. end. //result:=Döndürülecek değer end.

Programın işleyişini sağlayan kodlar aşağıda verilmiştir. 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. Bu bildiriden sonra programınız artık hata mesajı vermeyip. yazdığınız kodları işleterek sonuçları döndürecektir. 128 . program tarafından hata mesajı iletisi verilmesine sebep olacaktır. Yani normal şartlar altında aynı isme sahip iki fonksiyon bildirisi. Hesaplanan değer. Edit’lere girilen değerler değişkenlere aktarılıp parametre olarak “hesapla” isimli fonksiyona yollanmaktadır. Her ne kadar Delphi aynı isme sahip farklı parametreli fonksiyon tanımlanmasına izin versede. sonuc (Geriye dönen değerle bu kastedilmektedir.) isimli değişkene aktarılarak başlıkta yazdırılmaktadır. Pencerede ortalama değerin tanımlanmış olan fonksiyon tarafından hesaplattııldığına dikkatinizi çekmek istiyorum. Sırasıyla fonksiyon bu parametreleri “ilk” ve “son” isimli değişkenlerinin yerlerine koyarak sonucu hesaplamaktadır. parametre sayılarına ve tiplerine bakarak karar verir. Kod satırlarını inceleyecek olursak. bunu programda bildirmelisiniz. Bu hata mesajını engellemek için “overload” bildirisini yapmanız (hem de iki fonksiyon için yapmanız) gerekecektir.

iki fonksiyonun sonuna da “overload” bildirisi ekleyerek aynı isimle iki fonksiyon tanımlayabilirsiniz.Aşağıdaki gösterimde.overload.orta:Integer. Sanıyorum fark ettiniz.son:Integer):Real. 129 .son:Integer):Real. “ortalama” isimli aynı ada sahip iki fonksiyon tanımlanmıştır.//bildiri begin //result:=Geriye dönecek değer end.overload. function ortalama(ilk:Integer. function ortalama(ilk:Integer. fonksiyonlarda geriye dönecek olan değer “result” ifadesiyle belirlenmektedir (c++ da return).//bildiri yapıldı begin //Gerekli kodlar buraya yazılacak //result:=Geriye dönecek değer end. Önemli olduğu için tekrar hatırlatalım.

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

Graphics. uses Windows. Eklendikten sonra uses satırı aşağıdaki gibi olmalıdır.Okek Hesaplayan Fonksiyon: Aşağıdaki fonksiyonla. Dialogs. SysUtils. Fonksiyonda kullanılan “Floor” ve “MaxIntValue” fonksiyonları “math” kütüphanesinde tanımlı olduğu için. Messages. bu kütüphaneyi “uses” satırına eklemelisiniz. Program için verilen form tasarımını oluşturup programı çalıştırınız. Forms. Variants. //Eklemeyi unutmayın 131 . Controls. StdCtrls.math. Classes. fonsiyona gönderilen dizi elemanlarının “okek” lerini hesaplayabilirsiniz.

Şimdi “okek” isimli bu fonksiyonu programdan nasıl çağırabileceğinizi göstereceğim. Eklemiş olduğunuz Button kontrolünün “procedure TForm4. Yapılan işlem. fonksiyona parametre olarak göndermekten ibarettir. Button kontrolüne mous ile tıklama yaparsanız “okek” değerinizin hesaplanıp etiketinizde gösterildiğini göreceksiniz.” yordamına da aşağıdaki kodları ekleyin. Aşağıdaki örnek tasarımı oluşturup.Button2Click (Sender: TObject). 132 . programınızı çalıştırınız. ListBox kontrolündeki elemanları bir dinamik dizi değişkenine aktarıp.

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

134 .” yordamına da aşağıdaki kodları ekleyin. Eklemiş olduğunuz Button kontrolünün “procedure TForm4. Tıklamadan sonra ListBox kontrolünde mevcut olan elemanlar.Şimdi de aşağıdaki tasarımı oluşturup.Button3Click (Sender: TObject). Artık programınızı çalıştırıp button kontrolüne tıklayabilirsiniz. bir dinamik dizi değişkenine aktarılarak parametre olarak “Obeb” fonksiyonuna gönderilmektedir. ilgili yordamlara gerekli olan kodları ekleyiniz.

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

Ortalama ve Toplam değerlerini hesaplatalı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. 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.Şimdi olayı basit bir örnekle izah etmeye çalışalım. Artık bu değişkenlerin değerlerini alt prosedür (ButtonClick) içerisinde dilediğiniz şekilde kullanabilirsiniz. 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. 136 . 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ı). Maximum. Ş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.

137 .İlk olarak aşağıdaki form tasarımını oluşturunuz. İ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. Ardından prosedür kodlarını yazma işlemine geçebilirsiniz.

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). 138 . 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. Bu tür çözümler. Artık button kontrollerine teker teker tıklayarak sonuçlarınızı görebilirsiniz.

bu yapıya ait kullanım şekli gösterilmektedir. diğer fonksiyonların çağrıldıkları şekilde olup herhangi extra bir işlem uygulanmamaktadır. Rekürsif fonksiyonların projeden çağrılması.Delphi’de Rekürsif Fonksiyonlar: Tanımlamış olduğunuz fonksiyon. kod bloğu içerisinde. Aşağıdaki faktöryel hesaplayan örnek fonksiyonda. 139 . Aşağıdaki projede. bu fonksiyonu nasıl çağırabileceğiniz gösterilmiştir. kendi kendisini çağırıyorsa bu tip fonksiyonlara “Rekürsif” fonksiyon denir.

aynı işlemi prosedürler de yapabilmektedir. Projenizi çalıştırıp button kontrolüne tıklarsanız ‘Prestige Education Center’ mesajı devamlı olarak ekranınızda gözükecektir. Oluşturacağınız fonksiyon ve prosedürler için bu hatırlatmayı hiç unutmayınız. prosedür kendi içerisinde tekrar tekrar kendisini çağırarak sonsuz döngü gibi davranabilmektedir. Aşağıdaki örnek yapıda. Rekürsif fonksiyon veya prosedürler bazı durumlarda çalışma hızı açısından yavaş kalabilirler.Fonksiyonlar kendi kendilerini çağırabilecekleri gibi. 140 .

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

142 .

Pencerenizin başlık ismi. ShowMessage(‘Mesaj’). Program içerisinde kullanımına ait örnek aşağıda verilmiştir. 143 . Delphi’de kullanıcıyı uyarmak. projenizin ismi olarak Delphi tarafından varsayılan ve değiştirilemeyen değer olarak belirlenmektedir. Bu methodda açılan pencerenin başlık ismini belirlemeniz mümkün olmamaktadır. ikaz etmek veya yönlendirmek için birden fazla method tanımlanmıştır. Programı çalıştırıp button kontrolüne tıklarsanız. aşağıdaki pencereyle karşılaşırsınız.Mesaj Pencereleri: Daha önceki örneklerimizde basitçe yer verdiğimiz mesaj pencerelerini. Şimdi bu methodları teker teker inceleyelim. Method içerisinde sadece tek parametre kullanılabilmektedir. bu bölümde detaylı olarak inceleme imkanı bulacaksınız. Ayrıca “OK” düğmesinden başka tıklayacak seçeneğinizde yoktur. • ShowMessage: Basit anlamda kullanıcıyı bilgilendirme amaçlı kullanılabilen bir methoddur. Bu methodlardan hangisini kullanacağınız tamamen size kalmıştır.

diğer methoddan farkını göreceksiniz. 144 . Sadece pencerenin açıldığı noktaya dikkat ederseniz. değiştirilme imkanı bulunmamaktadır.y koordinatı) Methodda yer alan ikinci ve üçüncü parametre. pencere ekranın sol üst köşesinde açılacaktır. Aşağıda yapıya ait kullanım şekli verilmiştir. İki koordinata da “0” değerini verirseniz. Girilecek olan koordinat değerleri pencerenin sol üst köşesinin ekrandaki yerini belirleyecektir. Pencere başlığı ve oluşturulan button Delphi tarafından belirlenip. ShowMessagePos('mesaj'. “ShowMessage” methodundan farkı ise pencerenin açılacağı koordinatları belirleyebilmenizdir (Pencereyi ekranda istediğiniz koordinatta açtırabilirsiniz).x koordinatı.• ShowMessagePos: Bu method da basit anlamda kullanıcıyı bilgilendirmek amaçlı kullanılabilmektedir. 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.

“%d” yerine kullanabileceğiniz diğer seçenekler ve anlamları aşağıda tablo şeklinde verilmiştir. 145 . bu değişkenlerin değerlerinin mesaj penceresinde yazdırılmaları sağlanmaktadır.• ShowMessageFmt Yine basit anlamda bilgilendirme yapabileceğiniz.params) Şimdi methodu daha iyi anlayabilmeniz için bir örnek çözelim. bir methoddur. ShowMessageFmt('mesaj’. aşağıdaki gibi bir pencereyle karşılaşırsınız. Programı çalıştırdıktan sonra button kontrolüne tıklarsanız. İkinci parametrede kullanacağınız değişkenler ile ilgili değerleri ilk string içerisinde kullanabilirsiniz. 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.

%d %e %f %g %m %n %p %s %u %x = Decimal (integer) = Scientific = Fixed = General = Money = Number (floating) = Pointer = String = Unsigned decimal = Hexadecimal Şimdi aynı örneği parasal değerler için yapalım. Aşağıdaki kodları formunuza ekleyip uygulamanızı çalıştırınız. sanıyorum daha net bir şekilde anlama imkanı bulacaksınız. Şimdi button kontrolüne tıklarsanız ekran görüntünüz aşağıdaki şekilde olacaktır. değişkenler parasal içerikli olarak (binlik ayıraç biçemli ve sonunda para birimi yazılı şekilde) mesaj penceresinde gösterileceklerdir. Değerleri yazdırmak için “%m” parametresi kullanıldığı için. 146 .

Yazmış olduğumuz “num := MessageDlg('Delphiyi Sevdiniz mi!'.Text.mtCustom. 0). begin mesaj:=Edit1.mbNo]. var num : Integer. 0). basılan düğmenin numarasının aktarılacağı tamsayı tipli bir değişkene ihtiyaç duyar. Aşağıdaki yapıyı dikkatlice inceleyiniz.mtCustom.mbNo].• MessageDlg: Kullanıcıya seçme şansı veren pencereler açmak için kullanılan bir methoddur.[mbYes. num := MessageDlg(mesaj.icon.” satırını inceleyecek olursak: Kullanılan ilk parametrede (Delphiyi Sevdiniz mi) pencerede çıkacak olan mesaj belirlenmektedir. var num : Integer. //Tam sayı tipli değişkene aktarılmalı begin num := MessageDlg('Mesaj'. 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). 147 .Düğme.[mbYes. 0). mesaj:AnsiString. Şimdi de bu işlemi örneklendirelim. Pencere açıldığı zaman üzerinde birden fazla button yerleştirilebileceği için.

sonra buttona tıklarsanız aşağıdaki pencereyle Sayısal ifadenin pencerede yazdırılabilmesi için “IntToStr” . tip dönüştürme fonksiyonlarından faydalanmalısınız. Asla rastgele icon değeri kullanmayınız). Parametre olarak kullanabileceğiniz standart icon sayısı “4” taneden oluşmaktadır. Aynı anda iki icon değeri kullanamayacağınızı belirterek. “FloatToStr” . Programı çalıştırdıktan karşılaşırsınız.Ş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. buraya aktaracağınız değerle pencerenizde çıkmasını istediğiniz iconu belirleyebilirsiniz. 148 . 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. “CurrToStr” veya “DateTimeToStr” vs. Gelelim ikinci parametreye (mtCustom). Ayrıca iki string değişkeni yanyana yazdırmak için “+” operatöründen faydalanmaktayız.

Dikkat ettiyseniz Delphi pencere başlığı olarak icon ismini varsayılan ve değiştirilemeyen değer olarak belirlemiştir. Programı çalıştırdıktan sonra buttona tıklarsanız aşağıdaki ekran görüntüsüyle karşılaşırsınız. Şimdi ikinci parametreyle ilgili güzel bir örnek yapalım. 149 .Kullanabileceğiniz parametre değerleri ve anlamları aşağıda verilmiştir. Aşağıdaki form tasarımını oluşturup gerekli kod satırlarını da ekleyiniz. Bu methodda pencerenizin başlığını belirleme şansınız yok. Icon Seçenekleri mtWarning mtError mtInformation mtConfirmation mtCustom Oluşacak olan icon Arama Iconu Hata Iconu Danışma Iconu Bilgilendirme Iconu Genel Biz bunlardan “mtWarning” seçeneğini kullanarak penceremizde arama iconunun çıkmasını sağlayalım.

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

Düğme Seçenekleri mbYes mbNo mbOK mbCancel mbAbort mbRetry mbIgnore mbAll mbNoToAll mbYesToAll mbHelp Oluşacak Olan Düğme 'Yes' button 'No' button 'OK' button 'Cancel' button 'Abort' button 'Retry' button 'Ignore' button 'All' button 'No to all' button 'Yes to all' button 'Help' button Aşağıda “Yes” “No” ve “Cancel” buttonlarını oluşturabileceğiniz kodlamayı veriyorum. Mesaj penceresinde seçmiş olduğunuz icona ait resim gözükecektir. 151 . Programı çalıştırdıktan sonraki ekran görüntüsü aşağıda verilmiştir. İçlerinden hangilerini isterseniz ekleyebilirsiniz. Dilerseniz daha fazla button oluşturabilirsiniz. Mesaj penceresinde oluşturabileceğiniz düğmelere ait güzel bir örnek yapmak istiyorum. Aşağıdaki tabloda yaratabileceğiniz tüm düğmeler ve bu düğmelere ait değerler verilmiştir.mbNo]).Programınızı çalıştırdıktan sonra icon seçeneklerinden birisini seçin ve button kontrolüne basın. Şimdi de pencerede çıkmasını istediğiniz buttonları belirleyebileceğiniz üçüncü parametremize geçelim ([mbYes.

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

Değişkenin değeri dallanmaya (if veya case) tabi tutularak.Gelelim dördüncü parametreye (Bizim şablonda değeri 0). Buraya girilecek değer help dosyasında aynı numarayla linkli olarak çalışacak. Bu pencerede her değişik düğmeye tıklamanız farklı bir kod işletmenizi sağlayacaktır. Bu yüzden. basılan düğmeye göre istenilen kod işletilebilir. bu parametre help dosyası hazırlanmış olan projeler için önem arz etmektedir (Help dosyası hazırlamayla ilgili konular daha sonra izah edilecektir). 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. 153 . bu methoddan geriye dönen değer kesinlikle bir değişkene aktarılmalıdır. Aşağıda bu olay örneklendirilmiştir. 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). aşağıdaki ekran görüntüsüyle karşılaşırsınız. Programı çalıştırıp button kontrolüne tıklarsanız.

Basılan düğme değerlerine ait tablo aşağıda verilmiştir. Basılan Düğme mrYes mrNo mrOK mrCancel mrAbort mrRetry mrIgnore mrAll mrNoToAll mrYesToAll Sayısal Karşılığı =6 =7 =1 =2 =3 =4 =5 =8 =9 = 10 Bu durumda yukarıda yazmış olduğumuz kod satırlarını aşağıdaki şekilde değiştirebilirsiniz. işletilmesi gereken kodlar o bloğa yazılmaktadır. Ama tercih tamamen sizlere kalmıştır. Aşağıda bu değerlerde verilmektedir. Daha sonra aktarılan değer kıyaslanarak. Aslında tek yapmanız gereken “mr” karakterlerini düğme isminin başına eklemekten ibaret olacaktır. Basılan Düğme mrYes mrNo mrOK mrCancel mrAbort mrRetry mrIgnore mrAll mrNoToAll mrYesToAll mrHelp Açıklama 'Yes' button tıklandı 'No' button tıklandı 'OK' button tıklandı 'Cancel' button tıklandı 'Abort' button tıklandı 'Retry' button tıklandı 'Ignore' button tıklandı 'All' button tıklandı 'No to all' button tıklandı 'Yes to all' button tıklandı 'Help' button tıklandı Basılan düğme yukarıdaki değerini değişkene aktarmaktadır. ilk karşılıklarıyla işlem yapmanız daha kolay olacaktır. 154 . Basılan düğmelerin tam sayı değer karşılıkları da mevcuttur. Sayısal değerleri hafızanızda tutamayacağınız için.

• MessageDlgPos: Bu method.Yine aynı şekilde tıkladığınız düğmeye ait kod bloğunu kolaylıkla işletebilirsiniz. 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 .

Kullanıcıya seçenekli mesaj penceresi açmak için kullanılır. Methodda opsiyonel (istenirse parametre gönderilmeyen) parametre olmadığı için. Kullanım şekline ait yapı aşağıda verilmiştir.seçenekler).Başlık.MessageBox('Mesaj'. 0.MessageBox: En çok kullanılan ve en iyi performansı veren methoddur. basılan düğmenin değerini tutabilecek tam sayı tipli bir değişkene ihtiyaç vardır.mbNo]. İkisine de “0” verirseniz.num := MessageDlgPos(mesaj. • Application. Şimdi tüm parametreleri basitten zora doğru inceleyelim. Bu methodda kullanıcının tercih edebileceği düğme sayısı birden fazla olduğu için. tüm parametrelere değer göndermek zorunludur. mesaj pencereniz ekranınızın sol üst köşesine yapışık vaziyette yerleşecektir.mtWarning. Birinci parametrede (Mesaj) pencerede gösterilmesi istenen açıklama satırı belirtilmelidir. begin num:=Application.x. Var Num:Integer. Yukarıdaki kod satırıyla kullanıcıya ‘Kayıt Değiştirilsin mi’ açıklama satırını 156 .[mbYes.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.

Programın düğmeye tıklandıktan sonraki ekran görüntüsü aşağıda verilmiştir. MB_YESNOCANCEL). bunlar birazdan incelenecektir.MessageBox('Kayıt Değiştirilsinmi'.) bir pencere açılmasını sağlayabilirsiniz. Aksi takdirde uygulamanız çalışmayacaktır. Bu seçeneklerden en az bir tanesini methodda belirtmelisiniz. Pencerede standart iconlarımızdan bir tanesini kullanmayı deneyelim. Şimdi seçenek kümemizdeki ikinci alternatifimize bakalım.'Değiştir'.ileten (Başlık satırı ve düğmelerde oluşturulmuştur. Şimdi bu seçenekleri teker teker inceleyelim. Üçüncü parametremiz (Seçenekler) ise kendi arasında bir çok opsiyonel parametresi bulunan bir seçenekler kümesidir. buraya gireceğiniz metni. kullanıcı formun başlığında görecektir. num:=Application. 157 . İlk olarak çıkarabileceğiniz buttonları burada belirleyebilirsiniz. Gelelim ikinci parametreye (Başlık). Kodda belirtilen açıklama satırının pencerenin ortasında yer aldığına dikkat ediniz. formun başlığının bu metinle aynı olduğunu göreceksiniz. Yukarıdaki pencereye dikkat edecek olursanız. Düğme Seçenekleri MB_OK MB_OKCancel MB_YesNo MB_YesNoCancel MB_RetryCancel MB_AbortRetryIgnore Açıklama Ok button Ok – Cancel button Yes – No button Yes-No-Cancel button Retry – Cancel button Abort – Retry – Ignore button Yukarıdaki kod satırının ekran görüntüsü üst tarafta verilmiştir. Yazabileceğiniz seçenekler aşağıda verilmiştir.

) kullanıcının yanlışlıkla klavyeden bir tuşa basıp “Yes” buttonunu 158 . Kullanabileceğiniz diğer icon seçeneklerini de tablo halinde sizlere verelim.'Değiştir'. Projenize uygun olanını kullanabilirsiniz. num:=Application. Icon Seçenekleri MB_ICONSTOP MB_ICONQUESTION MB_ICONINFORMATION MB_ICONHAND MB_ICONEXCLAMATION MB_ICONASTERISK MB_ICONWARNING MB_ICONERROR MB_ICONMASK Açıklama Şimdi de üçüncü seçeneğimizi inceleyelim.Kodu aşağıdaki şekilde değiştirip uygulamanızı tekrar çalıştırın. Tehlikeli işlemlerde (silme veya değiştirme vs.MessageBox('Kayıt Değiştirilsinmi'. 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.

'Değiştir'. Sonucu görmek için mesaj 159 . Aşağıda yapının kullanımına ait örneklendirme yapılmıştır.MessageBox('Kayıt Değiştirilsinmi'. açılacak olan mesaj penceresinin diğer uygulamaların en üstünde mi yoksa altında mı kalacağını belirlemektedir.işletmesi çok kötü sonuçlar doğurabilir. MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2). Kullanabileceğiniz diğer alternatifler tablo halinde aşağıda verilmiştir. “MB_SYSTEMMODAL” seçeneği mesaj pencerenizin diğer uygulamaların önünde (en üstte) yer almasını sağlayacaktır. Default Button Seçenekleri MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3 MB_DEFBUTTON4 Açıklama İlk Button Aktif İkinci button aktif Üçüncü button aktif Dördüncü button aktif Seçenek kümemizde yer alan dördüncü parametremiz. sizin için bir alışkanlık olmalıdır. Bu yüzden pencere açıldığı zaman aktif buttonun “No” düğmesi olmasını sağlamak. num:=Application.MB_YESNOCANCEL +MB_ICONMASK+MB_DEFBUTTON2+ MB_SYSTEMMODAL).MessageBox('Kayıt Değiştirilsinmi'. 'Değiş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. Bu işlemi nasıl yapabileceğiniz aşağıda gösterilmiştir.

Sonuç aşağıdaki gibi olacaktır. Aşağıdaki kodu projenize ekleyip çalıştırırsanız.MessageBox('Kayıt Değiştirilsinmi'. Yazılmazsa da bunu kabul edecektir. Birincisi mesaj pencerenizin en üstte kalmasını sağlayacak olan “MB_SYSTEMMODAL”. MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2+MB_TASK MODAL+MB_RIGHT). ikincisi ise diğer uygulamalarınızın mesaj penceresinin üzerinde olmasını sağlayacak (Varsayılan değer budur. Seçenekleri yinede tablo halinde vermek sanırım yararlı olacaktır.pencereniz açıkken “Calc” (veya herhangi) programını çalıştırınız.) “MB_APPLMODAL” dır. Aşağıda bu husus örneklendirilmiştir. Burada kullanabileceğiniz iki seçeneğiniz var. mesaj penceresinde yer alacak olan metni sağa dayalı yazmak için kullanılır. “MB_RIGHT” parametresi pencerede yer alan metnin sağa dayalı yazılmasını sağlar. 160 .'Değiştir'. açıklama metninizin sağa dayalı yazıldığını göreceksiniz. num:=Application. Seçenekler MB_SYSTEMMODAL MB_APPLMODAL MB_TASKMODAL Açıklama Hep En Üstte Arkada Arkada Seçenek kümemizin beşinci parametresi.

Dilerseniz aşağıdaki seçeneği de ekleyerek kapat düğmesi ve eklenen düğmelerin yerlerini de değiştirebilirsiniz. 161 .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.

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. Yazacağımız bu seçenekler birbirlerine alternatif değildir. Hepsinin görevi farklı olup. 162 . her düğme için farklı kodların işletilebilmesi sağlanabilmektedir. mesaj penceresinde kapat düğmesinin pasif hale gelmesini sağlayabilirsiniz.MessageBox('Kayıt Değiştirilsinmi'. “MB_PRECOMPOSED” seçeneğini ekleyerek. Son eklediğimiz seçenekleri de tablo halinde verip. Aşağıdaki uygulamada bu husus örneklendirilerek. MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2+MB_TASK MODAL+MB_RIGHT+MB_PRECOMPOSED). Programı çalıştırdıktan sonra button kontrolüne tıklayabilirsiniz. basılan düğmenin değerinin aktarılacağı değişken bizim için oldukça önemlidir. tabloda bu husus açıklanmıştır. bu kısmı kapatmak istiyorum.Kapat düğmesini iptal etmek (pasif hale getirmek) içinde aşağıdaki seçeneği ekleyebilirsiniz. Seçenekler MB_RIGHT MB_PRECOMPOSED MB_COMPOSITE Açıklama Yazı ve Başlık Sağa Dayalı Kapat Düğmesini Sola Al Kapat Düğmesini Pasif Yap Açılan mesaj penceresi alternatifli düğmelerden oluşacağı için. num:=Application.'Değiştir'.

Bizim bu hususta herhangi bir tavsiyemiz olmayacaktır.Dilerseniz dallandırma işlemini “case” yapısıyla da gerçekleştirebilirsiniz. Dilediğinizi seçebilirsiniz. O zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz. Kıyaslama işleminde kullanacağınız yapı tamamen programcıya kalmıştır. 163 .

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

begin deger:=InputBox('Firma İsimleri'.Birinci parametre.''. Kısacası InputBox fonksiyonunda opsiyonel parametre bulunmayıp. 165 . //Pencere başlığı belirlendi. Parametrelerden bir tanesini bile eklemezsiniz. Buraya yazacağınız içerik pencerenin başlığında gözükecektir. Programı çalıştırıp button kontrolüne tıklarsanız. var deger:AnsiString. 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). pencere başlığının alacağı değeri belirlemek için kullanılır. tüm parametrelere kullanıcı tarafından değer gönderilmesi gerekmektedir. Fonksiyonu doğru olarak kullanabilmeniz için. aşağıdaki gibi sadece pencere başlığının belirlenmiş olduğu bir pencere açılacaktır.''). Delphi sizi hata mesajıyla uyaracaktır. içerisindeki üç parametreye de değer atamanız gerekmektedir.

'Firma Adını Giriniz'. Üçüncü parametrede. Aksi takdirde Delphi sizlere hata mesajı iletecektir. Aşağıda kullanım şekline ait yapı ve örneği gösterilmiştir. begin deger:=InputBox('Firma İsimleri'. o zaman buraya iki tek tırnak işareti koymalısınız.Gelelim ikinci parametreye. Eğer kullanıcı hiç bir değişiklik yapmadan “OK” buttonuna tıklarsa. var deger:AnsiString. 166 . pencere açıldığı anda henüz hiç bir bilgi girilmeden text kutusunun içerisindeki default değeri belirlemek için kullanılır. //pencere başlığı ve açıklama metni belirlendi Programınızı çalıştırıp button kontrolüne tıklarsanız. Default değer belirlemek istemiyorsanız. Aşağıda yapının kullanımına ait örneklendirme yapılmıştır. buraya gireceğiniz içerik. belirtilen default değer değişkenin içeriğine aktarılacaktır. aşağıdaki gibi başlık ve açıklama bilgisinin belli olduğu bir pencerenin açılmasını sağlarsınız. mesaj pencerenizin açıklama bilgisi olarak kullanıcı tarafından gözükecektir.'').

'Firma Adını Giriniz'. text kutusunun içeriğini isterseniz değiştirip. default değeriniz değişkene her koşulda aktarılacaktır. Kullanıcı text kutusunun içeriğini değiştirip “OK” buttonuna tıklarsa. 'Prestige'). begin deger:=InputBox('Firma İsimleri'. Şayet hiçbir değişiklik yapmadan “OK” buttonuna tıklama yaparsa. Aşağıdaki örneği dikkatlice inceleyiniz. pencere başlığı. yeni girmiş olduğu değer değişkene aktarılacaktır. 167 . varsayılan olarak belirlenen değer değişkene aktarılacaktır. açıklama ve default değerin belirlenmiş olduğu aşağıdaki pencere açılacaktır. Programı çalıştırıp button kontrolüne tıklarsanız. Önemli Uyarı: Varsayılan değer belirledikten sonra. Son (üçüncü) parametreyle. isterseniz değiştirmeden “Cancel” buttonuna tıklarsanız. pencere açıldığı anda text kutusunun içerisinde bulunacak olan default değer belirlenmiş oldu.var deger:AnsiString.

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

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

İkincisi ise. Fonksiyonu kullandıktan sonra hangi düğme tıklanarak pencerenin kapatıldığını öğrenmek için. fonksiyon “Ok” e basılması durumunda “true”. İlk iki parametre “InputBox” fonksiyonunda olduğu gibi pencere başlığını ve açıklama bilgisini içermektedir. //Ok veya cancel a basıldığı bu değişken de deger:AnsiString. var dugme:Boolean. Aşağıda kullanım şekline ait yapı verilmiştir. text kutusuna gireceğiniz metin “deger” isimli değişken tarafından. farklı kodlar işletilecekse “InputQuery” fonksiyonu kullanılmalıdır.InputQuery Fonksiyonu: Açılan bilgi giriş penceresinde “OK” veya “Cancel” buttonlarına tıklanıldığı zaman. Boolean tip değişkeni dallanma işlemine (if veya case) tabi tutarak gerekli kodları eklemelisiniz. //Klavyeden girilecek olan //içerik deger isimli değişkende tutulacak. Şayet pencere “Ok” buttonu 170 . “Cancel” a basılması durumunda “false” değerini alacak olan “Boolean” tip bir değişkene aktarılmalıdır. bastığınız düğmenin ne olduğuda “dugme” isimli Boolean tipli diğer değişken tarafından tutulacaktır. Üçü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.//Girilecek değer bu değişkende saklanacak begin dugme:=InputQuery(Başlık. kullanıcının gireceği değerin. İşleyiş şöyle olacak.Açıklama.deger). aktarılacağı değişkenin üçüncü parametre olarak fonksiyona gönderilmesi gerektiğidir. InputQuery fonksiyonu üç parametre alabilmektedir. Bu fonksiyonda dikkat edeceğiniz iki tane çok önemli husus var. Bunlardan birincisi.

Ş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. 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).tıklanarak kapatıldıysa “dugme” isimli değişken “true” değerini. else begin ShowMessage('Cancel Buttonuna Basıp İşlemi İptal Ettiniz'). 171 . kodunuzu aşağıdaki gibi değiştirip uygulamanızı tekrar çalıştırın. //Varsayılan değeri yaz end. Form1. Sadece bu buttona tıkladığınız zaman. değişkenin aldığı değeri kullanmadığınız için sonuç farklı olacaktır. “Cancel” tıklanarak kapatıldıysa “false” değerini alacaktır. Koda dikkat edin “Cancel” düğmesine tıklanılması durumunda da değişkenin değeri yazdırılmak istenmektedir.Caption:=deger. Açıklamamı daha iyi anlamanız için.

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 .

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

var deger: Boolean). Yani “procedure TForm4.” 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.IdleOlayi(Sender: TObject.• Unit iniz aşağıdaki şekilde gözükecektir. 174 .

175 .• Şimdi de eklemiş olduğunuz kontrolleri formunuza aşağıdaki şekilde yerleştirip projenizi çalıştırınız. 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. 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.

Açılan pencereden kodu yazmış olduğunuz diğer kontrolün yordamını seçip projenizi çalıştırın. Kodu Button16 ya ait event a yazdığımız için Button17 ye de bu event ı referans göstermemiz gerekecektir. İş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. Birden fazla kontrol aynı event ı kullanacağı için tetiklemenin hangi kontrolden geldiği önem arz edecektir. diğer kontrollere bu event ı referans gösterebilirsiniz.İki Kontrolün Aynı Event ı Kullanması: Tüm kodu tek bir Event a yazıp. Şimdi iki buttonada arka arkaya tıklarsanız. Diğer button kontrolünü mous ile seçip “Object Inspector” penceresinden “OnClick” Event ının sağ tarafındaki oka tıklayın. Referans gösterme işlemi için aşağıdaki adımları izlemelisiniz. 176 . yapmış olduğunuz işlemin sonucunu görebilirsiniz.

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 .

tamsayı tipli bir değişkene aktarılmaktadır. Lokal Hata Yakalama: Lokal hata yakalama tek bir prosedür içerisinde oluşabilecek hataları programa bildirme amaçlı kullanılan bir yöntemdir. hata oluşturmaya müsait bir çok durum olabilir.Delphi’de Oluşabilecek İllegal Durumları Çözmek: Yazmış olduğunuz kodlar içerisinde tahmin edebildiğiniz veya edemediğiniz. Bu kodda Edit içerisine girilen içerik tamsayıya çevrilerek. Aşağıda seçenekleri incelenmektedir. Bu hatalardan bir kısmını bildiğimiz kodlarla engellemek mümkün olmakla beraber. end. Ama hiç hoş olmayan bir durumun olduğu da meydandadır.) sebep olacaktır. 181 . //try –end ile kapatılmalı Aşağıdaki gibi bir kodunuzun var olduğunu düşünün. 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. 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). aşağıda göstereceğim lokal ve genel hata yakalama yöntemlerinden bir tanesini (veya ikisini de) kullanmalısınız. Çalışmaya aynen devam edebilirsiniz. Bu yüzden bu tip durumlarda. • Try-except-End : Try //Hata oluşturabilecek kod bloğu exept begin //Hata oluştuğu anda işleyecek olan kod satırları end.

Kodunuzu ve tasarım şeklinizi gösterildiği şekilde değiştiriniz. Bu pencerenin çıkmasını engellemek için izleyeceğiniz yol aşağıda verilmiştir.Programı çalıştırıp button kontrolüne tıklayın. 182 . Edit kontrolünün içerisinde tamsayıya çevrilecek bir değer bulamayacağı için. aşağıdaki çirkin mesajı verecektir.

“Try-except-end” bloğunun işleme mantığı. Açıklayalım. Delphi. hata oluşturabilecek kodların “tryexcept” arasına yazılması gerektiğidir. buradaki Delphi’ye ait mesaj “exe” uygulamanızı çalıştırdığınız zaman kaybolacaktır. aksi takdirde. Delphi size “except” ten sonraki “begin-end” bloğu içerisinde bulunan kodları işletecek. Yani uygulamanızın “exe” versiyonunu (Kayıtlı olduğu aktif klasörde oluşmuştur) çalıştırırsanız. yani hata oluşmaz ise “except” ten sonraki “begin – end” bloğu içerisindeki kodlar asla işlemeyecektir. Delphi içerisinden bu sonucu görmeniz için. Edit kontrolünün içerisine sayısal karakter dışında giriş yapıp kontrolden tab tuşuyla 183 . Aşağıdaki tasarımı oluşturun. sadece kendinizin eklemiş olduğu mesaj iletisiyle karşılaşacaksınız (hemen deneyiniz). hata mesajını verdikten sonra tekrar “Run” düğmesine tıklamanız gerekir.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. Yukarıda verilmiş olan kodları gerekli olan (Edit1Exit) yordamlara ekleyip programınızın “exe” sini çalıştırınız. size hata yakalama kodlarını eklemenize rağmen. Aşağıdaki örnekte Edit kontrolünün içerisine sayısal içerik girilene kadar kontrolü kaybetmemesi sağlanmaktadır. Peki o zaman bu kodları neden yazdık. ilk başta verdiği çirkin mesajı yine verecektir. Şayet bu blok içerisine yazılan kodlarda hata oluşacak olursa.

Fakat Delphi’de birden fazla “except” kullanmanız mümkün değildir. o zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz.ayrılmaya kalkışırsanız. Türkçe yapacağınız bir uygulama için sanıyorum uygun olmayacaktır. aşağıdaki şekilde bir pencereyle Delphi sizi uyaracaktır. Ama yine de siz bilirsiniz. “C++” birden fazla “catch” (except in yerine kullanılır) yapısına izin vermektedir. 184 . Bu sayede programınız da kırılmaktan kurtulacaktır. Burada kullanılan “HandleCreateException” komut satırı sayesinde sistemin ingilizce olarak vereceği uyarı mesajını da kullanıcıya iletebilirsiniz. Şayet sistemin kendi mesajını da (pek kullanacağınızı sanmıyorum ama gene de verelim) kullanıcıya göstermek isterseniz.

Aşağıda bu işlemi adım adım izah edeceğim. Try //Hataya müsait Kodlar Buraya Yazılacak Finally begin //Hata olsada olmasada işleyecek olan kod bloğu end. end. Yani Finally bloğu hata olsa da olmasad a program tarafından işletilecektir. Birinci adımda. Genel Hata Yakalama: Tüm uygulamanın kullanacağı genel hata yakalama işlemi uygulayacaksanız. lütfen dikkatlice uygulayınız. Genellikle yaratılmış olan objeleri bellekten atma işlemi bu blokta yapılır. Çünkü hata olsa da olmasa da nesnelerin bellekte kalmaları istenmez. programınızın Unit bölümüne geçerek “yakala” ismindeki prosedürü tanımlayın. Yapı aşağıda verilmiştir. 185 . (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.• 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.

186 . Bu iş için en uygun yordamın “OnCreate” olduğunu düşünüyorum. aşağıdaki prosedürün Delphi tarafından otomatik olarak oluşturulmasını sağlayın. Dördüncü adımda. Üçüncü adımda hata oluştuğu anda işleyecek olan kodu bu prosedür içerisine yazmalısınız.İkinci adımda imleç prosedürün tanımlandığı satırda iken “Ctrl+Shift+C” tuşlarına basarak. Biz şimdilik aşağıdaki kod satırlarını ekliyoruz. hata oluştuğu zaman yukarıda oluşturulan prosedürün işletilmesi gerektiğini belirtmeliyiz.

Artık programınızı çalıştırabilirsiniz. Tüm kod aşağıda verilmiştir. Programınızda oluşan tüm hatalar “yakala” isimli prosedürde belirtilen kodları işletecektir. Önemli Uyarı: Bir uygulamada hem lokal hem de global hata yakalama kodları kullanıldıysa. Yani lokal hata yakalama komutlarıyla yakalanan bir hata mesajı. lokal hata yakalama komutlarının önceliğinin olduğunu bilmelisiniz. 187 . global hata yakalama komutlarına yakalanmaz.

188 .

BÖLÜM 8 DELPHI’DE UNIT KAVRAMI 189 .

190 .

Eğer hiç bir kod eklemediyseniz görüntüsü aşağıdaki şekilde olacaktır. Aşağıdaki adımları izleyerek formunuza ait Unit penceresine ulaşabilirsiniz.Unit Penceresi: Bu bölümde kod penceresine (Bu pencere Delphi de Unit olarak adlandırılmaktadır. Yani her Unit in formu olmak zorunda değildir. ekleme silme işlemlerinin nasıl yapılacağını anlatacağım. Şimdi birinci satırdan itibaren inceleme işlemimize başlayalım.) 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. “View->Units” adımlarından sonra karşınıza Unit inize ait pencere gelecektir. Pencereye dikkat ettiyseniz tüm önemli kalıplar satır numaralarıyla (Bu numaralandırmayı biz yaptık) adlandırılmış haldedir. 191 . Bu numaraları kullanarak tüm satırların ne işe yaradığını. nasıl değişiklik yapılabileceğini. Formu olmayan Unit ler de bulunmaktadır).

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

Sebebi çok basit “ShowMessage” methodu “Dialogs” class ı içerisinde tanımlıdır. SysUtils. tanımayacak ve çalıştıramayacaktır. Şimdi de programınızı çalıştırın. Classes. Controls. Messages. Forms. ShowMessage ın declare edilmediğini. //Dialogs’u sildim Şimdi formunuzun üzerine yerleştireceğiniz button kontrolünün “OnClick” yordamına aşağıdaki kodu ekleyiniz. bu yüzden de uygulamanızı çalıştıramayacağını bildirmektedir. Variants. 193 .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. Uyarı mesajına dikkat ederseniz. Bu class ı projeden sildiğiniz için artık uygulamanız bu methodu bulamayacak. Daha önce çok kolay bir şekilde çalıştırdığınız uygulamanız hata mesajı verecektir.Graphics.

Forms. SysUtils. “MMSystem” kütüphanesini eklemeden aşağıdaki kodları çalıştırırsanız. 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.Graphics. Unit inize aşağıdaki kod satırlarını ekleyin.Dialogs.//Eklemeyi unutmayın Cd Rom kapağını açıp kapamak için “mciSendString” methodu kullanılmaktadır.Önemli Uyarı: Bir methodun tanımlı olduğu kütüphanesine ulaşmak için. Variants. Controls. Eklemiş olduğunuz button kontrollerinin “OnClick” yordamlarına aşağıdaki kodları yazıp uygulamanızı çalıştırabilirsiniz. Messages. Program çalıştıktan sonra ilk buttona tıklarsanız Cd Rom kapağı açılacak. Bu class ı eklemezseniz yukarıdaki hata mesajıyla karşılaşırsınız.MMSystem. şayet ikinci buttona tıklarsanız bu durumda da Cd Rom kapağınız kapanacaktır. uses Windows. StdCtrls. sizi tanımlandığı kütüphaneye yönlendirecektir. Delphi sizi bu fonksiyonları tanımadığına dair hata mesajıyla uyaracaktır. İlk olarak formunuzun üzerine iki adet button kontrolü yerleştirerek. 194 . gerekli olan class ı “uses” satırına ekleyerek nasıl kullanabileceğinizi göstereceğim. aşağıdaki tasarımı oluşturunuz. Classes. UYGULAMA 2: Bu bölümde normal şartlarda kullanamayacağımız (kütüphanesi ekli olmadığı için) bir methodu. Şimdi de “uses” satırına “MMSystem” class ını ekleyin. Bu yüzden ilk yapacağınız işlem “mciSendString” fonksiyonunun içerisinde tanumlandığı kütüphaneyi projeye dahil etmek olmalıdır.

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 .Sanıyorum olayın mantığını anladınız.SATIR: type TForm1 = class(TForm) Bu satır Wimdows Form uygulamalarının temelini oluşturmaktadır. Bir sonraki bölümde class yapısı detaylı olarak incelenecektir. 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. bir çok kodu ezbere yazdığınızı maalesef biliyorum. Yavru üye kalıtımsal olarak yaratıldığı class a ait tüm özellikleri ve methodları üzerine alacaktır. Yaratılan yavru üyenin ismi “TForm1”. Bu yüzden bu satıra ait izahat ve örnekleri o kısımda bulabilirsiniz. Object Oriented mantığı kullanılarak class tan yavru üye türetilmektedir. Görsel dillerde kod yazma işlemi çok basit olduğu için. Aksi takdirde methodu proje içerisinde kullanamazsınız. formunuzun üzerine sürüklediğiniz kontrollerle örnekler geliştirebildiğinizi. IV. Bir methodu kullanmak için öncelikle onun tanımlanmış olduğu kütüphaneden müsaade almalısınız (Onu projenize dahil ederek).

type TForm2 = class(TForm) Button1: TButton. private deger:Integer. Button2 “OnClick” olayında rahatlıkla kullanabilirsiniz. Yani Button1 “OnClick” olayında bu değişkene aktardığınız değeri.bazılarının işi abartıp kitap bile yazdıklarını maalesef görüyoruz (Hatta kapaklarında 4. Fakat başka bir Unit içerisinden bu değeri kullanabilmek mümkün değildir. Edit1: TEdit. Şimdi tekrar konumuza dönerek Unit satırlarımızı izah etmeye devam edelim. //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. Bu kitabı hazırlamamdaki asıl amaç. Genel anlamda hangi class a aitse) kullanılabilecek değişken ve methodların declare edilebileceği bloktur. veya 5. 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). 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). procedure Button1Click(Sender: TObject). Bu tip değişkenler devamlı olarak (Form kapatılana kadar) bellekte tutuldukları için son değerleri her zaman hatırlanacaktır. Burada tanımlayacağınız bir değişkeni proje içerisinde nasıl kullanabileceğinizi göstermek istiyorum. 196 . V. baskı bile yazan var). Aşağıdaki kod satırlarını formunuzun gerekli yordamlarına ekleyip programınızı çalıştırınız.SATIR: private { Private declarations } Sadece o Unit tarafından (Buradaki Unit Forma ait olduğu için sadece form kontrolleri tarafından da denilebilir.

197 . kontroller vs. 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.) gibi gözükeceğine dikkat ediniz.” tuşuna basılınca açılan pencerede diğer methodlar (özellikler. Yukarıdaki şekilde “private” kısmında tanımlanan değişkenin “Form2” yazıp “. Unit inizin “private” kısmında tanımladığınız için tüm alt yordamlar tarafından kullanılabilecektir.“deger” isimli değişkeni.

Burada hatırlatalım private bloğunda tanımlanan prosedüre diğer Unit lerden erişmek mümkün olamayacaktır. Button2: TButton.//Prosedür tanımlanıyor. procedure Button2Click(Sender: TObject).Şimdi de “private” kısmında bir prosedür tanımlayarak Unit içerisinde nasıl kullanabileceğimizi görelim. Delphi sizi hata mesajıyla uyaracaktır. Prosedür Unit in “Private” kısmında tanımlandığı için “Form2. private deger:Integer. Aşağıdaki gibi “private” kısmında yeni prosedürünüzü tanımlayın. diğer yordamlardan aşağıdaki şekilde kolayca işletebilirsiniz. Edit1: TEdit. Aşağıdaki gibi Unit in içerisinde Formun üyesi olan prosedür bloğunu oluşturacaktır. Prosedürü bu şekilde tanımlayıp programı çalıştırmaya kalkarsanız. 198 . Bu yüzden şimdi anlatacağım adımları gerçekleştirdikten sonra uygulamanızı çalıştırın. //Değişken tanımlandı procedure uyar(). 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). Prosedürünüzün içerisine yazacağınız kodları. İmleç prosedürün tanımlandığı satırda iken “Ctrl+Shift+C” tuşlarına beraberce basın. procedure Button1Click(Sender: TObject). type TForm2 = class(TForm) Button1: TButton.uyar” komutu kullanılarak prosedür işletilebilmiştir.

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.Burada değinmek istediğim diğer bir noktada. 199 . “Private” bloğunda fonksiyon tanımlaması da yapabilirsiniz. Yani “Form2” yazıp “. Fakat değişken ve prosedürde olduğu gibi başka bir unitten ulaşılması mümkün olmayacaktır.” tuşuna basarsanız açılacak olan pencerede prosedürün ismi gözükecektir. bu prosedüre formun diğer methodlarına nasıl erişebiliyorsanız o şekilde erişebileceğinizdir.

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.son:Integer):Real. Fonksiyona ait “begin-end” bloğu içerisinde hesaplama işlemini yapacak olan kod satırlarını yazabilirsiniz.//Function tanımlandı { Private declarations } Prosedür kısmında yaptığınız gibi. private deger:Integer. procedure Button3Click(Sender: TObject). procedure Button1Click(Sender: TObject). procedure FormCreate(Sender: TObject). Hesapla isimli fonksiyonun “Form2” classının üyesi olduğunu sanıyorum söylememize gerek yok. Button3: TButton. 200 .type TForm2 = class(TForm) Button1: TButton. Edit1: TEdit. Programa gönderilecek olan değer aynı şekilde “Result” ifadesiyle yakalanabilir. //Değişken tanımlandı procedure uyar(). function hesapla(ilk:Integer. Button4: TButton. Şimdi fonksiyonumuzun kodlarını ekleyerek uygulamamızı çalıştıralım. procedure Button2Click(Sender: TObject). Button2: TButton.

” tuşuna basarsanız. Şimdilik bu kısmı kapatıp “Unit” penceremizde yer alan diğer satırları incelemeye devam edelim. tanımlanan fonksiyon “Form2” class ında türetildiği için Editör de “Form2” yazıp “. Class içerisinde değişken. 201 . aşağıdaki gibi açılacak olan pencerede fonksiyonunuzu bulabileceksiniz.Hatırlatmak istediğim diğer bir hususta. prosedür ve fonksiyon tanımlama işlemleri class yapısı kısmında daha detaylı olarak incelenecek ve örneklendirilecektir.

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

BÖLÜM 9 DELPHI’DE CLASS YAPISI 203 .

204 .

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

çağırabileceğinizi belirtmek isterim. Unit pencerenizdeki kod satırlarına aşağıdaki eklentiyi yapın. Şimdi diğer adımlara geçerek daha detaylı açıklamalarda bulunalım. 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. Interface satırının hemen altına “class” yazıp “Ctrl+j” tuşlarına beraberce basarsanız. Unit pencereniz aşağıdaki hali alacaktır. 206 .

prosedür ve özellikleri tanımlamak olacaktır. 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. Ö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 . Buradan sonra yapacaklarımız ise bu class a ait değişken. fonksiyon.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.

“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çıklama penceresinde seçilebilecek olan nesneye ait tip özellikleri de gösterilmektedir. Aşağıdaki gibi içerisinde Unit2 de tanımlamış olduğunuz “Gazi” isimli class ın yer aldığı açıklama penceresi açılacaktır. 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. 208 . Aşağıdaki gibi Gazi isimli class ın Public kısmına “Rektor” isimli değişkeni ekleyiniz.

Şimdi de aşağıdaki kodları Button kontrolünün “OnClick” yordamına ekleyiniz. 209 . Basit bir örnekle olayı pekiştirelim. Formunuzun üzerine birer adet Edit ve Button kontrolü yerleştirin. Gazi isimli sınıftan türetmiş olduğumuz yeni isimli değişken sayesinde bu değişkene kolayca ulaşılabilmektedir.Şimdi eklemiş olduğumuz bu değişkene formdan nasıl erişebileceğimizi görelim.

• İ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.//public dışarıdan erişilebilir. Function notortalamasi(vize:Integer. 210 .notortalamasi(vize. final: Integer): Real. Adım adım inceleyiniz (Buradaki tüm kodlar class ınızı oluşturduğunuz Unit2 ye yazılacak).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. • Birinci adımda fonksiyonunuzun ismini “public” kısmında tanımlayın. function Gazi. end. public Rektor:AnsiString. //Fonksiyon tanımla end. • Üçüncü adımda aşağıdaki kodları fonksiyon bloğunuzun içerisine yazınız.final:Integer):Real. begin //Fonksiyona ait kodlar buraya yazılacak.

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. Aşağıdaki tasarımı oluşturunuz.Şimdi eklemiş olduğunuz bu fonksiyona formunuzdan nasıl erişebileceğinizi göstereceğim. Örneğimizde bu fonksiyon kullanılarak vize ve final notlarının ortalaması hesaplanmaktadır (%30-%70). Dikkatlice inceleyiniz. Artık “Gazi” class ı içerisinde tanımlanmış olan “notortalamasi” isimli fonksiyonu formumuzdan çağırabilen bir örnek yapalım. Edit1 e gireceğiniz değeri vize notu. 211 . 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.

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 .Ş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.

Önceki koda nazaran çok daha temiz bir kodun olduğu kesindir. Ayrıca kodlar daha da anlaşılır hale gelmiştir.Proje içerisinde iki adet daha değişken tanımlamak zorunda kaldınız. 213 . Aslında class ınızı aşağıdaki şekle getirerek. Çü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). 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.

Ardından “Ctrl+Shift+C” tuşları beraberce 214 . Ortalamanın hesaplanacağı değişkeni de class içerisinde tanımlarsak sanıyorum daha güzel bir kodlama yapmış olacağız. Class ta yapılan değişikleri izah edecek olursak. ortalama notunun “50” den büyük olması durumunda sınıfını geçtiğini belirten gmesaj”. Unit2 niz içerisinde bulunan “Gazi” isimli class a ait kodları aşağıdaki şekilde değiştiriniz. “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.Class içerisinde oluşturulmuş Olan Prosedüre Erişmek: Şimdiki konumuz. Birinci prosedür. öncelikle “public” kısmında iki adet prosedür tanımlandı. ikinci prosedür ise ortalamanın “50” nin altında olması durumunda sınıfta kaldığını iletecek olan “kmesaj” prosedürleridir. Bu amaçla “Gazi” class ı içerisinde iki adet prosedür yaratacağız.

prosedür blokları oluşturulup gerekli kodları girildi.kullanılarak. Son olarakta “ShowMessage” methodunun çalışabilmesi için “uses” satırına “Dialogs” kütüphanesi eklenmiştir. Sonucu görmek için formunuzdaki kodları aşağıdaki şekilde değiştiriniz. 215 . Yukarıdaki pencere class içerisinde tanımlanmış olan prosedürlere nasıl erişebileceğinizi göstermektedir. Ş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.

bu değişkenin değerini “notortalamasi” fonksiyonu içerisinde class ın kendi değişkenleriyle hesaplatacağız da ondan. acaba daha güzeli oluşturulabilir miydi? Kodlamaya dikkat ettiyseniz formunuzda “ortalama” isimli bir değişken daha tanımlamak zorunda kaldık. 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. İkinci bir kodlama yaparak class ımızı değiştireceğiz. Eğer notları aşağıdaki gibi sınıfını geçecek şekilde değiştirirseniz. 216 . Neden private derseniz.” 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).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. (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. Yapacağımız kodlamada “ortalama” isimli değişkeni “Gazi” class ının “private” kısmında tanımlayacağız. Hem bu durumda kodunuz çok daha teknik olurdu. Peki bu değişkeni de “Gazi” class ı içerisinde tanımlayamaz mıydık? Tabii ki tanımlardık. Fakat değer gönderemeyeceğiniz bir değişkeni “.

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

Bir class a özellik aşağıdaki şekilde ekletilebilir. Class lara Özellik Eklenmesi: Tanımlamış olduğunuz class lara aşağıda izah edeceğim yöntemlerle kolaylıkla properties (özellik) ekleyebilirsiniz. Özelliği public kısmına ekledikten sonra imleç bu satırda iken “Ctrl+Shift+C” tuşlarına beraberce basın. atanan değeri nerede göstereceğini belirlemek üzere de iki adet (Read-Write) ek declareye ihtiyaç duymaktadır. Bunlardan birincisi fonksiyon gibi geriye değer döndürebilmekte. Yukarıda bahsettiğimiz gibi oku isminde bir adet Fonksiyon. Ayrıca belirleyeceğiniz özelliğin değeri nerden alacağı.Evet gördüğünüz gibi programcıyı hiç zorlamadan. Class a ait özellikleri “Property” bildirisiyle yapmaktayız. Aşağıdaki pencerede “etiket” isimli bir özellik formun “public” kısmına eklenmiştir. yaz isminde de bir adet prosedürü otomatik olarak oluşturacaktır (Bu methodlara ait tanımlamaları da formun private kısmında oluşturmuş olması gerekmektedir.) 218 . property isim:Tip Read f_adi write p_adi. Kod satırlarınızda oluşacak olan karmaşadan da aynı zamanda kurtulmuş olacaksınız. tanımlamaları class ın içerisinde yaptıktan sonra herşey çok kolay bir şekilde gerçekleşebilmektedir. ikincisi ise atanan değerin gösterileceği yeri belirlemek amaçlı prosedür şeklinde olmaktadır. //Forma properties ekleniyor.

Otomatik olarak eklenen methodlardan sonra Unit pencerenize ait görüntü aşağıdaki şekilde oluşacaktır. 219 . bizde ilk iş olarak “deger” isminde bu Unit için kullanılabilecek olan global bir değişken tanımladık. Şimdiden hatırtalatalım. bu tip işlemlerde. Bu kısımda artık gerekli olan kodları yazmak tamamen programcının işidir. fonksiyon ve prosedürün ikisinin de kullanabileceği global bir değişkenin tanımlanması (zorunlu değildir) her zaman işinize yarayacaktır. Bu yüzden.

220 . sonucu belirleyecek değişkenin değerine her zaman “Value” değeri aktarılacaktır.yaz(const Value: AnsiString). Result:=deger. Aynı mantıkla aşağıdaki şekilde prosedür içerisindeki kod satırlarını oluşturunuz. function TForm1. Fonksiyonun yapmış olduğu iş. begin deger:=value. end.İkinci olarak fonksiyonun kodunu oluşturacağız.oku: AnsiString. Aşağıda “oku” isimli fonksiyon bloğuna ekleyeceğiniz kodlar verilmiştir. Bu adımları gerçekleştirdikten sonra herhangi bir yordamda “etiket” yazıp “Ctrl+Space” tuşlarına basarsanız özellik açılan pencerede gözükecektir. begin sonuc:=deger. “Value” değişkeni prosedürün içerisinde Delphi tarafından otomatik olarak tanımlanmıştır. Prosedür de ise.//Atanacak değer hep Value dur.//global değişkenin değeri aktarılıyor. Bu prosedürün ismini neden “yaz” olduğunu sanıyorum söylememize gerek yoktur (Tanımlamış olduğumuz property nin Write kısmında declare edilmiştir). procedure TForm1. var sonuc:AnsiString. prosedürde atanacak olan değerden sonra yapılacak olan hesaplamayı gerçekleştirmesidir. end.

Ardından Button2 kontrolüne tıklayıp etikete aktarılmış olan değeri formunuzun başlığında yazdırabilirsiniz. gerisi size kalmış.Aşağıda etiket isminde bir özellik forma eklenmiş olup. 221 .) yazdırılmaktadır. fakat iyi bir Delphi programcısı olmak istiyorsanız bu tip çözümlere her zaman kafa yormak zorundasınız. Biz görevimizi yapalım. Belki de bir çoğunuz beni bu konular şu an için ilgilendirmiyor diyebilirsiniz. Bu husus biraz karışık gelebilir. Atama işleminde önce Button1 e tıklayarak etiket isimli özelliğe değer atamalısınız (EMRAH YANAR). bu değere atanan AnsiString değer objenin başlığında (Başka yerlerde belirleyebilirsiniz.

daha performanslı bir çalışma yürütebileceksiniz.Form Kullanmayan Windows Uygulamaları Geliştirmek: Bu konuyu anlatmak için en uygun bölümün burası olduğunu düşündüm. kullanıcının görmesini istemediğiniz projeler geliştirmek isteyebilirsiniz. Bu pencerede projenizin ve az önce eklemiş olduğunuz yeni Unit inizin ismi listelenmiş olmalıdır. Gerekli olan tüm kodları bu Unit penceresine yazacağız. • “File->New->Unit” adımlarını izleyerek içerisinde form barındırmayan bir Uniti projenize dahil edin. Şimdi bu tür projeleri nasıl geliştirebileceğinizi adım adım izah edeceğim. • “Project->Remove from Project” pencerenin açılmasını sağlayın. • Yeni bir Delphi Uygulaması başlatın. • Projenize ait tüm kodlar yeni oluşan “project2” (sizin projenizin ismi dolayısıyla oluşacak olan yaprağın ismi farklı olabilir) yaprağında gözüküyor olmalıdır. • “View->Units” adımlarını izleyerek “View Unit” penceresinin açılmasını sağlayın. Siz projenizi seçerek “OK” Buttonuna tıklayın. 222 . Bazı uygulamalarda içerisinde form olmayan. Bu size hız (hem de kimse farkında olmasın) kazandıracak. • Proje yaprağınızda bulunan kodların tamamını silerek aşağıdaki şekilde verilen yeni kodları ekleyiniz. Aynı zamanda kimsede farkınızda olmayacak. (Gelen uyarıya yes deyin) Unit1 ve Form1 iniz projeden silinecektir. adımlarını izleyerek aşağıdaki • Açılan bu pencerede “Unit1” i seçip (Aynı zamanda form1 de seçilecektir) “OK” buttonuna tıklayın.

Programı çalıştırdığınız zaman yazmış olduğumuz kodlar gereği sadece basit bir mesaj iletisi gösterecektir. Siz çok daha karmaşık kodlar belirleyip kullanabilirsiniz. Artık uygulamanızı çalıştırabilirsiniz. 223 .• Şimdi de Unit inize ait olan tüm kodu silerek aşağıdaki gibi değiştiriniz.

224 .

BÖLÜM 10 İŞARETÇİLER & KATARLAR 225 .

226 .

Bu yüzden tanımlanan bir pointer değişkene diğer değişkenin adresinin nasıl referans edilebileceğini göstermek istiyorum. var deger:^Integer. Örneklendirecek olursak bir işaretçinin varlığı programa aşağıdaki şekilde bildirilir. Daire satın almaya karar verdiniz. Tanımlanan bir pointer değişkene normal bir değişkenmiş gibi davranıp aşağıdaki şekilde değer ataması kesinlikle yapılamaz. pazarlıkları yaptınız. sıra parayı ödeme kısmına geldi. //tam sayı tipli pointer //String tipli pointer Bu mantıkla pointer değişkenleri istediğiniz tipte (veya nesneden türeterek) kolayca tanımlayabilirsiniz. //Pointer değişkene bu şekilde değer atanamaz Pointer lar genellikle başka değişkenlerin (fonksiyon veya herhangi bir class ta olabilir) adres değerleriyle işlem yaptırmak için tanımlanırlar. 227 . Fonksiyonlardan dönen birden fazla değeri göstermek içinde C++ da pointer değişkenlerden faydalanılır. Delphi’de bunu dolaylı olarak kullanabilmektedir.Delphi’de Pointer Değişkenlerin Yeri: Pointer değişkenler. değişkenin tanımlandığı tipin başına “^” işareti konularak gerçekleştirilir. İşaretçi Bildirimi: Delphi’de işaretçi bildirimi. Yani bir işaretçi (pointer) değişken herhengi bir değeri değilde değerin bulunduğu adresi tutmaktadır (İstenirse bu adresteki değer de pointer değişkeniyle ifade edilebilir). Dosyaların bellekteki yerleri pointer değişkenlerce tutulabilmektedir. metin:^AnsiString. C++ dilinin en etkin özelliklerinden biri olan pointer değişkenleri Delphi’de en az C++ kadar etkili bir şekilde kullanabilmektedir. İkinci alternatifin olayı pointer değişkenle çözme yöntemi olduğunu düşünebilirsiniz. Konuyu anlamanız için daha geniş izahatı bir örnekle vermeye çalışalım. birincisi paranızı bankadan çekip mal sahibine getirip vermek (parayı ister istemez defalarca saymak zorunda kalacaksınız) veya mal sahibinin banka hesabına kendi banka hesabınızdan parayı çıkarmak (bu sefer parayı hiç saymayacaksınız) olacaktır. Burada izleyeceğiniz iki yol var. deger:=100. Bu durum işaretçilerle yapılan hesaplamaların çok daha hızlı olmasını sağlamaktadır. Bu da performanslı bir işleyiş sağlayacaktır. Yapacağınız alışverişin çok daha hızlı olacağı kesindir. bellekte bulunan değerin adresini barındırırlar.

const sayi:Integer=888. procedure TForm1. //Değişkene değer atanıyor. //tam sayı tipli pointer metin:^AnsiString. deger^:=1000. //Adres referans gösteriliyor. deger:=@sayi. var deger:^Integer. var deger:^Integer.Button1Click(Sender: TObject). bir pointer başka bir değişkenin adresini önüne “@” karakteri konularak referans gösterebilir.//String tipli pointer begin deger:=@sayi. pointer değişkenlere diğer değişkenlerin adresleri referans gösterilebilir. Atamanın yapılabilmesi için ya bellekte boş bir yerin ayrılması (C++ new veya malloc) ya da başka bir değişkenin adresinin referans gösterilmesi gerekmektedir. begin sayi:=888.//String tipli pointer sayi:Integer. Yukarıdaki açıklamadan da anlaşılacağı gibi pointer değişkene değer atanırken isminin sağına “^” işareti konulması gerekmektedir.İşaretçilere Adres Göstermek: Aşağıda gösterimi yapıldığı şekilde. Yukarıda gösterildiği şekilde.Button1Click(Sender: TObject). end. //sayi isimli değişkenin adresi referans gösteriliyor. Aşağıdaki şekilde adres referansı yapıldıktan sonra pointer değişkene kolaylıkla değer atanabilir. Referans gösterme işlemi yapıldıktan sonra pointer değişkene yeni değerler atanabilir.//Yeni değer atanıyor end. İşaretçilere Değer Atamak: İşaretçilere değer atanabilmesi için tanımlanmış olması yeterli değildir. //tam sayı tipli pointer metin:^AnsiString. 228 . procedure TForm1.

//tam sayı tipli pointer sayi:Integer.Hüsnü Can'. //Değişkene değer atanıyor. adresi gösterilen değişkenin değeri ile pointer değişkeninin adresinde barındıracağı değer aynı olacaktır.Caption:=str.//Yeni değer atanıyor Form1. // Prof.Caption:=IntToStr(sayi). //Değişkene değer atanıyor. deger:=@sayi. 229 . // Yine 1000 yazacaktır. end. begin str:='Ünsal Soygür'.//String tipli pointer str:AnsiString. procedure TForm1. //Adres referans gösteriliyor.Hüsnü Can yazar end. var deger:^Integer. deger:=@sayi.Dr. begin sayi:=888. 1000 yazar end. var metin:^AnsiString.Caption:=IntToStr(deger^). //Adres referans gösteriliyor. var deger:^Integer. Aynı örneği string tipli değişkenler içinde kullanabilirsiniz.Button1Click(Sender: TObject). procedure TForm1. metin:=@str.Dr. metin^:='Prof. //Adres referans gösteriliyor.Button3Click(Sender: TObject). Bu tür uygulamalarda pointer değişkenin adresindeki değeri değiştirmekle.//Yeni değer atanıyor Form1. begin sayi:=888. deger^:=1000. procedure TForm1.//Yeni değer atanıyor Form1. //Değişkene değer atanıyor. //Pointer yazdırılıyor. Örneği aşağıdaki şekilde değiştirirseniz yine aynı sonucun yazıldığını göreceksiniz. adresi referans gösterilen değişkenin değerini değiştirmek sizi aynı sonuca ulaştıracaktır. //tam sayı tipli pointer sayi:Integer.Pointer değişkene adres gösterimi yapıldıktan sonra.Button2Click(Sender: TObject). deger^:=1000. Aşağıda bu husus örneklendirilmiştir.

Getmem(metin. begin metin^:='Yüksel İnan'. Form1. procedure TForm1. İşaretçi tanımlandığı anda atanacak değerin yazılacağı yer (referansta henüz gösterilmediği için) belli olmadığı için herhangi bir değer atanması durumunda çalışma zamanı hata verecektir. İkincisi ise pointer in adresindeki değeri hesaplamalarda kullanmak için yine sağına “^” karakterini koymanız gerekmektedir. Hatanın sebebi hepinizin de fark ettiği gibi değişkene atanan değerin yazılacağı yerin belli olmamasından kaynaklanmaktadır. Bu işlemi yaptıktan sonra işaretçiniz atayacağınız değeri kolayca kullanabilecektir.Caption:=metin^. aşağıdaki gibi bir pencere ile kullanıcıyı uyaracaktır. Bu eksikliği kullanılan “GetMem” fonksiyonu sayesinde aşabilmekteyiz. 230 . var metin:^AnsiString. Ayrılan bu yer değişkene. Birincisi (adres referansı yapılmış olması gerekmektedir) pointer adresindeki değeri değiştirmek için değişkenin sağına “^” işareti (metin^) koyarak atama yapmalısınız.Pointer değeriyle ilgili işlemlerde dikkat edeceğiniz iki hususa tekrar değinelim. o zaman GetMem (C++ da new) methoduyla bu işaretçiye bellekte boş bir yer ayırmalısınız.25) satırı. değerini yazabileceği bir yer sağladığı için artık uygulama hata vermeyecektir. Şayet adresi gösterilecek bir değişken tanımlamak istemiyorsanız. Aşağıdaki iki örneği dikkatlice inceleyiniz. metin isimli işaretçiye bellekte 25 karakterlik boş yer ayıracaktır. Yukarıdaki programı çalıştırırsanız.//değeri yazacağı yer belli değil hata verir end.Button2Click(Sender: TObject). Aşağıdaki şekilde de İşaretçi değişkenlere ilk değer atamasını yapabilirsiniz.

Button2Click(Sender: TObject). Form1. //Adresi artır Form1. procedure TForm1. procedure TForm1. var sayi:Integer. //Nihat Demirli yazar end.//Adres gösterme işlemi tamamlandı inc(deger).25). procedure TForm1.//Pointer değişken begin sayi:=7779. //Adresteki Değeri 1 artır Form1. var metin:^AnsiString. // 7780 yazar end. deger:^Integer.// 7779 yazar end.Button4Click(Sender: TObject). 231 . Matematiksel hesaplamalar da dikkat edilecek bir kaç husus bulunmakta olup.Caption:=IntToStr(sayi). Aşağıdaki örneklerin herbirini çok dikkatlice inceleyiniz. deger:^Integer. var sayi:Integer.//Pointer değişken begin sayi:=7779. Aynı örneğin aşağıdaki şekilde çözümüne dikkat ediniz.Şimdi kodu aşağıdaki şekilde değiştirip uygulamanızı tekrar çalıştırın. deger:=@sayi.Caption:=metin^.//Adres gösterme işlemi tamamlandı inc(deger^).Button5Click(Sender: TObject). deger:=@sayi. İşaretçileri Aritmetik İşlemlerde Kullanmak: Pointer değişkenlerle bir çok durumda aritmetik işlemler yapmak zorunda kalacaksınız.//Bellekte 25 karakterlik yer ayrıldı metin^:='Nihat Demirli'.Caption:=IntToStr(sayi). şimdi bu hususları değerlendireceğim. begin GetMem(metin.

deger isimli pointer değişkenin.İki örnek arasındaki fark. deger:^Integer.Caption:=IntToStr(deger^). deger:=@sayi. dolayısıyla buradaki yeni gözde bulunan değeri göstermesine sebep olacaktır. deger:^Integer.Button6Click(Sender: TObject).Button5Click(Sender: TObject). procedure TForm1. Yukarıdaki örnekte pointer değişkenin adresinde bulunan değere 10 eklenerek yeni değer belirlenmekte olup.//Adres gösterme işlemi tamamlandı sayi:=deger^+10. var sayi:Integer.//Pointer değişken begin sayi:=7779.//Adres gösterme işlemi tamamlandı inc(deger). var sayi:Integer. deger:=@sayi. Integer (pointer Integer tanımlandığı için) sayı tipinin bellekte tuttuğu yer kadar ileriye kaymasına. İkinci örnekte ise pointerin adresi (adresteki değeri değil) bir artırılmakta bu da bulunduğu gözün ileriye doğru kayması. Örnekte kullanılan “inc(deger)” kod satırı.Caption:=IntToStr(deger^). Yapmış olduğunuz işlem direkt pointer değişken tanımlamaktan hiçte farklı değildir. //7789 yazar end. değişkeninizi bu tipten türetebilirsiniz. //Yeni değer ata Form1. procedure TForm1. Sonuç olarak ilk değişkenle pointer in gösterecekleri değer artık aynı olmayacaktır. sonuç başlık satırında yazdırılmaktadır. //Adresi artır Form1.//Saçma bir değer yazar end. Aşağıda kullanıcı tanımlı pointer tip değişkeni nasıl tanımlayabileceğiniz gösterilmektedir. Kullanıcı Tanımlı Tip Değişkeni Olarak Pointer Kullanmak: Tanımlayacağınız pointer değişkeni kullanıcı tanımlı pointer tip olarak yaratıp. birincisinde pointer değişkenin adresindeki değer değiştirilmekte (Bir artırılıyor). yani başka bir gözün referans gösterilmesi anlamını taşımaktadır. sonuç olarak değişkenin değerinin de değişmesine sebebiyet vermektedir. 232 .//Pointer değişken begin sayi:=7779.

//adresteki dğeri 100 artır Form1. begin sayi:=999. İşaretçilerin Dizi Değişkenlerle Beraber Kullanılması: Pointer değişkenlerin dizi değişkenler ile beraber kullanılması çok etkin bir kullanım ve performans sağlamaktadır.//dizi değişken var deger:^AnsiString. var deger:sayilar. Aynı şekilde referans gösterilen gözdeki değeri rahatlıkla kullanabilir. 1099 yazar end. //pointer değişken begin deger:=@sehir. //ilk elemanı göster deger:=@sehir[0].Type sayilar=^Integer.'İzmir'). sayi:Integer. const sehir:Array[0. //Pointer değişken yaratılıyor. deger:=@sayi.'İstanbul'.2] of AnsiString=('Ankara'.Caption:=IntToStr(sayi). //ikiside aynı işi yapar 233 . Type sayilar=^Integer. //Kullanıcı tanımlı pointer tip procedure TForm1. //Kullanıcı tanımlı pointer tip Tanımladığınız kullanıcı tipli pointer değişkenden aşağıdaki şekilde yeni bir pointer oluşturabilirsiniz. deger:=@sehir. Dilerseniz buradaki değere de kolayca ulaşabilirsiniz. //Dizi değişkeni referans göster Bu şekilde yapılan bir adres gösterimi sonrası “deger” isimli pointer değişken dizinin ilk elemanının bellekteki adresini gösterecektir. deger^:=sayi+100..Button7Click(Sender: TObject). Bir pointer değişken dizi değişkenlerin adreslerini de referans gösterebilir. Aşağıda bu husus detaylı olarak örneklendirilmiştir.

const sehir:Array[0. kodunuzu aşağıdaki şekilde değiştirmelisiniz. //Dizi değişkenin ilk elemanını referans göster Form1. yani dizi değişkenin ilk elemanının adresini gösterdiğine dikkatinizi çekmek istiyorum. begin deger:=@sehir. var deger:^AnsiString. //dizinin üçüncü elemanını referans göster Form1..2] of AnsiString=('Ankara'.Button9Click(Sender: TObject). Aşağıdaki kod satırlarıyla da aynı sonuca ulaşabilirsiniz.Button9Click(Sender: TObject). //ilk elemanı yazar yani Ankara end. //Dizi değişkeni referans göster Form1.'İstanbul'.2] of AnsiString=('Ankara'. //ilk elemanı yazar yani “Ankara” end. 234 ..//üç elemanlı dizi var deger:^AnsiString. Aşağıda verilen pointer değişken örneklerini dikkatlice inceleyiniz.'İzmir'). const sehir:Array[0..2] of AnsiString=('Ankara'. procedure TForm1. begin deger:=@sehir[0].'İstanbul'.'İzmir'). ikisinin de aynı işlemi yaptığına.'İzmir').Caption:=deger^. var deger:^AnsiString.Caption:=deger^.Yukarıdaki iki satıra dikkat edecek olursanız.'İstanbul'.. //İzmir Yazar end. procedure TForm1. begin deger:=@sehir[2]. Şayet pointer dizi değişkenin ikinci veya üçüncü elemanının adresinin gösterilmesi istenirse. procedure TForm1. const sehir:Array[0.Caption:=deger^.Button8Click(Sender: TObject).

Kafanızı karıştırmasın. //elemanı yazdır inc(deger). Dizi elemanları tamamlandıktan sonra pointer değişkeniniz rastgele (bir sonraki gözde bulunacak olan değer) karakterler göstermeye devam edecektir. //pointer değişken tanımlanıyor const sehir:Array[0.2] of AnsiString=('Ankara'.'İstanbul'. begin deger:=@sehir.Button10Click(Sender: TObject). buttona her tıkladığınızda bir sonraki elemanın değerini yazdırabilirsiniz. //Bir sonraki elemana geç end. var deger:^AnsiString. //Dizi değişken tanımlanıyor procedure TForm1.//ilk elemanı göster end. begin Form1. Bunun sebebi dizi konularının işlendiği bölümde de açıklandığı gibi diziler bellekte arka arkaya yerleştirilirler. Bu yüzden referans edilen elemandan bir sonraki adreste. Aynı şekilde “dec()” methodunu uygularsanız bu seferde bir önceki elemanın adresini gösterecektir.FormCreate(Sender: TObject). Dizi elemanları arasındaki geçişi “inc()” veya “dec()” methoduyla yapabilirsiniz. Yapılan uygulamadan daha hızlı bir işlemin olamayacağını belirtmek isterim. Programı çalıştırdıktan sonra formunuzun başlığında dizi elemanlarının sırasıyla yazdırıldığı bir görüntü 235 . Aşağıda bu husus örneklendirilmiştir. aşağıdaki çözümü sizlere sunalım.Caption:=deger^. dizinin bir sonraki elemanı bulunacaktır. Kodları ekledikten sonra programı çalıştırırsanız. procedure TForm1. Uygulamamız için formunuza bir adet “Timer” kontrolü yerleştirip aşağıdaki kod satırlarını da gerekli olan yordamlara ekleyiniz. bir sonraki elemanın değerini gösterir.'İzmir'). İşaretçi İle Dizi Elemanları Arasında Dolaşmak: Tanımlayacağınız pointer bir değişkenle dizi elemanları arasında kolaylıkla dolaşabilirsiniz. değişkeninizin değeri artmaz. Şimdi örneğimizi biraz daha zorlaştırıp.Bu şekilde tanımlayacağınız pointer bir değişkenle dizi elemanlarının tamamını dolaşabilirsiniz. Tanımlamış olduğunuz pointer değişkene “inc()” methodunu uygularsanız..

Konulan kontrol sayesinde dizi elemanları bittiği zaman pointer değişkenin tekrar ilk elemana dönmesi sağlanmıştır. Const la tanımlanan bir değişkenin değerini (bir nevi değişkenin static mantığıyla çalışması) değiştirebilmeniz için bu bildiriyi muhakkak kullanmanız gerekmektedir. Örnekte kullanılan random fonksiyonu rastgele sayı üretmek için kullanılmıştır. Hatırlatmak istediğim bir hususta “Timer1Timer” yordamında kullanılan “{$j+}” bildirisi olacaktır (Daha önce prosedür içerisinde static değişken tanımlayabilmek için kullanmıştık).elde edeceksiniz. uygulamanızı çalıştırmayacaktır. Aksi takdirde Delphi sabit değişkeninizin değerini değiştiremeyeceğiniz uyarısını vererek. Dizi değişken ve pointer (işaretçi) değişkenin Unit1 için global olarak tanımlandığına dikkat ediniz. Aşağıda gerçekleştirilen uygulamada. Sayısal Loto programının pointer değişken kullanılarak çözülmüş halini vereceğim. Pointer değişken kullanımına alışmanız bağlamında güzel bir örnek olabileceğini 236 . Programa ait tüm kod satırları aşağıda verilmiştir.

Programa ait tüm kod bloğu aşağıda verilmiştir. Uygulamanız için formunuzun üzerine bir ListBox kontrolü ile bir adet button yerleştirip aşağıdaki tasarımı oluşturunuz. 237 . Satırları anlayarak yazınız.düşünüyorum.

//değişkenin adresini al f^:=hesapla. function hesapla(x. Sonuçta bir fonksiyon tanımlandığı zaman da program ona bellekte bir yer ayıracaktır. fakat içerisinde kullandığı parametre sayısı ve tipleri aynı olacak. //fonksiyonu gösteren pointer tanımlanıyor. Eğer bu ara değişkeni (yaz) 238 . yaz:Real. //parametre sayısı ve tipleri aynı Kullanıcı tanımlı tipi oluştururken dikkat edeceğiniz husus fonksiyonun ismini yazmayacaksınız. procedure TForm3. end.20). Daha sonra bu tip fonksiyonları gösterecek olan kullanıcı tanımlı tipinizi oluşturmalısınız. Ardından yarattığınız pointer değişkene fonksiyonunuzun ismini aktarıp. y: Integer): Real. //ortalamayı bul end. Burada kullanılan ara değişken. Değerin tutulduğu yer değişken adresi de olsa. //hangi fonksiyonun çalıştırılacağını buradaki isimden anlıyor. Pointer bir değişkene fonksiyon adresi göstermek için aşağıdaki adımları izlemelisiniz. sonuc:Real. type baglan=function (x:Integer. begin Result:=(x+y)/2. parametrelerini göndermelisiniz. Öncelikle tanımladığınız tipten pointer bir değişken yaratmalısınız. sonuc:=F^(10. var F: ^baglan.İşaretçi Fonksiyon İlişkisi: Pointer değişkenlere fonksiyonların döndüğü değerin bulunduğu adresi de referans gösterebilirsiniz. //Fonksiyonu parametreleriyle işlet Form3. begin f:=@yaz.y:Integer):Real. İlk olarak aşağıdaki fonksiyonu Unit pencerenizde oluşturun. fonksiyon adresi de olsa fark etmeyecektir.Button1Click(Sender: TObject).Caption:=FloatToStr(sonuc). değerin yazılacağı adresi belirlemek bağlamında oluşturulmuştur.//sonucu yaz.

Aşağıdaki gibi girilen sayının faktöryelini hesaplayan bir fonksiyon oluşturun. Oluşturmuş olduğunuz fonksiyonu. Şimdi buttona tıklarsanız girdiğiniz sayının faktöryeli hesaplanarak. Projenizi çalıştırdıktan sonra Edit1 kontrolüne sayısal bir değer girin.oluşturmazsanız. formunuzun üzerine yerleştireceğiniz button kontrolünün “OnClick” yordamından çağırın. hesaplamayı yazacağı yeri bilemeyeceği için program hata mesajıyla sizleri uyaracaktır. 239 . formunuzun başlığında yazacaktır (Hatırlatalım faktöryeli alınacak sayıyı çok büyük girmeyin). Şimdi yapacağımız bir programla olayı pekiştirelim.

Button3Click(Sender: TObject). ver:=@mes. ver^:=mesaj.Text. Aşağıda bu husus örneklendirilmiştir. //tipi gösteren pointer tanımlanıyor metin:AnsiString. Ara işlemler için kullanılan “Variant” tipli değişken (mes). end. type ilet=procedure(str:AnsiString). begin ShowMessage(str). //tip tanımlanıyor Üçüncü adımda da pointer değişken ile prosedürünüzü ilişkilendireceğiniz yordama gerekli kodları eklemelisiniz. İkinci adımda bu prosedür ile aynı parametreleri içeren (ismi yazılmadan) kullanıcı tanımlı tipinizi tanımlamalısınız. bu prosedüre ait kod satırlarının işletilmesini sağlamalısınız. var ver:^ilet. begin metin:=Edit1.İşaretçi Prosedür İlişkilendirilmesi: Yukarıdaki bölümde fonksiyonla pointer değişkeni ilişkilendirebildiyseniz. //prosedür işletiliyor end. ilk etapta gerekli olan adres için 240 . procedure mesaj(str:AnsiString).pointer değişken arasında da yaptırabilirsiniz. Kontrolünüze ait yordamda (OnClick) ilk yapmanız gereken işlem. aynı işlemi prosedür . procedure TForm3. mes:Variant.//işleteceği prosedürü belirliyor ver^(metin). İlk olarak fonksiyonunuzu tanımlamalısınız. yaratmış olduğunuz kullanıcı tanımlı tipten yeni bir pointer değişken yaratmak olmalıdır. Arkasından bu değişkeninize işleteceği prosedürü referans göstererek.

Aşağıda bu husus örneklendirilmiştir.oluşturulmuştur. Bu durumda türetildiği class a ait tüm özellik ve methodları kullanabilmektedir. Bu değişkeni tanımlamazsanız programınız hata mesajıyla sizleri uyarıp çalışması kırılacaktır. 241 . İşaretçi Class İlişkisi: Bir pointer herhangi bir class tan da türetilebilmektedir.

Aşağıdaki şekilde yapacağınız bir atama programın kırılmasına yol açacaktır. //Katar değişken tanımlanıyor.Caption:=katar. o değişkenin katar işlemlerinde kullanılmasını sağlar. begin katar:='Sibal Yanar'. Katar tipte bir değişkenin değerini yazdırmak için aşağıdaki yöntemi kullanabilirsiniz. ansistring tip değişkenlere yapılan atama şekliyle aynıdır. Katar Bildiriminin Yapılması: Yukarıda da bahsettiğimiz gibi bir değişkenin “Pchar” tipte tanımlanması. var katar:PChar. //katara değer atanıyor. end. Görüldüğü gibi katar değişkenlere yapılan atama işlemleri. begin katar:=Edit1. //katar değişken değerini yazdır. begin katar:='Sibal Yanar'.Katarlar: Delphi’de bir değişkenin “PChar” tipli değişken olarak tanımlanması. katar işlemleri için yeterli olacaktır. Label1. Katar bildirimi yapılan değişkene aşağıdaki şekilde kolayca atama yapılabilir. //katar değişkene bu tür atama yapılamaz 242 . var katar:PChar. //katara değer atanıyor. var katar:PChar. var katar:PChar. //Katar değişken tanımlanıyor. Bu yüzden aynı mantıkla işlem yapmaya kalkmayınız. //Katar değişken tanımlanıyor.text. Pchar tipli değişkenlerin çalışma mantığı AnsiString tip değişkene göre oldukça farklıdır.

Mesela katar değişkeninin değerinin bir artırılması. Bu yüzden yazdırma işlemini sağına “^” karakteri koyarak yaptırırsanız. procedure TForm1. begin Label1. begin katar:=PChar(Edit1.//Doğru bir atama Label1.Caption:=katar. end. Kodlamayı aşağıdaki şekilde değiştiriniz.caption:=katar^. //Sadece N yazar end. var katar:PChar. aşağıdaki yöntemi kullanmalısınız. Katar değişkenler referans ettikleri yerin ilk gözüne odaklanırlar (ilk gözde de hep ilk karakter olacağından). procedure TForm1. sadece ilk karakteri yazdırabilirsiniz.text). İşlem şekli programcılara çok özel olanaklar sağlamaktadır (örneklerde göreceksiniz).Button13Click(Sender: TObject). metindeki ikinci gözün 243 . end. Aşağıdaki örnekleri çok dikkatlice inceleyiniz.caption:=katar. Const katar:PChar='Nihat Demirli'. //Nihat Demirli yazar. “Pchar” methodu kullanılarak. Bu yüzden katar içerisindeki her karaktere teker teker ulaşmanız mümkündür. kontrolün içeriği karakter tipli veriye çevrildikten sonra atama işlemi yapılabilir. begin Label1. Const katar:PChar='Nihat Demirli'.Şayet katar tipte (char tipli pointer) bir değişkene AnsiString tip veri içeren kontrolün veya değişkenin değerini atamak istiyorsanız. Katar değişkenlerinin aslında “Char” tipte birer pointer oldukları sanıyorum dikkatinizden kaçmamıştır.Button15Click(Sender: TObject).Button14Click(Sender: TObject). procedure TForm1.

Button16Click(Sender: TObject). katarın tamamınız yazdırılması ile de ikinci karakterden sonrasının gösterilmesini sağlayabilirsiniz. Karakterler Arasında Gezinmek: Katar değişkenler içerisinde bulunan tüm metne adres değerini değiştirerek kolayca erişebilirsiniz. procedure TForm1. begin inc(katar). Const katar:PChar='Nihat Demirli'. //adresi bir artır Label1. Eğer burada tüm katarı yazdırırsanız.3). // “ihat Demirli” yazar end. Kodu aşağıdaki şekilde değiştirecek olursanız.caption:=katar. Sonuç aşağıdaki gibi olacaktır. //Sadece “a” yazar end. begin inc(katar). Aşağıdaki örnekleri çok dikkatlice inceleyiniz. 244 . Const katar:PChar='Nihat Demirli'.caption:=katar^. ikinci karakterden sonraki tüm metni. bu durumda da metinde yer alan ikinci karakteri yazdırabilirsiniz. begin inc(katar.caption:=katar^.Button16Click(Sender: TObject). //adresi bir artır Label1. Const katar:PChar='Nihat Demirli'.Button16Click(Sender: TObject). procedure TForm1.gösterilmesini. //adresi üç artır Label1. Görüldüğü gibi katar değişkeninin inc() fonksiyonuyla kullanılması adres değerinin bir artırılmasına sebebiyet vermektedir. procedure TForm1. bulunduğu gözdeki değeri yazdırmak isterseniz (katar^) ikinci karakteri yazdırabilirsiniz. Bu konumda tüm katarı yazdırmaya kalkarsanız. //Sadece “i” yazar end.

Const katar:PChar='Nihat Demirli'. //adresi iki artır Label1. begin inc(katar). Örneğimizde katar değişken tanımlanmış olup. Fakat bir süre sonra yazının ekrandan kaybolduğunu göreceksiniz.caption:=katar.Caption:=katar. procedure TForm1.Button17Click(Sender: TObject). //Sadece "hat Demirli" yazar end. Buna da kontrol koymak isterseniz. 245 . //bir sonraki karakteri göster Form1. aşağıdaki örneği inceleyelim.//sonraki göz değerlerini yaz end.Timer2Timer(Sender: TObject). kodunuzu aşağıdaki gibi değiştirmelisiniz.2).procedure TForm1. Şimdi konuyu pekiştirmek amaçlı. Bu şekilde başlıkta kayan yazı oluşturabilirsiniz. begin inc(katar. Var katar:PChar='Nihat Demirli'. karakterler arası geçiş yaparak formun başlığında kayan yazı oluşturulmaktadır.

Char tipli bir dizi değişkene “StrCopy” fonksiyonu kullanılarak AnsiString bir değer atanabilir.13] of Char='Nihat Demirli'. var kat:Array[0. Aşağıdaki şekilde yapacağınız bir atamanın yanlış olduğunu belirtmek isterim.. //doğru bir atama Yukarıdaki tanımlamadan sonra 14 elemandan oluşan “kat” isminde char tipli dizi değişken tanımlanmıştır.Text). Aşağıda bu husus örneklendirilmiştir.. Yapılan atama sonucunda da dizinin her elemanı sırasıyla metindeki bir karakteri içeriğine almıştır.Button19Click(Sender: TObject). Aşağıda bu husus örneklendirilmiştir.5] of Char.5] of Char. 246 . //Hatalı bir atamadır Şayet katar dizi değişkene AnsiString tipte bir değişkenin değerini aktarmak isterseniz. begin kat:=Pchar(Edit1. Const kat:Array[0. var kat:Array[0.// "t" yazar end.. Katar dizi değişkene aşağıdaki şekilde atama yapabilirsiniz. procedure TForm1. procedure TForm1.13] of Char='Nihat Demirli'.Button18Click(Sender: TObject).Katarları Char Tipli Dizi Değişken Olarak Tanımlamak: Katarları char tipli dizi değişken şeklinde de tanımlayabilirsiniz. begin kat:='Nihat'. o zaman kodunuz aşağıdaki şekilde olmalıdır. Const kat:Array[0. end.Caption:=kat[4].//Doğru bir atamadır hata vermez.. begin label1.

Text). var kat:Array[0. StrCopy(kat..Text)).Pchar(Edit1.Button22Click(Sender: TObject). //Editte kaç karakter var SetLength(kat. procedure TForm1.. begin adet:=Length(Edit1. //katar diziyi boyutlandır.Pchar(Edit1. Bir çoğunuz. StrCopy(kat.10] of char.Button20Click(Sender: TObject).Caption:=kat[3].Caption:=kat[2].//katar dizi eleman değerlerini belirle Label1.Text)). veya procedure TForm1. //Bu atama hata verecektir. Ama buna gerek olmadığını.5] of Char. var deger:AnsiString. peki katarlar dinamik dizilerle nasıl kullanılabilir diye sorabilirsiniz. kat:Array[0. // Edit kutusundaki üçüncü karakteri yaz end. 247 .adet). adet:Integer. Delphi sizleri hata mesajıyla uyaracak. ilk kısımda yapılan işlemin atanan değere göre dinamik bir boyutlandırma olduğunu dikkatli ve bilinçli olanlarınızın anlayacağını umuyorum. Bu mantıkla aşağıdaki şekilde yapılabilecek olan bir atama kesinlikle hatalı olacaktır. Hatırlatalım. programınız kırılacaktır.// dördüncü karakter olan "s" yazar end. var kat:Array of Char. begin deger:='Prestige'. Label1. end.procedure TForm1. begin strCopy(kat.Button21Click(Sender: TObject). katar dizi değişkenine aktardığınız değişkenin içeriğindeki karakter sayısı dizi değişkenin eleman sayısından fazla olursa.Pchar(deger)).

248 .

BÖLÜM 11 DLL DOSYALARI OLUŞTURMAK 249 .

250 .

“Dll” dosyalarını “exe” uzantılı dosyalardan ayıran temel fark “exe” lerin kendi başlarına çalıştırılabilmelerine karşın. Bu tip durumları engellemek için başvurduğumuz en temel yol “Dll” dosyaları oluşturmaktan geçmektedir. programcılıkta son derece önem arz etmektedir. Delphi seçeneklerinin bulunduğu “New Items” penceresine ulaşabilirsiniz. ayrıca karmaşaya yol açacaktır. Sebebine gelince.lerin topluca yazıldığı bölüm olarak da adlandırılabilir. ilerisi için çok büyük kolaylık olacağı aşikardır. prosedür. aynı kodları farklı farklı yerlere yazmak programınızın gereksiz yere şişmesine. “Dll” dosyası oluşturmak için aşağıdaki adımları izleyiniz. “Dll” dosyanızı oluşturabileceğiniz aşağıdaki pencerenin açılmasını sağlayabilirsiniz. Tüm uygulamalar. Dll dosyalarının yeri. Windows işletim sistemine ait “Dll” dosyaları “C++” dili ile yazılmıştır. bu “Dll” dosyalarından faydalanabilmektedir.DLL Ne İşe Yarar: Dll dosyaları Windows un kütüphane işlemleri için kullandığı dosyalardır. 251 . Siz de en çok kullandığınız fonksiyon veya prosedür tanımlamalarını “Dll” dosyaları içerisinde oluşturursanız. özellik vs. uygulama Bu pencerede “DLL Wizard” seçeneğini seçerek “OK” buttonuna tıklarsanız. “Dll” dosyaları fonksiyon. “File->New->Other” adımlarını izledikten sonra. “Dll” dosyalarının muhakkak dışarıdan bir ateşleyiciye ihtiyaç duymalarıdır.

onları kullanmak mümkün olacaktır. Bu bildiriyi eklemezseniz.Açılan pencere “Library Project2” ismiyle oluşacaktır. “Dll” dosyanızı kaydettiğinizde “dpr-cfg-dof-dpr-res” uzantısına sahip 5 adet (daha fazla da olabilirdi) dosya oluşturacaktır. “dll” uzantılı ismi projenizin ismiyle aynı olan bir “Dll” dosyası daha oluşturacaktır (Dll dosyanızı yapacağınız değişikliklerden sonra muhakkak Compile ediniz). 252 . Uygulamanızın kullanacağı fonksiyon veya prosedürlere bu dosya sayesinde ulaşmak. “Dll” dosyaları içerisinde programdan parametre gönderilebilecek olan prosedür veya fonksiyonlar “export” bildirisi yapılarak tanımlanırlar. Kaydettikten sonra “Project->Compile All Project” adımlarını izleyerek “Dll” dosyanızı Compile ederseniz. programdan bu “Dll” dosyasını çağıramazsınız.

external 'project2. end. yeni bir Exe uygulaması başlatın. Aşağıdaki prosedürü “Dll” dosyanız içerisinde oluşturup.Son adım olarak dışarıdan çağrılacak methodların tamamını “Exports” listesi halinde “Dll” dosyasının altına eklemelisiniz. mesaj(metin).//ekleyin procedure TForm1. //prosedür işletiliyor. 253 . pencerenize dahil etmelisiniz. Dll İçerisindeki Prosedüre Programdan Ulaşmak: “Exe” uygulamanızda “Dll” dosyasında “export” ile tanımlanmış olan methodları kullanabilmeniz için. var //Değişken bloğu begin //Gerekli olan kodlar. procedure mesaj(x:AnsiString). Dll İçerisinde Prosedür Oluşturmak: Oluşturacağınız “Dll” dosyalarının sonuçlarını ancak Standart Delphi projesinden çalıştırarak görebilirsiniz.far.dll'.Button1Click(Sender: TObject).

Diğer hususlar tamamen normal bir fonksiyon tanımlama işlemiyle aynı olacaktır. muhakkak “export” bildirisiyle “Dll” dosyasına bildirilmelidir.export. Yine aynı şekilde programdan çağrılabilecek olan fonksiyonlar. function faktor(x:Integer):Extended. 254 .Aşağıda “Dll” dosyası içerisindeki prosedürü işletebilmek için kullanılacak olan tüm kod satırları verilmiştir. Dll içerisindeki prosedürü işletmek Unit içerisinde tanımlanmış olan prosedürü işletmekten hiç de farklı değildir. Dikkat edeceğiniz değişik olan tek şey prosedür bildirisinin projeye ekleniş şekli olmalıdır. Fonksiyonu ekledikten sonra “Project->Compile All Project” adımlarını izleyerek uygulamanızı son değişiklikleriyle Compile etmelisiniz. izleyeceğiniz adımlar tamamen aynı olacaktır. Aynı Dll dosyası içerisinde aşağıdaki adımları izleyerek fonksiyon tanımlayabilirsiniz. “far.//Programdan çağır var //Lokal değişkenler begin //İşletilecek olan kodlar Result:=geriye dönecek olan değer end. Dll İçerisinde Fonksiyon Oluşturmak: Dll dosyalarında prosedür tanımlamaları gibi benzer mantıkla fonksiyon tanımlamaları da yapılabilmektedir.External ‘dll_adi’” bildirisi burada oldukça önem arz etmektedir.

Aşağıda programa ekleyeceğiniz tüm kod satırları verilmiştir. “Dll” dosyasına prosedür ve fonksiyon eklenmiş son hal gösterilmiştir.Aşağıdaki pencerede. function faktor(x:Integer):Extended. Dll İçerisindeki Fonksiyona Programdan Erişmek: Dll dosyası içerisindeki fonksiyonu programdan çağırabilmek için aynı şekilde Unit bloğunda tanımlamasını yapmalısınız.external 'project2. 255 .far.dll' //Dll dosyası içerisindeki fonksiyon tanımlandı Bu adımdan sonra herhangi bir yordamdan fonksiyonunuzu çağırabilirsiniz.

Aşağıdaki form tasarımını oluşturun. Daha sonra bu “Dll” dosyasını kullanarak. Ardından “File->New->Other->Dll uygulamanızı başlatın. Bunlardan birincisi. daha önce değinmiş olsamda hatırlatmak istediğim iki husus var.Bu arada. Bu kısımda daha fazla hoşunuza gidecek bir uygulama yapmak istiyorum. İkincisi ise “Dll” dosyanızı. Amacımız Windows ta bulunan “Start->Run” seçeneklerini yaptırabilecek bir “Dll” dosyası oluşturmaktır. 256 Wizrd” adımlarını izleyerek “Dll” . uygulamanızla “Dll” dosyanızın aynı klasörün içerisinde olması gerektiğidir. her değişiklik yaptığınız zaman muhakkak “Project->Compile All Project” adımlarını izleyerek Compile ediniz. Edit kutusuna gireceğimiz yoldaki “exe” uygulamasını çalıştırmayı sağlamak olacaktır.

button kontrolüne tıklayınız. Edit kutusuna yazdığınız adresteki exe programını kolaylıkla çalıştırabileceksiniz. Programı çalıştırdıktan sonra Edit kutusuna çalıştıracağınız dosyanın yolunu yazıp. 257 . Şimdi de uygulamanıza ekleyeceğiniz aşağıdaki kodlar sayesinde.Aşağıdaki kod satırlarını “Dll” uygulama pencerenize ekleyiniz.

Button kontrolüne tıklandıktan sonra Edit kutusunda “c:\winnt\system32\notepad. yer alan 258 .exe” uygulaması çalıştırılmaktadır.

BÖLÜM 12 DELPHI FONKSİYONLARI 259 .

260 .

uses Windows. procedure TForm1.Fonksiyonlara Giriş: Delphi içerisinde. Şimdi Delphi kütüphanesinde yer olan bu fonksiyonları teker teker incelemeye başlayalım. Parametre pozitif ise sayının değerini değiştirmeyecektir. Bu fonksiyonları çalıştırabilmeniz için “math” kütüphanesini “uses” satırına eklemeniz gerekmektedir. var sayi:Real.Graphics. StdCtrls. Controls. Abs(ondalıklı_sayı): Tanımlama: function Abs(X). //pozitife çevir Form1.Caption:=FloatToStr(sonuc). SysUtils. Fonksiyona gönderilen parametre tam sayı veya reel sayı tipli olabilir. tam sayıları kapsadığı (dijit kaybı olmadığı için) unutulmamalıdır. //Eklemeyi unutmayınız. math.Classes.Text). Forms. Matematiksel fonksiyonları kullanırken ondalıklı sayıların. Aynı mantıkla geriye döndürdüğü sayının tipi de yine tam sayı veya ondalıklı sayı olabilecektir. Parametre olarak girilen (parantez içerisindeki değer parametre olarak adlandırılmaktadır) reel sayının pozitif değerini hesaplamak için kullanılır. Messages. Matematiksel Fonksiyonlar: Aritmetik işlem yapabilmek için kütüphaneye eklenmiş fonksiyonlardır. Variants. begin sayi:=StrToFloat(Edit1. Eğer negatif ise o zaman pozitif değerini geriye döndürecektir. kolay uygulama geliştirme amaçlı kullanabileceğiniz bir çok method ve özellik bulunmaktadır. end.Dialogs. sonuc:=abs(sayi).Button1Click(Sender: TObject). Bu methodlar sizleri yazmanız gereken bir çok sıkıcı koddan kurtarmaya yönelik olarak eklenmiştir. 261 . sonuc:Real.

Aşağıdaki şekilde de kullanılabilir.Caption:=IntToStr(sonuc). “Ceil” fonksiyonu. sonuc:Integer. procedure TForm1. 262 . Yani parametre olarak girilen ondalıklı sayıyı. //Ondalıklı sayıyı üste yuvarla Form1. begin sayi:=125. Parametre olarak girilen ondalıklı sayıyı bir üst tam sayıya yuvarlatarak geriye döndürür. Bu fonksiyon “Ceil” fonksiyonunun yaptığı işlevin tam tersini yapar.Button3Click(Sender: TObject). sonuc:=Ceil(sayi). //Editeki değeri bir üst tam sayıya yuvarla Form1.Text). end.Caption:=IntToStr(sonuc).// 126 yazar end. Tanımlama: function Floor(const X: Extended): Integer. var sayi:Real. var sayi:Real. Dönen sayının tipi tam sayı olduğu için “IntToStr” tip dönüştürme fonksiyonu sayesinde kolayca yazdırılabilir. begin sayi:=StrToFloat(Edit1. sonuc:Integer.2. sonuc:=Ceil(sayi).Ceil(ondalıklı_sayı): Tanımlama: function Ceil(const X: Extended):Integer. Sayının negatif veya pozitif olması önem arz etmez.8 i -3 olarak döndürecektir). Floor(ondalıklı_sayı).Button2Click(Sender: TObject). sayıda yer alan ondalıklı kısma bakmadan bir üst tam sayıya yuvarlamak için kullanılır. virgülden sonraki kısmın büyüklüğüne bakmadan bir alt tam sayıya yuvarlayacaktır. Her zaman bir alt tam sayıya yuvarlama yapacaktır (-2. procedure TForm1.

Caption:=IntToStr(sonuc). begin sayi:=125.1. begin sayi:=125. //Bir alt tam sayıya indir. “Floor” fonksiyonu. var sayi:Real.Caption:=IntToStr(sonuc). begin sayi:=-125.Button5Click(Sender: TObject). sonuc:=Floor(sayi). Form1.9. Tanımlama: function Trunc(X: Extended): Int64.// 125 yazar end.Button4Click(Sender: TObject). procedure TForm1.9. Negatif tamsayılara örnek yapacak olursak: procedure TForm1. sonuc:Integer.// 125 yazar end. sonuc:Integer. //sadece tam kısmını göster Form1. var sayi:Real. sayıda yer alan ondalıklı kısma bakmadan bir alt tam sayıya yuvarlamak için kullanılır.procedure TForm1. Form1. Trunc(ondalıklı_sayı). sonuc:=Floor(sayi).Caption:=IntToStr(sonuc).// -126 yazar end. sonuc:=Trunc(sayi). sonuc:Integer. Parametre olarak girilen ondalıklı sayının tam kısmını döndüren matematiksel bir fonksiyondur. var sayi:Real.Button4Click(Sender: TObject). 263 .

sonuc:Extended. Negatif sayılar içinde kolaylıkla kullanılabilir (-125. geriye dönen değerin tipinin ondalıklı bir sayı (Extended) olduğunu görürsünüz. var sayi:Integer. begin sayi:=2.Caption:=FloatToStr(sonuc). Fonksiyondan geriye dönen değer ondalıklı bir sayı tipi olduğu için “FloatToStr” fonksiyonu ile kolayca değerini yazdırabilirsiniz. Parametre olarak girilen sayıyı “e” (22/7) nin üssü olarak kabul eder ve kuvvetini alır (şayet 2 girilirse e sayısının karesi alınır). Frac(Ondalıklı_sayı): Tanımlama: function Frac(X: Extended): Extended. Parametre olarak girilen değerin ondalıklı kısmını hasaplayan bir fonksiyondur. Tanımlamaya dikkat edecek olursanız. //ondalıklı kısmı al Form1. //isterseniz bir kontrolden değer aktarabilirsiniz. sonuc:=Exp(sayi). var sayi:Real. procedure TForm1.Caption:=FloatToStr(sonuc). sonuc:=Frac(sayi). //e nin karesini bul Form1.“Trunc” fonksiyonunda herhangi bir yuvarlatma söz konusu değildir.9 u -125 olarak hesaplar). Exp(ondalıklı_sayı): Tanımlama: function Exp(X: Real): Real.756 yazar end.Button7Click(Sender: TObject).// 7. sonuc:Extended.// 0.756.Button6Click(Sender: TObject). procedure TForm1.389 yazar end. Geriye dönen değerin tipinin tam sayı olduğunu fonksiyon tanımlamasından kolayca çıkarabilirsiniz. begin sayi:=125. 264 .

2). begin sayi:=5.tam_sayı): Tanımlama: function IntPower(const Base: Extended. Tekrar hatırlatmakta yarar görüyorum. sonuc:=IntPower(sayi. İkinci parametre olarak sadece tam sayı değeri girebilirsiniz. //değeri kontroldende aldırabilirsiniz sonuc:=Int(sayi). const Exponent: Integer): Extended register.Caption:=FloatToStr(sonuc).Button8Click(Sender: TObject). IntPower(ondalıklı_sayı. sonuc:Real.2. var sayi:Real. //e nin karesini bul Form1.Caption:=FloatToStr(sonuc). Bu yüzden yazdırmak için “FloatToStr” fonksiyonundan faydalanmalısınız.Int(Ondalıklı_sayı): Tanımlama: function Int(X: Extended): Extended. Birinci parametre olarak girilen ondalıklı sayının.// 27. 265 . bu fonksiyondan geriye dönen sayının tipi ondalıklı sayı tipidir. var sayi:Real. ikinci parametreyle girilen kuvvetini hesaplamak için kullanılır.85. begin sayi:=-120. procedure TForm1. sonuc:Extended. procedure TForm1. //-120 yazar end. //tam kısmını al Form1. “IntToStr” tip dönüştürme fonksiyonu hata verecektir.04 yazar end. Parametre olarak girilen değerin tam kısmını reel sayı olarak döndüren bir fonksiyondur.Button9Click(Sender: TObject). Sonucu herhangi bir kontrolde yazdırmak için “FloatToStr” tip dönüştürme fonksiyonunu kullanmalısınız.

var sayi:Real. sonuc:Real. //2 yazar end. var sayi:Real. unutmayın) sayının “e” tabanında logaritmasını almak için kullanılır.302 yazar end.“IntPower” fonksiyonundan geriye dönen sayının tipi ondalıklı olmaktadır. Form1. sonuc:Real. Fonksiyondan geriye dönen değer ondalıklı sayı tipli olduğu için “FloatToStr” fonksiyonu kullanılarak yazdırılabilir. Parametre olarak girilen ondalıklı (ondalıklı sayılar tam sayıları kapsarlar.Caption:=FloatToStr(sonuc). sonuc:=Ln(sayi). Ln(ondalıklı_sayı): Tanımlama: function Ln(X: Real): Real. //2. sonuc:=Log10(sayi).Button11Click(Sender: TObject).Caption:=FloatToStr(sonuc). Fonksiyondan geriye yine bir ondalıklı sayı döner. // logesayi demektir Form1. begin sayi:=100. procedure TForm1. procedure TForm1. Parametre olarak girilen değişkenin “10” tabanına göre logaritmasını almak için kullanılır. Log10(ondalıklı_sayı): Tanımlama: function Log10(const X: Extended): Extended. begin sayi:=10. 266 .Button10Click(Sender: TObject). Bu yüzden kontrol üzerinde yazdırabilmek için “FloatToStr” fonksiyonundan faydalanmalısınız.

ondalıklı sayı tipinde olduğu için sonuç “FloatToStr” tip dönüştürme fonksiyonu kullanılarak yazdırılabilir. X: Extended): Extended. sonuc:=Log2(sayi). procedure TForm1.Caption:=FloatToStr(sonuc).Button12Click(Sender: TObject). Birinci parametreyle verilen tabana göre. sonuc:Real. sonuc:=LogN(3.ondalıklı_sayı2): Tanımlama: function LogN(const Base. // Log28 Form1. //Log39 Form1. sonuc:Real. procedure TForm1. //3 yazar end. Parametre olarak girilen değerin “2” tabanında logaritmasını hesaplayan bir fonksiyondur. 267 .Button13Click(Sender: TObject). Fonksiyondan geriye dönen değer. LogN(Ondalıklı_sayı.Caption:=FloatToStr(sonuc).sayi). begin sayi:=9.Fonksiyondan geriye dönen değer ondalıklı sayı tipinde olduğu için “FlostToStr” fonksiyonu sayesinde yazdırılabilir. var sayi:Real. Fonksiyondan geriye dönen değer. Log2(ondalıklı_sayı): Tanımlama: function Log2(const X: Extended): Extended. begin sayi:=8. var sayi:Real. //2 yazar end. ikinci parametreyle verilen değişkenin logaritmasını hesaplar. ondalıklı sayı tipinde olduğu için “FloatToStr” tip dönüştürme fonksiyonu sayesinde yazdırılabilir.

Single): Single. sonuc:=Max(ilk. Extended): Extended. Parametre olarak ondalıklı sayıda kullanabilirsiniz.ondalıklı_sayı2): function function function function function Min(A. //25 yazar end. Double): Double.son:Integer. Tanımlama: Parametre olarak girilen ondalıklı (veya tam sayı) sayıların en büyüğünü hesaplayan bir fonksiyondur. overload. Int64): Int64. overload.son:Integer.Button14Click(Sender: TObject). Yani elinizdeki üç sayının en küçüğünü bu fonksiyonla hesaplatamazsınız (dolaylı olarak olabilir).B: Integer): Integer. son:=5.B: Int64): Int64.B: Extended): Extended. overload. Dikkat edeceğiniz husus fonksiyonun sadece iki parametre aldığıdır.Caption:=IntToStr(sonuc). procedure TForm1. Dikkat edeceğiniz husus fonksiyonun sadece iki parametre aldığıdır.B: Double): Double.ondalıklı_sayı2): function function function function function Max(A. overload.B: Max(A. begin ilk:=25. overload.B: Max(A.B: Single): Single. sonuc:Integer. Min (A. var ilk. Min(ondalıklı_sayı. 268 . overload. //Büyük olanını bul Form1. var ilk. Yani elinizdeki üç sayının en büyüğünü bu fonksiyonla hesaplatamazsınız (dolaylı olarak olabilir). Tanımlama: Parametre olarak girilen ondalıklı (veya tam sayı) sayıların en küçüğünü hesaplayan bir fonksiyondur. overload. Min (A. overload.Button14Click(Sender: TObject).B: Integer): Integer. overload. overload.B: Max(A. Min (A. procedure TForm1.son).B: Max(A.Max(ondalıklı_sayı. Min (A. begin ilk:=25. sonuc:Integer.

Tam_sayı2. daireye ait alan ve çevre hesaplamalarını kolaylıkla yaptırabilirsiniz. Aşağıda “pi” fonksiyonuna ait örneklendirme yapılmıştır. üçüncü parametreye bölen matematiksel bir fonksiyondur.adet. var sayi.adet.son). Fonksiyondan geriye dönen değer tamsayı tipli olduğu için. Fonksiyondan geriye dönen değerin tipi tam sayı olduğu için. tip dönüştürme işlemini “IntToStr” fonksiyonuyla gerçekleştirebilirsiniz. “3. sonuc:=Min(ilk. Denominator: Integer): Integer.sonuc:Integer. Numerator. İlk iki parametreyle verilen tamsayıları çarpıp.Tam_sayı3): Tanımlama: function MulDiv(Number. begin sayi:=10.1415926535897932385” sayısına eşit olan bu fonksiyon sayesinde. procedure TForm1. 269 .Button16Click(Sender: TObject). Fonksiyon ondalıklı bir sayı barındırdığı için “FloatToStr” fonksiyonu kullanılarak tip dönüşüm işlemleri uygulanmalıdır.bol.Caption:=IntToStr(sonuc). adet:=2.bol). Muldiv(Tam_sayı.son:=5. Matematikte kullanılan “pi” sayısının değerini içerisinde tutabilen bir fonksiyondur. sonuç ondalıklı olarak çıkarsa aşağı veya yukarı tam sayıya yuvarlama işlemi yapacaktır. //5 yazar end.Caption:=IntToStr(sonuc). //Küçük olanını bul Form1. sonuc:=MulDiv(sayi. Parametre olarak ondalıklı sayıda kullanabilirsiniz. Pi: Tanımlama: function Pi: Extended. //7 yazar end. // 10*2/3 Form1. bol:=3.

katsayilar).i:Integer. Birinci parametre polinom fonksiyondaki değişkenin değeri. begin yaricap:=10.'')). begin deger:=StrToInt(InputBox('Hangi Değer İçin'.procedure TForm1. end. var yaricap:Integer.'')).'Değer'. var katsayilar:Array of Double. SetLength(katsayilar.Caption:='Polinomun Sonucu=' + FloatToStr(sonuc). derece.Button17Click(Sender: TObject). ShowMessage('Daire Alanı=' + FloatToStr(alan) + #13#10 + 'Dairenin Çevresi='+FloatToStr(cevre)). 'Derece'. Pencerede dairenin alanı ile çevresi hesaplanarak bildirilmektedir. derece:=StrToInt(InputBox('Poinom Kaçıncı Dereceden'.derece+1). deger:Integer.'Katsayı’.Button18Click(Sender: TObject).sonuc:Extended.’’)) sonuc:=Poly(deger. //Boyutla for i:=low(katsayilar) to high(katsayilar) do katsayilar[i]:=StrToInt(InputBox(IntToStr(i)+ './/Polinomu hesapla Form1.// #13#10 alt satıra inmek için kullanıldı end.alan:Double. ikinci parametre ise polinom fonksiyonda kullanılacak olan katsayıların değerlerini tutacak olan dizi değişkenden ibarettir. procedure TForm1. cevre:=2*pi*yaricap. 270 . const Coefficients: array of Double): Extended. Poly(ondalıklı_sayı.dizi_değişken): Tanımlama: function Poly(const X: Extended. cevre. Programınızda polinom fonksiyon sonuçlarını hesaplamak için kullanılır. // çecre=2*pi*r alan:=pi*yaricap*yaricap.ci Katsayıyı Giriniz'. Programı çalıştırıp button kontrolüne tıklarsanız aşağıdaki pencere ile karşılaşırsınız.

Button19Click(Sender: TObject). Ondalıklı kısımdaki ilk rakam “5” veya daha büyükse üste.Fonksiyonu kullanırken dizi değişkeninizi ondalıklı sayı tanımlamaya dikkat ediniz. sonuc:Extended.2 . us:=3. Fonksiyondan geriye dönen değer ondalıklı sayı olacağı için sonucu “FloatToStr” fonksiyonu ile yazdırabilirsiniz. 271 . //4*4*4=64 yazar. begin taban:=4. Round(ondalıklı_sayı): Tanımlama: function Round(X: Extended): Int64.4 ün 5. Parametre ile girilen reel sayıyı ondalıklı kısımdaki değere göre.us:Double. kontrol içerisinde yazdırmak için “IntToStr” fonksiyonunu kullanmanız yeterli olacaktır. Üs almak için Delphi’de kullanılan fonksiyondur.ci kuvvetini de hesaplayabilir). ikinci parametreyle verilen kuvvetini hesaplar. Fonksiyondan geriye dönen değer ondalıklı sayı olduğu için sonucu yazdırmak için “FloatToStr” fonksiyonunu kullanmalısınız. sonuc:=Power(taban. procedure TForm1. Exponent: Extended): Extended. Fonksiyondan geriye dönen değer tam sayı tipli olacağı için. Taban ve üs değerleri ondalıklı sayıda olabilir (yani 2. daha küçükse de alta yuvarlayacaktır. bir üst veya bir alt tam sayıya yuvarlamak için kullanılan bir fonksiyondur. Programı çalıştırdıktan sonra polinomda kullanılan (y=ax2+bx) “x” değişkeninin değerini girmeniz istenecektir.Caption:=FloatToStr(sonuc). end. Dikkatlice incelemeye devam ediniz. Aşağıda Round() fonksiyonu kullanılarak örnek geliştirilmiştir. var taban.us).ondalıklı_sayı2): Tanımlama: function Power(const Base. //üs al Form1. Birinci parametreyle verilen ondalıklı sayının. Power(ondalıklı_sayı. Ardından polinom fonksiyonunuzun kaçıncı dereceden olduğunu ve katsayılarını sırasıyla (olmayan bir katsayı için “0” girmelisiniz) girmenizi isteyecektir.

RoundTo(ondalıklı_sayı. const ADigit: TRoundToRange): Double. Ondalıklı kısımdan gösterilecek olan en son rakamdan bir sonraki rakama göre büyüğe veya küçüğe yuvarlatma yine yapılacaktır.47 yazar end. 272 . Round fonksiyonu kriter olarak ondalıklı kısımdaki ilk rakamı kullanmaktadır. Şayet “5” ten büyükse üst tam sayıya yuvarlama işlemi yapacaktır. //ondalıklı kısımdan 2 rakam Form1. • Eğer ikinci parametre Pozitif Sayı İse: Bu durumda tam kısmın en sonundan başlayarak.Caption:=FloatToStr(sonuc). sonuc:Extended. sonuc:=Round(deger).Button21Click(Sender: TObject). sonuc:Extended. var deger:Extended.465. ikinci parametreyle belirtilen değer kadar “0” eklenir.procedure TForm1. • Eğer ikinci parametre Negatif Sayı İse: Bu durumda ondalıklı kısımdan gösterilecek olan rakam sayısı belirlenebilir. sonuc:=RoundTo(deger. RoundTo fonksiyonunun bir kaç kullanım mantığı vardır.-2). begin deger:=10. aşağıdaki örnekleri dikkatlice inceleyiniz.Button20Click(Sender: TObject).Caption:=FloatToStr(sonuc).465. Sonuçta yine üste veya alta yuvarlatma işlemi uygulanacaktır. //alta veya üste yuvarla Form1. //10yazar end. //1001. var deger:Extended.tam_sayı): Tanımlama: function RoundTo(const AValue: Double. procedure TForm1. begin deger:=1001.

var deger:Extended. function Sign(const AValue: Integer): TValueSign. Eğer sayı sıfırdan küçükse “-1”. küçükse bir alta yuvarla denilmek istenmektedir. begin deger:=1591. 1. //1000 yazar end. Parametreyle girilen değerin pozitif. Sayının çok büyük veya küçük olması bu durumu değiştirmemektedir. //ondalıklı kısımdan 2 rakam Form1.465. 273 . ama yeterince örnek çözerseniz mantığına alışacaksınız sanırım. overload. aynı zamanda en son “0” yapılan rakam “5” den büyükse bir üste. Biraz değişik gelebilir. sonuc:=RoundTo(deger.procedure TForm1.3).Button22Click(Sender: TObject).3). Aşağıda bu husus örneklendirilmiştir. büyükse “+1” sıfıra eşitse “0” değerini döndürecektir. sonuc:Extended.Caption:=FloatToStr(sonuc). begin deger:=1491. Üstteki örnekte sağdan üç rakamı “0” yapınız. sıfır veya negatif olduğunu gösterebilen bir fonksiyondur.Caption:=FloatToStr(sonuc). //2000 yazar end. var deger:Extended. Başka bir örnek: procedure TForm1. overload. sonuc:Extended. “Sign” fonksiyonundan geriye dönen değer “0. Sign(ondalıklı_sayı): Tanımlama: function Sign(const AValue: Double): TValueSign.465. function Sign(const AValue: Int64): TValueSign. //ondalıklı kısımdan 2 rakam Form1. sonuc:=RoundTo(deger. -1” rakamlarından bir tanesi olacaktır.Button22Click(Sender: TObject). overload.

6543. Yazılan kodlamada açıklanacak bir şey olmadığı (her şey açık zaten) için açıklama satırlarına gerek görülmemiştir.653 Sonuç Sqr(ondalıklı_sayı): Tanımlama: function Sqr(X: Extended): Extended. sonuc:=Sign(ilk). var ilk:Double. begin ilk:=StrToFloat(Edit1.6543. Aşağıda bu husus örneklendirilmiştir.-3) 1254.-2) 1254.tam_sayı): Tanımlama: function SimpleRoundTo(const AValue: Double. Aşağıdaki sonuçları yapacağınız örnekle kıyaslayınız. 274 .procedure TForm1. if sonuc=1 then ShowMessage('Sayı Pozitif') else if sonuc=-1 then ShowMessage('Sayı Negatif') else if sonuc=0 then //sadece else de yeterliydi ShowMessage('Sayı Sıfır').Text).6543. Tam sayılar için kullanılabileceği gibi ondalıklı sayılar içinde sonucu hesaplayabilmektedir.1) 2000 SimpleRoundTo(1254.Button23Click(Sender: TObject). const ADigit: TSimpleRoundToRange = -2): Double. Parametreyle girilen sayının karesini hesaplayabilen bir Delphi fonksiyonudur. end. SimpleRoundTo(ondalıklı_sayı. Uygulama: SimpleRoundTo(1254. Aralarındaki tek fark “SimpleRoundTo” fonksiyonunda yuvarlatma işlemi uygulanmayacağıdır. Çalışma mantığı daha önce izah edilen “RoundTo” fonksiyonuna çok benzemektedir.65 SimpleRoundTo(1254. sonuc:Integer.

begin sayi:=100. //karekökünü hesapla Form1. Bu fonksiyondan geriye ondalıklı bir sayı döneceği için sonucu yazdırmak için “FloatToStr” fonksiyonunu kullanmalısınız. İkinci parametrenin opsiyonel olduğunu belirtmek isterim. Aşağıda bu husus örneklendirilmiştir. Method birinci parametreyle girilen değişkenin (tam sayı olmak zorundadır) değerini ikinci parametre kadar (ikinci değişkende tam sayı olmak zorundadır) artıracaktır. begin sayi:=100. Inc(tam_sayı.Button25Click(Sender: TObject). Sqrt(ondalıklı_sayı): Tanımlama: function Sqrt(X: Extended): Extended.04 yazar end. //10 yazar end. N: Longint ] ). //karesini hesapla Form1. ama burada vermeyi uygun gördüm. Parametrenin tamsayı veya ondalıklı sayı olması önem arz etmemektedir. var sayi. //10040.Caption:=FloatToStr(sonuc). şayet verilmezse artım değeri bir “1” olarak alınacaktır.procedure TForm1.2.Button26Click(Sender: TObject).tam_sayı2): Tanımlama: procedure Inc(var X [ .sonuc:Double.Caption:=FloatToStr(sonuc). 275 . Şayet kullanılan parametrenin tipi tam sayı ise bu durumda sonucu daha hızlı hesaplayacaktır. sonuc:=Sqrt(sayi). var sayi. procedure TForm1. sonuc:=Sqr(sayi). Parametreyle girilen ondalıklı sayının karakökünü hesaplayan bir fonksiyondur.sonuc:Double. Bu bir fonksiyon değil (prosedür).

Dec(deger. var deger:Integer.Button27Click(Sender: TObject).Button28Click(Sender: TObject).11).tamsayı2): Tanımlama: procedure Dec(var X[ .Caption:=IntToStr(deger). N: Longint]). procedure TForm1. 276 .1). //99 yazar end. begin deger:=99.Button27Click(Sender: TObject). şayet verilmezse azalma değeri bir “1” olarak alınacaktır. Method birinci parametreyle girilen değişkenin (tam sayı olmak zorundadır) değerini ikinci parametre kadar (ikinci değişkende tam sayı olmak zorundadır) azaltacaktır.Caption:=IntToStr(deger). //değişkenin değerini bir artır Form1.Caption:=IntToStr(deger). begin deger:=100. //100 yazar end. Başka bir örneklendirme yapalım. //değişkenin değerini onbir artır Form1. Aşağıda bu husus örneklendirilmiştir.procedure TForm1. inc(deger). procedure TForm1. İkinci parametrenin opsiyonel olduğunu belirtmek isterim. Eğer kullanmaya kalkarsanız Delphi sizi hata mesajıyla uyaracaktır. inc(deger. var deger:Integer. “Inc” methodunda ondalıklı sayı kullanamazsınız. begin deger:=99. var deger:Integer. Dec(tam_sayı. //110 yazar end. //değişkenin değerini onbir artır Form1.

var deger:Integer. var deger:Integer.Caption:=IntToStr(deger). begin deger:=19.Caption:=IntToStr(sonuc). sonuc:=deger mod 4.Başka bir örnek: procedure TForm1. //kalan ne Form1. “Dec” prosedürü de sadece tamsayı değerler için kullanıldığından ondalıklı sayılar için denerseniz programınız kırılacaktır. Dec(deger. //4 kaç kere var Form1.// tam olarak 4 kere var end. sonuc:Integer. Mod: Dah önce izah edilmişti. //değişkenin değerini onbir artır Form1. begin deger:=19. Aşağıda örneklendirme işlemi yapılmıştır. //99 yazar end.Button29Click(Sender: TObject). procedure TForm1. Div: Bu da bir fonksiyon olmamakla beraber bu kısımda bulunmasında fayda görmekteyim. 277 . procedure TForm1. var deger:Integer. fakat bu bölümde bulunmasında fayda görüyorum.Button30Click(Sender: TObject). sonuc:Integer.// 3 yazar end. begin deger:=110.Button28Click(Sender: TObject). sonuc:=deger div 4. Matematiksel bölme işleminde tam bölüm değerini veren komuttur.11).Caption:=IntToStr(sonuc).

Yani sağdaki sayıyı 2 nin üssü olarak alacak solundaki sayıyla çarpacaktır (c++ da 3 bit sola ötele).Shl: Değişken değerlerinin iki sayısı veya kuvvetleriyle kolayca işlem yapılabilmesini sağlayan komuttur (C++ bilenler için “>>” ve “<<”). Başka bir örnek verelim. // 2^3*10=80 Form1. // 80 yazar end. “a:=10 shl 3” satırı “a:=10*23” ile aynı işi yapacaktır. begin deger:=20. Aşağıdaki örneklendirmeyi dikkatlice inceleyiniz. solunda belirtilen sayıyla. sonuc:Extended. Belirtilen üs değeri kadar bit sağa öteleme yapar da denilebilir. procedure TForm1.Caption:=FloatToStr(sonuc). Yaptığı işleme gelince. solunda belirtilen sayıyla. 278 . sağında belirtilen sayıyı ikinin kuvveti olarak kabul ederek çarpar. var deger:Integer. sağında belirtilen sayıyı ikinin kuvveti olarak kabul ederek böler. “Shl” komutunun yaptığı işlem şudur.Button31Click(Sender: TObject).Caption:=FloatToStr(sonuc). var deger:Integer.Button31Click(Sender: TObject). sonuc:Extended. Shr: Değişken değerlerinin iki sayısı veya kuvvetleriyle kolayca işlem yapılabilmesini sağlayan diğer bir komuttur (C++ bilenler için “>>” ve “<<”). Yaptığı işleme gelince. // 640 yazar end. procedure TForm1. sonuc:=deger shl 5. begin deger:=10. Aşağıdaki örneklendirmeyi dikkatlice inceleyiniz. sonuc:=deger shl 3. // 2^5*20=640 Form1.

sonuc:Extended. Öncelikle aşağıdaki tasarımı oluşturunuz. Programı oluşturabilmeniz için formunuza bir adet Edit kontrolü. 279 . // 5 yazar end. sonuc:=deger shr 2.Caption:=FloatToStr(sonuc). Yani sağındaki sayıyı ikinin kuvveti olarak kabul edecek. var deger:Integer. iki adet RadioButton kontrolü ve bir adet GroupBox yerleştirin. solundaki sayıya bölecektir.procedure TForm1. Şimdi ikilik Windows hesap makinesinde yer alan onluk düzenden ikilik düzene dönüştürme. // 20/2^2=5 Form1. Amacımız programı çalıştırdıktan sonra seçmiş olduğumuz satır düzenine göre. yeni değerin Edit kutusunda yer almasını sağlamak olacaktır. Kodları RadioButton kontrollerinin “OnClick” yordamlarına yazacağız. ikilik düzenden onluk düzene dönüştürme kodlarını beraberce oluşturalım. “sonuc:=deger shr 2” satırı “sonuc:=deger/(2^2)” ile aynı sonucu verecektir. begin deger:=20.Button32Click(Sender: TObject). Form açıldığı anda “Dec” isimli RadioButton kontrolünün işaretli gelmesi içinde “FormCreate” yordamına ufak bir kod satırı ekleyeceğiz. Kod satırları içerisinde “math” kütüphanesinde yer alan fonksiyonlardan (Length) kullanacağımız için “uses” satırına “math” ı eklemeyi unutmayınız.

Dialogs. Controls. Variants. Ardından “Bin” seçeneğini seçerek kodlarınızın sonuçlarını görebilirsiniz. StdCtrls. Graphics.Tüm kodlar aşağıda verilmiştir. //eklemeyi unutmayın Şimdi programı çalıştırıp Edit kutusuna sayısal bir değer girin. Forms.math. 280 . Messages. Classes. uses Windows. SysUtils.

aynı olduklarını göreceksiniz. Messages. StdCtrls.Şimdi “Bin” seçeneğine tıklarsanız Edit kontrolündeki değeriniz aşağıdaki şekilde oluşacaktır. Şimdi aynı örneği daha değişik bir yoldan çözmek istiyorum. Dialogs. SysUtils. Controls. math. uses Windows. Tekrar hatırlatalım “Length” fonksiyonu “math” içerisinde tanımlı olduğu için aşağıdaki gibi “uses” satırına eklenmesi gerekmektedir. //eklemeyi unutmayın 281 . Hakikaten sonuçları Windows hesap makinesinde kontrol ettirirseniz. Variants. Form tasarımınızı değiştirmeden. Unit pencerenizdeki kod satırlarını aşağıdaki hale çeviriniz. Classes. Forms. Graphics.

Tekrar “Dec” seçeneğini seçerseniz. ilk başta yazmış olduğunuz orjinal sayıya ulaşacaksınız. Daha sonrada “Bin” seçeneğine tıklayın sonucun ikilik düzende aynı Edit kutusu içerisinde gözükeceğini göreceksiniz. 282 .Tüm kodlar aşağıdaki pencerede verilmiştir. Yazılı olan tüm satırlarını anlamaya çalışınız. Programı çalıştırıp Edit kutusunun içerisine sayısal bir değer giriniz.

CompareDateTime(tarihsaat1.tarih2): Tanımlama: function CompareDate(const A.Text). B: TDateTime): TValueRelationship. Eşitlik durumunda yine geriye “0” değeri dönecektir. procedure TForm1. //tarih içerikli değişken tanımlanıyor begin tarih1:=StrToDate(Edit1. end.tarihsaat2): Tanımlama: function CompareDateTime(const A.tarih2)=0 then //iki tarih eşitse 0 döner ShowMessage('Girilen iki Tarih Eşit') else ShowMessage('Tarihler Eşit Değil').tarih2)=0 then ShowMessage('Girilen iki Tarih ve Saat Eşit') else ShowMessage('Tarihler Eşit Değil'). var tarih1. begin tarih1:=StrToDateTime(Edit1. Parametre olarak girilen iki değişkenin değerinin tarih ve zamanla beraber eşit olup olmadığını kontrol etmek için kullanılan bir fonksiyondur. Parametre olarak girilen iki tarihin eşit olup olmadığını kontrol edebilen bir fonksiyondur.Button1Click(Sender: TObject). 283 .Text).tarih2:TDateTime. Girilen tarihlerin eşit olması bu fonksiyondan geriye “0” değerinin dönmesine sebep olacaktır. if CompareDate(tarih1.Tarih – İçerikli Fonksiyonlar: Delphi’de tarih ve zaman işlemlerinizi kolaylıkla yapabilmeniz için bir çok fonksiyon tanımlanmıştır.Button2Click(Sender: TObject). //tarihsel değişkene aktarılıyor tarih2:=StrToDate(Edit2. tarih2:=StrToDateTime(Edit2. B: TDateTime): TValueRelationship. CompareDate(tarih1. procedure TForm1.Text). end. if CompareDate(tarih1. var tarih1.Text).tarih2:TDate. Aşağıda bu fonksiyonlara ait örnekler detaylıca incelemeye alınmıştır.

CompareTime(zama1. zaman2:=StrToTime(Edit2. CurrentYear: Tanımlama: function CurrentYear: Word.zaman2)=0 then ShowMessage('Girilen iki Zaman Eşit') else ShowMessage('Zamanlar Eşit Değil'). Eşitlik durumunda yine “0” değeri döndürecektir. if CompareTime(zaman1. Parametre içermeyen bu fonksiyonla aktif tarihi yazdırabilirsiniz. Döndürdüğü değer tarih içerikli olacağı için yazdırmak için “DateToStr” tip dönüşümü kullanmanızı gerektirecektir. begin Form1. procedure TForm1. begin zaman1:=StrToTime(Edit1.Text).Caption:=IntToStr(CurrentYear). Fonksiyondan geriye dönen değer tam sayı tipli olacağı için “IntToStr” tip dönüşüm fonksiyonunu kullanarak yazdırabilirsiniz.Button4Click(Sender: TObject).Button3Click(Sender: TObject). end. procedure TForm1. Parametre kullanmayan bu fonksiyonla aktif tarihin yılını kolayca öğrenebilirsiniz. Parametre olarak girilen iki değişkenin aynı zamana ait olup olmadıklarını hesaplayabilen bir fonksiyondur. var zaman1.Text). B: TDateTime): TValueRelationship.zaman2): Tanımlama: function CompareTime(const A. //2003 yazar end.zaman2:TTime. Date: Tanımlama: function Date: TDateTime. 284 .

Button7Click(Sender: TObject).Button5Click(Sender: TObject).//20. Örneğin yapılış tarihinin “10/07/2003” olduğunu da belirtelim. 285 . zaman kısmını atarak sadece tarih değerinin elde edilmesini sağlar. DateOf(tarihzaman): Tanımlama: function DateOf(const AValue: TDateTime): TDateTime.Caption:=DateToStr(Date).//11/07/2003 yazar end. begin Form1. procedure TForm1.07.06. var tarihzaman:TDateTime.Button5Click(Sender: TObject). procedure TForm1. begin tarihzaman:=Now. Aynı şekilde önceki kullanabilirsiniz.//30.Caption:=DateToStr(tarih).Caption:=DateToStr(tarih). var tarih:TDate. Parametre olarak girilen tarih zaman değişkeninin.procedure TForm1. var tarih:TDate.Button5Click(Sender: TObject).2003 end. günlere dönmek içinde aşağıdaki kodlamayı procedure TForm1. //aktif tarihten 10 gün çıkar Form1. //tarh ve zamanı beraber tutan değişken Edit2.//10.2003 end. //aktif tarihe 10 gün ekle Form1.Text:=DateTimeToStr(DateOf(tarihzaman)).2003 end. Aktif tarihe gün ekleme işlemlerini yine bu fonksiyonla yapmanız mümkün olabilmektedir. Aşağıda bu husus örneklendirilmiştir.07. begin tarih:=Date-10. begin tarih:=Date+10.

end. begin tarihzaman:=Now. Parametre olarak girilen tarih-zaman içerikli değişkenin değerini stringe çevirmek için kullanılır. overload. Eğer DateTime tipli bir değişken değeri aktarılırsa hata vermemekle beraber.Fonksiyonun daha iyi anlaşılması açısından aşağıdaki örneği inceleyip aradaki farka dikkat ediniz. function DateTimeToStr(DateTime: TDateTime.Text:=DateTimeToStr(DateOf(tarihzaman)). 286 . const FormatSettings: TFormatSettings): string. procedure TForm1. Parametreyle girilen tarih değişkenini string tipe dönüştürmek için kullanılan bir fonksiyondur.Text:=DateTimeToStr(tarihzaman). var tarih:TDateTime. aktif tarih ve saati yaz ShowMessage(sonuc). procedure TForm1. sonuc:AnsiString. DateToStr(tarih): Tanımlama: function DateToStr(Date: TDateTime): string. Bilhassa kontroller üzerinde tarih içeriklerinin yazdırılmasında kullanılır. overload. const FormatSettings: TFormatSettings): string. overload. var tarihzaman:TDateTime. overload. sonuc:=DateTimeToStr(tarih).Button8Click(Sender: TObject). begin tarih:=Now.Button7Click(Sender: TObject). //tarih ve zamanı beraber tutan değişken Edit1. sadece tarih kısmıyla ilgili tip dönüşümünü gerçekleştirecektir.//11/07/2003 yazar end. function DateToStr(const DateTime: TDateTime. DateTimeToStr(tarihzaman): Tanımlama: function DateTimeToStr(DateTime: TDateTime): string.//10/07/2003 11:07:19 yazar Edit2.

Caption:='Bugün Pazartesi' else if deger=3 then Form1. DayThursday = 4. sonuc:=DateToStr(tarih). begin tarih:=Now. sonuc:AnsiString.Caption:='Bugün Cumartesi'. DayFriday = 5.Basit bir dallandırma yaparak sonuca ulaşabilirsiniz.Caption:='Bugün Perşembe' else if deger=6 then Form1. // 10/07/2003 yazar end. 287 . begin tarih:=Date.deger:Integer. Tanımlama: Parametreyle girilen tarih değişken değerinin haftanın hangi gününe ait olduğunu hesaplayabilen bir fonksiyondur. DayOfWeek(tarih): const DayMonday = 1.//Bügünkü tarih deger:=DayOfWeek(tarih). DaySunday = 7. DaySaturday = 6.Caption:='Bugün Pazar' else if deger=2 then Form1.//aktar if deger=1 then //dallandır Form1. var tarih:TDateTime. DayWednesday = 3.Caption:='Bugün Cuma' else if deger=7 then Form1.Caption:='Bugün Salı' else if deger=4 then Form1. ShowMessage(sonuc).Caption:='Bugün Çarşamba' else if deger=5 then Form1.Button10Click(Sender: TObject).Button9Click(Sender: TObject). DayTuesday = 2. 1 olması pazar 7 olması Cumartesi gününe karşılık gelmektedir. Geriye döndürdüğü değer “1 ile 7” arasındaki sayısal ifadedir. var tarih:TDate.end.procedure TForm1. procedure TForm1.

//Bugünkü tarih 10/07/2003 tür deger:=DayOfTheMonth(tarih). // 10 yazar end.Caption:=IntToStr(deger). procedure TForm1. var tarih:TDateTime. Form1.DayOf(tarih_zaman): Tanımlama: function DayOf(const AValue: TDateTime): Word. deger:Integer. //kaçıncı gün Form1. Tam sayı tipinde bir değer döndürdüğü için. Fonksiyondan geriye dönen değer tam sayı tipli bir değişkene aktarılabilir. // 10 yazar end. Parametre ile girilen “tarih_zaman” değişkeninde. begin tarih:=Date. 288 . DayOfTheMonth(tarih_zaman): Tanımlama: function DayOfTheMonth(const AValue: TDateTime): Word. var tarih:TDateTime. yazdırmak isterseniz “IntToStr” fonksiyonunu kullanmalısınız. begin tarih:=Date. //Bugünkü tarih 10/07/2003 tür deger:=DayOf(tarih). ayın kaçıncı günü olduğu hesaplayan bir fonksiyondur. Yukarıdaki örneği dikkatlice inceleyiniz.Button12Click(Sender: TObject).Caption:=IntToStr(deger). Dolayısıyla form üzerindeki herhangi bir kontrolde yazdırılabilmesi için “IntToStr” fonksiyonu ile tip dönüştürme işlemi uygulamanız gerekmektedir. deger:Integer. procedure TForm1. Parametre ile girilen “tarih_zaman” değişkeninde ayın kaçıncı günü olduğunu hesaplayan bir fonksiyondur.Button11Click(Sender: TObject).

begin tarih:=Date. AThen: TDateTime): Integer. DayOfTheYear(tarih_zaman): Tanımlama: function DayOfTheYear(const AValue: TDateTime): Word. //Yılın kaçıncı günü Form1.Button14Click(Sender: TObject).Caption:=IntToStr(deger).tarih2): Tanımlama: function DaysBetween(const ANow. Parametre ile girilen tarih_zaman değişkenine ait değerin haftanın kaçıncı gününe karşılık geldiğini hesaplayan bir fonksiyondur. // 191 yazar.Caption:=IntToStr(deger). DaysBetween(tarih1. Parametre ile girilen tarih_zaman değişken değerinin yılın kaçıncı günü olduğunu hesaplayan bir fonksiyondur. Aşağıda bu fonksiyon örneklendirilmiştir. begin tarih:=Date. Parametre ile girilen iki tarih değişkeni arasındaki gün farkını hesaplayan fonksiyondur. Çünkü 191. deger:Integer. gündeyiz end. //Haftanın kaçıncı günü Form1. // 4 yazar çünkü 4. var tarih:TDateTime. //Bugünkü tarih 10/07/2003 tür deger:=DayOfTheWeek(tarih). gün end. procedure TForm1. 289 . procedure TForm1. Fonksiyonun geriye döndürdüğü değer bir tam sayı olduğu için yazdırmak için IntToStr fonksiyonundan faydalanmalısınız.Button13Click(Sender: TObject).DayOfTheWeek(tarih_zaman): Tanımlama: function DayOfTheWeek(const AValue: TDateTime): Word. deger:Integer. //Bugünkü tarih 10/07/2003 tür deger:=DayOfTheYear(tarih). var tarih:TDateTime.

Fonksiyondan geriye dönen değer bir tam sayı olduğu için IntToStr fonksiyonu kullanılarak yazdırılabilir. Şubat ayı işlemleri için önem arz eden bir fonksiyondur.Text). // 31 yazar. Birinci parametreyle girilen yıla ait. var tarih1. AMonth: Word): Word.Button15Click(Sender: TObject). ikinci parametreyle girilen ayın kaç gün çektiğini hesaplayabilen bir fonksiyondur. var tarih:TdateTime. Çünkü temmuz 31 gün çeker end.Caption:=IntToStr(sayi).tarih2).tamsayi2): Tanımlama: function DaysInAMonth(const AYear. begin tarih1:=StrToDateTime(Edit1. end. sayi:Integer.Text). sayi:Integer. 290 . Parametreyle girilen tarih_zaman değişken değerinin ait olduğu ayın kaç gün çektiğini hesaplayabilen bir fonksiyondur. sonuçta pozitif değeri döndürmektedir.//aralarında kaç gün var Form1.tarih2:TDateTime.procedure TForm1. Şayet bu değeri yazdırmak isterseniz IntToStr fonksiyonunu kullanmalısınız.Button16Click(Sender: TObject).Caption:=IntToStr(sayi). //ilk tarih değer tarih2:=StrToDateTime(Edit2. DaysInAMonth(tam_sayi. DaysInMonth(tarih_zaman): Tanımlama: function DaysInMonth(const AValue: TDateTime): Word. //Bu ay kaç gün çekiyor Form1. //aktif tarih 10/07/2003 sayi:=DaysInMonth(tarih). //ikinci tarih değeri sayi:=DaysBetween(tarih1. Bu fonksiyonda değişkenlerin yerleri önem arz etmektedir. procedure TForm1. begin tarih:=Date. Hangisinin büyük olduğu da önemli değildir. Fonksiyondan geriye dönen değer. tam sayı tipli bir değişkene aktarılabilir.

sayi:=DaysInYear(tarih).Caption:=IntToStr(sayi). 291 . DaysInYear(tarih_zaman): Tanımlama: function DaysInYear(const AValue: TDateTime): Word.3). begin yil:=2003. procedure TForm1. end. sayi:=DaysInAYear(yil). Parametreyle belirtilen yılın kaç gün çektiğini hesaplayabilen bir fonksiyondur. DaysInAYear(tam_sayi): Tanımlama: function DaysInAYear(const AYear: Word): Word. sayi:Integer. //Yıl kaç gün Form1. var tarih:TdateTime. //2000 yılının üçüncü ayı kaç gun Form1.//365 yazar end. begin sayi:=DaysInAMonth(2000. procedure TForm1.Button19Click(Sender: TObject). sayi:Integer. Tam sayı tipli bir değer döndürdüğü için IntToStr fonksiyonu ile kolayca yazdırılabilir.procedure TForm1.//2003 yılı kaç gündür Form1.Caption:=IntToStr(sayi). var sayi:Integer.Button17Click(Sender: TObject).Button18Click(Sender: TObject). //31 yazar end. Parametre ile belirtilen tarih içerikli değişken değerinin ait olduğu yılın kaç gün çektiğini hesaplayan fonksiyondur. var yil:Integer. begin tarih:=Date.Caption:=IntToStr(sayi).

Caption:=FloatToStr(sonuc). begin tarih1:=StrToDate('01. sonuc:Double. 292 . var tarih:TDateTime. procedure TForm1.2003').yil.ay. İlk parametreyle girilen tarihin yıl.Button21Click(Sender: TObject).tarih2:TDateTime. yil.03.ay. //word olmak zorunda begin tarih:=StrToDate('10. DecodeDate(tarih. ay. AThen: TDateTime): Double.DaySpan(tarih1.gun): Tanımlama: procedure DecodeDate(Date: TDateTime. Day: Word).tarih2): Tanımlama: function DaySpan(const ANow.gun:Word. end.04. sonuc:=DaySpan(tarih1.07. //kaç gün fark var Form1. var tarih1. gün değerlerini hesaplayarak ikinci. üçüncü ve dördüncü değişkenlere aktarır. var Year. Month.Button20Click(Sender: TObject). end.2003').2003').tarih2). DecodeDate(tarih. procedure TForm1.ay. Parametreyle girilen iki tarihsel değişken arasındaki gün farkını hesaplayan bir fonksiyondur.gun). tarih2:=StrToDate('02.yil.// tarihi parçalara ayır ShowMessage('Yıl='+IntToStr(yil)+#13#10+'Ay='+IntToStr(ay)+ #13#10+'Gün='+IntToStr(gun)).

Birinci parametreyle belirtilen tarih değişkeninin yılını ikinci parametreye. ShowMessage('Yıl='+IntToStr(yil)+#13#10+'Gün='+IntToStr(ay)). ayın kaçıncı haftası olduğunu dördüncü parametreye ve haftanın kaçıncı günü olduğunu beşinci parametreye aktaran bir prosedür dür. out AYear.07.haftanın_kaçıncı_günü): Tanımlama: procedure DecodeDateMonthWeek(const AValue: TDateTime. ay değerini üçüncü parametreye.gun): Tanımlama: procedure DecodeDateDay(const AValue: TDateTime. Gerçekte de öyle olması gerekir.Button22Click(Sender: TObject). yılın kaçıncı günü olduğunu da üçüncü parametreye aktaran bir prosedürdür. AWeekOfMonth. end. DecodeDateDay(tarih.yil. //word olmak zorunda begin tarih:=StrToDate('10. ADayOfYear: Word). yil. DecodeDateMonthWeek(tarih.yil.ay). procedure TForm1.yil. AMonth. Örneğe dikkat ediniz. Fonksiyon tanımlarına dikkat ederseniz bazılarının function olarak değil de prosedür olarak tanımlandıklarını göreceksiniz. Çünkü bu prosedürlerin bir çoğu geriye birden fazla değer döndürdükleri için (daha önce bu konular detaylı olarak anlatılmıştır) fonksiyon olarak değil de prosedür olarak tanımlanmaları gerekmektedir. out AYear. var tarih:TDateTime. Birinci parametreyle verilen tarih değişkenine ait yıl değerini ikinci parametreye. Biz hepsini fonksiyon başlığı altında veriyoruz.kaçıncı_hafta.ay:Word. 293 .2003'). ADayOfWeek: Word).DecodeDateDay(tarih.ay.

Birinci parametreyle girilen zaman değişkeninin. Yukarıdaki mesaj penceresinin oluşmasını sağlayan kodlar aşağıda verilmiştir.hafta. var tarih:TDateTime. var Hour. Sec.saat. DecodeTime(zaman.Button23Click(Sender: TObject). Min.saniye. 294 .2003').dakika.salise): Tanımlama: procedure DecodeTime(Time: TDateTime.yil.deger:Word.ay.hafta. begin tarih:=StrToDate('11. ShowMessage('Yıl='+ IntToStr(yil)+#13#10+'Ay='+ IntToStr(ay)+#13#10+ 'Ayın Kaçıncı Haftası='+IntToStr(hafta)+#13#10+ 'Haftanın Kaçıncı Günü='+ IntToStr(deger)). dakika değerini üçüncü parametreye. saat değerini ikinci parametreye. Dikkatlice inceleyiniz. yil.07.ay.procedure TForm1. Yukarıdaki kod satırlarının sonucu aşağıdaki pencere açılacaktır. DecodeDateMonthWeek(tarih. end. MSec: Word). saniye değerini dördüncü parametreye ve salise değerini de beşinci parametreye aktaran bir prosedürdür.deger). Lütfen dikkatlice inceleyiniz.

sal:Word.san.gun:Word.san. saat. var zaman:TDateTime.ay.Caption:=DateTimeToStr(tarih).gun). Month.saat.Button24Click(Sender: TObject).dak.2003 yazar end. Fonksiyondan geriye dönen değer tarihsel içerikli olduğu için yazdırılmak istenirse “DateTimeToStr” tip dönüştürme fonksiyonundan faydalanmalısınız. Üç parametreyle belirtilen tamsayıları birleştirerek tarih değeri oluşturabilen bir fonksiyondur.procedure TForm1. Sonuç tarihsel bir değer içerdiği için DateTimeToStr tip dönüştürme fonksiyonu kullanılarak yazdırılabilir. yil. EncodeDate(yil. DecodeTime(zaman.deger): Tanımlama: function EncodeDateDay(const AYear. ShowMessage('Saat='+IntToStr(saat)+#13#10+'Dakika='+IntToStr(dak)+ #13#10+'Saniye='+IntToStr(san)+#13#10+'Salise='+IntToStr(sal)). Form1. Day: Word): TDateTime. ikinci parametreyle belirtilen kadar (tam sayı) gün ekler. gun:=10. tarih:=EncodeDate(yil.sal).Button25Click(Sender: TObject). ADayOfYear: Word): TDateTime. end. Birinci parametre ile belirtilen (tam sayı) yıla.gun): Tanımlama: function EncodeDate(Year. 295 .ay. Aşağıda bu husus örneklendirilmiştir. begin zaman:=Now. ay:=7.ay.07.dak. EncodeDateDay(yil. //10. begin yil:=2003. var tarih:TDateTime. procedure TForm1.

yine ikinci parametre kadar hafta ekler. begin tarih:=EncodeDateMonthWeek(2003. var tarih:TDateTime.ay.35). Form1. procedure TForm1.Button28Click(Sender: TObject).ay. //35 gün ekle Form1.2003 end. Parametreyle belirtilen yıla.04. 296 .gun): Tanımlama: function EncodeDateMonthWeek(const AYear.3). begin tarih:=EncodeDateDay(2003.hafta.Caption:=DateTimeToStr(tarih). yil. //13/01/2003 yazar end.günü vs. EncodeDateMonthWeek(yıl. Mesela 2003 yılının 3.hafta): Tanımlama: function EncodeDateWeek(const AYear.Button27Click(Sender: TObject).//04.ayının 2. AWeekOfMonth: Word. Geriye dönen değer tarih içerikli olacaktır.2003 yazar end. const ADayOfWeek: Word = 1): TDateTime.deger:Word. AWeekOfYear: Word. procedure TForm1. Belirtilen parametreleri birleştirerek yeni bir tarih değeri elde eder.02.Caption:=DateTimeToStr(tarih).Button26Click(Sender: TObject).Caption:=DateTimeToStr(tarih).deger:Integer. haftanin ilk günü Form1. //08. var tarih:TDateTime.4.procedure TForm1. begin tarih:=EncodeDateWeek(2003. var tarih:TDateTime.2). EncodeDateWeek(yıl. const ADayOfWeek: Word = 1): TDateTime. yil. AMonth. Fonksiyondan geriye dönen değer tarihsel veri içereceği için yazdırmak ancak DateTimeToStr tip dönüştürme fonksiyonu sayesinde olabilecektir. Yazdırmak için DateTimeToStr fonksiyonundan faydalanmalısınız. //3.haftasının 4.2.

ANthDayOfWeek.sal): Tanımlama: function EncodeTime(Hour.hafta. Parametre ile belirtilen değerleri birleştirerek yeni bir zaman değeri türetir.Caption:=DateTimeToStr(tarih). ADayOfYear: Word): TDateTime.3).günü Form1.//12. hafta. overload.dak.san. Min. Sec.25.40). EncodeTime(saat.2.//2. AMonth.Button29Click(Sender: TObject). gün değerlerini yıla ekleyerek yeni bir tarih hesaplar.Button30Click(Sender: TObject).2003 yazar end. begin zaman:=EncodeTime(16. function EndOfADay(const AYear. //16:25:30 yazar end. yine ikinci parametreyle belirtilen değer kadar gün ekler. Parametreyle belirlenen yıl değişkenine.gun): Tanımlama: function EncodeDayOfWeekInMonth(const AYear.ayın 2.haftasının 3. procedure TForm1. Parametre ile belirtilen ay. begin tarih:=EncodeDayOfWeekInMonth(2003. Fonksiyondan geriye dönen değer tarih içerikli olacağı için DateTimeToStr tip dönüştürme işlemi sayesinde yazdırılabilir. var tarih:TDateTime. EndOfADay(yıl. Fonksiyondan geriye zaman içerikli bir değer döneceği için TimeToStr tip dönüştürme fonksiyonu kullanılarak yazdırılabilir. procedure TForm1.ay. ADayOfWeek: Word): TDateTime.Caption:=TimeToStr(zaman). Geriye dönen 297 .30. Fonksiyondan dönen değer tarihsel içerikli olduğu için DateToStr tip dönüştürme fonksiyonu kullanılarak yazdırılabilir. Form1.deger): Tanımlama: function EndOfADay(const AYear. var zaman:TDateTime.2. AMonth. ADay: Word): TDateTime.EncodeDayOfWeekInMonth(yıl.02. MSec: Word): TDateTime. overload.

01. Birinci parametreyle belirtilen yıl değişkenine.3).Caption:=DateToStr(tarih).2003 yazar end.ay): Tanımlama: function EndOfAMonth(const AYear. begin tarih:=EndOfADay(2003. AWeekOfYear: Word.9). Fonksiyondan geriye dönen değer tarihsel içerikte olduğu için yazdırmak için DateToStr fonksiyonundan faydalanılmıştır. procedure TForm1. EndOfAWeek(yıl.Button33Click(Sender: TObject).//31/07/2003 yazar end. EndOfAMonth(yıl. AMonth: Word): TDateTime.2003 yazar end.01. zamanla beraber yazılacaklarını belirtmek isterim.Caption:=DateToStr(tarih). const ADayOfWeek: Word = 7): TDateTime.Caption:=DateToStr(tarih). ikinci parametreyle belirtilen haftanın en son gününü hesaplayan fonksiyondur.Button32Click(Sender: TObject).hafta): Tanımlama: function EndOfAWeek(const AYear. //9 gün ekle Form1. // 7 ay ekle Form1. //09. haftanın en son günü Form1.7). begin tarih:=EndOfAMonth(2003. //19. Fonksiyondan geriye dönen değer tarihsel içerikli olduğu için DateTimeToStr tip dönüştürme fonksiyonuyla yazdırılmalıdır. procedure TForm1. Birinci parametreyle belirtilen yıla. procedure TForm1. begin tarih:=EndOfAWeek(2003. 298 .Button31Click(Sender: TObject). var tarih:TDateTime. var tarih:TDateTime.//3. var tarih:TDateTime.değeri DateTimeToStr tip dönüştürme fonksiyonuyla yazdırmaya kalkarsanız. ikinci parametreyle belirlenen değer kadar ayı ekler yeni bir tarih değeri bulur.

var tarih:TDate. İkinci parametreyle belirtilen tarihi. sonuc:AnsiString. Parametreyle verilen yıla ait en son günün tarihini hesaplayan fonksiyondur. mmmm d.Caption:=DateToStr(tarih). begin tarih:=Date. function FormatDateTime(const Format: string.Caption:=sonuc. Tarihsel içerikli değişkenleri formatlamak için kullanabileceğiniz bayağı seçeneğiniz var. 299 . begin tarih:=EndOfAYear(2003). Aşağıda bu seçeneklerden bazılarını tablo halinde sizlere vermeye çalışacağım. Fonksiyondan dönen değer string tipte olduğu için direkt yazdırılabilir. const FormatSettings: TFormatSettings): string. overload. //2003 yılının en son günü Form1. Form1. procedure TForm1. sonuc:=FormatDateTime('dddd.EndOfAYear(yıl): Tanımlama: function EndOfAYear(const AYear): TDateTime.Button35Click(Sender: TObject).tarih): Tanımlama: function FormatDateTime(const Format: string. Fonksiyondan geriye dönen değer tarihsel içerikli olduğu için DateToStr tip dönüştürme fonksiyonu sayesinde yazdırılabilir. procedure TForm1. DateTime: TDateTime): string. birinci parametreyle belirtilen formatlı hale dönüştürür.//31/12/2003 end. yyyy'. DateTime: TDateTime. var tarih:TDateTime.//perşembe Temmuz 10 2003 yazar end. FormatDateTime (stil.tarih). overload.Button34Click(Sender: TObject).

yyyy’ ' mmmm yyyy' 'yyyy' 'dddd. Parametre ile girilen tarih değerini. end.Format 'dddd. mmmm yyyy. NumberOfMonths: Integer = 1).ay.ay. var tarih:TDateTime.//ayı artır ShowMessage(IntToStr(yil)+#13#10+IntToStr(ay)+#13#10+IntToStr(gun)). yyyy' ‘mmmm d. const ANumberOfDays: Integer = 1): TDateTime. 300 . Month.d. mmmm yyyy' 'd. IncAMonth(yil.gun:Word.gün): Tanımlama: procedure IncAMonth(var Year. gün olarak bir artırmak için kullanılan fonksiyondur. Day: Word. begin yil:=2003. procedure TForm1. yil. Üç parametreyi birleştirerek oluşturacağı tarih değerinden.gun). mmmm d.dddd' Perşembe Temmuz 10 2003 Temmuz 10 2003 Temmuz 2003 2003 Perşembe 10 Temmuz 2003 10 Temmuz 2003 Perşembe Sonuç IncAMonth(yıl. Fonksiyondan geriye dönen değer tarihsel içerikli olacağı için. ay:=7. yazdırabilmeniz ancak DateToStr fonksiyonu sayesinde olabilecektir. gun:=10.ay. bir ay sonrasının tarihini hesaplayan fonksiyondur.Button36Click(Sender: TObject). IncDay(tarih): Tanımlama: function IncDay(const AValue: TDateTime.

301 . IncWeek(tarih): Tanımlama: function IncWeek(const AValue: TDateTime. begin tarih:=Date. //haftayı bir artır Form1. IncMonth(tarih): Tanımlama: function IncMonth(const Date: TDateTime. begin tarih:=Date.Caption:=DateToStr(tarih). const ANumberOfWeeks: Integer = 1): TDateTime. //ayı bir artır Form1. var tarih:TDate. var tarih:TDate.procedure TForm1. yazdırmanız ancak DateToStr fonksiyonu sayesinde olabilecektir. var tarih:TDate.// tarihi bir gün artır Form1. tarih:=incDay(tarih).Button38Click(Sender: TObject). //10/07/2003 tarih:=incMonth(tarih). //10/07/2003 tarih:=incWeek(tarih). NumberOfMonths: Integer = 1): TDateTime. procedure TForm1. begin tarih:=Date. end.Caption:=DateToStr(tarih). Fonksiyondan geriye tarih içerikli veri döneceği için yazdırmak için DateToStr fonksiyonundan faydalanmalısınız.Caption:=DateToStr(tarih). procedure TForm1. //10/08/2003 yazar end. Parametre olarak girilen tarih değişken içeriğindeki ayı bir artırarak yeni bir tarih değeri hesaplar. Parametre olarak girilen tarih içerikli değişkenin değerini bir hafta artırarak yeni bir tarih hesaplar. Fonksiyondan geriye dönen değer tarih içerikli olacağı için.Button39Click(Sender: TObject).Button37Click(Sender: TObject). //17/07/2003 yazar end.

var tarih:TDate.//Burası işler end. Fonksiyondan geriye dönen değer true veya false olabileceği için ufak bir dallanmayla sonuca ulaşılabilir.Caption:=DateToStr(tarih).// 366 günmü çekiyor if sonuc then Form1. begin tarih:=Date. procedure TForm1. 302 . Parametreyle girilen tarih içerikli değişken değerinin (dört yılda bir oluşan 366 gün çeken yıl) 366 gün çekip çekmediğini hesaplayabilen bir fonksiyondur. //Yılı bir artır Form1. Şayet belirttiğiniz tarih 366 gün çekiyorsa sonuç true olacaktır. //10/07/2004 yazar end. IsInLeapYear(yıl): Tanımlama: function IsInLeapYear(const AValue: TDateTime): Boolean. //10/07/2003 sonuc:=IsInLeapYear(tarih). const ANumberOfYears: Integer = 1): TDateTime. begin tarih:=Date.Button40Click(Sender: TObject).Button41Click(Sender: TObject). sonuc:Boolean. Parametre olarak girilen tarihsel değişkenin değerini bir yıl artırarak yeni bir tarih hesaplar. Fonksiyondan geriye dönen değer tarihsel içerikli olacağı için ancak DateToStr tip dönüştürme fonksiyonu sayesinde yazdırabilirsiniz. var tarih:TDate. //10/07/2003 tarih:=incYear(tarih).Caption:='Evet Bu Yıl 366 Gün Çekiyor' else Form1.IncYear(yıl): Tanımlama: function IncYear(const AValue: TDateTime. procedure TForm1.Caption:='Hayır 365 Gün Çekiyor'.

Fonksiyondan geriye dönen değer Boolean tip bir değişkende saklanabilir.Caption:='Hayır 365 Gün Çekiyor'. sonuc:Boolean. tam sayı tip değişken kullanmasıdır.//2003 yılı 366 günmü çekiyor if sonuc then Form1. var tarih:TDate. procedure TForm1. Fonksiyondan true veya false değerinin döndüğünü hatırlatmakta fayda var.Button43Click(Sender: TObject). procedure TForm1. end. var sonuc:Boolean. if sonuc then Form1. end.IsLeapYear(yıl): Tanımlama: function IsLeapYear(Year: Word): Boolean.Text). Yukarıdakinden tek farkı parametre olarak tarih değişkeni değil de.Caption:='Evet Bu Yıl 366 Gün Çekiyor' else Form1. IsToday(tarih): Tanımlama: function IsToday(const AValue: TDateTime): Boolean.Caption:='Girdiğiniz Tarih Bugüne Ait'. bugünün tarihine eşit olup olmadığını kontrol eden bir fonksiyondur. Parametre olarak girilen tarihin 366 gün çekip çekmediğini hesaplayan diğer bir fonksiyondur. Parametre olarak girilen tarih değişkeninin. 303 . begin sonuc:=IsInLeapYear(2006). Bu değişkenin değerinin true olması girilen tarihin bugüne eşit olduğu anlamını taşımaktadır.Button42Click(Sender: TObject). sonuc:=IsToDay(tarih). begin tarih:=StrToDate(Edit1.

IsValidDate(yıl. end else Form1. var tarih:TDate.10. Parametre ile belirtilen tarih değişkeninin hangi aya ait olduğunu hesaplayan fonksiyondur.Caption:=IntToStr(deger). ay yoktur da o yüzden).gun): Tanımlama: function IsValidDate(const AYear.5).” şeklinde değiştirirseniz “Girdiğiniz değerler Tarih Oluşturamaz” uyarısının başlığınızda yazmasını sağlarsınız (18. procedure TForm1.ay.10. sonuc:Boolean. Form1. begin tarih:=Date+5. procedure TForm1.Button44Click(Sender: TObject).10).gun:word. Fonksiyondan geriye true değerinin dönmesi değişkenlerin tarih oluşturabileceği anlamını taşımaktadır.deger:Word. yil.10). if sonuc=true then begin tarih:=EncodeDate(2003.Button45Click(Sender: TObject). begin sonuc:=IsValidDate(2003. var tarih:TDate. Form1.ay. deger:=MonthOf(tarih). satırını “sonuc:=IsValidDate(2003.10). Fonksiyondan geriye dönen değer tam sayı tipli bir değişkene aktarılabilir. AMonth.Caption:=DateToStr(tarih). MonthOf(tarih): Tanımlama: function MonthOf(const AValue: TDateTime): Word. sonuc:=IsValidDate(2003.Caption:='Girdiğiniz değerler Tarih Oluşturamaz'. end.18. Parametre olarak girilen değişken değerlerinin sırasıyla tarih oluşturup oluşturamayacağını hesaplayabilen bir fonksiyondur (ay değerinin 12 den büyük olması ve gün değerinin 31 den büyük olması gibi). 304 .10. end. ADay: Word): Boolean.

Parametreyle girilen tarih değişken değerinin hangi aya ait olduğunu hasaplayan bir fonksiyondur.Caption:=IntToStr(deger). procedure TForm1.05.Button46Click(Sender: TObject). 305 .2002').Caption:=IntToStr(fark).tarih2).MonthOfTheYear(tarih): Tanımlama: function MonthOfTheYear(const AValue: TDateTime): Word. begin tarih1:=StrToDate('04. // 7 yazar end. fark:Integer. //15 yazar end.tarih2): Tanımlama: function MonthsBetween(const ANow. MonthsBetween(tarih1. begin tarih:=Date+5. AThen: TDateTime): Integer.08. deger:Word. procedure TForm1. Fonksiyondan geriye dönen değer bir tamsayı olduğu için IntToStr tip dönüştürme fonksiyonu kullanılarak fark kolayca yazdırılabilir. var tarih1. //şu anki tarih 11/07/2003 deger:=MonthOfTheYear(tarih).Button47Click(Sender: TObject). Form1. var tarih:TDate. Yapılan hesaplamaya dikkat edecek olursanız girilen iki tarih arasındaki ay sayısı bulunmaktadır. tarih2:=StrToDate('04. Parametre olarak belirtilen tarih değişkenleri arasında kaç ay olduğunu hesaplayan fonksiyondur. Form1.2003').tarih2:TDate. fark:=MonthsBetween(tarih1.

gun): Tanımlama: function RecodeDate(const AValue: TDateTime. procedure TForm1. var tarih:TDateTime. // 11/07/2003 deger:=NthDayOfWeek(tarih). //tarh ve zamanı beraber tutan değişken Edit1. const AYear. begin tarihzaman:=Now.yil. var tarihzaman:TDateTime. Parametre olarak girilen tarih değişken değerinin. Fonksiyondan geriye tarih_zaman içerikli veri döneceği için DataTimeToStr tip dönüştürme fonksiyonu kullanılarak yazdırılabilmektedir.ay.// 2 yazar end. AMonth.Now(): Tanımlama: function Now: TDateTime. O güne ait tarih ve saati yazdırabilen fonksiyondur.Caption:=IntToStr(deger).Text:=DateTimeToStr(tarihzaman). procedure TForm1. deger:word. ADay: Word): TDateTime 306 . Fonksiyondan tam sayı tipli bir değer döneceği için IntToStr tip dönüştürme fonksiyonu kullanılarak yazdırılabilir.//11/07/2003 11:07:19 yazar end. //ayın kaçıncı haftası Form1.Button48Click(Sender: TObject). begin tarih:=Now.Button7Click(Sender: TObject). RecodeDate(tarih1. NthDayOfWeek(tarih): Tanımlama: function NthDayOfWeek(const AValue: TDateTime): Word. ayın kaçıncı haftasında olduğunu hesaplayan fonksiyondur.

//14/05/2002 yazar end. İkinci parametreyle belirtilen yıl değerini. Form1.ay. Form1. ilk parametre formatında yeni bir tarih değeri oluşturur.yil).yil. begin tarih1:=Now. tarihsel içerik içerdiği için herhangi bir kontrolün üzerinde (kullanıcıya göstermek amaçlı) yazdırmak için DateTimeToStr fonksiyonundan faydalanmalısınız. ay:=5. 307 . üçüncü. RecodeYear(tarih. var tarih1. tarih2:=RecodeYear(tarih1. const AYear: Word): TDateTime.tarih2:TDateTime. Dilerseniz DateToStr diyerek sadece tarih kısmını (saati yazdırmadan) yazdırabilirsiniz. Fonksiyondan geriye dönen değer tarih-zaman içerikli olacağı için DateTimeToStr fonksiyonu kullanılarak yazdırılabilir.Button50Click(Sender: TObject). procedure TForm1. yil.yil): Tanımlama: function RecodeYear(const AValue: TDateTime. yil:word. birinci parametredeki yılın yerine yazarak yeni bir tarih hesaplar.ay. var tarih1. gun:=14. procedure TForm1. //11/07/2003 yil:=2002. dördüncü parametreyle belirlenen değerleri birleştirip.Caption:=DateTimeToStr(tarih2). // 11/07/2003 yil:=1999. //11/07/1999 yazar end.İkinci.tarih2:TDateTime.gun:word. Fonksiyondan geriye dönen değer.gun).Button49Click(Sender: TObject).Caption:=DateTimeToStr(tarih2). begin tarih1:=Now. tarih2:=RecodeDate(tarih1.

Parametre olarak belirtilen iki tarihin değerlerinin birbirleriyle değişmesini sağlayan bir prosedürdür. ADayOfYear: Word): TDateTime.tarih2:TDateTime. StartOfADay(tarih.tarih2).Button51Click(Sender: TObject).6). Dilerseniz aynı işlemi aşağıdaki gibi üç parametreyle de yapabilirsiniz. //06/01/2003 yazar end.//tarihleri değiştir Form1. function StartOfADay(const AYear. const NewDate: TDateTime). begin tarih:=StartOfADay(2003. procedure TForm1.//11. 308 . Form1. begin tarih1:=StrToDate('01.Caption:=DateToStr(tarih1). var tarih1. var tarih:TDateTime. overload. Fonksiyondan geriye dönen değer tarihsel veri içereceği için.ay): Tanımlama: function StartOfADay(const AYear. yine ikinci parametreyle belirtilen sayı kadar ay ekler.Caption:=DateToStr(tarih). procedure TForm1.Button52Click(Sender: TObject).2003').ReplaceDate(tarih1. Çünkü fonksiyon opsiyonel parametre içermektedir. //11/07/2003 ReplaceDate(tarih1.02.07. Örneği dikkatlice inceleyiniz. AMonth. overload. kontrollerden herhangi birisinde yazdırılması için DateToStr tip dönüştürme fonksiyonundan faydalanmalısınız.tarih2): Tanımlama: procedure ReplaceDate(var DateTime: TDateTime. Parametreyle belirtilen yıla.2003 yazar end. ADay: Word): TDateTime. tarih2:=Date.

Button53Click(Sender: TObject). var tarih:TDateTime. yeni bir tarih hesaplar. //10/03/2003 yazar end. StartOfAMonth(yıl.// 3. //13/01/2003 yazar end.//01/06/2003 yazar end.Caption:=DateToStr(tarih). begin tarih:=StartOfAMonth(2003.Button54Click(Sender: TObject).Caption:=DateToStr(tarih). ikinci parametreyle belirtilen hafta sayısını ekler. const ADayOfWeek: Word = 1): TDateTime. 309 .3. var tarih:TDateTime.Caption:=DateToStr(tarih). Parametreyle belirtilen yıla.Button52Click(Sender: TObject). begin tarih:=StartOfAWeek(2003.//3 ay 10 gün ekle Form1.6).//6 ay ekle Form1.haftayı bul Form1. procedure TForm1.procedure TForm1.ay): Tanımlama: function StartOfAMonth(const AYear. AWeekOfYear: Word. Parametreyle belirtilen yıla. procedure TForm1. begin tarih:=StartOfADay(2003.10).3).hafta): Tanımlama: function StartOfAWeek(const AYear. var tarih:TDateTime. yine ikinci parametreyle belirtilen adet kader ayı ekler. yazdırmak için DateToStr fonksiyonundan faydalanmalısınız. AMonth: Word): TDateTime. Fonksiyondan geriye dönen değer tarihsel içerik içerdiğinden. StartOfAWeek(yıl.

Parametre ile belirtilen yılın ilk gününe ait tarih değerini döndüren fonksiyondur. StartOfTheMonth(yıl): Tanımlama: function StartOfTheMonth(const AValue: TDateTime): TDateTime. //11/07/2003 Form1. begin tarih:=StartOfTheMonth(Date).Button56Click(Sender: TObject). //11/07/2003 Form1.//01/01/2004 yazar end. var tarih:TDateTime. procedure TForm1.Button55Click(Sender: TObject). Form1.Button57Click(Sender: TObject). begin tarih:=StartOfTheWeek(Date). Fonksiyondan geriye dönen değer tarihsel veri içerdiği için yazdırmak ancak DateToStr fonksiyonu sayesinde olabilecektir.Caption:=DateToStr(tarih). procedure TForm1. StartOfTheWeek(tarih): Tanımlama: function StartOfTheWeek(const AValue: TDateTime): TDateTime. var tarih:TDateTime. Parametre ile belirtilen tarihteki ilk günü bulmak için kullanılan bir fonksiyondur (ay ve yıl değişmez sadece günün değerini 1 yapar). procedure TForm1. begin tarih:=StartOfAYear(2004). //01/07/2003 yazar end. 310 . Parametre olarak girilen tarihteki haftanın ilk gününün tarihini hesaplayan bir fonksiyondur. //07/07/2003 yazar end.Caption:=DateToStr(tarih).Caption:=DateToStr(tarih).StartOfAYear(yıl): Tanımlama: function StartOfAYear(const AYear): TDateTime. var tarih:TDateTime.

Caption:=DateToStr(tarih).//10 gün ekle end.Caption:=DateToStr(tarih+10). //Eğer yanlış tarih girilirse bugünkü tarihi al Form1. 311 . Bu fonksiyon ise yanlış tarih girilmesi durumunda ikinci parametreyle belirtilen değeri tarih olarak kabul edecektir. StrToDate fonksiyonu yanlış tarih girildiği zaman hata veriyordu.Text.varsayılan_tarih): Tanımlama: function StrToDateDef(const S: string. const Default: TDateTime): TDateTime. const FormatSettings: TFormatSettings): TDateTime. O haftaya ait Pazartesi (haftanın ilk günü) gününün tarihi ise 07/07/2003 tür. begin tarih:=StrToDateDef(Edit1. Dolayısıyla hata da vermeyecektir.Date). Dikkat edeceğiniz husus parametre değerini tarihe çeviremez ise programın hata vereceğidir. function StrToDate(const S: string.Button58Click(Sender: TObject). overload. Parametre ile verilen string değişkeni tarihsel veriye dönüştürmek kullanılan bir fonksiyondur. procedure TForm1.Text). const Default: TDateTime.Button59Click(Sender: TObject). Bu yüzden fonksiyon tarihin bulunduğu haftaya ait ilk günü döndüreceği için sonuç 07/07/2003 olacaktır. var tarih:TDateTime. var tarih:TDateTime. function StrToDateDef(const S: string. StrToDateDef(tarih. overload. StrToDate(string_tarih): Tanımlama: function StrToDate(const S: string): TDateTime.Örnekte yer alan aktif tarih 11/07/2003 tür ve cuma gününe karşılık gelmektedir. end. const FormatSettings: TFormatSettings): TDateTime. begin tarih:=StrToDate(Edit1. //tarihe çevir Form1. procedure TForm1. overload.

var tarih:TDateTime. Parametre ile belirtilen değişkenin değerini tarih-zaman içerikli değişkene aktarmak için kullanılan bir fonksiyondur. overload. //tarihe ve zamana çevir Form1. begin tarih:=StrToDateTimeDef(Edit1.Now). StrToDateTimeDef(tarih_zaman.Button61Click(Sender: TObject). function StrToDateTime(const S: string.Button60Click(Sender: TObject). procedure TForm1. overload.//10 gün ekle end. begin tarih:=StrToDateTime(Edit1.Fonksiyonun yaptığı iş Edit1 kutusuna tarihe dönüştürülemeyecek bir değerin girilmesi durumunda oluşacak hatayı engellemek ve (bir çok durumda bu günkü tarihin yazılması için bilerek yaptırılabilir) aktif tarihin işleme sokulmasını sağlamaktır.Text). const Default: TDateTime): TDateTime.Caption:=DateTimeToStr(tarih+10).Text. function StrToDateTimeDef(const S: string. overload.varsayılan_tarih_zaman): Tanımlama: function StrToDateTimeDef(const S: string. const FormatSettings: TFormatSettings): TDateTime. end. 312 . Tip çevirme işleminde hata oluşursa (tarih girilmez veya yanlış girilirse) ikinci parametre ile verilen değeri kabul ederek işlemlere devam eden fonksiyondur. var tarih:TDateTime. StrToDateTime(string_tarih): Tanımlama: function StrToDateTime(const S: string): TDateTime.Caption:=DateTimeToStr(tarih). procedure TForm1. //Eğer yanlış tarih girilirse şuanki tarih ve zamanı al Form1. overload. const Default: TDateTime. const FormatSettings: TFormatSettings): TDateTime.

begin zaman:=StrToTimeDef(Edit1.Text). const Default: TDateTime. const Default: TDateTime): TDateTime. Dolayısıyla programın kırılmasını da engellemiş olacaksınız. var zaman:TDateTime. end.Button63Click(Sender: TObject). overload.StrToTime(string_zaman): Tanımlama: function StrToTime(const S: string): TDateTime. overload. function StrToTime(const S: string. programınız hata mesajı verecektir.Button62Click(Sender: TObject). //Sadece Zamanı Yaz end.Time). 313 . Şayet parametre değeri zamana çevrilemiyorsa. const FormatSettings: TFormatSettings): TDateTime. function StrToTimeDef(const S: string.Text. const FormatSettings: TFormatSettings): TDateTime. Parametre ile belirtilen string veriyi zamansal değere çevirebilen bir fonksiyondur.varsayılan_zaman): Tanımlama: function StrToTimeDef(const S: string. Bu örnek için Edit kutusuna (10:06:45) gibi saati gösteren bir değer girmelisiniz.Caption:=TimeToStr(zaman). //zamana çevir Form1. begin zaman:=StrToTime(Edit1. procedure TForm1. StrToTimeDef(string_zaman. overload. procedure TForm1. //Yanlış değer girilirse şu anki zamanı kabul et Form1. Bu fonksiyonda yanlış değer (zaman çevrilemeyecek string) girilmesi durumunda ikinci parametreyle verilen zaman değeri kabul edilecek ve işlemler devam edecektir. StrToTime fonksiyonu Edit kutusuna yanlış değer girildiğinde kırılıyordu. var zaman:TDateTime.Caption:=TimeToStr(zaman).

zaman2:TDateTime.Button65Click(Sender: TObject). procedure TForm1. zaman2:=GetTime. begin zaman1:=Time.zaman2:TDateTime. var zaman1. ShowMessage('Time='+TimeToStr(zaman1)+#13#10+ 'GetTime='+TimeToStr(zaman2)). 314 .Button64Click(Sender: TObject). TimeOf(zaman): Tanımlama: function TimeOf(const AValue: TDateTime): TDateTime. zaman2:=TimeOf(Now). ShowMessage('Time='+TimeToStr(zaman1)+#13#10+ 'TimeOf='+TimeToStr(zaman2)). İki fonksiyonu kullanarak da aktif saati öğrenebilirsiniz.Time-GetTime: Tanımlama: function Time: TDateTime. end. function GetTime: TDateTime. end. begin zaman1:=Time. Fonksiyondan geriye dönen değer zaman içerikli olacağı için yazdırmak için TimeToStr tip dönüşüm fonksiyonunu kullanmalısınız. var zaman1. procedure TForm1.

Caption:=DateTimeToStr(tarih). Parametre ile belirtilen tarih ve zamanın sadece zaman ile ilgili kısmını string e çevirip yazdırmak için kullanılır.TimeToStr(tarih_zaman): Tanımlama: function TimeToStr(Time: TDateTime): string. Fonksiyondan geriye dönen değer tarihsel içerikli olduğu için DateTimeToStr (DateToStr de olurdu) tip dönüştürme fonksiyonundan faydalanmalısınız.Button66Click(Sender: TObject). Aşağıdaki örnekte TimeToStr ile DateTimeToStr arasındaki fark anlatılmıştır. var zaman:TDateTime. begin zaman:=Now. overload. Today: Tanımlama: function Today: TDateTime.Button67Click(Sender: TObject). Aktif tarihi (saatsiz olarak) yazdırmak için kullanılan bir fonksiyondur.//11/07/2003 end. procedure TForm1. end. //aktif tarihi zamanı atar Form1. function TimeToStr(Time: TDateTime. ShowMessage('TimeToStr='+TimeToStr(zaman)+#13#10+ 'DateTimeToStr='+DateTimeToStr(zaman)). const FormatSettings: ): string. var tarih:TDateTime. procedure TForm1. overload. begin tarih:=Today. 315 .

Button68Click(Sender: TObject). //şuanki tarih 11/07/2003 hafta:=WeekOf(tarih). overload. var tarih:TDateTime. AMonth: Word): Word.//Yılın kaçıncı haftası Form1.hafta’. overload. procedure TForm1. begin tarih:=Now. hafta:Word. Bu da belirtilen tarih içerisinde o aya ait hangi haftada bulunulduğunu hesaplayan bir fonksiyondur. Parametreyle belirtilen tarih değerinin yılın kaçıncı haftasına karşılık geldiğini hesaplayan bir fonksiyondur. function WeekOfTheMonth(const AValue: TDateTime. begin yarin:=Tomorrow. Aktif tarihten (Date) bir gün sonraki tarihi bulmak için kullanılan bir fonksiyondur (Date+1). procedure TForm1.hafta yazar end. 316 . var yarin:TDateTime. //28 . //Yarınki tarih Form1. WeekOfTheMonth(tarih): Tanımlama: function WeekOfTheMonth(const AValue: TDateTime): Word. Fonksiyondan geriye dönen değer tam sayı olduğu için yazdırılma işlemi ancak IntToStr tip dönüştürme fonksiyonu kullanılarak yapılabilir.Button69Click(Sender: TObject).Caption:=DateTimeToStr(yarin). var AYear. end.Tomorrow: Tanımlama: function Tomorrow: TDateTime.Caption:=IntToStr(hafta)+’ . WeekOf(tarih): Tanımlama: function WeekOf(const AValue: TDateTime): Word.

tarih2).tarih2): Tanımlama: function WeeksBetween(const ANow.Caption:=IntToStr(hafta). Fonksiyondan geriye dönen değer tam sayı olduğu için IntToStr tip dönüştürme fonksiyonu sayesinde yazdırılabilir.//52 yazar end.03. hafta:Word. Parametre ile girilen yılın kaç haftadan oluştuğunu hesaplayan fonksiyondur. //ayın kaçıncı haftası Form1.Button71Click(Sender: TObject).Caption:=IntToStr(WeeksInAYear(2003)).Button72Click(Sender: TObject).2003'). begin tarih1:=StrToDate('01. tarih2:=StrToDate('01. begin Form1. hafta:=WeekOfTheMonth(tarih). WeeksInAYear(yıl): Tanımlama: function WeeksInAYear(const AYear: Word): Word.05.Button70Click(Sender: TObject). procedure TForm1. //8 hafta fark var yazar end. var tarih:TDateTime. Fonksiyondan geriye dönen değer tam sayı tipli olduğu için IntToStr fonksiyonu sayesinde yazdırabilirsiniz. var tarih1. end.procedure TForm1. WeeksBetween(tarih1.Caption:=IntToStr(adet)+' Hafta Fark Var'. 317 . adet:Word. procedure TForm1. adet:=WeeksBetween(tarih1. Parametre olarak girilen iki tarih arasındaki hafta sayısını hesaplayan bir fonksiyondur.tarih2:TDateTime. begin tarih:=Now.//arada kaç hafta var Form1. AThen: TDateTime): Integer.2003').

deger:word. Ayrıca parametre olarak girilen tarih değişkenlerinin yerlerini değiştirmeniz sonucu değiştirmeyecektir.//arada kaç yıl var Form1.//sadece yılı al Form1.//2003 yazar end. begin tarih:=Now.Caption:=IntToStr(deger). Parametre olarak girilen tarih zaman değerinden sadece yıla ait olan bölümü döndüren fonksiyondur. AThen: TDateTime): Integer.03. Çünkü bu fonksiyon sonucun mutlak değerini döndürmektedir (diğer bir çok fonksiyon da böyleydi zaten). procedure TForm1. Şayet iki tarih arasındaki fark bir yıldan küçükse “0” değerini döndürecektir. deger:Integer.tarih2): Tanımlama: function YearsBetween(const ANow.tarih2:TDateTime. Fonksiyondan geriye dönen değer tam sayı tipli olacağı için yazdırmak için IntToStr fonksiyonundan faydalanmalısınız.Button74Click(Sender: TObject). 318 .2006').YearOf(tarih): Tanımlama: function YearOf(const AValue: TDateTime): Word. begin tarih1:=StrToDate('01. tarih2:=StrToDate('01. //3 yazar end. deger:=YearOf(tarih). deger:=YearsBetween(tarih1.02.tarih2). var tarih1. procedure TForm1.2003'). var tarih:TDateTime.Caption:=IntToStr(deger). Fonksiyondan geriye dönen değer tam sayı tipli olacağı için yazdırmak için IntToStr fonksiyonundan faydalanmalısınız. YearsBetween(tarih1. Parametre ile belirtilen tarihlerin arasında kaç yıl bulunduğunu hesaplayan fonksiyondur.Button73Click(Sender: TObject).

Bir önceki güne ait (date-1) tarihi hesaplayabilen bir fonksiyondur. 319 .Caption:='Önceki Günkü Tarih '+DateToStr(tarih).Yesterday: Tanımlama: function Yesterday: TDateTime. procedure TForm1. end.Button75Click(Sender: TObject). var tarih:TDateTime. Fonksiyondan geriye dönen değer tarih içerikli olacağı için yazdırmak ancak DateToStr tip dönüştürme fonksiyonu sayesinde olabilecektir.//önceki günkü tarihi al Form1. begin tarih:=Yesterday.

String – İçerikli Fonksiyonlar: Delphi’de string veriler üzerinde işlem yapabilmenizi sağlayacak bir çok fonksiyon tanımlanmıştır. S2: string): Integer. AnsiCompareText(aranacak_metin. S2: string): Integer.Caption:='İçinde Var' //burası işler else Form1.içinde_aranacak) Tanımlama: function AnsiCompareStr(const S1. bulunmuyorsa negatif. end. iki metin aynı ise sıfır değeri dönecektir. Fonksiyonun kullanımında küçük büyük harf duyarlılığına dikkat etmelisiniz. sayi:Integer. Birinci parametreyle girilecek olan metni. ikinci parametrede aramak için kullanılan bir fonksiyondur.sonuc).içinde_aranacak) Tanımlama: function AnsiCompareText(const S1.sonuc:AnsiString. sonuc:='Prestige Education Center'. //içinde varmı if sayi>0 then Form1. Aksi takdirde yanlış sonuçlar yaratabilirsiniz. 320 . begin metin:='Center'.Caption:='İkisi Aynı'.Caption:='İçinde Yok' else if sayi<0 then Form1. Aşağıda bu husus örneklendirilmiştir. Şayet ilk parametre ikinci parametrenin içerisinde bulunuyorsa sonuç pozitif. Dikkatlice inceleyiniz. Aşağıda bu fonksiyonlar sırasıyla işlenmektedir. var metin.Button1Click(Sender: TObject). Yalnız bu fonksiyonun kullanımı küçük – büyük harf duyarlılığına hassas değildir. Yani “ali” ile “ALI” nin aynı oldukları kabul edilecektir (Fonksiyondan geriye sıfır değeri dönecektir). AnsiCompareStr(aranacak_metin. procedure TForm1. AnsiCompareStr fonksiyonuyla aynı işi yapar. sayi:=AnsiCompareStr(metin.

Fonksiyonda kullanılan parametre değerlerinin küçük büyük harf duyarlılığının bulunduğunu hatırlatıp.Caption:=sonuc.Button2Click(Sender: TObject).procedure TForm1. sonuc:=AnsiDequotedStr(metin. Form1. sayi:=AnsiCompareText(metin.Caption:='İçinde Yok' else if sayi<0 then Form1.sonuc).sonuc:AnsiString. //içinde varmı if sayi>0 then Form1.Button3Click(Sender: TObject).Caption:='İçinde Var' else Form1.Caption:='İkisi Aynı'. begin metin:='Prestige'. AnsiDequotedStr(metin. 321 . //Burası işler end. Şayet bulursa ilk ve son karakteri atarak kalan değeri döndürür. begin metin:='Prestige'. AQuote: Char): string.karakter) Tanımlama: function AnsiDequotedStr(const S: string. sayi:Integer. İkinci parametreyle belirtilen karakteri.'P'). “AnsiCompareText” fonksiyonunun küçük – büyük harf duyarlılığının olmadığını belirterek diğer fonksiyonların incelenmesine geçiyorum. sonuc:='PRESTIGE'. //restig yazar end. var metin. procedure TForm1.sonuc:AnsiString. diğer fonksiyonları incelemeye devem edeceğim. var metin. birinci parametreyle belirtilen metnin ilk harfinde arar.

Controls.adet) Bu fonksiyonu kullanabilmeniz için uses satırına StrUtils kütüphanesini eklemeniz gerekmektedir. 322 . Şayet parametre içerisinde küçük harflerden oluşan karakterlere rastlarsa onlara dokunmaz. Dialogs.4). Bu fonksiyonla birinci parametreyle belirtilen metnin sol tarafından.//nihat demirli yazar end. //Pres yazar end. var metin. Parametre değeri ile girilen metni küçük harfe çevirmek için kullanılan bir fonksiyondur.Caption:=sonuc.Button6Click(Sender: TObject).sonuc:AnsiString. StdCtrls. sonuc:=AnsiLeftStr(metin. procedure TForm1. const ACount: Integer): AnsiString. //StrUtils eklemeyi unutmayınız.sonuc:AnsiString.AnsiLeftStr(metin. AnsiLowerCase(metin) Tanımlama: function AnsiLowerCase(const S: string): string.Caption:=sonuc. begin metin:='NIHAT DEMIRLI'. ikinci parametreyle belirtilen adet kadar karakter sökülüp alınabilir.//ilk dört karakteri al Form1. SysUtils. Classes. procedure TForm1. Messages. Fonksiyondan geriye dönecek olan değer AnsiString tipli bir veri içereceği için herhangi bir kontrolde direkt yazdırılabilir. Tanımlama: function AnsiLeftStr(const AText: AnsiString. Forms.//küçük harfe çevir Form1. uses Windows. begin metin:='Prestige'. Variants.StrUtils. var metin.Button4Click(Sender: TObject). Graphics. sonuc:=AnsiLowerCase(metin).

Caption:=sonuc.//Eklemeyi unutmayınız. Dialogs. var metin. Variants. Forms.StrUtils.3). üçüncü parametre ile belirtilen sayı kadar karakteri söküp alır.StrUtils. ExtCtrls. ikinci parametredeki karakterden sonra. Örneğimiz için formunuzun başlığına gerekli olan metni ekleyip bir adet de Timer kontrolü yerleştirmeniz yeterli olacaktır. karakterden sonraki üç karakteri al Form1. 323 .başlangıç. //StrUtils eklemeyi unutmayınız. SysUtils.//res yazar end. Controls. Controls. Graphics. begin metin:='Prestige Education Center'. Messages. Birinci parametre ile belirtilen metinden.//Eklemeyi unutmayınız procedure TForm1.AnsiMidStr(metin. Messages. Graphics. Forms.Button7Click(Sender: TObject). SysUtils. Dialogs. Şimdi aşağıdaki gibi bir uygulamayla formunuzun başlığında kayan yazı oluşturabilirsiniz. Classes. Fonksiyondan geriye dönen değer AnsiString tipte bir veri olacağı için kolayca yazdırılabilir.kaçadet) Tanımlama: function AnsiMidStr(const AText: AnsiString. const AStart. StdCtrls. uses Windows. sonuc:=AnsiMidStr(metin. ACount: Integer): AnsiString.2.sonuc:AnsiString. Variants.//2. uses Windows. Classes.

//Kayan Yazı Oluştur var ilk.//20 yazar end.//soldan bir karakteri sök al son:=AnsiMidStr(metin.Caption:=son+ilk. if sonuc<>0 then //içinde varsa Form1. procedure TForm2.1). uzunluk:=Length(metin).Caption:=IntToStr(sonuc).son:AnsiString. sonuc:Integer.aranan:AnsiString.//metnin uzunluğunu bul ilk:=AnsiLeftStr(metin.metin).Aşağıdaki kodları eklemiş olduğunuz Timer kontrolünün “Timer” yordamına yazıp programınızı çalıştırabilirsiniz.//ik karakterden sonraki tüm karakterler Form2.içinde_aranan_metin) Tanımlama: function AnsiPos(const Substr.Button8Click(Sender: TObject).uzunluk-1). Örneğimizde Edit kutusuna girilecek olan dosya adında (uzantısıyla beraber) “.Caption. uzunluk:Integer. Şayet bulursa ilk karakterin kaçıncı karakterde bulunduğunu.2. procedure TForm1. begin metin:=Form2. bulamazsa da sıfır değerini döndürür. AnsiPos(aranacak_metin. begin metin:='Prestige Education Center'. İkinci parametre içerisinde birinci parametreyle girilen değeri arar.metin. aranan:='Center'.Timer1Timer(Sender: TObject).” Karakteri aratılmakta. var metin. Şimdi bu fonksiyona güzel bir örnek verelim. S: string): Integer. sonuc:=AnsiPos(aranan. 324 .//yanyana yaz end. Formunuzun başlığına (properties penceresinde yer alan Caption özelliğine) atamış olduğunun metnin devamlı hareket ettiğini göreceksiniz.

Button1Click(Sender: TObject). //Noktadan sonrasını al Edit2.ad.Text:=ad. procedure TForm1.Length(dosya)+sonuc). begin metin:='Ne Var'. üçüncü parametre ile belirtilen metni aktarabilen bir fonksiyondur.'Haber'). AToText: string): string. begin dosya:=Edit1. AnsiReplaceStr(metin.Caption:=sonuc. Aşağıdaki tasarımı oluşturup gerekli olan kodları ekleyiniz.//Dosya adını yaz Edit3.Button9Click(Sender: TObject). //Noktadan öncesi uzanti:=AnsiMidStr(dosya. ikinci parametre ile belirtilen bölümün yerine.'. Birinci parametre ile girilen metin içerisindeki.yeni_metin) Tanımlama: function AnsiReplaceStr(const AText. Form1. sonuc:= AnsiReplaceStr(metin. AFromText. procedure TForm2.dosya). sonuc:=AnsiPos('.sonuc:AnsiString. var dosya. var metin.ardında dosya adı Edit2 ye.//Nokta kaçıncı karakter ad:=AnsiLeftStr(dosya. sonuc:Integer. 325 . uzantısı da Edit3 e yazdırılmaktadır. //Dosyanın uzantısını yaz end.değişecek_metin.sonuc-1).'Var'.Text.Text:=uzanti.sonuc+1. //Ne Haber yazar end.uzanti:AnsiString.

//Ne Haber yazar end. procedure TForm1. Aşağıda bu fonksiyon örneklendirilmektedir. Yani aranan değerin “var” veya “Var” olması fonksiyon için fark etmeyecek. Form1.Caption:=sonuc.//Ters çevir Form1. begin metin:='Ne Var'.Button9Click(Sender: TObject). begin metin:='Nihat'.sonuc:AnsiString.yeni_metin) Tanımlama: function AnsiReplaceText(const AText. “AnsiReplaceStr” fonksiyonu ile aynı işi yapar. metni değiştirecektir. Değiştirilecek metnin bulunamaması durumunda değer aynen döndürülür.//tahiN yazar end.'var'.değişecek_metin. AToText: string): string. var metin. sonuc:=AnsiReverseString(metin). //Ters Yaz var metin. 326 . Fonksiyonun küçük büyük harfe duyarlı olduğunu belirtmek isterim (Yani “Var” aranmaktadır “var” değil).'Haber').Örneğe dikkat edecek olursanız metin değişkeninin içeriği olan “Ne Var” stringi içerisindeki “Var” ın yerine “Haber” yazması söylenmiştir. AnsiReplaceText(metin. AFromText. AnsiReverseString (metin) Tanımlama: function AnsiReverseString(const AText: AnsiString): AnsiString. Sonuçta haliyle “Ne Haber” olarak oluşmuştur. Parametre ile girilen metin değerini ters çevirerek. procedure TForm1. Aralarındaki tek fark bu fonksiyonun harf duyarlılığının olmamasıdır. yeni bir metin oluşturan fonksiyondur.Button10Click(Sender: TObject). sonuc:= AnsiReplaceText (metin.Caption:=sonuc.sonuc:AnsiString.

AnsiRightStr(metin. Birinci parametre ile girilen metnin sağ tarafından (sonundan).//büyük harfe çevir 327 . begin metin:='Prestige'. //sağdan 4 karakteri al Form1.Button12Click(Sender: TObject).Button11Click(Sender: TObject). //StrUtils eklemeyi unutmayınız. AnsiUpperCase(metin) Tanımlama: function AnsiUpperCase(const S: string): string. begin metin:='nihat demirli'. Forms. //tige yazar end. Dialogs. Variants.StrUtils.Fonksiyondan geriye dönen değer AnsiString tipte bir içeriğe sahip olduğu için başlıkta dönüştürme yaptırmadan yazdırılabilmektedir. //Büyük Harfe Çevir var metin. Graphics. sonuc:=AnsiRightStr(metin. Controls.sonuc:AnsiString. procedure TForm1. SysUtils. uses Windows. Messages.sonuc:AnsiString. StdCtrls.sağdan_kaç_karakter) Tanımlama: function AnsiRightStr(const AText: AnsiString. Classes.Caption:=sonuc. //Sağdan kopar var metin. sonuc:=AnsiUpperCase(metin).4). Aşağıda bu fonksiyon örneklendirilmiştir. Parametre ile girilen metni büyük harfle yazdırabilmek için kullanılan bir fonksiyondur.//Eklemeyi unutmayınız procedure TForm1. const ACount: Integer): AnsiString. ikinci parametre ile belirtilen sayı kadar karakteri söküp alabilen bir fonksiyondur.

Fonksiyon küçük büyük harfe hassas şekilde çalışmaktadır. CompareText(metin1.sonuc). begin metin:='Prestige'. Aralarındaki tek fark bu fonksiyonun harf duyarlılığının olmamasıdır. CompareStr(metin1. S2: string): Integer.Caption:='İçinde Var' //burası işler else Form1. sayi:=CompareStr(metin.Caption:='İçinde Yok' else if sayi<0 then Form1. negatif sayı veya sıfırdır. ikinci metnin içerisinde birinci metnin 328 .sonuc:AnsiString. bulamazsa pozitif. içinde yok kısmı işleyecektir. İkinci metnin içerisinde birinci metni arar. //İçinde ara var metin. end. //içinde varmı if sayi>0 then Form1. Yani ilk parametrenin (metin) değerini ‘prestige’ (hepsi küçük) olarak değiştirirseniz. Fonksiyonun geriye döndürdüğü değer pozitif sayı.Caption:='İkisi Aynı'. procedure TForm1.metin2) Tanımlama: function CompareText(const S1. ikisi aynı ise sıfır değerini döndürür. Birinci ve ikinci parametre ile girilen metinlerin eşit olup olmadıklarını kontrol edebilen bir fonksiyondur. S2: string): Integer.// NIHAT DEMIRLI yazar end.metin2) Tanımlama: function CompareStr(const S1. şayet bulursa negatif.Button13Click(Sender: TObject). sayi:Integer.Caption:=sonuc. CompareStr fonksiyonuyla aynı işi yapar. Bu değeri basit bir dallanmaya tabi tutarak. sonuc:='Prestige Education Center'.Form1.

index. Fonksiyondan geriye dönen değer yine bir AnsiString 329 . begin metin1:='Nihat'.. Şayet araya boşluk bırakılması istenirse. ikinci parametrede belirtilen karakterden sonra... //yanyana yaz Form1.metinn) Tanımlama: function Concat(s1 [..sonuc:AnsiString.... Index. metin2:='Demirli'. procedure TForm1.. s2. procedure TForm1. sonuc:=Concat(metin1. üçüncü parametreyle belirtilen adet kadar karakteri söküp alabilen bir fonksiyondur..metin2). begin metin1:='Nihat'.. //arada boşluk bırak Form1.//Nihat Demirli yazar end.' '.... metin2:='Demirli'.Button14Click(Sender: TObject)...(harf duyarlılığı olmadan) var olup olmadığını kolayca öğrenebilirsiniz. function Copy(S. Concat(metin1.metin2.sonuc:AnsiString. Parametre ile belirtilen değişken değerlerini yanyana yazdırmak için kullanılan bir fonksiyondur.Caption:=sonuc. o zaman kodu aşağıdaki şekilde değiştirmelisiniz. Count: Integer): string.adet) Tanımlama: function Copy(S. Count: Integer): array.Caption:=sonuc.. Index.metin2).. Copy(metin. sonuc:=Concat(metin1. Birinci parametreyle girilen metnin içeriğinden.metin2..Button14Click(Sender: TObject).//NihatDemirli yazar end. CompareStr fonksiyonuyla çalışma mantığı benzeştiği için burada örneklendirme yapmamayı uygun buldum (Siz isterseniz aynı örneği çözebilirsiniz). var metin1.metin2. sn]: string): string.. var metin1.

Caption:=metin.Caption:=sonuc.//1.1.Button16Click(Sender: TObject).//Education yazar end. DupeString(metin. Birinci parametreyle girilen metni. üçüncü parametreyle girilen sayı kadar karakteri söküp atan bir prosedürdür. sonuc:=Copy(metin. ACount: Integer): string.adet) Tanımlama: function DupeString(const AText: string. var metin.veri olacağı için sonuç herhangi bir tip dönüştürme işlemine gerek kalmadan direkt olarak yazdırılabilir. Birinci parametre ile girilen metin değerinden. Aşağıda bu fonksiyona ait örneklendirme yapılmıştır. var metin.adet) Tanımlama: procedure Delete(var S: string. begin 330 . //Yanar yazar end.index. procedure TForm1. procedure TForm1.5). karakterden sonraki 5 karakteri at Form1.sonuc:AnsiString. Count:Integer). ikinci parametreyle girilen adet kadar yanyana yazmak için kullanılan bir fonksiyondur. Dikkatlice inceleyiniz.karakterden sonraki 9 karakter Form1. yapılan değişikliğin metin isimli parametrenin değerine yansıyacağıdır.sonuc:AnsiString. Index. Dikkat edeceğiniz husus. Delete(metin.Button17Click(Sender: TObject).10. Delete(metin. begin metin:='Sibel Yanar'. procedure TForm1.9). begin metin:='Prestige Education Center'. var metin:AnsiString.Button15Click(Sender: TObject). ikinci parametre ile girilen karakterden sonra.//10.

metin2:='Education'.//ilk üç karakteri al Form1. karakterden sonra metin2 //yi ekle sonucu metin1 de göster Form1.adet) Tanımlama: function LeftBStr(const AText: AnsiString. LeftBStr(metin. Burada dikkat edeceğiniz husus.Button18Click(Sender: TObject). begin metin:='Prestige'. var metin. sonuc:=DupeString(metin.//Prestige EducationCenter yazar. begin metin1:='Prestige Center'. end.Caption:=sonuc.metin:='Yüksel İnan'.//2 kere yanyaya yaz Form1. //Yüksel İnan Yüksel İnan yazar end.başlangıç_karakteri) Tanımlama: procedure Insert(Source: string. //Pre yazar end.//10.Caption:=sonuc. sonuc:= LeftBStr(metin. Birinci parametreyle girilen metni.metin. const AByteCount: Integer): AnsiString. yapılan değişikliğin ikinci parametre değerine yansıyacağıdır. procedure TForm1.Caption:=metin1. ikinci parametreyle belirtilen adet kadar karakteri söküp alabilen bir fonksiyondur. Insert(metin2.metin1. üçüncü parametrede belirtilen karakterden sonra eklemek için kullanılan bir prosedürdür. Index: Integer). var S: string. Birinci parametreyle belirtilen metinden.sonuc:AnsiString. var metin1.3). procedure TForm1.2). Insert(eklenecek_metin.metin2:AnsiString. 331 .10). ikinci parametreyle girilen metne.Button19Click(Sender: TObject).

İstediğiniz fonksiyonu veya prosedürü kullanabilirsiniz. const AStart. MidStr(metin. var metin:AnsiString. Parametre ile belirtilen metnin kaç karakterden oluştuğunu hesaplayabilmek için kullanılan bir fonksiyondur.Caption:='İsminiz '+ IntToStr(uzunluk)+' Karakterden Oluşuyor'. Length(metin) Tanımlama: function Length(S): Integer. LowerCase(metin) Tanımlama: function LowerCase(const S: string): string.Button20Click(Sender: TObject). üçüncü parametre ile girilen adet kadar karakteri parçalayıp almak için kullanılan bir fonksiyondur. ikinci parametre ile girilen başlangıç karakterinden başlayarak.Daha öncede aynı işlemi yapan fonksiyonu göstermiştik. overload. function MidStr(const AText: WideString. 332 . end. ACount: Integer): WideString. uzunluk:=Length(metin). Parametre olarak girilen metni küçük harfe dönüştürmek için kullanılır. begin metin:='Nihat Demirli'. uzunluk:Integer. overload. Birinci parametre ile belirtilen metinden. const AStart. Fonksiyondan geriye dönen değer tam sayı tipli olacağı için.adet) Tanımlama: function MidStr(const AText: AnsiString. Form1. Başında “Ansi” olan fonksiyon ve prosedürlerin kullanabileceği karakterler daha fazladır. procedure TForm1. ACount: Integer): AnsiString. başlıkta yazdırmak tip dönüştürme fonksiyonu sayesinde yapılabilmektedir. AnsiLowerCase (daha önce izah edildi) fonksiyonunun yaptığı işi yapar (Ansi kütüphanesinin daha zengin olduğunu hatırlatalım). Ama tercih tamamen sizlere kalmıştır.başlangıç.

Birinci parametre ile girilen değer ile ikinci parametre ile girilen değeri karşılaştırmak için kullanılan bir fonksiyondur. Pos(metin1. function RightStr(const AText: WideString. var metin. Birinci parametre ile belirtilen metnin sonundan. overload.sonuc:AnsiString.Text. S: string): Integer. var metin. sonuc:Integer. const ACount: Integer): WideString.metin2) Tanımlama: function Pos(Substr: string.2. end. Şayet iki parametre farklı değerler içeriyorsa (içinde bulunmuyor ise) sonuç “0” olacaktır. 333 . RightStr(metin. procedure TForm1. karakterden sonraki 6 karakter ShowMessage(sonuc).Caption:='Şifre Yanlış'. sonuc:=MidStr(metin. ikinci parametre ile belirtilen adet kadar karakteri söküp almak için kullanılan fonksiyondur (AnsiRightStr fonksiyonunun yaptığı işi yapar). procedure TForm1.//girilen metin gazi mi if sonuc=0 then //edit kutusuna gazi girilmedi ise Form1. const ACount: Integer): AnsiString. begin metin:='Gazi Üniversitesi'. overload.sağdan_kaç_karakter) Tanımlama: function RightStr(const AText: AnsiString.Button22Click(Sender: TObject). //azi Ün yazar boşlukta bir karakterdir end. begin sifre:=Edit1.sifre).sonuc:AnsiString. //Bo fonksiyou şifre uygulamalarında kullanmayın var sifre:AnsiString.procedure TForm1.//2.6).Button21Click(Sender: TObject).Button23Click(Sender: TObject). sonuc:=Pos('gazi'.

4). ikinci parametre ile belirtilen katarın. Birinci parametre ile belirtilen metne. SetLength(metin. len: Integer). //katar değişkeni begin yaz:='Sibel'.begin metin:='Ayşe Yanar'.Button24Click(Sender: TObject).Caption:=metin. //ilk 4 karakteri aktar Form1.soldan_kaç_karakter) Tanımlama: procedure SetString(var s: string. //Si yazar end. sonuc:=RightStr(metin.yaz. var metin:AnsiString.5).Caption:=metin. üçüncü parametre ile belirtilen adet kadar karakterini (soldan) aktarabilen bir prosedürdür. SetLength(metin. 334 .//Sibe yazar end. procedure TForm1.soldan_kaç_karakter) Tanımlama: procedure SetLength(var S. SetString(metin. NewLength: Integer). yaz:PChar. //ilk iki karakteri aktar Form1. begin metin:='Sibel'. buffer: PChar. //sağdan 5 karakteri al Form1. SetString(metin. //Yanar yazar end.Caption:=sonuc. var metin:AnsiString. ikinci parametre ile belirtilen adet kadar karakteri söküp alabilen bir prosedürdür.katar.2). Birinci parametre ile belirtilen metinden. procedure TForm1.Button25Click(Sender: TObject).

Unutmayınız ki Char tipli verilerle AnsiString tipli veriler aynı değildir. Biliyorum hepiniz Edit Kutusuna girilen karakteri yanyana yazdırmayı deneyeceksiniz. ikinci parametre ile girilen metne aktarmak için kullanılan bir prosedürdür. 335 .Str(sayi. Count: Integer): string. procedure TForm1. begin metin:='prestige'.Caption:=metin. var metin:AnsiString.Button26Click(Sender: TObject). Str(555. var S).//metne aktar Form1. ama olmayacak. ikinci parametre ile belirtilen adet kadar yan yana yazdırmak için kullanılan bir fonksiyondur. Görsel diller çıkmadan önce çok kullanılan (hakikaten işe yarardı) bir fonksiyondu (Pascal.10). begin metin:=StringOfChar('*'.//10 adet ********** yazar end.adet) Tanımlama: function StringOfChar(Ch: Char.metin) Tanımlama: procedure Str(X [: Width [: Decimals ]]. İlk parametre parasal tipte bir değişken de olabilir.sonuc:AnsiString. var metin. procedure TForm1. Form1. Birinci parametre ile belirtilen karakteri. Bilhassa başlık ve paragraf altlarını çizdirmek için kullanılırdı. Birinci parametre ile girilen sayıyı (ondalıklı veya tam sayı). C vs).Button27Click(Sender: TObject).Button28Click(Sender: TObject). StringOfChar(karakter. //555 yazar end. procedure TForm1.Caption:=metin.metin). Bu tip durumlarda izleyeceğiniz yol aşağıdaki gibi olmalıdır.

StringReplace(metin.. sonuc:=StringReplace(metin. Flags: TReplaceFlags): string. begin secenek:=[rfReplaceAll].//yanyana yaz Form1.'Az'. //Harf Duyarlılığı var metin:='Senin Çok Paran Var'. Form1. karakter:Array[0.Caption:=sonuc.sonuc:AnsiString.Text)). üçüncü parametre ile verilen içerikle değiştirmek için kullanılan bir fonksiyondur. procedure TForm1.değişece_bölüm.Button29Click(Sender: TObject).PChar(Edit1. procedure TForm1. 336 . NewPattern: string.//10 adet ********** yazar end.secenek). var metin.//unutmayın begin secenek:=[rfIgnoreCase].sonuc:AnsiString.//Editteki karakteri char tip değişkene al metin:=StringOfChar(karakter[0].yeni_bölüm.10). Aynı kodu aşağıdaki şekilde yazarsanız bu durumda küçük büyük harf duyarlılığı gösterecek dolayısıyla sonuç da farklı olacaktır.//Çok ile Az ı değiştir Form1.Caption:=sonuc.'çok'. //Senin Çok Paran Var yazar end.secenek). secenek:TReplaceFlags.Button29Click(Sender: TObject).seçenek) Tanımlama: function StringReplace(const S.Caption:=metin. begin StrCopy(karakter. //Senin Az Paran Var yazar end.//küçük büyük harf duyarlılığı yok metin:='Senin Çok Paran Var'.var metin:AnsiString.1] Of Char.'çok'. var metin. Birinci parametre ile verilen metin içerisinde. ikinci parametre ile verilen kısmı.'Az'. OldPattern. sonuc:=StringReplace(metin. secenek:TReplaceFlags.

[rfReplaceAll]). Parametre ile girilen metnin sol ve sağındaki tüm boşlukları atmak için kullanılan bir fonksiyondur. procedure TForm1. const ASubText: string): string. //Senin Az Paran Var yazar end. var metin. StringReplace fonksiyonuna benzer iş görmektedir. [] işareti içerisinde kullanmayı sakın unutmayın.3. procedure TForm1.sonuc:AnsiString.başlangıç. begin metin:=' Prestige '.'çok'. StuffString(metin. ALength: Cardinal. sonuc:=StuffString(metin. Dilerseniz gösterimini aşağıdaki şekilde de kullanabilirsiniz.7. begin metin:='Senin Çok Paran Var'. sonuc:=StringReplace(metin. Trim(metin) Tanımlama: function Trim(const S: string): string.//Prestige yazar 337 .'Az'.yeni_metin) Tanımlama: function StuffString(const AText: string.Caption:=sonuc.uzunluk. var metin. overload. değiştirilecek olan kısmın burada karakter sayısı ile belirlenmesidir. Her iki durumda da sonuç aynı olacaktır.'Az'). sonuc:=Trim(metin).Button30Click(Sender: TObject). Aralarındaki fark. overload. function Trim(const S: WideString): WideString.Burada kullanılan “TreplaceFlags” nesnesi küme tipte Delphi tarafından tanımlanmış bir nesnedir.Button31Click(Sender: TObject). karakterden sonraki üç karakterin yerine Az yaz Form1. //7.sonuc:AnsiString. Aşağıda bu fonksiyon örneklendirilmiştir.Caption:=sonuc. AStart.//Boşlukları at Form1.

Caption:=sonuc. begin metin:=' Prestige'.//Prestige yazar end. overload. procedure TForm1.Button32Click(Sender: TObject). Son kısımda bulunan boşluklara dokunmaz. sonuc:=TrimRight(metin).sonuc:AnsiString. TrimLeft(metin) Tanımlama: function TrimLeft(const S: string): string. TrimRight(metin) Tanımlama: function TrimRight(const S: string): string. 338 . begin metin:='Prestige '. Parametre ile girilen metnin sağ tarafında bulunan boşlukları atmak için kullanılan fonksiyondur. Bilhassa yanlışlıkla space tuşuna basılması durumunda oluşabilecek olan hataları engellemek amacıyla kullanılan bir fonksiyondur. overload. Parametre ile girilen metnin sol tarafında bulunan boşlukları atmak için kullanılan fonksiyondur. function TrimLeft(const S: WideString): WideString. function TrimRight(const S: WideString): WideString.end. procedure TForm1.Caption:=sonuc. overload. var metin. Başlangıç kısımda bulunan boşluklara dokunmaz.Button33Click(Sender: TObject).//sol boşlukları at Form1. sonuc:=TrimLeft(metin). var metin.//Prestige yazar end.sonuc:AnsiString. Bu fonksiyondan dolayı kelimeler arasında bulunan boşluklar hiç bir değişikliğe uğramazlar (aynen kalırlar).//sağ boşlukları at Form1. overload.

Daha önce örneklendirildiği için tekrar değinilmeyecektir. overload.işlenv. begin metin:='Prestige Education Center'. Parametre ile girilen metindeki karakterlerin tamamını büyük harfe çevirmek için kullanılan fonksiyondur.' '. end. MaxCol: Integer):string.UpperCase(metin) Tanımlama: function UpperCase(const S: string): string.#9.sonuc:AnsiString. ['. Parametre ile girilen Ascii (0-255 arası) değerinin karakter karşılığını bulmak için kullanılan bir fonksiyondur. 339 . procedure TForm1. Görüldüğü belirtilen karakterlere (Space) rastladığı anda alt satıra inerek devam etmektedir.Button35Click(Sender: TObject).'. nBreakChars: TSysCharSet.'-']. ShowMessage(sonuc).alta_indirecek_karakterler. Chr(sayi) Tanımlama: function Chr(X: Byte): Char. function WrapText(const Line. MaxCol: Integer = 45):string. var metin. Aşağıdaki örneği dikkatlice inceleyiniz. üçüncü parametrede belirleyeceğiniz karakterlerden herhangi birtanesine rastlaması durumunda alt satıra indirmek için kullanılan bir fonksiyondur. Şayet metin içerisinde büyük harfe rastlarsa onlara dokunmayacaktır.maxkarakter) Tanımlama: function WrapText(const Line. BreakStr: string. Birinci parametrede belirleyeceğiniz metni. sonuc:=WrapText(metin. overload. #13#10. 10). WrapText(metin.

begin metin:=Chr(65). Form1.FormCreate(Sender: TObject).Button36Click(Sender: TObject). var metin:AnsiString.Caption:=metin.Items. 340 . Parametre ile girilen karakterin ascii değerini hesaplayan bir fonksiyondur.// A yazar end.Add(Chr(i)+'='+IntToStr(i)) end. Aşağıdaki gibi bir kodlama sayesinde tüm karakterlerin Ascii kod karşılıklarını ListBox içerisinde yazdırabilirsiniz. Fonksiyondan tam sayı tipli bir değer döneceği için yazdırmak için IntToStr tip dönüştürme fonksiyonunu kullanmalısınız. var i:Byte. procedure TForm3. Ord(karakter) Tanımlama: function Ord(X).procedure TForm1. begin for i:=0 to 255 do ListBox1.

Fonksiyonu örneklendirecek olursak; Edit kutusuna girilecek olan karakterin Ascii karşılığını başlıkta yadırmak için aşağıdaki gibi “KeyPress” yordamına kod yazmalısınız. procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: Char); begin Form3.Caption:=IntToStr(Ord(Key)); end; Button kontrolüne (Biliyorum herkez bunu yapmak isteyecek) tıklayarak aynı işlemi yaptırmak isterseniz (Key i kendiniz yaratmalısınız) aşağıdaki gibi bir kodlamaya ihtiyacınız olacaktır. procedure TForm1.Button37Click(Sender: TObject); var karakter:Pchar;//Katar tanımlanıyor begin karakter:=PChar(Edit1.Text); Form1.Caption:=IntToStr(Ord(karakter^)); end; veya procedure TForm1.Button38Click(Sender: TObject); var karakter:Array[0..2] of Char; begin StrCopy(karakter,PChar(Edit1.Text)); Form1.Caption:=IntToStr(Ord(karakter[0])); end; Val(metin,değişken,hata)
Tanımlama: procedure Val(S; var V; var Code: Integer);

341

Birinci parametreyle girilen içeriğin soldan matematiksel anlamı olan kısmını ikinci parametreye aktarır. Prosedür sayesinde ikinci parametrenin değeri değişecektir. procedure TForm3.Button2Click(Sender: TObject); var deger,hata:Integer; begin Val(Edit1.Texr,deger,hata); Form3.Caption:=IntToStr(deger); end; Şimdi aşağıdaki tasarımı oluşturun. Daha sonra verilen kodları Button kontrolünün “OnClick” yordamına yazıp programı çalıştırınız.

procedure TForm3.Button2Click(Sender: TObject); var metin:AnsiString; deger,hata:Integer; begin metin:=Edit1.Text; Val(metin,deger,hata); Form3.Caption:=IntToStr(deger); end; Sonuca dikkat edecek olursanız. Edit kutusu içerisinde sayıya çevrilebilen kısım (sayıya çevrilemeyen ilk karaktere rastladığı anda diğerlerine bakmaz) alınarak, ikinci parametre ile girilen değişkene aktarılmıştır. Bu değişkenin değeri de formunuzun başlığında yazdırılmaktadır. StrToInt(metin)
Tanımlama: function StrToInt(const S: string): Integer;

342

String içerikli değerleri tam sayıya çevirmek için kullanılan bir fonksiyondur. Sayısal içeriğe çevrilemeyen bir karaktere rastlarsa hata üretecektir. procedure TForm1.Button40Click(Sender: TObject); var metin:AnsiString; deger:Integer; begin metin:='555'; deger:=StrToInt(metin);//tam sayıya çevir Form1.Caption:=IntToStr(deger*2); //1110 yazar end; StrToIntDef(metin,varsayılan_değer)
Tanımlama: function StrToIntDef(const S: string; const Default: Integer): Integer;

StrToInt fonksiyonu ile aynı işi yapar. Aralarındaki tek fark şayet sayıya dönüştürülemeyecek bir değer gönderilirse, bu durumda fonksiyon hata üretmemekte, ikinci parametre ile belirtilen değeri işleme sokmaktadır. Farkı anlamanız için aşağıdaki iki örneği dikkatlice inceleyiniz. procedure TForm1.Button41Click(Sender: TObject); var metin:AnsiString; deger:Integer; begin metin:='555A'; deger:=StrToIntDef(metin,0);//tam sayıya çevir çevrilemiyorsa deger isimli //değişkenin değerini 0 yap Form1.Caption:=IntToStr(deger*2); //0 yazar end; Üstteki kodlamada metin değişkeninin içeriğinde “A” karakteri (sayıya çevrilemez) bulunduğu için, deger isimli değişkenin içeriği ikinci parametre ile girilen “0” değerine eşit olacaktır. Bu aktarmayı StrToInt fonksiyonu ile yaparsanız uygulamanız size hata mesajı verecektir. procedure TForm1.Button41Click(Sender: TObject); var metin:AnsiString; deger:Integer; begin 343

metin:='555'; deger:=StrToIntDef(metin,0);//tam sayıya çevir şayet çevrilemiyorsa deger //isimli değişkenin değerini 0 yap Form1.Caption:=IntToStr(deger*2); //1110 yazar end; Yukarıdaki örnekte ise metin değişkeninin içeriğinde sayıya çevrilemeyen bir karakter olmadığı için deger isimli değişkenin değeri “555” olacaktır. Bu dönüştürme işlemini StrToInt fonksiyonuyla yaparsanız aynı sonuca ulaşırsınız (sayıya çevrilemeyen hiç yabancı karakter yoktur). StrToFloat(metin)
Tanımlama: function StrToFloat(const S: string): Extended; overload; function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;

Parametre ile girilen metni ondalıklı sayıya çevirmek için kullanılan bir fonksiyondur. Ondalıklı sayıya çevrilemeyecek bir karaktere rastlarsa uygulamanız hata mesajı verecektir. procedure TForm1.Button42Click(Sender: TObject); var deger:Real; metin:AnsiString; begin metin:='555,111'; deger:=StrToFloat(metin);//ondalıklı sayıya çevir Form1.Caption:=FloatToStr(deger);//555.111 yazar end; StrToFloatDef(metin,varsayilan_değer)
Tanımlama: function StrToFloatDef(const S: string; const Default: Extended): Extended; overload; function StrToFloatDef(const S: string; const Default: Extended; const FormatSettings: TFormatSettings): Extended; overload;

Ondalıklı sayıya çevrilemeyen bir karaktere rastlanılması durumunda StrToFloat fonksiyonu hata mesajı veriyordu. Bu fonksiyonla hata mesajını engelleyip varsayılan değerin kullanılmasını sağlayabilirsiniz.

344

procedure TForm1.Button43Click(Sender: TObject); var metin:AnsiString; deger:Real; begin metin:='555A,456'; deger:=StrToFloatDef(metin,0);//ondalıklı sayıya çevir Form1.Caption:=FloatToStr(deger*2); //0 yazar end; Metin değişkeni içerisinde ondalıklı sayıya çevrilemeyecek karaktere rastladığı için deger isimli değişkenin içeriğini varsayılan (yani 0) kabul ederek işleme devam edecektir. IntToStr(sayi)-FloatToStr(ondalıklı_sayı)
Tanımlama: function IntToStr(Value: Integer): string; overload; function IntToStr(Value: Int64): string; overload;

Parametre olarak girilen tam sayıyı stringe çevirmek için kullanılan fonksiyondur. Bilhassa kullanıcının görmesini istediğiniz içerikleri stringe çevirmek zorunda kalacaksınız.
Tanımlama: function FloatToStr(Value: Extended): string; overload; function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string; overload;

Parametre olarak girilen ondalıklı sayıyı string içeriğe çevirmek için kullanılan fonksiyondur. Diğer fonksiyonlarda yeterince uygulama yapıldığı için tekrar örnek verilmeyecektir. FloatToStrF(ondalıklı_sayı,format,uzunluk,ondalıklı_uzunluk)
Tanımlama: function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digits: Integer): string; overload; function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digits: Integer; const FormatSettings: TFormatSettings): string; overload;

Birinci parametre ile girilen ondalıklı sayıyı ikinci parametrede belirtilen formatlı hale dönüştürmek için kullanılan bir fonksiyondur. procedure TForm4.Edit1Exit(Sender: TObject); 345

var metin:AnsiString; sayi:Extended; begin sayi:=StrToFloat(Edit1.Text); metin:=FloatToStrF(sayi,ffCurrency,Length(Edit1.Text),2); Edit1.Text:=metin; end; Fonksiyonda kullanılan birinci parametre, formatlanacak olan sayıyı, üçüncü parametre toplam karakter sayısını, dördüncü parametrede ondalıklı kısımda gözükecek olan karakter sayısını belirlemek için kullanılmaktadır. İkinci parametre ise uygulanacak olan formatı belirleyecek olan bölümdür. Alabileceği seçenekler aşağıda verilmektedir.
ffCurrency ffNumber ffFixed ffExponent ffGeneral Parasal Format için kullanılır Binlik ayıraç uygulanmış halde gösterilir Ondalıklı Formatta gösterilir Sayı üstel olarak gösterilir Üstel veya normal gösterim

procedure TForm4.Edit1Exit(Sender: TObject); var metin:AnsiString; sayi:Extended; begin sayi:=StrToFloat(Edit1.Text); metin:=FloatToStrF(sayi,ffCurrency,Length(Edit1.Text),2);//parasal format Edit1.Text:=metin; end; procedure TForm4.Edit2Exit(Sender: TObject); var 346

metin:AnsiString; sayi:Extended; begin sayi:=StrToFloat(Edit2.Text); metin:=FloatToStrF(sayi,ffCurrency,Length(Edit2.Text),2);//parasal format Edit2.Text:=metin; end; Parasal formatın nasıl olacağı (TL-$) Windows’unuzun bölgesel ayarlar kısmından otomatik olarak alınmaktadır. Eğer bölgesel ayarlar kısmından Türkiye seçilmişse, paranızın sonuna Delphi tarafından “TL” otomatik olarak konulacaktır. Şayet “USA” seçilmişse o zaman da “$” karakteri paranızın sonuna otomatik olarak eklenecektir. FormatFloat(format_tipi,sayi)
Tanımlama: function FormatFloat(const Format: string; Value: Extended): string; overload; function FormatFloat(const Format: string; Value: Extended; const FormatSettings: TFormatSettings): string; overload;

İkinci parametre ile girilen ondalıklı sayıya, birinci parametre ile belirlenen formatı uygulayan fonksiyondur. Birinci parametre için belirleyebileceğiniz format tipleri aşağıda tablo halinde verilmiştir.
#,##0.00 #.## 0.00 1,234.00 1234 1234.00

Şimdi fonksiyona ait bir örnek yapalım. Aşağıdaki gibi bir form tasarımı oluşturun.

Aşağıdaki kodları gerekli yordamlara ekleyip programınızı çalıştırınız. procedure TForm4.Edit3Change(Sender: TObject); var 347

metin:AnsiString; begin metin:=FormatFloat('#,',StrToFloat(Edit3.Text)); Form4.Caption:=metin; end;

Rastgele Sayı Üretim Fonksiyonları Delhi’de rastgele sayı üretmek son derece kolaydır. Bu işlem için tanımlanmış olan Random fonksiyonunu kullanabilirsiniz. Aşağıda bu fonksiyona ait tanımlamanın nasıl yapıldığını görebilirsiniz.
Tanımlama: function Random [ ( Range: Integer) ];

Random fonksiyonu parametresiz kullanılırsa 0-1 arasında rastgele ondalıklı sayı üretecektir. Aşağıdaki kodlamaya dikkat ediniz. procedure TForm1.Button1Click(Sender: TObject); var sayi:Real; begin sayi:=Random;//0-1 arasında ondalıklı sayı üret Form1.Caption:=FloatToStr(sayi); end; Yukarıdaki şekilde üreteceğiniz sayıları kullanmanız pek faydalı olmayacaktır. Bu yüzden parametre değeri girilerek istenilen aralıklarda sayı üretmek mümkün olmaktadır. Aşağıdaki kodlamaya dikkat ediniz. Random(50); Satırı sayesinde 0-49 arasında değer üretilebilir.

348

procedure TForm1.Button1Click(Sender: TObject); var sayi:Real; begin sayi:=Random(50); //0-49 arasında sayı üret Form1.Caption:=FloatToStr(sayi); end; Aşağıdaki gibi bir kod satırıyla da istenilen aralıkta rastgele sayı üretmeniz mümkün olacaktır. sayi:=Random(50)+75; //75-124 arasında sayı üret Burada girilen ikinci sayı alt sınırı, ikisinin toplamı da üst sınırı belirleyecektir. procedure TForm1.Button2Click(Sender: TObject); var sayi:Real; begin sayi:=Random(50)+75; //75-124 arasında sayı üret Form1.Caption:=FloatToStr(sayi); end; Rastgele sayı üretim fonksiyonlarında kullanılan diğer bir fonksiyonda “Randomize” dir. Bu fonksiyon üretilecek olan sayıların aynı periyotta oluşmasını engelleyecektir. procedure TForm1.Button2Click(Sender: TObject); var sayi:Real; begin Randomize;//Saate göre sayı üret sayi:=Random(50)+75; //75-124 arasında sayı üret Form1.Caption:=FloatToStr(sayi); end; Artık programınızı her çalıştırdığınız zaman değişik sayılar üretmeniz mümkün olacaktır. RandomFrom(dizi)
Tanımlama: function RandomFrom(const AValues: array of Double): Double; overload; function RandomFrom(const AValues: array of Integer): Integer; overload; function RandomFrom(const AValues: array of Int64): Int64; overload;

349

function RandomFrom(const AValues: array of string): string; overload;

Parametre ile belirtilen dizi elemanlarından rastgele bir tanesinin değerini döndürmek için kullanılan fonksiyondur. Dizi eleman değerleri dışında başka bir değerin döndürülmesi sözkonusu değildir. procedure TForm1.Button3Click(Sender: TObject); var x:Array[0..4] of Integer; sonuc:Integer; begin x[0]:=100;x[1]:=200; x[2]:=300;x[3]:=400;x[4]:=500; sonuc:=RandomFrom(x);//dizi elemanlarından seç Form1.Caption:=FloatToStr(sonuc); end; Yukarıdaki örneği inceleyecek olursanız; X dizi değişkeninin {100,200,300,400,500} olmak üzere 5 adet elemanı bulunmaktadır. Her defasında bu elemanlardan bir tanesinin değerini döndürecektir. RandomRange(sayi1,sayi2)
Tanımlama: function RandomRange(const AFrom, ATo: Integer): Integer;

Parametre ile belirtilen iki tam sayı arasında rastgele tam sayı üretmek için kullanılan fonksiyondur. Üretilen sayılar arasında üst sınır yoktur. procedure TForm1.Button4Click(Sender: TObject); var sonuc:Integer; begin sonuc:=RandomRange(10,100);//10-99 arasında rastgele tamsayı üret Form1.Caption:=FloatToStr(sonuc); end; Parametre olarak belirtilen sayıların hangisinin büyük olacağı fonksiyon için önem arzetmemektedir. Sayısal Loto Programı: Aşağıdaki örnekte daha önce pointer değişken kullanılarak çözülen sayısal loto programının işaretçi değişken kullanılmadan çözümünün nasıl yapılabileceği gösterilmiştir. Aşağıdaki form tasarımını oluşturunuz. 350

Şimdi de aşağıdaki kodları “Üret” isimli buttonun “OnClick” yordamına ekleyip programınızı çalıştırınız. procedure TForm1.Button5Click(Sender: TObject); //uses satırına math eklemeyi unutmayın var loto:Array[0..5] of Integer; x,y:Integer; begin ListBox1.Clear;//Listeyi Temizle randomize; //rasgele sayı üret loto[0]:=RandomRange(1,50); //1-49 arasında rasgele sayı üret ListBox1.Items.Add(IntToStr(loto[0]));//ilk elmanı yaz for x:=1 to 5 do begin loto[x]:=RandomRange(1,50); //yeni sayı üret y:=0; repeat if loto[x]=loto[y] then //aynı sayı üretilirse begin loto[x]:=RandomRange(1,50); //yeniden üret y:=-1; end; inc(y); until y>x-1; ListBox1.Items.Add(IntToStr(loto[x])); end;end; “Üret” isimli buttona her tıkladığınız zaman liste temizlenerek, yeni altı adet sayı üretilecektir. 351

Dizi Fonksiyonları: Dizilerle ilgili işlemlerinizi kolay ve hızlı yapabilmeniz için Delphi’ye bir çok dizi fonksiyonu eklenmiştir. Aşağıda bu fonksiyonlar sırasıyla incelenmekte olup, ardından da örneklendirmeleri yapılmıştır. Fonksiyonların kullanılabilmesi için uses satırına math kütüphanesini eklemeyi unutmayınız. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,math;//eklemeyi unutmayınız. Mean(dizi)
Tanımlama: function Mean(const Data: array of Double): Extended;

Parametre ile girilen dizi elemanlarının aritmetik ortalamasını hesaplayan bir fonksiyondur. Dizi değişkeninin tipi ondalıklı sayı tipinde olmalıdır. procedure TForm1.Button1Click(Sender: TObject); //uses satırına math ı eklemeyi unutmayın const dizi:Array[0..3] of Double=(10,20,30,40);//tip ondalıklı olmalı var sonuc:Extended; begin sonuc:=Mean(dizi); Form1.Caption:='Elemanların Aritmetik Ortalaması='+FloatToStr(sonuc);end; Sum(dizi)
Tanımlama: function Sum(const Data: array of Double): Extended; register;

Parametre olarak diziye gönderilen elemanların toplamını hesaplayan bir fonksiyondur. procedure TForm1.Button2Click(Sender: TObject); //uses satırına math ı eklemeyi untmayın const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=Sum(dizi); Form1.Caption:='Elemanların Toplamı='+FloatToStr(sonuc);end;

352

SumInt(dizi)
Tanımlama: function SumInt(const Data: array of Integer): Integer register;

Parametre olarak girilen dizi elemanlarının toplamını hesaplayan bir fonksiyondur. Burada dikkat edeceğiniz husus, dizi elemanlarının tam sayı tipli tanımlanmaları gerektiğidir. procedure TForm1.Button3Click(Sender: TObject); const dizi:Array[0..3] of Integer=(10,20,30,40);//tam sayı tipli olmalı var sonuc:Integer; begin sonuc:=SumInt(dizi); Form1.Caption:='Elemanların Toplamı='+IntToStr(sonuc); end; Bir önceki fonksiyon zaten bu işlemi kolayca yapar demeyin. Çünkü tam sayılı işlemler çok daha hızlı bir şekilde sonuca ulaştırılırlar. SumOfSquares(dizi)
Tanımlama: function SumOfSquares(const Data: array of Double): Extended;

Parametre olarak girilen dizi elemanlarının karelerinin toplamını hesaplayan bir fonksiyondur. procedure TForm1.Button4Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=SumOfSquares(dizi); Form1.Caption:='Elemanların Kareleri Toplamı='+FloatToStr(sonuc); end; Fonksiyondan geriye dönen değer ondalıklı sayı olacağı için, reel tip bir değişkene aktarılmalıdır.

353

SumsAndSquares(dizi,toplam,kare_toplam
Tanımlama: procedure SumsAndSquares(const Data: array of Double; var Sum, SumOfSquares: Extended) register;

Birinci parametre ile girilen dizi değişkeninin elemanlarının toplamını ikinci parametreye, elemanlarının karelerinin toplamını da üçüncü parametreye aktaran bir prosedürdür. procedure TForm1.Button5Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Double=(10,20,30,40); var toplam,kare_toplam:Extended; begin SumsAndSquares(dizi,toplam,kare_toplam); ShowMessage('Elemanların Toplamı='+FloatToStr(toplam)+#13#10+ 'Elemanların Kareleri Toplamı='+FloatToStr(kare_toplam)); end;

Programı çalıştırıp button kontrolüne tıklarsanız, yukarıdaki pencere açılarak size gerekli sonuçları bildirecektir. TotalVariance(dizi)
Tanımlama: function TotalVariance(const Data: array of Double): Extended;

Dizi elemanlarına ait toplam varyansı hesaplayan birfonksiyondur. procedure TForm1.Button6Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=TotalVariance(dizi); Form1.Caption:='Variance='+FloatToStr(sonuc);end; 354

Variance(dizi)
Tanımlama: function Variance(const Data: array of Double): Extended;

Dizi elemanlarına ait varyans değerini hesaplayan fonksiyondur. procedure TForm1.Button7Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=Variance(dizi); Form1.Caption:='Variance='+FloatToStr(sonuc); end; EnsureRange(küçük,orta,büyük)
Tanımlama: function EnsureRange(const AValue, AMin, AMax: Integer): Integer; overload; function EnsureRange(const AValue, AMin, AMax: Int64): Int64; overload; function EnsureRange(const AValue, AMin, AMax: Double): Double; overload;

Parametre olarak girilen elemanlar arasında ortanca değere sahip olanı döndüren bir fonksiyondur. procedure TForm1.Button8Click(Sender: TObject); //uses satırına math eklemeyi unutmayın var sonuc:Extended; begin sonuc:=EnsureRange(40,100,70);//orta eleman Form1.Caption:='Ortadaki Değer'+FloatToStr(sonuc);//70 yazar end; High(dizi)
Tanımlama: function High(X);

Parametre ile girilen dizinin en son elemanının index numarasını döndüren bir fonksiyondur.

355

procedure TForm1.Button9Click(Sender: TObject); const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Integer; begin sonuc:=High(dizi); Form1.Caption:='En son Eleman='+IntToStr(sonuc); //3 yazar end; Örneğe dikkat edecek olursanız tanımlamış olduğunuz dizi değişkenin en son elemanının index numarası “3” tür. Bu değeri öğrenmek için kullanabileceğiniz önemli bir fonksiyondur (Bilhassa dinamik dizilerde kullanımı zorunlu gibidir). Low(dizi)
Tanımlama: function Low(X);

Parametre ile girilen dizinin ilk elemanının index numarasını döndüren bir fonksiyondur. procedure TForm1.Button9Click(Sender: TObject); const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Integer; begin sonuc:=Low(dizi); Form1.Caption:='En son Eleman='+IntToStr(sonuc); //0 yazar end; Dizinin ilk elemanı (dizi[0]) “0” olduğu için, örneğimizde geriye dönecek olan değer “0” olacaktır. Aşağıdaki gibi bir (veya benzeri bir durumda) durumda bu iki fonksiyon sizin için çok yararlı olacaktır. Sınıf mevcudunun bilinmediği (veya her sınıf için farklı olduğu) durumlarda dizinizin kaç eleman olacağı bilinemeyecek, aynı zamanda alt ve üst sınırları devamlı olarak farklı olacaktır. Sabit değerler yerine bu fonksiyonları kullanırsanız her zaman doğru sonuca ulaşmanız mümkün olacaktır.

356

procedure TForm1.Button11Click(Sender: TObject); var ogrenci:Array of Integer; mevcut,i:Integer; begin mevcut:=StrToInt(InputBox('Sınıf Mevcudunu Giriniz','Mevcut','')); SetLength(ogrenci,mevcut); for i:=Low(ogrenci) to High(ogrenci) do//ilk ten son elemana kadar ogrenci[i]:=StrToInt(InputBox('Notu Giriniz','Not','')) end; MaxIntValue(dizi)
Tanımlama: function MaxIntValue(const Data: array of Integer): Integer;

Parametre olarak girilen dizi elemanları içerisinde maximum değeri bulabilen bir fonksiyondur. Dikkat edeceğiniz husus dizi değişkenin tam sayı tipli olması gerektiğidir. procedure TForm1.Button12Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Integer=(10,70,30,40); var sonuc:Integer; begin sonuc:=MaxIntValue(dizi);//en büyük değeri bul Form1.Caption:='Maximum Değer'+IntToStr(sonuc);//70 yazar end; MaxValue(dizi)
Tanımlama: function MaxValue(const Data: array of Double): Double;

Yine parametre olarak girilen dizi elemanlarından en büyüğünün değerini döndürür. Üstünlüğü tam veya ondalıklı sayıların ikisi içinde kullanılabilmesidir. Fonksiyondan geriye dönecek olan değer ondalıklı sayı içereceği için FloatToStr tip dönüştürme fonksiyonu sayesinde yazdırılabilir.

357

procedure TForm1.Button13Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=MaxValue(dizi); Form1.Caption:='En Büyük Değer'+FloatToStr(sonuc); //40 yazar end; MinIntValue(dizi)
Tanımlama: function MinIntValue(const Data: array of Integer): Integer;

Parametre olarak girilen dizi elemanları içerisinde minimum değeri bulabilen bir fonksiyondur. Dikkat edeceğiniz husus dizi değişkenin tam sayı tipli olması gerektiğidir. procedure TForm1.Button12Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Integer=(10,70,30,40); var sonuc:Integer; begin sonuc:=MinIntValue(dizi);//en küçük değeri bul Form1.Caption:='Maximum Değer'+IntToStr(sonuc);//10 yazar end; MinValue(dizi)
Tanımlama: function MinValue(const Data: array of Double): Double;

Yine parametre olarak girilen dizi elemanlarından en küçüğünün değerini döndürür. Üstünlüğü tam veya ondalıklı sayıların ikisi içinde kullanılabilmesidir. Fonksiyondan geriye dönecek olan değer ondalıklı sayı içereceği için FloatToStr tip dönüştürme fonksiyonu sayesinde yazdırılabilir.

358

procedure TForm1.Button13Click(Sender: TObject); //uses satırına math eklemeyi unutmayın const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=MinValue(dizi);//en küçük değeri bul Form1.Caption:='En Büyük Değer'+FloatToStr(sonuc); //10 yazar end;

359

Klasör ve Dosya Fonksiyonları: Delphi içerisinde klasör ve dosya işlemlerinde kullanabilmeniz için bir çok fonksiyon tanımlanmıştır. Şimdi bu fonksiyonları sırasıyla incelemeye başlayalım. ChDir(klasör_yolu)
Tanımlama: procedure ChDir(const S: string); overload; procedure ChDir(P: PChar); overload;

Aktif dizini değiştirmek için kullanılan bir fonksiyondur. procedure TForm1.Button1Click(Sender: TObject); begin ChDir('c:\Winnt\system32');//aktif dizin değiştir end; Yukarıdaki gibi bir kod sayesinde aktif dizin 'c:\Winnt\system32' olmaktadır. Bu aşamadan sonra dosyanızı sadece ismini belirterek çalıştırmanız (system32 içerisindeki) mümkün olacaktır. CloseFile(dosya_yolu)
Tanımlama: procedure CloseFile(var F);

Dosyayı kapatmak için kullanılan bir prosedürdür. Aşağıdaki gibi bir kodlamayla dosyadaki ilk satırı okuyup formunuzun başlığında yazdırabilirsiniz (nihat.txt dosyasını yaratıp içerisine bilgi girmeyi unutmayınız). procedure TForm1.Button2Click(Sender: TObject); var yol: TextFile; S: string; begin s:='Nihat Demirli'; AssignFile(yol, 'c:\winnt\nihat.txt'); Reset(yol); Readln(yol, S); //Dosyadan oku Form1.caption:=s;//Başlıkta yaz CloseFile(yol); //Dosyayı kapat end; 360

CreateDir(klasör_yolu)
Tanımlama: function CreateDir(const Dir: string): Boolean;

Klasör oluşturmak için kullanılan bir fonksiyondur. Şayet belirtilen yerde klasörü başarıyla oluşturursa geriye true değerini, oluşturamazsa da false değerini döndürecektir. procedure TForm1.Button3Click(Sender: TObject); //Klasör oluştur begin if CreateDir('c:\winnt\gaziler') then //yaratıldıysa Form1.Caption:='Klasör yaratıldı' else Form1.Caption:='Klasör zaten Var. Veya Oluşturulamadı' end; Bu tip örneklerde var olan bir klasörü kontrol ederek kod yazarsanız daha doğru sonuç almanız mümkün olacaktır. Aşağıda bu husus örneklendirilmiştir. procedure TForm1.Button1Click(Sender: TObject); //uses FileCtrl eklemeyi unutmayınız begin if not DirectoryExists('c:\temp') then//klasör yoksa oluştur if not CreateDir('C:\temp') then ShowMessage(‘Oluşturulamadı’) end; DeleteFile(dosya_yolu)
Tanımlama: function DeleteFile(const FileName: string): Boolean;

Parametreyle belirtilen yoldaki dosyayı silmek için kullanılan bir fonksiyondur. Şayet silme işlemi başarılı bir şekilde gerçekleştiyse true değerini, aksi takdirde de false değerini döndürecektir. procedure TForm1.Button4Click(Sender: TObject); begin if DeleteFile('c:\winnt\nihat.txt') then //dosya silindi ise ShowMessage('Dosya Başarıyla Silindi') else ShowMessage('Dosya Bulunamadı'); end; 361

DirectoryExists(klasör_yolu)
Tanımlama: function DirectoryExists(const Directory: string): Boolean;

Parametre ile belirtilen yolda klasörün var olup olmadığını kontrol eden fonksiyondur. Fonksiyondan true değerinin dönmesi, belirtilen yolda o klasörün var olduğu anlamını taşımaktadır. Aşağıdaki örnekte önce klasörün var olup olmadığı kontrol ettirilmekte, şayet varsa silinmektedir. procedure TForm1.Button5Click(Sender: TObject); begin if DirectoryExists('c:\winnt\gaziler') then RmDir('c:\winnt\gaziler')//klasörü sil else ShowMessage('Silinecek Klasör Bulunamadı'); end; DiskFree(sürücü_numarası)
Tanımlama: function DiskFree(Drive: Byte): Int64;

Parametre ile belirtilen sürücü içerisindeki boş alanı öğrenmek için kullanabileceğiniz bir fonksiyondur. Sürücü numaraları ve değerleri aşağıda tablo halinde verilmiştir.
Numara 1 2 3 4 5 6 Adı A B C D E F

procedure TForm1.Button6Click(Sender: TObject); var bos_alan:Integer; begin bos_alan:=DiskFree(3);//c sürücüsünde ne kadar boş yer var Form1.Caption:=IntToStr(bos_alan); end;

362

DiskSize(sürücü_numarası)
Tanımlama: function DiskSize(Drive: Byte): Int64;

Parametre ile fonksiyondur.

belirtilen

sürücüdeki

boş

bellek

miktarını

hesaplayan

procedure TForm1.Button7Click(Sender: TObject); var kapasite:Integer; begin kapasite:=DiskSize(3);//c sürücüsünün toplam kapasitesi Form1.Caption:=IntToStr(kapasite); end; FileAge(dosya_yolu)
Tanımlama: function FileAge(const FileName: string): Integer;

Dosyanın yaratılış tarihini hesaplayabilen bir fonksiyondur. Aşağıdaki şekilde bir kodlamayla tüm dosyaların oluşturulma tarihlerini öğrenebilirsiniz. Fonksiyondan geriye dönen değer tam sayı tipinde olcağı için “FileDateToDateTime” tip dönüştürme fonksiyonu sayesinde tarihsel bir değişkene aktarılabilir. procedure TForm1.Button8Click(Sender: TObject); var zaman:TDateTime; goster:AnsiString; begin zaman:=FileDateToDateTime(FileAge('c:\gazi.txt'));//tarihe çevir goster:=DateTimeToStr(zaman); Form1.Caption:=goster; end; FileDateToDateTime(dosya_tarihi)
Tanımlama: function FileDateToDateTime(FileDate: Integer): TDateTime;

FileAge fonksiyonundan geriye dönen değeri DateTime tipine dönüştürmek için kullanılan bir fonksiyondur. Yukarıdaki örneği inceleyebilirsiniz.

363

FileExists(dosya_yolu)
Tanımlama: function FileExists(const FileName: string): Boolean;

Belirtilen yolda dosyanın var olup olmadığını kontrol eden bir fonksiyondur. Şayet dosya belirtilen yerde varsa geriye true değeri, yoksa false değeri dönecektir. Aşağıdaki uygulamada önce dosyanın var olup olmadığı kontrol ettirilmekte, ardından da varsa silinerek kullanıcıya uyarı verilmektedir. procedure TForm1.Button9Click(Sender: TObject); begin if FileExists('c:\winnt\nihat.txt') then//dosya varsa begin DeleteFile('c:\winnt\nihat.txt');//dosyayı sil ShowMessage('Dosya Başarıyla Silindi'); end else ShowMessage('Dosya Bulunamadı'); end; FileGetAttr(dosya_yolu)
Tanımlama: function FileGetAttr(const FileName: string): Integer;

Dosyaya ait özellikleri öğrenebilmek için kullanılan bir fonksiyondur. Kullanımına ait örnek aşağıda verilmiştir. Aşağıdaki form tasarımını oluşturup, bir adette OpenDialog kontrolü ekleyiniz.

364

procedure TForm2.Button1Click(Sender: TObject); var yol:AnsiString; sayi:Integer; begin if OpenDialog1.Execute then begin yol:=OpenDialog1.FileName;//seçilen dosya yolu sayi:=FileGetAttr(yol); if (sayi and faHidden)<>0 then CheckBox1.Checked:=true; if sayi and faSysFile<>0 then CheckBox2.Checked:=true; if sayi and faReadOnly<>0 then CheckBox3.Checked:=true; if sayi and faDirectory<>0 then CheckBox4.Checked:=true; if sayi and faArchive<>0 then CheckBox5.Checked:=true; if sayi and faVolumeId<>0 then CheckBox6.Checked:=true; end end; Button kontrolüne tıkladıktan sonra açılan pencereden özelliklerini öğrenmek istediğiniz dosyayı seçebilirsiniz. Dosyanızın özelliklerine göre CheckBox lardan uygun olanlar işaretlenecektir. FileIsReadOnly(dosya_yolu)
Tanımlama: function FileIsReadOnly(const FileName: string): Boolean;

Parametre ile belirtilen yoldaki dosyanın ReadOnly(salt okunur) olup olmadığını bildiren bir fonksiyondur. Bilhassa içerisinde değişiklik yapılıp yapılamayacağı durumunun önemli olduğu durumlarda çok işinize yarayacak bir fonksiyondur. Fonksiyondan, şayet dosya ReadOnly ise true, aksi durumda false değeri dönecektir. procedure TForm1.Button10Click(Sender: TObject); begin if FileIsReadOnly('c:\winnt\nihat.txt') then ShowMessage('Değişiklik Yapamazsınız'); end; 365

DirList: string): string. if yol='' then//dosya yoksa ShowMessage('Dosya Bulunamadı') else Form1.Button11Click(Sender: TObject). Eğer dosyayı bulursa. Aşağıdaki şekilde bir dosyaya hidden özelliği kazandırabilirsiniz.'c:\winnt.Button12Click(Sender: TObject). procedure TForm1. “c.\winnt” ve Birinci parametre ile belirlenen dosyaya ikinci parametre ile belirlenen özelliği atamak için kullanılan bir fonksiyondur.exe yazar end.//Hidden özelliği kazandır end. Yukarıdaki örnekte “Notepad. FileSetAttr(dosya_yolu.exe'. Özellik: faHidden faReadOnly faSysFile faVolumeid faDirectory faArchive Gizli dosya yapar Salt Okunur Yapar Sistem Dosyası Özelliği verir Etiket özelliği kazandırır Klasör Arşiv özeliği verir Açıklama 366 .FileSearch(dosya_adı. var yol:AnsiString.Caption:=yol.özellik) Tanımlama: function FileSetAttr(const FileName: string.//c:\winnt\notepad. bulduğu dosyanın yoluyla beraber ismini döndürecektir.aranacak_klasör) Tanımlama: function FileSearch(const Name. Şayet dosyayı bu klasörlerde bulamazsa geriye boş string değeri dönecektir procedure TForm1. Attr: Integer): Integer.txt'. begin yol:=FileSearch('notepada.faHidden). ikinci parametre ile belirleyeceğiniz klasörlerin içerisinde arar.exe” isimli dosya “c:\winnt\system32” klasörlerinin içerisinde aranmaktadır. Birinci parametre ile belirleyeceğiniz dosyayı. begin FileSetAttr('c:\winnt\nihat.c:\winnt\system32').

procedure TForm1.Button13Click(Sender: TObject).leri TsearchRec tipli üçüncü parametre olarak belirlenen değişkene aktarılır. Attr: Integer.Şayet birden fazla özellik aynı anda atanacaksa o zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz. procedure TForm1. Aşağıda bu fonksiyon örneklendirilmiştir.Button12Click(Sender: TObject). //hem ReadOnly hemde Hidden özelliği ver end. begin FindFirst('c:\winnt\*.ad) Tanımlama: function FindFirst(const Path: string. readonly vs.faAnyFile. İkinci parametre ile aranılacak dosyaya ait özellikler (hidden.özellik. end. FindNext(dosya) Tanımlama: function FindNext(var F: TSearchRec): Integer. ilk bulduğu dosyayı geriye döndürür. Aşağıdaki örnekte klasör içerisindeki tüm “txt” uzantılı dosyalar ListBox kontrolü içerisinde listelenmektedir. var F: TSearchRec): Integer. özellik vs.txt'.Caption:=dosya.Name. Yukarıdaki örnekte “c:\winnt” klasörünün içerisindeki txt dosyalarından ilk bulduğunu dosya isimli değişkene aktarmaktadır. yani aynı isme ve özelliğe sahip diğer dosyaların da bulunması gerekiyorsa bu durumlarda kullanacağınız fonksiyon FindNext fonksiyonudur.) tüm dosyalar listelenecekse.faHidden+faReadOnly). begin FileSetAttr('c:\winnt\nihat. Tek dosya değil de (tüm txt uzantılı dosyalar veya tüm exe uzantılı dosyalar vs. sadece bu özelliğe uyan ilk dosya bulunabilir. Belirtilen klasörün içerisinde joker karakterlerle belirtilen dosyaları arar.dosya).) belirlenebilir.txt'.archive. Burada kullanılan “faAnyFile” seçeneği özellikleri dikkate almadan işlem yap anlamındadır. Bulduğu dosyanın isim. Form1. FindFirst(dosya_yolu. 367 . var dosya:TSearchRec.

//iç içe klasör oluştur end. ForceDirectories(klasör_yolu) Tanımlama: function ForceDirectories(Dir: string): Boolean. //Kapat end. procedure TForm1. faAnyFile.//varsa sonrakini bul FindClose(dosya). dosya) = 0 then begin repeat ListBox1.Add(dosya.Button15Click(Sender: TObject). until FindNext(dosya) <> 0. var dosya:TSearchRec.Button14Click(Sender: TObject). Örnekte “c:\winnt” klasöründeki tüm txt dosyaları bulunup listBox kontrolüne aktarılmaktadır. Tek seferde iç içe birden fazla klasör oluşturmak için kullanılan fonksiyondur. 368 .Items. begin if FindFirst('c:\winnt\*.procedure TForm1. begin ForceDirectories('c:\nihat\prestige\gazi').txt'. end. Aşağıdaki gibi bir kodla aynı anda üç tane klasör iç içe oluşturulmaktadır.Name).

aktif_klasör) Tanımlama: procedure GetDir(D: Byte. 369 . Bu tür işlemlerde öncelikle klasörün var olup olmadığını kontrol ettirirseniz.GetCurrentDir Tanımlama: function GetCurrentDir: string. Kodunuzu aşağıdaki gibi değiştiriniz.//aktif klasörü yoluyla yaz end. begin Form1. Parametre ile belirtilen yoldaki klasörü silme için kullanılan bir fonksiyondur. Dikkat edeceğiniz husus silinecek olan klasörün içinin boş olması gerektiğidir. begin RemoveDir('c:\gazi\prestige'). var S: string). Birinci parametre ile verilen sürücü numarasındaki aktif klasörü öğrenmek için kullanılan bir fonksiyondur.Button16Click(Sender: TObject).Button18Click(Sender: TObject).Button17Click(Sender: TObject).Caption:=GetCurrentDir.// c sürücüsündeki aktif klasörü ver Form1. begin GetDir(3. procedure TForm1. GetDir(sürücü_numarası. var klasor:AnsiString. çok daha sağlıklı sonuçlar alırsınız.Caption:=klasor. procedure TForm1. end. procedure TForm1. RemoveDir(klasör_yolu) Tanımlama: function RemoveDir(const Dir: string): Boolean.//klasörü sil end. Parametresiz kullanılan bu fonksiyon sayesinde aktif çalışılan klasörün yolu öğrenilebilir.klasor).

begin RenameFile('c:\winnt\nihat. begin if FileExists('c:\winnt\nihat. end. RenameFile(dosya_yolu.txt'.txt') then //dosya varsa begin RenameFile('c:\winnt\nihat. Kodunuzu aşağıdaki gibi değiştiriniz.procedure TForm1. end else ShowMessage('Klasör Bulunamadı').Button19Click(Sender: TObject).yeni_isim) Tanımlama: function RenameFile(const OldName. procedure TForm1. belirtilen isimde kaydetmek için kullanılan fonksiyondur.txt'. 370 .'e:\gazi\sibel. Dilerseniz aynı yolu göstererek bulunduğu path içerisinde sadece dosyanın ismini değiştirmeniz de mümkündür.//ismi değiştir ShowMessage('İsim Değiştirildi'). begin if DirectoryExists('c:\gazi\prestige') then//klasör varsa begin RemoveDir('c:\gazi\prestige').txt').'e:\gazi\sibel. NewName: string): Boolean. procedure TForm1.Button18Click(Sender: TObject).txt'). Bu tür işlemlerde dosyanın var olup olmadığını kontrol ettirmek her zaman sağlıklı olacaktır. end.//klasörü sil ShowMessage('Klasör Silindi'). end.Button19Click(Sender: TObject). Birinci parametre ile verilen dosya ismini ikinci parametreyle belirtilen yere. end else ShowMessage('Dosya bulunamadı').

SelectDirectory(klasör_adı.Button20Click(Sender: TObject). 371 . //uses satırına FileCtrl kütüphanesini ekleyin var yol: string.1000) then Form1. const Root: WideString.help) Tanımlama: function SelectDirectory(const Caption: string. overload. if SelectDirectory(yol. Yukarıdaki kodu yazıp programı çalıştırırsanız. sdPrompt]. end. function SelectDirectory(var Directory: string. Bu fonksiyon sayesinde. out Directory: string): Boolean. Select Directory penceresi açtırılıp kullanıcının dizin seçmesi veya yaratması sağlanabilir.Caption := yol. HelpCtx: Longint): Boolean. sdPerformCreate. overload. aşağıdaki pencerenin açılmasını sağlarsınız. [sdAllowCreate.seçenekler. İkinci parametre için seçenekleri teker teker inceleyelim. Options: TSelectDirOpts. begin yol:= 'C:\Program Files'. Bu fonksiyonda birinci parametre Directory Name kısmında varsayılan olarak açılacağı yolu belirleyebilirsiniz. procedure TForm1.

Parametre ile girilen dosya yolunun bir üst klasörünün ismini döndüren fonksiyondur.• sdAllowCreate Bu parametre sayesinde “Directory Name” edit kutusunun gözüküp kullanıcının yeni bir klasör yaratabilmesini sağlayabilirsiniz. • sdPerformCreate Kullanıcının yeni bir klasör oluşturabilmesini sağlar. Programı çalıştırdıktan sonra açılan pencereden seçeceğiniz klasörün bulunduğu ana root. Form1. Uyarı penceresiyle karşılaşacaksınız (tabii ki hata yapmadı iseniz).Button21Click(Sender: TObject).//c\winnt yazar end. var dosya:AnsiString. begin dosya:=ExtractFileDir('c:\winnt\nihat. Bu fonksiyonu kullanabilmeniz için Uses satırına FileCtrl kütüphanesini eklemeyi unutmayınız. • sdPrompt Yanlış bir yol girildiği (olmayan bir yol) kullanıcıyı uyaracak pencerenin çıkıp çıkmamasını ayarlayan özelliğidir. Şayet açılan pencereye kullanıcı “Yes” derse klasör oluşacaktır. başlıkta yazacaktır. Olmayan bir klasör ismi belirtin.txt'). Pencereyi Yes düğmesiyle kapatın klasörünüzün oluştuğunu göreceksiniz. Şimdi yukarıdaki kodları ekleyip button kontrolüne tıklayın. ExtractFileDir(dosya_yolu) Tanımlama: function ExtractFileDir(const FileName: string): string. procedure TForm1. 372 . OpenDialog penceresinden seçilen klasörün bulunduğu partition sizin için daha önemli olacağından kodu aşağıdaki şekilde değiştirebilirsiniz.Caption:=dosya.

procedure TForm1.FileName). ExtractFileExt(dosya_yolu) Tanımlama: function ExtractFileExt(const FileName: string): string.Button21Click(Sender: TObject).Execute then 373 . begin if OpenDialog1. Form1. ExtractFileDrive(yol) Tanımlama: function ExtractFileDrive(const FileName: string): string. end. end. var dosya:AnsiString. Parametre olarak girilen dosyanın uzantısını bulmak için kullanılan bir fonksiyondur.Caption:=dosya.Button23Click(Sender: TObject). var dosya:AnsiString. begin if OpenDialog1. Parametreyle belirtilen yolun ait olduğu ana root (c-d-e-f vs) adını döndüren fonksiyondur. var dosya:AnsiString.FileName). procedure TForm1.Caption:=dosya.Execute then begin dosya:=ExtractFileDrive(OpenDialog1.Execute then begin dosya:=ExtractFileDir(OpenDialog1. end. begin if OpenDialog1.procedure TForm1. end.//seçilen dosyanın rootu Form1.Button22Click(Sender: TObject).

FileName). Form1.Execute then begin dosya:=ExtractFilePath(OpenDialog1.Execute then begin dosya:=ExtractFileName(OpenDialog1.begin dosya:=ExtractFileExt(OpenDialog1. end. Parametre ile girilen dosya yolundan dosyanın ismini söküp alabilen bir fonksiyondur. begin if OpenDialog1. ExtractFileName(dosya_yolu) Tanımlama: function ExtractFileName(const FileName: string): string.Caption:=dosya.Caption:=dosya. Form1. end.FileName).com veya .Caption:=’Seçtiğiniz Dosyanın Adı=’+dosya.//dosyanın bulunduğu //klasör Form1. end. procedure TForm1.Button24Click(Sender: TObject). procedure TForm1. Parametre ile girilen dosya yolunun bulunduğu bir üst klasörün ismini döndüren fonksiyondur. end.exe yazacaktır end. var dosya:AnsiString. begin if OpenDialog1.Button25Click(Sender: TObject).//seçilen dosyaya göre . 374 . var dosya:AnsiString. end.FileName). ExtractFilePath(dosya_yolu) Tanımlama: function ExtractFilePath(const FileName: string): string.

Parametre ile belirtilen dosya yolunu.Button26Click(Sender: TObject).Button27Click(Sender: TObject). WinExec(dosya_yolu. Şayet Edit kutusunda yazmış olduğunuz dosya yolundaki “exe” uygulamasını çalıştırmak isterseniz aşağıdaki gibi bir kodlama kullanmalısınız. end.Text). end.seçenek) Tanımlama: function WinExec. Burada kullanılan birinci parametre katar tipinde bir değişken (Pchar) tarafından tutulabilmektedir.Execute then begin dosya:=ExtractShortPathName(OpenDialog1. 375 . procedure TForm1. begin winExec('c:\Winnt\NotePad. Parametre ile girilen dosya yolundaki “exe” uzantılı dosyayı çalıştırmak için kullanılan (C’de yazılmıştır) bir fonksiyondur. var dosya:PChar.//katarı AnsiStringe çevir winExec(dosya. begin if OpenDialog1. Aşağıda komuta ait örneklendirme yapılmıştır. external kernel32 name 'WinExec'.FileName). end. var dosya:AnsiString.ExtractShortPathName(dosya_yolu) Tanımlama: function ExtractShortPathName(const FileName: string): string. end.exe'.Button27Click(Sender: TObject).SW_SHOW).//kısa isim Form1. begin dosya:=PChar(Edit1.//notepad i çalıştır. dosya ismi sekiz (uzantısı hariç) karakteri geçmeyecek şekilde gösteren fonksiyondur. procedure TForm1.Caption:=dosya.SW_SHOW). procedure TForm1.

Şimdi formunuza bir adet “OpenDialog” kontrolü ekleyip aşağıdaki kodları çalıştırınız. Program ekranı kaplasın mı. Bu pencereden dilediğiniz dosyayı seçip çalıştırabilirsiniz.exe'.Title:='Program Çalıştır'. SW_MAXIMIZE = 3. Aşağıda ikinci parametre yerine kullanabileceğiniz tüm seçenekler verilmiştir. SW_RESTORE = 9. SW_SHOWDEFAULT = 10. end. SW_SHOWMAXIMIZED = 3. SW_SHOWNA = 8. SW_NORMAL = 1.Filter:='Exe Dosyaları|*. procedure TForm1. seçeneklerini bu parametreyle belirleyebilirsiniz. var dosya_yolu:PChar. taskbar da mı açılsın vs. SW_SHOW = 5. SW_HIDE = 0. Programı çalıştırıp button kontrolüne tıklarsanız. begin OpenDialog1. SW_SHOWMINIMIZED = 2. SW_MINIMIZE = 6.//çalıştır end.//seçilen dosya WinExec(dosya_yolu.Execute Then begin dosya_yolu:=PChar(OpenDialog1.FileName).SW_SHOW).Button28Click(Sender: TObject). SW_SHOWNOACTIVATE = 4. Fonksiyonda kullanılan ikinci parametre (girilmesi zorunludur) exe dosyasının çalıştırılma şeklini belirlemek için kullanılmaktadır. 376 . SW_MAX = 10. OpenDialog1. if OpenDialog1. SW_SHOWMINNOACTIVE = 7. tanıdık bir pencere açılacaktır. SW_SHOWNORMAL = 1.

Açılan menüde Sharing seçeneğini seçin. UNC path (Network path) belirleyerek diğer bilgisayarlar için de kullanabilirsiniz. “UNC” path aşağıdaki şekilde girilebilir. Bir klasörü paylaşıma açmak için aşağıdaki adımları izlemeniz yeterli olacaktır. Veya “A” makinesinden “B” makinesindeki herhangi bir “exe” uygulamasını kolayca çalıştırabilirsiniz. Delphi bu iki karakteri yanyana görünce ağda işlem yapacağını anlayacaktır. Bu uygulamaları yapabilmeniz için diğer makinelerde kullanacağınız dosyaların bulunduğu klasörlerin paylaşıma açık ve yeterli derecede yetkiye sahip olmanız gerekmektedir. Paylaşım adına klasörünüzün ismini verip Ok basın. • • • • Paylaşıma açacağınız klasörü mous ile seçin. paylaşıma açtığınız klasörün paylaşım adını ve son olarakta ilgilendiğiniz dosyanın ismini girmelisiniz. açılan pencerede Network Identification yaprağından makine ismini öğrenebilirsiniz). Aşağıda “UNC” path kullanımına örnek olması bağlamında fonksiyonların bazılarına ait örnekler verilecektir. UNC Path Nasıl Belirtilir: Network trafinde işlem yapacaksanız standart olarak kullandığınız dosya yolu yerine “UNC” path belirtmelisiniz. açılan menüden properties i seçin. Mesela “A” makinesindeki bir dosyayı “B” makinesine “UNC” path belirterek kolayca gönderebilirsiniz. Mousun sağ tuşuna tıklayarak menünün açılmasını sağlayın. “\\Makine_ismi\klasör_paylaşım_ismi\dosya_adı” UNC path belirtirken “\\” iki adet ters slaşla işe başlamalısınız. Paylaşıma açılmış olan bir klasörün üzerinde el işareti windows tarafından oluşturulacaktır. Klasörün Paylaşıma Açılması: Network ortamında diğer makinelerin sizin klasörlerinizdeki dosyalara erişebilmeleri için o klasörü muhakkak paylaşıma açmalınız. Ardından ilgilendiğiniz dosyanın bulunduğu makine ismini (MyComputer üzerinde mousun sağ tuşuna tıklayın.Fonksiyonları Network Ortamında Kullanmak: Dosya yolu belirleyerek kullandığınız tüm fonksiyonları. 377 . Siz dosya veya klasör yolu girilen diğer tüm fonksiyonlar içinde aynen kullanabilirsiniz.

end. end else ShowMessage('Dosya Bulunamadı').Button30Click(Sender: TObject). begin RenameFile('c:\prestige\nihat. ardından dosya bu yol üzerinde ise “DeleteFile” fonksiyonu kullanılarak silinmektedir. “EFSANE” makinesindeki gazi (paylaşıma açık olması gerekir) isimli klasörün içerisine aynı isimle göndermeyi deneyeceğiz (taşıma). Diğer Makinedeki Dosyayı Silmek: Şimdiki örneğimizde “A” makinesinden (kendi makineniz) “EFSANE” isimli diğer bilgisayarda bulunan “gazi” klasörünün içerisindeki “nihat.txt” dosyasını sileceğiz.txt') then//dosya varsa begin mesaj:=Application. end.//EFSANE makineinden sil ShowMessage('EFSANE Bilgisayarından Dosya Silindi').MessageBox('Silinsinmi'.Button29Click(Sender: TObject). var mesaj:Word.'Dosya Sil'.mb_yesno). 378 . Ayrıca sileceğiniz dosyanın bulunduğu klasöründe paylaşıma açık olması gerekmektedir. Tekrar hatırlatmakta fayda var.Makineler Arası Dosya Transferi: Bu örnekte “A” makinesi içerisindeki (kendi makineniz) prestige klasöründe bulunan “nihat. if mesaj=mrYes then begin DeleteFile('\\EFSANE\gazi\nihat.txt').txt'. end. begin if FileExists('\\EFSANE\gazi\nihat. Diğer bilgisayarda o dosyayı silme yetkisine sahip olmalısınız.txt” dosyasını “RenameFile” fonksiyonunu kullanarak.'\\EFSANE\gazi\nihat. procedure TForm1. procedure TForm1. Programı çalıştırdığınız zaman ilk olarak “EFSANE” isimli bilgisayarda silinecek olan dosyanın var olup olmadığı “FileExists” fonksiyonu ile kontrol edilmekte (bulursa true değerini döndürür).txt').

379 . begin if FileExists('\\EFSANE\winnt\Notepad.//çALIŞTIR ShowMessage('Uygulama Başarıyla Çalıştırıldı').exe'.SW_SHOW).exe') then //dosya varsa begin WinExec('\\EFSANE\winnt\Notepad.Button31Click(Sender: TObject).exe” dosyasını çalıştıracağız (Winnt klasörünü paylaşıma açmayı unutmayın). end else ShowMessage('Dosya Bulunamadı'). procedure TForm1.Diğer Makinedeki “exe” Uygulamasını Çalıştırmak: Şimdiki örneğimizde “A” makinesinden (kendi makineniz) “EFSANE” isimli diğer bilgisayarda bulunan “Winnt” klasörünün içerisindeki “NotePad. end.

380 .Button1Click(Sender: TObject).//uzantı verilmezse txt kaydet if SaveDialog1. seçmiş olduğunuz yolda “txt” uzantılı dosyanız oluşacaktır. SaveDialog1. Formunuzun üzerine bir adet “Memo” ve “SaveDialog” kontrolü yerleştirip aşağıdaki şekilde içerisine gerekli metni giriniz.SaveToFile(dosya). begin SaveDialog1. Şimdi de aşağıdaki kodları button kontrolünün “OnClick” yordamına ekleyiniz.Lines.Log Dosyası Oluşturmak: Bu bölümde sizlere bilgisayarınızda bulunan bir “txt” (veya log-bat) dosyasındaki bilgileri hızlıca kontrolünüze nasıl alabileceğinizi ve kontrolünüzdeki verileri txt (veya diğer uzantılarla) uzantılı dosyada nasıl saklayabileceğinizi göstereceğim. İlk olarak kontroldeki verileri “txt” uzantılı bir dosyaya nasıl kaydedebileceğinizi gösterelim.//Kaydet end. end. procedure TForm1. //Kaydet var dosya:AnsiString.DefaultExt:='txt'.Execute Then begin dosya:=SaveDialog1. Programınızı çalıştırıp button kontrolüne tıkladıktan sonra.FileName. Memo1.Title:='Dosya Kaydet'.

SaveToFile('\\EFSANE\gazi\zeki.txt” dosyası oluşturularak “Memo” kontrolündeki içerik bu dosyaya aktarılmaktadır.Lines. begin if DirectoryExists('\\EFSANE\gazi') Then//Klasör varsa Memo1. Standart path belirterek yapacağınız tüm işlemleri “UNC” path belirterek de yapabilirsiniz. Tasarımınızda hiç bir değişiklik yapmadan kodu aşağıdaki şekilde değiştiriniz.Şimdi bu dosyanın üzerine mous ile çift tıklayarak açın. procedure TForm1.Button2Click(Sender: TObject). “A” bilgisayarından (kendi makineniz) “EFSANE” isimli diğer bilgisayarda bulunan “gazi” klasörünün içerisinde “zeki. 381 . Sanıyorum artık “UNC” path kavramını kavramışsınızdır.txt'). Kodlamada yapılan işlem şudur. Notpad te açılacak olan dosyanın içeriği “Memo” kontrolünüzdeki içerikle aynı olacaktır. end. Şimdi de aynı uygulamayı Network ortamı için oluşturalım.

Programınızın tasarımında hiç bir değişiklik yapmadan Button kontrolünün “OnClick” yordamındaki kodu aşağıdaki şekilde değiştirip uygulamanızı çalıştırınız. 382 .Title:='Dosya Aç'. Aynı uygulamayı şimdi de “UNC” Path kullanarak diğer bir bilgisayar için deneyelim.//Memoya Al end.Filter:='Text Dosyaları|*.Button1Click(Sender: TObject). Şayet herhangi bir hata yapmadı iseniz dosya içeriğinin “Memo” kontrolüne aktarıldığını göreceksiniz. Amacımız herhangi bir txt (logbat-ini) dosyasındaki bilgileri kontrol içerisine alarak kullanıcıya göstermektir. var dosya:AnsiString.LoadFromFile(dosya).Lines. procedure TForm2.Execute Then begin dosya:=OpenDialog1. Formunuzun üzerine bir adet “Memo” ve bir adet “OpenDialog” kontrolü ekleyerek aşağıdaki form tasarımını oluşturunuz. OpenDialog1.FileName.Log Dosyaları|*. end.log'.txt. begin OpenDialog1. Aşağıdaki kodlarıda Button kontrolünün “OnClick” yordamına ekleyiniz. if OpenDialog1.Şimdi de ikinci durumu incelemeye başlayalım. Memo1.

//Memo ya yaz end. end else ShowMessage('Dosya Bulunamadı').'c:\gazi\zeki.Lines. “ReadLn” methoduyla da dosya satır satır okunup “Memo” kontrolüne aktarılmaktadır. end.Add(satir).//Aç While not eof(oku) do //Dosya sonuna kadar ok begin Readln(oku.LoadFromFile('\\EFSANE\gazi\zeki. end.procedure TForm2. 383 .Lines. procedure TForm2. Kod satırlarını inceleyecek olursanız.txt').Button3Click(Sender: TObject). “AssignFile” methodu gösterilmektedir.Button2Click(Sender: TObject). sayesinde içeriği okunacak dosya referans “Reset” methoduyla referans gösterilen dosyanın sıralı erişim modunda açılması sağlanmaktadır.//Dosyayı göster Reset(oku).//satır satır oku satir değişkenine aktar Memo1. begin AssignFile(oku.//Dosya göstermek için tanımlandı satir:AnsiString. ShowMessage('Dosya Başarıyla Açıldı'). begin if FileExists('\\EFSANE\gazi\zeki.txt') Then //Dosya Varsa begin Memo1. “TextFile” Kullanarak Dosyadan Veri Okumak: Aşağıda aynı örnekler Sıralı Erişimli dosya mantığı kullanılarak çözülmektedir. var oku:TextFile. İlk olarak dosyada bulunan içeriğin Memo kontrolünde gösterilmesini inceleyelim.satir).txt').

Aşağıdaki kodları da Button kontrolünün “OnClick” Event ına yazınız.//Dosya göstermek için tanımlandı satir. var oku:TextFile. end.//Dosyayı göster Reset(oku).Execute Then begin yol:=OpenDialog1. 384 .satir).txt.Add(satir).FileName. Formunuzu aşağıdaki şekilde tasarlayın.*'.Filter:='Text Dosyaları|*.Aynı örneği “SaveDialog” penceresi kullanarak yapmak isterseniz kodunuzu aşağıdaki şekilde değiştirmeniz gerekecektir.//Aç While not eof(oku) do //Dosya sonuna kadar ok begin Readln(oku. if OpenDialog1. “TextFile” Kullanarak Dosyaya Veri Yazmak: Bu bölümde “TextFile” dosya değişkeni kullanarak “Memo” kontrolündeki bilgileri “txt” uzantılı dosyaya nasıl kaydedebileceğinizi göstereceğim. begin OpenDialog1.//okunan satırı satir değişkenine at Memo1. AssignFile(oku.Title:='Dosya Aç'.//Memo ya yaz end. procedure TForm2. OpenDialog1. end.Tüm Dosyalar|*.yol:AnsiString.Lines.yol).Button4Click(Sender: TObject).

var yaz:TextFile.yol). begin i:=0.//tüm satırları yaz inc(i). Yukarıdaki örneklerin ikisinde de “UNC” Path kullanabilirsiniz.//uzantı yazılmazsa txt kabulet if SaveDialog1.//dosyayı kapat end. Until i>Memo1.Lines[i]).FileName. 385 .DefaultExt:='txt'.procedure TForm1.yol:AnsiString.Title:='Dosya Kaydet'. Şayet hata yapmazsanız dosyalama işlemleriniz başarıyla gerçekleşecektir.Execute Then begin yol:=SaveDialog1. satir. Savedialog1.//yazma modunda aç Repeat WriteLn(yaz.Lines.//dosyayı referans et RewRite(yaz). AssignFile(yaz. i:Integer.Button3Click(Sender: TObject). CloseFile(yaz).Memo1. SaveDialog1. end.Count-1.

386 .

BÖLÜM 13 DELPHI KONTROLLERİ 387 .

388 .

end. Button kontrollerine ait kodlar aşağıda verilmiştir. Bu yüzden aktaracağınız değer sayısal içerik barındırıyorsa tip dönüştürme işlemi uygulamanız gerekecektir. procedure TForm1. Bu yüzden ilk olarak formlara ait özelliklere değinmek istiyorum. • Form1. begin metin:=Form1. Aşağıda bu kontrole ait tüm özellikler detaylı olarak incelenmektedir.Caption Formun başlığındaki içerik bu özellikle öğrenilebileceği gibi.Caption.Form Özellikleri: Windows tabanlı uygulamalar bir çok formun beraberce kullanılmasından oluşmaktadır.Button2Click(Sender: TObject).//değişkene aktar ShowMessage(metin). procedure TForm1. 389 . içeriği değiştirmek için de yine bu özellikten faydalanabilirsiniz.Caption:='Prestige Education Center'. //Başlığı Belirle begin Form1. Bu özellik AnsiString tipte bir veri barındırmaktadır. //Başlığı Öğren var metin:AnsiString.Button1Click(Sender: TObject).//başlıkta yaz end.

• Form1.//kaydırma çubuklarını ekle end. Aşağıda alabileceği değerler izah edilmiştir.Position Formun ekranda açılacağı yeri belirleyen özelliğidir. Sol taraftaki formun “AutoScroll” değerine “False” atanmış olup. begin Form1. procedure TForm1. begin Form1.• Form1.AutoScroll:=True. 390 .AutoScroll:=True.FormCreate(Sender: TObject).//ekranın ortasında end.AutoScroll Bu özellik sayesinde formun içerisindeki kontroller forma sığmadığı zaman kaydırma çubuklarının eklenip eklenmeyeceğini belirlemek için kullanılan bir özelliktir.FormCreate(Sender: TObject). Position poScreenCenter poDesigned poMainFormCenter poDesktopCenter poOwnerFormCenter Sonuç Ekranın Ortasında Açılır Tasarım Anındaki Koordinatlarda Açılır Ana Formun Ortasında Ekran Ortasında Açılır Üyesi Olduğu Formun Ortasında procedure TForm1. Kod penceresinden bu özelliğe aşağıdaki şekilde değer atayabilirsiniz. Form1.Position:=poScreenCenter. sağ taraftaki formun “AutoScroll” özelliği “True” değerini barındırmaktadır.

FormCreate(Sender: TObject). procedure TForm1. Min Max Buttonu var Var sayılan değer. tasarım anındaki yerinde vs. • Form1. begin Form1.Boyutlandırma serbest Formun başlık kısmı ufalır. Unit penceresinden de aşağıdaki şekilde değiştirebilirsiniz.boyutlandırılamaz Taşınabilir.Boyutlandırılamaz. Alabileceği değerler aşağıda verilmiştir. Form1. Boyutlandırılamaz 391 . BorderStyle bsNone bsDialog bsSingle bsSizeable bsSizeToolWin bsToolWindow Sonuç Başlık kısmı olmayan.Visible:=True.WindowState:= wsMinimized.Min Buttonu yok Formun Başlık kısmı ufalır.Max.//Taskbar da açıl end.• Form1.Man Max yok Taşınabilir.FormCreate(Sender: TObject).).WindowState Formun açılış anındaki boyutunu ayarlayan özelliğidir (Ekranı kapla-taskbarda açıl. taşınamaz. WindowState wsMinimized wsMaximized wsNormal TaskBar da Açıl Ekranı Kapla Tasarım Anındaki Boyutuyla Açıl Sonuç Kodla aşağıdaki şekilde değiştirmeniz mümkün olacaktır. Properties penceresinden ayarlayabileceğiniz gibi.//Formu gizle end. begin Form1.Visible Formun gözüküp gözükmemesini sağlayan özelliğidir. Aşağıda alabileceği tüm değerler verilmiştir.AutoScroll:=True. Taşıma. • Form1. Fakat Boyutlandırılamaz.BorderStyle Formun görünüşünü ve çerçeve şeklini ayarlayan özelliğidir. procedure TForm1.

//BorderStyle begin Form1. procedure TForm1. Max –Min düğmelerinin bulunmadığına ve başlığın daha da küçüldüğüne lütfen dikkat ediniz.BorderStyle:=bsNone. Form1. procedure TForm1. 392 .Aşağıdaki pencere “BorderStyle” özelliğine “bsNone” değerini aktardıktan sonra oluşmuştur. Ayrıca boyutlarının değiştirilmesinin mümkün olamayacağını da belirtelim. Formun başlık kısmının bulunmadığına ve kullanıcı tarafından boyutlandırılamayacağına dikkat ediniz.FormCreate(Sender: TObject). Form1.BorderStyle:=bsToolWindow. begin Form1. Aşağıdaki pencerede “BorderStyle” özelliğine “bsToolWindow” değeri aktarıldıktan sonra gösterilmiştir. end.AutoScroll:=True.AutoScroll:=True.FormCreate(Sender: TObject). end.

procedure TForm1. Aşağıdaki örnekte cursor hangi kontrolde ise formun başlığında o kontrolün ismini yazdıracağız.Caption:='Şu Anda Kontrol Edit1 de' else if Form1.Enabled:=True. procedure TForm1. aşağıdaki kodları da formunuza ekleyiniz.FormCreate(Sender: TObject). end.ActiveControl O anda kontrolün hangi kontrolde olduğunu öğrenebileceğiniz özelliğidir.Caption:='Şu Anda Kontrol Edit2 de'. Şimdi aynı işlemi “Idle” olayı yaratıp çözeceğim. begin if Form1. begin Timer1. Projenize bir adet “Timer”. 393 . iki adet “Edit” kontrolü yerleştirip. Programa ait kod satırları aşağıda verilmiştir.ActiveControl=Edit2 Then Form1. end.Interval:=10.Timer1Timer(Sender: TObject).• Form1.ActiveControl=Edit1 then Form1. Tasarımınızda hiçbir değişiklik yapmadan Unit pencerenizde bulunan kodları aşağıdaki şekilde değiştiriniz. Timer1.

Ardından cursor bu satırda iken “Ctrl+Shift+C” tuşlarına beraberce basın (prosedür kod bloğunu otomatik olarak oluşturacaktır).kontrol(sender: TObject. • Form1. Varsayılan değer budur.FormCreate(Sender: TObject). begin Application.Caption:='Şu Anda Kontrol Edit1 de' else if Form1. implementation {$R *. Bir formun “MDI” olması daha sonraki bölümde izah edilecektir.FormStyle:=fsStayOnTop.FormCreate(Sender: TObject).private { Private declarations } procedure kontrol(sender:TObject.ActiveControl=Edit2 Then Form1.//Hep en üstte kal end. Bu özellik Formun hep en üstte kalmasını sağlar Sonuç SDI Form Oluşturur. İlk olarak “Private” bölümünde “kontrol” isimli prosedürü tanımlayın.//Eklemeyi unutmayın public { Public declarations } end. procedure TForm1. Alabileceği değerler aşağıda verilmiştir.//İşlet end. Aynı sonucun oluştuğunu göreceksiniz (Idle olayı daha önceki bölümlerde izah edilmiştir). var deg: Boolean). //Program uyuduğunda işleyecek olan kod bloğu begin if Form1.OnIdle:=kontrol. begin Form1. procedure TForm1.dfm}procedure TForm1. end.var deg:Boolean). FormStyle fsNormal fsMDIForm fsMDIChild fsStayOnTop MDI Form oluşturur MDI Yavru formu oluşturur. 394 .Caption:='Şu Anda Kontrol Edit2 de'.FormStyle Formunuzun “MDI” form veya “SDI” form olmasını belirleyen özelliğidir. Son olarak diğer kodları ekleyin ve programı çalıştırın.ActiveControl=Edit1 then Form1.

• Form1.FormCreate(Sender: TObject).Left-50 //50 birim sola else if Key=VK_RIGHT Then //sağ yön tuşu basıldıysa Edit1.Edit1KeyDown(Sender: TObject. procedure TForm1. end. end.FormCreate(Sender: TObject). var Key: Word. procedure TForm1.BorderWidth Formun kullanılmayacak olan kenar kalınlığını belirlemek için kullanılan özelliğidir. Shift: TShiftState). begin Form1. Formunuzun üzerine iki adet “Edit” kontrolü yerleştirip (Formun Keypreview özelliği henüz false) aşağıdaki kodları Unit pencerenize ekleyiniz.KeyPreview Çalışma anında cursor “Edit1” kontrolünde iken klavyeden herhangi bir tuşa basıldığı anda “Edit1” kontrolünün KeyDown (KeyUp ve Keypress) Event ları işleyecektir.• Form1. begin if Key=VK_LEFT Then //sol yön tuşu basıldıysa Edit1. procedure TForm1.FormStyle:=fsStayOnTop Form1.Left:=Edit1.BorderWidth:=50.KeyPreview:=False.Left+50 //50 birim sağa end. Şayet Form un “KeyPreview” özelliğini “True” yaparsanız bu durumda basılan tuş ilk olarak Form un yukarıdaki yordamlarını işletecektir. Yani basılan tuştan ilk olarak bu kontroller haberdar olacaktır. Bu özelliği iyi anlamanız için aşağıda verilen iki örneği dikkatlice inceleyiniz. begin Form1. 395 .Left:=Edit1.

procedure TForm1. Bu özelliğe true değerini aktarırsanız. Unutmayın açmak istediğiniz Forma ait Unit’i . aktif formun Unit’ine eklemeyi unutmayınız (Zaten aksini söylemezseniz.Left+50 //50 birim sağa end. 396 .Left:=Edit1.Left-50 //50 birim sola else if Key=VK_RIGHT Then //sağ yön tuşu basıldıysa Edit1. //uses Unit1 i eklemeyi unumayınız procedure TForm1. Kodunuzu aşağıdaki şekilde değiştiriniz.Uygulamanızı çalıştırıp cursor u Edit1 kontrolüne tıkladıktan sonra sol ve sağ yön tuşlarına basın.Button3Click(Sender: TObject). //form1 i aç end. İşte burada Formun “KeyPreview” özelliğini devreye sokarak işlemi halledebiliriz.Show Formu ekranda göstermek için kullanılan method’dur. end. kontrolünüz yatay olarak hareket edecektir. yön tuşlarına ne zaman basarsanız basın “Edit1” kontrolünüz yatay olarak hareket edecektir. • Form1. procedure TForm1.Show.KeyPreview:=True. Peki cursor Edit2 de iken (veya başka bir kontrolde de olabilir) yön tuşlarına basarak Edit1 kontrolünü her zaman nasıl hareket ettirebilirsiniz.FormCreate(Sender: TObject).FormKeyDown(Sender: TObject. begin if Key=VK_LEFT Then //sol yön tuşu basıldıysa Edit1. Shift: TShiftState). Şimdi programınızı çalıştırırsanız cursor un olduğu kontrol önem arz etmeyecek. //Formu aç begin Form1.Left:=Edit1. ilk olarak Formun KeyDown olayı işleyecek sorun da çözülecektir (Bilhassa grafiksel oyunlarda çok kullanılan bir özelliktir). kendisi bu işlemi otomatik olarak yapacaktır). var Key: Word. begin Form1.

Hide Formu gizlemek için kullanılan özelliğidir.ClientHeight Formun yüksekliğinden çerçeve kenarlığını çıkardıktan sonra kalan yüksekliğini belirleyen özelliğidir.Button3Click(Sender: TObject). //Formu aç begin Form1. • Form1. //uses Unit1 i eklemeyi unumayınız procedure TForm1. 397 .ShowModal “Form1. Aralarındaki fark modal olarak açılan formlar kapatılmadan diğer formlardan hiçbiri aktifleştirilemez. procedure TForm1.ClientWidth Formun yatay genişliğinden çerçeve kalınlığını çıkardıktan sonra kalan uzunluğu ifade eden özelliğidir.ShowModal. procedure TForm1. Şayet açık başka form yoksa programı kapatan komut olacaktır.• Form1.Button3Click(Sender: TObject). “Form1.Visible:=false” ile aynı işi yapar. • Form1. //form1 i modal aç end.Close Formu kapatmak için kullanılan methotdur.Show” ile aynı işi yapar. • Form1. begin Form1.//Formu gizle end. begin Form1. • Form1.Hide.Close.//Formu kapat End.Button3Click(Sender: TObject).

//uzunluk Form1. procedure TForm1.Width:=250.//yükseklik end.FormCreate(Sender: TObject).• Form1. begin if yon=false then begin if Form1.Height:=250. Procedure TForm1. begin Form1.Width:=Form1. end else begin Form1. “Timer” kontrolünün properties den “Interval” özelliğine “50” girmeyi unutmayın (yoksa çok ağır hareket eder). end. begin Form1. Aşağıdaki şekilde formun boyutlarıyla oynayarak basit bir animasyon programı geliştirebilirsiniz. • Form1. end.Width:=250.Width+10.Height Formun düşey yüksekliğini belirleyen özelliğidir.Width Formun yatay uzunluğunu belirleyen özelliğidir.Width>500 Then begin yon:=true. procedure TForm1. Uygulama için formunuzun üzerine sadece bir adet “Timer” kontrolü yerleştirmeniz yeterli olacaktır.FormCreate(Sender: TObject). end 398 .Timer2Timer(Sender: TObject). //Animasyon yarat {$j+}//Eklemeyi unutmayın Const yon:Boolean=False.

diğer nesneleri kabullenebilmesi için gerekli ayarların yapılabildiği özelliklerdir. end. bırakılması. Unit penceresinden aşağıdaki şekilde değiştirebilirsiniz.Width<200 Then begin yon:=false. begin Form1. “Align” özelliklerini birinin “Left” diğerinin” Right” yapın. Yukarıdaki gibi Formunuzun üzerine iki adet “Panel”.ico').//Formun genişliğini azalt end end.Icon Formunuzun başlığında yer alan iconu belirleyen özelliğidir.LoadFromFile('C:\Winnt\SearchPDFWinColor. • DockSite-DragKind-DragMode Fomların taşınması. • Form1.Button3Click(Sender: TObject). Aşağıdaki örneği adım adım inceleyerek gerekli ayarlamaları yapınız.Width-10.//Yükle end. 399 .//ilk kısım işlesin end else begin Form1.else begin if Form1. iki adet “Shape” kontrolü yerleştirip.Width:=Form1. procedure TForm1.Icon.

ekran görüntünüz aşağıdaki gibi olacaktır. Birinci durumda panellerin “Shape” kontrollerini sahiplenmesinin sebebi “DockSite” özelliklerinin “true” olmasından dolayıdır.DragMode:=dmAutomatic.DockSite:=true. panel2.DockSite:=False. Shape1. 400 . begin Panel1. Form1. end. Ekran görüntünüz aşağıdaki gibi olacaktır.DragKind:=dkDock. İkinci durumda Formun “DockSite” özelliği “false” olduğu için kontrolleri sahiplenmeyi reddetmiştir.DockSite:=true. Shape2.DragKind:=dkDock.procedure TForm1. Şimdi tekrar bu kontrolleri mous ile sürükleyip formunuzun üzerine bırakınız.FormCreate(Sender: TObject). Programı çalıştırdıktan sonra “Shape” kontrollerini mous sol tuşu basılıyken sürükleyip panellerin üzerine getirip bırakın.DragMode:=dmAutomatic. Shape2. Shape1.

Projenize 3 adet form ekleyin. Form2. Form3. Programınızı çalıştırıp button kontrolüne tıklayın. Form2.Caption:='Prestige Education Center'. Bu seferde formları sürükleyerek diğer kontrollere bırakalım. end.DragKind:=dkDock. Ardından ilk formunuza “Win32” yaprağında yer alan bir adet “PageControl” kontrolü ekleyip.DragMode:=dmAutomatic. “Align” özelliğine “Bottom” değerini girin.Show.DragMode:=dmAutomatic.Caption:='Gazi Üniversitesi'. Bu ve buna benzer diğer işlemleri (sahiplenme) Delphi’de kolayca gerçekleştirebilirsiniz. Yukarıdaki ekran görüntüsünün oluştuğunu göreceksiniz. begin PageControl1. Form2. Form3. Form3. Şimdi daha değişik bir örnek verelim. Son olarak ekleyeceğiniz button kontrolünün “OnClick” yordamına aşağıdaki kodları ekleyiniz. Form2.Button1Click(Sender: TObject). Form3.DragKind:=dkDock.“DragKind” ve “DragMode” özellikleri de “Shape” kontrollerinin sürüklenme işlemlerinin gerçekleşebilmesi için değiştirilmiştir.DockSite:=true.Show. 401 . procedure TForm1. Açılan formları sürükleyip “PageControl” kontrolünün üzerine bırakın.

o formun “Unit” penceresine eklenmiş olan kodlar gözardı edilecektir. Bu pencerede yer alan “Main form” listesinden açılışta ilk çalışmasını istediğiniz formu belirleyebilirsiniz. diğer formları bu formdan yönlendireceksiniz. Bu yüzden diğer formlardan bir tanesini açılış formu olarak belirleyebilirsiniz. bu pencerede “Auto-Create Forms” listesinde yer alan herhangi bir formu “Available Forms” listesine aktarırsanız. Artık uygulamanızı çalıştırırsanız bu pencereden seçmiş olduğunuz form ilk olarak çalışacak. Formunuzu belirledikten sonra “OK” Buttonuna tıklayın. 402 . İçlerinde hatalı bir kod olsa bile uygulamanız çalışacaktır. Bu arada hatırlatalım. “Project->Options” menü seçeneklerinden sonra aşağıdaki pencere açılacaktır. Aşağıda rastgele bir formu nasıl açılış formu olarak düzenleyebileceğiniz adım adım izah edilmiştir.Açılış Formunu Belirlemek: Uygulamanızda birden fazla form kullandığınız (genellikle öyle olacak) zamanlar ilk açılacak form genellikle birinci form olmayacaktır.

word vs.) “MDI” Form mantığıyla çalışır. “Yavru Formu Aç” yazısının üzerine mous ile çift tıklayarak Event kısmına ulaşın ve buradaki kodu aşağıdaki şekilde değiştirin. Artık programınızı çalıştırabilirsiniz. begin Form1.FormStyle:=fsMDIChild. Form2. Yani ana forma ait bir çok yavru form türetilebilmektedir. “MainMenu” kontrolünün üzerine mous ile çift tıklayın. end.//MDI Form yarat end. En Üstte “Aç” alt satırına da (geçişleri yön tuşlarıyla yapabilirsiniz) “Yavru Formu Aç” yazın. Ardından projenize yeni bir form ve “MainMenu” kontrolü (daha sonra detaylı olarak anlatılacaktır) ekleyin. begin Form2.Show.FormStyle:=fsMDIForm. Ana formunuz açıldıktan sonra “Yavru Formu Aç” menüsüne tıklarsanız ekran görüntünüz aşağıdaki şekilde olacaktır. procedure TForm1. Aşağıda “MDI” Formları nasıl oluşturabileceğiniz gösterilmektedir.YavruFormuA1Click(Sender: TObject). Burada 403 .FormCreate(Sender: TObject).“MDI” Form Oluşturmak: Bir çok uygulama (Excel. Bu mantıkla dilediğiniz kadar formu tek bir formdan yönetebilirsiniz. procedure TForm1. Dilerseniz Unit penceresinden de belirleyebilirsiniz. İlk olarak yapmanız gereken “MDI” Form yapacağınız formun “FormStyle” özelliğine “fsMDIForm” değerini girmek olacaktır.

Tercih tamamen sizlere kalmıştır (Kodlamayı her zaman tercih etmeniz tavsiyemizdir). Bizim amacımız olayı en sade ve anlaşılır şekilde izah edebilmektir. Buradaki kodla yaptığımız birçok ayarı properties penceresinden de yapabilirdiniz. 404 .dikkatinizi çekmek istediğim diğer bir nokta da Child Formların ana formun dışına çıkamayacaklarıdır.Tabidir ki menü seçeneklerini de dilediğiniz kadar çoğaltabilirsiniz.

end. begin Label1. Bu kontrole ait özellikler aşağıda teker teker incelenmektedir.Caption:='Prestige Education Center'. begin Label1.Caption Etiketin üzerinde gösterilecek olan içeriği öğrenmek veya değiştirmek amaçlı kullanılan özelliğidir. etiket amaçlı kullanılabilen kontroldür. • Label1. 405 . end.FormCreate(Sender: TObject). Label1. Propertiesten değiştirilebileceği gibi aşağıdaki şekilde Unit penceresinden de değiştirilebilir.FormCreate(Sender: TObject). procedure TForm1.FormCreate(Sender: TObject).Color Label kontrolünün yazı tipi rengini belirleyen özelliğidir. • Label1.Color:=clWindow.Font. • Label1. bir procedure TForm1. begin Label1.Font.Label Kontrolü: Klavyeden bilgi girişine izin vermeyen. end. procedure TForm1.Caption:='Prestige Education Center'.Color “Label” kontrolünün zemin rengini belirleyen özelliğidir.Color:= clGrayText.

Style Etikete ait Font ayarlarını belirleyebileceğiniz özelliğidir (Kalın-İtalik-Altı Çizili vs).Caption:='Prestige Education Center'. Label1.Caption:='Prestige Education Center'.Font.Font.Color:=clWindow. “True” veya “False” değerini alabilen bu özelliğin “true” olması alt satıra inilebileceği anlamını taşımaktadır. Şayet var olan bir stili kaldırmak isterseniz o zamanda aradaki işaretin (“-“) olması gerekmektedir. Label1. Label1. begin Label1. Properties penceresinden ayarlayabileceğiniz gibi aşağıdaki gibi bir kod satırıylada değiştirebilirsiniz. procedure TForm1.WordWrap Etiketin içerisinde birden fazla satırlı yazı oluşturabilmek için kullanılan özelliğidir.fsItalic]//kalın ve italiği ekle end.Style+[fsBold.Font.Font.Style+[fsBold. begin Label1. Kodda yapılan işlem Eski font özelliklerine “Bold” ve “İtalik” özelliğini eklemektir.//alt satıra in Label1.• Label1.FormCreate(Sender: TObject). Label1.Font.Color:= clGrayText.Style:=Label1.FormCreate(Sender: TObject). 406 .Style:=Label1. • Label1.fsItalic] //fsUnderline de kullanılabilirdi end.Font.WordWrap:=true. procedure TForm1.

Caption:='&Meslek'.FormCreate(Sender: TObject).ShowAccelChar:=true.ShowAccelChar-FocusControl Şayet Caption değerini belirlerken “&” karakterini (kısayol belirlemek için) girdiyseniz bu iki özelliği kullanarak istediğiniz kontrolü aktif hale getirebilirsiniz. 407 . Label2. end.• Label1. Label1. Şimdi programınızı çalıştırın. Şimdide aşağıdaki kodları Unit pencerenize ekleyin. Label2.FocusControl:=ComboBox2. “Alt” tuşu basılıyken “d” harfine basarsanız kontrol “ComboBox2” ye geçecektir. Kodlamada yapılan atamaları properties penceresinden de yapmanızın mümkün olduğunu hatırlatıp diğer kontrolleri incelemeye devam ediyorum.ShowAccelChar:=true. procedure TForm1.//kısayol belirlendi Label1. Olayı anlamanız için aşağıdaki form tasarımını oluşturunuz.FocusControl:=ComboBox1.//Kısayol belirlendi Label2. “Alt” tuşu basılıyken “M” harfine basarsanız kontrol “ComboBox1” e. begin Label1.Caption:='Me&deni Hal'.

//Prestige Education Center yazar end. var adres:AnsiString.Text:='Prestige Education Center'. Şayet string tip değişkenin değeri bu özelliğe aktarılacaksa.25 yazar end. begin sayi:=500.250.FormCreate(Sender: TObject).Text:=FloatToStr(sayi). begin adres:= 'Prestige Education Center' Edit1. Atanacak veri ondalıklı sayı içeriyorsa. • Edit1.FormCreate(Sender: TObject). Edit1.Edit Kontrolü: Daha çok klavyeden yapılacak bilgi girişleri için kullanılan bu kontrole ait özellikler aşağıda verilmiştir. 408 . procedure TForm1.Text:=adres. begin sayi:=500. Atanacak veri Tam sayı tipindeyse.Text Bu özellik sayesinde “Edit” kontrolünün içeriği bir değişkene aktarılabilir veya değişkendeki bir değer kullanıcıya gösterilebilir.FormCreate(Sender: TObject). var sayi:Integer. procedure TForm1. begin Edit1. var sayi:Double. procedure TForm1. procedure TForm1.FormCreate(Sender: TObject). Edit1. //500. end. //500 yazar end.Text:=IntToStr(sayi).

begin Edit1. aşağıdaki şekilde “Unit” penceresinden de değiştirilebilir. begin tarih:=StrToDate('25. • Edit1.Text:=DateToStr(tarih). CharCase ecUpperCase ecLowerCase ecNormal Sonuç Sadece Büyük harflerle giriş yapılabilir Sadece KüÇük harflerle giriş yapılabilir Varsayılan değer. Yukardaki şekilde yapacağınız bir kodlama sonucunda.FormCreate(Sender: TObject).FormCreate(Sender: TObject).PasswordChar:='#'.PasswordChar Şifreli bilgi girilmesi durumunda (yanınızdaki kişi şifrenizi öğrenmesin diye) kullanılan bu özelliğe aktaracağınız karakter sayesinde.07. Edit kutusuna küçük karakterlerle bile girişi yapmaya kalksanız bile büyük harfle yazacaktır. Edit in içeriğindeki tüm metin bu karakterle aynı gözükecektir.CharCase “Caps Lock” tuşunun kullanımına sınırlama getirebileceğiniz özeliğidir. begin Edit1.2003'). Yani Edit kontrolü içerisine sadece büyük harfle bilgi (veya küçük) girişi istenirse bu özellikle belirlenebilir.2003 yazar end. procedure TForm1. procedure TForm1. Edit1.Atanacak veri Tarihsel veri içeriyorsa. 409 .//sadece büyük harf end. end. //25.CharCase:= ecUpperCase. var tarih:TDateTime.FormCreate(Sender: TObject). Aşağıda alabileceği seçenekleri ve anlamları verilmiştir.07. Hem Küçük Hem Büyük Karakter Properties penceresinden değiştirebileceğiniz gibi. • Edit1. procedure TForm1.

410 .AutoSize:=FALSE.Button1Click(Sender: TObject).yazı büyüklüğüne göre boyutun değişeceği anlamını taşımaktadır. Şayet program koduyla eskiye dönüş yapmanız gerekecekse aşağıdaki gibi bir kod satırı kullanmalısınız.FormCreate(Sender: TObject). Edit kutusunun içeriğine dikkat edecek olursanız tüm karakterlerin aynı olduğunu görürsünüz. procedure TForm1. procedure TForm1.Yukarıdaki kod satırının çalışma anındaki etkisi aşağıdaki şekilde olacaktır.//şifre karakterini kaldır end.PasswordChar:=#0. • Edit1. end.AutoSize Yazı tipi büyüklüğünü artırdığınız zaman Edit kontrolünün de boyutlarının (yazıyı içerisine alacak şekilde) değişip değişmemesini sağlayan özelliğidir. begin Edit1. begin Edit1. “True” değerinin aktarılması.

begin Edit1. 411 . Properties penceresinden ayarlanabileceği gibi.akBottom].akRight. ve karakter girişi yapılabilir. begin Edit1. • Edit1.• Edit1.Anchors Formun boyutlarının değiştirilmesi durumunda Edit kontrolününde aynı oranda boyut değiştirip değiştirmeyeceğini belirleyen özelliğidir. Event ları işletilebilir ve Copy Paste komutları uygulanabilir.FormCreate(Sender: TObject). Properties penceresinden değiştirebileceğiniz gibi aşağıdaki şekilde “Unit” penceresindende değiştirilebilir. Kodla kontrole veri aktarılabilir.//Klavyeden bilgi girişini engelle End.ReadOnly Klavyeden Edit kontrolüne veri girilip girilemeyeceğini belirleyen özelliğidir. procedure TForm1.FormCreate(Sender: TObject). Varsayılan değeri “false” dır. end.Anchors:=[akLeft.akTop. “ReadOnly” özelliği “true” yapılırsa kullanıcı klavyeden veri girişi yapamayacaktır. procedure TForm1. aşağıdaki şekilde “Unit” penceresinden de değiştirilebilir. “ReadOnly” özelliğini true yapmak kontrolü kullanılmaz hale getirmez.ReadOnly:=true.

• Edit1.TabStop Sadece “Tab” tuşuna has bir özelliktir. Copy-Paste yapılamaz. Varsayılan değeri “true” dur ve cursor Edit kontrolüne eninde sonunda uğrayacaktır.Visible Kontrolün formun üzerinde gözüküp gözükmemesini belirleyen özelliğidir.Enabled Bu özelliğe “false” değerini aktarırsanız “Edit” kontrolüneün tüm özeliklerini kullanıma kapatırsınız. • Edit1. Varsayılan değeri “true” dur ve gözükür haldedir.FormCreate(Sender: TObject).Tab tuşuyla Edit kontrolüne cursor un bırakılıp. procedure TForm1.MaxLength:=6. begin Edit1.//kontrolü göster end.FormCreate(Sender: TObject). • Edit1.Visible:=true.FormCreate(Sender: TObject). procedure TForm1. 412 .//Edit1 kontrolüne uğrama end.MaxLength Edit kontrolü içerisine klavyeden girebileceğiniz maximum karakter sayısını belirleyen özelliğidir. Kodla istenilen uzunlukta içerik aktarılabilir.Enabled:=false. bırakılamayacağını belirleyen özelliğidir. cursor içerisine tıklanamz vs.//max 6 karaktere izin ver end. Bu özellik sadece klavyeden girişler için etkilidir. end. begin Edit1.TabStop:=false. begin Edit1. procedure TForm1. • Edit1.FormCreate(Sender: TObject). begin Edit1. procedure TForm1.

procedure TForm1. • Edit1. = TCursor(-11). = TCursor(-6). begin Edit1. = TCursor(-19). Mous ile veya kodla cursor Edit kontrolüne bırakılabilir. = TCursor(-22). = TCursor(-21).TabOrder Yine “Tab” tuşuna has bir özellik. Tab tuşu geçişlerinde Delphi bu numaralara bakarak. = TCursor(-17). = TCursor(-2).FormCreate(Sender: TObject). end. = TCursor(-9). bir sonra ki cursor’ın uğrayacağı kontrolü belirleyecektir. = TCursor(-22). Alabileceği tüm seçenekler aşağıda verilmiştir. = TCursor(-20). = TCursor(-18). = TCursor(-8). • Edit1. = TCursor(-13). Bu numaralar “TabOrder” özelliğinde tutulurlar.TabOrder:=20. Sonuç crMultiDrag 413 . = TCursor(-3).“TabStop” özelliğine “false” değerini aktarmnız sadece tab tuşu için etkilidir. = TCursor(-14). yerleştirilme sırasına göre küçükten büyüğe doğru numara alırlar. = TCursor(-1). = TCursor(-7). = TCursor(-16). Kontrol elemanlarını formunuzun üzerine yerleştirdiğiniz zaman. = TCursor(-4).Cursor Cursor Edit kontrolünün üzerine geldiği anda alacağı şekli belirleyen özelliğidir. = TCursor(-15). = TCursor(-10). Cursor crDefault crNone crArrow crCross crIBeam crSize crSizeNS crSizeNWSE crSizeWE crUpArrow crHourGlass crDrag crNoDrop crHSplit crVSplit crSQLWait crNo crHelp crSizeAll crAppStart crHandPoint crSizeNESW = TCursor(0). = TCursor(-12).

aşağıdaki şekilde “Unit” penceresinden de değiştirilebilir.Cursor:= crHourGlass. Uygulama için Formunuzun üzerine bir adet “Timer” kontrolü yerleştirin ve Interval değerine “100” girin. Programınızı çalıştırıp cursor u formun üzerine getirin ve bekletin. 414 . • Edit1.Timer1Timer(Sender: TObject). Tüm seçeneklerin arka arkaya görüntülendiğini göreceksiniz. Ardından aşağıdaki kodu “Unit” pencerenize ekleyiniz. Bu özelliği daha iyi anlayabilmeniz için aşağıdaki örneği yapalım. end. procedure TForm1. begin Edit1. end.Cursor:=i. Dec(i).FormCreate(Sender: TObject). procedure TForm1.Left Kontrolün Formun sol köşesine olan mesafesini tutan özelliğidir. Bu değerin “0” olması aşağıdaki gibi bir görüntünün oluşmasını sağlar (tam sola dayalı). {$j+}//eklemeyi unutmayınız Const i:Integer=0.Properties penceresinden değiştirebileceğiniz gibi. begin if i<-22 then i:=0//başa dön else begin Form1.//cursor u değiştir end.

end.procedure TForm1. begin sola:=Edit1. 415 . • Edit1.Top:=deger. Edit1. //Yukarı var deger:Integer.//10 birim sola yanaş end.Button2Click(Sender: TObject). begin deger:=Edit1. procedure TForm1. Aşağıdaki şekilde bir örnekle Edit kontrolünü formun üzerinde dikey hareket ettirebilirsiniz.FormCreate(Sender: TObject).Button1Click(Sender: TObject).//En üste yapış end. var sola:Integer.Left-10. procedure TForm1.Left:=sola.Top:=0. begin Edit1.Top-10. // 10 birim yukarı Edit1.Top Edit kontrolünün üst köşesinin. formun üst köşesine olan mesafesini tutan özelliğidir.

Top:=deger.//10 birim artır Edit1.Width:=deger. Şimdi programınızı çalıştırıp button kontrollerine tıklayın.//düz görüntülü yap end. begin deger:=Edit1. “Edit” kontrolünüzün aşağı veya yukarı hareket ettiğini göreceksiniz. Alabileceği değerler aşağıda verilmiştir.Button3Click(Sender: TObject). //Aşağı var deger:Integer. procedure TForm1. aşağıdaki gibi “Unit” penceresinden de değiştirilebilir.BorderStyle Edit kontrolünün üç boyutlu görüntüsünü belirleyen özelliğidir.procedure TForm1.FormCreate(Sender: TObject). end. var deger:Integer. end. begin Edit1. BorderStyle bsSingle bsNone Düz bir Görüntü verir Sonuç Üçboyutlu görünüm verir Properties penceresinden değiştirilebileceği gibi aşağıdaki gibi bir kodla “Unit” penceresinden de değiştirilebilir.Width Kontrolün yatay uzunluğunu tutan özelliğidir.Top+10. begin deger:=Edit1. 416 . // 10 birim aşağı Edit1. Properties penceresinden değiştirilebileceği gibi. • Edit1.Button4Click(Sender: TObject). procedure TForm1. • Edit1.Width+10.BorderStyle:=bsNone.

//10 birim artır Edit1.Button4Click(Sender: TObject). end. Formunuzun üzerine bir adet “Timer” kontrolü yerleştirip “Interval” özelliğine “100” değerini giriniz.Height+10. aşağıdaki şekilde “Unit” penceresinden de değiştirilebilir. var deger:Integer. Ardından bir Adet Edit kontrolü yerleştirip aşağıdaki tasarımı oluşturunuz. 417 . begin deger:=Edit1.• Edit1.Height Kontrolün düşey yöndeki uzunluğunu belirleyen özelliğidir.Height:=deger. Olayın daha iyi anlaşılması açısından. procedure TForm1. Properties penceresinden belirlenebileceği gibi.

end else begin if Edit1. procedure TForm1.Aşağıdaki kod satırlarınıda “Unit” pencerenize ekleyip uygulamanızı çalıştırınız.Font.Height-25.//bold ve italic özelliği //ekle 418 .Height+25. end.Height:=Edit1.Width:=Edit1. • Edit1.Width+50. {$j+}//Eklemeyi unutmayınız. procedure TForm2.Italic.Font.Style+[fsBold. Programınızı çalıştırdıktan sonra “Edit” kontrolünüzün yatay ve dikey boyutlarının Formun boyutlarına ulaşana kadar arttığını. daha sonrada azalmaya başladığını basit bir animasyonla görmüş olmalısınız.Underline vs).Height:=Edit1. begin Edit1. begin if yon=false then begin if Edit1.Width:=Edit1. Edit1. const yon:Boolean=false.Timer1Timer(Sender: TObject).Width then yon:=true else begin Edit1. Edit1.Font.ClientWidth<=50 then yon:=false else begin Edit1.Button5Click(Sender: TObject).Style:=Edit1.Style Kontrole ait Font Style seçeneklerini belirleyen özelliktir (Bold. end end end. Aşağıdaki şekilde “Unit” penceresinden müdahale edebilirsiniz.Width>=Form2.fsItalic].Width-50.

• Edit1.Size:=24. procedure TForm1. Properties penceresinden ayarlanabileceği gibi “Unit” penceresinden de aşağıdaki şekilde kolayca değiştirilebilir.CanFocus then Edit1. Bu methoddan geriye “true” değeri dönerse “SetFocus” işleminin yapılabileceği anlamı çıkmaktadır.Button5Click(Sender: TObject). • Edit1. • Edit1.Font. begin Edit1. procedure TForm1. end.SetFocus.//Cursor u Edit1 e gönder end. Diğer Font özellikleride aynı mantıkla belirlendikleri için onlara örnek verilmeyecektir.SetFocus Cursor u Edit kontrolüne geçirmek için kullanılan method dur. procedure TForm1. Bu yüzden öncelikle “SetFocus” işleminin o kontrol için yapılıp yapılamadığını “CanFocus” methoduyla kontrol ettirmelisiniz. //SetFocus işlemini Create yordamına yazmayın begin Edit1.CanFocus Gözükmeyen veya kullanılamayan bir kontrole “SetFocus” işlemi yapamazsınız. begin if Edit1.Button6Click(Sender: TObject). 419 . end.end.SetFocus else ShowMessage('Edit1 kullanılamaz Halde').Font.FormActivate(Sender: TObject). Sadece “Unit” penceresinden değiştirilebilir.Size Edit kontrolünün içerisindeki yazının büyüklüğünü ayarlayan özelliğidir.

Kullanımına ait örnek aşağıda verilmiştir.“SetFocus” işleminden önce her zaman “CanFocus” methodunu kullanmalısınız.Button7Click(Sender: TObject). procedure TForm1. begin Edit1. begin 420 .SelText. begin Form1.Button7Click(Sender: TObject). • Edit1. Methoddan geriye “true” değerinin dönmesi Cursor’un kontrolün içerisinde olduğu anlamını taşımaktadır. procedure TForm1. Bu durumda Edit kontrolünüzdeki seçili metnin yerine “Nihat Demirli” yazacaktır.Button7Click(Sender: TObject).//seçili alana ata end.SelText:='Nihat Demirli'. • Edit1.Focused Cursor’un Edit kontrolünün içerisinde olup olmadığını kontrol edebilen bir methoddur. • Edit1.SelLength Kontrol içerisinde seçili karakterlerin olup olmadığını belirleyen özelliğidir. Dilerseniz methodu aşağıdaki şekilde de kullanabilirsiniz. var karakter:Integer. Bu yöntem oluşabilecek hataları engelleyecektir.SelText Edit kontrolü içerisinde seçili metni öğrenmek veya değiştirmek için kullanılan bir methoddur. Basit bir “Idle” olayı (daha önce izah edildi) yaratarak hangi kontrolün aktif olduğunu tesbit edebilirsiniz.Caption:=Edit1. procedure TForm1.//seçili alanı yaz end.

421 . say:=0.adet). i.Caption:='Seçili '+IntToStr(karakter)+' Eleman Var'. end.//kaç karakter seçili Form1.SelStart Kontrolün içerisinde bloklamaya kaçıncı karakterden başlanacağını belirleyen özelliğidir. end.i+1.Text. procedure TForm3.say:Integer. Until i>adet-1.karakter:=Edit1.Button1Click(Sender: TObject). Repeat if dizi[i]=' ' then //karakter space ise begin if say<1 then baslangic:=i+1 else begin karakter:=i+1.1). dizi:Array of AnsiString. end. Aşağıdaki tasarımı oluşturup “Unit” penceresine gerekli kodları ekleyiniz.//kaç karakter var SetLength(dizi. var adet. for i:=0 to adet-1 do dizi[i]:=copy(Edit1.karakter. begin adet:=Length(Edit1. inc(say).baslangic. break. inc(i). • Edit1.Text).//Bütün karakterleri diziye aktar i:=0.SelLength.

Programı çalıştırdıktan sonra button kontrolüne tıklarsanız.AutoSelect :=true.FormCreate(Sender: TObject).Clear Kontrolün içeriğini temizlemek için kullanılan özelliğidir. Edit1.FormCreate(Sender: TObject). kontrol Edit e geçtiği anda içeriğinin tamamının seçilip seçilemeyeceğini belirleyen özelliğidir. Edit1.SelLength:=karakter-baslangic. begin Edit1.ShowHint “Hint” özelliğindeki içeriğin balancukta gözükebilmesi için “ShowHint” özelliğinede “true” değerinin aktarılması gerekmektedir. 422 . • Edit1. begin Edit1.//Temizle end.end.ShowHint:=true. procedure TForm3. Edit1.Edit1. iki boşluk arasındaki tüm içerik bloklanacaktır.AutoSelect “True” veya “False” değeri alabilen bu özellik sayesinde. Varsayılan değeri “true” dur ve aktifleştiği anda tüm içerik seçilir. • Edit1.SelStart:=baslangic.Button2Click(Sender: TObject). begin Edit1. procedure TForm3.Hint Mous kontrolün üzerinde hareketsiz kalırsa kullanıcının görmesi için açılan baloncuğun içeriği bu özellikle belirlenir. end. • Edit1.Hint:='Kursun Adını Gir'. procedure TForm3. • Edit1.SetFocus. Aksi takdirde baloncuk asla açılmayacaktır.Clear .

begin yeniText:=TEdit. end.Button3Click(Sender: TObject).FormCreate(Sender: TObject). begin Edit1.Parent:=Form3.end.SelectAll Kontrolün içeriğini komple seçmek için kullanılan methodudur. 423 . procedure TForm3. • Edit1. Artık bu kontrol Show ile gösterilemez. var yeniText:TEdit. Değiştireceğiniz tek şey “Tedit” yerine diğer kontrolün türetileceği sınıfı belirlemek olacaktır.Free.//Edit yarat yeniText. procedure TForm3.Create(Form3).Button3Click(Sender: TObject).//formdan at end. procedure TForm3. • Edit1.SelectAll . begin Edit1. Aşağıdaki şekilde kolayca yeni Edit kontrolleri yaratabilirsiniz. Aynı mantıkla diğer kontrollerden de kolayca yaratmanız mümkündür.//Tümünü seç end. Sadece “Unit” penceresinden değiştirilebilir. • TEdit.Create(kontrol) Yeni kontrol oluşturmak için kullanılan Methoddur.Free Kontrolü projeden atmak için kullanılan methoddur.

begin Edit1.//edite yapıştır end. • Edit1.• Edit1. • Edit1.CutToClipboard Kontrolün içeriğini Clipboard a gönderen özelliğidir.PasteFromClipboard.Button2Click(Sender: TObject).//yolla end. var karakter:Integer.CopyToClipboard.//yolla end.Button2Click(Sender: TObject).PasteFromClipboard “Clipboard” daki bilgiye bu komutla ulaşılabilr. procedure TForm1.CopyToClipboard “CutToClipboard” ile aynı işi yapar tek fark kontrol içerisindeki içerik kaybolmayacaktır.GetTextLen Kontrolün içerisindeki karakter sayısını veren özelliğidir. end. Kullanımına ait örnek aşağıda verilmiştir. Verinin nereden gönderildiği önem arz etmez. begin Edit1. 424 .Button2Click(Sender: TObject). begin karakter:=Edit1.GetTextLen. procedure TForm1. begin Edit1.Caption:='Edit İçerisinde '+IntToStr(karakter)+' Karakter Var'.//Kaç karakter var Form1.CutToClipboard. • Edit1. procedure TForm1. procedure TForm1.FormCreate(Sender: TObject). Bu işlem yapıldıktan sonra herhangi bir uygulamadan “Paste” komutu verilirse gönderilen veriye ulaşılabilir.

begin Button1. Şimdi herhangi bir zamanda “Alt+P” tuşlarına beraberce basılırsa bu button otomatik olarak “Click” lenmiş olacak.Caption:='&Print'. begin ShowMessage('Prestige Education Center'). Peki ne yaptık şimdi. end. procedure TForm1. veya öğrenilebilir.FormCreate(Sender: TObject). Aşağıda özellikleri açıklanmaktadır. end Aynı kodu aşağıdaki gibi değiştirin. begin Button1.Caption:='Print'. Dikkatlice inceleyiniz.FormCreate(Sender: TObject). procedure TForm1.Button1Click(Sender: TObject). “&” karakteri kısayol tuşu belirlemek için kullanılmaktadır. 425 .Button Kontrolü: Dillerin en popüler tetikleyicisi sanıyorum bu kontroldür.//kısayol tuşu belirlendi end. • Button1. procedure TForm1.Caption Button üzerinde gösterilecek olan etiket bu özellikle belirlenir. Burada “P” (& Hangi karakterin solundaysa) karakteri kısayol tuşu olarak belirlendi. hemen izah edelim.

procedure TForm1. Programı çalıştırıp “Esc” tuşuna basarsanız “Prestige Education Center” mesajı kullanıcıya iletilecektir. procedure TForm1.Cancel Aktiflik diğer kontrollerde olmasına rağmen “Esc” tuşuna basılması durumunda “OnClick” yordamındaki kodun işletilmesini sağlayan özelliğidir. • Button1.Default “Bu özellik yukarıdaki işlemi “Esc” tuşuyla değilde “Enter” tuşuyla yapmak için kullanılır. begin ShowMessage('Prestige Education Center'). 426 . • Button1.//Esc tuşu button1 i işletsin end. “True” değerini alması. Burada hatırlatalım aynı anda iki buttonun “Cancel” özelliği “true” olamaz. //Enter tuşuna basınca Button1 işlesin begin Button1. Yukarıdaki örnek için “Alt+P” tuşuna beraberce basılırsa “Prestige Education Center” mesajı kullanıcıya iletilecektir.FormCreate(Sender: TObject). “Esc” tuşuna basılmasıyla kodun işletileceği anlamını taşımaktadır. o button “Click” lenmiş olacaktır.dolayısıyla “OnClick” yordamında yazılmış olan kod işletilecektir. procedure TForm1.FormCreate(Sender: TObject).Button1Click(Sender: TObject). end.Cancel:=true. end. procedure TForm1.//Enter tuşu button1 i işletsin end.Button1Click(Sender: TObject). begin ShowMessage('Prestige Education Center'). //Esc tuşuna basınca Button1 işlesin begin Button1. Yani hangi buttonun “Default” özelliğine “true” değeri aktarılırsa klavyeden “Enter” tuşuna basıldığı zaman.Default:=true.

button kontrolüne tıklayamaz diğer hiçbir özelliğini kullanamazsınız. Aşağıdaki örnekte bu özelliğe “true” değeri aktarılmıştır. begin Button1. Bu yüzden “Additional” yaprağında bulunan “BitBtn” kontrolünü kullanmalısınız.// birden fazla satırlı yazıya izin ver end.FormCreate(Sender: TObject). • Button1. 427 . procedure TForm1.Enabled Bu özelliğe “False” değerini aktarırsanız.WordWrap “True” veya “False” değeri alabilen bu özelliğe. Burada hatırlatalım. “true“ değeri aktarılırsa birden fazla satırlı etiket oluşturulabilir. • Button1. procedure TForm1. begin Button1.WordWrap:=true.Caption:='&Printere Yolla'.FormCreate(Sender: TObject).Hatırlatalım şayet kontrol başka bir buttonda (başka bir button aktifken) iken “Enter” tuşuna basarsanız aktif buttonun “OnClick” yordamı işleyecektir. Bu özelliğin çalışabilmesi için kontrolün Button dışında başka bir kontrolde olması gerekmektedir. bu kontrolün üzerine resim yerleştirilememektedir.

şeklinde bir kod satırı kullanmalısınız.//Kontrolü pasif yap end. Şimdi properties penceresinden bu özelliğe tıklayarak aşağıdaki pencerenin açılmasını sağlayınız. • Bitbtn1.bmp')). Diğer button kontrolüne ait bir çok özellik aynen kullanılabilmektedir. 428 .LoadFromFile('C:\Program Files\Common Files\delphi.Glyph. Şayet resmi kodla aktarmak isterseniz (Bitbtn1. Resim herhangi bir formatta olamaz (bmp tercih edin).Button1.Enabled:=false. BitBtn Kontrolü: Bu kontrole ait extra özellikleri aşağıda açıklamaya çalışacağım. Ekran görüntünüz aşağıdaki gibi olacaktır. Bu pencerede “Load” buttonuna tıklayıp istediğiniz resmi bulun ve “OK” buttonuna tıklayın.Glyph Kontrolün üzerine aktaracağınız resmi bu özellikle belirleyebilirsiniz.

Layout blGlyphRight blGlyphBottom blGlyphLeft blGlyphTop Yazının sağında Yazının Altında Yazının solunda Yazının üzerinde Sonuç procedure TForm2. begin BitBtn1.FormCreate(Sender: TObject).//yazının sğında end. 429 . Alabileceği seçenekler aşağıda verilmiştir. Evet gördüğünüz gibi içerisinde resim bulundurabilen buttonlardan oluşturmak son derece kolay.Layout Bu özellikle de eklemiş olduğunuz resmin yazının neresinde bulunması gerektiğini belirleyebilirsiniz. Düğme kontrolleri için sanıyorun “BitBtn” seçeneğini tercih etmeniz doğru olacaktır.• BitBtn1.Layout:=blGlyphRight.

CheckBox2. 430 . begin CheckBox1.FormCreate(Sender: TObject). CheckBox kontrolünün ne işe yaradığı bu etikette belirtilir.FormCreate(Sender: TObject). Alabileceği seçenekler aşağıda verilmiştir. Aşağıda bu kontrole ait özellikler verilmektedir.Caption Etiket değerini tutan özelliğidir.Alignment:=taLeftJustify.//sağda CheckBox2.//solda end. Alignment taRightJustify taLeftJustify Yazının sağında Yazının solunda Sonuç “Unit” penceresinden değiştirmek isterseniz aşağıdaki şekilde bir kodlama yapmalısınız. • CheckBox1. procedure TForm2. procedure TForm2.CheckBox Kontrolü: Bu kontrol “evet-hayır” veya “Doğru-Yanlış” durumlarını gösterebilmek için kullanılan Component’tir.Caption:='Medeni Hali'.Caption:='Cinsiyeti'. • CheckBox1. end.Alignment Etiketin solda veya sağda olmasını belirleyen özelliğidir. begin CheckBox1. CheckBox1.Caption:='Medeni Hali'. dikkatlice inceleyiniz.Alignment:=taRightJustify .

end. Sanıyorum en önemli özelliği budur ve mous ile tıklanınca işareti otomatik olarak değişir.Checked:=true. Aşağıdaki örnekte bilinen her yabancı dilin maaşı %10 artıracağı varsayılmıştır. hesapla düğmesine tıklanınca da zamlı maaş miktarı “Edit2” kontrolü içerisine aktarılmaktadır. CheckBox3. veya işaretini değiştirmek için kullanılan özelliğidir. “Edit1” kontrolü içerisinde personelin standart maaşı yazılmakta.FormCreate(Sender: TObject). 431 . Uygulamanız için aşağıdaki kod satırlarını formunuza ekleyip çalıştırınız.• CheckBox1. begin CheckBox1.Checked:=true. Her işaretlediğiniz “CheckBox” ın maaşa %10 etki yaptığını göreceksiniz.Checked Kontrolün işaretli olup olmadığı. procedure TForm3.

10). end.Checked then inc(zam.yenimaas:Currency.procedure TForm3. //%10 artır if CheckBox2. //%10 artır if CheckBox3.10).10). Edit2.Text).Checked then inc(zam.Text:=FloatToStr(yenimaas). var zam:Integer.Checked then inc(zam.Button1Click(Sender: TObject). maas:=StrToFloat(Edit1. if CheckBox1. 432 . begin zam:=100. maas. //%10 artır yenimaas:=maas*zam/100.

433 .Ctl3D Kontrolün üç boyutlu olup olmamasını sağlayan özelliğidir. end. end. Varsayılan değeri “true” dur ve üç boytulu görünümü vardır. Aralarındaki fark form üzerindeki “RadioButton” kontrollerinden sadece bir tanesinin işaretlenebileceğidir (istisnaları vardır).Checked Kontrolün işaretli olup olmadığı bu özellikle öğrenilebilir veya değiştirilebilir.Ctl3D:=true.Checked:=true.RadioButton Kontrolü: CheckBox kontrolü ile aynı mantıkta işlem yapar. • RadioButton1. Forma dikkat edecek olursanız şahsın mezun olduğu üniversite bir tane olacağı için (işi abartanlar hariç) tek bir tanesi işaretlenebilmektedir. Diğer kontrolü işaretlemeye kalkarsanız aktif olan kontrol işaretini kaybedecektir. procedure TForm4. begin RadioButton2.FormCreate(Sender: TObject). procedure TForm4. begin RadioButton1. Diğerini işaretlerseniz önceki aktiflik özelliğini yitirecektir.FormCreate(Sender: TObject). • RadioButton1.

begin GroupBox1. Yani Aynı form üzerinde hem medehi hali. Aşağıdaki tasarımı oluşturup gerekli olan kodları “Unit” pencerenize ekleyiniz.Caption:='Eğitimin Adı'. Bu kontrol aynı zamanda diğer kontrollerin daha estetik gözükmesini de sağlamaktadır. Peki ya böyle bir durumla karşılaşırsanız.GroupBox Kontrolü: Aynı form üzerinde birden fazla “RadioButton” kontrolünün işaretlenemediğini yukarıda belirtmiştik. end. • GroupBox1. hemde Kdv oranı diye iki ilgisiz durum olursa o zaman ne yapacaksınız.Caption “GroupBox” kontrolünün öğrenebilirsiniz. Şimdi daha gelişmiş bir örnek yaparak kontrole ait bilgilerinizi kaynaştıralım. 434 . Her GroupBox içerisinde bir tane “RadioButton” kontrolünü işaretleyebilirsiniz. etiket değerini buradan belirleyebilir veya procedure TForm5. Yukarıdaki formda dikkat ettiyseniz iki tane ayrı “RadioButton” kontrolü işaretlenebildi. İşte bu tip durumların çözümlerinde ayrı ayrı iki GroupBox kontrolü kullanmalısınız. Aşırıya kaçmamak şartıyla bolca kullanabilirsiniz.FormCreate(Sender: TObject). Her “GroupBox” içerisinde bir “RadioButton” unu işaretliyebilirsiniz.

if RadioButton1.//20 azalt if RadioButton5. begin RadioButton1. RadioButton5. 435 . if CheckBox1.Checked then Dec(katsayi.Button1Click(Sender: TObject).procedure TForm5. var katsayi.Checked:=true. procedure TForm5.Checked then fiyat:=4000*(kdvorani+katsayi)/100.Checked then kdvorani:=20 else kdvorani:=25. begin katsayi:=100. end.Checked then fiyat:=1500*(kdvorani+katsayi)/100 else if RadioButton3.FormCreate(Sender: TObject).Checked then fiyat:=2500*(kdvorani+katsayi)/100 else if RadioButton4.Checked then fiyat:=2000*(kdvorani+katsayi)/100 else if RadioButton2.Checked:=true.Checked:=true.20). fiyat:Currency.kdvorani:Integer. CheckBox1.

Programı çalıştırdıktan sonra “Fiyat Belirle” buttonuna tıklarsanız.Text:=FloatToStr(fiyat). aşağıdaki gibi bir değer elde edersiniz. Dikkatlice inceleyiniz. 436 .end.Edit1.

BorderStyle:=bsSingle.BorderStyle Panel in üç boyutlu görüntüsünü ayarlayan özelliğidir. şimdi programınızı çalıştırırsanız son derece estetik bir görünüm elde edersiniz.//köşeler üç boyutlu olsun end.Panel Kontrolü: Estetik görünüş ve gruplandırma amaçlı kullanılan bir kontroldür. Aşağıda alabileceği seçenekler verilmiştir.FormCreate(Sender: TObject). • Panel1. BorderStyle bsSingle bsNone Köşeler üç boyutlu Düz Sonuç Formunuza bir adet Panel ekleyip “Align” özelliğine “alClient” değerini girin. procedure TForm6. 437 . Aşağıda kullanılabilen özelliklerinden bahsedilmektedir. begin Panel1. ardından “BorderStyle” özelliğine de “bsSingle” değerini girin.

Aşağıda bu özellikler detaylı olarak incelenmektedir.ListBox Kontrolü: Alt alta satırların girilebildiği bir kontroldür.Dr.Nihat Demirli').Add('Prof.Items Satırlarla ilgili tüm işlemleri yapabileceğiniz özelliğidir. ListBox1. Şayet eklenecek olan string tipte bir değişkenin değeri ise o zaman aşağıdaki gibi bir kodlama kullanmalısınız.Items. begin ListBox1. Aksi takdirde yazdırma işleminiz başarısızlıkla sonuçlanacaktır. listeye eklenecek olan veri sayısal veya tarihsel bir değer içeriyorsa o zaman tip dönüştürme fonksiyonlarından faydalanmanız gerekecektir.Yüksel İnan').Add ListBox kontrolüne satır eklemek için kullanılan methoddur. end.Dr. 438 .Button1Click(Sender: TObject). Eklenen veri string tip bir değişkenin değeri olabilmektedir procedure TForm1. • ListBox1.Items. Burada yeri gelmişken hatırlatalım.Add('Prof. • ListBox1. Bir çok özelliği bulunmaktadır.Items.

• ListBox1. 439 . Başka tipte bir içeriğe sahip değişken değerini aktarmaya kalkışırsanız muhtemelen hatayla karşılaşacaksınız.Text. Yine yeri gelmişken hatırlatalım “Tstrings” yapısı birden fazla elmanı barındırmak için kullanılan bir yapıdır. procedure TForm1. ListBox1. Dikkatli ce inceleyip anlamaya çalışınız. Aktarılacak olan değerlerin tipleri isminden de anlaşılacağı gibi string olmak zorundadır. Aşağıda bu özelliğe ait örneklendirme yapılmıştır.Items.Button1Click(Sender: TObject). Eğer ekleyeceğiniz sayısal içerikli bir değişkenin değeriyse o zaman aşağıdaki şekilde bir kodlama kullanmalısınız. ListBox1.Assign Birden fazla elemanı aynı anda listeye eklemek için kullanılan özelliğidir.Items.Add(deger).//ekle end.Add(IntToStr(sayi)).procedure TForm1. var sayi:Integer. Eklenecek değişkenlerin tipi “Tstrings” olmalıdır. var deger:AnsiString. begin deger:=Edit1.Items.Button2Click(Sender: TObject). begin sayi:=5555.//sayıyı ekle end.

Items. Listenin içerisinde yer alan tüm satırların silinmesini sağlayacaktır. var liste: TStrings.procedure TForm1. begin liste := TStringList.Clear ListBox’ın içeriğini temizlemek için kullanılan methoddur.//listeyi yarat try with liste do begin Add('Ankara'). Add('Samsun').Assign(liste). //listeye ekle Add('İstanbul'). with ListBox1 do begin Items.Button3Click(Sender: TObject). Add('İzmir').//bellekten at end. Add('Muğla'). 440 .Create. • ListBox1. Aşağıda bu methoda ait örneklendirme yapılmıştır. finally liste.free. end.//listeyi komple ekle ItemIndex := 0. end. end. Add('Antalya').

//kaç satır var Form1.Items. Hatırlatalım ilk satırın numarası “0” dır.Button4Click(Sender: TObject).Items. // başlıkta yaz end.Caption:='Listede '+ IntToStr(sayi)+ ' Üye Var'.Items. //Temizle begin ListBox1. 441 .Button4Click(Sender: TObject).IndexOf Parametre ile girilen string değişkenin kaçıncı satırda olduğunu hesaplayabilen bir methoddur. Yukarıdaki örnek için “Antalya” şehrinin kaçıncı satırda olduğu aranarak.Count.Clear. • ListBox1.Count Liste içerisinde yer alan satır sayısını veren özelliğidir. Şayet liste içerisinde üyelerinizin isimlerini tutuyorsanız bu komutla üye sayınızı kolayca hesaplayabilirsiniz. Aranacak olan değer şayet string dışında bir veri içeriyorsa o zaman tip dönüştürme fonksiyonlarından faydalanmak zorundasınız. end.procedure TForm1.Items. var sayi:Integer. başlıkta yazması sağlanmaktadır. begin sayi:= ListBox1. • ListBox1. procedure TForm1.

Örnekte “Edit” kutusuna girilen şehir (“İzmir”) aranmakta listedeki sıra numarası da başlıkta yazmaktadır.IndexOf(Edit1. Sırada'. • ListBox1.Insert Listeye yeni satır eklemek için kullanılan methoddur. 442 .Items.Caption:='Seçtiğiniz Eleman ' + IntToStr(sayi+1)+ ' .IndexOf('Antalya').procedure TForm1. var sayi:Integer.//aktif yap end. Aksi takdirde işleminiz başarısızlıkla sonuçlanacaktır. Form1.Text).Items. Şayet aranacak olan string “Edit” kutusundan belirlenecekse o zaman aşağıdaki şekilde bir kodlama kullanmalısınız. var sayi:Integer.//Antalya kaçıncı satırda Form1. ListBox1. Sırada'. Eklenecek veri mutlaka string tipte bir değer içermelidir.Button4Click(Sender: TObject).ItemIndex:=sayi. end. begin sayi:=ListBox1.Caption:='Seçtiğiniz Eleman ' + IntToStr(sayi+1)+ ' . procedure TForm1. begin sayi:=ListBox1.Button4Click(Sender: TObject).Items.

ListBox1.Items.Delete Parametre ile belirtilen satırı listeden silmek için kullanılan methoddur. var deger:AnsiString. İlk satırın numarasının “0” olduğunu tekrar hatırlatalım. 443 .deger). satırı sil end. procedure TForm1.Items. İlk satırın numarasının “0” olduğunu tekrar hatırlatalım.Delete(2).Insert(2.procedure TForm1. begin deger:=Edit1.Text. satıra ekle end. Şayet silinecek olan satır numarası bir değişkenden alınacaksa o zaman aşağıdaki şekilde bir kodlama kullanmalısınız. end. procedure TForm1.Items. //3.Button5Click(Sender: TObject). • ListBox1. begin ListBox1.Button6Click(Sender: TObject).Insert(2. Şimdi de Edit kontrolüne girilen metni listeye eklemek için kullanmanız gereken kodlamayı verelim.Button5Click(Sender: TObject).'Rize').//3.Items. begin ListBox1.

Button6Click(Sender: TObject).//sil ShowMessage('Satır Silindi'). deger:AnsiString. 444 . deger:=Edit1. Dikkatlice inceleyiniz. Uygulamaya ait tüm kod parçası aşağıda verilmiştir.//kaçıncı satırda if satir<>-1 Then //eğer satır bulunursa sil begin ListBox1. ListBox1.Items.Text. var satir:Integer.IndexOf(deger).//girilen satırı sil end. var satir:Integer.Items.procedure TForm1.Text).Button6Click(Sender: TObject). satir:=ListBox1. end.Items.Delete(satir). bulunduğu satır silinmektedir. begin satir:=-1. Aşağıdaki örnekte Edit kutusuna girilen içerik listede aranarak.Delete(satir). begin satir:=StrToInt(Edit1. end else ShowMessage('Kayıt Bulunamadı'). procedure TForm1.

adet:Integer. Programa ait tüm kod parçası aşağıda verilmiştir. 445 . aynı olan tüm satırlar silinmektedir.Aşağıdaki örnekte “Edit” kontrolüne girilen metin listede aranarak. adet:=0. //Tümünü Sil var satir. deger:=Edit1. Tüm satırları dikkatlice inceleyiniz.Button7Click(Sender: TObject). Satırlar silindikten sonraki ekran görüntüsü aşağıda verilmiştir. procedure TForm1.Text. deger:AnsiString. Silinen satır sayısının kullanıcıya iletildiğine dikkat ediniz. begin satir:=0.

Items.Count-1. Until satir>ListBox1.Append Liste içerisine yeni satır eklemek için kullanılan bir methoddur.Items.Items[satir]=deger Then begin ListBox1. Programa ait tüm kod bloğu aşağıda verilmiştir. begin ListBox1.Items.Button9Click(Sender: TObject). • ListBox1. procedure TForm1. end. Dec(satir). Aşağıdaki örnekte liste içerisindeki satırlar kontrol edilerek var olan bir elemanın listeye eklenmesi engellenmektedir. end.Delete(satir). Dikkatlice inceleyip uygulayınız. Inc(satir). 446 .//Bir azalt inc(adet).Text).Append(Edit1. end.Repeat if ListBox1. if adet>0 then ShowMessage('Toplam '+IntToStr(adet)+' Satır Silindi') else ShowMessage('Kayıt Bulunamadı'). Aşağıda bu method örneklendirilmiştir.Items.

Button2Click(Sender: TObject). begin ListBox1.Button2Click(Sender: TObject). begin Form2.procedure TForm2. İlk satırın numarasının “0” olduğunu tekrar hatırlatalım.Strings[2]:='Rize'. veya procedure TForm2. 447 . satırı “Rize“ yap end.Strings[2].Strings Parametre ile belirtilen satırdaki içeriği öğrenmek veya değiştirmek için kullanılan methoddur.Items. end.Items[i] then//varsa begin ShowMessage('Kayıt Zaten Var').Append(deger).Items.Button1Click(Sender: TObject).//eleman sayısı for i:=0 to satir-1 do begin if deger=ListBox1.Count.satir:Integer.//3. i. Burada parametre olarak girilen değerler satır numaralarıdır. var deger:AnsiString.//yoksa ekle end. procedure TForm2. exit.Items.Items. end. • ListBox1.Text. ListBox1.//bitir end.Caption:=’3. • ListBox1.Items. begin deger:=Edit1.Items.Exchange Parametre ile belirtilen iki satırın yerlerini değiştirmek için kullanılan methoddur. satir:=ListBox1. Satırdaki İçerik ‘+ListBox1.

• ListBox1. satir ile 4.ikinci).Move(0.Items.Text).//2.Text). var ilk.//ilk satırı bul ikinci:=ListBox1. procedure TForm2. end.procedure TForm2.Move Birinci parametre ile belirtilen satırı. begin ListBox1.Items.Items. 448 .Items. satıra taşı end.satir:Integer. begin ListBox1.IndexOf(Edit1.//değiştir end.Items.Items. Şayet içeriğini bildiğiniz iki satırı yer değiştirmek isterseniz.//ikinci satırı bul ListBox1.3). satırın yerini değiştir.Button2Click(Sender: TObject).ikinci.2). procedure TForm2. o zaman aşağıdaki şekilde bir algoritma geliştirmelisiniz. ikinci parametre ile belirten satıra taşır.Button2Click(Sender: TObject).Exchange(1.Exchange(ilk.Button2Click(Sender: TObject).//birinci satırı 3.IndexOf(Edit2. begin ilk:=ListBox1.

Dosyalama işlemlerinde bu konuya değinilmiştir. • ListBox1.LoadFromFile('c:\gazi\egitim.SaveToFile('c:\gazi\egitim.SaveToStream Bu methodla listBox içerisindeki satırları Tstream tipli bir değişkene aktarabilirsiniz. begin ListBox1.MultiSelect Varsayılan olarak ListBox içerisinden tek bir satır mous ile seçilebilir.//yükle end. procedure TForm2.Create('c:\gazi\egitim. • ListBox1.//dosyayı yarat ListBox1.Items.LoadFromFile Parametre ile belirtilen adresteki dosyanın içeriğini listeye kopyalayan methoddur.Button2Click(Sender: TObject). procedure TForm2. begin dosya:=TFileStream.fmCreate).Items. “MultiSelect” özelliğini “true” yaparsanız “Ctrl” ve “Shift” tuşlarını kullanarak 449 . Aşağıdaki örnekte liste içerisindeki satırlar “Stream” tipli bir değişken kullanarak “egitim.SaveToFile ListBox ın içeriğini parametre ile belirtilen adrese kopyalayan methoddur. Yine bu hususa dosyalama işlemleri bölümünde değinilmiştir.SaveToStream(dosya). procedure TForm2.Items.txt'. Diğer satırı seçtiğiniz zaman önceki satır seçili olma özelliğini yitirecektir.Items.//Kopyala end.Items. • ListBox1. Dolayısıyla Tstream değişkeninin referans gösterdiği dosya listedeki satırları içerisine almış olacaktır.Items. begin ListBox1.• ListBox1.Button2Click(Sender: TObject).txt').Button2Click(Sender: TObject).txt” isimli dosyaya yazdırılmaktadır. var dosya:TFileStream.txt').//stream a yaz end.

txt'.Create('c:\gazi\egitim. var dosya:TFileStream.fmOpenRead).txt'. Aşağıda bu husus örneklendirilmiştir.ItemIndex:=0.//ikinci satırı seç end. begin dosya:=TFileStream.Items. • ListBox1. procedure TForm2.//içeriği al end. “ItemIndex” özelliğine ait aşağıdaki gibi bir kodlamada kullanılabilir.ItemIndex:=1.liste içerisinden çoklu seçim yapabilirsiniz (Shiftle seçilen satırlar arası bloklanır. var dosya:TFileStream.Items.Items.Button4Click(Sender: TObject).Button3Click(Sender: TObject). Programı çalıştırdıktan sonra akışa alınan (egitim. begin ListBox1.//ilk elemanı seç end. • ListBox1.fmOpenRead). ListBox1. procedure TForm2. ListBox1. Ctrl ile de her tıklanan satır seçilir).LoadFromStream Parametre ile belirtilen Stream tipli değişkenin referans gösterdiği dosyanın içeriğini listeye aktarmak için kullanılan bir methoddur. begin dosya:=TFileStream.txt) dosyanın içeriği listBox içerisinde görüntülenecektir.LoadFromStream(dosya).Create('c:\gazi\egitim. 450 .ItemIndex Kontrol içerisindeki seçili elemanın satır numarasını veren veya diğer bir satırı seçmek için kullanılan özelliktir.LoadFromStream(dosya). procedure TForm2. ListBox1.Button3Click(Sender: TObject).

Button4Click(Sender: TObject). Geriye “true” değerinin dönmesi o satırın seçili olduğunu anlamını taşımaktadır. begin 451 .ListBox1DblClick(Sender: TObject).//Sil ShowMessage('Satır Silindi'). end else ShowMessage('Silme İşlemi İptal Edildi'). • ListBox1. if tikla=MrYes then begin satir:=ListBox1. procedure TForm2. begin tikla:=Application.//seçili elemanın satır numarası ListBox1. end.'Sil'.Selected Parametre ile belirtilen satırın seçili olup olmadığını belirten özelliğidir.MessageBox('Silmek İstediğinizden Eminmisiniz'.items. MB_YESNO).Delete(satir).Aşağıdaki uygulamada üzerine mous ile çift tıklanan satır kullanıcıdan onay alınarak silinmek istenmektedir. var satir. procedure TForm2.eleman:Integer.ItemIndex. var satir.tikla:Integer.adet.

Sorted:=true.Button5Click(Sender: TObject).//Sırala end. “True” değerinin aktarılması sıralama işleminin yaptırıldığı anlamını taşımaktadır. • ListBox1.Caption:='Listede Seçili '+IntToStr(eleman)+' Eleman Var'. //Sırala begin ListBox1. Until satir>adet-1. Programa ait tüm kod bloğu aşağıda verilmiştir.Count. Form2.//kaç satır var eleman:=0. Aşağıdaki uygulamada Liste içerisindeki elemanlar önce alfabetik sıraya göre sıralanmakta. end.adet:=ListBox1. Repeat if ListBox1.Selected[satir] then //seçili ise inc(eleman). ardından ilk elemanlarla son elemanların yerleri değiştirilmektedir.Sorted Listedeki satırların küçükten büyüğe doğru sıralanmasını sağlayan özelliğidir. Dikkatlice inceleyip tüm kod satırlarını anlamaya çalışınız.Items. 452 . satir:=0. inc(satir). procedure TForm2.

Repeat ListBox1. begin ListBox1.procedure TForm2.numara:Integer. • ListBox1. i:=0.Button5Click(Sender: TObject). end. TabOrder:=2. //Tersten Sırala var adet. 453 . //üçüncü sırada end. TabOrder Tab tuşuyla geçis sırasını belirleyen özelliğidir.Count.//sıralat adet:=ListBox1. //Yerlerini değiştir inc(i). Dec(numara). Until i>(adet-1)/2. Tab geçiş numarası tam sayı tipli bir değer ile ifade edilir.Exchange(i.Items.numara). begin ListBox1. procedure TForm2.i.Button5Click(Sender: TObject).Sorted:=true.Items. numara:=adet-1.

Alabileceği seçenekler aşağıda verilmiştir. • ListBox1.Items Listedeki tüm elemanları içerisinde tutan özelliğidir. 454 .ListBox1Click(Sender: TObject).FormCreate(Sender: TObject). • ListBox1.TabStop Kontrole tab tuşuyla erişilip erişilemeyeceğini belirleyen özelliğidir. procedure TForm2.Style Listede yer alan satırlardaki karakter boyutlarıyla ilgili seçenekleri tutan özelliğidir. Bildiğimiz dizi değişken gibi kullanılabilir.Caption:=ListBox1.ItemIndex].TabStop:=false. ListBox1.Items[ListBox1. “True” değerinin aktarılması “Tab” tuşuyla bu kontrole erişilebileceği anlamını taşımaktadır. begin ListBox1.Top Kontrolün üst köşesinin formun üst köşesine olan mesafesidir. begin ListBox1.• ListBox1. begin Form2.//seçili elemanı yaz end. • ListBox1.Button5Click(Sender: TObject). procedure TForm2.//tab tuşuyla uğrama end. • ListBox1.Top:=0. procedure TForm2.Left Kontrolün sol köşesinin formun sol köşesine olan mesafesidir.//sol üst köşeye yasla end.Left:=0.

Aşağıda bu husus örneklendirilmiştir. En alt satıra dikkat ediniz.Items. Sol taraftaki örnekte ‘IntegralHeight” özelliği “false” sağ taraftakindeyse “true” yapılmıştır. end.Button6Click(Sender: TObject).IntegralHeight:=false.Style lbOwnerDrawFixed lbOwnerDrawVariable lbStandard lbVirtual lbVirtualOwnerDraw • ListBox1. begin ListBox1. Yani “2” değerini aktarırsanız beyaz alandaki sütun sayısı 2” olacaktır. • ListBox1.Columns Liste içerisinde satırların tek veya daha fazla sütundan oluşmasını sağlayan özelliğidir. 455 . Girilen değer aktif gözüken kısımdaki sütun sayısıdır (listedeki sütun sayısı değil). ListBox1.Add(Edit1. Satırın tam olarak gözüküp gözükmeyeceğini belirler.Text). procedure TForm2.IntegralHeight Listenin en alt satırındaki içeriğin görüntürünü ayarlayan özelliğidir.

Button6Click(Sender: TObject).IntegralHeight:=false.Columns:=2.//kaç eleman seçili Form2.SelCount Liste içerisindeki seçili eleman sayısını veren özelliğidir.SelCount.BorderStyle Kontrolün üç boyutlu görüntüsünü ayarlayan özelliğidir. end.Button6Click(Sender: TObject).Caption:=IntToStr(adet). begin ListBox1. Alabileceği değerler aşağıda verilmiştir. procedure TForm2. • ListBox1. end. begin ListBox1. procedure TForm2.Aşağıdaki örneklerden sol taraftaki formda “Colums” özelliğine “1” değeri aktarılmış olup sağ taraftakindeyse “2” değeri girilmiştir. BorderStyle bsNone bsSingle Düz Üç Boyutlu Sonuç 456 . var adet:Integer. • ListBox1. adet:=ListBox1.

//Düz yap end. begin ListBox1.BevelInner Üç boyutlu görüntünün kenarlarla ilişkisini ayarlayan özelliğidir.Button6Click(Sender: TObject).BorderStyle:=bsNone. procedure TForm2. • ListBox1. Aşağıda alabileceği değerler verilmiştir. BevelKind bsNone bkFlat bkSoft bkTile Düz Üç Boyutlu Üç Boyutlu Üç Boyutlu Sonuç • ListBox1.BevelKind Üç boyutlu görünüm için seçenek sunan diğer bir özellik. BevelInner bsNone bvLowered bvRaised bvSpace Yok Tüm Kenarlar Sağ ve alt kenarlara Hafif Sonuç 457 .Properties penceresinden ayarlanabileceği gibi aşağıdaki şekilde “Unit” penceresinden kodla da kolayca değiştirebilirsiniz. Sonuçlarını deneyerek görebilirsiniz.

458 .Add('Barş Manço (Dönence)').Items.TopIndex Seçili elemanın ilk satırdan değilde gözüken satırlar içerisinde kaçıncı sırada olduğunu döndüren özelliğidir. ListBox1. ListBox1.Items.ItemAtPos ListBox üzerinde cursor’un bulunduğu koordinatların karşılık geldiği satır numarasını döndüren çok önemli bir methoddur.Items.Add('Ebru Gündeş (Sensizim)').Add('Kıraç (Kan ve Gül)').Add('İzel (Bebek)'). • ListBox1.Add('Sibel Can (Padişah)'). Bilhassa birden fazla listeBox ile çalışırken kullanılan bir özelliktir.• ListBox1. ListBox1.Add('Hülya Avşar (Sevdim)'). end.//Global değişken procedure TForm3.Items. ListBox1.FormCreate(Sender: TObject). begin ListBox1.Items. Aşağıdaki uygulamada (Win Amp benzeri bir program) liste içerisindeki elemanları sol tuşa basıp seçerek kolayca yer değiştirebilirsiniz (sürükleme yapmalısınız). ListBox1. var deger:AnsiString.items.

numara:Integer. X.ListBox1MouseDown(Sender: TObject.false).procedure TForm3. var nokta:TPoint. numara:=ListBox1. X. İşleminizin başarıyla gerçekleştiğini göreceksiniz.Items.Insert(numara. begin if Button=mbLeft Then //sol tuşa basarsa begin nokta.deger).X:=X.//Araya ekle end.ListBox1MouseUp(Sender: TObject.Items[numara].false). numara:=ListBox1. Button: TMouseButton. Y: Integer). Şimdi programı çalıştırıp mous ile bir satırı seçiniz. nokta.//bul ve sil ListBox1. procedure TForm3.IndexOf(deger)).Y:=y. begin nokta.ItemAtPos(nokta. numara:Integer. end.X:=x. end. Shift: TShiftState. Button: TMouseButton.Y:=Y.//cursor koordinatları nokta.//hangi satır ListBox1.Items.//hangi satır deger:=ListBox1. var nokta:TPoint. Ardından tuşu bırakmadan sürükleyip başka bir satırın üzerine bırakınız. 459 .ItemAtPos(nokta. Shift: TShiftState.Delete(ListBox1.Items. Y: Integer).

procedure TForm4.Text Seçili satırın içeriğini değiştirmek veya öğrenmek için kullanılan özelliğidir. 460 .ComboBox Kontrolü: ListBox kontrolünün bir çok özelliğini aynen kullanabilen bir kontroldür.Items. end.Text:='Prestige Education Center'. begin ComboBox1.FormCreate(Sender: TObject). • ComboBox1.Add Kontrole yeni bir satır eklemek için kullanılan methoddur. • ComboBox1. Aşağıda özellikleri izah edilmektedir. Yükarıdaki görüntüyü sağlaya kod bloğu aşağıda verilmiştir. Görüntüsel olarak listBox kontrolünün kapalı olanı şeklinde de düşünülebilir.

• ComboBox1.Add('BURSA').Items. ComboBox1.Add('ISTANBUL'). elemanı göster end. Aynı görüntüyü properties penceresindeki “Items” özelliğini kullanarak aşağıdaki şekilde de yapabilirsiniz (ama siz hep kodla yapın). ComboBox1.procedure TForm4.Add('ANKARA').ItemIndex:=2. 461 . ComboBox1. ComboBox1. begin ComboBox1. procedure TForm4.Add('IZMIR'). Bu pencereden gerekli verileri girebilirsiniz.FormCreate(Sender: TObject). “Items” özelliğinin sağında bulunan ufak buttona tıklarsanız yukarıdaki pencere açılacaktır.//3.Add('RIZE').ComboBox1Click(Sender: TObject).Items.Items. end. begin ComboBox1.ItemIndex Combo kutusu içerisinde gösterilecek olan satırın numarasını atayabileceğiniz özelliğidir.Items.Add('SAMSUN').Items.Items. ComboBox1.

• Combobox1. 462 .Items.Items.Add('BURSA'). ComboBox1.DropDownCount ComboBox a ait liste aşağıya doğru açıldığı zaman kaç satırı göstereceğini bu özellikle belirleyebilirsiniz.Items.Add('SAMSUN').FormCreate(Sender: TObject). ComboBox1. ComboBox1.Items.Add('ISTANBUL'). ComboBox1.Add('ANKARA').ItemIndex:=2.Items. Görüldüğü gibi açıldığı anda “4” satır gözükmektedir.Items.ItemIndex:=2.Add('SAMSUN'). ComboBox1.Items.Items.Items. ComboBox1.FormCreate(Sender: TObject).Add('IZMIR').Add('RIZE'). ComboBox1.Items.Add('RIZE'). begin ComboBox1. ComboBox1. procedure TForm4. ComboBox1.//IZMIR i gösterir Combobox1. procedure TForm4.//IZMIR i gösterir end. ComboBox1. ComboBox1.Add('BURSA').Items.Add('ANKARA').Add('IZMIR'). ComboBox1.DropDownCount:=4// 4 satır göster end.Items. Diğer satırlara ulaşabilmek için kaydırma çubuğunu kullanmalısınız.Add('ISTANBUL'). begin ComboBox1.Aşağıdaki örnek kodlamaya dikkat ederseniz özelliğin ne işe yaradığı çok daha iyi anlaşılacaktır.

463 . Görüldüğü gibi satır yüksekliği istenildiği değere getirilebilir.Button1Click(Sender: TObject). procedure TForm4. Alabileceği değerler aşağıda verilmiştir. Değişikliği sağlayan kod bloğu aşağıda verilmiştir. begin ComboBox1. ComboBox1.//satır yüksekliğini 40 yap end.ItemHeight:=40. BevelInner csDropDown csSimple csDropDownList csOwnerDrawFixed csOwnerDrawVariable Bilgi girişi yapılabilir Açılmayan ComboBox Bilgi girişi Yapılamaz Sonuç Karakter yükseklikleri farklı olabilir Grafik içerikli ComboBox • ComboBox1.ItemHeight Kontrolün satır yüksekliğini belirleyen özelliğidir.Style ComboBox a ait açılan pencere özelliklerini ayarlayabileceğiniz özelliğidir.Style:=csOwnerDrawFixed.• ComboBox1.

Constraints MaxWidth MinHeight MaxHeight MinWidth Max genişlik Minimum yükseklik Max Yükseklik Minimum Genişlik Sonuç procedure TForm4.BevelKind Kontrolün üç boyutlu görüntüsü ile ilgili kısımları belirleyen özelliğidir. begin ComboBox1.Button1Click(Sender: TObject).Constraints Kontrole ait ebatların (yükseklik.MinWidth :=10. genişlik) minimum.maximum değerlerini belirleyebileceğiniz özelliğidir. end.BevelKind:= bkFlat.Constraints. begin ComboBox1. 464 . end.Button1Click(Sender: TObject). procedure TForm4. BevelKind bsNone bkFlat bkSoft bkTile Düz Üç Boyutlu Üç Boyutlu Üç Boyutlu Sonuç • ComboBox1.• ComboBox1.

465 . Aşağıdaki pencere açılacaktır. Bu pencerede “Add” buttonuna tıklayarak projede kullanacağınız tüm resimleri ekleyebilirsiniz.ImageList Kontrolü: Çalışma anında gözükmeyen fakat diğer kontrollerin kullanacağı resimleri depolayan bir kontroldür. Formunuzun üzerine bir adet “ImageList” kontrolü yerleştirerek mous ile üzerine çift tıklayın.” Delete” ile silebilir. Export ile resim “Export” edebilir ve “Clear” ile de pencereyi temizleyebilirsiniz. Fazla bir özelliği bulunmadığı için içerisine resimleri nasıl depolayabileceğinizi göstermek yeterli olacaktır. “Replace” ile resmi değiştirebilir. Bu pencereden gerekli resimleri yükleyebilirsiniz.

ListView Kontrolü: “MyComputer” icon’una çift Click yaptığınız zaman açılan pencere bu kontrol ile gerçekleştirilmiştir dersek sanıyorum gerekli olan açıklamayı yapmış oluruz. Adımları dikkatlice takip ediniz. Aşağıda iki pencerede oluşturulmaya çalışılacaktır. ikinci “ImageList” içerisindeki resimlerde küçük iconları göstermek için kullanılacaktır. veya Yukarıdaki iki pencerede “ListView” kontrolü kullanılarak kolayca oluşturulabilir. 466 . Birinci “ImageList” içerisindeki resimler büyük iconları. • Projenize iki adet “ImageList” kontrolü yerleştirip gerekli resimleri yükleyiniz.

• Bu pencerede “New Item” buttonuna tıklayarak gerekli etiketleri ekleyiniz. • “OK” e basıp ardından programınızı çalıştırınız. • Dördüncü adımda “Items” özelliğine tıklayarak aşağıdaki pencerenin açılmasını sağlayın. • Properties penceresinden “ViewStyle” özelliğini (kodla da yapabilirsiniz daha güzel olur) değiştirerek diğer görüntülerinede ulaşabilirsiniz. 467 . “SmallImages” özelliğinede “ImageList2” değerini aktarın. Bu şekilde “ImageList” kontrolünden etiketin hangi resimle temsil edileceğini belirlemiş olursunuz. • Üçüncü adımda “ListView” kontrolünün “LargeImages” özelliğine “ImageList1”. Bu pencerede resimlerle eşit sayıda etiket oluşturacağız.• İkinci adımda formunuza bir adet “ListView” kontrolü yerleştirip “Align” özelliğini “alClient” yapın. Aynı pencerede “Image Index” değerlerinide “0-4” arasında girmeyi unutmayın. Ekran görüntünüz aşağıdaki şekilde gerçekleşecektir.

• Üçüncü adımda “ListView” kontrolünün “ViewStyle” özelliğine “vsReport” değerini aktarın. Ekran görüntünüz artık aşağıdaki şekilde olacaktır. • “List”View” kontrolünün “Align” özelliğine “alBottom” değerini giriniz. • İkinci adımda “ListView” kontrolünü seçip properties penceresinden “Columns” özelliğine tıklayın. 468 .Yukarıdaki pencerede “ViewStyle” özelliğine “vsSmallIcon” değeri aktarılmıştır. Öncelikle gösterilen tasarımı oluşturun. Aşağıdaki pencere açılacaktır. Şayet rapor içeren bir “ListView” görüntüsü istenirse o zaman aşağıdaki adımları izlemelisiniz. Bu pencerenin beyaz alanında mousun sağ tuşuna tıklayıp menünün açılmasını sağlayın. Açılan menüden “5” kere “Add” seçeneğini seçerek “Caption” değerlerine ekrandaki gibi sütun başlıklarını giriniz.

Text). 469 . ListView1. ListView1.//satır ekle ListView1. Şimdi örneklerde kullandığımız özellikleri bir hatırlayalım.LargeImages “ListView” kontrolünün “ViewStyle” özelliğine “vsIcon” verilmesi durumunda kullanacağı resimleri belirleyen özelliğidir.SubItems. ListView1.Items[0].Add(Edit1.SubItems.SubItems.Items[0].Items[0].Text). procedure TForm2.SmallImages:=ImageList1.Add(Edit3.Text).Add.Add(Edit2. • ListView1.Text). begin ListView1. • ListView1. ListView1.Items[0].SmallImages “ListView” kontrolünün “ViewStyle” özelliğine “vsSmallIcon” verilmesi durumunda kullanacağı resimleri belirleyen özelliğidir.Add(Edit4. ListView1.Items.Items[0].• Dördüncü adımda formunuza bir adet button kontrolü ekleyip aşağıdaki kodu “OnClick” yordamına yazınız.SubItems. end.Caption:=ComboBox1.Text.Button1Click(Sender: TObject).

470 .Items[0].ViewStyle “ListView” içerisindeki verilerin nasıl gösterileceğini bu belirleyebilirsiniz. • Listview1. Properties den eklediğimiz sütunları kodla bu şeklide kolayca gerçekleştirebiliriz.SubItems. • ListView1.Add Kontrole yeni bir sütun eklemek için kullanılan özelliğidir.Text.Items[0].Caption:=ComboBox1.ListView1. “True” değerinin aktarılması işaretli olacağı anlamını taşımaktadır.SmallImages:=ImageList2. • ListView1. • ListView1.Caption Eklenen ana sütunun etiketini belirleyen özelliğidir.Add Ana sütuna ait yan sütunları oluşturmak ve içeriğini belirlemek için kullanılan methoddur.Items. • ListView1.Items[0]. • ListView1. ViewStyle vsList vsIcon vsReport vsSmallIcon Liste li halde Etiket+Resim Rapor şeklinde Ufak resim+Etiket Sonuç özellikle • Listview1.Items.Columns.Clear “ListView” kontrolünün içeriğini temizlemek için kullanılan methoddur. Kullanabileceği seçenekler aşağıda verilmiştir.Add “ListView” içerisine satır eklemek için kullanılan methoddur. ListView1.Checkboxes Eklenen satırların başlarında Check işaretinin olup olmamasını belirleyen özelliğidir.

SubItems.Text).Add(Edit1. • Listview1.SubItems. Listview1.Add. • ListView1.ColumnClick Eklenen sütun başlıklarının button gibi kullanılıp kullanılmayacağını belirleyen özelliğidir.Items[0]. end.Checkboxes:=true.ColumnClick:=true.Add(Edit3. procedure TForm2.GridLines “ListView” kontrolü içerisinde grid çizgilerinin gösterilip gösterilmeyeceğini belirleyen özelliğidir.Text). begin ListView1. “True” değerinin aktarılması grid çizgilerini göster anlamı taşımaktadır. ListView1. 471 .Text). ListView1. ListView1. ListView1.Items.Items[0].Add(Edit4.Text.Add(Edit2.Items[0].Button1Click(Sender: TObject).Button1Click(Sender: TObject).Items[0]. begin Listview1.SubItems. ListView1.Text).Caption:=ComboBox1.Items[0].SubItems.procedure TForm2.//check göster end.

Items.FormCreate(Sender: TObject).'Üniversitelerimiz').FormCreate(Sender: TObject). procedure TForm1.Add(Nil. end.'Üniversitelerimiz').Add Yapıya ana düğüm noktası eklemek için kullanılan methoddur.'Gazi Üniversitesi'). Birden fazla ana düğüm eklemek mümkündür.AddChild(eleman. • Treeview1.Add(Nil.Items.Add(Nil.Items. eleman:=TreeView1. begin eleman:=Treeview1. • Treeview1. Windows içerisinde bir çok yerde rastladığımız bu kontrole ait özellikler aşağıda teker teker açıklanmaya çalışılmıştır. “AddChild” metdodu ile eklenen her satır. procedure TForm1. Treeview1.Items.Items. begin Treeview1. 472 .TreeView Kontrolü: Ağaç yapısı işlemleri için kullanılan kontroldür. eleman:=Treeview1.Items.'Yüksek Okullarımız').AddChild(eleman.'Mühendislik Mimarlık Fakültesi').Items. //Ağaç yapısı var eleman:TTreeNode. end. bir önceki satırın elemanı olacaktır.AddChild Ağaç yapısına alt eleman eklemek için kullanılan methoddur.

'Müh. Her eklenen ve silinen satırda diziyi yeniden boyutlandırmalısınız.AddChild(eleman[1].AddChild(eleman[4]. eleman[6]:=TreeView1.9] of TTreeNode.'Müh.'Orta Doğu Teknik Üniversitesi'). eleman[7]:=TreeView1.AddChild(eleman[6].Items. Şayet sıralı olarak girilmeyecekse bu şekilde dizi kullanmak size çok büyük kolaylık sağlayacaktır.'İletişim Fakültesi'). eleman[4]:=TreeView1.Items.Items. eleman[5]:=TreeView1.Items.'Fen Edebiyat Fakültesi').AddChild(eleman[0]. eleman[1]:=Treeview1. Hatırlatalım satır sayıları belli olmadığı için dinamik dizi kullanmanız daha sağlıklı olacaktır..Items.Fakültesi'). Aşağıdaki tasarımı oluşturunuz.Items.Add(Nil.Buraya kadar gördüklerimizle aşağıdaki ağaç yapısını oluşturmaya çalışalım. Aşağıdaki örnekte Edit kutusuna girilen Üniversite veya Fakülte ağaç yapısına kolayca eklenebilmektedir. eleman[2]:=TreeView1.'Üniversitelerimiz').AddChild(eleman[0]. procedure TForm1.Items.AddChild(eleman[6].Insert Seçili elemanın yerine yeni bir satır yaratmak için kullanılan methoddur.AddChild(eleman[6].AddChild(eleman[].AddChild(eleman[0].AddChild(eleman[1]. eleman[3]:=TreeView1.Items.Mim.'İletişim Fakültesi').FormCreate(Sender: TObject).'Hacettepe Üniversitesi').Mim.Items. eleman[8]:=TreeView1. end. Ekleme işlemi istenilen düğüm için yapılabilir.'Tıp Fakültesi'). Şimdi 473 . Fakültesi').Items.'Gazi Üniversitesi').Items. “TreeView1.Items. eleman[9]:=TreeView1. • TreeView1. begin eleman[0]:=Treeview1.’ ’)” methodundaki “eleman[]” altına ekleneceği satırı belirlemektedir. var eleman:Array[0.

end.AddFirst(TreeView1.Button1Click(Sender: TObject).Items. • TreeView1.Items.Text).Selected.Items. procedure TForm1.Insert(TreeView1.Edit1.aşağıdaki tasarımı oluşturup Edit kutusuna girilen “Üniversite” veya “Fakülte” ismini seçilen satıra ekleyelim. procedure TForm1.Text). 474 .Edit1. begin TreeView1.Selected.//en üste ekle end.Button1Click(Sender: TObject). Programı çalıştırıp “Ekle” buttonuna tıklarsanız seçmiş olduğunuz satırın en üstune (o düğüme ait en üste) “Edit” kutusundaki metin satır teşkil edecek şekilde yerleşecektir.AddFirst Düğümün en üst satırına veri eklemek için kullanılan methoddur. begin TreeView1.

• TreeView1. procedure TForm1. • TreeView1. begin Form1.//satırı yaz end.TreeView1Click(Sender: TObject).Text Seçili satırın içeriğini tutan özelliğidir. Herhangi bir üniversite ismi tıklanırsa “1” veye herhangi bir fakülte tıklanırsa “2” (tüm fakülteler için aynı) değerini gösterecektir. • TreeView1. Örneğimizde “Üniversitelerimiz” tıklanırsa “0”.Caption:=IntToStr(TreeView1.Selected.Selected.AbsoluteIndex).TreeView1Click(Sender: TObject).Level Ait olduğu düğüm numarasını tutan özelliğidir.Selected.Selected.• TreeView1. begin Form1.Selected Ağaç yapısında seçili elemana ait tüm seçenekler bu özellikte tutulur. end.Caption:=TreeView1. procedure TForm1. Aşağıdaki şekilde bir kodlamayla seçmiş olduğunuz satırı başlıkta yazdırabilirsiniz.AbsoluteIndex Seçili elemanın kaçıncı satır olduğunu veren özelliğidir.Selected. 475 .//seçili satırı yazdır.Text.

FullCollapse Açık olan tüm düğüm noktalarını kapatmak için kullanılan methoddur.Caption:=IntToStr(TreeView1. //Düğümleri Aç begin TreeView1. //Düğümleri Kapat begin TreeView1.//düğümü yaz end. procedure TForm1.Count Ağaç yapısındaki tüm satırların toplam sayısını veren özelliğidir.Items.//Tüm düğümleri aç end.Button1Click(Sender: TObject). procedure TForm1. • TreeView1.Button2Click(Sender: TObject). Satırın ana veya yavru olması fark etmez.FullExpand.FullExpand Tüm düğüm noktalarını açmak için kullanılan methoddur.procedure TForm1. 476 .Selected. • TreeView1.TreeView1Click(Sender: TObject). begin Form1.FullCollapse. Tümünün toplam sayısını hesaplayacaktır. • TreeView1.//Tüm düğümleri kapat end.Level).

ShowLines Satırlar arası bağlantı çizgilerinin gösterilip gösterilmeyeceğini belirleyen özelliğidir. end.ShowButtons:=false. begin TreeView1. “False” değerinin aktarılması bu işaretin gösterilmeyeceği anlamını taşımaktadır.ShowButtons Ana rootta bulunan elemanların başındaki “+” işeretinin gösterilip gösterilmemesini belirleyen özelliğidir.Count).Items.Caption:=IntToStr(TreeView1.procedure TForm1. 477 .//kaç satır var end.Button2Click(Sender: TObject). begin Form1. • TreeView1. • TreeView1. procedure TForm1.Button2Click(Sender: TObject).

TreeView kontrolü içerisindeki tüm satırlara dizi mantığıyla erişebilirsiniz. procedure TForm1. Aynı mantıkla diğer işlemleride siz yaptırın.Selected). begin TreeView1.ReadOnly:=true. • TreeView1.//değişikliklere izin verme end.Text En üst elemana ait içeriği veren özelliğidir.Text.TopItem. Şayet bu değere true aktarırsanız kullanıcının bu tür bir değişiklik yapmasını engellersiniz. begin Form2.Delete Belirtilen satırı silmek için kullanılan methoddur. 478 . • TreeView1. Kullanıcı herhangi bir satıra tıklayıp elemanın değerini değiştirebilir. • TreeView1.FormCreate(Sender: TObject). begin TreeView1. • TreeView1. Aşağıdaki örnekte üçüncü satırdaki elemanın içeriği yazdırılmaktadır. procedure TForm2.Button2Click(Sender: TObject). procedure TForm1.Items.//çizgileri gösterme end.Items[] Bu method ile tüm satırlara kolayca erişmeniz mümkün.Items. begin TreeView1.Button2Click(Sender: TObject).Button2Click(Sender: TObject).procedure TForm1.//seçili satırı sil end.ShowLines:=false.Delete(TreeView1.TopItem. Aşağıdaki örnekte ağaç yapısından seçilen eleman buttona tıklanarak silinmektedir. end.Caption:=TreeView1.ReadOnly Varsayılan değer olarak bu özellik false dır.

2. Programınızı çalıştırdıktan sonra ekran görüntünüz aşağıdaki şekilde oluşacaktır.Items[2]. Açılan pencereden aşağıdaki ayarlamaları yapın. ImageList kontrolü içerisine gerekli resimleri depolayın.FormCreate(Sender: TObject).Caption:=TreeView1. Görüldüğü gibi properties penceresinden de kolayca ağaç yapısı oluşturulabilmektedir. Hatırlatalım siz kodla yapmayı her zaman tercih ediniz. Bu pencerede “New Item” ve “Sub Item” buttonlarını kullanarak yukarıdaki şekli oluşturun. Şimdi daha önce kodla yaptığımız işlemi properties penceresini kullanarak yapmaya çalışacağım.procedure TForm2. begin Form2. Ayrıca resim yerleştirmek istrerseniz “ImageIndex” değerlerinide “ImageList” kontrolündeki sıralamaya dikkat ederek giriniz. satır içeriğini yaz end. 3. Aşağıdaki adımları dikkatlice takip ediniz. 479 .//3.Text. 1. TreeView kontrolünün “Items” özelliğine tıklayın. Projenize bir adet TreeView ve bir adet ImageList kontrolü yerleştirin. 4. TreeView kontrolünün “Images” özelliğine ImageList1 değerini girin.

end.SaveToFile Kontrol içerisindeki veriyi dosyaya kaydetmek için kullanılan methoddur.Button2Click(Sender: TObject). Bu işleme “ListBox” kontrolünde detaylı olarak değinilmiştir.SaveToStream Kontrol içerisindeki veriyi Stream tipli değişkene aktarmak için kullanılan methoddur. • TreeView2.LoadFromFile('c:\gazi\agac. Bu bölümde formunuza iki adet “TreeView” kontrolü ile iki adet “Button” kontrolü yerleştirip aşağıdaki tasarımı oluşturunuz.txt'). 480 . //Kaydet begin TreeView1. procedure TForm2. İncelemek için o bölüme bakmalısınız.txt').Button1Click(Sender: TObject). begin TreeView2. procedure TForm2. • TreeView1. end.• TreeView1.SaveToFile('c:\gazi\agac.LoadFromFile Dosyadaki içeriği kontrole aktarmak için kullanılan methoddur (resimsiz olarak).

Eklemiş olduğunuz “Button” kontrollerinin “OnClick” yordamlarına aşağıdaki kod bloklarını ekleyiniz.Button2Click(Sender: TObject). begin TreeView2. Ardından “Aç” buttonuna tıklayarak dosyadaki içeriğin ikinci “TreeView” kontrolüne yüklenmesini sağlayın. 481 .txt'). begin TreeView1. procedure TForm2.//kaydet end. Programı çalıştırdıktan sonra ilk olarak “Kaydet” buttonuna tıklayıp içeriği dosya olarak kaydedin.//aç end.LoadFromFile('c:\gazi\agac.txt').SaveToFile('c:\gazi\agac.Button1Click(Sender: TObject). procedure TForm2.

Bu pencereye kontrolünüzde yer almasını istediğiniz yaprakların başlık isimlerini girmelisiniz. İkinci adımda properties penceresinde yer alan “Tabs” özelliğine tıklayın aşağıdaki pencere açılacaktır. Bu şekilde “kontrolünüzün boyutlarını formunuzun boyutlarına eşit hale getirmiş olacaksınız. Aynı zamanda formunuzun boyutlarını değiştirdiğiniz zaman “TabControl” ünüzün boyutlarıda değişecektir. Aşağıdaki pencere görüntüsü “”Delphi projesi içerisinde “File->New->Other” seçeneklerinden sonra alınmıştır. Delphi’de gerektiği zaman bu kontrolden faydalanmaktadır. Oluşan bu yapraklardan dilediğinizi mous ile üzerine tıklayıp aktif hale getirebilirsiniz. Yani birinci yaprakta bulunan “Edit” kontrolünün içeriğini. Gireceğiniz başlık ismi kadar yaprak otomatik olarak oluşturulacaktır. 1. ikinci sayfadaki bir kontrol de yazdırmak için extra yapmanız gereken hiç bir işlem yoktur. 482 . Formunuza bir adet “TabControl” yerleştirin ve Align özelliğine “alClient” değerini aktarın. 2.TabControl Kontrolü: Farklı yapraklarda değişik işlemler yapmanıza olanak tanıyan bir kontroldür. Bu kontrol de farklı sayfalardaki kontroller birbirlerine kolayca veri gönderebilmektedir. Aşağıda ki adımları izleyerek kullanımına ait incelikleri öğreniniz.

Add('Genel Bilgiler').Tabs. Yukarıdaki işlemi kodla yapmak isterseniz aşağıdaki şekilde bir kodlama kullanmanız gerekecektir.FormCreate(Sender: TObject). procedure TForm1.Tabs. Şimdi programı çalıştırırsanız aynı ekran görüntüsüne ulaşırsınız. Yukarıdaki satırları girdikten sonra formunuza ait görüntü aşağıdaki şekilde gerçekleşecektir. //Oluştur begin TabControl1.Add('Şifre'). TabControl1.3. TabControl1. end.Tabs. 483 .Add('Kişisel Bilgiler').

TabControl1Changing(Sender: TObject.Clear Tüm yaprakları silmek için kullanılan methoddur.TabControl1Changing(Sender: TObject. begin TabControl1. Aşağıdaki örnekte ilk yaprak ile ikinci yaprağın yerleri değiştirilmektedir.Exchange İki yaprağın yerini değiştirmek için kullanılan methoddur. procedure TForm1.Tabs.Add Kontrole yeni bir yaprak eklemek için kullanılan methoddur.Tabs.//ilk yaprağı sil end.Tabs.Tabs.Delete Parametre ile belirtilen index numaralı yaprağı silmek için kullanılan methoddur.1).//Tüm yaprakları sil end.Tabs. procedure TForm1. 484 . begin TabControl1.TabControl1Changing(Sender: TObject. • TabControl1. Aşağıda bu husus örneklendirilmiştir.Tabs.Tabs.Clear.Delete(0).//Ekle end. • TabControl1. • TabControl1.Exchange(0. var AllowChange: Boolean). var AllowChange: Boolean). İlk yaprağın index numarası “0” dır hatırlatalım. begin TabControl1. procedure TForm1.Add('Şifre').FormCreate(Sender: TObject).• TabControl1. var AllowChange: Boolean).//iki yaprağın yerlerini değiştir end.Tabs. procedure TForm1. begin TabControl1.

procedure TForm1. Kodla yaprak eklediğiniz için üzerine yerleştireceğiniz kontrolleride kodla belirlemek zorunda kalacaksınız (daha sonra kodla kontrol oluşturma konusuna değinilecektir).Insert(1.IndexOf('Genel Bilgiler'). 485 .IndexOf Parametre ile belirtilen yaprağın bulunduğu sıra numarasını veren methoddur. Programı çalıştırdıktan sonra herhangi bir yaprağın başlığına tıklarsanız (kodun işlemesi için) dördüncü yaprağınızın forma eklendiğini göreceksiniz. Birinci parametreyle belirleyeceğiniz index numaralı yere yeni yaprağı ekleyecektir.Tabs.• TabControl1.'Yeni Yaprak'). “Add” den farkı araya eklemeninde yapılabileceğidir.Tabs. begin TabControl1. İlk yaprağın numarası “0” dır. sıraya ekle end.Tabs.//sıra numarasını yaz end.TabControl1Changing(Sender: TObject. Eklendiği yeride sizin belirlediğiniz sanıyorum dikkatinizi çekmiştir.Caption:=IntToStr(sayi). var AllowChange: Boolean). var AllowChange: Boolean).Insert Kontrole yeni yaprak eklemek için kullanılan methoddur. var sayi:Integer.//2.TabControl1Changing(Sender: TObject. Form1.Tabs. begin sayi:=TabControl1. procedure TForm1. • TabControl1.

486 . yaprakların sıralamasının “ImageList” kontrolündeki sıralamayla aynı olacağıdır. • TabControl1. TabControl1. begin TabControl1. • TabControl1.//resimleri imagelist1 den al TabControl1.Tabs.Add('Şifre').Images:=ImageList1.Tabs.Move(0.FormCreate(Sender: TObject).Tabs. end. begin TabControl1.1).Tabs. Burada dikkat edeceğiniz husus. TabControl1.Add('Kişisel Bilgiler').Images “TabControl” kontrolünde yapraklarda resim göstermek için kullanılan özelliğidir.Style Başlıkların gösterim şeklini belirleyen özelliğidir.TabControl1Changing(Sender: TObject. Aşağıdaki kodu ekleyeceğiniz button kontrolünün “OnClick” yordamına da yazabilirsiniz. end. procedure TForm1. Alabileceği tüm değerler aşağıdaki tabloda verilmiştir.Add('Genel Bilgiler').Move Birinci parametreyle belirtilen yaprağı ikinci parametre ile belirtilen yere taşır.• TabControl1. procedure TForm1.Tabs. Vereceğiniz değer ile button gibi tıklanmasını sağlayabilirsiniz. var AllowChange: Boolean).

• TabControl1.MultiSelect:=true.MultiLine Yaprakların tek satıra sığmaması durumunda alt satıra inip inmemeyi belirleyen özelliğidir.MultiLine:=false.Style tsTabs tsButtons tsFlatButtons Varsayılan değer Sonuç Başlık Button şeklini alır Başlık düz Button şeklini alır procedure TForm1.FormCreate(Sender: TObject). end.FormCreate(Sender: TObject).MultiSelect “True” değeri verilmesi durumunda aynı anda iki yaprak seçilebilir. begin TabControl1. end. 487 . “True” değeri aktarılırsa alt satıra inecektir. Yukarıdaki örnekte sol taraftaki kontrolde “MultiLine” özelliği “true” sağ taraftakinde ise “false” verilmiştir. begin TabControl1. end. procedure TForm1.Style:=tsButtons.FormCreate(Sender: TObject). procedure TForm1. • TabControl1. begin TabControl1.

//3.Tabs. begin TabControl1.Add('Kişisel Bilgiler'). TabControl1. TabControl1.TabIndex:=2.Tabs. yaprağı aktif yap yani “Kişisel Bilgiler” yaprağı end.Add('Şifre'). TabControl1. TabControl1. 488 .Tabs. procedure TForm1.TabIndex Seçili yaprağın index numarasını öğrenmek veya yeni bir yaprağı aktif hale getirmek için kullanılan özelliğidir.FormCreate(Sender: TObject).Add('Genel Bilgiler').• TabControl1.Images:=ImageList1.

489 .//tarihi yaz end. • DateTimePicker1.Time). • DateTimePicker1. çalışma zamanında içerisinden gerekli tarihi seçmenize imkan sağlayan kullanışlı ve estetik bir kontroldür. procedure TForm1.Caption:=DateToStr(DateTimePicker1. begin Form1.Date). begin Form1.Date Kontrolün gösterdiği değer bu özellikte tutulur.DateTimePicker Kontrolü: Görüntüsel olarak ComboBox kontrolüne benzeyen.//zamanı göster end.Button1Click(Sender: TObject). Yazdırmak için DateToStr tip dönüştürme fonksiyonundan faydalanmalısınız.Time Kontrolün gösterdiği aktif zaman değeri bu özellikle öğrenilebilir.DateFormat Tarihin gösterim biçimini belirleyen özelliğidir. Aşağıda alabileceği seçenekler verilmiştir.Button1Click(Sender: TObject). Kısa formatlı veya uzun formatlı tarih seçeneğini bu özellik belirler. • DateTimePicker2. procedure TForm1.Caption:=TimeToStr(DateTimePicker1.Sadece DateTime tipli bir değişkene aktarılabilir.

begin DateTimePicker1.ShowCheckbox:=true. procedure TForm1.DateFormat dfLong dfShort Uzun tarih formatı Kısa Tarih Formatı Sonuç procedure TForm1.//uzun format DateTimePicker2.//kısa format end.FormCreate(Sender: TObject). True değeri aktarılırsa işaret gözükecektir.FormCreate(Sender: TObject). begin DateTimePicker1. • DateTimePicker1. 490 .DateFormat:=dfLong.DateFormat:=dfShort. end.ShowCheckbox Kontrolün gösteriminde check işaretinin olup olmamasını belirleyen özelliğidir.

DateMode Kontrolün ComboBox şeklinde mi yoksa açılamayan değiştirilebilen bir şekilde görünmesini sağlayan özelliğidir. Kind dtkTime dtkDate Zamanı Göster Tarihi Göster Sonuç 491 . Alabileceği değerler aşağıda verilmiştir. • DateTimePicker1.Kind Tarihi veya zamanı göstermesini sağlayan özelliğidir.FormCreate(Sender: TObject). begin DateTimePicker1. end.MaxDate-MinDate Kontrolün gösterebileceği minimum ve maximum tarih değerlerini belirleyen iki özelliğidir.DateMode:= dmUpDown.• DateTimePicker1. DateMode dmUpDown dmComboBox Açılamaz Açılabilir Sonuç sadece değeri procedure TForm1. • DateTimePicker1.

WeekNumbers Takvimin sol kısmında yılın kaçıncı haftasında bulunulduğunu gösteren sütunun gösterilip gösterilmemesini belirleyen özelliğidir. 492 .MonthCalendar Kontrolü: Programlarınızda takvim amaçlı kullanabileceğiniz bir kontroldür. • MonthCalendar1. begin MonthCalendar1.WeekNumbers:=true. procedure TForm2. end. Aşağıda sırasıyla en genel özellikleri verilmiştir. Ekrana dikkat edecek olursanız kontrolün ilk sütununda yılın kaçıncı haftasında bulunulduğu gösterilmektedir.FormCreate(Sender: TObject).

CalColors.ShowToday O güne ait tarihin gösterilip gösterilmeyeceğini belirleyen özelliğidir. True değerinin aktarılması tarihin gösterileceği anlamını taşımaktadır. end. begin MonthCalendar1.TitleTextColor Takvime ait başlığın yazi tipi rengini belirleyen özelliğidir.FormCreate(Sender: TObject).CalColors.TitleTextColor:=clWindow. 493 . • MonthCalendar1. procedure TForm2. end.TitleBackColor Takvime ait başlığın zemin rengini belirleyen özelliğidir.CalColors. end.TitleBackColor:=clRed.FormCreate(Sender: TObject). procedure TForm2. procedure TForm2.FormCreate(Sender: TObject).ShowToday:=false.CalColors. • MonthCalendar1. begin MonthCalendar1. Aşağıdaki örnekte sol taraftaki kontrolde bu özellik false yapılmıştır.• MonthCalendar1. begin MonthCalendar1.

FormCreate(Sender: TObject).FormCreate(Sender: TObject).FormCreate(Sender: TObject).MultiSelect:=true. begin Form2. 494 .//birden fazla satır seç end. begin MonthCalendar1. begin MonthCalendar1.Date Kontrolün gösterdiği tarih değeri bu özellikle öğrenilebilir. procedure TForm2.//aktif tarihi yaz end.MultiSelect Takvimden birden fazla tarih seçilebilmesini sağlayan özelliğidir.Date).• MonthCalendar1.ShowTodayCircle:=false. procedure TForm2.Caption:=DateToStr(MonthCalendar1. procedure TForm2. end.ShowTodayCircle Aktif günün yuvarlak içerisine alınıp alınmayacağını belirleyen özelliktir. • MonthCalendar1. • MonthCalendar1. “True” değeri aktarılırsa birden fazla tarih seçilebilir (shift tuşuyla).

begin ScrollBar1. değiştirilebilir. end. procedure TForm1. procedure TForm1. begin ScrollBar1.ScrollBar Kontrolü: Kaydırma çubuğu kullanmanız gereken durumlarda projenize eklemeniz gereken bir kontroldür. end. Aşağıda kendisine has olan özellikleri sıralanmıştır.FormCreate(Sender: TObject).Position Kontrolün gösterdiği değer bu özellikle öğrenilip. Kontrole ait “position” değeri maximum değer ile minimum değer arasında sayısal bir ifade olabilir. procedure TForm1.//en küçük değeri ScrollBar1.//en büyük değer ScrollBar1.Min Kontrolün alabileceği minimum değeri tutan özelliğidir. • ScrollBar1.FormCreate(Sender: TObject).Position:=50.Min:=0. Daha büyük bir değer aktarılmaya çalışılırsa hata oluşacaktır. • ScrollBar1. begin ScrollBar1.Max:=100.Position:=50.Min:=0.Max Kontrolün alabileceği maximum değeri tutan özelliğidir. end. Minimum ile Maximum arasında bir değer alabilir. Kodla daha küçük bir değer girilmeye çalışılırsa hata oluşturacaktır. ScrollBar1.FormCreate(Sender: TObject). 495 .Position:=50. • ScrollBar1.

Alabileceği değerler aşağıda verilmiştir. procedure TForm1.SmallChange:=5. • ScrollBar1.Min:=0. • ScrollBar1.Kind Kontrolün formun üzerinde yatay veya dikey durmasını sağlayan özelliğidir. begin ScrollBar1. end. ScrollBar1. ScrollBar1.LargeChange:=10. ScrollBar1.Max:=100. Genellikle “SmallChange” değerinden daha yüksek bir değer girilir. ScrollBar1. begin ScrollBar1.FormCreate(Sender: TObject).• ScrollBar1.Position:=50.FormCreate(Sender: TObject).LargeChange Bu özellikle oklara değil de araya bir noktaya tıklanılması durumunda değerin değişim miktarını belirleyebilirsiniz.SmallChange:=5. procedure TForm1.LargeChange:=10.FormCreate(Sender: TObject). 496 .SmallChange Kontrolün sol veya sağıdaki oka tıklanılması durumunda ne kadarlık bir değişim göstereceği bu özellikle belirlenir. Kind sbVertical sbHorizontal Dikey Yatay Sonuç procedure TForm1. end. begin ScrollBar1.//her tıklamada 5 birim değiş end.Kind:=sbVertical. ScrollBar1.

ScrollBar1. ScrollBar1. end.Position. ScrollBar1. ScrollCode: TScrollCode.Min:=8.Size:=boyut. end. begin boyut:=ScrollBar1. Artık programınızı çalıştırıp kaydırma çubuğunun değerini değiştirebilirsiniz.LargeChange:=4.Font. begin ScrollBar1. Program için aşağıdaki kod bloğunu Unit penceresine ekleyiniz. Memo1. procedure TForm1. ScrollBar1. procedure TForm1.Max:=72. ScrollBar1.var ScrollPos: Integer).Kind:=sbHorizontal.Position:=0. 497 .Şimdi yukarıda anlatılan tüm özellikleri kullanabileceğimiz bir örnek yapalım. var boyut:Integer. Örneğimiz için formunuzun üzerine bir adet Memo kontrolü ile yine bir adet ScrollBar kontrolü yerleştirip aşağıdaki tasarım görüntüsünü oluşturunuz.FormCreate(Sender: TObject).SmallChange:=2.ScrollBar1Scroll(Sender: TObject. Memo kontrolü içerisindeki yazı tipi boyutunun da aynı şekilde değiştiğini göreceksiniz.

Bu adımda “ListView2” kontrolünün “Columns” özelliğine tıklayıp aşağıdaki sütunları oluşturun. 498 . Bazı durumlarda gerçekten çok kullanışlı bir hal alabilmektedir. Ardından formunuza bir adet “Splitter” kontrolü yerleştirin. ListView kontrolünün “Items” özelliğine tıklayarak aşağıdaki etiketleri ekleyiniz (ImageIndex değerlerini vermeyi unutmayın).ListView kontrolünün “LargeImages” özelliğine ImageList1 değerini girin. Daha sonra formunuza iki adet ImageList kontrolü yerleştirip gerekli resimleri yükleyin.Splitter Kontrolü: Kullanıcı tarafından formun üzerindeki kontrollerin boyutlarını değiştirebilmek için kullanılan bir kontroldür. Birinci adımda formunuzun üzerine bir adet ListView kontrolü yerleştirip “Align” özelliğine “alLeft” değerini aktarın. Fazla bir özelliği olmadığı için görevini bir örnekle izah edelim. Şimdi ikinci “ListView” kontrolünü yerleştirip “Align” özelliğine “alClient” değerini girin. Sonrada “ViewStyle” özelliğine “vsReport” seçeneğini aktarın. “Align” özelliğinin “alLeft” olmasına dikkat edin.

Width “Splitter” kontrolünün kalınlığını belirleyen özelliğidir. Şimdi “Splitter” kontrolünü mous ile yakalayıp sola veya sağa doğru sürükleyiniz. 499 . begin Splitter1. Sağ ve solundaki kontrollerin boyutlarının değiştiğini göreceksiniz. end.Width:=2. • Splitter1.Artık programınızı çalıştırabilirsiniz. procedure TForm1. Uygulamanızı çalıştırdıktan sonraki görüntüsü aşağıda verilmiştir. Kodla veya properties penceresinden kolayca değiştirilebilir.FormCreate(Sender: TObject).

AlignButton:=udLeft. procedure TForm1.Associate Değerini değiştireceğiniz kontrolü gösterebileceğiniz bir özelliğidir. Bu işlemden sonra programınızı çalıştırırsanız “UpDown” kontrolü Edit kutusunun soluna aşağıdaki şekilde yerleşecektir. • UpDown1. UpDown1. Ayrıca Edit kontrolünün içeriği “UpDown” kontrolünün “positon” değerini gösterecektir.FormCreate(Sender: TObject).Associate:=Edit1. Alabileceği seçenekler aşağıda verilmiştir.FormCreate(Sender: TObject). 500 .UpDown Kontrolü: Bu kontrol sayesinde nümeric değerler içeren kontrollerin (veya değişkenlerin) içerikleri kolayca değiştirilebilir. Aşağıda özellikleri sıralanmaktadır.Associate:=Edit1. Properties penceresinden ayarlanabileceği gibi kodla da aşağıdaki şekilde ayarlanabilir. end. begin UpDown1. AlignButton udLeft udRight Kontrolün solunda Kontrolün sağında Sonuç procedure TForm1. end.AlignButton “Associate” özelliğiyle gösterilen kontrolün solundamı yoksa sağındamı gösterileceğini belirleyen özelliğidir. begin UpDown1. • UpDown1.

Max “Associate” özelliğiyle gösterilen kontrolün alabileceği maximum değeri tutan özelliğidir.Position:10. • UpDown1.FormCreate(Sender: TObject). UpDown1. procedure TForm1. UpDown1.Min “Associate” özelliğiyle gösterilen kontrolün alabileceği minimum değeri tutan özelliğidir. 501 .Increment:=2.Min:=8.FormCreate(Sender: TObject).Max:=72.Position “Associate” özelliğiyle gösterilen kontrolün içeriğinde gösterilecek olan değer bu özellikte tutulur.Associate:=Edit1. end. UpDown1. procedure TForm1. begin UpDown1.Increment UpDown’ daki oklara tıklanılması durumunda kontroldeki değerin ne kadar değişeceğini belirleyen özelliğidir. end. • UpDown1. begin UpDown1.• UpDown1. • UpDown1.AlignButton:=udLeft. UpDown1.

Max:=150.Text:='450' 502 . UpDown1.Items. Çalıştırdıktan sonra Hızı artırıp azaltın “Variş” süreniz her defasında yeniden hesaplanacaktır.Items. ComboBox1.Add('ISTANBUL-RİZE').ReadOnly:=true. UpDown1.Text='ISTANBUL-ANKARA' Then Edit1.Add('ISTANBUL-ANKARA'). UpDown1. bir adet ComboBox ve 4 adet Label kontrolü yerleştirip aşağıdaki tasarımı oluşturunuz. begin if ComboBox1.ComboBox1Change(Sender: TObject). end. procedure TForm1.//5 şer 5 er art Edit1.Text:='450'.bir adet UpDown.Increment:=5.FormCreate(Sender: TObject). ComboBox1.Associate:=Edit2.//klavteden girişi engelle ComboBox1. UpDown1.Min:=10. ComboBox1. begin UpDown1. ComboBox1.Add('ISTANBUL-BODRUM').Add('ISTANBUL-SAMSUN'). Aşağıdaki kodlarıda Unit pencerenize ekleyip programınızı çalıştırabilirsiniz.Items. Örneğimiz için formunuzun üzerine üç adet Edit. ComboBox1.Items.ItemIndex:=0. procedure TForm1.Add('ISTANBUL-BURSA').Items.Şimdi bütün bu özellikleri kullanabileceğimiz güzel bir örnek yapalım.//ilk elemanı göster Edit1.AlignButton:=udRight.

Text='ISTANBUL-BURSA' Then Edit1.Text:='1050' else if ComboBox1.Text='ISTANBUL-RİZE' Then Edit1.Text:='300'.Text:=FloatToStr(sonuc). end. sonuc:=mesafe/sure .else if ComboBox1. var mesafe.Text='ISTANBUL-SAMSUN' Then Edit1.Text). end. Button: 503 .Text:='700' else if ComboBox1. Edit3. sonuc:Double.Text:='650' else if ComboBox1.Text='ISTANBUL-BODRUM' Then Edit1.sure:Integer. begin mesafe:=StrToInt(Edit1.Text). procedure TForm1.UpDown1Click(Sender: TObject. sure:=StrToInt(Edit2. TUDBtnType).

Min:=0. Aşağıda alabileceği tüm seçenekler tablo halinde verilmiştir. begin TrackBar1. 504 .FormCreate(Sender: TObject).TrackBar Kontrolü: Grafiksel işlemlerde kullanılan kontroldür. begin Form1. TrackBar1. procedure TForm1. end. Aşağıda kontrole ait özellikler verilmiştir.Max . • TrackBar1. Girilen bu değer aralığı dışında sayısal ifade aktarılamaz.Caption:=IntToStr( TrackBar1. Windows’ta bir çok yerde bu kontrolü kullanmaktadır.Position) end.FormCreate(Sender: TObject).Max:=100. • TrackBar1.Position Kontroldeki kaydırma paletinin gösterdiği değer bu özellikte tutulur. procedure TForm1. Mesela ekran çözünürlüğü ayarlarının yapıldığı pencerede bulabilirsiniz.TickMarks Palete şeklini belirleyen özelliğidir. • TrackBar1.Min Kontrolün alabileceği minimum ve maximum değerleri belirleyen özellikleridir.TrackBar1.

TickStyle tsAuto tsManual tsNone Varsayılan değer Sadece başlangıç ve bitişte Çizgi Yok Sonuç Yukarıdaki ekran görüntüsünü oluşturmayı sağlayan kod bloğu aşağıda verilmiştir.TickStyle Kontroldeki değer çizgilerinin durumunu belirleyen özelliğidir.TickMarks tmTopLeft tmBoth tmBottomRight Ok yok Sonuç Kaydırma ok yönü yukarı Kaydırma ok yönü aşağı procedure TForm1. TrackBar2. TrackBar3.TickMarks:=tmBottomRight.TickMarks:=tmBoth. Aşağıda alabileceği tüm seçenekler verilmiştir. 505 .TickMarks:=tmTopLeft. • TrackBar1. end.FormCreate(Sender: TObject). begin TrackBar1.

TrackBar2.FormCreate(Sender: TObject).Orientation:=trVertical.TickStyle:=tsManual. end. Orientation trHorizontal trVertical Yatay Dikey Sonuç procedure TForm1. begin TrackBar1.procedure TForm1.Orientation:= trHorizontal.TickStyle:=tsAuto. TrackBar3. TrackBar3. TrackBar2.Frequency:=3.Orientation Kontrolün yatay veya dikey konumunu belirleyen özelliğidir. begin TrackBar1. 506 . • TrackBar1. • TrackBar1.Frequency Gözükecek olan çizgi sayısını belirleyen özelliğidir. end. begin TrackBar1.Orientation:= trHorizontal. Aşağıda alabileceği seçenekler verilmiştir. end. procedure TForm1.FormCreate(Sender: TObject).FormCreate(Sender: TObject).TickStyle:=tsNone.

Step:=2.Max:=100. begin ProgressBar1.Position Kontrolün içerisindeki renkli kısmın gösterdiği değeri tutan özelliğidir. 507 . Aşağıda kontrole ait özellikler verilmektedir. dosyanın durumu hakkında kullanıcıyı bilgilendiren bir kontroldür. begin Form1.Step:=2” satırının yaptığı işi değer belirtmeden yapabilen özelliğidir. begin ProgressBar1. procedure TForm1.Caption:=IntToStr(ProgressBar1.Min. ProgressBar1.StepIt “ProgresBar1.FormCreate(Sender: TObject). procedure TForm1. • ProgressBar1.Position). • ProgressBar1. ProgressBar1. procedure TForm1.Min:=0.Max “Position” değerinin alt ve üst sınırlarını belirleyen özelliğidir.FormCreate(Sender: TObject). ProgressBar1. end. • ProgressBar1. • ProgressBar1.ProgressBar Kontrolü: Özellikle dosya indirme veya kopyalama işlemlerinde çok kullanılan.FormCreate(Sender: TObject).Step Renkli alanın kaçar kaçarlık dilimler halinde artacağını belirleyen özelliğidir.Min:=0.ProgressBar1. end.Max:=100.//ikişer ikişer art end.

ProgressBar1. Timer1. begin ProgressBar1.Enabled:=false.Position<=1 Then begin i:=0.//diğer tarafa dön 508 .Timer1Timer(Sender: TObject).//diğer tarafa dön end else begin ProgressBar1. procedure TForm1.//5 artır end. Örneğimiz için formunuza bir adet “Timer”.//Global olduğu için ilk değer verilebilir procedure TForm1. end.Position>=100 Then begin i:=1.Max:=100. bir adet “ProgressBar”.Step:=2.FormCreate(Sender: TObject). Timer1.Interval:=50.Position+5. ProgressBar1.Position:=ProgressBar1. var i:Integer=0. begin if i=0 Then begin if ProgressBar1.Şimdi yukarıdaki özellikleri içerisinde kullanabileceğimiz bir örnek yaparak kontrolü daha iyi tanımaya çalışalim. bir adet Label ve iki adet “Button” kontrolü yerleştirin.Min:=1. end else begin if ProgressBar1.

Enabled:=true.Enabled:=false. 509 .Caption:='% '+FloatToStr(ProgressBar1.Position*100/ProgressBar1. procedure TForm1.//Çalıştır end.Position:=ProgressBar1. begin Timer1. end.//Durdur end. end.//5 azalt end.Button1Click(Sender: TObject).Position-5. Label1.end else begin ProgressBar1. procedure TForm1.Button2Click(Sender: TObject). begin Timer1.Max) + ' sı Tamamlandı'.

Hatırlatalım buttonlara eklemiş olduğunuz “Caption” değerlerinin gözükebilmesi için “ShowCaption” seçeneğinin true yapılması gerekmektedir. Ardından formunuza bir adet “ToolBar” kontrolü yerleştirip “Images” özelliğine “ImageList1” değerini aktarın. Aralarda verilecek olan boşluklar için açılan menüden “New Seperator” seçeneğini kullanabilirsiniz. Tüm buttonların “Caption-ImageIndexHint-ShowHint-Style-ShowCaption” özelliklerini teker teker ayarlayın. Seçip properties penceresinden özelliklerini belirleyebilirsiniz. Aksi takdirde “Caption” ları doldursanız bile etiketler gözükmeyecektir. Formunuza ilk olarak bir adet “ImageList” kontrolü yerleştirip gerekli resimleri depolayın. Açılan menüden “New Button” seçeneğini seçin.ToolBar Kontrolü: Araç çubuğu oluşturmak için kullanılan. çok kullanışlı ve estetik bir kontroldür. “ShowCaption” özelliğini true taptıktan sonraki ekran görüntüsü aşağıda verilmiştir. İçerisine yerleştireceğiniz düğmeler sayesinde bir çok olayı tek bir yerden yönetme şansına sahip olabilirsiniz. Bu işlemi ekleyeceğiniz düğme sayısı kadar tekrarlamalısınız. Eklediğiniz tüm buttonlar bağımsızdır. Kodla nasıl müdahale edebileceğiniz daha sonra gösterilecektir. Üçüncü adımda “ToolBar1” kontrolünü seçip mousun sağ tuşuna tıklayın. 510 . Aynı ayarları sizde örneğiniz için yapın. Aşağıda araç çubuğu oluşturmak için izlemeniz gereken adımlar verilmiştir. Fakat bazı büyük uygulamalarda kodla müdahale etmeniz gerekebilir. Genellikle properties penceresinden ayarlamalar yapmak yeterli olacaktır. “Caption” lara gerekli metinleri girip.

Ardından “ToolBar” kontrolünü ekleyip aşağıdaki kodu da “Unit” pencerenize ekleyin. Örnekte üç adet button eklenmiş olup sayısı istediğiniz kadar artırılabilir. Ekran görüntünüz aşağıdaki şekilde değişecektir.Bu adımda tüm buttonları teker teker seçerek “ImageIndex” değerlerini belirleyin. 511 . Formunuza “ImageList” kontrolünü yerleştirip gerekli resimleri depolayın. Yukarıdaki ekran görüntüsünü sağlamak için formunuza eklemeniz gereken kod bloğu aşağıda verilmiştir. Burada “ToolButton” kontrollerini kodla yaratmanız gerektiği sanıyorum dikkatinizi çekmiştir. Şimdide properties penceresinden yapılan işlemi kod penceresinden nasıl yapabileceğinizi göstermek istiyorum.

ImageIndex:=1.procedure TForm2.Caption Bu özellik sayesinde araç çubuğunuzun istediğiniz buttonuna erişip etiket değerini değiştirebilirsiniz.Create(ToolBar1).Create(ToolBar1). yeni.Caption:='Kopyala'. //ilk Button yeni:=TToolButton. yeni.ImageIndex:=2. end. //üçüncü button yeni:=TToolButton. var yeni:TToolButton.Parent:=ToolBar1. yeni. ToolBar1.Parent:=ToolBar1. begin ToolBar1.ImageIndex:=0.FormCreate(Sender: TObject). //ikinci button yeni:=TToolButton. yeni.Caption:='Kes'. Parametre olarak girilen index değeri buttonun ToolBar içerisindeki sırasını belli etmektedir. Kodla Button Kontrollerine Erişmek: • ToolBar1. 512 . yeni.ShowCaptions:=true. ToolBar1. yeni.Images:=ImageList1.Buttons[].Parent:=ToolBar1.//yarat yeni. Yukarıdaki etkiyi sağlayan kod parçası aşağıda verilmiştir.AutoSize:=true.Caption:='Yapıştır'.Create(ToolBar1). Yapılan değişiklik sadece index numarası belirtilen düğme için etkili olmaktadır. yeni. yeni.

ShowHint:=true.Button1Click(Sender: TObject). açıklama balonunuz açılacak kullanıcıyı bilgilendirecektir. begin ToolBar1. İsterseniz diğer buttonlar içinde index numarasını belirterek aynı işlemi yapabilirsiniz.Caption:='Yeni Değer'.Hint:='Veriyi Kesip Alır'.Buttons[0].Button1Click(Sender: TObject). • ToolBar1. begin ToolBar1.procedure TForm2.ToolBar1. begin ToolBar1.Buttons[0].ImageIndex Parametre ile belirtilen buttonun göstereceği resim bu özellikle belirlenir.Button1Click(Sender: TObject).Buttons[0].ShowHint Mousun button üzerinde bekletilmesi durumunda açıklama balonunun içeriğini belirleyen özelliğidir. end.ImageIndex:=2.Buttons[0]. • ToolBar1.Hint. ToolBar1. procedure TForm2. Programı çalıştırıp mousu ilk buttonun üzerine götürürseniz.Buttons[]. end. 513 . procedure TForm2. end.

yani tek düğmeyle birden fazla iş yapmak isterseniz. Araya Boşluk Oluşturur.Style:=tbsCheck.Style:=tbsCheck. end.//Basılı kalabilir ToolBar1. Sınır Halini Alır Açılabilir Button Oluşturur. begin ToolBar1.Style:=tbsCheck.Buttons[6].FormCreate(Sender: TObject). procedure TForm1.Basılı Kalabilen Button Oluşturmak: Araç çubuğunuzda basılı kalabilen düğme oluşturmak için “Style” özelliğinden faydalanılır. • ToolBar1.Buttons[4]. ToolBar1. araç çubuğunuza açılabilir bir button eklemelisiniz. 514 . Basılı kalabilen button Oluşturur. Alabileceği seçenekler aşağıda verilmiştir.Style Araç çubuğundaki buttonların davranışını (basılı kalabilen-açılabilen vs) belirleyen özelliğidir. Şayet “Style” değerine “tbsDropDown” değerini aktarırsanız program bu işi otomatik olarak gerçekleştirecektir. Bu işlem için yine “Style” özelliğinden faydalanılır. Style tbsButton tbsCheck tbsDivider tbsDropDown tbsSeparator Sonuç Standart Button gibi davranır.Buttons[].Buttons[5]. Açılabilir Button Oluşturmak Bir düğmenin alt seçenekleri olacaksa.

Açılan menüde gösterilecek seçenekleri belirlemek için formunuza bir adet “PopupMenu” ekleyin.FormCreate(Sender: TObject). Artık programınızı çalıştırabilirsiniz. end. Şimdi adımlarını teker teker izah edelim. begin ToolBar1. Üçüncü adımda araç çubuğunda yer alan “Kes” isimli buttonu mous ile seçin.Aşağıdaki örnekte “Kes” isimi düğmeye alt seçenekler eklenmektedir. procedure TForm1. 515 .Buttons[0].DropdownMenu:=PopupMenu1. Açılan pencerede aşağıdaki gibi iki satırlı bir menü oluşturun. ToolBar1.Style:=tbsDropDown. PopupMenu” üzerine mous ile çift tıklayın. “DropDownMenu” özelliği verdiğiniz buttonun sağ tarafında aşağıya doğru bir okun belirmiş olması gerekir. Properties penceresinden “DropDownMenu” özelliğine “PopupMenu1” değerini girin.Buttons[0]. Bu oka tıklarsanız seçenekleri aşağıya doğru açılacaktır.

Style:=tbsCheck. ToolBar1. Bu tür buttonlar için “Grouped” özelliğinden faydalanılır. begin ToolBar1. begin ToolBar1.DropdownMenu:=PopupMenu1. Bu özelliğe aktarılan nesne “PopupMenu” kontrolü olmalıdır.Style:=tbsDropDown. end. programı çalıştırdıktan sonra son üç buttondan aynı anda ikisini basılı hale getiremiyeceksiniz. Grup Halinde Çalışan Buttonlar Oluşturmak: Bazı durumlarda buttona tıkladığınız zaman basılı olan diğer buttonun bu özelliğini yitirmesini isteyebilirsiniz. end.Buttons[8]. Varsayılan değeri false dır.DropdownMenu Açılabilir menü özelliği verilen buttonların alt seçeneklerini belirleyebileceğiniz özelliğidir.Buttons[0].Buttons[9]. ToolBar1. procedure TForm1.Grouped:=true. ToolBar1.Grouped:=true.Buttons[0].Indeterminate Buttona ilk kez tıklanana kadar pasif gibi gösterilmesini sağlayan özelliğidir.FormCreate(Sender: TObject).• ToolBar1.Buttons[10].Buttons[9]. ToolBar1. procedure TForm1. ToolBar1. • ToolBar1. 516 .Buttons[10].Style:=tbsCheck.Buttons[].FormCreate(Sender: TObject).Style:=tbsCheck.Buttons[8].Grouped:=true.Buttons[0]. ToolBar1.

end. Şayet true değeri aktarılırsa resimler etiketin solunda yer alacaktır. • ToolBar1.ButtonCount ToolBar kontrolünde bulunan buttonların sayısını veren özelliğidir. end. end.HotImages Cursor buttonların üzerlerine geldikleri anda başka resimlerin gözükmesini isterseniz bu özellikten faydalanmalısınız.List Buttonlardaki resimlerle yazıların yerini ayarlayan özelliğidir. • ToolBar1. begin ToolBar1.FormCreate(Sender: TObject).Indeterminate:=true. • ToolBar1. begin ToolBar1.HotImages:=ImageList2. 517 .Buttons[0]. begin ToolBar1.FormCreate(Sender: TObject). procedure TForm1.List:=true. Varsayılan değeri “false” dır ve bu durumda resimler yazının üstünde yer alır.FormCreate(Sender: TObject). procedure TForm1.procedure TForm1. Sonuca seperator lerde dahil edilmiştir.

FormCreate(Sender: TObject).Flat Buttonların kontrol içerisindeki görüntüsünü ayarlayan özelliğidir. 518 . Şayet true değeri aktarılırsa düz bir görüntü elde edersiniz.procedure TForm1.List:=true. begin ToolBar1. end. • ToolBar1. Programı çalıştırdıktan sonra mousu buttonların üzerine götürdüğünüz zaman hafif bir kabarıklık söz konusu olacaktır.

Width Belirtilen panelin uzunluğunu belirleyen özelliğidir. Bu yöntemle dilediğiniz kadar paneli kontrolünüze ekleyebilirsiniz.FormCreate(Sender: TObject).FormCreate(Sender: TObject).Panels. • StatusBar1.Add.Panels. 519 . StatusBar1. begin StatusBar1. • StatusBar1.Panels. procedure TForm1.Panels[]. procedure TForm1. begin StatusBar1. Aşağıda özellikleri sırasıyla listelenmektedir.Text Eklenen panelin etiket değerini belirlemek için kullanılan özelliğidir. • StatusBar1.Add. end. Son kalan panel geriye kalan miktarı alacaktır.Text:='Prestige Education Center'.//ekle end.Panels[].StatusBar Kontrolü: Pencerenizin en altında yer alan. kullanıcıyı yönlendirmek veya bilgilendirmek amaçlı kullanılan bir kontroldür.Add StatusBara panel eklemek için kullanılan methoddur.Panels[0].

StatusBar1. Alabileceği seçenekler aşağıda verilmiştir.FormCreate(Sender: TObject). end.Text:='Gazi Üniversitesi'.Add.Style:=psOwnerDraw. StatusBar1. Alabileceği seçenekler aşağıda verilmiştir Alignment taRightJustify taLeftJustify taCenter Sağa Dayalı Sola Dayalı Ortada Sonuç • StatusBar1.Style Panellerin resim veya etiket olarak kullanılmasını sağlayan özelliğidir. 520 .Panels[0].Alignment Panel içerisindeki yazının yerini ayarlayan özelliğidir. begin StatusBar1. begin StatusBar1.Panels.Panels[0].//ikinci paneli ekle StatusBar1. Style psOwnerDraw psText Resim içerikli Panel Text İçerikli Panel Sonuç procedure TForm1.Panels[].Panels. StatusBar1.Panels[0]. • StatusBar1.add.procedure TForm1.FormCreate(Sender: TObject).Width:=175. end.Panels[1].Panels[].Text:='Prestige Education Center'.

Alabileceği seçenekler aşağıda verilmiştir. StatusBar1. StatusBar1.Panels.Panels[2].Bevel:=pbLowered. • StatusBar1.Bevel:=pbRaised.Free Parametre ile belirtilen paneli silmek için kullanılan methoddur. end.Text:='Prestige Education Center'.FormCreate(Sender: TObject). StatusBar1.• StatusBar1.Panels.Bevel:=pbNone.Panels[0].Panels[0]. StatusBar1.Panels[].add.add. StatusBar1. StatusBar1.Panels[1].Text:='Eğitim Seçenekleri'.Alignment:=taRightJustify.Panels[1].Panels. StatusBar1. //StatusBar begin StatusBar1. StatusBar1. StatusBar1.Width:=175. Bevel pbNone pbLowered pbRaised Düz Basık Şişik Sonuç procedure TForm1. 521 . StatusBar1. Silinen panel bir daha geri alınamaz sadece yenisi yaratılabilir.Width:=175. StatusBar1.Panels[0].Text:='Gazi Üniversitesi'.Panels[1].Panels[2].Add.Panels[1].Bevel Panellerin üç boyutlu görünümlerini ayarlayan özelliğidir.Panels[0].

522 . Buradaki panel sayısı size kalmıştır. Uygulamada. Görüldüğü gibi hiç kod kullanmadan kolayca StatusBar a panel eklenebilir. Programınızı çalıştırırsanız ekran görüntünüz aşağıdaki şekilde oluşacaktır. Açılan pencerede mousun sağ tuşuna tıklayıp.//ilk paneli sil end.FormCreate(Sender: TObject).Panels[0]. paneller oluşturulduktan sonra forma eklenen bir adet “Timer” kontrolü kullanılmıştır. İkinci maddeyi arka arkaya üç kere tekrarlayıp herbirinin “Text” özelliğine gerekli açıklamayı girin. Aşağıdaki uygulamada üçüncü panelde saatin göerilmesi sağlanmaktadır. Formunuza bir adet StatusBar kontrolü yerleştirip mous ile üzerine çift tıklayın. menüden “Add” seçeneğini seçin.procedure TForm1.Free. begin StatusBar1. Dilerseniz aynı işlemleri properties penceresinden de yaptırabilirsiniz. Aşağıdaki adımları sırasıyla izleyiniz.

523 .Height:=50.Height Panellerin yüksekliğini belirleyen özelliğidir.Enabled:=true.procedure TForm1. • StatusBar1.//bir saniye Timer1. end. procedure TForm1.FormCreate(Sender: TObject).Timer1Timer(Sender: TObject).//şu anki tarih-zaman end. StatusBar1. begin Timer1.Text:=DateTimeToStr(Now).Panels[2].Interval:=1000. begin StatusBar1.

Interval:=100.Free Kontrolü bellekten atan methoddur. “True” değerinin aktarılması kod bloğunun işletilmesi anlamına gelir.Interval “OnTimer” eventına yazılan kodun ikinci kez (veya üç – dört) işletilmesi için beklemesi gereken süre bu değerde tutulur. Dikkatlice inceleyiniz. Aşağıda kontrolü daha iyi tanıyabilmeniz için basitten zora doğru örnekler yapılmıştır. begin Timer1. Girilen değer milisaniye cinsindendir.Enabled Kodun işletilip işletilmemesini belirleyen özelliğidir.FormCreate(Sender: TObject).Timer Kontrolü: Bir kod bloğu belli bir peryot içerisinde tekrar tekrar işletilecekse “Timer” kontrolüne (döngüylede halledilebilir. begin Timer1. • Timer1.FormCreate(Sender: TObject).//bir sn bekle tekrar işlet end.Free. Yani buraya “1000” girilmesi bir saniye beklemesi gerektiği anlamını taşımaktadır. Bu kontrol zaten kendi içerisinde döngü çalıştırmaktadır) ihtiyacınız var demektir. • Timer1.Enabled:=true. Aşağıda kontrole ait özellikler verilmiştir. end. procedure TForm1. procedure TForm1.FormCreate(Sender: TObject). 524 . procedure TForm1.//bir sn bekle tekrar işlet Timer1.Interval:=100. begin Timer1. • Timer1. end.

//bir sn bekle tekrar işlet Timer1. Topun hareketi belli bir süre sonra formun boyutlarını aşacak ve ekrandan kaybolmasını sağlayacaktır.Shape:=stCircle.Left.BitBtn1Click(Sender: TObject). Aşağıdaki kodlamada topun ekrandan kaybolması engellenmiştir.Interval:=100. Prpgramı çalıştırıp “Başlat” buttonuna tıklarsanız topunuz sağa doğru hareket etmeye başlayacaktır. Shape1. Bu adımda “Timer” kontrolünün “OnTimer” yordamına aşağıdaki kodu ekleyiniz.Enabled:=false. procedure TForm1.Uygulamalar için formunuza bir adet “Timer”. var sayi:Integer. Devamlı olarak sola ve sağa hareket edecektir.Timer1Timer(Sender: TObject).Enabled:=true. procedure TForm1. bir adet “Shape” ve bir adette “Button” kontrolü yerleştiriniz. 525 . begin Timer1.//daire ol Timer1. end.//50 birim sağa end. Formun tasarım görüntüsü aşağıda verilmiştir.Left:=sayi+50. begin Shape1. procedure TForm1. end. begin sayi:=Shape1.FormCreate(Sender: TObject).

Enabled:=true.ClientWidth Then yon:=true //sola dön else Shape1.Shape:=stCircle.//daire ol end. procedure TForm1. //10 birim sola end.Left:=sayi+10.Interval:=100. İlk “Timer” ile birinci topun hareketini. 526 . begin Timer1. //Global değişken procedure TForm1.BitBtn1Click(Sender: TObject).var yon:Boolean.//10 birim sağa end else begin if sayi<=0 Then yon:=false //sağa dön else Shape1.Left:=sayi-10.FormCreate(Sender: TObject).Enabled:=false. begin sayi:=Shape1. end.//bir sn bekle tekrar işlet Timer1.Left. ikinci “Timer” ile de ikinci topun hareketini sağlayacağız. procedure TForm1. Aşağıdaki örnekte ise iki top çarpıştıktan sonra yön değiştirecektir. Shape1. begin Timer1. Aşağıdaki tasarımı oluşturunuz. end. Bu kodları ekledikten sonra programınızı çalıştırırsanız topunuz formunuzun boyutları çerçevesinde sola ve sağa doğru hareket edecektir. iki adet “Shape” ve bir adet button kontrolü yerleştiriniz. if yon=false Then begin if sayi>=Form1. Örneğimiz için formunuzun üzerine iki adet “Timer”. var sayi:Integer.Timer1Timer(Sender: TObject).

//bir sn bekle tekrar işlet Timer2. procedure TForm2. end else begin if Shape1.Interval:=10. Timer2.Enabled:=false.Timer1Timer(Sender: TObject). begin if yon1=false Then begin if Shape1.yon2:Boolean.//daire ol Shape2.Shape:=stCircle.Left:=Shape1.//bir sn bekle tekrar işlet Timer1.BitBtn1Click(Sender: TObject). Timer2.//daire ol end.Enabled:=true.FormCreate(Sender: TObject).Enabled:=false.Left<=0 Then 527 .Aşağıdaki kod bloğunu “Unit” penceresine ekleyin. procedure TForm2. begin Timer1.Interval:=10. Shape1.Left>=Shape2. begin Timer1. var yon1.Width Then//çarpışma anı yon1:=true//sola dön else Shape1.Shape:=stCircle.Left-Shape1.Left+10.//Global değişkenler procedure TForm2.Enabled:=true. end.

528 . end.Width Then yon2:=false//sola dön else Shape2.ClientWidth-Shape2.Timer2Timer(Sender: TObject).Left<=Shape1. end else begin if Shape2. end.Left-10.Left+Shape1.Left:=Shape1.Left:=Shape2. end.Width Then yon2:=true//sağa dön else Shape2.Left+10.yon1:=false//sağa dön else Shape1.Left>=Form2. Programınızı çalıştırırsanız formun boyutları içerisinde toplar devamlı olarak birbirleriyle çarpışacaklardır. procedure TForm2. begin if yon2=false Then begin if Shape2.Left-10.Left:=Shape2. end.

Aynı mantığı kullanarak dilediğiniz kadar menü sütunu oluşturabilirsiniz. Kullanımı gerçekten çok etkilidir.MainMenu Kontrolü: Çok kolaya bir şekilde menü oluşturmak için kullanılan kontroldür. Yön tuşlarını kullanarak alt satıra inebilirsiniz. Formunuza ilk olarak “MainMenu” kontrolü yerleştirin ve üzerine mous ile çift tıklayın aşağıdaki pencere açılacaktır. Aşağıda adım adım nasıl menü oluşturabileceğiniz anlatılmaktadır. “Caption” değeri “&Dosya” şeklinde girilerek kısa yol oluşturulmuştur (Alt tuşu basılıyken D tuşuna tıklarsanız menü açılır). “Caption” değerlerini girdikten sonra ekran görüntünüz aşağıdaki gibi olmalıdır. Yine yön tüşları ve “Caption” değerleri kullanılarak aşağıdaki sütunu oluşturun. Şimdi “MainMenu” üzerine çift tıklayarak ikinci sütuna geçin. Neredeyse yapamıyacağınız hiç bir menü yok gibi. 529 . Ara bir karakterin başında kullanmanız mümkündür. Açılan bu pencerede propertiesi kullanarak “Caption” değerlerini girin. Kısa yol oluştururken görünen seçeneklerde aynı karakteri kullanmayınız. yeni menü sütunları oluşturacağız.

Alt Menüler Yaratmak: Oluşturduğunuz menüye açılan alt menüler eklemeniz mümkündür. Ekran görüntünüz aşağıdaki şekilde oluşacaktır. 530 . Şayet ekleyecek başka sütunlarınızda varsa onlarıda aynı mantık çerçevesinde uygulamanıza ekleyin. Yapmanız gereken tek şey alt menü ekleyeceğiniz seçeneği seçin (bizim örneğimizde “Font”). Aynı işlemleri tekraralayıp (“Caption” değerlerini girin) diğer ismlendirmeleride yapın. mousun sağ tuşunu tıklayarak açılan menüden “Create Submenu” seçeneğini seçin.

Style:=Edit1. MainMenu kontrolüne eklemiş olduğunuz tüm seçenekler formunuzun başlığında gözükecektir. Ardından seçili kısımda mous ile çift tıklama yaparsanız kodları yazabileceğiniz yordamlara ulaşmış olusunuz. Menü Seçeneklerine CheckBox Eklemek: “CheckBox” ekleyeceğiniz seçeneği seçin (bizim örneğimizde “Kalın”). Bu özelliği birden fazla seçenek için de kullanabilirsiniz. Bu özelliği ayarladıktan sonra programınızı çalıştırırsanız ekran görüntünüz aşağıdaki gibi olacaktır.Style+[fsBold].Font. Menü Seçeneklerine Kod Yazmak: Yukarıdaki örnek için formunuza bir adet “Edit” kontrolü yerleştirip “Altı Çizili” seçeneği için gerekli kodları yazalım. properties penceresinden “AutoCheck” özelliğini true yapın.Altizili1Click(Sender: TObject).font. Seçeneğe her tıkladığınızda Check işareti eklenip kalkacaktır. 531 . procedure TForm1.//bold özelliği ekle end. Yapacağınız işlem tasarım anında “MainMenu” kontrolünün üzerine mous ile çift tıklayarak “Altı Çizili” seçeneğini seçmek.Şimdi programınızı çalıştırabilirsiniz. begin Edit1.

Üçüncü adımda yapmanız gereken tek şey seçeneklerinizi mous ile seçip “ImageIndex” değerlerini sıralamaya dikkat ederek girmek. 532 . Ardından “MainMenu” kontrolünüzü seçip properties penceresinden “Images” özelliğine “ImageList1” değerini aktarın. İlk olarak formunuza bir adet “ImageList” kontrolü yerleştirip kullanacağınız resimleri depolamalısınız. Ekran görüntünüz yukarıdaki şekilde oluşacaktır.Menü Seçeneklerine Resim Eklemek: Aşağıdaki yöntemle seçeneklerinize kolayca resim ekleyebilirsiniz. Fakat öncelikle yapmanız gereken bir kaç işlem bulunmaktadır.

Formunuza bir adet “PopupMenu” kontrolü yerleştirip mous ile üzerine çift tıklayın.formunuza bir adet “Edit” kontrolü yerleştirip kod yazacağınız seçeneğin üzerine mous ile çift tıklayın (Kes).//boşalt end. 533 . Aşağıdaki pencere açılacaktır. aşağıdaki adımları izleyiniz. procedure TForm1. Aşağıdaki kod bloğunu bu yordama girin.Kes2Click(Sender: TObject). begin Edit1.PopupMenu Kontrolü: Mousun sağ tuşuna tıklayarak açtırılan menülerden Delphi’de oluşturmak sonderece kolay. Son adım olarak “Edit” kontrolünüzü seçip “PopupMenu” özelliğine “PopupMenu1” değerini aktarın. Bu pencerede gerekli seçenekleri oluşturduktan sonra.Text:=''.

PopupMenu lere resime eklemek diğer menü ile tamamen aynı olacaktır. 534 . Yani formunuza bir adet “ImageList” kontrolü ekleyerek resimleri dolduracaksınız. Cursor “Edit1” kontrolü içerisinde iken mousun sağ tuşuna tıklayın.Artık programınızı çalıştırabilirsiniz. Kod bloğunu eklediğiniz seçeneği (kes) tıklayarak sonucu görebilirsiniz. PopupMenü lerin açılabilmesi için. o kontrole ait PopupMenü özelliğini muhakkak belirlemiş olmalısınız. ardından resimleriniz için “ImageIndex” özelliklerini belirleyeceksiniz. PopupMenu kontrolünün “Images” özelliğine “Imagelist1” i aktarıp. Oluşturmuş olduğunuz PopupMenu açılacaktır.

MaskEdit Kontrolü: Maskeli bilgi girişi yapabilmeniz için kullanabileceğiniz bir kontroldür. Sağ taraftan “Date” i seçin “InputMask” kısmına yukarıdaki gibi “00” ekleyin (yılı dört rakam görmek için) ve “OK” e basın.” Karakterini girmeden kolayca işlem yapabilmektesiniz. Bu sayede kullanıcının gereksiz karakterlere basma sıkıntısını gidermiş olursunuz. Tarih girişlerinde arada kullanılan “. “Sample Masks” kısmından kullanacağınız maskeyi seçebilir. Şimdi yaptığımız işlemin sonucunu projeyi çalıştırarak görelim.EditMask Sanıyorum en önemli özelliğidir. 535 . Bununla beraber yanlış girişleride büyük ölçüde engelleyeceksiniz. Bu özelliğe atayacağınız seçenek doğrultusunda bilgi girişi yapılabilecektir. • MaskEdit1. Aşağıda bu kontrole ait özellikler verilmiştir. Properties penceresinden bu özelliğe tıklarsanız aşağıdaki pencere açılacaktır. Bu pencerede en çok kullanacağınız maskeler yer almaktadır. veya kendiniz yeni bir maske yaratabilirsiniz.

MinValue.ForeColor Dolu yüzdenin gösterileceği rengi belirleyen özelliğidir. “Progress” değeri sadece bu aralıktaki bir sayıya eşit olabilir.BackColor :=clYellow. Gauge1.Gauge Kontrolü: Bu kontrol sayesinde gerçekleşen işleminizi yüzdelik olarak kullanıcıya gösterebilirsiniz.//kırmızı end.FormCreate(Sender: TObject). • Gauge1.BackColor :=clYellow. • Gauge1. 536 .MaxValue Dolu gövdenin alabileceği maximum ve minimum değerleri belirleyen özelliklerdir.FormCreate(Sender: TObject). end.Gauge1.FormCreate(Sender: TObject). Aşağıda kontrole ait özellikler verilmiştir.Progress:=25.BackColor Kontrolün zemin rengini belirleyen özelliğidir. begin Gauge1. procedure TForm1. Gauge1. procedure TForm1.Progress Yüzdelik dilimdeki değer bu özellikte tutulur. • Gauge1. begin Gauge1.//sarı yap end. Aralık dışı bir değer aktaramazsınız. Tamsayı tipli bir değer aktarılabilir. • Gauge1.ForeColor:=clred. begin Gauge1. procedure TForm1.Progress:=25.

begin Gauge1.//sarı yap Gauge1.MinValue:=0. Gauge1. Gauge1.MaxValue:=100.Progress:=25.Kind:=gkPie.Progress:=25. Gauge1.FormCreate(Sender: TObject).ForeColor:=clred. Gauge1.Kind Kontrolün geometrik şeklini belirleyen özelliğidir.FormCreate(Sender: TObject). 537 .MaxValue:=100. Kind gkHorizontalBar gkVerticalBar gkNeedle gkPie gkText Yatay Bar Şeklinde Düşey Bar Şeklinde Yarım Elips Şeklinde Daire Şeklinde Sadece Yazı Sonuç procedure TForm1. Alabileceği değerler aşağıda verilmiştir.ForeColor:=clred. Gauge1. Gauge1.//daire şeklini al end. end. Gauge1. • Gauge1. begin Gauge1.MinValue:=0.BackColor :=clYellow.//sarı yap Gauge1.procedure TForm1. Yukarıdaki kod bloğuna ait ekran görüntüsü aşağıdaki gibi olacaktır.BackColor :=clYellow.

Yukarıdaki kod bloğunun sonucunda aşağıdaki şekilde bir ekran görüntüsü elde edersiniz.FormCreate(Sender: TObject). procedure TForm1. begin Gauge1.Progress:=Gauge1.end.Progress+1.Progress:=Gauge1. Gauge1. procedure TForm1.Progress+1. Gauge3.MinValue:=0.Kind:=gkHorizontalBar. Gauge4. Gauge2. Aşağıdaki uygulamada forma ekleyeceğiniz bir “Timer” kontrolü sayesinde tüm “Gauge” kontrollerinin çalışma mantığını izleyebilirsiniz. Gauge4.Timer1Timer(Sender: TObject).Progress:=Gauge1. 538 . Gauge3.Kind:=gkNeedle. begin Gauge1. end.Progress+1.BackColor :=clYellow.Kind:=gkVerticalBar.ForeColor:=clred.Kind:=gkPie.MaxValue:=100.Progress:=Gauge1.//sarı yap Gauge1.Progress+1. Gauge2.Gauge1. Gauge1.

Başlık atama işlemini “Execute” methodundan önce yapmalısınız. • OpenDialog1.//yardımcı pencereyi aç end. Aksi takdirde hata oluşmayacak. procedure TForm1. end. begin OpenDialog1. fakat siz bunu görmezsiniz.Execute. procedure TForm1.Title Açılan pencerenin başlığını belirleyen özelliğidir.Title:='Dosya Seçiniz'.//üstte yazın OpenDialog1.Button1Click(Sender: TObject).Execute Yardımcı pencerenin açılmasını sağlayan kod satırıdır.Button1Click(Sender: TObject).OpenDialog Kontrolü: Bu kontrolü kullanarak oluşturmuş olduğunuz dosyalarınızı bulmanız için size yardımcı pencere açılmasını sağlayabilirsiniz. begin OpenDialog1. Aslında yapılan bir api çağrısıdır. Aşağıda kontrole ait özellikler izah edilmiştir. • OpenDialog1. fakat başlıkta yazmayacaktır.Execute. 539 .

DefaultExt Pencere açıldıktan sonra kullanıcı açmak istediği dosyanın adını yazıp uzantısını yazmazsa burada belirtilen uzantı varsayılan olarak kabul edilecektir. Örnekle açıklayacak olursak. aynı klasör içerisinde “gazi. Pencere açıldı “FileName” kısmuna “gazi” yazıp “Open” buttonuna tıkladık hangi dosya açılacaktır.Title:='Dosya Seçiniz'.• OpenDialog1. end. Yukarıdaki şekilde bir pencere açılmasını sağlayan kod aşağıda verilmiştir.DefaultExt:='txt'. İşte açılacak olan dosyayı budurumda “DefaultExt” özelliği belirleyecektir (Dosyayı mous ile seçerseniz o zaman bu özellik işe yaramayacaktır).doc” dosyalarının var olduğunu düşünün.Filter Pencere açıldığı zaman tüm dosyaları değilde sadece belli uzantılı dosyaları listeletmek için kullanılan özelliktir.//varsayılan olarak txt kabul et OpenDialog1. 540 .Execute. • OpenDialog1.txt” ile “gazi.Button1Click(Sender: TObject). Dikkatlice inceleyiniz. begin OpenDialog1. OpenDialog1. Pencereye etkisini “Files of type” kutusuna tıklayarak görebilirsiniz. procedure TForm1.

*|Text Dosyaları|*. begin OpenDialog1. begin OpenDialog1. OpenDialog1.Execute.Execute.Title:='Dosya Seçiniz'.FilterIndex:=2. end.txt'.Filter:='Tüm Dosyalar|*. OpenDialog1. OpenDialog1. Aşağıdaki kodlama sayesinde açılan pencereden birden fazla dosya ismi seçilebilmektedir.procedure TForm1.Execute. procedure TForm1.//filtrele OpenDialog1. end. OpenDialog1. OpenDialog1.InitialDir:='c:\gazi'. Aşağıdaki kodlamada buttona tıklanıldığı anda “c:\gazi” klasörünü aç denilmektedir.Title:='Dosya Seçiniz'. end.DefaultExt:='txt'.*|Text Dosyaları|*. • OpenDialog1.Filter:='Tüm Dosyalar|*.Button1Click(Sender: TObject).*|Text Dosyaları|*. OpenDialog1.txt'.Title:='Dosya Seçiniz'. begin OpenDialog1.Options Pencereye ait bir çok seçeneği bu özellikle belirleyebilirsiniz.Filter:='Tüm Dosyalar|*. 541 .Button1Click(Sender: TObject). procedure TForm1.Button1Click(Sender: TObject).txt'.FilterIndex:=2.FilterIndex Filter özelliğiyle belirlenen filtre seçeneklerinin hangisinin aktif olacağını belirleyen özelliğidir.//txt leri göster OpenDialog1. OpenDialog1. • OpenDialog1. • OpenDialog1. OpenDialog1.DefaultExt:='txt'.DefaultExt:='txt'.//bu klasörde açıl OpenDialog1. OpenDialog1.InitialDir Pencerenin ilk olarak açılması istenen klasörü bu özellikle belirlenir.

• OpenDialog1.*|Text Dosyaları|*. procedure TForm1.Options:=OpenDialog1.DefaultExt:='txt'. Aşağıdaki örnekte seçilen dosya nın yoluyla beraber ismi formun başlığında yazdırılmaktadır. ListBox1. OpenDialog1. OpenDialog1.//dosyanın adını yaz end.Execute.txt'.FilterIndex:=2. OpenDialog1. OpenDialog1. OpenDialog1.Caption:=OpenDialog1. OpenDialog1.Files “ofAllowMultiSelect” özelliği verilen pencerelerde birden fazla dosya ismi seçilebilmektedir.Title:='Dosya Seçiniz'.InitialDir:='c:\gazi'. 542 .procedure TForm1. OpenDialog1.Execute.Filter:='Tüm Dosyalar|*.Button1Click(Sender: TObject).FilterIndex:=2.Title:='Dosya Seçiniz'. begin OpenDialog1.Button1Click(Sender: TObject).Execute. procedure TForm1. Form1. OpenDialog1. OpenDialog1. OpenDialog1.FileName Pencereden seçilen dosyanın ismiyle beraber yolu bu özellikte tutulur. begin OpenDialog1.InitialDir:='c:\gazi'.Files. end. Seçilen tüm dosyalar dizi şeklinde bu özellilkte tutulur. • OpenDialog1. OpenDialog1.Filter:='Tüm Dosyalar|*.Options+[ofAllowMultiSelect].FileName.DefaultExt:='txt'. Aşağıdaki örnekte seçilen tüm dosyalar forma eklenen bir “ListBox” kontrolü içerisinde yazdırılmaktadır.Button1Click(Sender: TObject). begin OpenDialog1.Options+[ofAllowMultiSelect].//seçilen dosyaları aktar end.*|Text Dosyaları|*. OpenDialog1.txt'.Title:='Dosya Seçiniz'.Options:=OpenDialog1.Items:=OpenDialog1. OpenDialog1.

Execute Dosya kaydetme penceresinin açılmasını sağlayan methoddur. procedure TForm1. Oluşabilecek olan hatalara karşı “if” kullanırsanız daha sağlıklı sonuçlar alabilirsiniz (aynı işlemi OpenDialog içinde yapın). 543 . • SaveDialog1.Button2Click(Sender: TObject). Execute methodu çalıştırılmadan önce belirlenmelidir.Execute Then end.SaveDialog Kontrolü: Bu kontrolle programınızda oluşturacağınız verileri dilediğiniz klasörün içerisine kaydedebilirsiniz. Uygulanan işlem yine aynıdır. windows apisi çalıştırılarak standart dosya kaydetme penceresini açtırırsınız. • SaveDialog1.Title Pencerenin başlığını belirleyen özelliğidir. Aşağıda kontrole ait özellikler listelenmektedir. Aksi takdirde belirlemiş olduğunuz başlık gözükmeyecektir. begin if SaveDialog1.

Caption:=SaveDialog1. procedure TForm1.Button2Click(Sender: TObject). end. • SaveDialog1.Execute Then Form1.Execute Then.FileName Kaydettiğiniz dosyanın yoluyla beraber ismi bu özellikte tutulur. 544 . Uygulamada “Dosya Aç” buttonuna tıklanıldığı zaman Harddisk teki herhangi bir dosyayı “Memo” kontrolü içerisine aktarabilirsiniz.• SaveDialog1. Aynı mantıkla “Dosya Kaydet” buttonuna tıklarsanız “Memo” kontrolü içerisindeki verileri. begin SaveDialog1..Title:='Kaydetme Penceresi'.Button2Click(Sender: TObject).//dosya yolunu yaz end. SaveDialog1. if SaveDialog1.FileName.DefaultExt Dosyanızı kaydetme aşamasında uzantı belirtmezseniz bu özelliğe aktardığınız değer dosyanızın uzantısı olacaktır.DefaultExt:='txt'. Harddisk te bir dosya oluşturup kaydettirebileceksiniz. if SaveDialog1.Title:='Kaydetme Penceresi'. procedure TForm1. Aşağıdaki tasarımı oluşturup gerekli kodları ekleyiniz. SaveDialog1.DefaultExt:='txt'. begin SaveDialog1.

*'.FileName. SaveDialog1. SaveDialog1.Button1Click(Sender: TObject).SaveToFile(dosya). if SaveDialog1.FilterIndex:=1.//kaydet end.Execute Then begin dosya:=SaveDialog1.Lines. begin OpenDialog1. end. 545 .InitialDir:='c:\gazi'. procedure TForm2.txt|Tüm Dosyalar|*.//aktar end.Title:='Dosya Kaydet Penceresi'.Button2Click(Sender: TObject). //Dosya Aç var dosya:AnsiString. begin SaveDialog1.InitialDir:='c:\gazi'.Title:='Dosya Aç Penceresi'. OpenDialog1.Execute Then begin dosya:=OpenDialog1. OpenDialog1.DefaultExt:='txt'.LoadFromFile(dosya). Memo1. if OpenDialog1. OpenDialog1.FileName.Filter:='TextDosyaları|*.procedure TForm2. //Kaydet var dosya:AnsiString.Lines. Memo1. end.

Font:=FontDialog1.Button3Click(Sender: TObject). 546 .Font. Aşağıdaki şekilde bir kodlamayla formda yapmış olduğunuz tüm ayarları Memo kontrolüne aktarabilirsiniz. • FontDialog1.Button3Click(Sender: TObject). dilediğiniz kontrole ait font ayarlarını görsel olarak belirleyebilirsiniz. • FontDialog1.Execute Then//aç end. begin if FontDialog1. procedure TForm2.Execute Pencereyi açtırmak için kullanılan methoddur. procedure TForm2.Execute Then Memo1. begin if FontDialog1. Aşağıda kontrole ait özellikler verilmiştir.Font Pencereye ait tüm font ayarlarının (yazı tipi-büyüklüğü-rengi vs) tutulduğu özelliğidir.FontDialog Kontrolü: Bu kontrolü kullanarak. end.

Font. begin FontDialog1.Font:=FontDialog1. şayet “Memo” kontrolüne ait değiştirmediğiniz font ayarları varsa. bu şekilde o ayarların aynen devam etmesini sağlayabilirsiniz.Bu kodu aşağıdaki şekilde kullanırsanız daha sağlıklı olacaktır. end. procedure TForm2. Sebebi şudur.Button3Click(Sender: TObject).Font:=Memo1.Font. if FontDialog1.Execute Then Memo1. 547 .

Execute Then begin Memo1. • ColorDialog1.Color. end.Color Aktarıldığı kontrolün rengini belirleyen özelliğidir. • ColorDialog1.Button4Click(Sender: TObject).Color:=ColorDialog1.Button4Click(Sender: TObject).Execute “ColorDialog” penceresinin açılmasını sağlayan methoddur. begin if ColorDialog1. procedure TForm2.ColorDialog Kontrolü: Görsel olarak kontrollerinize ait renk ayarlarını yapabilmenizi sağlayan bir kontroldür. begin if ColorDialog1.Execute Then end. 548 . end. procedure TForm2.

Memo Kontrolü: Birden fazla satırlı bilgi girişi için kullanılan bir kontroldür. Aslında ListBox kontrolünün klavyeden bilgi girilebilen hali olarak da düşünülebilir. 549 . Bu yüzden özellik ve methodlarını anlamanız için ListBox kontrolünü inceleyiniz.

550 .

BÖLÜM 14 DELPHI YORDAMLARI 551 .

552 .

yazmış olduğunuz yordam belirler. “Object Inspector” penceresinde. 553 . Mousun sağ tuşuna tıklayarak bu Eventı (yordamı) işletemezsiniz. Mousun tıklanması. Delphi tarafından bir tetikleyici olarak algılanır ve o yordamdaki kod işletilir. • OnClick Kontrol üzerinde mousun sol tuşunun tıklanılması durumunda işleyen bir yordamdır.Yordamlar: Unit penceresine eklemiş olduğunuz kodun işletileceği zamanı. Yordamlar tetikleyiciler sayesinde işletilecek olan kod satırlarından oluşurlar. veya herhangi bir tuşun basılı tutularak mousun sürüklenmesi vs. procedure TForm1. bu yüzden görsel dillerdeki yerleri çok büyüktür.Button1Click(Sender: TObject). cursorun bulunduğu yere mous ile çift tıklarsanız aşağıdaki gibi işletilecek olan kodun yazılabileceği “OnClick” yordamı oluşturulacaktır. Bu bölümde sizlere en çok kullanacağınız tetikleyicileri ve bu tetikleyiciler sonucunda işletilen yordamları izah edeceğim. Bu yordam için daha önceki bölümlerde bir çok örnek yapıldığından dolayı tekrar örneklendirilmeyecektir. //OnClick Yordamı begin //kodlar buraya yazılacak end.enter tuşuna basılması. Aşağıdaki pencerede bu yordama “Object Inspector” penceresinden nasıl erişebileceğiniz gösterilmiştir. Anlatılacak olan yordamlar bir çok kontrol tarafından kullanılabilir (mesela “OnChange” neredeyse tüm kontroller için kullanılabilecektir). Bu yüzden en popüler olanı üzerinde örneklendirme yapılacaktır.

• OnDblClick Yordamı Mous kontrolün üzerinde iken sol tuşun çift tıklanması durumunda işletilen bir yordamdır.//Büyük harfe çevir end. Çift tıklama hızını windows ayarları belirlemektedir. //OnDblClick yordamı begin //Edit1 kontrolü üzerinde iken sol tuşa çift tıklanması durumunda işler end. 554 . mosun çift tıklanması iki yordamıda işletecektir. İçeriğin değişmesi (klavyeden bir tuşa basılması. procedure TForm1.Edit1DblClick(Sender: TObject). procedure TForm1. karakter silmek vs) bu yordamın işletilmesine sebep olacaktır. Aşağıdaki örnekte “Edit1” kontrolüne girilen karakterlerin büyük harfe çevrilmiş hali formun başlığında yazdırılmaktadır. begin metin:=Edit1.Text. //Büyük harfe çevir var metin:AnsiString. kodla veri aktarılması.Edit1Change(Sender: TObject). Yukarıdaki işlemin gerçekleşebilmesi için aşağıdaki kod bloğunu Unit pencerenize eklemelisiniz. • OnChange Yordamı İçerisinde veri olan kontrollere has bir yordamdır. Form1. Şayet “OnClick” ve “OnDblClick” yordamlarının (aynı kontrol için) ikisinde de kod varsa.Caption:=AnsiUpperCase(metin). Programı çalıştırdıktan sonra “Edit” kontrolüne gireceğiniz bilgi büyük harfe çevrilerek formun başlığında yazdırılacaktır.

Dikkatlice inceleyiniz. end.Caption:=AnsiUpperCase(metin) else if Copy(metin.1).Caption:=Form1. Daha değişik kontroller koymanız gerekecektir.Caption+sonharf.Caption:=Form1.Aşağıdaki örnekte ise içeriğe ait kelimelerin ilk harfleri büyütülmektedir.Caption+sonharf. Kontrollere girilen içerikteki kelimelerin sadece ilk karakterlerinin büyük olması için aşağıdaki şekilde bir kod bloğu kullanırsanız çok daha etkili bir sonuç alırsınız. var metin.Text. end else Form1.Edit2Change(Sender: TObject). Şimdilik sadece küçük harfle giriş yapın ve örneği deneyin sadece ilk karakterler büyük yazdırılacaktır.Length(metin)-1.sonharf:AnsiString. if Length(metin)<=1 then//ilk karakter ise Form1.//büyük harf yap Form1. Şimdi aynı örneği dinamik dizi kullanarak çözelim çok daha güzel ve teknik olacağını göreceksiniz. procedure TForm1. 555 .1)=' ' Then //son harf boşluk tuşu ise begin sonharf:=AnsiUpperCase(sonharf). begin metin:=Edit2.Length(metin). sonharf:=Copy(metin. Bu örnek için silme veya değişik bir işlem yapılırsa düzgün sonuç alamayabilirsiniz.

i+1. uzunluk.Text.i+1. begin yaz:=''.Text. //kelimelerin ilk harflerini büyüt var metin:Array of AnsiString.Text). Form1. Edit kutusunun içerisine.uzunluk).i:Integer.Text.i+1. SetLength(metin.Edit3Change(Sender: TObject). Aynı örneği şimdi de katar kullanarak çözelim.//diziyi boyutlandır for i:=0 to uzunluk-1 do begin if i=0 then metin[i]:=AnsiUpperCase(copy(Edit3. end. yaz:AnsiString. içeriği nasıl yazarsanız yazın sonuç tüm kelimelerin ilk karakterlerinin büyütülmesiyle noktalanacaktır. 556 .Caption:=yaz.1))//ilk karakter büyük else if metin[i-1]=' ' Then //boşluk karakteri ise metin[i]:=AnsiUpperCase(copy(Edit3. Şimdi programınızı çalıştırırsanız gerekli tüm kontrollerin eklenmiş olduğunu göreceksiniz( suyu baştan tuttuk çünkü).1)) end.1)) else metin[i]:=AnsiLowerCase(copy(Edit3. Aşağıdaki kod bloğunu “Unit” pencerenize ekleyiniz. uzunluk:=Length(Edit3. for i:=0 to uzunluk-1 do yaz:=yaz+metin[i].procedure TForm1.

557 . karakter:=metin^. for i:=0 to uzunluk-1 do begin if i=0 Then yaz:=AnsiUpperCase(metin^)//büyük harfe çevir else if karakter=' ' Then yaz:=yaz+AnsiUpperCase(metin^) else yaz:=yaz+AnsiLowerCase(metin^).//katar tanımlanıyor karakter:Char.//sonraki karaktere geç end.i:Integer. metin:=PChar(Edit4.Edit4Change(Sender: TObject). begin yaz:=''. end. uzunluk.procedure TForm1. var metin:PChar. uzunluk:=Length(Edit4. Form1.Caption:=yaz.//karakteri yaz inc(metin). yaz:AnsiString.Text).Text).

X. Basılan tuş ve mousun koordinatları yordamda tanımlanmış olan değişkenlerde tutulmaktadır. begin //kodlar buraya yazılacak end. Sizde programınıza uygun kodları bu sayede geliştirebilirsiniz. Shift: TShiftState. X. Button mbLeft mbRight mbMiddle Sol Tuş Tıklandı Sağ Tuş Tıklandı Orta Tuş Tıklandı Sonuç 558 . Bu tür işlemler için Delphi size özel yordamlar sağlamaktadır. • OnMousDown Yordamı Mous kontrolün üzerinde iken tuşlardan (mousun tuşlarından) herhangi birtanesine tıklanılması durumunda otomatik olarak işleyen bir yordamdır. procedure TForm2. Y: Integer). procedure TForm2. TObject.Edit1MouseDown(Sender: TMouseButton. end.Edit1MouseDown(Sender: TObject. Shift: TShiftState. Button: TMouseButton. Dikkat ettiyseniz basılan tuş “Button” parametresiyle öğrenilebilmektedir. begin if Button=mbLeft Then//sol tuş tıklanırsa ShowMessage('Sol Tuşa Tıkladınız') else if Button=mbRight Then//sağ tuş tıklanırsa ShowMessage('Sağ Tuşa Tıkladınız') else if Button=mbMiddle Then//orta tuş tıklanırsa ShowMessage('Orta Tuşa Tıkladınız'). Alabileceği seçenekler aşağıda verilmiştir. Y: Integer). Aşağıda bu Events lar incelenmektedir.Mous Tuşları İle Tetikleyebileceğiniz Yordamlar: Bazı durumlarda mousu hareket ettirince veya mous tuşlarından herhangi bir tanesine tıkladığınız zaman belirli bir kod bloğunu işletmek isteyebilirsiniz. Button: Aşağıdaki şekilde bir kod bloğuyla mousun hangi tuşunun tıklandığı kolaylıkla öğrenilebilir.

var yatay. son:=IntToStr(dikey).//tıklanılan noktanın yatay eksen değeri dikey:=y. begin yatay:=x. Bu parametreyle “Ctrl-Alt-Shift” tuşlarının basılı olup olmamasına göre gerekli kodları işletebilirsiniz.Caption:='Tıklanılan Nokta Koordinatları='+ilk+'/'+son. Prosedür içerisinde kullanılan diğer bir parametrede “Shift” tir. X. Button: TMouseButton. Dikkatlice inceleyiniz.FormMouseDown(Sender: TObject. Şayet dilerseniz bu yordama yazacağınız kodla tıklanılan yerin koordinatlarınıda öğrenebilirsiniz. Form2. ilk. Yazacağınız uygulamalarda bu size çok özel imkanlar sağlayacaktır. 559 . Çizim programlarında tıklanılan nokta koordinatları bu şekilde tespit edilebilmektedir. Y: Integer).son:AnsiString. Aşağıda Shift parametresinin alabileceği tüm seçenekler verilmiştir. procedure TForm2. Shift: TShiftState.dikey:Integer.//tıklanılan noktanon dikey eksen değeri ilk:=IntToStr(yatay).Bu yordamın tuş basılı tutulduğu sürece işleyeceğinide hatırlatalım. Örneğe dikkat ettiyseniz kullanılan “x” ve “y” değişkenleri tıklanılan noktanın koordinatlarını tutmaktadır. end.

procedure TForm2. //Mous Yordamları begin if Button=mbLeft Then ShowMessage('Sol Tuşu Bıraktınız') else if Button=mbRight Then ShowMessage('SağTuşu Bıraktınız') else if Button=mbMiddle Then ShowMessage('Orta Tuşu Bıraktınız'). X. begin if ((Button=mbLeft)and(Shift=[ssAlt])) Then//sol tuş ve alt tuşu basılı ShowMessage('Al tuşu basılıyken Sol Tuşa Tıkladınız'). Shift: TShiftState. Y: Integer). • OnMousUp Yordamı: Kontrolün üzerinde basılı olan mous tuşunun bırakılması sonucu otomatik olarak işleyen bir yordamdır.Shift: TShiftState. Bu yüzden tekrar izah edilmeye gerek görülmemiştir. “OnMousDown” ile aynı karakteristik özellikleri taşımaktadır. X.Shift [ssAlt] [ssShift] [ssCtrl] [ssLeft] [ssRight] [ssMiddle] Alt Tuşu basılı Shift tuşu Basılı Ctrl tuşu basılı Sol yön tuşu basılı Sağ Yön Tuşu Basılı Orta Tuş Basılı Sonuç procedure TForm2. End. gittikçe küçülen elipsler çizdirilmektedir. Button: 560 . Dilerseniz çizgilerin renklerini de değiştirebilirsiniz. Button: TMouseButton.FormMouseUp(Sender: TMouseButton.Edit1MouseDown(Sender: TObject. Aşağıdaki örnekte mousun tıklanılan noktası merkez kabul edilerek. end. Prosedür içerisinde tanımlanan parametreler “OnMousDown” ile aynı olacaktır. TObject. Y: Integer).

Y: Integer).//çiz yaricap:=yaricap+5. end.Ellipse(yaricap.FormCreate(Sender: TObject).x.y). Button: Yukarıdaki iki yordamdan farkı mousun kontrolün üzerinde hareket etmesi durumunda otomatik olarak işleyecektir. Mous tuşlarından bir tanesinin tıklanması zorunluluğu yoktur.procedure TForm3. begin for i:=0 to 30 do begin Canvas. end.FormMouseDown(Sender: TMouseButton. begin Button1. end. Sleep(1000). procedure TForm2.Caption:='Bana Tıklayamazsın'. var i:Integer.yaricap. Daha sonra Button kontrolüne tıklamaya çalışın başaramayacaksınız.Caption:=IntToStr(i). {$j+} Const yaricap:Integer=10.//bekle Form3. • OnMouseMove Yordamı TObject. X. Yordamı daha iyi anlamak için aşağıdaki tasarımı oluşturarak programınızı çalıştırınız. 561 . Shift: TShiftState.

end.//kapatma işlemini iptal et end. begin ShowMessage('Tebrikler'). Buttonu yukarıdaki şekilde en köşeye götürün.MessageBox('Kapatmak 'Kapanış'. end. Şayet tıklayamadıysanız size bir cinlik göstereyim. begin mesaj:=Application. if mesaj=mrNo Then begin ShowMessage('Kapatma Işlemi Iptal'). 562 . end. TObject.FormClose(Sender: TCloseAction).Button1Click(Sender: TObject).Left:=x+30. Action:=caNone.procedure TForm2. var Action: İstediğinizden Eminmisiniz'. Prosedür içerisinde tanımlı olan “Action” parametresi ile kapatma seçeneklerini belirleyebilirsiniz.FormMouseMove(Sender: TObject. • OnClose Yordamı Form kapatılırken otomatik olarak işleyen bir yordamdır. Button1. begin Button1. Shift: TShiftState.Y: Integer).Top:=y-30. X. Artık tam buttonun üzerindeyken seri tıklarsanız uyarı mesajı kullanıcıya iletilecektir. procedure TForm2. var mesaj:Integer. mousu formun üzerinden atarak dolaştırın. procedure TForm3.mb_YesNo).

FormCreate(Sender: TObject).'Şifre'. end. if dugme Then //Ok basarsa begin while(sifre<>'prestige')do begin dugme:=InputQuery('Şifreyi Giriniz'.sifre). 563 .sifre). Action caNone caHide caFree caMinimize Formu Gizle FormuYok Et Formu Minimize yap Kapatma Sonuç Formu kapatma işlemini iptal Et • OnCreate Yordamı Form çalıştırıldığı anda. Bu sefer kullanıcıya üç hak verelim. Şifre kontrollerinizi kolaylıkla bu yordamda yaptırabilirsiniz. var sifre:AnsiString. Unit pencerenizdeki kodu aşağıdaki şekilde değiştiriniz.//Kapat end.“Action” parametresinin alabileceği tüm seçenekler aşağıda verilmiştir. Uygulamanızda form yüklendiği anda kullanıcıya şifre sorulacaktır. end. Şayet üç hakkın sonunda doğru şifreyi bilemezse o zaman programı sonlandıralım. kullanıcı henüz müdahale etmemişken işleyen bir yordamdır. Aşağıda bu yordama ait örneklendirme yapılmaktadır. begin dugme:=InputQuery('Şifreyi Giriniz'. ardından “OnCreate” yordamındaki atamalarınız gerçekleşecektir.'Şifre'. Uygulamanız ilk çalıştığı anda “Object Inspector” penceresindeki ayarlar geçerli olur. Örneğimizi biraz daha zorlaştıralım. Halt. procedure TForm3. dugme:Boolean. end else begin ShowMessage('Program Kapatılacak').

end. 564 . sifre:AnsiString. Aşağıdaki örnekte “Edit5” kontrolü aktifleştiği anda “Toplam Fiyat” değeri hesaplanmakta.//Kapat end.procedure TForm4. ardından da uygun olan parasal formata dönüştürülmektedir. Program Kapanacak').FormCreate(Sender: TObject). end. Kod bloğunu dikkatlice inceleyiniz. Halt.sifre). dugme:=InputQuery('Şifreyi Giriniz'. if dugme Then //Ok basarsa begin while(sifre<>'prestige')do begin if sayi>=3 Then begin ShowMessage('Üç Hakkınızdada Bilemediniz.//döngüyü ve programı bitir. end else begin dugme:=InputQuery('Şifreyi Giriniz'. else begin ShowMessage('Program Kapatılacak'). • OnEnter Yordamı Kontrolün Component’e geçmesiyle otomatik olarak işleyen bir yordamdır.'Şifre'. inc(sayi). İkinci kez işletilebilmesi için kontrolü kaybedip tekrar alması gerekecektir. var sayi:Integer.sifre).'Şifre'. end. Halt. end. begin sayi:=1. dugme:Boolean.

topfiyat:Double. var adet:Integer. Bir kontrolün aktifliğini kaybetmesi Tab tuşuna basarak. procedure TForm3.Uygulama için gerekli kontrolleri formunuza yerleştirip aşağıdaki tasarımı oluşturunuz. kodla başka bir kontrole “Setfocus” yaparak veya mous ile başka bir kontrole tıklayarak gerçekleşebilmektedir. end. Edit4.2). topfiyat:=adet*fiyat. fiyat.Text). Gerekli verileri girdikten sonra cursor “Edit5” e geldiği anda “Toplam Fiyat” otomatik olarak hesaplanacaktır. Edit5.Text:=FloatToStrF(topfiyat.Text).ffCurrency.ffCurrency. fiyat:=StrToInt(Edit4. • OnExit Yordamı Aktiflik o kontrole geçtiği anda “OnEnter” yordamı işlemişti. Aynı mantıkla kontrol aktif olma (cursor başka kontrolde ise) özelliğini yitirdiği anda da “OnExit” yordamı işleyecektir. begin adet:=StrToInt(Edit2. 565 .14. Yukarıdaki kod bloğunu “Edit4” konytrolünün “OnExit” yordamına da yazabilirsiniz (daha doğru olur mous ile başka bir kontrole tıklayınca sonuç yine hesaplanacaktır).2).Edit5Enter(Sender: TObject).Text:=FloatToStrF(fiyat.14.

end. ardından mous ile tekrar ilk forma tıklarsanız “OnActivate” yordamı tekrar işleyecek. yeniden işleyecektir.//formatla yaz Edit4.2). procedure TForm3. Programınızı çalıştırdığınız zaman başlıkta “0” değerini göreceksiniz. procedure TForm3. Diğer bir farkı da.Text).Edit4Exit(Sender: TObject). başlıkta “1” değeri yazacaktır.ffCurrency. “OnActivate” yordamı ise ikinci bir formu aktifleştirdikten sonra tekrar bu forma tıklanması sonucu. • OnActivate Yordamı “OnCreate” yordamı gibi form yüklenirken değil.14.14. topfiyat:=adet*fiyat. 566 . Yordamın tekrar işlemesi için formun kapatılıp açılması veya uygulamadaki diğer bir forma geçip tekrar geriye dönülmesi gerekmektedir. begin Form3.FormActivate(Sender: TObject). Programı çalıştırdıktan sonra “NotePad” i çalıştırıp tekrar ana forma tıklarsanız “OnActivate” yordamı tekrar işletilmeyecektir.topfiyat:Double. fiyat. Edit5.Text).2).Button1Click(Sender: TObject).procedure TForm3. begin Form2.Text:=FloatToStrF(topfiyat.//formatla yaz end. {$j+} const deger:Integer=0. end.show. fiyat:=StrToInt(Edit4. Buttona tıklayıp form2 yi aktif hale getirin. var adet:Integer. begin adet:=StrToInt(Edit2. inc(deger).Text:=FloatToStrF(fiyat. “OnCreate” yordamının ikinci kez işletilebilmesi için formun kapatılıp tekrar açılması gerekmektedir. yüklendikten sonra işler.Caption:=IntToStr(deger).ffCurrency.

fakat daha sonra formun boyutlarında değişiklik yaparsanız simetri ortadan kalkacaktır. buradaki kod bloğu çalışacaktır. • OnResize Yordamı Kontrolün boyutlarının değişmesi durumunda otomatik olarak işleyen yordamdır. Yukarıdaki projede button kontrolüne tıklarsanız ikinci bir form açılacak. dolayısıyla ilk form aktifliğini yitirecektir. procedure TForm3. • OnDragDrop-OnDragEnd-OnDragOver Sürükle bırakla ilgili kod bloklarınızı yazabileceğiniz yordamlardır.show. 567 . formun boyutlarında olabilecek her değişiklikte kodun işlemesini sağlayacak dolayısıyla kontrol formun üzerinde hep ortalanmış olacaktır.• OnDeactivate Yordamı Formun aktif olma (en üstte) özelliğini yitirmesi durumunda otomatik olarak işleyen bir yordamdır. procedure TForm3.FormDeactivate(Sender: TObject). //Hep ortada kal var deger:Double.Width-Button1.FormResize(Sender: TObject). Aşağıdaki kodu “OnActivate” yordamına yazarsanız.Left:=ceil(deger). end. Bu yordamlara ait gelişmiş örnekleri “Drag and Drop” bölümünde bulabilirsiniz. Başka bir formu açmak veya formu kapatmak bu yordamı otomatik olarak işletecektir. procedure TForm3. Button1. Bu yüzden burada tekrar değinilmeyecektir. begin Form2. end. uygulamanız çalıştığı anda “Edit” kontrolü form üzerinde ortalanacak.Width)/2. begin deger:=(Form3.Button1Click(Sender: TObject). end. Aktifliğini yitiren formun “OnDeactivate” yordamı işleyerek. begin ShowMessage('Başka Bir Form Çalıştırıldı'). Bu kodu “OnResize” yordamına yazmanız.

Burada basılan tuşu yazdırmak için aşağıdaki kodu kullanabilirsiniz. sadece “B” tuşuna basınca işlesin derseniz o zaman prosedür içerisinde tanımlanmış olan “Key” parametresinden faydalanmalısınız. procedure TForm5. Basılan tuşun yordam için önemi yoktur. Sadece bu tuşlara tıklarsanız kullanıcıya uyarı iletebilirsiniz. Aynı kodu aşağıdaki şekilde de yazabilirdiniz. Her tuş için işleyecektir. Aşağıdaki örnekte sadece “A” ve “B” tuşları için görev tanımlanmıştır. Kod bloğuna dikkat ettiyseniz “Key” diye bir parametreden faydalanılmıştır. var Key: Word.Klavye Tuş Vuruşlarıyla Tetiklenen Yordamlar: Kod bloğunuzu klavyeden basacağınız özel bir tuştan sonra işletmek isteyebilirsiniz. Bu parametrenin prosedür içerisinde “word” tipli tanımlanmış bir değişken olduğunu dikkatinizden kaçırmayınız. end.Edit1KeyDown(Sender: TObject. Şayet basilan tuş önem arz edecekse. Bu gibi durumlarda kodlarınızı rasgele Event (yordam) lara yazamazsınız. begin if (Key=VK_LEFT) Then //A tuşuna basılırsa ShowMessage('Sol Yön Tuşuna Bastınız') else if Key=VK_RIGHT Then //B Tuşuna basılırsa ShowMessage('Sağ Yön Tuşuna Bastınız'). Shift: TShiftState). Rasgele bir yordamda bu parametreyi kullanırsanız hata mesajıyla karşılaşırsınız. Shift: TShiftState). procedure TForm5. yani “A” tuşuna basınca işlemesin. Aşağıda bu yordamlar detaylı olarak incelenmektedir. • OnKeyDown Yordamı Klavyeden herhangi bir tuşa basılması durumunda otomatik olarak işleyen bir yordamdır. var Key: Word. end. 568 .Edit1KeyDown(Sender: TObject. Delphi bu hususta sizlere üç farklı yordam sunmaktadır. begin if Key=Ord('A') Then //A tuşuna basılırsa ShowMessage('A Tuşuna Bastınız') else if Key=Ord('B') Then //B Tuşuna basılırsa ShowMessage('B Tuşuna Bastınız').

569 . begin Form5. Shift: TShiftState). var Key: Word.procedure TForm5. Tuş A-Z Insert Home PageUp Pause NumLock Esc * + Sol Yön Yukarı Yön 0-9 Enter Del End PageDown ScrollLock BacSpace / Space Sağ Yön Aşağı Yön F1-F24 0-9 CapsLock Ctrl Tab VK_INSERT VK_HOME Vk_PRIOR VK_PAUSE Vk_NUMLOCK VK_ESCAPE VK_MULTIPLY VK_ADD VK_LEFT VK_DOWN VK_0 – VK_9 Vk_RETURN Vk_DELETE VK_END VK_NEXT VK_SCROLL VK_BACK VK_DIVIDE VK_SUBTRACT VK_SPACE VK_RIGHT VK_UP VK_F1-VK_F24 VK_NUMPAD0-VK_NUMPAD9 VK_CAPITAL VK_CONTROL Vk_TAB Key Ord(‘A’)-Ord(‘Z’) veya VK_A – VK_Z Bu değerleri görebilmeniz için “Ctrl” tuşu basılı iken mousun sol tuşuna tıklarsanız “Ascii” değerleriyle beraber tüm seçeneklere ulaşabilirsiniz. Aşağıdaki Tabloda “Key” parametresiyle gösterilebilecek olan karakterler verilmiştir.//Basılan tuşu başlıkta yaz end. Programı çalıştırıp herhangi bir tuşa tıklarsanız.Edit1KeyDown(Sender: TObject.Caption:=Chr(Key). bastığınız tuş formunuzun başlığında yazacaktır.

var Key: Word.Dikkatinizi çekmiştir prosedür içerisinde tanımlı olan “Shift” isminde başka bir değişken daha var. Shift: TShiftState). procedure TForm5.Edit2KeyDown(Sender: TObject. Shift: TShiftState). 570 . Shift: TShiftState). Bu değişken ile “Ctrl+Alt+Shift” tuşlarını kullanarak maske tanımlayabilirsiniz.ssShift]) and (Key=VK_RETURN) Then//Alt+Shift+Enter bas ShowMessage('Tamam'). Shift ssAlt ssShift ssCtrl ssLeft ssMiddle ssDouble Alt Tuşu Basılıyken Shift Tuşu Basılıyken Control Tuşu Basılıyken Mousun Spol Tuşu Basılı Mousun Orta Tuşu Basılı Mousun sol ve sağ tuşu Basılı Sonuç Aşağıdaki örnekte “Alt+Ctrl +Enter” tuşları beraber kullanılmaktadır.Edit2KeyDown(Sender: TObject. begin if (Shift=[ssAlt. var Key: Word.ssCtrl]) and (Key=VK_RETURN) Then ShowMessage('Tamam'). Shift Parametresinin alabileceği değerler aşağıda tablo halinde verilmiştir. Yani bir kodu “A” tuşuna basınca değilde “Alt” tuşuyla beraber “A” tuşuna basarsanız işletme imkanını yaratabilirsiniz. end. begin if (Shift=[ssAlt]) and (Key=VK_RETURN) Then//Alt tuşu ile beraber Enter ShowMessage('Tamam'). Aşağıdaki örnekte “Alt” tuşuyla beraber “Enter” tuşunada basılırsa belirtilen mesajla kullanıcıyı uyarabilirsiniz. end. begin if (Shift=[ssAlt. procedure TForm5.Edit2KeyDown(Sender: TObject. end. var Key: Word. procedure TForm5. Aşağıdaki örnekte de “Alt+Shift+Enter” tuşları beraber kullanılırsa kullanıcı belirtilen mesajla uyarılabilecektir.

Top:=Edit1. Aynı kodları bu yordamada yazabilirsiniz.FormKeyDown(Sender: TObject.Left-50 //sola else if Key=VK_RIGHT Then Edit1. Burada yeri gelmişken hatırlatalım “OnKeyDown” yordamı tuş basılı tutulduğu sürece devamlı olarak işletilecektir. //yukarı end. “OnKeyDown” yordamındaki tüm parametreler aynen burada kullanılabilmektedir. • OnKeyUp Yordamı Bu yordamın karakteristik özellikleri “OnKeyDown” yordamıyla tamamen aynıdır.Top+50 //aşağı else if Key=VK_UP Then Edit1. Shift: TShiftState).Top-50.Left:=Edit1.Aşağıdaki örnekte yön tuşları kullanılarak kontrol hareket ettirilmektedir. “OnKeyUp” yordamı basılan tuşun bırakılması anında tek bir kere işletilecektir. Aşağıdaki örnekte “Edit” kutusuna büyük harfle giriş engellenmektedir. begin if Key=VK_LEFT Then Edit1. procedure TForm5.Left:=Edit1. begin if (Key>=#65) and (Key<=#90) Then Key:=#0.//Basılan Tuşu İptal Et end. var Key: Word. • OnKeyPress Yordamı Bu yordam da klavyeden herhangi bir tuşa basılması durumunda otomatik olarak işleyecektir. Özel kontroller koyarak istediğiniz tuşa basılması durumunda kod bloğunuzu işletebilirsiniz. var Key: Char). Hareket sırasında tuşun basılı tutulması yeterli olacaktır. Aralarındaki tek fark.Top:=Edit1. 571 .Edit3KeyPress(Sender: TObject. procedure TForm5.Left+50 //sağa else if Key=VK_DOWN Then Edit1. Formunuzun “Keypreview” özelliğini true yapıp aşağıdaki kod bloğunu “Unit” pencerenize ekleyiniz.

procedure TForm5. var Key: Char). Aşağıdaki gibi bir kodla sadece büyük ve küçük harf girişine izin veren bir Edit kontrolü yaratabilirsiniz. “OnKeyPress” yordamı “OnKeyDown” yordamından hemen sonra işler (OnKeyUp tan hemen önce). var Key: Char). Yani “OnKeyDown” yordamında “Key:=#0.Edit4KeyPress(Sender: TObject. 572 . Diğer yordamlar basılan tuşun ne olduğunu algılamayacaktır. end. procedure TForm5.Edit3KeyPress(Sender: TObject. “OnKeyDown” yordamında ise tamsayı tipli bir değişkendir. Uyarı:Klavyeden basılan tuşları tetikleyici olarak kullanacaksanız.Aşağıdaki örnekte de sadece rakam girişine izin veren bir “Edit” kontrolü oluşturulmaktadır. procedure TForm5. //Rakam Değilse İptal Et begin if (Key>=#58) or (Key<=#47) Then Key:=#0.” satırını kullanamazsınız. İkinci farkları ise prosedür içerisinde tanımlanan “Key” parametresi “OnKeyPress” yordamında “Char” tipli. Kodlarınızı bu üç yordam dan bir tanesine yazmalısınız. end. //Sadece karakter girişine izin ver begin if not((Key>=#65) and (Key<=#123)) Then Key:=#0. var Key: Char). Veya aynı kodu aşağıdaki şekilde de yazabilirsiniz. begin if (Key>=Chr(58)) or (Key<=Chr(47)) Then Key:=#0.Edit5KeyPress(Sender: TObject. Burada “OnKeyDown” ile “OnKeyPress” yordamları arasındaki farktan bahsetmek istiyorum.//Basılan Tuşu İptal Et end.

başka bir formdan diğer formu gizleyin (Hide komutuyla).Free.FormHide(Sender: TObject). Butona tıkladıktan sonra size bir uyarı gelebilir önemsemeyin. “Hide” komutundan sonra verilecek olan “Show” komutuda bu yordamın işletilmesi için yeterli olacaktır. Bu örneği çalıştırabilmeniz için formunuzu başka bir formdan gizleyip göstermelisiniz.FormShow(Sender: TObject). end. begin ShowMessage('Tamam'). Programı çalıştırıp. • OnHide Yordamı Formun gizlenmesi durumunda otomatik olarak işleyen bir yordamdır. Normal şartlarla kapatılan bir formun “OnDestroy” yordamı işletilmez. bu durum event ın işletilmesini sağlamaktadır. • OnShow Yordamı Formun kullanıcı tarafından görünebilir hal alması bu yordamı otomatik olarak işletecektir. end.FormDestroy(Sender: TObject). 573 . procedure TForm5. begin ShowMessage('Form Gizlendi'). end.• OnDestroy Yordamı Kontrol bellekten atılırken otomatik olarak işleyen bir yordamdır. Aşağıdaki kodlamada “Free” komutu kullanılarak form yok edilmekte. procedure TForm5.//OnDestroy yordamını işlet end. begin ShowMessage('Form Gösterimde'). begin Form5. procedure TForm5. procedure TForm5.Button1Click(Sender: TObject).

574 .

BÖLÜM 15 DELPHI’DE DRAG & DROP 575 .

576 .

X. Bunu sağlayan satırda.ListBox2DragOver(Sender. Şayet sürüklenen nesne bir ListBox ise o zaman içeriğini üzerine bırakmasına izin verecektir. State: TDragState.ListBox1MouseDown(Sender: TMouseButton. Source: TObject. Y: Integer. Bu değişkene “true” değerini aktarırsanız tipler uyuyor nesne üzerine bırakılabilir anlamı taşıyacaktır. procedure TForm1. end. Y: Integer). begin if Source=ListBox2 Then//sürüklenen listBox ise bırakmaya izin ver Accept:=true. 577 . procedure TForm1. X. Shift: TShiftState. Bu yüzden kaynak (source) ile bırakılacak nesnenin veri tiplerinin aynı olmasına dikkat ediniz.//sürüklemeyi başlat end. Sürükleme işlemi genellikle “OnMousDown” veya “OnMousMove” yordamından tetiklenir. Aşağıdaki şekilde bu kontrolü gerçekleştirebilirsiniz. İkinci olarak kaynağın bırakılacağı kontrolün “OnDragOver” yordamında içeriklerin uyuşup uyuşmadığını kontrol etmelisiniz. Sebebi çok basittir sürüklenen kaynak bir resimse ve siz bu resmi bir ListBox kontrolü üzerine bırakırsanız sonuç hayal kırıklığı yaratacaktır. Button: “Object Inspector” penceresinden “DragMode” özelliğine “dmAutomatic” değerini aktarırsanız her halükarda sürükleme işlemi yapabilirsiniz (biz kodla yapılmasını tavsiye ediyoruz).BeginDrag(true). Koda dikkat edecek olursanız sürüklenen kaynağın tipi kıyaslanmaktadır. prosedür içerisinde tanımlanan Boolean tip “Accept” değişkenidir. Şayet sürüklenen nesne bir resim olsaydı burada “Accept” değişkenine “false” değerini aktarmanız gerekecekti. TObject. Aşağıdaki gibi bir kodla “ListBox” kontrolü üzrinde iken mousun sol tuşuna basılmasıyla “Drag-Drop” işlemini başlatabilirsiniz.Drag & Drop (Sürükle-Bırak): Drag-Drop olayı mous tuşu basılıyken bir kontrolü sürükleyip diğerinin üzerine bırakılması sonucu oluşur. var Accept: Boolean). begin if Button=mbLeft Then ListBox1.

//sürükleme başlasın end.Shift: TShiftState. Y: Integer).Strings[ListBox1. Bu yöntem bir çok profesyonel uygulamada sıkça kullanılmaktadır.Strings[ListBox1.ListBox1MouseDown(Sender: TObject.Items. Şimdi aşağıdaki tasarımı oluşturup gerekli kodlarıda “Unit” penceresine giriniz. X. Source: TObject.itemIndex]) end.Add((source as TListBox). begin ListBox2. begin ListBox2. procedure TForm1. begin if Button=mbLeft Then//mousun sol tuşuna tıklanırsa ListBox1.ListBox2DragDrop(Sender. Source: TObject. Aşağıdaki gibi bir kod bloğu kullanırsanız ListBox1 nesnesinden sürüklemeye başlayacağınız satırı ListBox2 kontrolüne aktarabilirsiniz. 578 . procedure TForm1.Items.BeginDrag(true).Items. procedure TForm1. X.Son adım olarak bırakılacak nesnenin “OnDragDrop” yordamına yazacağınız kodla kaynak için gerekli işlemleri yaptırabilirsiniz.itemIndex]) //sürüklenen satırı ekle end.Add((source as TListBox). Y: Integer).ListBox2DragDrop(Sender. Button: TMouseButton. Y: Integer). X.Items.

itemIndex]). Button: TMouseButton. Y: Integer. X.ItemAtPos(nokta. begin if Source=ListBox2 Then//sürüklenen nesne ListBox ise Accept:=true.ListBox3DragOver(Sender.ListBox3DragDrop(Sender.//sürüklenen list ise bırakmaya izin ver end. Source: TObject.procedure TForm1.Items.X:=x.Strings[ListBox1. procedure TForm1. end. var Accept: Boolean). State: TDragState.ListBox1MouseDown(Sender: TObject.true). begin nokta.ListBox2DragOver(Sender. var Accept: Boolean). procedure TForm1. Y: Integer. State: TDragState. Programınızı çalıştırıp sol taraftaki “ListBox” kontrolündeki sürükleyerek ikinci ListBox kontrolü üzerine bırakınız.//sürüklemeyi başlat end. satir:=ListBox3.//kaynağı bırakmaya izin ver end. begin if Source=ListBox1 Then Accept:=true. Y: Integer).(source as TListBox).Insert(satir. X. 579 .BeginDrag(true). satırları Şayet kaynağı bıraktığınız satıra (araya ekle) eklemek isterseniz o zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz. X. Source: TObject. satir:Integer.Items.//üzerinde bulunduğu satır numarası ListBox3. procedure TForm1. var nokta:TPoint. nokta. Shift: TShiftState. Source: TObject. X. Y: Integer).Y:=y. //Başlat begin if Button=mbLeft Then ListBox1.

Aşağıda alabileceği tüm seçenekler verilmiştir.(source as TListBox). Bu satır “OnDragDrop” yordamına yazılmalıdır.Insert(satir. Bu özellikte dikkat edeceğiniz husus sürüklenen nesneden sonra belirleneceğidir.BeginDrag(true). Bu satır sayesinde ListBox1 den seçilmiş olan satır ListBox2 ye eklenmektedir. ListBox3.Items. resimler için farklı (örnek verilecektir) vs olacaktır. Genellikle de “OnMousDown” yordamına eklenir. ListBox1.Items.itemIndex]).//sürüklemeyi başlat • (source as TListBox). • BeginDrag DragMode değerinin “dmManual” olduğu durumlarda (biz böyle olmasını tavsiye ediyoruz) sürükleme işlemini başlatan komuttur.itemIndex] Sürüklenen kaynağa ait içeriğin tutulduğu methoddur. 580 . Başlatma işlemi parametre olarak true değerinin aktarılması ile olur. • DragCursor Sürükleme işlemi yapılırken cursor ün alacağı şekil bu özellikle belirlenir.Items.Strings[ListBox1. Text verileri için farklı (yukarıda örnek verilmiştir).Strings[ListBox1.Her ne kadar örnekler yeterli derecede açıklayıcı olsada biz yinede kullandığımız “Sürükle-Bırak” a ait komutlara tekrar bir göz atalım.

end. X. Prosedürde tanımlı bulunan “Accept” parametresi.Dragging=True Then begin Accept:=true.procedure TForm1. begin if Source=ListBox1 Then begin Accept:=true. State: TDragState.Dragging Then begin Accept:=false.//izin verme Image1.DragCursor:=crHandPoint.DragCursor:=crHandPoint. procedure TForm1. var Accept: Boolean). ListBox1. end else if Image1. Çünkü sürüklenen nesnenin hangisi olduğu. Y: Integer. Source: TObject.ListBox3DragOver(Sender. Source: TObject.DragCursor:= crNo. Yukarıdaki kodda sadece ListBox1 den sürüklenme başlarsa Cursor seklini değiştirecektir. end. begin if ListBox1. Y: Integer. • Dragging Birden fazla kontrolden sürüklenme işlemi başlatılabiliyorsa bu özellik son derece önem arz edecektir. var Accept: Boolean). üzerinden geçilen 581 . • OnDragOver Yordamı Sürüklenen nesne kontrolün üzerinden geçerken bu yordam otomatik olarak işler. State: TDragState. dolayısıyla ne tür bir işlemin uygulanacağı bu özellik tarafından belirlenebilmektedir.ListBox3DragOver(Sender.//cursor değişsin end. X. ListBox1. end.

//sürüklenen list ise bırakmaya izin ver end. Tekrar aynı koltuğun satışını engellemek amaçlı koltuk aktifliğini kaybedecek bir daha sürükle bırak olayına izin vermeyecektir.Y:=y.//üzerinde bulunduğu satır numarası ListBox3. Programda “Image” kontrolü sürüklenip koltukların üzerine bırakıldığı anda. X.kontrole içeriğin bırakılıp bırakılmayacağını belirler. Kullanılan tasarım burada sadece şematize edilmiş olup tabiiki resimleri ve görüntüsü çok daha farklı olarak oluşturulmuştur.(source as TListBox). Gerekli olan tüm kodlar buraya yazılabilir.ListBox3DragDrop(Sender. o koltuğun satıldığına dair uyarı ListBox kontrolü içerisine eklenmektedir.itemIndex]). Source: TObject. var Accept: Boolean). end. nokta. procedure TForm1. begin nokta. State: TDragState. begin if Source=ListBox1 Then Accept:=true. Source: TObject.true). Drag & Drop işlemlerini daha iyi anlayabilmeniz için aşağıdaki örneği dikkatlice inceleyiniz. procedure TForm1. X.Items. “True” değerinin aktarılması kaynağın nesne üzerine bırakılabileceği anlamını taşımaktadır. Prosedürde tanımlı olan x ve y değişkenleri mousun kontrol üzerinde o anda bulunduğu koordinat değerlerini tutmaktadır.ListBox3DragOver(Sender. 582 .Strings[ListBox1. Y: Integer). satir:=ListBox3.Insert(satir. //Araya Ekle var nokta:TPoint.ItemAtPos(nokta. Y: Integer. • OnDragDrop Yordamı Sürüklenen Nesne kontrolün üzerine bırakıldığı zaman bu yordam otomatik olarak işleyecektir.Items.X:=x. satir:Integer.Bu koordinatlar bazen son derece işinize yarıyabilir. Uygulamayı bir sinema için tasarladım ve hala aktif olarak kullanılmaktadır.

on (10) adet Image.BeginDrag(true).Image9MouseDown(Sender: TObject. //sürükleme işlemi başlasın end. 583 . Button: TMouseButton. begin Image10.FormCreate(Sender: TObject). Formunuza sekiz (8) adet panel. State: TDragState. Gerekli olan tüm kod aşağıda verilmiştir. procedure TForm2. procedure TForm2. X. X. bir (1) adet ListBox. begin if Button=mbLeft Then Image9. kullanıcı iptal edilecek olan koltuk numarasını girdikten sonra o numara ListBox içerisinde bulunup siliniyor. Shift: TShiftState. var Accept: Boolean).Gelelim bilet iptal düğmesine. ardından ListBox tan silinen koltuğa tekrar satılabilsin diye aktifliği geri kazandırılmaktadır. bir (1) adette Button kontrolü yerleştirin. Y: Integer. Source: TObject.//Gizle end. Aşağıdaki tasarımı oluşturunuz.Visible:=false. Y: Integer). procedure TForm2. bir (1) adet GroupBox.Image1DragOver(Sender.

Enabled:=false.DragCursor:=crHandPoint. Source: TObject.Image3DragOver(Sender. end. 584 . X.Add('1 Numaralı koltuk satıldı').Add('2 Numaralı koltuk satıldı'). Source: TObject.DragCursor:=crHandPoint.DragCursor:=crHandPoint.//ikinci kez satılamasın ListBox1.//Bırakmaya izin ver Image1. Y: Integer. end. end. procedure TForm2. Image2.//Bırakmaya izin ver Image1. Source: TObject. begin Image1. procedure TForm2. end. procedure TForm2.Picture:=(Source as TImage).Image1DragDrop(Sender. Y: Integer).Enabled:=false. var Accept: Boolean). begin if Source=Image9 Then begin Accept:=true. Y: Integer).Image2DragOver(Sender.Picture. end. end. Image1. procedure TForm2. X. begin Image2.//Bırakmaya izin ver Image1. X. end. var Accept: Boolean). State: TDragState. end.Image2DragDrop(Sender.begin if Source=Image9 Then begin Accept:=true.//ikinci kez satılamasın ListBox1.Picture.Items. Y: Integer.Picture:=(Source as TImage).Items. X. Source: TObject. begin if Source=Image9 Then begin Accept:=true. State: TDragState.

end.//Bırakmaya izin ver Image1.Image7DragOver(Sender. begin if Source=Image9 Then begin Accept:=true. begin if Source=Image9 Then begin Accept:=true. Source: TObject.Image8DragOver(Sender. X.DragCursor:=crHandPoint.procedure TForm2. end. var Accept: Boolean).DragCursor:=crHandPoint.DragCursor:=crHandPoint. procedure TForm2. end.DragCursor:=crHandPoint. end. State: TDragState.Image4DragOver(Sender. procedure TForm2. State: TDragState. Source: TObject. var Accept: Boolean). Y: Integer. Source: TObject. X. Y: Integer. begin if Source=Image9 Then begin Accept:=true. X.Image6DragOver(Sender. Y: Integer. Source: TObject. end. procedure TForm2. State: TDragState. end. 585 . State: TDragState.//Bırakmaya izin ver Image1. end. procedure TForm2. begin if Source=Image9 Then begin Accept:=true. Y: Integer. var Accept: Boolean). Source: TObject. X.//Bırakmaya izin ver Image1. var Accept: Boolean). X.Image5DragOver(Sender.//Bırakmaya izin ver Image1. Y: Integer. end.

Enabled:=false. Y: Integer).Image4DragDrop(Sender. Image3.Add('4 Numaralı koltuk satıldı').Add('3 Numaralı koltuk satıldı'). begin Image5. Image6.Image3DragDrop(Sender. procedure TForm2. end.Picture. begin if Source=Image9 Then begin Accept:=true. Y: Integer). procedure TForm2.Items. end.//ikinci kez satılamasın ListBox1.//ikinci kez satılamasın ListBox1.Image5DragDrop(Sender. end. Source: TObject. begin Image3. Image7.Items. procedure TForm2.Enabled:=false.//ikinci kez satılamasın ListBox1.Picture. X.//ikinci kez satılamasın ListBox1.State: TDragState. Y: Integer). X. 586 .Add('7 Numaralı koltuk satıldı'). Source: TObject. Y: Integer). begin Image6. Image4.Picture. X.//ikinci kez satılamasın ListBox1.Picture. Image5.Picture:=(Source as TImage). end. Source: TObject.Image6DragDrop(Sender. procedure TForm2. Source: TObject.Enabled:=false.Picture. Y: Integer). end. X. var Accept: Boolean).Add('5 Numaralı koltuk satıldı').Image7DragDrop(Sender.Add('6 Numaralı koltuk satıldı').Picture:=(Source as TImage). begin Image7. Source: TObject.Picture:=(Source as TImage).Picture:=(Source as TImage).//Bırakmaya izin ver Image1.Picture:=(Source as TImage). X. procedure TForm2.Items.Enabled:=false. begin Image4. end.Items.DragCursor:=crHandPoint.Items.Enabled:=false.

Picture.Enabled:=true.Picture:=Image10.//tekrar satılabilir Image3. Image8.//ikinci kez satılamasın ListBox1.Picture:=Image10.Picture:=Image10.'İptal'. //koltuğu sil ShowMessage(koltuk+' Numaralı Koltuk İptal Edildi').Enabled:=true.Picture:=(Source as TImage). procedure TForm2. for i:=0 to adet-1 do begin if ListBox1. if koltuk='1' Then begin Image1.Button1Click(Sender: TObject). X.//tekrar satılabilir Image1.Items. Y: Integer).//Eski resmi al end else if koltuk='3' Then begin Image3. begin Image8.'').//Eski resmi al end else if koltuk='5' Then 587 .Items.end. end.Enabled:=true. koltuk:=InputBox('İptal Edilecek Koltuk Numarasını Giriniz'.Picture.Enabled:=false.Picture.Picture:=Image10.//tekrar satılabilir Image2. Source: TObject.Image8DragDrop(Sender.Picture.Delete(i).//tekrar satılabilir Image4.Picture. procedure TForm2.//Eski resmi al end else if koltuk='2' Then begin Image2.adet:Integer.//Eski resmi al end else if koltuk='4' Then begin Image4.Items[i]=koltuk+' Numaralı koltuk satıldı' Then begin ListBox1.Enabled:=true.Items. i. begin adet:=ListBox1.Add('8 Numaralı koltuk satıldı'). var koltuk:AnsiString.Count.

//Eski resmi al end.//tekrar satılabilir Image6.Picture.Enabled:=true.//Eski resmi al end else if koltuk='7' Then begin Image7.Picture:=Image10.//tekrar satılabilir Image7.Picture:=Image10. end.Picture. 588 .begin Image5.Enabled:=true.Picture:=Image10.Enabled:=true.//tekrar satılabilir Image5. break.//tekrar satılabilir Image8.//Eski resmi al end else if koltuk='8' Then begin Image8.//Eski resmi al end else if koltuk='6' Then begin Image6.Picture:=Image10.Picture. end . end.Picture.Enabled:=true.

Satılan bir koltuğu “Bilet İptal” düğmesine tıklayarak iptal edebilir. Satılan koltukların farklı resimler içerdiği sanıyorum dikkatinizi çekmiştir. BÖLÜM 16 DELPHI’DE KONTROLLERİ & YORDAMLARI KODLA OLUŞTURMAK 589 .Uygulamaya ait en son durum yukarıda verilmiştir. başka bir müşteriye tekrar satabilirsiniz.

590 .

FormActivate(Sender: TObject).// muhakkak ekleyin end. Şimdi bu hususu açıklığa kavuşturacağız. var yenitext: TEdit.100. İlk Olarak aşağıdaki gibi formun üzerinde olmayan bir Edit kontrolünü yaratalım.//left=0.top=0.Create(Form1). begin yenitext:=TEdit. Kodu aşağıdaki yaratabilirsiniz.Parent:=Form1.20).//yarat yenitext.width=100. procedure TForm1. Sizde kolayca gerekli özelliğini değiştirip veya ilgili yordama gerekli kodu yazarak sonuca ulaşabilirsiniz. Peki tasarım anında sayısı belli olmayan kontroller için nasıl bir işlem yapılabilmektedir. Örnek olarak formun üzerine sürükleyip bıraktığınız bir kontrol için Delphi otomatik olarak tüm yordamlarını ve özelliklerini belirleyecektir.SetBounds(0.Kontrolleri ve Yordamları Kodla Oluşturmak: Tasarım Anında oluşturduğunuz tüm kontrollerin program içerisinde bir kod karşılığı vardır. şekilde değiştirirseniz bu seferde Button kontrolü 591 .0.height=20 yenitext.

592 .//tıklanınca bu prosedürü işlet end. yenibutton:TButton. yenibutton.Caption:='Tıkla'. yenibutton. Şimdi olayı biraz daha derinleştirip oluşturmuş olduğumuz buttonun “OnClick” olayını yaratarak tıkladığımız zaman bu kodu işletelim.40.FormActivate(Sender: TObject). yenibutton.procedure TForm1.OnClick:=yenibutton_Click. begin yenibutton:=TButton. yenibutton. procedure TForm1.Parent:=Form1.FormActivate(Sender: TObject). //eklemeyi unutmayın { Private declarations } public { Public declarations } end. yenibutton.40.//etiketini belirle end.Caption:='Tıkla'.20). yenibutton.Parent:=Form1. var yenitext: TEdit.0.Create(Form1). Görüldüğü gibi kodla kontrol oluşturmak düşündüğünüzden çok daha kolay olmaktadır.20). private procedure yenibutton_Click(sender:TObject).Create(Form1).SetBounds(0. end.0. yenibutton. Kodla yaratmış olduğumuz kontrole tıklanınca prosedürü nasıl işletebileceğimizi adım adım açıklayalım. var yenibutton:TButton. procedure TForm1. begin yenibutton:=TButton. begin ShowMessage('Teni Buttona Tıkladınız'). type TForm1 = class(TForm) procedure FormActivate(Sender: TObject).yenibutton_Click(sender:TObject).SetBounds(0.

private procedure yenibutton_Click(sender:TObject).0. begin yenibutton:=TButton.Create(Form1). end.OnClick:=yenibutton_Click.Parent:=Form1. İmleç yukarıdaki satıda iken “Ctrl+Shift+C” tuşlarına beraberce basarsanız prosedürünüzü Delphi otomatik olarak oluşturacaktır. yenibutton. Burada yaratılan yenibutton isimli kontrole tıklanınca “yenibutton_Click” yordamının işletilmesini sağlayan satır aşağıda verilmiştir. var yenibutton:TButton.20).Caption:='Tıkla'. procedure TForm1.Birinci adımda formun “public” veya “private” kısmında işletilecek olan prosedürü tanımlayın. //eklemeyi unutmayın { Private declarations } public { Public declarations } end.40. İkinci adımda kontrole tıklanıldığı zaman işletilecek olan kodu yazacağınız prosedürü oluşturun. begin ShowMessage('Teni Buttona Tıkladınız'). yenibutton.OnClick:=yenibutton_Click. type TForm1 = class(TForm) procedure FormActivate(Sender: TObject).FormActivate(Sender: TObject).SetBounds(0. Üçüncü adımda aşağıdaki kodu yazarak kontrolünüzü yaratınız. yenibutton. procedure TForm1.yenibutton_Click(sender:TObject). yenibutton.//prosedürü işlet end. yenibutton.//prosedürü işlet 593 .

implementation {$R *. Klavyeden girilen tüm karakterlerin formun başlığında yazdığını göreceksiniz.var //unutmayın { Private declarations } public { Public declarations } end. begin yenitext:=TEdit.yenitext_KeyPress(sender: TObject.FormCreate(Sender: TObject). var Form1: TForm1. //eklemeyi 594 .dfm} procedure TForm1.0.Şimdi kodla Edit kontrolü yaratıp “OnKeyPress” yordamını oluşturacağım.OnKeyPress:=yenitext_KeyPress.SetBounds(0. private procedure yenitext_KeyPress(sender:TObject. yenitext. var yenitext: TEdit.//ekle yenitext.Caption:=Key. yenibutton:TButton. type TForm1 = class(TForm) procedure FormActivate(Sender: TObject). Programınızı çalıştırıp Edit kontrolü içerisine tıklayın. procedure FormCreate(Sender: TObject).Create(Form1).20). Dikkatlice inceleyiniz. procedure TForm1.Parent:=Form1.100.//işlet end. begin Form1. yenitext. İzlenen adımlar yukardaki örnekte olduğu gibi gerçekleştiği için extra anlatacak bir husus bulunmamaktadır.//başlıkta yaz end. var Key: Char). Key:Char).

//yarat Button2:=TButton. begin if Sender=Button1 Then//ilk düğme tıklanırsa ShowMessage('İlk Düğmeye Tıkladınız') else if Sender=Button2 Then//ikinci düğme tıklanırsa ShowMessage('İkinci Düğmeye Tıkladınız'). Button1. Fakat ikisinin işleteceği kodlar farklı olacaktır.Caption:='İkinci Düğme'.SetBounds(0.SetBounds(0. Button2.20).40.Create(Form2). type TForm2 = class(TForm) procedure FormCreate(Sender: TObject).//yarat Button1. end.dfm} var Button1. Button2.Button2: TButton. Lütfen dikkatlice inceleyiniz.//tıklayınca işlet Button2. procedure TForm2.Caption:='İlk Düğme'.//global değişken olacak procedure TForm2.OnClick:=ikikontrol. Button1. 595 .Parent:=Form2.ikikontrol(Sender: TObject).//tıklayınca işlet end. Button2. var Form2: TForm2.FormCreate(Sender: TObject). implementation {$R *. private procedure ikikontrol(Sender:TObject).0.Create(Form2). begin Button1:=TButton.Parent:=Form2.İki Kontrolun Aynı Yordamı Kullanması: Aşağıdai kodla iki kontrol yaratıp aynı prosedürü işletmesini sağlayacağız. Button1.20).OnClick:=ikikontrol.40.//Tanımlamayı unutmayınız { Private declarations } public { Public declarations } end.40.

Burada yer alan “OnClick” yordamına aşağıdaki kodu ekleyiniz. Artık Button1 veya Button2 düğmelerinden hangisine tıklarsanız tıklayın “Button1Click” yordamını işletirsiniz. procedure TForm2.Button1Click(Sender: TObject). Bu adımda “Button2” kontrolünü seçerek “Object Inspector” penceresindeki “Events” yaprağına geçin. Daha sonra Düğmeleri oluşturup yeni tanımlanan bu prosedüre ait kodların işletilmesini sağlamak (daha önceki örnekte anlatıldı). end.Koda dikkat edecek olursanız ilk yapılan işlem “ikikontrol” isimli. her defasında farklı uyarı alacaksınız. 596 . Bu yaprakta yer alan “OnClick” yordamına çift tıklamadan sağında yer alan oka tıklayın. Burada dikkat edeceğiniz diğer bir husus “Sender” parametresi kullanılarak hangi düğmeye tıklanıldığı anlaşılabilmektedir. Ardından “Object Inspector” penceresinde yer alan “Events” yaprağına geçin. Şimdi de tasarım anında forma eklenmiş iki buttonun aynı yordamı kullanmasını sağlayalım. begin if Sender=Button1 Then ShowMessage('İlk Buttonu Tıkladınız') else if Sender=Button2 Then ShowMessage('İkinci Butonu Tıkladınız'). Dilerseniz ikiden fazla kontrol için de aynı işlemi yapabilirsiniz. Buttonlara tıklanıldığı zaman işletilecek ortak prosedürü tanımlayıp kodlarını eklemek. Şimdi programınızı çalıştırıp iki düğmeyede tıklayın. Açılan listeden “Button1Click” yordamını seçiniz. İlk olarak formunuza iki adet Button kontrolü yerleştirin.

procedure TForm2. Aşağıdaki kodu da Unit pencerenize ekleyiniz. Şimdiki konumuz aşağıdaki gibi bir kontrol dizisi tanımlayarak. kontrolün tasarım anında eklenmesi veya kodla oluşturulması gibi bir sorunu bulunmamaktadır. 597 . Kodlamada kullanılan “Sender” parametresinin. begin if Sender=Button1 Then//tıklanan ilk düğme ise ShowMessage('İlk Buttonu Tıkladınız') else if Sender=Button2 Then//ikinci düğme ise ShowMessage('İkinci Butonu Tıkladınız'). Bu hususta üstteki örneği inceleyebilirsiniz.Button1Click(Sender: TObject).Aşağıdaki pencerede “Button2” ye tıklanıldığı zaman “Button1Click” yordamını işletebilmek için yapmanız gereken işlem gösterilmektedir. end. kontrolleri formun içerisinde sola-sağa doğru hareket ettirmek olacaktır.

procedure TForm3. procedure Timer1Timer(Sender: TObject).SetBounds(sol. begin if yon=false Then 598 . end. var i:Integer.Timer1Timer(Sender: TObject). var i:Integer.2] of TEdit. private text:Array[0. procedure FormCreate(Sender: TObject). Text[i].Parent:=Form3. begin sol:=0.//Dizi Değişkeni burada tanımlayın { Private declarations } public { Public declarations } end.Interval:=10.Create(Form3). procedure TForm3. type TForm3 = class(TForm) Timer1: TTimer. sol.//yarat text[i]. Timer1.ust:Integer.ust*30*i.Kontrol dizisimni formun private veya public kısmında aşağıdaki şekilde tanımlayınız... text:Array[0.//Kontrol dizisi Programa ait tüm kod bloğu aşağıda verilmiştir.FormCreate(Sender: TObject). end.2] of Tedit. for i:=0 to 2 do begin text[i]:=TEdit. {$j+} const yon:Boolean=false.20). ust:=1.40.

Unutmayınız:Dizi Değişkenler her zaman tercihiniz Olmalı. Döngüleri ve dizi değişkenleri iç içe çok iyi kullanabilen bir programcının altından kalkamayacağı hiç bir sorun olamaz. 599 . end.Left>=Form3.//sola dön end else begin text[i].Left:=text[i].//sağa dön end else begin text[i]. end.Left:=text[i].Left<=0 Then//sol köşeye geldiyse begin yon:=false.begin for i:=0 to 2 do begin if Text[i]. end.//10 birim sola end.Width Then//sağ köşede ise begin yon:=true.Left+10. end else begin for i:=0 to 2 do begin if Text[i]. end.Left-10.Width-text[i].//10 birim sağa end. Programı çalıştırdıktan sonra kodla oluşturduğunuz kontroller formun boyutlarını aşmadan sola ve sağa doğru hareket edecektir.

600 .

BÖLÜM 17 DELPHI’DE VERİTABANI 601 .

602 .

Biz uygulamalarımızda Delphi’nin en verimli kullanabildiği “Paradox” tablolarından faydalanacağız. Bu yapraktaki kontroller sayesinde kolayca veri tabanlarını tablolarına bağlanabilmektedir. Dikkat ettiyseniz yazmış olduğunuz kodlar dışında.Ver Tabanı Uygulamaları: Bu bölüme kadar yapmış olduğunuz uygulamalar. Şunu unutmayın bilgilerin tutulduğu yer Delphi değildir. Delphi de size sağladığı imkanla bu veri tabanı bilgilerini istediğiniz gibi kullanmanızı sağlar. kullanıcı arayüzünü oluşturmayı ve tetikleyiciler le kodları nasıl işletebileceğinizi anlamaya yönelikti. Daha sonra Delphi ile bu veritabanı uygulamalarına bağlanıp gerekli bilgilere ulaşabilmekteyiz. Profesyonel uygulamalarınızda günlük düzenli olarak rapor tutmanız gerekecektir.Access.SQL Server vs). Delphi7’de Veitabanı bağlantılarını gerçekleştirmek için “Component Palet” araç çubuğunda bulunan “BDE” Yaprağını kullanır.Dbase. Bilgiler veritabanı programlarına kaydedilir (Paradox. 603 . girmiş olduğunuz tüm bilgiler programı kapatıp açınca kaybolmaktadır. Yine “Component Palet” yaprağında bulunan “Data Controls” kontrolleriyle de tabloları yönetmek için kullanıcıya gerekecek olan ara yüz oluşturma seçenekleri sunulmaktadır. Şayet çok büyük network uygulamaları oluşturacaksanız SQL Server veya Oracle kullanmalısınız. Bu yüzden bu verileri daha sonra kullanmak amaçlı bilgisayarınızda saklamalısınız. Bilgisayara veri saklama işlemlerlerini düzenli bir tablo yapısına sahip olan veritabanı programlarıyla gerçekleştirmekteyiz.

bilhassa çok fazla satır içeren tablolarda tavsiye etmiyorum. Bu kontrolle Table kontrolünün yaptığı gibi hiç bir kriter koymadan tüm tablo bilgilerine de kolayca ulaşabilirsiniz. Lokal bilgisayarda ana tablonun birebir bir kopyası oluşturularak yapılan değişiklikler bu kontrole yazılırlar. Tüm dillerin kullandığı yapıda budur. Ben bu kontrolle veritabanına bağlanmanızı (zorunlu kalmadığınız sürece) . Bu yüzden performansı en üst düzeyde tutmak için bilgi girişleri tüm kullanıcıların local mekinelerinde yapılır. 604 . Doğrusunu isterseniz bu sistem online gönderimler dışında çok etkili olmuştur. • StoredProc Kontrolü: Veri Tabanı tablolarına en hızlı ve etkili bağlantı sağlayan “BDE” kontrolüdür. Tabiidirki bu kitapta da bu konuya yer vermedik değil. Şimdi diğer kontrollere geçelim. • Table Kontrolü: Bu kontrol sayesinde veritabanında bulunan tablo ile direk bağlantı kurulur. “Stored procedur’ler çalıştırıldıkları andan kapatılana kadar sadece bir kere derlenirler. “StoredProc” kontrolünden sonra bağlantı işlemleri için en çok kullanacağınız kontrol olduğunu belirtmek isterim. Direk veritabanıyla çalışmak bir çok durumda (bilhassa network ortamında binlerce kişinin aynı tabloya bilgi girdiğini düşünürseniz) performans açısından sakınca yaratmaktadır. bu da “Query” kontrolüne göre ilk çalıştırılmadan sonra çok daha hızlı sonuç vermesini sağlamaktadır. Daha sonra müsait bir zamanda tüm değişiklikler veri tabanı tablosuna tekrar yazdırılır. çok şey öğreneceğinizden eminiz.BDE Kontrolleri: Veritabanı bağlantı işlemlerini gerçekleştiren kontroller bu yaprakta bulunur. Şimdi sizlere bu çalışma imkanlarını oluşturan “BDE” kontrollerine bir göz atalım. müsait bir zaman dada servera gönderilir. Bu tür bağlantıda tablonuzdaki tüm satırlara (isterseniz tüm tabloyuda alabilirsiniz) değil sadece sizi ilgilendiren satırlara ulaşmak için kullanılır. • Query Kontrolü: Veri Tabanı tablolarınızı sorgulayarak local makinenize indiren kontroldür. trafiği azaltmak için servera sadece parametre göndererek tekrar tekrar tabloların derlenmemesini sağlamaktır. Bu kontrolle yapılan bağlantıdaki amaç. Ama bağlantı mantığını anlamanız açısından kesinlikle çok iyi bilinmesi gerektiğini düşünüyorum. Bu kontrol “DELPHİ7” kitabından sonra çıkaracağımız “VERİTABANI ve NETWORK PROGRAMCILIĞI” kısmında çok detaylı olarak incelenecektir (SQL Server bağlantılarında).

Bu yüzden örneklerimizi (çok büyük yazılımlar hariç en çok bu veri tabanı kullanılır) bu tablolar üzerinde yoğunlaştıracağız. “Start->Settings->Control Panel” seçeneklerini arka arkaya tıklayın. Paradox Tablolarına Bağlantı: Delphi’nin en performanslı çalışma yaptığı Veri Tabanı Paradox’tur. Yapacağınız bağlantılarda tablonun yolunu değilde belirlemiş olduğunuz bu Alias ‘ı kullanırsınız. Karşınıza aşağıdaki pencere açılacaktır. Açılan pencereden “BDE Administrator” seçeneğine çift tıklayın. Alias Tanımlamak: Alias lar tabloların bulunduğu adresi tutan takma adlardır. Bu kontrollerden projenize ne kadar çok eklerseniz programınızın o kadar performans kaybedeceğini unutmayınız. Daha sonra istenildiği vakit ana tabloya da yansımaları sağlanacaktır. Karşınıza aşağıdaki pencere açılacaktır. Bu yapı sayesinde her defasında tablonun adresini girmek zorunda kalmazsınız. Uygulamaya başlamadan tablolarınızı kaydedeceğiniz klasöre takma ad (Alias) belirlersiniz. Tablo oluşturmaya geçmeden önce ileride çok işinize yarayacak (muhakkak ilk bu işlemi yapın) olan “Alias” tanımlama işleminden bahsetmek istiyorum. 605 . Alias tanımlamak için aşağıdaki adımları izleyin.• Database Kontrolü: Bilhassa Trasaction işlemlerinde kullanılan ve yapılan tüm değişiklikleri yazdırabileceğiniz bir kontroldür. Arayüz kontrollerinde yapacağınız değişiklikler öncelikle bu nesnelerde etkili olacaktır. Yukarıda bahsedilen tüm kontroller kullanıcıya oluşturacağınız arayüz ile Veri Tabanı tabloları arasında ki bağlantıyı oluşturmak içindir.

İsmini değiştirip (gazi) “PATH” kısmınada tablonuzu kaydedeciğiniz klasörü girin (veya seçin) Gördüğünüz gibi biz tablonun kaydedileceği klasörü “c:\prestige” olarak belirledik. Bu pencereyi “OK” Buttonuna tıklayarak geçin.Açılan bu pencerede “DataBase” üzerine mousun sağ tuşuna tıklayarak menü penceresini açın ve “New” seçeneğine tıklayın. Yeni Alias ınız pencerenize “STANDART” ismi ile eklenecektir. 606 . Alias ismi olarak ta “gazi” seçimini kullandık. Aşağıdaki pencere açılacaktır.

Karşınıza aşağıda gösterilen pencere açılacaktır. Alias tanımlaması yaptıktan sonra oluşturacağınız tablolara bu aliası kullanarak erişmek istiyorsanız tablolarınızı “c:\prestige” klasörünün içerisine (çünkü bu klasör path olarak gösterildi) kaydetmelisiniz.sütun uzunluklarını ve index lerinizi belirlemelisiniz. üçüncü sütun kaç karakter veri alabileceğini (tarih ve parasal içeriklerde paradox bu 607 . Bilhassa bağlantıdaki bir tablo tasarımını değiştirmenize paradox izin vermeyecektir) “Start->Programs->Borland Delphi7->DataBase Destop” adımlarını izleyin. Diğer seçenekler zaten Delphi içerisinden çok kolay halledilebileceği için onlarla fazla kafanızı yormanızı tavsiye etmem. Birincisi Delphi yi hiç açmadan (biz bu yolu tavsiye ediyoruz. Paradox’ta Tablo Oluşturmak: Paradox’ta tablo oluşturmak için iki yönteminiz mevcut. gelen uyarı penceresine de olumlu cevap verin. Tablonuzu hangi veri tabanında oluşturacaksanız onu saçmelisiniz. Aşağıda karakteristik özellikleri verilen sütunları burada oluşturunuz. Biz “Paradox” u kullanacağımız için “Paradox7” seçeneğini seçerek “OK” Buttonuna bastık. Bu pencerede destek verilen Veri Tabanlarının isimleri bulunmaktadır. Bu pencerede tablonuzda yer alacak olan sütun isimlerini.sütun tiplerini. Aksi takdirde bu alias işinizi görmeyecektir.Pencereyi kapatıp. ikinci sütun içeriğin tipini (Type kısmında mousun sağ tuşuna basarsanız tüm seçenekler listelenir). Fieeld Name(Sütun İsmi) SIRANO MAGAZAADI SERVISTARIHI GIDENFIRMA ARIZASEBEBI FATURATUTARI Type(Tipi) + A D A A $ 25 25 25 Size (Kaç Karakter) Otomatik artar Key(Primary ind) * Tabloya dikkat edin illk sütun kolon başlıklarını. Tablolar ile ilgili işlemleri yaparken uygulamanızı kapatmanız oluşabilecek sorunları engelleyecektir. Açılan pencereden “File->New->Table” seçeneklerini seçerek aşağıdaki “Create Table” penceresinin açılmasını sağlayın.

Şimdi “Save As” buttonuna tıklayarak tablonuzu “gazi” Aliasının gösterdiği klasörün (“c:\prestige”) içerisine “SERVIS” ismiyle kaydedin.değeri kendisi belirler). 608 . son sütun ise tablonuzdaki Primary index i belirler. “Save As” buttonuna tıkladıktan sonra açılan yukarıdaki pencerede yer alan “Alias” kısmından “gazi” yi seçmeniz “c:\prestige” klasörünü aktif yapmaya yetecektir. İsmini (SERVIS) yazıp kaydedebilirsiniz. “*” koyduğunuz sütun o tablo için Primary index sütunu olacaktır (dikkat edin en üstteki sütunu primary belirleyebilirsiniz).

Uyarı:Tablonuzu başlangıçta düzgün tasarlamaya önem gösteriniz. “Tools->DataBase Destop” adımlarından sonra aynı pencere açılacaktır. Girdiğimiz kayıtlardaki amaç bağlantının doğru olarak kurulup kurulmadığı içindir. Daha önceden kaydettiğiniz tablonuzu (“Alias isminden hemen bulabilirsiniz) seçip “Open” düğmesine basın. Ardından “Table->Restructure” seçeneklerini seçerek tablonuzu oluşturduğunuz pencereye dönebilirsiniz. Burada tablo yapınız için gerekli değişiklikleri yapabilirsiniz. “Table->Edit Data” adımlarını izleyin. DataBase Destop’ı Kullanarak Tabloya Kayıt Girmek: Bu yöntemi fazla kullanmayacaksınız ama örnekleri hızlı denemek için bilmekte fayda var. dosya aç penceresinin açılmasını sağlayın. Bu aşamadan sonra Delphi’den “BDE” kontrollerini kullanarak bu tabloya bağlantı sağlayacağız. Şimdilik yukarıdaki kayıtları “Edit Data” komutunu vererek “Paradox” Veri Tabanı içerisinden giriniz. tablonuzu tekrar oluşturmak zorunda kalabilirsiniz.Daha sonra yapmak isteyeceğiniz fazla radikal değişiklere “Paradox” izin vermeyebilir.Tablo Yapısında Değişiklik Yapmak: Şimdi sizlere ikinci yöntemle (bu yöntemle tabloda oluşturabilirsiniz) tablo yapısında nasıl değişiklik yapabileceğinizi göstermek istiyorum (siz hep birinci yolu takip edin). 609 . DataBase Desktop’ı açtıktan sonra “File->Open” seçenekleri ile tablonuzu açın. tablonuza bu ekrandan kolayca kayıt girebilirsiniz. Yoksa kullanıcı az önceki ekrandan asla kayıt girmeyecektir. Açılan bu pencerede “File->Open->Table” seçeneklerini seçip.

altı (6) adet Label kontrolü ile yine altı (6) adet “DataControls” yaprağında yer alan “DBEdit” kontrolü yerleştiriniz. Dördüncü adımda aşağıdaki form tasarımını oluşturup.Uygulamanızdan Paradox Tablolarına Bağlanmak: Programınız içerisinden Paradox veri tabanına aşağıdaki adımları izleyerek kolayca bağlanabilirsiniz. Yerleştirdiğiniz kontroller ile “Table” nesnesi arasındaki bağlantıyı sağlamak için formunuza bir adet “DataAccess” yaprağında yer alan “DataSource” kontrolü yerleştirin. “Table” kontrolünün “DataBaseName” özelliğine tablonuzun içerisinde bulunduğu klasörü referans gösteren “Alias” ınızın (bizim örneğimizde “gazi”) ismini aktarın. 610 . Birinci adımda formunuzun üzerine “BDE” Yaprağında bulunan “Table” nesnesinden bir adet yerleştin. Bu adımda “Table” nesnenizin “Active” özelliğine “true” değerini aktarın ve aşağıdaki “DBEdit” kontrol ayarlarına geçin. Şayet değiştirmediyseniz “Table1” olarak açılan pencerede gözükecektir. “DataSource” kontrolünü seçip “Object Inspector” pencersinden “DataSet” özelliğine eklemiş olduğunuz “Table” kontrolünüzün ismini aktarın. Üçüncü adımda yine “Table” nesnesini seçerek “Object Inspector” penceresinden “Table Name” özelliğine paradox ta oluşturduğunuz tablonuzun ismini girin (veya seçin). Bizim örneğimizde “SERVIS” tablosu olacaktır.

Yine “Object Inspector” penceresinden “DataField” özelliği için seçmiş olduğunuz tabloya ait uygun sütunu seçin (tüm sütun isimleri bu özellikte gözükecektir). 611 . Aynı şekilde “MEDENI HAL” gibi evet-hayır seçenekleri içeren sütunlar içinse “Logical” tipini seçmeniz gerekecektir.“DBEdit1” kontrolünüzü seçip “Object Inspector” penceresinden “DataSource” özelliğine formunuza eklemiş olduğunuz “DataSource” nesnenizin ismini aktarın (veya seçin). Resimli veya CheckBox İçeren Tablo Sütunlarıyla Bağlantı: Bazı durumlarda tablonuzda kişiye ait resimleri saklamak zorunda kalabilirsiniz. “DataBase Form Wizard” seçeneğini çift tıklayarak sihirbazı işlemleriniz için devreye sokun. Paradox resim alanları için sütun tipinizi “OLE” olarak belirlemenizi ister.”L” harfi true-false içerikler için. “File->New->Other” seçeneklerini izleyerek “New Items” penceresinin açılmasını sağlayın.”+” karakteri otomatik artan sütunlar için. Şayet ismini değiştirmediyseniz “DataSource1” olarak gözükecektir. “O” harfi ise resim türü verileri barındırmak için kullanılmaktadır. Fieeld Name(Sütun İsmi) SIRANO MUSTERIADI MEDENIHALI SATISTARIHI SATILANURUN RESMI Type(Tipi) + A L D A O 25 25 Size (Kaç Karakter) Otomatik artar Key(Primary ind) * Bu tabloda “Type” kısmında kullanılan “A” harfi karakter veriler için. Son adım olarak diğer “DBEdit” kontrolleri içinde aynı iki ayarı yaparak uygulamanızı çalıştırınız. Bu tip durumlarda o sütun için uygun bir tip seçmelisiniz. Şimdi aşağıdaki tabloyu oluşturup program içerisinden bu tabloya bağlanalım. Wizard Kullanarak Veri Tabanına Bağlanmak: Aşağıdaki adımları izleyerek sihirbaz sayesinde kolayca oluşturmuş olduğunuz tabloya bağlanabilirsiniz. Bizim örneğimizde ilk “DBEdit” kontrolü “SIRANO” yu göstereceği için bu ismi seçtik.”D” Tarihsel içerikler için. Tüm kayıt bilgilerinin kontrollere aktarıldığını göreceksiniz. Açılan bu pencereden “Business” yaprağını aktifleştirin.

Aşağıdaki yeni pencere açılacaktır.Aşağıdaki “Database Form Wizard” penceresi açılacaktır. Bu pencerede “Form Options” kısmından “Create a simple form” seçeneğini “DataSet Options” kısmından da “Create a form using “Ttable objects” i seçerek “Next” buttonuna tıklayın. 612 . Bu pencerede “Drive or Alias name” kısmından tablonuzun bulunduğu klasörü referans gösteren “Alias” ınızı seçip “MUSTERI” tablosunu işaretleyin (aynı Alias ın içerisinde istediğiniz kadar tablo yaratabilirsiniz).

613 . “Next” buttonuna tıkladıktan sonra açılan pencereden “Vertical” seçeneğini seçin. Yukarıdaki şekilde her şeyin hazır bulunduğu bir form oluşturacaktır. “Next” buttonuna tıkladıktan sonra açılan pencereden “Left” seçeneğini seçin. Bu pencerede yer alan “Available Fields” kısmındaki tüm sütun başlıklarını “>>” düğmesine tıklayarak “Order Selected Fields” penceresine aktarın. Artık programınızı çalıştırabilirsiniz. “Next” buttonuna tıkladıktan sonra “Form Only” seçeneği işaretli iken “Finish” buttonuyla bitirin.“Next” buttonuna tıkladıktan sonra aşağıdaki pencere açılacaktır.

ImageRESMIDblClick(Sender: TObject). Table1.//yazdır end.FileName. //değişme moduna al ImageRESMI. Diğer işlemleri hiç bir değişiklik yapmadan aynen uygulamalısınız. begin OpenDialog1. Bu örnekte “RESIM” sütununun boş olduğu sanıyorum dikkatinizi çekmiştir. 614 . Aktif kayıda aşağıdaki şekilde ekleyeceğiniz bir kod bloğuyla kolayca resim ekleyebilirsiniz. “MEDENİHAL” Sütunu için “DBEdit” kontrolü yerine aynı yaprakta yer alan “DBCheckBox” kontrolünü kullanmak.Post.Title:='Resim Seç'. var yol:AnsiString.ico|Bmp Dosyaları|*. OpenDialog1.Edit. if OpenDialog1. end.bmp'.Şayet tasarımı bir önceki örnekte olduğu gibi kendiniz yapmak isterseniz.Execute Then begin yol:=OpenDialog1. aynı şekilde “RESMI” Sütunu için de. Table1.LoadFromFile(yol).Filter:='ico Dosyaları|*.Picture. Formunuza “Dialog” yaprağında yer alan “OpenDialog” kontrolünden bir adet yerleştirip aşağıdaki kod satırlarınıda resmi gösteren kontrolün “OnDblClick” yordamına ekleyiniz. procedure TForm3. yine aynı yaprakta yer alan “DBImage” kontrolünü kullanmanız gerekecektir.

En son olarak “Table1. DBNavigator Kontrolü: Bu kontrolü kullanarak kayıtlar arası gezinti. balon içeriklerinin gösterilebilmesi için “ShowHint” özelliğinin “true” olması gerekmektedir. kayıt silme.Edit” satırıyla yapılan işlem budur. İlk Kayıt Önceki Kayıt Sonraki Kayıt Son Kayıt Kayıt Ekle Kayıt Sil Değiştir Kaydet İptal Güncelle İlk Kayda Gider Bir Önceki Kayda Gider Bir Sonraki Kayda Gider En Son Kayda Gider Yeni Boş Kayıt Ekler Aktif Kaydı Siler Kaydı Değiştirme Moduna Al Kaydı Tabloya Yazar Son Yapılan Değişiklikleri İptal Eder Tabloyla yeniden veri akışı oluşturur. Tablo kayıtları üzerinde değişiklik yapılabilmesi için muhakkak “Edit” moduna alınması gerekir. Aksi takdirde Açıklama balon içerikleri var olsa bile kullanıcı tarafından gözükmeyecektir. query veya Stored Procedur). 615 . Yeni kayıt ekleme. Kodla veya “Object Inspector” penceresinden kolayca ayarlanabilir (Genellikle properties penceresinden ayarlamak yeterli olacaktır). Üzerindeki buttonlar ve anlamları aşağıda verilmiştir. Şayet değiştirmediyseniz sütun ismine yakın bir isim alacaktır.Burada hatırlatalım. Yapılan işlem ise resmin üzerine çift tıklandığı zaman “OpenDialog” penceresi açılmaktadır. “Table1.Post” komutuyla yeni resim veri Tabanına yazdırılmaktadır. • Hints Bu özellikle mous kontrolün üzerine geldiğinde o düğmenin ne işe yaradığını gösteren açıklama balonlarının içerikleri belirlenebilir.Kodda kullanılan “ImageRESMI” komutu kontrolün ismidir. kayıt güncelleme işlemlerini kolayca yapabilirsiniz. • DataSource Bu özelliği sayesinde yönetilecek olan kaynak belirlenir (tablo. Aşağıda sizin yabancı olduğunuz en genel özellikleri verilmiştir. Kullanımı son derece basit olan bu özellikler ile “Navigator” kontrolünü en etkili şekilde kullanabilirsiniz. Kontrole “DataControls” yaprağından erişebilirsiniz.

Varsayılan olarak ingilizce yazılan bu değerleri sırayı bozmadan Türkçe karşılıklarına çevirebilirsiniz. Bu aşamadan sonra mousu “Navigator” kontrolü üzerinde bekletirseniz açıklama balonlarınız yukarıda belirtilen türkçe karşılıklarıyla kullanıcıyı bilgilendirecektir. 616 . Pencere içeriklerini aşağıda gösterilen şekilde değiştiriniz.Aşağıdaki “String List Editor” penceresi açıklama balon içeriklerini göstermektedir. “ShowHint” özelliğini true yapınız ve programınızı çalıştırınız.

DBNavigator Kontrolü İçin Tıklanan Düğmeye Kod Yazmak: Her ne kadar “DBNavigator” düğmeleri kendi kodlarını işletsede sizde bu kodlara ekleme yapabilirsiniz.• VisibleButtons Bu özellikle gösterilecek olan düğmeleri belirleyebilirsiniz. Bu yordamda tanımlanan “Button” parametresi tıklanan düğmenin numarasını tutarak programcıya o düğmeye ait ek kod yazma şansı vermektedir. Bu şekilde salt okunur kayıtlar üretebilirsiniz. Yani kullanıcı sadece kayıtlar arası gezinti yapabilecek asla kayıtlarınızı değiştiremiyecektir. Kontrolü seçip “Object Inspector” penceresinden gösterilmesini istemediğiniz buttonun özelliğini “false” yapmalısınız. Button: 617 . Aşağıdaki kodu yazıp programı çalıştırın. Bu işlem için öncelikle “DBNavigator” kontrolünü seçip “OnClick” yordamını oluşturmasını sağlayın. Özelliğini false yaptığınız button artık kullanıcı tarafından gözükmeyecektir. procedure TForm3. Bu aşamada “ilk Kayıt” düğmesine tıklayın. TObject.DBNavigatorClick(Sender: TNavigateBtn). • OnClick Yordamı Bu yordam “DBNavigator” kontrolü içerisindeki düğmelerden hangisine tıklarsanız tıklayın işleyen bir yordamdır. begin if Button=nbFirst Then //ilk düğme tıklanırsa ShowMessage('İlk Kayıda Geldiniz') end.

Button nbFirst nbPrior nbNext nbLast nbInsert nbDelete nbEdit nbPost nbCancel nbRefresh Sonuç İlk Kayıt Buttonu Tıklandı Önceki Kayıt Buttonu Tıklandı Sonraki Kayıt Buttonu Tıklandı Son Kayıt Buttonu Tıklandı Kayıt Ekle Tıklandı Kayıt Sil Tıklandı Kayıt Değiştir Tıklandı Kaydet Tıklandı Değişiklikleri İptal Et Tıklandı Güncelle Tıklandı • BeforeAction Yordamı Herhangi bir düğmeye tıklanıldığı anda. Aşağıda diğer düğmelerin anlamları tablo halinde verilmiştir. 618 . “nbFirst” değerini alması ilk düğmenin tıklanıldığı anlamını taşımaktadır. Aynı şekilde burada da “Button” parametresi hangi düğmenin tıklanıldığını belirlemek için kullanılmaktadır. Burada tıklanılan düğme prosedür içerisinde tanımlanan “Button” isimli parametrede tutulmaktadır. kodlarınızın işletilmesini sağlayan bir yordamdır.İlk Kayıt Düğmesine tıkladıktan sonra aşağıdaki gibi kullanıcıyı bilgilendirmek amaçlı eklemiş olduğunuz kod işletilecektir. kontrol henüz kendi kodlarını işletmeden hemen önce sizin. kontrolün kendi kodlarını işletmesini engellemez. Bu yordama yazacağınız kodlar.

end. Sonuç iki durumda da aynı olacaktır. Programı çalıştırdıktan sonraki pencere görüntüsü yukarıdaki gibi oluşacaktır. Kayıtları DataGrid Nesnesinde Göstermek: Tablonuzda yer alan kayıtları topluca kullanıcıya göstermek için kullanılan en popüler kontrol “DataGrid” nesnesidir. Uygulamanıza “DataControls” yaprağında yer alan bu kontrolden bir adet yerleştirip “DataSource” özelliğine verilerinizi göstereceğiniz tabloya ait “DataSource” kontrolünü aktarın. Şayet ismini değiştirmediyseniz bizim projemizde “DataSource1” olarak gözükecektir. “DBNavigator” kontrolü ile kayıtlar arasında gezinti yaparsanız hem “DBEdit” kontrolünün hemde “DataGrid” nesnesinin kayıt pozisyonunun beraberce değiştiğini göreceksiniz. isterseniz “DBEdit” kontrollerinden kayıtlarınızı kolayca girebilirsiniz.DBNavigatorBeforeAction(Sender: TObject. begin if Button=nbCancel Then//iptal düğmesine basarsa begin ShowMessage('Yapılan En Son Değişiklikler İptal Edilecek'). Mesela “DBNavigator” kontrolünde yer alan “Kayıt Ekle” düğmesine tıklarsanız ister “DataGrid” nesnesinden.procedure TForm3. Button: TNavigateBtn). Bunun sebebi kontrollerin kaynak olarak aynı nesneyi yanı “DataSource1” kontrolünü kullanmalarından kaynaklanmaktadır. 619 . end.

620 .FormCreate(Sender: TObject).First. O zaman her şeyi kodla yaptırmak zorunda kalacaksınız.Open. Tamamını uygulamanıza ait “Unit” penceresine ekleyiniz. Aşağıdaki tasarımı oluşturup gerekli bağlantıları yukarıda anlattığımız şekilde yapın. procedure TForm4. procedure TForm4. procedure TForm4.//Tabloyu aç end.Button1Click(Sender: TObject). end. //İlk Kayda Git begin Table1. begin Table1.Button2Click(Sender: TObject).Kayıt İşlemlerini Kodla Yapmak: Bazı durumlarda kayıt işlemleri için “DBNavigator” kontrolünü kullanmak istemeyebilirsiniz (zorunlu kaldığınız durumlar da olabilir). Düğmelere ait kodlar aşağıda verilmiştir.

Bof Then //ilk kayıt değilse Table1.MessageBox('Silmek İstediğinizden MB_YesNo). end. begin mesaj:=Application. end. 621 .Button4Click(Sender: TObject). procedure TForm4. //Kayıt Sil var mesaj:Integer. end. procedure TForm4.Delete.Eof Then Table1.SetFocus. //Sonraki Kayıt begin if not Table1.//Önceki Kayıt begin if not Table1. end. end else ShowMessage('Kayıt Silme İşlemi İptal Edildi').Button6Click(Sender: TObject).'Sil'. ShowMessage('Kayıt Silindi').//imleç ilk sütuna gitsin end. //Kayıt Ekle begin Table1.Button7Click(Sender: TObject).Prior else ShowMessage('Zaten İlk Kayıttasınız').Last. procedure TForm4. EditMAGAZAADI. procedure TForm4.Insert. if mesaj=mrYes Then begin Table1. Eminmisiniz'.Next else ShowMessage('Zaten Son Kayıttasınız').Button5Click(Sender: TObject). //Son Kayıt begin Table1. procedure TForm4.Button3Click(Sender: TObject).

//Kayıt Değiştir begin Table1.Edit; end; procedure TForm4.Button8Click(Sender: TObject); //Kaydet begin Table1.Post; end; procedure TForm4.Button9Click(Sender: TObject); //İptal Et begin Table1.Cancel; end; procedure TForm4.Button10Click(Sender: TObject); //Güncelle begin Table1.Refresh; end; Bağlantı İşlemlerinin Kodla Yapmak: Bu bölümde “DBEdit” kontrolleri yerine, Standart yaprağında bulunan “Edit” kontrollerini kullanarak kodla veri Tabanı bağlantı işlemlerini göreceğiz. Ardından kayıt işlemlerini “Edit” kontrollerini kullanarak nasıl yapabileceğinizi göstereceğim. Bu tür bağlantılar size çok büyük esneklik sağlayacaktır. Önceki bağlantı türünden çok daha etkili sonuçlar alabilirsiniz (bazen bu şekilde bağlantıya mecbur kalabilirsiniz). Aşağıdaki adımları izleyerek gerekli olan tasarımı oluşturunuz. Birinci adımda Formunuzun üzerine “Additional” yaprağında yer alan “ScrollBox” kontrolünden bir adet yerleştirin. İkinci adımda yerleştirdiğiniz “ScrollBox” kontrolünü seçerek “Object Inspector” penceresinden “BorderStyle” özelliğini “bsSingle” yapın. Üçüncü adımda yine “ScrollBox” kontrolünü seçip “Align” özelliğini “alClient” yapın (bu üç adımı estetik görünüm açısından gerçekleştirdik. Bağlantı için zorunlu değildir). Dördüncü adımda “BDE” Yaprağında yer alan “Table” nesnesinden bir adet sürükleyip formun üzerine bırakın. “Table” nesnesinin “DataBase Name” özelliğine “gazi”, “Table Name” özelliğine de “SERVIS” değerini aktarın. 622

Altıncı adımda formunuzun üzerine “DataAccess” yaprağında yer alan “DataSource” nesnesinden yerleştirerek “DataSet” özelliğine “Table1” değerini aktarın. Yedinci adımda “Table1” kontrolünü seçip mousun sağ tuşuna tıklayın. Açılan menüden “Fields Editör” seçeneğine tıklayarak aşağıdaki pencerenin açılmasını sağlayın

Bu penceredeki beyaz alan üzerinde mousun sağ tuşuna tıklayarak, açılan menüden “Add All Fields” seçeneğini seçin. Yukarıdaki gibi tüm sütun isimleri pencerede listelenecektir (Bu işlemi sütun isimlerini kullanabilelim diye yaptık. Aktif kayıttaki tüm sütun değerleri bu değişkenlerde tutulur). Dokuzuncu adımda formunuza beş (5) adet “Edit” ve beş (5) adet “Label” kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz.

Yukarıdaki tasarımı oluşturduktan sonra, program çalıştırıldığı anda aktif kayıttaki bilgilerin “Edit” kontrollerinde gözükebilmesi için aşağıdaki kod bloğunu projenize ekleyiniz. 623

procedure TForm5.FormCreate(Sender: TObject); //Satır Bilgilerini Kontrollere aktar begin Table1.Open;//Tabloyu aç Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; Programı çalıştırdıktan sonraki ekran görüntüsü aşağıdaki gibi olacaktır. “Edit” kontrollerinin içeriklerinin dolu olduğuna dikkat ediniz.

Şimdi formunuzun üzerine bir adet “Button” kontrolü yerleştirip “Caption” özelliğine “İlk Kayıt” yazın. Aşağıda bu buttonun “OnClick” yordamına yazacağınız kod verilmiştir. procedure TForm5.Button1Click(Sender: TObject); //İlk Kayıt begin Table1.First;//ilk kayda git Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; 624

Şimdide İkinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Önceki Kayıt” yazın. Bu buttonun “OnClick” yordamına yazacağınız kod aşağıda verilmiştir. procedure TForm5.Button2Click(Sender: TObject); //Önceki Kayıt begin Table1.Prior;//Önceki kayda git Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; Şimdi üçüncü bir “Button” kontrolü yerleştirip “Caption” özelliğine “Sonraki Kayıt” değerini girin. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5.Button3Click(Sender: TObject); //Sonraki Kayıt begin Table1.Next;//Sonraki kayda git Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; Şimdi dördüncü bir “Button” kontrolü yerleştirip “Caption” özelliğine “SonKayıt” değerini girin. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5.Button4Click(Sender: TObject); //Son Kayıt begin Table1.Last; //Son kayda git Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; 625

Şimdi beşinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kayıt Ekle” değerini girin. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5.Button5Click(Sender: TObject); //Kayıt Ekle begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Edit4.Text:=''; Edit5.Text:=''; Edit1.SetFocus; end; Şimdi altıncı bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kaydet” değerini girin. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5.Button6Click(Sender: TObject); //Kaydet begin Table1.Insert; //kayıt aç Table1MAGAZAADI.AsString:=Edit1.Text; Table1SERVISTARIHI.AsDateTime:=StrToDateTime(Edit2.Text); Table1GIDENFIRMA.AsString:=Edit3.Text; Table1ARIZASEBEBI.AsString:=Edit4.Text; Table1FATURATUTARI.AsCurrency:=StrToCurr(Edit5.Text); Table1.Post; //kaydet end; Şimdi yedinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kayıt Sil” değerini girin. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5.Button7Click(Sender: TObject); //Kayıt Sil var mesaj:Integer; begin mesaj:=Application.MessageBox('Silmek İstediğinizden Eminmisiniz','Kayıt Sil',MB_ICONSTOP+MB_YESNO); 626

if mesaj=mrYes Then begin Table1.Delete;//Kaydı sil Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; ShowMessage('Kayıt Silindi'); end else ShowMessage('Silme İşlemi İptal Edildi'); end; Şimdi sekizinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kayıt İptal” değerini girin. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5.Button8Click(Sender: TObject); //Kayıt İptal begin Table1.Cancel; //değişiklikleri iptal et Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; Şimdi dokuzuncu bir “Button” kontrolü yerleştirip “Caption” özelliğine “Güncelle” değerini girin. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5.Button9Click(Sender: TObject); //Güncelle begin Table1.Refresh;//Güncelle Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; 627

Programın tasarımına ait son görüntü aşağıdaki gibi olacaktır.

Bu örnekte tablo sütunlarındaki içerikleri kontrollere aktarma işlemini tek bir prosedüde tanımlayıp kullanırsanız sonuç çok daha teknik olacaktır. Aşağıda tüm kod verilmiştir. type TForm6 = class(TForm) private procedure doldur;//Burada tanımlamayı Unutmayınız. { Private declarations } public { Public declarations } end; procedure TForm6.FormCreate(Sender: TObject); begin Table1.Open;//Tabloyu Aç doldur;//prosedürü işlet end; procedure TForm6.Button1Click(Sender: TObject); //İlk Kayıt begin Table1.First;//ilk kayda git doldur; end; procedure TForm6.Button2Click(Sender: TObject); //Önceki Kayıt 628

begin Table1.Prior;//Önceki kayda git doldur; end; procedure TForm6.Button3Click(Sender: TObject); //Sonraki Kayıt begin Table1.Next;//Sonraki kayda git doldur; end; procedure TForm6.Button4Click(Sender: TObject); //Son Kayıt begin Table1.Last; //Son kayda git doldur; end; procedure TForm6.Button5Click(Sender: TObject); //Kayıt Ekle begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Edit4.Text:=''; Edit5.Text:=''; Edit1.SetFocus; end; procedure TForm6.Button6Click(Sender: TObject); //Kaydet begin Table1.Insert; //kayıt aç Table1MAGAZAADI.AsString:=Edit1.Text; Table1SERVISTARIHI.AsDateTime:=StrToDateTime(Edit2.Text); Table1GIDENFIRMA.AsString:=Edit3.Text; Table1ARIZASEBEBI.AsString:=Edit4.Text; Table1FATURATUTARI.AsCurrency:=StrToCurr(Edit5.Text); Table1.Post; //kaydet end; procedure TForm6.Button7Click(Sender: TObject); //Kayıt Sil var mesaj:Integer; begin

629

mesaj:=Application.MessageBox('Silmek İstediğinizden Eminmisiniz','Kayıt Sil',MB_ICONSTOP+MB_YESNO); if mesaj=mrYes Then begin Table1.Delete;//Aktif kaydı sil doldur;//prosedürü işlet ShowMessage('Kayıt Silindi'); end else ShowMessage('Silme İşlemi İptal Edildi'); end; procedure TForm6.Button8Click(Sender: TObject); //Kayıt İptal begin Table1.Cancel; //değişiklikleri iptal et Doldur;//prosedürü işlet end; procedure TForm6.Button9Click(Sender: TObject); //Güncelle begin Table1.Refresh;//Güncelle doldur;//prosedürü işlet end; procedure TForm6.doldur; //Sütun içeriklerini Edit kontrollerine aktaran prosedür begin Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; Bu örnekte “doldur” isimli prosedürü “Private” veya “Public” kısmında tanımlayın. Basit bir prosedür gibi tanımlarsanız “Edit” kontrolü için, “Form1.Edit1.Text” şeklinde kullanılması gerekir.

630

Veri Tabanında Olmayan Sütunlar Yaratmak: Diğer sütunlardan yola çıkarak hesaplanabilen sütunları Veri Tabanına koymamak dosyanızın daha az yer tutmasını sağlayacaktır. Şayet mecbur kalmazsanız (mecbur kalabileceğiniz bir durum bilmiyorum) bu tür sütunları aşağıda göstereceğim şekilde oluşturunuz. Daha önce oluşturduğumuz tabloda “TUTAR” sütununu kullanarak tabloda mevcut olmayan “KDV” ve “TOPLAMFIYAT” sütunlarını oluşturacağız. Aşağıdaki adımları dikkatlice takip ediniz. Formunuzun üzerine bir adet “Table” nesnesi yerleştirerek “DatabaseName” özelliğine tanımlamış olduğunuz “Alias” ınızın ismini girin (bizim örneğimizde gazi). İkinci adımda “Table” kontrolünün “TableName” özelliğine “SERVIS” tablonuzun ismini aktarın. “DataAccess” yaprağında yer alan “DataSource” kontrolünden bir adet formunuza sürükleyin. “DataSet” özelliğine “Table1” kontrolünü aktarın. Dördüncü adımda formunuza bir adet “Additional” yaprağında yer alan “ScrollBox” kontrolü ekleyerek, “Align” özelliğine “alClient”, “BorderStyle” özelliğine de “bsSingle” değerlerini aktarın (estetik görünüm için). Beşinci adımda formunuza “DataControls” yaprağında yer alan “DataGrid” kontrolü ekleyerek “DataSource” özelliğine “DataSource1” nesnesini aktarınız. Altıncı adımda Table kontrolünüzün “Object Inspector” penceresinden “Active” özelliğini “true” yapın.

Şu aşamada programınızı çalıştırırsanız yukarıdaki şekilde tablonuzda yer alan tüm sütunları “DataGrid” nesnesinde listeletmiş olacaksınız. Bu

631

adımdan sonra tablonuzda yer almayan “KDV” ile “TOPLAM TUTAR” sütunlarını oluşturmayı göztereceğim. Yedinci adımda “Table” nesnesi üzerine mousun sağ tuşuyla tıklayın. “Açılan menüden “Fields Editör” seçeneğini seçiniz. Açılan beyaz pencerede mousun sağ tuşuna tıklayarak açılan menüden “Add All Fields” seçeneğini tıklayınız.

Tüm sütunları ekledikten sonra tekrar mousun sağ tuşuna tıklayın. Açılan menüden “New Fields” seçeneğini seçin Aşağıdaki pencere açılacaktır.

“Name” kısmına sütun başlığınızı (“KDV”), “Type” kısmına sütunun içereceği verinin tipini (Currency), “Field Type” kısmından nasıl bir veri olacağını (diğer sütun kullanılarak hesaplanacağı için Calculated) “Component” kısmını ise kendisi otomatik olarak dolduracaktır. Bu kısmı değiştirmenize gerek yoktur. “OK” Buttonuna tıklayarak sütunun tabloya eklenmesini sağlayın.

632

Beyaz ekranda tekrar mousun sağ tuşuna tıklayarak açılan menüden“New Fields” seçeneğini seçiniz. Aşağıdaki pencere açılacaktır. Girilen değerleri aynen sizde oluşturunuz.

Gerekli değerleri girdikten sonra “OK” Buttonuna tıklayarak pencereyi kapatınız. Yaratılan Sütun Değerlerini Tablonuzda Hesaplatmak: Eklemiş olduğunuz iki yeni sütunun “Object Inspector” penceresinde bulunan “FieldKind” özelliklerinin “fkCalculated” olduğunu tekrar kontrol ediniz. Aksi takdirde hesaplatma işleminiz başarısızlıkla sonuçlanacaktır. Son adım olarak aşağıdaki kodu “Table” kontrolünüzün “OnCalcFields” yordamına yazmanız gerekecektir. procedure TForm7.Table1CalcFields(DataSet: TDataSet); begin
Table1KDV.AsCurrency:=Table1FATURATUTARI.AsCurrency*0.15; Table1TOPLAMTUTAR.AsCurrency:=Table1FATURATUTARI.AsCurrency*1.15;

end; Bu aşamadan sonra uygulamanızı çalıştırırsanız “DataGrid” nesnenizde iki adet yeni sütunun oluştuğunu, bu sütunların içeriklerini tablonuzda yer alan “FATURATUTARI” sütununa göre hesapladıklarını göreceksiniz. Yeni kayıt eklemeniz bu sutünların hesaplanmasını engellemez. Ekleyeceğiniz her yeni kayıt için sonuç yine otomatik olarak hesaplanacaktır. Aynı şekilde var olan bir kayıt üzerinde değişiklik yaparsanız sonuç bu yeni sütunlara da anında

633

yansıyacaktır. Programınızın en son görüntüsü aşağıda verilmiştir. “KDV” ile ”TOPLAMTUTAR” sütunlarının Veri Tabanınızda var olmadığına dikkatinizi çekelim.

DataGrid Kontrolüne Ait Özellikler: Kaynağınızdaki kayıtları topluca kullanıcıya göstermek için kullanılan en popüler kontrol sanıyorum “DataGrid” nesnesidir. Bu yüzden kayıtların daha estetik ve güzel görünmesi için yapmanız gereken bir takım ayarlar bulunmaktadır. Şimdi sizlere bu ayarlardan bahsetmek istiyorum. Öncelikle daha önceden oluşturmuş olduğumuz “SERVIS” tablosuna gerekli bağlantıları yapıp tüm kayıtların aşağıdaki pencerede olduğu gibi “DataGrid” nesnesinde gösterilmesini sağlayın (Bağlantı işlemleri her defasında artık anlatılmayacaktır).

Şu anda “DataGrid “kontrolü tablo içerisindeki tüm kayıtları göstermektedir. 634

DataGrid Kontrolüne Ait Sütun Başlıklarını Belirlemek: Yukarıdaki pencereye dikkat edecek olursanız, sütun başlıklarınız Veri Tabanın da nasıl belirlendiyse o şekilde gözükmektedir. Fakat bir çok durumda buradaki sütun başlıklarının daha değişik metinle (kısaltma yapmış olabilirsiniz vs) gösterilmesi istenir. Bizde şimdi yapacağımız değişiklikle yeni sütun başlıkları belirleyelim (sütun başlıklarını DataGrid nesnesinden değiştirmek veri tabanınıza yansımaz). “DataGrid” kontrolünü seçip mousun sağ tuşuna tıklayın. Açılan menüden “Columns Editör” seçeneğine tıklayın Karşınıza aşağıdaki pencere açılacaktır.

Açılan bu pencerede ilk etapta hiç bir sütun gözükmeyecektir. Beyaz alanda mousun sağ tuşuna tıklayın, açılan menüden “Add All Fields” seçeneğini seçin. Bütün sütunlar yukarıdaki pencerede olduğu gibi ekranınıza eklenecektir.

Bu adımda sol taraftaki pencereden sütunu seçip “Object Inspector” penceresindeki “Title” özelliğinin solundaki “+” işaretine tıklayın. 635

Alt satırları açılan “Title” seçeneğinden “Caption” değerlerini tüm sütun başlıkları için ayrı ayrı belirleyin. Aşağıdaki ekran görüntüsü sütun başlıklarının değiştirilmiş halini göstermektedir.

DataGrid Sütun Başlıklarının Ortalanması: Yukarıdaki adımları aynen izleyerek “Columns Editor” penceresinin açılmasını sağlayın. Bu pencerede ortalatacağınız sütunu seçip “Object Inspector” penceresinde “Title” özelliğinin altında yer alan (diğer Alignment değil)“Alignment” özelliğini “taCenter” olarak değiştirin. Sütun başlıklarınız artık ortalanmış şekilde gözükecektir. Alabileceği diğer seçenekler aşağıda verilmiştir.
Alignment taCenter taLeftJustify taRightJustify Sonuç Sütun İçerisinde Ortalanmış Sütun İçerisinde Sola Dayalı Sütun İçerisinde Sağa Dayalı

636

DataGrid Sütun Genişliklerini Ayarlamak: Düzgün bir görüntü için “DataGrid” nesnenizin sütun genişliklerini en uygun boyuta getirmelisiniz. Aksi takdirde çirkin bir görünümü olacaktır. “DataGrid” nesneniz için sütun genişliklerini aşağıdaki şekilde ayarlayabilirsiniz. Daha önceki örnekte yer alan adımları aynen izleyip “Columns Editor” penceresini açın. Bu pencerede genişliğini değiştireceğiniz sütunu seçip “Object Inspector” penceresinden “Width” özelliğine uygun olan genişlik miktarını girerek sütun genişliklerini ayarlayabilirsiniz. DataGrid Sütunlarını ReadOnly Yapmak: Bilhassa kayıt ekleme veya kayıt değişikliklerinin “DataGrid” kontrolünden yapılmasına izin verdiğiniz durumlarda, kullanıcının bazı sütun değerlerini değiştirebilmesini istemeyebilirsiniz. Bu tip durumlarda o sütuna salt okunur özelliği vermelisiniz. Aşağıda bu işlemi nasıl yapabileceğiniz açıklanmaktadır. Önceki uygulamada izlediğiniz adımları aynen izleyerek “Columns Editor” penceresinin açılmasını sağlayınız. Salt okunur özelliği vereceğiniz sütunu seçip “Object Inspector” penceresinden “ReadOnly” özelliğini true yapın. Şimdi programınızı çalıştırırsanız, diğer sütunlarda kolayca değişiklik yapabilmenize rağmen “ReadOnly” özelliğini “true” yaptığınız sütunda değişiklik yapamayacaksınız. DataGrid Sutununu ComboBox Şeklinde Kullanmak: “DataGrid” kontrolü içerisinde kayıt değişikliği veya kayıt ekleme işlemi sırasında içeriğin, açılan bir “ComboBox” kontrolünden seçilebilmesini sağlayabilirsiniz. Aşağıda bu işlemi nasıl yapabileceğiniz açıklanmaktadır. Yukarıdaki adımları izleyerek “Columns Editor” penceresinin açılmasını sağlayınız. Sütunlarda “ComboBox” gibi davranmasını istediğinizi seçip “Object Inspector” penceresinden “PickList” özelliğine tıklayın. Pencere açılacaktır. Burada kayıt değişikliği (veya kayıt ekleme) anında kullanıcının seçebileceği seçenekleri teker teker girin. Biz örneğimiz için “MAGAZAADI” sütununa “MIGROS-DIA-GIMA-BIM-ŞOK” değerlerini girdik. Programı çalıştırdıktan sonra aşağıdaki gibi “DataGrid” kontrolünde yer alan “MAGAZAADI” sütununa mous ile çift tıklayın. Girmiş olduğunuz mağazaların isimlerinin yer aldığı seçenekler ComboBox kontrolünde olduğu gibi açılan bir liste halinde karşınıza gelecektir. Buradan mağazanızı seçip değişikliği gerçekleştirebilirsiniz. 637

Aşağıdaki pencere “PickList” değerlerine mağaza adları girildikten sonra uygulamanın çalıştırılmasından elde edilmiştir.

DataGrid Kontrolüne Ait Sütun Başlıklarını Renklendirmek: “DataGrid” kontrolünüze ait sütun başlıklarını istediğiniz şekilde renklendirebilirsiniz. Aşağıda bu işlemi nasıl yapabileceğiniz açıklanmıştır. Yukarıdaki adımları izleyerek “Columns Editor” penceresinin açılmasını sağlayın. Bu pencerede renklendireceğiniz sütunu seçip “Title” özelliğinin solundaki “+” işaretine tıklayın. Açılan alt seçeneklerde yer alan “Color” özelliğinden dilediğiniz rengi seçebilirsiniz. DataGrid Sütunlarını Renklendirmek: Kontrolde gösterilen tüm sütunları farklı renklerde gösterebilirsiniz. Aşağıda belirtilen adımları izleyin. Daha önce gösterilen şekilde “Columns Editor” penceresini açın. Bu pencerede renklendireceğiniz sütunu seçip “Object Inspector” penceresinden “Color” (Title yok artık) özelliğine istediğiniz rengi atayabilirsiniz. DataGrid Font Ayarları: “Columns Editor” penceresini açtıktan sonra font ayarlarını değiştireceğiniz sütunu seçip “Object Inspector” penceresinden “Font” özelliğinin solunda yer alan “+” işaretine tıklayın. Açılan alt seçeneklerden tüm font ayarlarını yapabilirsiniz.

638

DataGrid Kontrolünde İşe Yaramayan Sütunları Gizlemek: Bazı durumlarda tablonuzda yer alan tüm sütunları “DataGrid” nesnenizde göstermek istemeyebilirsiniz. Böyle durumlarda aşağıdaki adımları izlemelisiniz. Önceki uygulamalarda gösterildiği gibi “Columns Editor” penceresini açın. Mousun sağ tuşuna tıklayarak açacağınız menüden “Add All Fields” seçeneğini seçin.

Sol taraftaki pencerede tüm sütunlar gösterimde olup. Sağ taraftakinde ise “ARIZASEBEBI” ile “SIRANO” sütunları “Delete” tuşuna basılarak silinmiştir. Uygulamanızı çalıştırırsanız “DataGrid” kontrolünüz aşağıdaki şekilde gözükecektir.

Pencereye dikkatli baktığınız zaman “ARIZASEBEBI” ile “SIRANO” sütunlarının gözükmediğini göreceksiniz. “DataGrid” kontrolünde sütunların silinmesi tablonuzda hiçbir değişiklik yapmayacaktır. 639

DataGrid Kontrolünde Sütun Başlıklarını Gizlemek: Şayet sütun başlıklarının gösterilmesini istemiyorsanız. “DataGrid” kontrolünü seçip “Object Inspector” penceresinde yer alan “Options” özelliğinin solundaki “+” işaretine tıklayın. Açılan seçeneklerden “dgTitles” özelliğini false yaparsanız sütun başlıklarınız gözükmeyecektir.

Buradaki “Options” özelliğinden diğer bir çok ayarı yapabilirsiniz. Mesela “dgEditing” özelliğini false yaparsanız, kullanıcı sütunlardaki hiç bir kayıt bilgisini değiştiremez. “dgColLines” özelliğini false yaparsanız düşey çizgiler gözükmez. “dgRowLines” özelliğini false yaparsanız yatay çizgiler gözükmez. “dgRowSelect” özelliğini true yaparsanız tüm kaydı aşağıdaki şekilde seçebilirsiniz.

“Options” ta yer alan tüm özellikleri deneyin oldukça kullanışlı ve sevimli özellikler olduklarını göreceksiniz.

640

Kayıt Filtreleme İşlemleri: Tablonuzda bulunan tüm kayıtlarla değilde, içilerinde belirli özelliği olan kayıtlarla ilgileniyorsanız kullanacağınız işlem kayıtları filtrelemek olacaktır. “Query” kontrolü kullanarak daha gelişmiş tablo sorguları oluşturabilirsiniz. Fakat bilhassa server-client uygulamalarında serverin devamlı sorguyla zorlanması performansınızı etkileyecektir. Onun yerine (her zaman değil) kendi lokal makinenize aldığınız table nesnesini kullanarak kayıtlarınızı istediğiniz şekilde kolayca filtreleyebilirsiniz. Bu size daha performanslı bir çalışma ortamı yaratabilir. Aşağıda, Tablo kontrolünde yer alan kayıtları nasıl filtreleyebileceğiniz konusu işlenmektedir. • Table1.FilterOptions Filtreleme işleminde, küçük büyük harf duyarlılığının olup olmayacağını ve alan parçasına göre filtreleme yapılıp yapılamayacağını belirleyen özelliğidir. Alabileceği değerler aşağıda verilmiştir.
FilterOptions foCaseInsensitive foNoPartialCompare Sonuç Küçük-Büyük Harf Duyarlılığı Yok Alan Parçasına Göre Filtreleme Yapılabilir.

procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.FilterOptions:=[foCaseInsensitive];//harf duyarlılığı yok end; • Table1.Filtered Belirlenen kriterin tabloya uygulanıp uygulanmayacağını belirleyen özelliğidir. “True” değerinin aktarılması filtre kriterinin tabloya uygulanması anlamını taşımaktadır. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.FilterOptions:=[foCaseInsensitive];//harf duyarlılığı yok Table1.Filtered:=true;//kriteri uygula end; Bu özelliğe “false” değerinin aktarılması tablodaki tüm kayıtların tekrar listelenmesi anlamını taşımaktadır (Filtre iptal).

641

• Table1.Filter Tabloya uygulanacak olan filtre kriteri bu özellikle belirlenir. Kodlamada aşağıdaki şekilde bir blok kullanmalısınız. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text);//kriter end; Kriteri belirlemeniz tablonuzun filtreleneceği anlamını taşımaz. Muhakkak ardından “Filtred” özelliğine true değerini aktarmalısınız. Yukarıda anlattığımız özelliklerin daha iyi bir şekilde anlaşılabilmesi için olayı bir örnekle pekiştirelim.İlk olarak formunuza bir adet “Table”, bir adet “DataSource”,bir adet “DataGrid”, bir adet “GroupBox,bir adet “Label” ve bir adet “Edit” kontrolü yerleştirerek tüm kayıtların “DataGrid” nesnesinde gösterilmesini sağlayın. Amacımız sadece “Edit” kutusuna girdiğimiz mağaza ismini listelemek olacaktır.

İşlemin uygulanışı mağaza adının “Edit” kontrolüne girildikten sonra “Enter” tuşuna basılmasıyla gerçekleşecektir. Aşağıdaki kod bloğunu “Unit” pencerenize ekleyiniz. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then //Enter tuşu tıklanırsa begin Table2.FilterOptions:=[foCaseInsensitive];//harf duyarlılığı yok 642

Table2.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text);//kriter Table2.Filtered:=true; end; end;

Programı çalıştırıp “MAGAZA ADI” nı Edit kontrolüne girip “Enter” tuşuna basınız. “DataGrid” kontrolünüzde sadece “MIGROS” mağazalarına yapılmış olan servisler listelenecektir. Aşağıdaki kodlamada “Enter” tuşuna basmanıza gerek yoktur. Her karaktere bastığınız zaman kriter yeniden denenecektir. procedure TForm7.Edit1Change(Sender: TObject); begin Table2.FilterOptions:=[foCaseInsensitive];//harf duyarlılığı yok Table2.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text);//kriter Table2.Filtered:=true; end; Projeyi çalıştırdığınız zaman mağaza ismini “Edit” kontrolünün içerisine tamamen yazana kadar hiç bir kayit “DataGrid” nesnesi içerisinde listelenmeyecektir. Mağaza adı tamamen yazıldıktan sonra, o mağazaya ait tüm servisler “DataGrid” nesnesi içerisinde listelenmiş olacaktır. Kodu aşağıdaki şekilde değişirseniz gireceğiniz ilk karakterlere göre filtreleme yapabilirsiniz. Burada kodu yine “OnChange” yordamına yazmanız gerektiğini hatırlatıp, kod satırlarını verelim.

643

procedure TForm7.Edit1Change(Sender: TObject); begin Table2.FilterOptions:=[foCaseInsensitive];//harf duyarlılığı yok Table2.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text+'*');//kriter Table2.Filtered:=true; end;

Prgramı çalıştırıp kriter kısmında “G” Harfine basarsanız “G” ile başlayan tüm Mağaza servislerini listeleyebilirsiniz. İkinci karakter olarak “U” ya basarsanız “GIMA” mağazasıda kayıtlar arasında listelenmeyecektir. Filtrelenmiş Kayıtlar Arasında Gezinmek: Filtrelemiş olduğunuz kayıtlar arasında kolaylıkla dolaşabilirsiniz. Yapmanız gereken tek şey tablo nun filtreli olup olmadığını kontrol etmekten ibaret olacaktır. Filtreli Kayıtlarda Bir Sonrakini Git: Aşağıdaki kodlamayla filtreli kayıtlar içerisinde sonraki kayda ulaşabilirsiniz. procedure TForm7.Button3Click(Sender: TObject); begin if Table2.Filtered=true Then//filtre uygulanmışsa table2.FindNext;//sonraki kayda git end;

644

Filtreli Kayıtlarda Bir Öncekine Git: procedure TForm7.Button4Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindPrior;//bir önceki kayda git end; Filtreli Kayıtlarda İlk Kayda Git: procedure TForm7.Button5Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindFirst;//ilk kayda git end; Filtreli Kayıtlarda Son Kayda Git: procedure TForm7.Button6Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindLast;//son kayda git end; Tarih Aralığına Göre Filtre Uygulamak: Yukarıdaki örnekte gireceğiniz iki tarih arasını da filtreleyebilirsiniz. Yanlız bu işlemi gerçekleştirebilmeniz için bu sütunun muhakkak Primary veya Secondary index olarak tanıtılmış ve indexin aktifleştirilmiş olması gerekmektedir. Şimdi sizlere Tablonuzda (SERVIS) nasıl secondary index tanımlayabileceğinizi göstereceğim. Secondary Index Tanımlamak: “Start->Programs->Borland Delphi->Database Desktop” adımlarını izleyin. Ardından açılan pencereden “File->Open->Table” diyerek daha önce kaydetmiş olduğunuz “SERVIS” tablosunu açın. Yine “Table->Restructure” seçeneklerini izleyerek tablonuzun tasarım anına ulaşın. Şimdi bu pencereyi kullanarak hem “SERVISTARIHI” sütununu hemde “FATURATUTARI” sütununu secondary index olarak tanımlayacağız.

645

Hatırlatalım Seconder index tanımlayabilmeniz için Paradox ta muhakkak primary index tanımlaması yapmış olmanız gerekmektedir.

“Restructure Paradox” penceresinde yer alan “Table Properties” kısmından “Secondary Indexes” seçeneğini seçin ve “Define” düğmesine tıklayın. Aşağıdaki pencere açılacaktır.

Bu pencerede “SERVISTARIHI” sütununu seçip “Indexed fields” listesine aktarın. Ardından “OK” buttonuna tıklayın. 646

“TUTARINDEX” deyin. • Table2. begin Table2.[Edit3.Text]. aralık filtrelemesi yapacağınız sütunun muhakkak index olarak tanımlanmış olması gerekmektedir.SetRange Aralık filtrelemek için kriterlerinizi belirleyen özelliğidir. Tekrar “Define” buttonuna tıklayarak aynı “FATURATUTARI” sütunu için gerçekleştirin. • Table2.Button1Click(Sender: TObject). Daha sonra projeyi incelerken o indexin hangi sütuna ait olduğunu hatırlayabilesiniz.SetRange([Edit2. procedure TForm7. İndex isimlerinizi rasgele vermeyin. Yukarıdaki kod satırında “Edit1” ve “Edit2” kontrollerine girilen tarih içeriklerinin arasında kalan kayıtları listelemesi söylenmektedir.Text]). kayıtların “DataGrid” nesnesi içerisinde gösterilmesini sağlayın. end. Bu komutu kullanabilmeniz için. Şimdi aşağıdaki tasarımı oluşturup aralık filtreleme işlemini örnek üzerinde görelim. Bu aşamadan sonra kolayca aralık filtrelemesi yapabilirsiniz. Filtre işlemini tabloya uygulamaz.ApplyRange “SetRange” komutu girilen kriterlere göre tablonun filtrelenmesini sağlayan komuttur. işlemleri bu sefer Index in isminede Bu şekilde “SERVIS” tablosu için iki adet secondary index tanımlamış olduk. Daha önce anlatılan yöntemlerle gerekli tablolara bağlanıp. Filtreleme işlemini tabloya uygulamanız için kesinlikle gerekli olan komut “ApplyRange” dir. “SetRange” komutu sadece filtreleme kriterlerini belirler. 647 .Karşınıza aşağıdaki pencere açılacak ve sizden indexinizin ismini girmenizi isteyecektir.

ApplyRange. “Edit1” ve “Edit2” kontrolüne tarihlerinizi girip Button kontrolüne tıklayın. procedure TForm7.[Edit3.Open.procedure TForm7.Text]).Text].Button1Click(Sender: TObject).IndexName:='TARIHINDEX'. //Tümünü Göster begin Table2.//uygula end.SetRange([Edit2. 648 .//kriterler Table2. Uyguladığınız filtreyi iptal etmek için aşağıdaki şekilde bir kod bloğu kullanabilirsiniz. Programı çalıştırın. Belirttiğiniz aralıktaki kayıtların listelendiğini göreceksiniz. begin Table2.Button2Click(Sender: TObject). Parasal Aralığa Göre Filtre Uygulamak: Tablonuzdaki parasal sutunlar için de kolayca filtre uygulayabilirsiniz. Table2. end. Filtre kriterini koyacağınız sütunun indexli ve indexinin de aktif olmasına dikkat etmelisiniz.//indexi aktifleştir Table2.Close.

FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit2.ApplyRange Belirtilen aralığı tabloya filtre olarak uygulamayı sağlayan özelliğidir. Table2. Table2. Şimdi aşağıdaki şekilde bir tasarım oluşturup gerekli bağlantıları daha önce anlatıldığı şekilde yapın.Text) • Table2.Aşağıda izlemeniz gereken adımlar ve özellikler incelenmektedir. Üst sınıra ait filtreyi belirlemek için kulanılan bir özelliktir.FieldByName('FATURATUTARI'). Bu satır olmadan kriterleri belirleseniz bile “DataGrid” kontrolünüz filtreli kayıtları göstermeyecektir.Text) • Table2. Bu satırdan sonra belirteceğiniz kriteri aralığın üst sınırı olarak kabul edecektir. 649 .SetRangeEnd.SetRangeEnd. Bu satırdan sonra belirteceğiniz kriteri aralığın alt sınırı olarak kabul edecektir.SetRangeStart Alt sınıra ait filtreyi belirlemek için kulanılan bir özelliktir. • Table2. Table2.AsCurrency:=StrToCurr(Edit3. Table2.SetRangeStart.

begin Table2.AsCurrency:=StrToCurr(Edit2. end.FieldByName('FATURATUTARI').procedure TForm7.FieldByName('FATURATUTARI').Text). Burada yine index in çok önemli olduğunu hatırlatmak isterim.Button7Click(Sender: TObject). Kullanılacak olan index in “Primary” veya “Secondary” olması komutlar için önem arz etmez.//üst sınır Table2.Text).SetRangeEnd.SetRangeStart. Table2.AsCurrency:=StrToCurr(Edit3.//alt sınır Table2. Yanlız o sütuna ait index in “Object Inspector” penceresinden veya kodla muhakkak aktifleştirilmesi gerekecektir. Table2.ApplyRange. 650 .IndexName:='TUTARINDEX'.//imdexi aktif yap Table2.

[]). İndexli sütunlarda yaptıracağınız aramalar çok daha hızlı sonuç verecektir. Kayıt arama işlemlerinde birden fazla sütuna göre aramada yaptırabilirsiniz. Amacımız button kontrolüne tıkladığımız zaman edit içerisindeki mağazayı bulup aktif hale geçirmek olacaktır. begin Table1. Delphi’de kayıt arama işlemleri için kullanılan birkaç yöntem bulunmaktadır.//Kayıt Bul end. 651 . Bu size çok daha hızlı sonuç alma seçeneği yaratacaktır. işinize yarayan kayıdı arayıp bulma işlemini gerçekleştireceğiz.Edit1. procedure TForm2.Kayıt Arama İşlemleri: Bu bölümde hangi kayıtta olursanız olun. Fieeld Name(Sütun İsmi) MAGAZAADI ADRES TELEFON MUDUR SEHIR Type(Tipi) A A A A A 25 25 15 25 25 Size (Kaç Karakter) Key(Primary ind) * “MAGAZAADI” sütununu primary index olarak tanımlamayı unutmayınız.Text. Fazla kayıt içeren tablolarda kayıt arama işlemlerini muhakkak index tanımlayarak yapmalısınız.Button1Click(Sender: TObject). Şimdi aşağıdaki tasarımı oluşturup Table nesnesine aktardığınız kayıtların tamamının “DataGrid” nesnesinde gösterilmesini sağlayın.Locate('MAGAZAADI'. • Locate Methodu Bu method sayesinde indexli veya indexsiz sütunlarda arama yaptırabilirsiniz. Şimdi aşağıdaki tabloyu paradoxta oluşturup üzerinde işlemler yapalam. Daha sonra formunuza bir adet “Edit” kontrolü ile bir adet “Button” kontrolü yerleştiriniz. Lütfen dikkatlice inceleyiniz. Index in primary veya secondary olması önem arz etmeyecektir. Bu yöntemlerin hepsini detaylı olarak anlatmaya çalışacağım. Her çeşit yöntemi örneklendirmeye çalışacağım. Tabloyu oluşturduktan sonra daha önceki bölümde anlatıldığı gibi içerisine “MIGROS –DIA-GIMA” mağazalarının bulunduğu kayıtları girin (primary index olduğu için aynı mağaza ismini ikinci kayıtta kullanamazsınız).

Yukarıda verilen tasarımı oluşturduktan sonra “Kayıt Bul” düğmesine aşağıdaki kod satırlarını ekleyiniz.Text. Parametre foCaseInsensitive foNoPartialCompare Sonuç Küçük-Büyük Harf Duyarlılığı Yok Alan Parçasına Göre Arama Yapılabilir.[]).Button1Click(Sender: TObject).//Kaydı bul end.Bu methodun önemli bir özelliğide bulunan kaydın aktif kayıt haline getirilmesidir.//duyarsız end. procedure TForm2.Text. begin Table1.[loCaseInsensitive]).Locate('MAGAZAADI'. Şayet bu hassasiyeti ortadan kaldırmak istiyorsanız kullanılan üçüncü parametreyi aşağıdaki şekilde değiştirmelisiniz.//primary index aktif Table1. 652 .Edit1.//primary index aktif Table1. procedure TForm2. begin Table1.Button1Click(Sender: TObject).DefaultIndex:=true.Edit1. Üçüncü parametrenin alabileceği seçenekler aşağıda verilmiştir.Locate('MAGAZAADI'. Bu örnekte küçük büyük harf duyarlılığı bulunmaktadır.DefaultIndex:=true. Yani küçük harfle migros yazarsanız kaydı bulamazsınız.

653 . Aşağıda yazacağımız kodu çalıştırabilmeniz için “Uses” satırına “Variants” kütüphanesini eklemelisiniz. bulunması durumunda ise true değerini almaktadır. birden fazla kriter kullanacaksanız o zaman aşağıdaki yöntemi uygulamanız gerekecektir. begin Table1.DefaultIndex:=true.Locate('MAGAZAADI'. Birden Fazla Sütuna Göre Arama Yaptırmak: Kayıt arama işlemi için tek sütun yeterli değilse. if ara=false Then ShowMessage('Kayıt Bulunamadı').Button1Click(Sender: TObject). Formunuza ikinci bir “Edit” kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz. procedure TForm2.Text. var ara:Boolean. Daha sonra bu değeri kullanarak kaydın bulunup bulunamadığını kolayca öğrenebilirsiniz.[loCaseInsensitive]).Edit1.Aranan kaydın bulunaması sizin için önem arz ediyorsa o zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz. kaydın bulunamaması durumunda false.//primary index aktif ara:=Table1. Burada kullanılan “ara” isimli değişken. end.

• SetKey-GotoKey Methodları Index li sütunlara göre kayıt araması yapılabilen ikinci yöntemdir. begin ara:=Table1.GotoKey Aranan kritere uygun kaydı aktifleştirmek için kullanılan komuttur.//Kayıt arama işlemine başla end.Text]).[]).GotoKey. “Edit1” kontrolüne girilen değer “ADRES” içinde. begin Table1.Edit2. “Edit2” kontrolüne girilen değerde “MUDUR” sütunu içerisinde aratılmaktadır. Yukarıdaki örnekte “ADRES” ve “MUDUR” sütununa göre arama yaptırılmaktadır. procedure TForm4. Table1. begin Table1.SetKey Kayıt arama işlemini başlatan komuttur.MUDUR'. procedure TForm4. var ara:Boolean. Table1.Button2Click(Sender: TObject).Button1Click(Sender: TObject). Aynı kayıtta ikisine rastlarsa o kaydı aktif hale getirmektedir.Locate('ADRES. Sadece indexli sütunlar için kullanılabilmektedir.Text.varArrayOf([Edit1. end. Sadece indexli sütunlar için çalışmaktadır.procedure TForm2. if not ara Then ShowMessage('Kayıt Bulunamadı').Button1Click(Sender: TObject). 654 . Kullanımına ait örneklendirme aşağıda yapılmıştır. Şayet kaydı bulamazsa “ara” isimli “Boolean” tip değişken “false” değerini alarak kayıt bulunamadı uyarısını kullanıcıya iletmektedir.SetKey. //harf duyarlılığı var end. //uses satırına Variants ı eklemeyi unutmayınız.

end. Aynı şekilde kritere uyan kayıt bulunduğu zaman aktifleştirilecektir.GotoKey=false Then ShowMessage('Kayıt Bulunamadı').GotoNearest Belirtilen alan parçasına göre arama yapabilen methoddur. //harf duyarlılığı var if Table1.Text. Aşağıdaki kod satırlarını “Kayıt Bul” buttonunun “OnClick” yordamına ekleyiniz. procedure TForm4.Şimdi aşağıdaki form tasarımını oluşturup SetKey-GotoKey methodlarını örnek içerisinde kullanımını görelim. “SetKet” aramaya başlayabilmek için gerekli komut olup önceki örnekle aynı karakteristiği taşımaktadır. • SetKey-GotoNearest Methodları Aradığınız kaydın içeriğini tam olarak bilmiyorsanız. Table1. 655 . Aşağıda bu methodların beraber kullanımına ait örneklendirme yapılmıştır. //Kayıt Bul begin Table1.FieldByName('MAGAZAADI').SetKey.//Kayıt arama işlemine başla Table1.GotoKey. veya tamamını yazmadan arama yapabilmek için kullanılan methodlardır.AsString:=Edit1.Button1Click(Sender: TObject).//kriter Table1.

Button2Click(Sender: TObject). o kayda ait istenilen sütun değeri değişkene aktarılabilir.SetKey. Kayıt bulunduktan sonra. Aşağıdaki örnekte bu husus işlenmektedir.procedure TForm4. //harf duyarlılığı yok end. • Lookup Methodu Kaydı aktif yapmadan arama işlemi yapabilen methoddur.GotoNearest.AsString:=Edit1.//Kayıt arama işlemine başla Table1.Text.FieldByName('MAGAZAADI'). Table1. 656 . //Alan parçasına göre ara begin Table1.

MUDUR'). 657 . kayıt bulunduktan sonra “ADRES” ara[0] isimli variant tip değişkene. “Lookup” methoduyla Mağaza adı sutununda kritere uygun olan değer aranmakta.Lookup('MAGAZAADI'.'ADRES. “MUDUR” de ara[1] isimli diğer variant tip değişkene aktarılmaktadır (buradaki ara isimli dizi değişkeni kendisi otomatik olarak oluşturmaktadır).Button3Click(Sender: TObject).Text. begin ara:=Table1.procedure TForm4.Edit1. var ara:variant. Şimdi verdiğimiz kodu açıklamaya çalışalım. if VarIsNull(ara) Then //boş sa ShowMessage('Kayıt Bulunamadı') else ShowMessage('Mağaza Adresi='+ara[0]+#13#10+'Mağaza Müdürü='+ara[1]). end.

Database Kontrolü “BDE” Yaprağında yer alan bu kontrol sayesinde kolaylıkla “Transaction” işlemini gerçekleştirebilir. “Transaction” işleminde “Delphi” nin yaptığı işlem. başlatıldığı anda boş bir “Database” oluşturmak ve yapılan tüm işlemleri (tablonuza değil) bu database kaydetmekten ibarettir. arada bir tanesinde oluşabilecek hata çok kötü sonuçlar doğurabilecektir.Transaction İşlemi: Toplu kayıt işlemlerinde (kayıt ekleme veya değiştirme) veri güvenliğini sağlamak amaçlı kullanılan çok önemli bir yöntemdir. Bilgisayarlar arası bilgi tutarlılığını sağlamak için tüm kayıt değişikliği işlemlerini “Transaction” kullanarak yapmalısınız. Aşağıda “Transaction” işleminde kullanacağınız komutlar gösterilmektedir. 658 . Ya hepsini geri alırsınız veya hepsini topluca tablonuza yazdırırsınız. Yapacağınız tüm değişiklikleri bu yeni “Database” içerisine kaydedebilirsiniz. Aşağıda bu işlemleri başarılı bir şekilde gerçekleştirebilmek için “Database” kontrolüne ait kullanabileceğiniz özellik ve methodlar açıklanmaya çalışılmaktadır. “Transaction” işlemini güvenlik açısından kullanmak zorunda (tam bir zorunluluk yoktur ama çok faydalı olacaktır) olduğunuz diğer bir durumda network uygulamalarıdır. Uyarı:Şayet “Transaction” işlemi uygulayacaksanız tablonuzda muhakkak index bulunmalı ve aktif hale geçirilmelidir. Bu tür sonuçları engellemek amaçlı transaction kullanırsanız. Şayet herhangi bir aksaklık olmazsa tüm değişiklikleri kabul edip diğer işlemlerinize geçebilirsiniz. Bu size güvenli bir ortam yaratacaktır. Yukarıda da bahsettiğimiz gibi “Transaction” işlemi sırasında yapılan tüm işlemler yenibir “Database” nesnesi içerisinde tutulacaktır. Tablonuza döngü içerisinde kayıt girdiğinizi düşünün. kaydetmeye başlamadan (veya silmeye) önceki konuma dönüp tekrar deneme şansınız olacaktır. “Transaction” işleminden sonra yapılan değişiklikleri bir bütün olarak düşünmelisiniz. Bu yüzden formunuza “BDE” yaprağında yer alan “Database” kontrolünden bir adet yerleştirmeyi unutmayınız. Uygulayacağınız işlem başarılı bir şekilde gerçekleşirse sonuçları Database den tablonuza kolayca aktarabilirsiniz. Şayet bir aksaklık çıkarsa bu durumda “Transaction” işlemini iptal ederek eski konumunuza dönebilirsiniz.

DatabaseName:='gazi'. Bu komuttan sonra “Transaction” işlemi sona erecektir. • Database1. “False” değeri aktarılırsa bağlantı kapatılacaktır.Connected “Database” bağlantısını açıp kapatmak için kullanılan özelliğidir.Button1Click(Sender: TObject). DataBase1. • DataBase1. Table1. • Database1. procedure TForm2. end. end. procedure TForm2. Bu satırdan sonra tabloda yapılacak olan tüm değişiklikler bu “Database” içerisinde kaydedilecektir. Table1. Yeniden “Transaction” 659 .• Database1.FormCreate(Sender: TObject). begin Database1.DatabaseName:='gazi'.Open. “Database içerisinde depolanan bilgiler sıfırlanacaktır.//Transactionı başlat end.DatabaseName “Database” kontrolünün oluşturulacağı yeri belirlemek amaçlı kullanılan özelliğidir. //Başlat begin Database1.Open.StartTransaction Transaction işlemini başlatan methoddur.FormCreate(Sender: TObject).Connected:=true. procedure TForm2. begin Database1.StartTransaction. “True” değerinin aktarılması bağlantının kurulması anlamını içermektedir. Bu özelliğe kalasörün yolu girilebileceği gibi “Alias” isminide girebilirsiniz (siz hep alias ismini giriniz).Commit “DataBase” içerisinde tutulan değişiklikleri tabloya yansıtmak amaçlı kullanılan komuttur.

Button3Click(Sender: TObject). Özelliğin “True” değerini alması “Transaction” işleminin halen uygulandığı anlamını taşımaktadır. • Database1. procedure TForm2.InTransaction=true Then begin Database1.Rollback “StartTransaction” methodundan sonra “Database” nesnesi içerisinde yapılan tüm değişiklikleri iptal etmek amaçlı kullanılan komuttur.uygulanacaksa bu kullanılmalıdır. end.Button2Click(Sender: TObject).Button3Click(Sender: TObject). tablonuzu “Refresh” etmelisiniz. //İptal Et begin if Database1.Rollback. “Değişikliklerin iptal edilmesinden sonra tabloda son durumu görmek isterseniz. end.//uygula end.//son durumu tabloda göster end. Yine bu komut “Transaction” işlemini bitirecektir.//Değişiklikleri iptal et Table1. komuttan sonra tekrar “StartTransaction” methodu procedure TForm2. Şayet tekrar “Transaction” uygulanacaksa “StartTransaction” komutu tekrar verilmelidir. ona göre komut işletebilirsiniz. procedure TForm2. • Database1.Refresh.//Değişiklikleri İptal Et Table1.InTransaction “Transaction” işlemi yokken “RoolBack” veya “Commit” komutlarını uygularsanız uygulamanız sizi kendi hata mesajınızla uyaracaktır. //Tabloya yaz begin Database1.Rollback. //İptal Et begin Database1.Refresh.Commit. Bu yüzden belirtilen komutla “Transaction” işleminin var olup olmadığını kontrol edebilir. 660 .

FormCreate(Sender: TObject). bir adet “Database”.Open. Alabileceği seçenekler aşağıda verilmiştir. üç adette button kontrolü yerleştirin. Uygulama için formunuza bir adet “Table”. begin Table1.DatabaseName:='gazi'. Table1.TransIsolation:=tiDirtyRead.• Database1.Connected:=true. bir adet “DataGrid”. Şimdi aşağıdaki tasarımı oluşturarak verilen kodları “Unit” pencerenize ekleyiniz.//değiştirmeyi unutmayın Database1. end.DefaultIndex:=true. bir adet “GroupBox”. 661 . Şimdide uygulamanıza ekleyeceğiniz kod bloklarını verelim. bir adet “DataSource”.//index aktif olmalı Database1.TransIsolation “Transaction” uygulanacak olan VeriTabanının ağ ortamındamı yoksa lokaldemi olup olmadığını belirleyen özelliğidir. DataBase1. Bu kodları gerekli yordamlara ekleyiniz. TransIsolation tiReadCommitted tiDirtyRead tiRepeatableRead procedure TForm2.

//Transactionı başlat Form2. begin Table1. end else begin deger:=Application.MessageBox('Transaction Kapalı Başlatalımmı'.DatabaseName:='gazi'. Database1. begin if Database1.procedure TForm2.Caption:='Transaction Kapalı'. Form2. end. begin if Database1.TransIsolation:=tiDirtyRead.Connected:=true. //Başlat begin Database1.Commit.Button1Click(Sender: TObject).//Tekrar Başlat Form2.//Tüm değişiklikler iptal 662 .//uygula ShowMessage('Tüm Değişiklikler Kaydedildi').Open.InTransaction Then//transaction varsa begin Database1.//bağlan Table1. 'Transaction Başlat'. procedure TForm2. //Tabloya yaz var deger:Integer.Caption:='Transaction Açık'.Button2Click(Sender: TObject). end.InTransaction=true Then begin Database1.DefaultIndex:=true. DataBase1. procedure TForm2. if deger=mrYes Then Database1.StartTransaction.Caption:='Transaction Açık'.//kodla yapın end.//index aktif olmalı Database1. procedure TForm2. end.Rollback.StartTransaction.FormCreate(Sender: TObject).MB_YESNO). //İptal Et var deger:Integer.Button3Click(Sender: TObject).

Uygulamanızı çalıştırdıktan sonra “Başlat” düğmesine tıklayın (Transaction İşlemi başlatılacaktır). Sildiğiniz kayıtları geri almak için “İptal Et” düğmesini. 'Transaction Başlat'. if deger=mrYes Then Database1. Tablonuzdan da silinmesi için “Tabloya Yaz” düğmesini tıklayabilirsiniz.//Tekrar Başlat Form2.MB_YESNO).Refresh. Ardından tablonuzdaki kayıtlardan arka arkaya bir kaç tanesini silin (sildiğiniz kayıtlar Database nesnesine kaydedildi).MessageBox('Transaction Kapalı Başlatalımmı'. end.Table1. 663 .//Verileri yenile ShowMessage('Değişiklikler İptal Edildi').Caption:='Transaction Açık'. Form2.StartTransaction.Caption:='Transaction Kapalı'. end else begin deger:=Application. end.

İkinci adımda formunuza bir adet “BDE” Yaprağında yer alan “Query” kontrolünü sürükleyip bırakın. Dördüncü adımda “Object Inspector” penceresinde yer alan “SQL” özelliğine tıklayarak açılan editöre sorgu komutlarınızı girin. Çok da mantıklıdır). Aşağıdaki adımları izleyerek “Query” bağlanabileceğinizi öğrenebilirsiniz. “Query” kontrolünü seçip “DataBaseName” özelliğine tablonuzun bulunduğu klasörü referans gösteren “Alias” isminizi aktarın. Fakat formunuza çok estetik bir görünüm kazandıracaktır).Query Kontrolü: Veri kaynağına bağlantı yapabilmek için şu ana kadar hep “Table” kontrolünü kullandık. “Query” kontrolüyle yapacağınız bağlantıdan sonra tablonuza yine kayıt girebilir. Fakat “Table” kontrolü veritabanı bağlantıları için tek seçenek değildir. Dilerseniz “Query” kontrolüyle de tablolarınıza kolayca bağlanabilirsiniz. Yinede bağlantı seçeneğiniz tamamen sizlere kalmıştır. “OK” Düğmesine bastıktan sonra “Query” kontrolünüzün “Object Inspector” penceresinden (kodlada yapabilirsiniz) “Active” özelliğini true yapın. Özellikle birden fazla tabloyu birleştirerek bir sorgu oluşturduysanız kayıt işlemlerinizi yapmanıza izin vermeyebilir. “Query” kontrolü uygulamalarınızda sizlere çok daha fazla esneklik sağlayacaktır. 664 . kontrolü ile Tablonuza nasıl Birinci adımda formunuza bir adet “ScrollBox” kontrolü yerleştirip “Align” özelliğine “alClient” değerini aktarın (Bağlantı için zorunlu değildir. aynı şekilde değişiklikler yapabilirsiniz (Bu işlem her zaman mümkün olmayabilir.

begin Query1.FormCreate(Sender: TObject). Artık uygulamanızı çalıştırabilirsiniz. “Query” kontrolünüz deki “SQL” sorgusunda yapacağınız her değişiklikten sonra verileri izleyebilmek için “Query1. Bu sayede o klasörde bulunan tüm tablolar kolayca sorgulanabilecektir (Klasör yolunuda verebilirsiniz ama siz hep Alias ismini kullanın).//Alias ismini aktarın end. Tüm kayıtların “DataGrid” nesnesine aktarıldığını göreceksiniz. Yedinci adımda formunuza bir adet “DataControls” yaprağında yer alan “DataGrid” nesnesi yerleştirip “DataSource” özelliğine “DataSource1” nesnesini aktarın. Burada sorgulamak için “DataBaseName” özelliğine aktardığınız alias içerisinde bulunan tüm tablo isimlerini kullanabilirsiniz (birden fazla tabloyu iç içe sorgulayabilirsiniz).Formunuza “DataAccess” Yaprağında yer alan “DataSource” nesnesinden bir adet yerleştirip “DataSet” özelliğine “Query1” nesnesini aktarın.Open” satırını kullanmalısınız.DatabaseName:='gazi'. • Query1.Add Sorgu komutunuzu aktarabileceğiniz methoddur. 665 .SQL. Aksi takdirde düzgün bir “SQL” komutu yazsanız bile sonuçları “DataGrid” nesnesinde göremezsiniz.DatabaseName Tablonuzun bulunduğu klasörü referans gösteren “Alias” ismini bu özelliğe aktarabilirsiniz. procedure TForm1. • Query1.

procedure TForm1. begin Query1.RequestLive:=true. kayıt değiştirebilirsiniz (bilhassa birden fazla tabloyla çalışıyorsanız bu özelliğe true aktarsanız bile kayıt giremiyebilirsiniz).Close.FormCreate(Sender: TObject). Yani “Query” kontrolünden kayıt girme işlemi yapılamaz.Add('Select * From servis').Open “Query” kontrolü içerisinde yer alan kayıtları kullanıma açmayı sağlayan methoddur. end. begin Query1.FormCreate(Sender: TObject).FormCreate(Sender: TObject). • Query1. Şayet bu özelliğe “True” değerini aktarırsanız. bu komuttan sonra hiç bir kaydı göstermeyecektir. Şayet “DataGrid” nesnesi içeriklerini “Query” den alıyorsa.//sorgu komutları Query1.DatabaseName:='gazi'. • Query1. 666 . end. procedure TForm1.procedure TForm1.FormCreate(Sender: TObject). Query1.//DataGrid hiç bir kaydı artık göstermez end. tablonuza yeni kayıt ekleyebilir. procedure TForm1. begin Query1.RequestLive Varsayılan olarak bu değer “false” dır.Open.Close Açık olan “Query” kontrolünü kapatmak için kullanılan methoddur. begin Query1.SQL. • Query1. Özellik sorgu komutlarında yapılan her değişiklikten sonra kullanılması gerekecektir (sadece zamanını iyi belirlemelisiniz).//kayıt işlemlerine izin ver end.Open.

end.Query1AfterDelete(DataSet: TDataSet). 667 .Query1AfterCancel(DataSet: TDataSet). begin ShowMessage('Kayıt Silindi'). • AfterEdit Yordamı “Query” Edit moduna alındığı anda (Navigator kontrolündeki Edit düğmesine basılırsa) otomatik olarak işleyen bir yordamdır. begin ShowMessage('Bağlantıyı Kapattınız').Edit” komutunun verilmesi yeterli olacaktır. “Query1. Bu yordamın işletilmesi için “Query1. • AfterClose Yordamı “Query” kontrolü ile bağlantı koptuğu anda işleyen bir yordamdır.Close” komutu bu yordamı otomatik olarak işletecektir. begin ShowMessage('İşlemi İptal Ettiniz'). procedure TForm1. • AfterCancel Yordamı “Navigator” kontrolündeki (kodla oluşturmuş ta olabilirsiniz)Cancel düğmesinin tıklanılması durumunda işleyen bir yordamdır. • AfterDelete Yordamı “Query” kontrolünden bir kaydın silinmesi durumunda otomatik olarak işleyen bir yordamdır.Query Kontrolüne Ait Yordamlar: Query kontrolüyle işlem yaparken kontrolün kullandığı bir çok tetikleyici ile çalışabilirsiniz. procedure TForm1. procedure TForm1.Query1AfterClose(DataSet: TDataSet). Aşağıda bu tetikleyicilere değinilmektedir. end. end.

begin ShowMessage('Kayıt Eklemek İstediniz'). Sadece birincisi işlem tamamlandıktan önce diğeri ise tamamlanmadan sonra işlemektedir. end. begin ShowMessage('Kayıt Değiştirme Moduna Geçtiniz).Query1AfterEdit(DataSet: TDataSet).Query1AfterInsert(DataSet: TDataSet). procedure TForm1. end. • AfterRefresh Yordamı “Refresh” düğmesine tıklanıldıktan sonra otomatik olarak işleyen bir yordamdır. begin ShowMessage('Kayıt İşlemi Başarıyla Tamamkandı'). begin ShowMessage('Kayıtlar Güncellendi'). • OnCalcFields Yordamı “Query” kontrolünde sütunları hesaplatmak için kullanılan yordamdır. • AfterPost Yordamı Kaydet düğmesine basıldıktan sonra işleyen yordamdır. procedure TForm1. 668 . end. • AfterInsert Yordamı Kayıt ekleme işlemi yapıldığı anda otomatik olarak işleyen bir yordamdır. end. Table kontrolünde bu yordama örnek verilmiştir. Örnek verilen yordamların “Before” ile başlayanları da “After” ile aynı zamanda tetiklenmektedir. procedure TForm1.Query1AfterPost(DataSet: TDataSet).Query1AfterRefresh(DataSet: TDataSet).procedure TForm1. Bu yüzden tekrar örneklendirilmeyecektir.

669 . “Finish” ten sonraki ekran görüntünüz yukarıdaki şekilde gerçekleşecektir. Buradan sonraki adımları “Table” kontrolünde yaptığımız şekilde tamamlayıp “Finish” buttonuna tıklayın. Aşağıdaki pencere açılacaktır. Yeni açılan pencereden “SERVIS” tablonuzu bularak “Next” düğmesine tıklayın. izleyerek “Query” kontrolü ile tablolarınıza “File->New->Other” seçeneklerini seçin. Bu pencerede “DataSet Options” kısmından “Create a form using Tquery objects” seçeneğini işaretleyip Next düğmesine tıklayın. Açılan “New Item” penceresinden “Business” yaprağında yer alan “Database FormWizard” iconuna çift tıklayın.Wizard Kullanarak Query Kontrolüyle Tabloya Bağlanmak: Aşağıdaki adımları bağlanabilirsiniz.

Query1.Clear. Query1. begin if Key=#13 Then begin Query1. sadece sizin işinize yarayan kayıtları listelemek isteyeceksiniz.Add Bu method daha önceden anlatılmıştı.Add('Select * from servis Where MAGAZAADI=:MAG'). İlk parametreyi “params[0]” veya ismi ile kullanabilirsiniz.SQL.SQL.SQL.Query Kontrolüne Parametre Değeri Göndermek: Çoğu durumda tablonuzda yer alan tüm kayıtları değilde.SQL. Bu işlemi yapmak hiçte zor değil. begin Query1. İşin içerisine parametre değeri girdiği zaman aşağıdaki özellik ve methodlarıda öğrenmeniz gerekmektedir.//parametreleri temizle end. var Key: Char). var Key: Char).SQL. Böyle durumlarda “Query” kontrolüne bana sadece göndereceğim parametre değerine uyanları listele demelisiniz.Add('Select * from servis Where MAGAZAADI=:MAG'). procedure TForm2. procedure TForm2. Fakat burada hem sorguyu hemde parametreyi yaratacağımız için tekrar göstermemiz gerekiyor.SQL. end. Daha sonraki adımlarda bu parametreye programınızın içerisinden kolayca değer gönderebilirsiniz.Edit1KeyPress(Sender: TObject. • Query1. İkinci parametreyi yaratırsanız oda params[1] olacaktır. 670 .Clear Var olan “Query” yi kapatıp tüm parametreleri temizlemek için kullanılan methoddur. end. Kod satırında yer alan (Where MAGAZAADI=:MAG) bölümü hem parametreyi hemde sorgu koşulunu belirlemektedir. Sorgu içerisinde parametre belirlemek için “=:” karakterleri kullanılmaktadır (aslında buradaki = kendi görevini yapıyor ama beraber düşünmenizin bir sakıncası yoktur). • Query1.Edit1KeyPress(Sender: TObject.Clear.

• Query1.Add('sELECT * fROM servis').Params[] Sogu komutu içerisinde yaratılan parametrelere değer göndermek için kullanılan methoddur.AsString:=Edit1.Add('Select * from servis Where MAGAZAADI=:MAG').SQL.//parametreye değer al end.DatabaseName:='gazi'. end.SQL.SQL.Edit1KeyPress(Sender: TObject.FormCreate(Sender: TObject). end. Query1.Open. Query1. 671 .Text. Query1.//temizle Query1. procedure TForm2. procedure TForm2.Clear. Şimdi aşağıdaki tasarımı oluşturup (Query kontrolüyle oluşturun) yukarıdaki özellik ve methodları örnek üzerinde deneyelim. Oluşturulma sırasına göre ilk parametre “Params[0]” ikinci parametrede “Params[1]” değişkenleriyle adlandırılacaktır. var Key: Char). Query1. begin Query1.Close.Params[0]. begin if Key=#13 Then begin Query1.

Clear.Add('Select * from servis Where MAGAZAADI=:MAG'). end.Edit1KeyPress(Sender: TObject.Add('sELECT * fROM servis'). yazdığınız mağaza ismine ait kayıtlar listelenecektir.AsString:=Edit1.SQL. 672 . “Edit” kontrolüne mağaza ismini girip “Enter” tuşuna basın.SQL. end. Query1. Query1.ParamByName “Params[]” değişkeni yerine bu özelliği kullanarak ta sorgunuza parametre değeri gönderebilirsiniz. Query1.SQL.AsString:=Edit1.ParamByName('MAG').Add('Select * from servis Where MAGAZAADI=:MAG').AsString:=Edit1. Query1. var Key: Char). begin if Key=#13 Then//enter tuşuna basarsa begin Query1. Query1.Text.Add('Select * from servis Where MAGAZAADI=:MAG'). Girdiğiniz değer parametre olarak sorguya gönderilecek.ParamByName('MAG').DatabaseName:='gazi'.Clear. end.FormCreate(Sender: TObject). Query1. Kodları ekleyip programızı çalıştırın. • Query1. procedure TForm2. Yukarıdaki örnekte yer alan kodu aşağıdaki şekilde değiştirip uygulamanızı yeniden çalıştırın. begin if Key=#13 Then begin Query1. Query1.Params[0].Text.Open.SQL. end. begin Query1.SQL.//parametreye değer yolla Query1. Query1.Open.Text. Query1.SQL. procedure TForm2.Close. Query1.procedure TForm2. end.Open.Edit1KeyPress(Sender: TObject. var Key: Char).

ParamByName('SER').DatabaseName:='gazi'. procedure TForm2.Clear. end. Query1. Girdiğiniz tarihten sonra yapılmış olan tüm servisler listelenecektir. Query1. Query1.SQL.Close.Parametre Olarak Tarih İçerikli Değişken Kullanmak: Parametre olarak kullanacağınız değişkenin değeri tarih içerikli olacak ise o zaman kodlamanızı aşağıdaki şekilde değiştirmelisiniz. Query1.Text).FormCreate(Sender: TObject).SQL. //Tarih değişkenine göre sorgula begin if Key=#13 Then begin Query1.Edit2KeyPress(Sender: TObject. end.Open.SQL. end. “Edit” kontrolüne koşul tarihinizi girip “Enter” tuşuna basın. procedure TForm2. Query1.Open. Query1. Programı çalıştırın.AsDate:=StrToDate(Edit2. //Bağlantı işlemleri yapılıyor begin Query1. var Key: Char). 673 .Add('sELECT * fROM servis').Add('Select * from servis Where SERVISTARIHI>=:SER').

procedure TForm2.SQL. aşağıdaki şekilde bir kodlama yapmalısınız.Parametre Olarak Parasal İçerikli Değişken Kullanmak: Parametre değeri olarak parasal değer kullanacaksanız.Edit3KeyPress(Sender: TObject.Add('sELECT * fROM servis').FormCreate(Sender: TObject).Open.ParamByName('FAT').DatabaseName:='gazi'. end.Text). 674 .AsCurrency:=StrToCurr(Edit3.SQL. Query1. Query1. Query1. end. end.Open. //Parametreye göre sorgula begin if Key=#13 Then begin Query1.SQL.Clear. Query1. Query1. //Bağlantı için gerekli olan kod satırları begin Query1. procedure TForm2.Add('Select * from servis Where FATURATUTARI>=:FAT'). var Key: Char). Query1.Close.

Text).SQL.SQL. Ardından “Göster” isimli buttona tıklayın.Close.//ikinci parametre Query1.Open.Birden Fazla Parametre Değeri Göndermek: Oluşturacağınız sorguda birden fazla parametre değeri kullanacaksanız. Query1. Aşağıdaki şekilde bir kodlama yapmalısınız.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2').AsCurrency:=StrToCurr(Edit3.Params[0].FormCreate(Sender: TObject). 675 . Query1. begin Query1.Add('sELECT * fROM servis').Text). end. Programı çalıştırıp “Edit” kontrollerine parasal içerikleri girin. Sadece yazmış olduğunuz kriterlerin arasındaki fatura tutarları listelenecektir.AsCurrency:=StrToCurr(Edit4.//ilk parametre Query1. Query1.SQL.Open. procedure TForm2. Query1.Params[1]. end. Diğer fatura tutarlarına ait satırlar gösterilmeyecektir. Query1.Clear.DatabaseName:='gazi'. procedure TForm2.Button1Click(Sender: TObject). begin Query1.

Query1.Text='') and (Edit4.Add('Select * from servis Where FATURATUTARI<=:FAT').Open.SQL.Button2Click(Sender: TObject).SQL. Query1.AsCurrency:=StrToCurr(Edit4.Text='' Then begin 676 .Clear. end. end else if Edit4.FormCreate(Sender: TObject).DatabaseName:='gazi'. //opsiyonel sorgulama begin if (Edit3. Query1. procedure TForm2. procedure TForm2. Query1. Öncelikle aşağıdaki tasarımı oluşturunuz.Text='') Then ShowMessage('Lütfen En Az Bir Parametre Giriniz') else if Edit3. ikiside dolu olursa iki kriteride dikkate alarak sorgulama yapacağız.Text). begin Query1.Close.Params[0]. Fakat içlerinden bir tanesi boş olduğu zaman diğer parametreye göre.Open. Query1.Text='' Then begin Query1.Add('sELECT * fROM servis'). Query1.Opsiyonel Parametreli Sorgu Oluşturmak: Bu bölümde yine sorgumuz için iki adet “Edit” kontrolü kullanacağız.SQL.

SQL.Params[0].Params[1].AsCurrency:=StrToCurr(Edit3.AsCurrency:=StrToCurr(Edit4. Query1.Open. end.SQL. Query1. Eğer iki parametreyede değer girilirse bu defa parametre değerlerinin arasındaki fatura tutarlarının yer aldığı kayıtlar listelenecektir.Text). Query1. Programı çalıştırın. 677 .Add('Select * from servis Where FATURATUTARI>=:FAT').Clear.Text). end. birinci parametre değerinin üzerinde fatura tutarı olan kayıtlar listelenecektir.Text).AsCurrency:=StrToCurr(Edit3.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2').Params[0]. Şayet birinci kontrol doldurulup ikincisi boş bırakılırsa bu durumda ikinci kontrol hiç dikkate alınmayacak.SQL.Open. Aynı şekilde birinci kontrol boş bırakılıp ikinci parametre değeri girilirse o zaman birinci parametre dikkate alınmayarak sadece ikinci parametreye aktarılan tutarın altındaki kayıtlar listelenecektir.SQL. Şayet iki “Edit” kutusuda boş bırakılırsa “Lütfen En Az Bir Parametre Giriniz” uyarısı kullanıcıya iletilecektir. Query1. Query1.Clear. end else begin Query1.Query1. Query1. Query1.

Ama genellikle statik bilgilerin yer aldığı tabloda primary.Birden Fazla Tablo İle Çalışmak: Çok fazla sütuna sahip tablolar yerine. Dikkat etmeniz gereken hususlar olacaktır. Ayrıca ilişki yaratacağınız sütunların iki tabloda da indexlenmesi lazımdır. Tabloları bölme işlemi rasgele bir şekilde yapılamaz. Tabloların fazla büyümesi performansı etkileyen çok önemli bir faktördür. hemde tablonuzu boş yere şişirmiş olacaktınız. Şimdi aşağıdaki iki tabloyu oluşturarak. Bu tablolardan birincisi mağazalara ait statik bilgilerin tutulduğu ve mağaza adının “Primary” index olarak tanımlandığı “MAGAZA” tablosu. (Index lerin Primary veya Secondary olması önem arz etmez. ilişkili tablolarda işlemlerin nasıl yaptırılabileceğini açıklayalım. bir çok sütuna gereksiz verileri girmiş olacaktınız. Bu iki 678 . Tablo1:MAGAZA TABLOSU Fieeld Name(Sütun İsmi) MAGAZAADI ADRES TELEFON MUDUR SEHIR Type(Tipi) A A A A A 25 25 15 25 25 Size (Kaç Karakter) Key(Primary ind) * Tablo2:SERVIS TABLOSU Fieeld Name(Sütun İsmi) SIRANO MAGAZAADI SERVISTARIHI GIDENFIRMA ARIZASEBEBI FATURATUTARI Type(Tipi) + A D A A $ 25 25 25 Size (Kaç Karakter) Otomatik artar Key(Primary ind) * Secondary Index Yukarıdaki iki tablo yerine tek bir tablo yapsaydınız. İki adet tablomuz var. dinamik bilgilerin yer aldığı tabloda da secondary index kullanmak en iyi ve doğru çözümdür. Bu tür ilişkiler Bire-Çok lu ilişki olarak adlandırılmaktadır). İkincisi ise mağazalara ait dinamik bilgilerin yer aldığı ve mağaza adı sütununun “Secondary” index olarak tanımlandığı “SERVIS” tablosu. daha az sütunlu ve fazla tablo ile (tabiiki mümkün olabiliyor ise) çalışmak performansınızı etkileyen çok önemli bir faktördür. haliylede hem sıkıcı olacaktı. Böldüğünüz iki tablo arasında ilişki kurabileceğiniz bir sütunun muhakkak olması gerekecektir.

Karşınıza aşağıdaki pencere açılacaktır. Bu adımda karşınıza gelen pencereden master tablonuzda. “Form Options” kısmından “Create a master/detail form” seçeneğini.tablo arasında indexli sütunlar kullanılarak “Master-Detail” form yapısı oluşturulacaktır (ilişki yaratılacaktır). Açılan yeni pencereden “Vertically” işaret düğmesini seçerek “Next” düğmesine tıklayın. “DataBase Form Wizard” seçeneğini seçip “OK” Buttonuna tıklayın. Uyarı:Paradox tablolarında “primary” index oluşturmadan “secondary” index yaratamazsınız. “File->New-Other” adımlarını izleyerek açılan pencereden “Business” yaprağını aktifleştirin.”Dataset Options” kısmından da “Create a form using Ttable object” seçeneğini işaretleyip Next düğmesine basın. Bu pencere de aliasınızın (gazi) referans gösterdiği klasörün içerisinde yer alan “MAGAZA” tablosunu seçerek “Next” düğmesine tıklayın. Aşağıdaki adımları izleyiniz. Formda gözükmesini istediğiniz sütunları “Available Field” listesinden “Ordered selected Fields” listesine aktarıp “Next” düğmesine basın (biz bütün sütınları aldık). formun üzerine gözükmesini istediğiniz sütunları belirlenizi isteyecektir. Açılan pencerede. Karşınıza ilk olarak “Master” tablonuzu seçebileceğiniz pencere gelecektir. 679 .

Yeni bir pencere açılacaktır bu pencereden “Left” seçeneğini seçip “Next” düğmesine tıklayın. “SERVIS” tablosunu seçerek “Next” düğmesine tıklayın. Aşağıdaki pencere açılacaktır. Açılan yeni pencere “Detail” tablonuzdan formun üzerinde gözükmesini istediğiniz sütunları seçmenizi isteyecektir (Biz SIRANO hariç tüm sutunları dahil ettik). Karşınıza aşağıdaki pencere açılacaktır. Next düğmesine tıklayın. Bu pencereden “Detail” olarak kullanacağınız tabloyu seçmenizi isteyecektir. Açılan yeni pencereden “In a Grid” işaret düğmesini seçerek “Next” buttonuna tıklayın. 680 .

“Master-Detail” form yapısında “Delphi” sizin yerinize formunuza iki adet “Table” . Master tablonuzdan bir mağaza ismini seçtiğiniz zaman “Detail” tablonuzda (DataGrid içerisinde) sadece o mağazaya yapılmış olan servisleri listeleme şansını bulacaksınız. Yarattığınız ilişki “Joined Fields” listesinde aşağıdaki gibi oluşturulacaktır. Çünkü “SERVIS” tablosuna kayıt girerken (DataGrid içerisinden) mağaza adını kendisi otomatik olarak belirleyecektir. iki adet “DataSource”. “Finish” deyip wizardı bitirin. Next düğmesine basın. “MAGAZAINDEX” (mağazaadı sütunu için tanımlanan secondary index) olanını seçin. Haliyle kullanıcının yapabileceği yanlış isim girme işlemlerinin önüne geçmiş olacaksınız. Bu yapıda çok önemli bir özellik barınmaktadır.Bu pencerede “Available Indexes” listesinde “Detail” tablosundaki tüm index ler gözükecektir. master tablodaki sütun sayısı kadar “Edit” 681 . Yukarıdaki adımlardan sonra “Delphi” sizlere “Master-Detail” içeriği olan bir form yapısı oluşturacaktır. “DetailFields” listesinde otomatik olarak gözükecektir. Bu yapının diğer bir özelliğide var olmayan bir mağazaya yanlışlıkla servisin yapılamayacağıdır. “Detail Fields” listesinden “MAGAZAINDEX” ve “Master Fields” listesinden de “MAGAZA ADI” sütununu seçip “Add” buttonuna tıklayın.

kontrolü ve “Detail” tablo bilgilerinizi topluca listelemeniz için “DataGrid” nesnesini yerleştirecektir. Söylemeye gerek yo sanırım. kodla veya “Object Inspector” penceresinden ayarlamalısınız(“IndexName-MasterFields-MasterSource”).”Detail” tablosu için (şayet manuel olarak siz bağlantı işlemini yapacaksanız) aşağıdaki ayarları yapmanız gerekecektir. Master Detail Form Yapısını Mauel Oluşturmak: Burada “Master” tablo için yapılan işlem sadece paradox tablosuna bağlantıyı sağlamaktır (Table1-DataSorce1). Programı çalıştırdıktan sonraki ekran görüntünüz aşağıda verilmiştir. “DataSource2” kontrolünüde “Table2” nesnesine bağlamalısınız. Koyu renkte yazılmış özellikleri. “Navigator” kontrolünde yapacağınız kayıt gezinti işlemleri “DataGrid” nesnesindeki kayıtların tamamen değişmesine (seçilen mağazaya ait kayıtları gösterecektir) sebep olacaktır. 682 .

Text. procedure TForm2. İzah edelim. öncelikle “Master” tablodan mağazayı bulacağız. Yukarıda yapmış olduğunuz form yapısına bir adet “Edit” kontrolü yerleştirerek aşağıdaki yeni tasarımı oluşturunuz. Aşağıdaki kod bloğonu “Edit” Kontrolünün “OnkeyPress” yordamına ekleyiniz. if ara=false Then begin 683 .Locate('MAGAZAADI'. //Kayıt Bul Var ara:Boolean. var Key: Char).[loCaseInsensitive]). kaydı da yeni bir servis olarak “DataGrid” nesnesine ekleyeceğiz.Edit1KeyPress(Sender: TObject.Edit1. bu mağazaya göre “DataGrid” nesnesinde servisler listelenecek. Düşünün yukarıdaki “Master-Detail” yapıda herhangi bir mağazaya servis yapıldığı zaman faturayı nasıl işleyeceksiniz.Master-Detail Tablolarda Kayıt Arama İşlemleri: Neredeyse bütün projelerinizde kullanacağınız bir uygulama seçeneğidir. begin if Key=#13 Then begin ara:=Table1.

Programı çalıştırın. 684 . Aksi takdirde uygulamada bir çok sıkıntı yaşayabilirsiniz. end end.ShowMessage('Kayıt Bulunamadı'). Hatırlatma:”Master-Detail” tablo yapısında iki tabloda da ilişkilendirilecek olan sütunları index olarak tanımlayın. Çalıştırıldıktan sonraki form görüntüsü aşağıda verilmiştir. end. Bilgisayarın yaptığı işlemse “MIGROS” mağazasını “Master tabloda aktifleştirmek. Ardından aradığınız mağaza ismini girip klavyeden “Enter” tuşuna basın. “Detail” tablonuzda o mağazaya ait yapılmış servisleri listeleyecektir. Gireceğiniz faturayı DataGrid nesnesinin en son satırına ekleyebilirsiniz. Yukarıdaki örnekte “Edit” kontrolü içerisine aradığımız mağaza ismi olarak “MIGROS” değerini girip “Enter” tuşuna bastık. “Master” tablonuz o mağazayı gösterecek. arkasından ona bağlı olarak çalışan “Detail” tablosunda da “MIGROS” mağazasına yapılmış olan servisleri listelemek olmuştur.

DBLookupComboBox Kontrolü: Başka bir tablonun (veya Query nin) sütun bilgilerini listelemek için kullanılan en etkili kontroldür. • DBLookupComboBox1. ComboBox ın açılan penceresindeki değerleride “MAGAZA” tablosunda yer alan “MAGAZAADI” sütunundan aldırabilirsiniz. DBLookupComboBox1.FormCreate(Sender: TObject).DataField:='MAGAZAADI'. Daha önceden oluşturduğumuz “MAGAZA” ve “SERVIS” tabloları için söyle bir senaryo üretelim. Şimdi bu işlemleri nasıl yapabileceğinizi detaylı olarak izah etmeye çalışalım. Öncelikle servis tablosuna girilecek kayıtlarda mağaza tablosunda olmayan bir mağazanın bulunması çok kötü sonuçlar doğuracaktır.DataField Kontrole girilen içeriğin kaynakta yazdırılacağı sütunu belirleyen özelliğidir (Aynen DBEdit kontrolünde olduğu gibi). Kullanıcı mağaza adını girerken “MIGROS” yerine “MAAGROS” veya “DIA” yerine “DIYA” yazabilir. begin DBLookupComboBox1. “SERVIS” tablosuna girilecek mağaza adını kullanıcıya klavyeden girdirmeyip.Lookup İşlemleri Birbirleriyle ilişkili tablo yapılarında “Lookup” işlemleri sizlere tahmin edemeyeceğiniz kadar kolaylıklar sağlayacaktır. procedure TForm3.DataSource Bu özellik sayesinde içerisine girilen kayıtların yazdırılacağı kaynak belirlenebilir (Aynen DBEdit kontründeki özellik gibidir). Bağlantı işlemlerinde kullanacağınız extra özellikleri aşağıda verilmiştir. begin DBLookupComboBox1. • DBLookupComboBox1. bu hata binlerce kaydın girildiği tablolarda çok normal karşılanabilir bir durumdur.DataSource:=DataSource2. Ama isterseniz böyle bir hatanın oluşmasını aşağıda anlatacağım yöntemle tamamen önleyebilirsiniz. procedure TForm3.DataSource:=DataSource2.FormCreate(Sender: TObject). 685 . ekleyeceğiniz bir ComboBox kutusundan seçtirtebilirsiniz. end. end.

procedure TForm3.ListField İçeriğin belirtildiği kaynakta birden fazla sütun olabileceği için hangi sütunla ilişkilendirileceği bu özellikle belirlenmelidir.ListSource:=DataSource2.ListField:='MAGAZAADI'.DataField:='MAGAZAADI'. DBLookupComboBox1. begin DBLookupComboBox1.Open. 686 .KeyField ComboBox ın içeriğinde yer alacak liste değerlerinin hangi sütundan alınacağı bu özellikle belirlenir. DBLookupComboBox1.FormCreate(Sender: TObject).FormCreate(Sender: TObject). DBLookupComboBox1. DBLookupComboBox1. “ListField” ile “KeyField” aynı şeyi yapıyor gibi gözüksede kesinlikle yanlış bir tesbit. • DBLookupComboBox1.ListField:='MAGAZAADI'. DBLookupComboBox1. DBLookupComboBox1.Open. end. begin DBLookupComboBox1. procedure TForm3.DataSource:=DataSource1.DataSource:=DataSource1. begin DBLookupComboBox1.DataField:='MAGAZAADI'.ListSource:=DataSource2.FormCreate(Sender: TObject). end.DataField:='MAGAZAADI'.ListSource Kontrolün içerisinde gösterilecek olan sütun (diğer tablodaki) bilgilerinin yer aldığı kaynağı belirleyen özelliğidir (Bu özellik “DBEdit kontrolünde yoktur). Table1.KeyField:='MAGAZAADI'.DataSource:=DataSource1. DBLookupComboBox1. Table1.• DBLookupComboBox1. procedure TForm3. DBLookupComboBox1.ListSource:=DataSource2. DBLookupComboBox1. • DBLookupComboBox1. Bu husus için bir sonraki bölüme bakınız. end.

Table1. sedece açılan listeden mağaza adını seçme işlemini gerçekleştirecektir. Programı çalıştırdıktan sonra kullanıcı “MAGAZAADI” sütunu için ekleyeceği veya değiştireceği kayıtlar da klavyeyi kullanmayacak. Query1. begin Query1.ListField:='MAGAZAADI'. DBLookupComboBox1.DataField:='MAGAZAADI'.SQL. Query1. Bu seyede oluşabilecek hataların (yanlış mağazayı seçerse sizin yapabileceğiniz hiçbir şey yoktur.DatabaseName:='gazi'.Add('Select MAGAZAADI from MAGAZA'). Yüzde yüz kullanıcı hatası olur. Ama unutmayın önleyebileceğiniz kullanıcı 687 . Aşağıdaki tasarımı oluşturunuz (Edit kontrollerini Table1 nesnesine. DBLookupComboBox1. DataSource2. DBLookupComboBox1.ListSource:=DataSource2. DBLookupComboBox1.Şimdi özelliklerini anlattığımız kontrolleri örnek üzerinde görmeye çalışalım.Open. procedure TForm3. DBLookupComboBox1. end.Open.FormCreate(Sender: TObject). Table1 nesnesini paradox ta yarattınız servis tablonuza bağlamayı untmayınız).DataSource:=DataSource1. Ayrıca formunuza bir adet “Query” (diğer tablo bağlantısı için kullanılacak) ve bir adet “DataSource” (Query kontrolüne bağlanacak) kontrolü daha eklemeyi unutmayınız (Bağlantı işlemleri tamamen kodla yapılacağı için bu iki kontrole properties penceresinden müdahale etmenize gerek yoktur). Aşağıdaki kod bloğunuda “Unit” pencerenize ekleyiniz.DataSet:=Query1.KeyField:='MAGAZAADI'.

end. begin Form3.Text.DBLookupComboBox1Click(Sender: TObject). end.Text Kontrolün gösterdiği değer bu özellikte saklanmaktadır. //Kaç Satır begin DBLookupComboBox1.Caption:=DBLookupComboBox1. • DBLookupComboBox1. Şayet satır elemanları daha fazla ise öbür elemanlara kaydırma çubuğu sayesinde erişilebilir.DropDownRows Kontrol içerisindeki liste açıldığı zaman gösterilecek olan satır sayısı bu özellikle belirlenir. procedure TForm3. • DBLookupComboBox1.DBLookupComboBox1Click(Sender: TObject). 688 . Programın çalıştırıldıktan sonraki görüntüsü aşağıdaki pencerede gösterilmektedir. procedure TForm3.DropDownRows:=8.hatalarınıda mutlaka ekleyeceğiniz kodlarla minimuma indirmeye çalışınız) neredeyse tamamının önüne geçmiş olacaksınız. Kayıt girerken veya değiştirirken kullanıcının “ComboBox” içerisinde var olan listeyi kullanacağını sakın untmayınız.

Query2. Query2. 689 . Yani seçtiğimiz mağaza ismine ait servisleri listeleyeceğiz. “Unit” pencerenize ekleyiniz. Aynı forma ikinci bir “Query” ve Datasource nesnesiyle beraber bir adette “DBLookupListBox” kontrolü yerleştiriniz. Programa ait kod bloğu aşağıda verilmiştir. Query2. DataSource2.Open. end.SQL.KeyField:='MAGAZAADI'.FormCreate(Sender: TObject). Ardından da listeden seçilen mağaza adına göre “DataGrid” nesnesinde sorgulama yapacağız.Open. begin Query1. DBLookupListBox1.Amacımız “MAGAZA” tablosundaki mağaza adlarını liste içerisinde göstermek olacaktır.DataSet:=Query2.DBLookupListBox Kontrolü: Karakteristik olarak “DBLookupComboBox” kontrolüne ait özellikleri aynen kullanır. Kontrolü anlamanız için aşağıdaki şekilde “Query1” kontrolünü kullanarak “DataGrid” nesnesi (DataSource1 ve kullanılarak) içerisindeki satırları doldurun (Bu hususta bağlantının nasıl yapılabileceği daha önce detaylı olarak anlatılmıştır). procedure TForm4.DatabaseName:='gazi'.Add('Select MAGAZAADI from MAGAZA'). DBLookupListBox1.ListSource:=DataSource2.

DBLookupListBox1DblClick(Sender: TObject).Clear.Params[0]. Query1.Open. 690 .SQL. var deger:AnsiString. end.SelectedItem.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG'). begin deger:=DBLookupListBox1. Query1. Programı çalıştırdıktan sonra listeden üzerine çift tıklayacağınız mağaza adına ait yapılmış olan tüm servisler “DataGrid” nesnesinde gösterilecektir. Query1.AsString:=deger.procedure TForm4. Query1.

Tabloda Lookup Sütunları Yaratmak: Lookup kontrolleri dışında tablonuzda direk lookup sütunları oluşturursanız. kayıt ekleme ve değiştirme zamanlarında sizlere çok büyük kolaylıklar sağlayacaktır. Formunuza ikinci bir “Table” nesnesi ekleyin. 691 . Öncelikle aşağıdaki iki tabloyu “yeniler” isimli bir “alias” oluşturup içerisine kaydedin. Şimdi “Table” kontrolü kullanarak “DataGrid” nesnesinde ikinci tablonun (SATIS) tüm kayıtlarının gösterilmesini sağlayıp aşağıda verilen adımları izleyin. Tablo1:URUN Tablosu Fieeld Name(Sütun İsmi) BARKODNO URUNADI FIYATI Type(Tipi) N A $ 25 Size (Kaç Karakter) Key(Primary ind) * Tablo2:SATIS Tablosu Fieeld Name(Sütun İsmi) SIRANO URUNADI SATISTARIHI FIYATI KDV TOPLAMTUTAR Type(Tipi) + A D $ $ $ 25 Size (Kaç Karakter) Key(Primary ind) * Uygulamadaki amaç ikinci tabloya kayıt girerken “Ürün Adı” nı seçtiği zaman “FIYATI” sütunu değerini otomatik olarak birinci tablodan alacak (doğabilecek fiyat farklılıklarını bu şekilde her zaman engelleyebilirsiniz). Olayı örnek üzerinde izah etmek istiyorum.

Yoksa “Lookup” işlemleriyle herhangi bir ilgisi yoktur. “TableName” özelliğine de “URUN” (birinci tablo) tablosunu aktarın.AsCurrency:=Table1FIYATI. “LookupKeyFields” özelliğine de “FIYAT” sütununu aktarın. “LookupResultField” özelliğine “URUNADI” sütununu. Açılan pencereden “URUNADI” sütununu seçip “Object Inspector” penceresinden “FieldKind” özelliğine “fkLookup”. Yukarıdaki kod satırını yazmamdaki amaç ürünün fiyatı belirlendikten sonra “KDV” ile “TOPLAMFIYAT” sütunlarının değerlerinin otomatik olarak (hiç bir tetikleyici kullanmadan) hesaplanmasını istemiş olmamdan kaynaklanmaktadır.15.”KeyFields” özelliğine “FIYATI” sütununu.AsCurrency:=Table1FIYATI. Active özelliğini de true yapın. Açılan menüden “Fields Editör” seçeneğini seçin. Bu adımda “KDV” ile “TOPLAMFIYAT” sütununu beraberce seçip “FieldKind” özelliklerini “fkCalculated” yapın. Ama proje olması açısından bunlarıda aynen uygulayın. Table1TOPLAMFIYAT. procedure TForm3. //Hesapla begin Table1KDV. Bundan sonra yapacağımız kısım Lookup işlemleri için zorunlu değildir.15.AsCurrency*0. 692 . end.AsCurrency*1. “Lookup Dataset” özelliğine “Table2”.“DataBaseName” özelliğine Alias isminizi (yeniler). Şimdi eklemiş olduğunuz ilk “Table” (Table1) nesnesini seçip mousun sağ tuşuna tıklayın. Aşağıdaki kod bloğunuda gösterilen yordama ekleyip projenizi çalıştırabilirsiniz.Table1CalcFields(DataSet: TDataSet).

• Table1. Bu pencereden herhangi bir ürünü seçtiğiniz vakit. “URUNADI” Sütununa mous ile çift tıklarsanız sağ tarafında açılan bir pencere belirecektir (Lookup olayı).//ilk sütun end.LookupDataSet Kontrolün içerisinde gösterilecek değerlerin bulunduğu sütun değerinin hangi tablo içerisinde olduğunu belirleyen özelliğidir. Diğer sütun bilgileri yerlerini almış şekilde beklemektedir.LookupDataSet:=Table2.Programı çalıştırdıktan sonra “Kayıt Ekle” düğmesine (+) basın. begin TABLE1. Dördüncü adımdaki Lookup işleminde kullanılan özellikleri ayrıca izah etmek istiyorum.LookupKeyFields Seçilen değerin diğer tablodaki hangi sütun değerine yazılacağını belirleyen özelliğidir. • Table1. “URUNADI” sütunundan “TV” seçildikten hemen sonraki “DataGrid” görüntüsünü yukarıda görebilirsiniz. procedure TForm2.Fields[0]. hesaplama işlemleri için yukarıdaki kod çalıştırılarak diğer iki sütun daha hesaplattırılacaktır.Fields[0]. bu ürünün birinci tablodaki fiyatı otomatik olarak ikinci tabloya aktarılacak (FIYATI sütununa).FormCreate(Sender: TObject). Bunları “Object Inspector” penceresinden ayarladık dilerseniz aşağıdaki şekilde kodlada değerlerini atayabilirdiniz. 693 .Fields[0].

Fields[0].Fields[0].FieldKind:=fkLookup. Table1.KeyFields:=Table1FIYATI.LookupDataSet:=Table2. begin TABLE1. begin Table1. end.FormCreate(Sender: TObject).Fields[0]. • Table1. end.Fields[0]. begin TABLE1. • Table1.KeyFields Seçilen değerin ana tabloda hangi sütun yerine yazdırılacağını belirleyen özelliğidir. • Table1.Fields[0].LookupKeyFields:=Table1. procedure TForm2.AsString.AsString.FieldKind Sütunun hesaplanma şeklini belirleyen özelliğidir. 694 .Fields[0].Fields[0]. “fkLookup” değeri atanırsa başka bir sütuna ait değeri kullanabilir.LookupResultField:=Table2FIYAT.//ikinci sütun end.Fields[0].Fields[0]. procedure TForm2.FormCreate(Sender: TObject).FormCreate(Sender: TObject).FormCreate(Sender: TObject).procedure TForm2.Fields[1].Fields[0].Fields[1].LookupKeyFields:=Table1.Fields[1]. end.LookupResultField Açılan listede gösterilecek olan kayıtların kaynağı olarak kullanılacak olan sütun ismini belirleyebileceğiniz özelliğidir.LookupResultField:=Table2FIYAT.AsString.LookupDataSet:=Table2.AsString. Table1. begin TABLE1. Table1.AsString.Fields[0].LookupKeyFields:=Table1.LookupDataSet:=Table2. procedure TForm3.AsString. Table1. Table1. Table1.Fields[0].Fields[0].

Her ne kadar örnek üzerinde daha detaylı alıştrmalar yapılacak olsa da yinede bu yapraktaki kontrollerden kısaca bahsetmek istiyorum. Şimdiki bölümde ise kaydettiğimiz bu tablolara ait bilgileri yazıcıya düzgün bir şekilde gönderme işlemini gerçekleştireceğiz. Delphi içerisinde rapor oluşturabilmek için iki yönteminiz bulunmakta. işinizin devamının getirilebilmesi için unutmayınızki rapor sayfalarınız çok düzgün şekilde oluşturulmalıdır. ikincisi ise “Qreport” yaprağındaki kontrolleri kullanarak rapor oluşturmaktır. Biz “Qreport” yaprağını kullanarak rapor oluşturacağız. “Qreport yaprağının eklendiğini göreceksiniz. Add Buttonuna basarak aşağıdaki adresteki dosyayı seçin. “C:\ProgramFiles\Borland\Delphi7\Bin\dclqrt70.Rapor Dosyaları Oluşturmak: Şu ana kadar işlenen bölümlerde oluşturduğumuz arayüzler sayesinde kontrolleri kullanarak çeşitli bilgileri tablo halinde Harddisk’e kaydetme işlemini gerçekleştirdik. Aşağıda “Qreport” yaprağını yüklemek için izleyeceğiniz adımlar gösterilmiştir. “Component->Install Packages” adımlarını izleyin. bu yüzden doğru klasörden yükleme işlemini gerçekleştirmelisiniz. Yazdığınız kodlar ne kadar güzel olursa olsun. 695 . Birincisi “Rave” kontrolleri ile rapor.bpl” “Ok” Basın. Bu yüzden ilk olarak yazdıracağınız tabloya ait bağlantı işlemlerini kesinlikle gerçekleştirmek zorundasınız. Rapor oluşturmak için formunuzun üzerinde muhakkak kaynak tablo ile bağlantısı olan “Table” veya “Query” veya “Stored Procedure” kontrollerinden bir tanesinin bulunması gerekmektedir. Şimdi bu yapraktaki kontrolleri kullanarak nasıl rapor oluşturabileceğinizi göstereceğim. Bağlantı işlemlerini başarılı bir şekilde gerçekleştirdikten sonra aşağıdaki kontrolleri kullanarak kolaylıkla sonderece profesyonel rapor dökümanları oluşturabilirsiniz. Bu yaprak varsayılan olarak yüklenmemiştir.

QRSubDetail Kontrolü: QuickRep kotrolüne yavru band eklemek için kullanılan bir kontroldür. QRSysData Kontrpolü: Sayfa numarası. tarih. Genel Toplam hesaplattırılırken bu kontrolden faydalanılır. Bandın tipi daha sonra değiştirilebilmektedir. toplam sayfa . QRMemo Kontrolü: Uzun karakterli verileri yazdırmak için kullanılan kontroldür. QRExpr Kontrolü: Diğer hücre değerlerini kullanarak hesap yapabilen bir kontroldür.Bir çok bandı bulunmaktadır. QRGroup Kontrolü: Şayet raporda gruplandırma yapılacaksa kullanılması gereken bir kontroldür. saat vs gibi değerleri yazdırabilen kontroldür. Bu bandlar kullanılarak diğer kontroller ilgili yerlere yerleştirilebilmektedir. QRLabel Kontrolü: Bantlara etiket eklemek için kullanılan kontroldür. Bu kontrolle dilediğiniz kadar açıklama satırını yazdırabilirsiniz. Tüm sayfa yapısını özelliklerini ve diğer kontrolleri üzerinde barındıracaktır.QuickRep Kontrolü: Rapor oluşturmak için kullanılması zorunlu olan bir kontroldür. Tüm açıklama verileri için bu kontrol kullanılmaktadır. QRDBText Kontrolü: Tablo sütunları ile bağlantı kuracak olan kontroldür. QRBand Kontrolü: QuickRep kontrolüne band eklemek için kullanılan kontroldür. 696 . Alt Toplam.

QRRichText Kontrolü: Farklı formattaki içerikleri yazdırmak için kullanılan kontroldür. Tekrar “QuickRep” kontrolünü seçin ve “Object Inspector” penceresinde yer alan “Bands” özelliğinin solundaki “+” işaretine tıklayın. Bilhassa firmaya ait logoyu bu kontrolle bastırabilirsiniz. Diğer sayfalara bu bandın herhangi bir etkisi yoktur. QRDBImage Kontrolü: Tabloda yer alan resimleri yadırmak için kullanılan kontroldür. Bu banda yerleştirilecek içerikler sadece raporunuzun ilk sayfasının başlangıcında yer alacaktır. Bu adımda formunuza bir adet “QuickRep” kontrolü taşıyıp bırakın. Alt seçenekleri açılacaktır. elips. Bu kontrol sayesinde daire. Table nesnenizin (Table1) Active özelliğini true yapın. Ardından table nesnesi ile tablonuz arasındaki bağlantıyı gerçekleştirin (DataBaseName ile TableName özelliklerini ayarlayın). 697 . Fieeld Name(Sütun İsmi) SIRANO MAGAZAADI SERVISTARIHI GIDENFIRMA ARIZASEBEBI FATURATUTARI Type(Tipi) + A D A A $ 25 25 25 Size (Kaç Karakter) Otomatik artar Key(Primary ind) * Secondary Index İlk olarak formunuza bir adet “Table” (Query de olabilirdi) nesnesi yerleştirin. Açılan bu bandlardan “HasTitle” olan özelliği true yapın. Aşağıdaki tabloyu oluşturup içerisindeki kayıtları yazıcıya gönderelim. QRShape Kontrolü: Geometrik şekilleri çizdirmek için kullanılan kontroldür. QRImage Kontrolü: Resim içerikli verileri bastırmak için kullanılan kontroldür. çizgi. Delphi otomatik olarak “Title” bandını “QuickRep” kontrolünün içerisinde oluşturacaktır. “QuickRep” kontrolün “Object Inspector” penceresinden “Dataset” özelliğine “Table1” değerini girin.halka vs çizdirebilirsiniz.

“HasTitle” bandı aktifleştirildikten sonra “QuickRep” kontrolüne ait görüntü aşağıdaki şekilde gerçekleşecektir. Bu banda da beş adet “QRLabel” kontrolü yerleştirip içeriklerini sütun başlıklarını gösterecek metinle doldurun. Bu band sütun başlıklarının gösterileceği bandtır. Yapmış olduğunuz değişikliklerin rapor görüntüsünü almak için “QuickRep” kontrolü üzerinde mousun sağ tuşuna tıklayıp “Preview” komutunu verebilirsiniz. 698 . rapor sayfalarınızın tamamının başlığında gözükecektir. “HasTitle” bandına raporunuzun başlığını belirlemek için bir adet “QRLabel” kontrolü yerleştirip içeriğine (Caption özelliğine) “MAĞAZA SERVİS TAKİP ÇİZELGESİ” yazın. “QuickRep” kontrolünü seçip “Object Inspector” penceresinden “HasColumnHeader” bandına true değerini aktarın.

Bu banda beş adet “QRDBText” kontrolü yerleştirip aşağıdaki ayarları herbiri için ayrı ayrı yapın. Tablo sütun bilgilerinin yer aldığı bölüm bu kısımdır. Bu adımda tekrar “QuickRep” kontrolünü seçip “Object Inspector” penceresinden “HasDetail” bandına true değerini aktarın. Tüm sayfalarda gözükmesini isteyeceğiniz üst bilgiler için bu bandı kullanabilirsiniz. 699 . “DataField” özelliğinede göstereceği sütun değerlerini aktarın. Bu banda “QRSysData” kontrolünden bir adet yerleştirip. Bu işlemi 5 kontrol için de ayrı ayrı yapın. “Object Inspector” penceresinden “Data” özelliğine “qrsDate” değerini aktarın.“QuickRep” kontrolünü seçip “Object Inspector” penceresinden “HasPageHeader” bandına true değerini aktarın. Bu kontrol artık aktif raporun basılma tarihini gösterecektir. Birinci “QRDBText” kontrolünü seçip “Object Inspector” penceresinden “DataSet” özelliğine “Table1”.

Bu band raporunuzun en sonunda gözükecek olan kısımdır. Bu banda yerleştireceğiniz “QRExp” kontrolü sayesinde tablo sütunlarınıza ait fonksiyonel hesaplatmaları yaptırabilirsiniz. “OK” Basın. 700 . “Function” ve “DataField” düğmelerini kullanarak yukarıda gösterilen formülü “Expression” penceresine girin.Şimdiki işlemimiz “QuickRep” kontrolünü seçip “Object Inspector” penceresinden “HasPageFooter” bandını aktifleştirmek olacak. Şimdi bir adet (“FATURATUTARI” sütununun alt hizasına) “QRExp” kontrolünü bu banda yerleştirip “Expression” özelliğine tıklayın. Basit raporlama için aktifleştireceğimiz son band “HasSummary” bandıdır. Bu band rapor sayfalarının hepsinde alt bilgi olarak kullanılacaktır. Bu kısma “QRSysData” kontrolünden bir adet yerleştirip “Data” özelliğine “qrsPageNumber” değerini aktarın. Aksaklığı düzeltmek için “QRExp” kontrolünü seçip “Mask” özelliğine “###. Bu işlemden sonra kontrol aktif sayfa sayısını gösterecektir.### TL” değerini aktarıp raporunuzun önizlemesini alın. Raporunuzu baskı önizleme konumuna getirirseniz görüntünüz aşağıdaki şekilde oluşacaktır. Yine “HasSummary” bandına “QRLabel” kontrolü yerleştirerek (QRExp kontrolünün etiketi olacak şekilde soluna yerleştirin) “Caption” özelliğine “TOPLAM FATURA TUTARI” yazın.###. aşağıdaki pencere açılacaktır. Genellikle sayfa sayısı veya toplam sayfa adedi gibi etiketlerin yer aldığı bölümdür. Bu aşamada raporunuza “preview” komutunu verirseniz “QRExp” kontrolü içerisinde hesaplanan değerin parasal formata çevrilmeden gösterildiğini göreceksiniz. Genellikle rapor toplamlarına ait hesaplamaların yaptırılacağı yerdir.

701 .Bu adımda sütun başlıklarının altına kalın çizgi. kayıtların altlarına da ince çizgi çekmeyi göstereceğim. Varsayılan olarak “Shape” özelliği “qrsRectangle” dır. Aynı işlemi “Detail” band bileşenlerinin (QRDBText kontrolleri) altında da yapın fakat width değerini değiştirmeyin. Yani dikdörtgen çizer. “QrShape” kontrolünden bir adet sütun başlıklarının altına (ColumHeader bandı) boydan boya çizin. Bu özelliğe “qrsHorLine” değerini aktarın ve “Pen” özelliğinin altında yer alan “Width” değerine “3” girip preview görüntüsünü alın.

Bu banda da beş adet “QRLabel” kontrolü yerleştirip içeriklerini sütun başlıklarını gösterecek metinle doldurun. kayıtlara dikkat edecek olursanız satırlar kayıt giriş sırasına göre oluşturulmuştur. Diğer sayfalara bu bandın herhangi bir etkisi yoktur. “QuickRep” kontrolün Object Inspector” penceresinden “Dataset” özelliğine “Table1” değerini girin. Tekrar “QuickRep” kontrolünü seçin ve “Object Inspector” penceresinde yer alan “Bands” özelliğinin solundaki “+” işaretine tıklayın. Bu banda yerleştirilecek içerikler sadece raporunuzun ilk sayfasının başlangıcında yer alacaktır. Delphi otomatik olarak “Title” bandını “QuickRep” kontrolünün içerisinde oluşturacaktır. Bu banda “QRSysData” kontrolünden bir adet yerleştirip.Gruplandırılmış Rapor Dosyası Oluşturmak: Yukarıdaki raporda. Alt seçenekleri açılacaktır. Açılan bu bandlardan “HasTitle” olan özelliği true yapın. Tüm sayfalarda gözükmesini isteyeceğiniz üst bilgiler için bu bandı kullanabilirsiniz. Dikkatlice inceleyiniz 702 . Aşağıda bu husus adım adım izah edilmektedir. rapor sayfalarınızın tamamının başlığında gözükecektir. Bu band sütun başlıklarının gösterileceği bandtır. “HasTitle” bandına raporunuzun başlığı belirlemek için bir adet “QRLabel” kontrolü yerleştirip içeriğine (Caption özelliğine) “MAĞAZA SERVİS TAKİP ÇİZELGESİ” yazın. Şimdi göstereceğim adımlar Gruplandırma işlemini gerçekleştirecektir. Ardından table nesnesi ile tablonuz arasındaki bağlantıyı gerçekleştirin (DataBaseName ile TableName özelliklerini ayarlayın). “Object Inspector” penceresinden “Data” özelliğine “qrsDate” değerini aktarın. Bu adımda formunuza bir adet “QuickRep” kontrolü taşıyıp bırakın. Bu kontrol artık aktif raporun basılma tarihini gösterecektir. Table nesnenizin (Table1) Active özelliğini true yapın. İlk olarak formunuza bir adet “Table” (Query de olabilirdi) nesnesi yerleştirin. Buraya kadar olan kısım yukarıdaki örnekle aynı olacaktır. “QuickRep” kontrolünü seçip “Object Inspector” penceresinden “HasColumnHeader” bandına true değerini aktarın. “QuickRep” kontrolünü seçip “Object Inspector” penceresinden “HasPageHeader” bandına true değerini aktarın. Şimdiki işlemimizde aynı mağaza ismine sahip olan kayitların alt alta ve grup halini almış şekilde listelenmesini sağlayacağız. Yapmış olduğunuz değişikliklerin rapor görüntüsünü almak için “QuickRep” kontrolü üzerinde mousun sağ tuşuna tıklayıp “Preview” komutunu verebilirsiniz.

Geri kalan dördünü bu banda yerleştirmelisiniz.“Qreport” yaprağında yer alan “QRGroup” kontrolünden bir adet “QuickRep” kontrolünün üzerine yerleştirin. “DataSet” özelliğine “Table1”. DataField” özelliğine de “MAGAZAADI” sütununu aktarın. aşağıdaki ekran görüntüsüyle karşılaşırsınız. Raporun “MAGAZAADI” sütununa göre alfabetik sırada oluşmasının sebebibi “Object Inspector” penceresinden “Index Name” özelliğine paradox tablosunda secondary index olarak tanımlanmış olan “MAGAZAADIINDEX” değerinin aktarılmış olmasından kaynaklanmaktadır (Gruplandıma yapacağınız sütunu tablonuzda index tanımlamalı ve aktif hale getirmelisiniz. Bu banda gruplandırma yapacağınız sütun veya sütunları yerleştirebilirsiniz. Dört tane dememizin sebebi “MAGAZAADI” sütunu içeriğini gösterecek olan kontrol “GroupHeader” bandına yerleştirilmiştir. Mousun sağ tuşuna basıp “Preview” görüntüsü alırsanız. Otomatik olarak “GroupHeader” özelliğini alacaktır. Dört kontrol için “DataSet” ve 703 . Bu adımda “QuickRep” kontrolünü seçip “Daha önce anlatıldığı gibi “Object Inspector” penceresinden “HasDetail” bandına true değerini aktarın. Bu bandın içerisine dört (4) adet “QRDBText” kontrolü yerleştirin. o zaman indexe gerek yoktur sadece “Gruplandırma yapacağınız sütuna göre “Order By” komutunu kullanmalısınız). Şayet Query kontrolünü kaynak olarak kullandıysanız. “Qreport” yaprağından bir adet “QRDBText” kontroünü “MAGAZAADI” sütununun altına gelecek şekilde yerleştirin.

“DataField” özelliklerini ayarlayın. “Bu adımda “QRBand1” (Group Footer) kontrolüne bir adet “QRExp” kontrolü yerleştirin. Yine bu adım gruplandırma işlemi için çok önemli. Artık bu iki band grup işlemleri için eşgüdümlü olarak çalışacaktır. “Qreport” yaprağında yer alan “QRBand” kontrolünden bir adet “QuickRep” kontrolünün üzerine çizin. Bu bandın “Object Inspector” penceresinden “BandType” özelliğine “rbGroupFooter” değerini aktarın. Varsayılan olarak “Title” bandı olarak gözükecektir. Şimdi daha önceden eklemiş olduğunuz “QRGroup1” bandını seçip “Object Inspector” penceresinden “Footer Band” özelliğine “QRBand1” değerini aktarın. 704 . Raporun tasarım anındaki en son görüntüsü aşağıda verilmiştir. “Expression” özelliğine tıklayarak aşağıdaki formülü girin.

Tekrar “QRGroup” bandını (Group Header) seçerek “Expression” özelliğine aşağıdaki formülü girin (Gruplandırma yapılacak sütunu belirtmek gerekiyor). 705 .Yapmış olduğunuz bu hesaplamanın etiketini belirlemek amaçlı “QRBand1” kontrolüne bir adet “QRLabel” kontrolü yerleştirip “Caption” özelliğine “ALT TOPLAM” içeriğini girin (“QRExp” kontrolünün hemen soluna).

Genellikle sayfa sayısı veya toplam sayfa adedi gibi etiketlerin yer aldığı bölümdür. Açılan menüden “Preview” seçeneğine tıklarsanız yukarıdaki görüntüyle karşılaşırsınız. alt toplam olarak sonuçların gösterildiği sanıyorum dikkatinizi çekmiştir.### TL” değerini aktarıp raporunuzun önizlemesini alın. Yine “HasSummary” bandına “QRLabel” kontrolü yerleştirerek (QRExp kontrolünün etiketi olacak şekilde soluna yerleştirin) “Caption” özelliğine “TOPLAM FATURA TUTARI” yazın. aşağıdaki pencere açılacaktır. “Function” ve “DataField” düğmelerini kullanarak yukarıda gösterilen formülü “Expression” penceresine girin. Aksaklığı düzeltmek için “QRExp” kontrolünü seçip “Mask” özelliğine “###.###. Bu aşamada raporunuza “preview” komutunu verirseniz “QRExp” kontrolü içerisinde hesaplanan değerin parasal formata çevrilmeden gösterildiğini göreceksiniz. Şimdiki işlemimiz “QuickRep” kontrolünü seçip “Object Inspector” penceresinden “HasPageFooter” bandını aktifleştirmek olacak. Önceki örnekte izah edildiği gibi bu band rapor sayfalarının hepsinde alt bilgi olarak kullanılacaktır. Bu işlemden sonra kontrol aktif sayfa sayısını gösterecektir.“QuickRep” kontrolünü seçip mousun sağ tuşuna tıklayın. Bu kısma “QRSysData” kontrolünden bir adet yerleştirip “Data” özelliğine “qrsPageNumber” değerini aktarın. Her mağazanın altında. “OK” Basın. 706 . Şimdi bir adet (“FATURATUTARI” sütununun alt hizasına) “QRExp” kontrolünü bu banda yerleştirip “Expression” özelliğine tıklayın. Gruplandırılmış rapor oluşturmak için aktifleştireceğimiz son band “HasSummary” bandıdır.

“Object Inspector” penceresinde yer alan “ResetAfterPrint” özelliğine true değerini aktarın. Bu aşamadan sonra mousun sağ tuşuna tıklayıp “Preview” komutunu verirseniz. “Group Footer” kısmında yer alan “Alt Toplam” değerinin kümülatif (Bir önceki alt toplama eklenerek) gittiğine dikkat etmişsinizdir. Şayet her tolamın birbirinden bağımsız olarak gösterilmesini isterseniz o zaman aşağıdaki adımları izlemelisiniz. Aşağıda raporun en son tasarım görüntüsü ile “Print preview” görüntüsü verilmektedir. “Group Footer” kısmında yer alan tüm hesaplatmalar (birden fazla hesaplatma yaptırabilirsiniz) birbirlerinden bağımsız olarak gerçekleşecektir. “Group Footer” bandında yer alan “QRExp1” kontrolünü seçin. Yani hesaplanan mağazaya ait tutara bir önceki mağazanın toplam değeri eklenmeyecektir.Raporunuzu baskı önizleme konumuna getirirseniz görüntünüz aşağıdaki şekilde oluşacaktır. 707 .

Dikkat edin alt toplam değerleri artık kümülatif değil. birbirlerinden tamamen bağımsız olarak hesaplanmaktadır. 708 .

QuickRep1. 709 . Aşağıdaki kod bloğunu kullanabilirsiniz. Doğrusunu isterseniz fazla bir uğraşa gerek yok ama bilinmesi gerekmektedir. //eklemeyi unutmayınız. Aşağıdaki uygulamada “Form1” üzerinde oluşturulmuş bir raporu “Form5” üzerine yerleştirilecek “Button” kontrolünün “OnClick” yordamından açalım.dfm} procedure TForm5.//Baskı Önizleme yap end.Button1Click(Sender: TObject). {$R *. uses Unit1. //Baskı Önizleme Al begin Form1. program içerisinden nasıl ulaşabileceğiniz hususu önem arz etmektedir.Rapor Dosyasına Uygulamanızdan Erişmek: Oluşturduğunuz raporunuzun baskı önizleme görüntüsüne.Preview.

710 .

BÖLÜM 18 REGISTRY İŞLEMLERİ 711 .

712 .

Windows menüsünde yer alan “Start->Run” seçeneklerini seçip açılan pencereye “Regedit” komutunu girin. Öncelikle Registry yapısına nasıl ulaşabileceğinizi göstermek istiyorum. Aşağıdaki gibi Registry nizde yer alan ana rootların gösterildiği pencereye ulaşacaksınız. Bu bölümde “Registry” ile ilgili işlemlerinizi “Delphi” uygulamalarından nasıl gerçekleştirebileceğinizi izah edeceğim. Burada yer alan bilgiler çok önemli olmakla beraber. Tabiki bu alt kalasörlere yazdırılmış değişken değerlerini öğrenip değiştirme hakkınızda bulunmaktadır. Aşağıda “Registry” içerisinde işlem yapabilmeniz için gerekli olan tüm açıklamalar detaylı olarak verilmektedir. Kullandıkları paket programlar buraya defalarca değer girerler ama kullanıcının bundan haberi bile olmaz. Bir çoğunuz bilirsiniz “Windows 2000” işletim sisteminde Registry’de kayıtlı beş (5) ana Root vardır. istediğinizin içerisinden alt kalasörleri silebilirsiniz. HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS HKEY_CURRENT_CONFIG Bu Rootlardan istediğinize alt kalasör ekleyebilir. 713 . Doğrusunu isterseniz tehlikeli bir konu olmakla beraber uzman programcıların bilmesi gereken bir konudur. kullanıcılar genellikle buradaki ifadelerin ne oldukları hususunu pek bilmezler.Registry: Windows’a ait teknik bilgilerin (Sizin yazmış olduğunuz projeye ait bilgilerde olabilir) depolandığı yerin adı “Registry” olarak bilinmektedir.

var deger:TRegistry. Tüm ana Root isimleri yukarıdaki kısımda verilmiştir. “Registry” kütüphanesini “uses” satırına ekledikten sonra “Registry” işlemlerinde kullanılmak üzere “Tregistry” tipli bir değişken tanımlamak zorundasınız.Button1Click(Sender: TObject). Artık Registry işlemlerini yapmak son derece kolay.//Registry işlemleri için tanımlandı begin Daha sonra bu değişkeni kod bloğunuz içerisinde yer alan “begin-end” arasında aşağıdaki şekilde yaratmalısınız. Registry’ye Veri Yazdımak: Registry’ye kayit eklemek için izlemeniz gereken adımlara geçmeden önce tüm “Registry” işlemlerinizde kullanmanız gereken bir yapıdan bahsetmek istiyorum. “Registry” değişkenini yarattıktan sonra hangi Ana Roota değer yazdıracağınızı belirtmelisiniz. Aksi takdirde değişkeninize ait değeri yazdıracağı yeri bilemeyeceği için sonuç başarısızlıkla sonuçlanacaktır.Registry’ye programınızdan ulaşmak istiyorsanız uses satırına “Registry” kütüphanesini eklemek zorundasınız.Button1Click(Sender: TObject).Create. Bu isimlerden istediğinizi kullanabilirsiniz. Belirtilmesi kesinlikle zorunlu olan bir özelliğidir. var deger:TRegistry. //uses Registry kütüphanesini eklemeyi unutmayınız. Aşağıdaki kodları çalıştırabilmeniz için bu bu kütüphane eklenmiştir.RootKey Bu özelliğe değeri yazdıracağınız veya okutacağınız ana Root un ismini aktarabilirsiniz. 714 . • deger. procedure TForm1. begin deger:=TRegistry. procedure TForm1.//değişkeni yarat end.

var deger:TRegistry. “false” değerinin aktarılması ise okuma işleminin gerçekleştirileceği anlamını taşımaktadır. var deger:TRegistry.RootKey:=HKEY_CURRENT_USER. ikinci parametrede yazdırma veya değer öğrenme işlemini belirler. deger. Birinci parametresinde değişkenin Registry’de tutulacağı ismi (daha sonra değeri okumak için bu isim kullanılacaktır). begin deger:=TRegistry. • deger.WriteString “Registry” ye String değişken değeri yazdırmak için kullanılan methoddur.Create.//AnaRoota yaz end. procedure TForm1.//Bu ana Rootla ilgileniyorum deger. begin deger:=TRegistry.OpenKey Ana Root altındaki hangi klasöre değişken değerinin yazdırılacağı (veya öğrenileceği) bu özellikle belirlenir.OpenKey(''. Birinci parametre alt klasörü. Oda birinci parametrede şayet alt klasörlerden bir tanesine değişken değeri yazdırılacaksa ilk parametrede bu alt kalsörlerin yolunu (‘AppEvents\EventsLabels’) belirtmelisiniz. “True” değerinin aktarılması yazdırma işleminin yaptırılacağı. var deger:TRegistry.true).Button1Click(Sender: TObject).RootKey:=HKEY_CURRENT_USER. Boş (‘’) string konulması Ana root a yaz anlamı taşımaktadır. deger.Button1Click(Sender: TObject). ikinci parametrede yazdırılacak olan string içeriği belirler (Bu bir string tip değişkende olabilir).//Bu ana Rootla ilgileniyorum end.Create.procedure TForm1.Button1Click(Sender: TObject). 715 . • deger. Örneklere bakınız. altklasor:AnsiString. Burada dikkat etmeniz gereken bir husus daha var. procedure TForm1.

OpenKey(''. • deger.WriteDate-deger.true).WriteInteger-deger.Create.//registry ye yaz deger.WriteCurrency Yazdıracağınız değişkenin tipi String tip değilse size uyan yukarıdaki methodlardan bir tanesini kullanmalısınız. Değişkenin içeriği de “Prestige Education Center” olacak.//Bu ana Rootla ilgileniyorum deger.WriteString('adi'.//yaz end. procedure TForm1. begin deger. • deger.Button1Click(Sender: TObject). Kodlamada aynı mantık geçerli olacaktır.'Prestige Education Center'). var deger:TRegistry.RootKey:=HKEY_CURRENT_USER. deger.CloseKey.begin deger:=TRegistry. Yukarıdaki “dershane” isimli değişken değerini “Registry’ye yazdırmak için aşağıdaki kod bloğunu kullanabilirsiniz.CloseKey İşleminiz bittikten sonra “Registry” tipli değişkeninizi muhakkak bu komutla kapatmalısınız. Şimdi “HKEY_CURRENT_USER” ana Root altına “dershane” isminde bir değişken yazdıracağız.//Kapat end. 716 .

Alt Klasöre Veri Eklemek: Önceki örneğimizde AnaRoot altına değiken değeri ekledik Şimdi ise “HKEY_CURRENT_USER” Ana Root u altında yer alan “AppEvents” klasörünün içerisindeki “Schemes” klasörüne aynı değişkenin değerini yazdıralım.RootKey:=HKEY_CURRENT_USER. end. altklasor:AnsiString.OpenKey(altklasor.'Prestige Education Center'). deger. end.WriteString('dershane'. procedure TForm1.WriteString('dershane'.Button1Click(Sender: TObject).//Bu ana Rootla ilgileniyorum altklasor:='AppEvents\Schemes'. var deger:TRegistry. begin deger:=TRegistry. altklasor:AnsiString.//alt klasöre yaz deger.'Prestige Education Center').//Bu ana Rootla ilgileniyorum deger.CloseKey.true).//registry ye yaz deger.RootKey:=HKEY_CURRENT_USER.//yazdır deger. deger. 717 .procedure TForm1.Create. //uses Registry kütüphanesini eklemeyi unutmayınız.OpenKey(''.CloseKey.Create.Button2Click(Sender: TObject).true). deger. var deger:TRegistry. deger. begin deger:=TRegistry.

• deger.Ana Root’a Alt Klasör Eklemek: Ana Root a alt klasör eklemek için “CreateKey” methodu kullanılır. //Alt Klasör Oluştur var deger:TRegistry. end.CreateKey(altklasor).CreateKey Parametre olarak girilen alt klasörleri oluşturmak için kullanılan methoddur. Kod çalıştıktan sonraki registry görüntüsü yukarıdaki pencerede gösterilmiştir.Create.//oluştur deger.Button3Click(Sender: TObject). begin deger:=TRegistry. 718 . procedure TForm1. Programı çalıştırıp Button kontrolüne tıklarsanız “HKEY_CURRENT_USER” ana Root u altında “Prestige”.CloseKey.//Bu Roota ekle altklasor:='Prestige\Gazi'. //iki klasör deger. onun altında da “Gazi” isimli alt klasörlerin oluştuğunu göreceksiniz.RootKey:=HKEY_CURRENT_USER. deger. altklasor:AnsiString. Birden fazla klasörü aynı anda ekleyebilirsiniz. //uses Registry kütüphanesini eklemeyi unutmayınız.

deger. begin deger:=TRegistry.Button4Click(Sender: TObject).CloseKey. deger.//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'. Yerini ve tipini doğru belirteceğiniz tüm değişkenleri okutabilirsiniz. sizin daha önceden eklemiş olduğunuz bir değişken de olabilir. altklasor:AnsiString.//alt klasöre yaz deger. end.Create. Değerini okuyacağınız değişken ana root altında veya alt klasörlerden birinin içerisinde bulunabilir. procedure TForm1. Her halükarda okutma yaptırabilirsiniz.RootKey:=HKEY_CURRENT_USER. Değerini oğreneceğiniz değişken. Registry’den Kayıt Okutmak: “Registry” ye değer eklenebildiği gibi şimdi bahsedeceğimiz yöntemlerle de herhangi bir klasördeki değişkenin değerinide okutabilirsiniz.true).'Prestige Education Center').Alt Klasöre Değişken Eklemek: Aşağıdaki şekilde Ana Root altında yer alan bir klasöre kolayca değişken değerleri ekleyebilirsiniz.OpenKey(altklasor.WriteString('dershane'. 719 . windows tarafından yazdırılabileceği gibi. deger. var deger:TRegistry.

Alt Klasörden Değişken Değeri Okutmak: Ana Root tan değişken değeri okuyabileceğiniz gibi.RootKey:=HKEY_CURRENT_USER. deger.OpenKey(altklasor. end.//alt klasörden oku sonuc:=deger.RootKey:=HKEY_CURRENT_USER.OpenKey(''. 720 .CloseKey.CloseKey.false).altklasor:AnsiString. deger. var deger:TRegistry. deger. deger.Button6Click(Sender: TObject).Create.Create.Caption:=sonuc.Button5Click(Sender: TObject).Ana Root Altındaki Bir Değişkenin Değerini Öğrenmek: Aşağıdaki şekilde “HKEY_CURRENT_USER” altında yer alan “dershane” isimli değişkenin değerini okuyabilirsiniz. deger.false). alt klasörde bulunan bir değişkenin değerinide aşağıdaki yöntemle okutabilirsiniz. procedure TForm1.//Bu ana Rootla ilgileniyorum deger. sonuc. • deger.Caption:=sonuc.ReadString('dershane'). Form1.ReadString('dershane'). Parametre olarak sadece okuyacağınız değişkenin ismini girmek yeterli olacaktır.ReadString Registry’den değişken değeri okutmak için kullanılan methoddur. sonuc:AnsiString.//oku Form1. //Registry den oku var deger:TRegistry. procedure TForm1. begin deger:=TRegistry. end.//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'.//ikinci parametre false dikkat edin sonuc:=deger. begin deger:=TRegistry.

Form1. deger. 721 . procedure TForm1.false).RootKey:=HKEY_CURRENT_USER. var deger:TRegistry. end.CloseKey. sonuc. Aşağıdaki örnekte “HKEY_CURRENT_USER” Ana Root unun altında yer alan “Printers” klasöründeki bir değişkenin değerini okutacağız. “DiviceOld” ismindeki bu değişken kullandığınız yazıcının ismini ve port numarasını tutmaktadır.Button7Click(Sender: TObject). deger.altklasor:AnsiString.ReadString('DeviceOld'). Aşağıdaki tasarımı oluşturun.//Bu ana Rootla ilgileniyorum altklasor:='Printers'.Windows Registry Bilgilerini Okutmak: System’e ait olan bilgileride Registry’den kolayca okutabilirsiniz. deger.OpenKey(altklasor. begin deger:=TRegistry.Create.//alt klasörden oku sonuc:=deger.Caption:=sonuc.

CloseKey.Create.//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'.DeleteValue Alt Klasörün içerisindeki değişkeni silmek için kullanılan methoddur.altklasor:AnsiString.Button8Click(Sender: TObject). //Değişkeni Sil var deger:TRegistry.Alt Klasör Silmek: Registry’de bulunan bir alt klasörü silmek için “DeleteKey” methodu kullanılmaktadır.//belirtilen alt klasörü sil deger. begin deger:=TRegistry. Alt Klasör İçerisindeki Değişkeni Silmek: • deger. end.RootKey:=HKEY_CURRENT_USER.RootKey:=HKEY_CURRENT_USER.//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'.Create.Button9Click(Sender: TObject). deger.DeleteKey Parametre olarak belirtilen alt klasörü silmek için kullanılan methoddur. //Klasör Sil var deger:TRegistry.DeleteKey(altklasor). begin deger:=TRegistry. Parametre olarak sadece silinecek değişkenin ismini girmek yeterli olacaktır. deger. sonuc. sonuc. procedure TForm1.altklasor:AnsiString. • deger. 722 . deger. Daha önce “HKEY_CURRENT_USER” Ana Rootu altında oluşturduğumuz ‘Prestige\Gazi’ klasörü içerisindeki “dershane” isimli değişkeni silmek için aşağıdaki şekilde bir kodlama kullanmalısınız. procedure TForm1.

Prosedür içerisinde parametre olarak “TstringList” tipli bir değişken kullanmak zorundasınız. if not deger.Items:=degiskenler. end.OpenKey(altklasor. • deger.GetValueNames Registrye’de bulunan ana Root ların altındaki değişken isimlerini aşağıdaki şekilde öğrenebilirsiniz. AnaRoot Altındaki Alt Klasörleri Öğrenmek: Yuarıdaki örnekte ana Root altındaki değişkenleri öğrenmeyi gördük.Create.OpenKey(altklasor.RootKey:=HKEY_CURRENT_USER.//dershane isimli değişkeni sil deger.Button10Click(Sender: TObject).//Tümünü değişkene aktar ListBox1.false) then ShowMessage('Hata') else begin deger.Create.GetKeyNames Bu prosedür ile ana root altındaki tüm klasörleri öğrenebilirsiniz.//listeye ekle deger. deger.GetValueNames(degiskenler). end. procedure TForm1. degiskenler:TStringList. degiskenler:=TStringList.//alt klasörden oku deger.false).CloseKey. Aşağıda bu husus örneklendirilmiştir.DeleteValue('dershane'). var deger:TRegistry.//Bu ana Rootla ilgileniyorum altklasor:=''. 723 . Şimdide ana root altında bulunan klasör isimlerini listelemeyi göstereceğim.CloseKey. begin deger:=TRegistry. Ana Root Altındaki Değişkenleri Öğrenmek: • deger. Burada geriye dönen değeri muhakkak “TstringList” tipli bir değişkene aktarmalısınız.deger. end. altklasor:AnsiString.

degiskenler:TStringList. Anlaşılmayan bir husus varsa hata yakalama bölümüne tekrar bakınız.false) then//alt klasörden oku ShowMessage('Hata') else begin deger. 724 . Aşağıdaki form tasarımını oluşturunuz. Except ten sonra yazdığınız kod işleyerek “Registry” ye Kullanıcı adı ve Password değeri yazdırılacaktır. kullanıcı şifreyi bilemeden ikinci formu kesinlikle açamayacaktır. degiskenler:=TStringList. Şimdi kullandığımız method ve özellikleri örnek üzerinde izah edelim.OpenKey(altklasor.).//Bu ana Rootla ilgileniyorum altklasor:=''.GetKeyNames(degiskenler).Create. if not deger.Aşağıdaki kod bloğunu Unit pencerenize ekleyiniz. begin deger:=TRegistry. end. Yapacağımız örnekte program ilk çalıştığı anda “Registry” ye şifreyi yazacak.Button11Click(Sender: TObject).RootKey:=HKEY_CURRENT_USER.//alt klasörleri göster ListBox1. var deger:TRegistry.procedure TForm1.//listeye yaz deger. altklasor:AnsiString. end.CloseKey. Programı ilk çalıştırdığınız zaman Registry de “password” değerini bulamayacağı için hata mesajı verecektir (Şayet exe dosyasını çalıştırırsanız hata mesajı vermez.Create. deger.Items:=degiskenler.

RootKey:=HKEY_CURRENT_USER. if (Edit1. Edit1.//yarat deger.//okuma modunda aç pass:=deger. begin deger:=TRegistry. deger:TRegistry.Text<>ad) or (StrToInt(Edit2.end.Clear.//değişken ekle deger.false). Edit1.CloseKey.WriteInteger('password'.Button1Click(Sender: TObject).OpenKey('prestige\Gazi'.OpenKey('prestige\Gazi'.Show.//oku deger. begin deger:=TRegistry.Clear.Create. end.'Nihat Demirli'). Edit2.RootKey:=HKEY_CURRENT_USER.//oku ad:=deger. var sifre:Integer.Text)<>sifre) Then//yanlışsa begin ShowMessage('Kullanıcı Bilgileri Yanlış Yeniden Deneyin').uses Registry.//şifreyi oku except//şifreyi bulamazsa işler deger.RootKey:=HKEY_CURRENT_USER. pass:Integer. deger. deger.OpenKey('Prestige\Gazi'.Create.//diğer formu aç end. var deger:TRegistry. //Eklemeyi unutmayınız. Unit3. sifre:=deger.true). procedure TForm2.end.//kapat deger.ReadInteger('password'). ad:AnsiString.CloseKey. end else begin Form3.FormCreate(Sender: TObject).2222).WriteString('kullaniciadi'.SetFocus. try deger.ReadInteger('password').false). deger.//yazma modunda aç deger. procedure TForm2. 725 .CloseKey.//ekle deger.ReadString('kullaniciadi').

Kendi uygulamanızda şifrenizi password diye kaydetmeyin tabiiki. Kullanıcı adını ve şifrenizi yazıp “Giriş” isimli buttona tıklayın. değişik klasörler altına çok karmaşık şekillerde yazdıracağınız gizli bilgilerinizi siz hariç kimse çözemeyecektir. Şayet şifreyi doğru girerseniz Aşağıdaki şekilde ana formunuz açılacak ve sizi tebrik edecektir. 726 .Program çalıştıktan sonra aşağıdaki gibi şifre giriş formu karşınıza gelecektir.

BÖLÜM 19 KONTROL OLUŞTURMAK 727 .

728 .

729 . “File->New->Other” menülerini izleyin. Aşağıdaki adımları izleyerek “ocx” uzantılı kütüphane yaratabilirsiniz. Karşınıza aşağıdaki pencere açılacaktır. “ActiveX Teknolojisi” olarak adlandırılan bu kısımda “ocx” uzantılı yeni kütüphaneler oluşturacağız. Bu pencerede “New ActiveX Name” kısmına kontrolünüzün ismini verip “OK” Buttonuna tıklayınız.Delphi’de Kontrol Oluşturmak: Delphi içerisinde tanımlanmış olarak bir çok kontrol bulunmaktadır. Aşağıkai pencere açılacaktır. Bu kontroller çoğu kez işinizi görmekle beraber dilerseniz kendi kontrollerinizide oluşturabilirsiniz. Bu Pencerede yer alan “ActiveX” yaprağındaki “ActiveForm” iconunu seçip “OK” buttonuna tıklayın.

Uygulamanızı kaydettikten sonra “ “Project->Comoile All Project” adımlarını izleyerek uygulamanızı Compile edin. Forma yerleştirmiş olduğunuz “Edit” kontrolünün “OnKeyPress” yordamına aşağıdaki kodu ekleyiniz. //sadere rakam girişine izin ver begin if (Key<'0') or (Key>'9') Then Key:=#0. Burada amacımız içerisine sadece rakam girişi yapılabilecek yeni bir kontrol yaratmak olacaktır.//tuşu iptal et end. 730 . Bu adımda projenizi “gazi” ismiyle bilgisayarınızın herhangi bir klasörüne kaydedin (Kaydettiğiniz yeri sakın unutmayın proje derlendikten sonra ocx dosyası burada oluşacaktır). Aşağıdaki tasarımı formunuzun üzerinde oluşturun.Karşınıza yeni bir uyarı penceresi gelecektir “OK” i seçip diğer adımlara geçiniz. var Key: Char). Bu adımdan sonra projenizi kaydettiğiniz klasörde “ocx” uzantılı yeni bir dosya oluşacaktır.Edit1KeyPress(Sender: TObject. procedure Tprestige.

Tüm varsayılan ayarları kabul edip “Ok” buttonuna tıklayabilirsiniz. Clasınızın Delphi tarafından kullanılacak olan ismini(Tedit gibi).Kontrolü Compenent Paletine Yerleştirmek: Yeni bir Delphi uygulaması başlatarak derlemiş olduğunuz kontrolü aşağıdaki adımları izleyerek Component paletine dahil edebilirsiniz. Pencerede yer alan diğer seçeneklerden. Bu pencere Kontrolün kaydedildiği yeri size bildirmek amaçlı olarak Delphi tarafından açtırılmaktadır. Ardından “Install” düğmesine tıklayın. dilerseniz değiştirebilirsiniz). “Palette page” kısmıda kontrolünüzün yerleştirileceği Component paletinin seçileceği yerdir (varsayılan olarak “Activex” gelir. “Class names” bölümü. 731 . “Component->Import Activex Control” menü adımlarını izleyerek aşağıdaki pencerenin açılmasını sağlayınız. Bu pencerede “Add” düğmesine tıklayarak projenizi kaydettiğiniz klasörün içerisinde oluşturulmuş olan “ocx” uzantılı dosyayı seçin. Aşağıdaki pencere açılacaktır.

“OK” i işaretleyerek bu pencereyide kapatınız.Ardından aşağıdaki uyarı penceresi açılacak “Yes diyerek bu pencereyi de kapatın. Son olarak aşağıdaki uyarı penceresi açılacaktır. Kontrolü seçip formunuzun üzerine çizin. Componentiniz artık Delphi uygulamanıza dahil edilmiştir. Tüm diğer kontroller gibi bütün formlarınızda kullanabilirsiniz. 732 . Şimdi de yeni bir uygulama (Application) başlatarak “ActiveX” paletine ekletmiş olduğumuz bu kontrolü kullanmayı deneyelim.

Ekran görüntüsü aşağıdaki şekilde gerçekleşecektir. 733 . Yani buradaki Edit kutusuna rakam dışında karakter girişini kesinlikle yapamazsınız. Active Formu Test Etmek: Oluşturduğunuz Active Form kontrolünü test etmek için “Project->Web Deployment Options” adımlarını izleyerek aşağıdaki pencereyi açtırın. Bu pencerede dosyanızın düzgün adresini ilgili pencerelere girerek “OK” Buttonuna tıklayın. Deneme aşamasında Active formu oluştururken “OnKeyPress” yordamına yazmış olduğunuz kodlar aynen çalışacaktır.

Karşınıza aşağıdaki pencere açılacaktır. 734 . Aşağıdaki pencere açılacaktır. Bu pencereden “ActiveX Control” seçeneğini seçerek “OK” Buttonuna tıklayın. “File->New->Other” seçeneklerini izleyin. “ActiveX Control” oluşturmak için öncelikle aşağıdaki adımları izleyerek yeni bir uygulama başlatmalısınız. Açılan bu pencerenin “VCL Class Name” kısmında “Delphi kütüphanelerinde yer alan bileşenlerinden bir tanesini seçerek.ActiveX Control Oluşturmak: Bu bölümde sizlere “ActiveX Control” nasıl geliştirebileceğinizi göstermek istiyorum. “New ActiveX Name” bölümüne ismini girin (yazikutusu).

Bu tür örneklerde amaç var olan kontroller den yeni daha gelişmiş (türetilmiş) kontroller oluşturmaktır. Bu Unit lerden diğer uygulamaların kütüphane olarak kullanacağı “”TLB” uzantısı olan dosya olacaktır. “OK” Buttonuna tıklayarak “ActiveX Control” uygulamanızı başlatın. “View->Units” adımlarını izleyerek aşağıdaki pencereye ve oluşturduğu “Unit” lere dikkatinizi çekmek istiyorum. ActiveX Control’e Function Eklemek: Sonuçta yaratacağınız kontrol bir kütüphane oluşturacaktır. Bu Unit in “Public” kısmına aşağıdaki fonksiyon tanımlamasını yapın. Tyazikutusu = class(TOleControl) private FOnChange: TNotifyEvent. Bu yüzden tüm methodlarınızı bu “Unit” içerisinde tanımlamalısınız. Şimdi kontrolünüzden türetilecek diğer nesnelerin kullanabileceği bir fonksiyonu nasıl ekleyebileceğinizi göstereceğim. Bu kütüphanenin içerisinde tanımlanan tüm methodlarda diğer programlar tarafından kullanılabilecektir. Yukarıdaki pencereden “ActiveFormProj1_TLB” seçeneğine çift tıklayarak ekranda gösterilmesini sağlayınız. FOnClick: TNotifyEvent. 735 .

//karesini bul end. begin Result:=x*x. override. prosedür bloğunun oluşmasını sağlayınız. //tanımlayın Procedure mesaj(x:AnsiString). protected procedure CreateControl. 736 .//ekleyin Yine imleç bu satırda iken “Ctrl+Shift+C” tşlarına beraberce basıp. FIntf: Iyazikutusu. function GetControlInterface: Iyazikutusu.hesapla(x: Integer): Integer. Ekleyeceğimiz prosedür mesaj penceresi kullanacağı için “Uses” satırına “Dialogs” kütüphanesini eklemeyi unutmayınız. end. public Function hesapla(x:Integer):Integer. Prosedürü tanımlayacağınız yer fonksiyonu tanımladığınız yerin aynısıdır. procedure Tyazikutusu. //tanımlayın İmleç bu satırda iken “Ctrl+Shift+C” Tuşlarına basıp kod bloğunun oluşmasını sağlayın (daha önceki bölümlerde bu işlem detaylı olarak anlatılmıştır). function TActiveFormX.mesaj(x: AnsiString). FOnKeyPress: TyazikutusuOnKeyPress. Aşağıdaki kod satırınıda bu bloğa girin. procedure InitControlData. Uses Dialogs //eklameyi unutmayınız public Function hesapla(x:Integer):Integer. Bu yüzden bir alt satırına aşağıdaki prosedür tanımlamasını yapınız.FOnDblClick: TNotifyEvent. Yapılan işlem girilen sayının karesini almaktan ibarettir. begin ShowMessage(x). ActiveX Contrel’e Prosedür Eklemek: Şimdi de ekleyeceğiniz kontrole has bir prosedür tanımlaması yapalım.

AvtiveX Control’ün Component Paletine Eklenmesi: Yeni bir Delphi uygulaması başlatarak derlemiş olduğunuz kontrolü aşağıdaki adımları izleyerek Component paletine dahil edebilirsiniz.ActiveX Control’ün Derlenmesi: “Mesaj” isimli prosedür ile “hesapla” isimli fonksiyonu “ActiveX Control” projenize ekledikten sonra uygulamanızı kaydedin (çalıştırmayın çünkü başaramazsınız). “Palette page” kısmıda kontrolünüzün yerleştirileceği Component paletinin 737 . “Component->Import Activex Contrpol” menü adımlarını izleyerek aşağıdaki pencerenin açılmasını sağlayınız. Ardından “Project->Compile All Project” seçeneklerini izleyerek “ActiveX Control” projenizi derleyin (derlenme işleminden sonra ocx uzantılı dosya. Bu pencerede “Add” düğmesine tıklayarak projenizi kaydettiğiniz klasörün içerisinde oluşturulmuş olan “ocx” uzantılı dosyayı seçin. projenizi kaydettiğiniz yerde otomatik olarak oluşturulacaktır). Pencerede yer alan diğer seçeneklerden. “Class names” bölümü. Clasınızın Delphi tarafından kullanılacak olan ismini(Tedit gibi).

Bu adımdan sonra karşınıza gelecek olan pencerelere “Ok” düğmesini seçerek cevap verin. Ardından “Install” düğmesine tıklayın. Yaratılan ActiveX Control’üm Projelerde Kullanılması: “AxtiveX” Yaprağında yer alan yeni kontrolünüzü sürükleyip formun üzerine bırakın. dilerseniz değiştirebilirsiniz). Tüm varsayılan ayarları kabul edip “Ok” buttonuna tıklayabilirsiniz. Yukarıdaki şekilde “ActiveX Control” ünüz component paletine eklenecektir. Bu pencere Kontrolün kaydedildiği yeri size bildirmek amaçlı olarak Delphi tarafından açtırılmaktadır. Ardından yukarıdaki tasarımı oluşturunuz. Aşağıdaki pencere açılacaktır. Amacımız Button kontrolüne tıklanıldığı zaman daha önce “ActiveX Control”üne eklediğimiz “hesapla” 738 .seçileceği yerdir (varsayılan olarak “Activex” gelir.

sonuc:=yazikutusunu1.sonuc:Integer. 739 . var deger.Caption:=IntToStr(sonuc).hesapla(deger).Button1Click(Sender: TObject). begin deger:=StrToInt(yazikutusunu1. procedure TForm1.yazdır end. Aşağıdaki kod bloğunu “Unit” penceresine ekleyiniz.//karesini al Form1.Text).isimli fonksiyonu kullanarak içeriğe girilen sayının karesini hesaplatıp formun başlığına yazdırmak olacaktır.

740 .

NET TEKNOLOJİSİ 741 .BÖLÜM 20 EXCEL & .

742 .

uygulama: Variant.//Ekle end. 743 . uses Windows. Classes. tüm diller tarafından desteklenmesini sağlamıştır. uygulama.Excel Uygulamaları: Excel’in çok güçlü tablolama özelliğinin olması ve herkes tarafından çok rahatlıkla kullanılabilmesi.Add” komutuyla da çalışma kitabı uygulamaya eklenmektedir. Bu bölümde “Microsoft Excel hücrelerine nasıl değer aktarabileceğinizi. Koda dikkat edecek olursanız.//eklemeyi unutmayın. Graphics. Dialogs. //uses comobj eklemeyi unutmayınız. procedure TForm1. Excel Dosyası Yaratmak: Aşağıdaki kod bloğunu kullanarak kolayca Excel dosyası yaratabilirsiniz. Messages. hücre içerisindeki değerleri nasıl kullanabileceğinizi göstereceğim.Workbooks. Dosyayı yaratırken “CreateOleObject” komutundan faydalanmaktayız. Controls.Application'). begin uygulama := CreateOleObject('Excel.Visible := True.Add. Aşağıdaki şekilde uses satırına “comobj” kütüphanesini eklemeyi unutmayınız. Bu kütüphane “CreateOleObject” methodunun çalışması için gereklidir. Emin olun yapacağınız uygulamaların çoğunda (belkide hepsinde) programı yaptıran firma yetkilileri sizden Excel bağlantısı isteyecektir.Button1Click(Sender: TObject). Forms. “WorkBooks. var sayfa. Variants.comobj. Excel Dosyasına Yeni Bir Sayfa Eklemek: Açtığınız veya oluşturduğunuz Excel dosyasına aşağıdaki komutla kolayca yeni sayfalar ekleyebilirsiniz. StdCtrls. Daha sonraki kısımda eklemiş olduğunuz sayfayı nasıl silebileceğinizide göstereceğim. SysUtils. uygulama. “CreateOleObject” methodu ile Excel uygulaması başlatılmakta.

adet:Integer.uygulama: Variant.Button1Click(Sender: TObject).Visible := True. uygulama.Add. var sayfa.Workbooks.uygulama: Variant. Bu işlem için kullanacağınız kod bloğu aşağıda verilmiştir. uygulama. isim:AnsiString.Button1Click(Sender: TObject). 744 . uygulama.Workbooks. Excel’deki Aktif Sayfanın İsmini Öğrenmek: Açık olan sayfanın ismini aşağıdaki kod bloğuyla kolayca öğrenebilirsiniz.Application').Add. uygulama. uygulama.//aktif sayfanın ismi Form1. end.Button1Click(Sender: TObject).Name. uygulama.//kitap ekle uygulama.ActiveSheet.procedure TForm1.Caption:=isim.worksheets. var sayfa.Add. begin uygulama := CreateOleObject('Excel.Add.Visible := True. uygulama.Visible := True. isim:=uygulama.Workbooks.Add. begin uygulama := CreateOleObject('Excel. procedure TForm1.worksheets. procedure TForm1.uygulama: Variant. begin uygulama := CreateOleObject('Excel.//sayfa ekle end. var sayfa.Application').Application'). isim:AnsiString. Excel Dosyasındaki Sayfa Sayısını Öğrenmek: Bazı durumlarda Excel dosyanızdaki çalışma sayfa sayısını öğrenmek isteyebilirsiniz.

worksheets.Add.quit.Add.Button1Click(Sender: TObject). procedure TForm1. en çok ihtiyacınızın olacağı kod bloğunun bu kısım olduğunu düşünüyorum.worksheets.Workbooks. uygulama. Excel Hücrelerine Veri Aktarmak: Gelelim en önemli işlevimize.uygulama: Variant.uygulama: Variant. Aşağıdaki kod bloğu sayesinde Listenizde yer alan satırları kolayca Excel hücrelerine aktarabileceksiniz.Caption:=IntToStr(adet). uygulama. procedure TForm1.Button1Click(Sender: TObject). var sayfa.Add. begin 745 .Count. Excel Dosyasını Kapatmak: Oluşturduğunuz veya var olan bir Excel dosyasını kapatmak için aşağıdaki kod bloğunu kullanabilirsiniz.//Uygulamayı Kapat end. var sayfa. //Yarat var i. isim:AnsiString. procedure TForm1. adet:Integer. adet:=uygulama. j: Integer. begin uygulama := CreateOleObject('Excel. Bu örnekte Excel değişkeninin global tanımlandığına dikkat ediniz.Application').WorkSheets.//sayfa sayısını öğren Form1. end.Button2Click(Sender: TObject). //Kapat begin uygulama.Visible := True. uygulama. end.uygulama.

ListBox1.items[i-1]. procedure TForm1.2]:=ListBox1. Excel Hücrelerinden Veri Okumak: Aşağıdaki kod bloğu sayesinde “Excel” syfasında yer alan ilk (“A”) sütuna ait tüm hücre değerlerini ListBox Kontrolüne aktarabilirsiniz (İlk boş satıra kadar aktarma yapacak. end.Add. end. ListBox1. uygulama.FormCreate(Sender: TObject).Items.Add('Nihat Demirli'). //Listeye Ekle var 746 .Button4Click(Sender: TObject).Add('Osman Çalış'). procedure TForm1.Add('Yüksel İnan'). begin uygulama := CreateOleObject('Excel.satir:Integer.Workbooks.items.Items.Button1Click(Sender: TObject).Workbooks.Count.Add. Siz daha değişik bir kriter koyabilirsiniz). begin satir:=ListBox1. uygulama.worksheets.Items. uygulama.Add('Kemal Erkol'). ListBox1.Add.Add('Hamza Kendi'). uygulama.Cells[i.activeSheet.//kaç satır var for i:=1 to satir do begin uygulama.//aktif sayfaya aktar end.uygulama: Variant.Application'). end. procedure TForm1.Items.items.Visible := True. begin ListBox1. procedure TForm1. uygulama.Visible := True.Application'). ListBox1. //Excele yolla var i. end.Button3Click(Sender: TObject). var sayfa.uygulama := CreateOleObject('Excel.

uygulama.Button1Click(Sender: TObject).ActiveSheet.ActiveSheet.uygulama: Variant.worksheets. procedure TForm1. 747 .Add(uygulama. procedure TForm1.i:Integer.Cells[2.items. Repeat ListBox1.//boş hücreye kadar oku end. var sayfa. veya var sayfa.1].//c2 hücresini seç end. end.Application'). inc(i).Button1Click(Sender: TObject).cells[i. Bizim uygulamamızda aktıfleşecek olan hücre “C2” Hücresi olacaktır. Tüm hücre değerlerinin listeye eklendiğini (ilk boş hücreye kadar) göreceksiniz.3].Add. until uygulama.Value). //Hücre seç begin uygulama. //Yarat begin uygulama := CreateOleObject('Excel. begin i:=1. uygulama.Workbooks.value=''.Add. Excel Sayfasında bir Hücreyi Aktif Hale Getirmek: Aşağıdaki kod satırıyla yaratmış olduğunuz Excel dosyasında istediğiniz sütunu aktif hale getirebilirsiniz. uygulama.uygulama: Variant.Button5Click(Sender: TObject).ActiveSheet. Artık listeye ekle buttonuna tıklayabilirsiniz. Arkasından “A” sütununa gerekli değerleri girin (istediğiniz kadar hücreyi doldurabilirsiniz).cells[i.Select.Visible := True.1]. procedure TForm1. Programı çalıştırdıktan sonra öncelikle ilk buttona tıklayarak bir çalışma sayfası yaratın.

begin uygulama.Visible := True. begin uygulama := CreateOleObject('Excel.Visible := True.Add. Aşağıdaki kod bloğunu bu işlem için kullanabilirsiniz.begin uygulama := CreateOleObject('Excel. begin uygulama := CreateOleObject('Excel. procedure TForm1. uygulama.Application'). Excel Sayfasında Çoklu Hücre Seçtirmek: Dilerseniz birden fazla hücreyide aynı anda aktif hale getirebilirsiniz. uygulama.end.Workbooks.Button2Click(Sender: TObject). end. begin uygulama.worksheets. uygulama.Add.Button1Click(Sender: TObject). uygulama.Add.Add.uygulama: Variant.Button4Click(Sender: TObject).ActiveSheet. procedure TForm1. procedure TForm1. uygulama.//seç end. procedure TForm1.Range['A1:C3']. bloğu sayesinde “B1” hücresine istediğiniz formulü var sayfa. Excel Hücresine Formül Aktarmak: Aşağıdaki kod aktarabilirsiniz.//9 hücreyi seç end.Visible := True.Application'). procedure TForm1.Workbooks. end. 748 .Select.Workbooks.Button5Click(Sender: TObject). var sayfa.Range['C3'].Application').worksheets.ActiveSheet.Add. uygulama.Button1Click(Sender: TObject).Select. uygulama.uygulama: Variant. uygulama.

begin uygulama := CreateOleObject('Excel.Title:='Excel Dosyası Aç'.Add.Button8Click(Sender: TObject).Open['c:\okul.Button1Click(Sender: TObject). veya var uygulama: Variant.worksheets.Add. begin OpenDialog1.Button6Click(Sender: TObject).uygulama: Variant. procedure TForm1.Filter:='Excel Dosyaları|*.ActiveSheet. begin uygulama := CreateOleObject('Excel.Delete. end.end. Var Olan Bir Excel Dosyasını Açmak: Aşağıdaki kodlamayla bilgisayarınızda mevcut olan bir Excel dosyasını kolayca açtırabilirsiniz. uygulama. if OpenDialog1. OpenDialog1. var uygulama: Variant.xls'].WorkBooks. uygulama.Formula := '=A1*3' .//sil end.ActiveSheet.xls'. Excel Dosyasından Aktif Sayfayı Silmek: Aşağıdaki kod bloğunu kullanarak aktif sayfayı dosyadan silebilirsiniz. var sayfa.Application'). uygulama.Button7Click(Sender: TObject). //Aktif sayfayı sil begin uygulama. end. uygulama.Visible := True.Execute Then 749 . procedure TForm1.Visible:=true.begin uygulama. uygulama.Application').Cells[1. procedure TForm1.2]. procedure TForm1.Workbooks.

begin ListBox1. end. end.Items.Items. ListBox2. //uses Comobj kütüphanesini eklemeyi unutmayınız.Visible:=true.Application').FormCreate(Sender: TObject). ListBox2. ListBox1.Open[OpenDialog1. ListBox2. 750 .Items. Amacımız iki listedeki satırları Excel’e aktarıp grafiğini çizdirmek olacaktır.FileName]. procedure TForm2.Items.WorkBooks. ListBox1.Add('OCAK'). uygulama.Add('1250000').Add('NİSAN'). Olayı örneklendirmek açısından aşağıdaki form tasarımını oluşturunuz.Items.Add('1300000').begin uygulama := CreateOleObject('Excel.Add('KASIM'). Aşağıdaki kod satırlarını Unit pencerenize ekleyiniz.Items. Excel’de Grafik Çizdirmek: Aşağıdaki şekilde kullanacağınız bir kod bloğu sayesinde grafik çizdirmeniz mümkün olacaktır.Add('1450000'). ListBox1.Items.Add('AĞUSTOS'). uygulama.

Add('1500000').Items.Select. uygulama.//yaz uygulama.Add.//yaz for i:=2 to adeT+1 do begin uygulama.cells[i. //Grafik Çiz begin uygulama. uygulama:=CreateOleObject('Excel.WorkBooks.Items.Items[i-2]. procedure TForm2.Count.//Global değişken procedure TForm2. begin adet:=ListBox1. end.cells[i. //Excele Yolla var i. 751 .Range['A1:C4'].Add.adet:Integer. uygulama.ActiveSheet.ActiveSheet. var uygulama:Variant.2]:=ListBox2.cells[1.1]:='AYLAR'.Application').Button1Click(Sender: TObject).Items[i-2].Charts.visible:=true.Cells[1. end.ActiveSheet.ActiveSheet.2]:='KUR DEĞERİ'. uygulama.//Grafik çiz end.1]:=ListBox1.Button2Click(Sender: TObject).ListBox2.ActiveSheet. uygulama. end.//seç uygulama.

bir “.Net” için “Delphi” den kaynaklanan problemlerin var olduğunu belirtmek isterim.ArrayList” nesnesinden faydalanarak dizi değişkene aktarılıyor. Arkasından programınızı çalıştırın..Building Block Services Visual Studio . Kişisel görüşümü sorarsanız. İkinci adımda bu değerler kendi içerisinde sıralanarak diğer ListBox’a sıralı şekilde yazdırılmaktadır.Net” sınıfı olan “System. . Aşağıdaki örnekte bu hususa değinilmektedir. Örneğimizde “ListBox1” içerisinde yer alan değerler. Yapılan sıralama küçükten büyüğe doğru gerçekleştirilmekte olup. 752 . Ekran görüntünüz yukarıdaki şekilde olduğu gibi oluşacaktır.Net Framework . Bu çatı aşağıdaki yapılardan oluşmaktadır.Net Enterprise Servers .NET” İnternete yönelik uygulama geliştirme amaçlı Microsoft firması tarafından çıkarılmış bir programlama tekniğidir. Yinede “. kodlamada işaretin yönünü değiştirirseniz büyükten küçüğe doğru bir sıralatma gerçekleştirirsiniz.Net” kütüphanelerini “Delphi” uygulamalarınızda kullanabilirsiniz. “. Uygulamalarınızda “. henüz bu hususun tam olarak oturmadığı.Net Bu bölümde sizlere “.Net Teknolojisi: “. Borland’ın biraz acele ettiği kanaatindeyim. “Delphi” nin yapabileceklerinden bahsetmek istiyorum.Collections.Net” platformunda yer alan bir sınıfı projenizde tanımlayıp kolayca methodlarından faydalanabilirsiniz. Aşağıdaki kod bloğunu “Unit” penceresine ekleyiniz.Net” platformunu kullanım açısından.

begin deger:=CreateOleObject('System. k.Add(ListBox1.procedure TForm3.item[k]. for k:=0 to i-1 do ListBox2.item[l]) Then begin yeni:=deger.Button1Click(Sender: TObject).Collections.Count.Net Sınıfı i:=ListBox1. var deger:Variant.Items.ArrayList'). end.item[k])) end. end.item[k]:=deger. for k:=0 to i-1 do for l:=k+1 to i-1 do//sırala begin if StrToInt(deger. Buttona tıkladıktan sonraki görüntünüz yukarıdaki pencerede gözüktüğü gibi olacaktır.item[l].//.item[l]:=yeni.Items[j]). i.l.item[k])>StrToInt(deger. 753 .Add(IntToStr(deger.yeni:Integer.Items. for j:=0 to i-1 do begin deger. deger.j:Integer.//yerlerini değiştir deger. end.

net” platformunu kullanabilmeniz için ikinci “CD” içerisine ufak bir yazılım eklemiştir. Şayet yüklü değilse “Microsoft” a ait web sayfasından (biraz uzun sürebilir) indirebilirsiniz. Bu yazılımında yüklenmiş olması gerekmektedir.Uyarı:”. İkinci olarak “Borland” firması “.NET” sınıfları projenizde kullanıp yeni uygulamalar gelirtirmek istiyorsanız “.Net Framework” platformunu yüklemiş olmanız gerekmektedir. 754 .

BÖLÜM 21 UZMANLAR İÇİN BEYİN JİMNASTİĞİ 755 .

756 .

Caption:=IntToStr(sonuc). Hoşunuza gitmesi dileğiyle Uygulama 1: Aşağıdaki kod bloğu sonucunda Başlıkta ne yazar.Button1Click(Sender: TObject). for i:=0 to 5 do begin inc(sonuc). var i. Uygulamalarımızın bazısı soru niteliğinde bazısı ise çözüm içeren örnek kodlardan oluşmaktadır. end. basit ama çok heyecanlı. begin sonuc:=0.Birazda Beyin Jimnastiği: Bu bölümde sizler için biraz beyin jimnastiği türünden örnekler hazırlayacağım. procedure TForm1.j. end. end. sonuc:Integer. end. 757 . Bu soruyu Bilgisayarı kullanmadan hafızanızdan çözünüz. Bu örneği bilgisayarı kullanmadan çözünüz. Şimdi biraz daha zor bir alıştırma yapalım. Hiç bir extra bilgiye ihtiyacınız olmadan herkesin çözebileceği orta zorlukta bir soru klasiği.k:Integer. Form1. for k:=0 to 5 do begin inc(sonuc). Uygulama 2: Aşağıdaki kod bloğu sonucunda Formun başlığında ne yazar. “Alfred Hitchcock” misali sade. for j:=0 to 5 do begin inc(sonuc).

ve hafızadan çözün).Button2Click(Sender: TObject).sonuc:Integer.procedure TForm1. end. Form1. end.k:Integer. end.Caption:=IntToStr(i). Uygulama 3: Aşağıdaki kod bloğu sonucunda Formun başlığında ne yazar.Button3Click(Sender: TObject). procedure TForm1. var i. 758 . end. begin sonuc:=0.i).j. var i. aşağıda kod bloğunu işletirseniz formun başlığında ne yazar. for j:=0 to 5 do begin inc(sonuc. end. bilgisayarı kullanmadan. begin for i:=0 to 20 do begin inc(sonuc). Çok basit bir soru ama bilmenizde fayda var (tek hakkınız var. Uygulama 4: Hafızanızla. for i:=0 to 5 do begin inc(sonuc.i). for k:=0 to 5 do begin inc(sonuc. sonuc:Integer.Caption:=IntToStr(sonuc). Form1. end.i).

Button4Click(Sender: TObject).sonuc:=0. begin deger:='prestige'. until sonuc>100. Uygulama 6: Yine hafızanızla çözmenizi istediğim bir soru. Repeat 759 . procedure TForm1. var i:Integer. end. begin i:=0. repeat inc(sonuc. sonuc:Integer. var deger:PChar. i:Integer. for i:=0 to 4 do inc(deger).i). begin sonuc:=0.procedure TForm1. Aşağıdaki kod bloğu sonucunda formun başlığında ne yazar. Form1.sonuc:Integer.Button5Click(Sender: TObject). procedure TForm1. Uygulama 5: Aşağıdaki kod bloğu sonunda Formun başlığında yazacak içeriği hafızanızla hesaplayınız. Form1. i:=0. end.Caption:=deger^.Caption:=IntToStr(i). var i.Button6Click(Sender: TObject). inc(i).

Until i>10. karakter. for i:=0 to karakter-1 do begin sayi:=Ord(deger^). end.i. //Büyük HarfeÇevir var deger:PChar. 760 . inc(i). begin deger:=PChar(Edit1. Edit2. karakter:=Length(Edit1. Form1.Text). Aşağıdaki örnekte “Edit1” e küçük harfle girilmiş karakterleri büyük harfe çevirerek “Edit2” kontrolüne yazmaktayız (UpperCase Fonksiyonu). end. Uygulama 7: Biraz da biz sonuç bulalım. end.sayi:Integer.sonuc:=sonuc+i. for i:=0 to 20 do begin sonuc:=sonuc+1.Text:=Edit2.end.Text+deger^. procedure TForm2.Text). if sayi>96 Then begin deger^:=chr(sayi-32).Button1Click(Sender: TObject). end. inc(deger).Caption:=IntToStr(sonuc).

Text). procedure TForm2. if sayi<96 Then begin deger^:=chr(sayi+32).Text).Button2Click(Sender: TObject).i.Programı çalıştırdıktan sonra “Büyük Harfe Çevir” buttonuna tıklarsanız ekran görüntünüz aşağıdaki şekilde oluşacaktır. 761 . karakter. //Küçük HarfeÇevir var deger:PChar. Yani “LowerCase” fonksiyonunun kodunu yazacağız. Uygulama 8: Bu örneğimizde de yukarıda yapmış olduğumuz işlemin tam tersini yapacağız. for i:=0 to karakter-1 do begin sayi:=Ord(deger^).sayi:Integer. karakter:=Length(Edit1. begin deger:=PChar(Edit1.

x:PChar.Text). end.Text:=Edit2. end. inc(deger). inc(deger).Text:=Edit2. karakter.sayi:Integer. karakter:=Length(Edit1.//bir sonraki karaktere geç for i:=1 to karakter-1 do begin if deger^<>' ' Then begin if yeni=false Then begin if ord(deger^)<=96 Then begin 762 . procedure TForm2. Edit2.i. Uygulama 9: Bu örneğimizde sadece kelimelerin baş harflerini büyütüp diğerlerini küçük harflerle yazdıracağız (İlk Harfleri Büyüt).Text+deger^.//ilk karakteri büyük yap Edit2.Text+deger^. //İLK harfleri Büyük Yap var deger. yeni:Boolean. if ord(deger^)>96 Then deger^:=chr(ord(deger^)-32). begin deger:=PChar(Edit1.end.Button3Click(Sender: TObject).Text).

763 .Text+deger^. end. Programa ait gelişmiş kod bloğu aşağıda verilmiştir. Kodlamalara dikkat ettiyseniz mümkün olduğu kadar “Delphi” komutu kullanılmamaya çalışılmıştır (C++ dan kalma bir alışkanlık). end . Ama işin doğrusuda budur. yeni:=false. end else begin yeni:=true. end. end. Edit2.Text:=Edit2. Uygulama 10: Bu örneğimizde string tipteki değişkenin başındaki boş karakterleri atıp gerisini yazdıracak olan fonksiyonun kodlarını vereceğim (TrimLeft). end else begin if ord(deger^)>96 Then begin deger^:=Chr(ord(deger^)-32). end.deger^:=Chr(ord(deger^)+32). end. inc(deger).

end. end. for i:=0 to karakter-1 do begin if deger^<>' ' Then begin Edit2.Button4Click(Sender: TObject). Uygulama 11: Bu örneğimizde string değişkenin sol tarafından belirttiğiniz kadar karakteri söküp alacak bir kod bloğu kullanacağım.i.sayi:Integer. karakter. begin deger:=PChar(Edit1. karakter.Text).//katarı yazdır end else begin inc(deger). end.i.x:PChar. var deger:PChar.procedure TForm2. //Başlangıçtaki Boşlukları At var deger. Örnek için soldan “4” karakter sök al şeklinde belirtilmiştir. procedure TForm2.Text:=deger.Button5Click(Sender: TObject). karakter:=Length(Edit1.Text).sayi:Integer. 764 .

end. //Soldan Kopar var deger:Array of AnsiString.karakter).Text:=Edit2. Uygulama 12: Yukarıdaki örneği Dinamik dizi kullanarak çözmek istiyorum.Text).i+1.'Soldan'.sayi:Integer. begin karakter:=Length(Edit1.'')).'')). end else begin exit.Text+deger[i]. Uygulama 13: Bu örnekte string parçasının içerisinden söküp alma işlemin gerçekleştireceğiz (Copy Fonksiyonu).Text+deger^.Button6Click(Sender: TObject). for i:=0 to sayi-1 do Edit2.Text. procedure TForm2. karakter:=Length(Edit1.begin deger:=PChar(Edit1. end. inc(deger). SetLength(deger.i.'Soldan'.//uzunluk sayi:=StrToInt(InputBox('Kaç Karakter'. 765 .1). for i:=0 to karakter-1 do deger[i]:=copy(Edit1.Text). for i:=0 to karakter-1 do begin if i<sayi Then begin Edit2.Text:=Edit2.Text).//dinamik dizi tanımlandı karakter. end.//tüm karakterleri aktar sayi:=StrToInt(InputBox('Kaç Karakter'.//çık end.

end.karakter).'')).i.'')). for i:=sayi-1 to sayi+adet-2 do Edit2.//aktar sayi:=StrToInt(InputBox('Kaçıncı Karakter'.'Karakter'.” Karakterden sonraki “5” karakter sökülüp alınmaktadır. SetLength(deger. begin karakter:=Length(Edit1.Text. 766 . karakter.Text:=Edit2. Uygulama 14: Yukarıdaki örneği katar değişken kullanarak nasıl çözebileceğinizi göstermek istiyorum.i+1.Text+deger[i]. adet:=StrToInt(InputBox('Kaç Adet'.sayi.Text).adet:Integer.Button7Click(Sender: TObject). procedure TForm2.'Soldan'. for i:=0 to karakter-1 do deger[i]:=copy(Edit1. var deger:Array of AnsiString.Aşağıdaki örnek uygulamada “3.1).

procedure TForm2.adet:Integer. end.'')). Uygulama 15: Bu uygulamamızda.'')). aşağıdaki tasarımı oluşturup çek kesme işlemine bir örnek göstereceğim. karakter:=Length(Edit1. 767 . begin deger:=PChar(Edit1. sayi:=StrToInt(InputBox('Kaç Karakter'. adet:=StrToInt(InputBox('Kaç Adet'. Uygulamaya ait kod bloğu aşağıda verilmiştir. “Edit” kontrolünün “OnChange” yordamına gerekli olan kodları ekleyiniz.sayi-1).Text+deger^.Yine bu örnekte “3. karakter. inc(deger).sayi.” Karakterden sonra “5” karakteri sök al denilmiştir.Button8Click(Sender: TObject). inc(deger.i. //İçinden sök Al var deger:PChar.'Karakter'. For i:=sayi to sayi+adet-1 do begin Edit2. end.'Soldan'.Text:=Edit2.Text).Text).

5) + 'Yüz' end.adim:Integer. StrToInt(deger) * 5 + 1. begin Label1.binler.Text. end. 1).Caption := TrimLeft(ek) +' '+ Label1.basla . adet.kalan:Double. floor(basla / 3) * 6 + 1.basla + 1. tum:=Edit1.//ilk 12 karakter boş binler := ' BinMilyonMilyar'. 6)) end. end.//ilk 10 yuzler := ' İki Üç Dört Beş Altı YediSekizDokuz'. StrToInt(deger) * 5 + 1.onlar.Text).basla + 1.yuzler.Caption.Caption:=''.adim + 2. birler := ' Bir İki Üç Dört Beş Altı Yedi'.deger.birler.procedure TForm3. Label1.//ilk 9 karakter For basla := 1 To adet do begin deger := Copy(tum. If kalan = 1 Then ek := Copy(birler.Edit1Change(Sender: TObject).ek:AnsiString . StrToInt(deger) * 6 + 1. adet . 768 . var tum. adet:=Length(Edit1. Label1. adet . If basla = floor(basla / 3) * 3 + 1 Then begin If adet > basla + 2 Then adim := 3 Else begin adim := adet .basla. 6) Else begin If StrToInt(deger) = 0 Then ek := '' Else ek := Copy(yuzler.Caption+’ TL’.Text.(Int(basla / 3) * 3). adim)) <> 0 Then ek := ek + TrimLeft(Copy(binler. kalan := basla . If StrToInt(Copy(Edit1. 5) Else If kalan = 2 Then ek := Copy(onlar.//ilk 7 karakter boş onlar := ' On Yirmi Otuz Kırk ElliAltmışYetmişSeksenDoksan'.Caption:=Label1. end.

Uygulama için gerekli olan kod penceresi aşağıda verilmiştir. function birler(sayi:Integer):AnsiString. begin if sayi=1 Then Result:='Bir TL' else if sayi=2 Then Result:='İki TL' else if sayi=3 Then Result:='Üç TL' else if sayi=4 Then Result:='Dört TL' else if sayi=5 Then Result:='Beş TL' else if sayi=6 Then Result:='Altı TL' else if sayi=7 Then Result:='Yedi TL' else if sayi=8 Then Result:='Sekiz TL' else if sayi=9 Then Result:='Dokuz TL' 769 . Biraz daha karışık olabilir. ama ilginç bir çözüm.Uygulama 16: Yukarıdaki aynı örnek için ikinci bir çözüm yolu göstereceğim.

else Result:='TL'. //// function onlar(sayi:Integer):AnsiString. begin if sayi=1 Then Result:='On ' else if sayi=2 Then Result:='Yirmi ' else if sayi=3 Then Result:='Otuz ' else if sayi=4 Then Result:='Kırk ' else if sayi=5 Then Result:='Elli ' else if sayi=6 Then Result:='Altmış ' else if sayi=7 Then Result:='Yetmiş ' else if sayi=8 Then Result:='Seksen ' else if sayi=9 Then Result:='Doksan ' else Result:=' '. begin if sayi=1 Then Result:='Yüz ' else if sayi=2 Then Result:='İki Yüz ' else if sayi=3 Then Result:='Üç Yüz ' else if sayi=4 Then Result:='Dört Yüz ' else if sayi=5 Then Result:='Beş Yüz ' else if sayi=6 Then Result:='Altı Yüz' 770 . // function yuzler(sayi:Integer):AnsiString. end. end.

end. begin if sayi=1 Then Result:='Bin ' else if sayi=2 Then Result:='İki Bin ' else if sayi=3 Then Result:='Üç Bin ' else if sayi=4 Then Result:='Dört Bin ' else if sayi=5 Then Result:='Beş Bin ' else if sayi=6 Then Result:='Altı Bin ' else if sayi=7 Then Result:='Yedi Bin ' else if sayi=8 Then Result:='Sekiz Bin ' else if sayi=9 Then Result:='Dokuz Bin ' else Result:='Bin '. ///// function binler(sayi:Integer):AnsiString. begin if sayi=1 Then Result:='Bir Milyon ' else if sayi=2 Then Result:='İki Milyon ' else if sayi=3 Then Result:='Üç Milyon ' 771 .else if sayi=7 Then Result:='Yedi Yüz' else if sayi=8 Then Result:='Sekiz Yüz' else if sayi=9 Then Result:='Dokuz Yüz' else Result:=' '. /// function milyon(sayi:Integer):AnsiString. end.

. 772 . begin if sayi=1 Then Result:='Bir Milyar ' else if sayi=2 Then Result:='İki Milyar ' else if sayi=3 Then Result:='Üç Milyar ' else if sayi=4 Then Result:='Dört Milyar ' else if sayi=5 Then Result:='Beş Milyar ' else if sayi=6 Then Result:='Altı Milyar ' else if sayi=7 Then Result:='Yedi Milyar ' else if sayi=8 Then Result:='Sekiz Milyar ' else if sayi=9 Then Result:='Dokuz Milyar ' else Result:='Milyar '.12] of Integer. end. var harf:Array[0. //////////// function milyar(sayi:Integer):AnsiString. end.else if sayi=4 Then Result:='Dört Milyon ' else if sayi=5 Then Result:='Beş Milyon ' else if sayi=6 Then Result:='Altı Milyon ' else if sayi=7 Then Result:='Yedi Milyon ' else if sayi=8 Then Result:='Sekiz Milyon ' else if sayi=9 Then Result:='Dokuz Milyon' else Result:='Milyon '.Edit2Change(Sender: TObject). procedure TForm3.

begin try sayi:=StrToInt(Edit2.sayi.uzunluk-1).1)).Text).i:Integer.Caption:=milyon(harf[6])+yuzler(harf[5])+onlar(harf[4])+binler(harf[3]) +yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end else if uzunluk<9 Then begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then Label1.i+1.Caption:=binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) else if uzunluk<6 Then Label1.Caption:=yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) else if uzunluk<5 Then Label1. uzunluk:=length(Edit2. if uzunluk<1 Then Label1.uzunluk. //SetLength(harf.Text. for i:=uzunluk-1 downto 0 do harf[uzunluk-1-i]:=StrToInt(Copy(Edit2.Caption:=yuzler(harf[5])+onlar(harf[4])+binler(harf[3])+yuzler(harf[2]) +onlar(harf[1])+birler(harf[0]) else if uzunluk<8 Then begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then Label1.Text).Caption:=onlar(harf[1])+birler(harf[0]) else if uzunluk<4 Then Label1.Caption:=onlar(harf[7])+milyon(harf[6])+yuzler(harf[2])+onlar(harf[1]) +birler(harf[0]) else Label1.Caption:=onlar(harf[7])+milyon(harf[6])+yuzler(harf[5])+onlar(harf[4]) +binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end 773 .Caption:=' TL' else if uzunluk<2 Then Label1.Caption:=milyon(harf[6])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) else Label1.Caption:=birler(harf[0]) else if uzunluk<3 Then Label1.Caption:=onlar(harf[4])+binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+ birler(harf[0]) else if uzunluk<7 Then Label1.

Caption:=yuzler(harf[8])+onlar(harf[7])+milyon(harf[6])+ yuzler(harf[5])+onlar(harf[4])+binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+bi rler(harf[0]) end else if uzunluk<11 Then begin if (harf[8]=0) and (harf[7]=0) and (harf[6]=0) Then begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then Label1.else if uzunluk<10 Then begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then Label1.Caption:= milyar(harf[9])+yuzler(harf[8])+onlar(harf[7])+milyon(harf[6])+yuzler(harf[2]) +onlar(harf[1])+birler(harf[0]) else Label1.Caption:=milyar(harf[9])+yuzler(harf[5])+ onlar(harf[4])+binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end else begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then Label1.Caption:=onlar(harf[10])+milyar(harf[9])+yuzler(harf[2])+onlar(harf[1]) +birler(harf[0]) end else 774 .Caption:= milyar(harf[9])+yuzler(harf[8])+onlar(harf[7])+milyon(harf[6])+yuzler(harf[5]) +onlar(harf[4])+binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end end else if uzunluk<12 Then begin if (harf[8]=0) and (harf[7]=0) and (harf[6]=0) Then begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then begin Label1.Caption:=yuzler(harf[8])+onlar(harf[7])+milyon(harf[6])+yuzler(harf[2]) +onlar(harf[1])+birler(harf[0]) else Label1.Caption:=milyar(harf[9])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) else Label1.

Caption:= onlar(harf[10])+milyar(harf[9])+yuzler(harf[5])+ onlar(harf[4])+binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end end else begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then begin Label1.Caption:=yuzler(harf[11])+onlar(harf[10])+milyar(harf[9])+ yuzler(harf[2])+ onlar(harf[1])+birler(harf[0]) end Else begin Label1.begin Label1.Caption:=onlar(harf[10])+milyar(harf[9])+yuzler(harf[8])+ onlar(harf[7])+milyon(harf[6])+yuzler(harf[5])+onlar(harf[4])+binler(harf[3])+y uzler(harf[2])+onlar(harf[1])+birler(harf[0]) end end end else if uzunluk<13 Then begin if (harf[8]=0) and (harf[7]=0) and (harf[6]=0) Then begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then begin Label1.Caption:= onlar(harf[10])+milyar(harf[9])+yuzler(harf[8])+ onlar(harf[7])+milyon(harf[6])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end else begin Label1.Caption:=yuzler(harf[11])+onlar(harf[10])+milyar(harf[9])+ yuzler(harf[5])+ onlar(harf[4])+binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end end else begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then begin 775 .

veri:AnsiString.#8]) then key:=#0.Caption:= yuzler(harf[11])+onlar(harf[10])+milyar(harf[9])+ yuzler(harf[8])+onlar(harf[7])+milyon(harf[6])+yuzler(harf[5])+onlar(harf[4])+ binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) end end end except ShowMessage(‘Değeri Yazılacak Rakam Yok’).'9'.Caption:=yuzler(harf[11])+onlar(harf[10])+milyar(harf[9])+ yuzler(harf[8])+onlar(harf[7])+milyon(harf[6])+yuzler(harf[2])+onlar(harf[1])+ birler(harf[0]) end else begin Label1.Edit1KeyPress(Sender: TObject. end. var Key: Char). procedure TForm1. 776 . end.Caption:=Edit1. var deger:PChar.Text+' TL'//entera basınca yaz else if not (key in ['0'. begin if Key=Char(vk_Return) Then Form1..Edit1Change(Sender: TObject). yenideger. //sadece rakam. procedure TForm1.Label1. Uygulama 17: Aşağıdaki uygulamada “Edit” kontrolü içerisine formatlı sayı (parasal değer) nasıl yazabileceğinizi gösteren güzel bir örnek vereğim.Enter ve backspace izin ver end.

Uygulama 18: Yukarıdaki örneğin daha değişik şekilde çözümünü vermek istiyorum. Uygulamada yazı ters çevrilerek (4-8-15 vs) numaralı karakterlerin yerine “. procedure TForm1. deger1:Array of AnsiString.Text).i:Integer.Text).0).Text).ffNumber. uzunluk. begin deger:=PChar(Edit1. uzunluk:=Length(Edit1. var deger:PChar. Edit1.18. for i:=0 to uzunluk-1 do begin if (Ord(deger^)>=48)and (ord(deger^)<=57) Then begin yenideger:=yenideger+deger^.//imleci en sona gönder end. end.” Karakteri konulmaktadır.Text). deger:=PChar(Edit2.sondeger.sayi:Double. yenideger.Text:=FloatToStrF(sayi. end. Edit1. sayi:=StrToFloat(yenideger).i.Text).tamam:AnsiString.k:Integer. begin uzunluk:=Length(Edit2. inc(deger). 777 .Edit2Change(Sender: TObject).SelStart:=Length(Edit1. uzunluk.

i+1. end.Text).Length(yenideger)). for i:=Length(yenideger)-1 downto 0 do sondeger:=sondeger+deger1[i]. end.4).SelStart:=Length(Edit2.Text:=tamam.//nokta ekle inc(k. for i:=0 to Length(yenideger)-1 do deger1[i]:=Copy(yenideger.//ters çevir. Edit2. Son derece basit bir örnek olduğunu belirteyim.k).1). Edit2.1). inc(deger). k:=4. end.sondeger.i+1. Uygulama 19: Bu uygulamamızda form üzerinde yazı yazma işlemini gerçekleştireceğiz.for i:=0 to uzunluk-1 do begin if (Ord(deger^)>=48)and (ord(deger^)<=57) Then begin yenideger:=yenideger+deger^. While k<=Length(sondeger) do begin Insert('. end.'. 778 . for i:=Length(sondeger)-1 downto 0 do tamam:= tamam+Copy(sondeger. SetLength(deger1.

Uygulamaya ait kod bloğu aşağıda verilmiştir.TextOut(20+5*i. for i:=0 to 20 do Canvas. end. procedure TForm3.Button1Click(Sender: TObject). Canvas.Font.Font.Name:='Times New Roman'.Font. for i:=0 to 20 do Canvas.130. procedure TForm2. Canvas. Aynı kodu “FormCreate” yordamına yazarsanız yazınız gözükmeyecektir (Windowsta birden fazla pencere ile çalışma yapılabildiği için).Name:='Times New Roman'. var i:Integer.TextOut(20+5*i.Style+[fsBold]. Canvas.20+3*i.Color:=RGB(170. Uygulama 20: Yine basit bir uygulama amacımız formun üzerinde büyüyüp küçülen çemberler çizmek olacaktır (Formunuza bir adet Timer kontrolü eklemeyi unutmayınız. var i:Integer.Style:=Canvas. Canvas. begin canvas. Daha hızlı çember çizmesi için Interval değerini küçültebilirsiniz). end. {$j+} //eklemeyi unutmayın const 779 .50).Font.//OnCreate yazacaksanız bu satırı ekleyin canvas.'Nihat Demirli').Font.Size:=14. Canvas.'Nihat Demirli'). Canvas.Font. begin Show.50).Size:=14.FormCreate(Sender: TObject).Timer1Timer(Sender: TObject).Style+[fsBold].Style:=Canvas.Font.Font.Color:=RGB(170.Font. procedure TForm2.Font.130.20+3*i. “Eğer kodu “OnCreate” yordamına yazmanız gerekiyorsa o zaman üst satıra “Show” bildirisini ekleyiniz.

5). Canvas.merkezx+i. end end . yon:Boolean=false. 780 . merkezy:Integer=0. i:Integer=5.merkezy-i. end end else begin if i<=5 Then begin yon:=false.ClientHeight/2).5). end else begin Dec(i. begin merkezx:=Ceil(Form3. merkezy:=Ceil(Form3.ClientWidth/2).Ellipse(merkezx-i.merkezx:Integer=0. if yon=False Then begin if i>50 Then begin yon:=true.merkezy+i). end. end else begin inc(i.

Uygulamayı çalıştırdıktan sonra belirli bir değere kadar çapı devamlı olarak büyüyen çemberler çizecek. uç noktaya erişince çap artık küçülerek yeni çemberler çizmeye devam edecektir. 781 .

j:Integer.Height.Height-5.Height:=Form1.//forma uygula Form1.true).Width.j). begin i:=Form1.Width:=Form1.//şekli belirle SetWindowRgn(Form1.Timer1Timer(Sender: TObject). end else begin tur:=CreateEllipticRgn(0.Handle.Width-5. if yon=false Then begin if j<50 Then begin yon:=true.tur.i. end else 782 . Form1.0. {$j+}//eklemeyi unutmayınız var tur:HRGN. end end else begin if i>300 Then begin yon:=false. procedure TForm1. i.Uygulama 21: Bu örneğimizde formun üzerine “Timer” kontrolü yerleştirerek formun boyutlarını değiştireceğiz. j:=Form1. Const yon:Boolean=false.

begin tur:=CreateEllipticRgn(0.true).deger:PChar. Form1. Form1.Count. şayet kodlara bakmadan yapabilirseniz yeteneğinize diyecek yok demektir.i. i.karakter:Integer. yenideger:AnsiString. Timer1.FormCreate(Sender: TObject). Uygulama 22: Bu uygulamamız gerçekten çok hoş.Interval:=100. 783 . begin Form1.Width:=Form1.adet.Width+5.Handle.Height+5.Button1Click(Sender: TObject).Height:=Form1.tur. end.k.j. procedure TForm2. //Alfabetik sıraya göre Büyükten küçüğe doğru (Z-A) göre sırala Var satir.Width:=200. end . Amaç ListBox içerisinde yer alan satırları alfabetik sıraya göre listelemek olacaktır (Sakın ListBoxın Sorted özelliğini true yapıp hallederim demeyin).j). Yukarıdaki ekran görüntüsü henüz “Alfabetik Sırala” düğmesine basılmadan önce alınmıştır.0.Items. SetWindowRgn(Form1. procedure TForm1. begin adet:=ListBox1. Form1. end. end.Height:=200.

Items[i]).Items[i]). ListBox1. break.Items[1]). end. Programı çalıştırıp “Alfabetik Sırala” buttonuna tıklarsanız. for j:=0 to adet-1 do begin deger:=PChar(ListBox1.karakter:=Length(ListBox1. end else if ord(satir^)<ord(deger^) Then begin satir:=PChar(ListBox1.Items[i]:=ListBox1. Listeniz “Z” den “A” ya doğru sıralanacak ekran görüntüsü aşağıdaki şekilde gerçekleşecektir.Items[j]). break. end.Items[i]).Items[j]:=yenideger. inc(satir).Items[j]. end. satir:=PChar(ListBox1. 784 .Items[i]). satir:=PChar(ListBox1. end else begin inc(deger). inc(i). ListBox1. Until (i>=adet). for k:=0 to Length(ListBox1. Repeat satir:=PChar(ListBox1. end.Items[i]. i:=0.items[j]) do begin if ord(satir^)>ord(deger^) Then begin yenideger:=ListBox1.

end else if ord(satir^)>ord(deger^) Then//buradaki işaretin yönü değişti begin satir:=PChar(ListBox1. break.Items[i]:=ListBox1. end else begin inc(deger).Items[j]). for k:=0 to Length(ListBox1.Items[i]). satir:=PChar(ListBox1.Items[i]). 785 .Items[j]. inc(satir). end. ListBox1. for j:=0 to adet-1 do begin deger:=PChar(ListBox1.Items[j]:=yenideger.Şayet “A” dan “Z” ye doğru bir sıralatma yaptırmak isterseniz o zaman kodun aşağıda verilen kısmında.Items[i]). satir:=PChar(ListBox1. end.items[j]) do begin if ord(satir^)<ord(deger^) Then//buradaki işaretin yönü değiştirin begin yenideger:=ListBox1. karşılaştırma işaretinin yönünü değiştirmelisiniz. ListBox1. break.Items[i].

end. Aslıda kodlama açısından yapılan fazla bir şey yok ama yinede ilginizi çekecektir.dikeydeger:AnsiString. procedure TForm2. dikeydeger:=IntToStr(dikey). var yatay.//yatay değer dikey:=fare. fare:TMouse.CursorPos.//dikey değer yataydeger:=IntToStr(yatay). Programı çalıştırdıktan sonra mousunuzu formun üzerinde hareket ettirin.dikey:Integer. Öncelikle aşağıdaki form tasarımını oluşturunuz.Uygulama 23: Bu örneğimiz Mous ile ilgili olacak. Uygulama 24: Bu uygulamamızda amaç “CD Rom” kapağını program içerisinden açıp kapatmak.X. 786 . Ardından verilen kodları gerekli yordamlara ekleyiniz. “CD Rom” la ilgili bu işlemi gerçekleştirebilmeniz için “MMSystem” kütüphanesini muhakkak uses satırına eklemelisiniz.Timer1Timer(Sender: TObject). yataydeger. Cursorun bulunduğu koordinatlar başlıkta gözükecektir.CursorPos. Uygulamamızda Mousun hareket anındaki koordinatlarını başlıkta yazdıracağız.Y.Caption:='Şu Anki Mous Koordinatları= '+yataydeger+'/'+dikeydeger. Form2. begin yatay:=fare.

procedure TForm3.WM_SYSCOMMAND.0). //Kapat begin mciSendString('Set cdaudio door closed'. “CD-Rom” cihazının açılıp kapandığını göreceksiniz. Uygulama 25: Bu uygulamamızda Windows ta tanımlanmış bir ekran koyuyucuyu nasıl aktif hale getirebileceğinizi göstermek istiyorum.Button2Click(Sender: TObject).procedure TForm3. //Aç begin mciSendString('Set cdaudio door open'.SC_SCREENSAVE.Button3Click(Sender: TObject). //Screen begin SendMessage(Application.Handle.0).0). Aşağıdaki kodu gerekli yordama ekleyiniz.Button1Click(Sender: TObject). end.Nil. procedure TForm3. 787 . Programı çalıştırdıktan sonra iki düğmeye arka arkaya basın. Ekran koruyucunuz hemen devreye girecektir. Programı çalıştırıp düğmeye tıklayın.0. end.0. Daha önceden Windows ta bir ekran koruyucu belirtmeyi unutmayınız.Nil. end.

788 .Caption:=''. var numara:Integer=0.Enabled:=false.Enabled:=false. begin Panel2. Aşağıdaki form tasarımını oluşturunuz.//sıra numarasını tutmak için tanımlandı procedure TForm1. Şayet olmayan bir ekran koruyucu yaratmak isterseniz başka system kodlarından faydalanmalısınız. (tabi basit bir elektronik iletişim ile beraber). Timer2. Timer1. end. Timer3. Programa ait “Unit” kodları aşağıda verilmiştir.Bu kod sadece var olan ve Windows a gösterilmiş olan bir ekran koruyucuyu devreye sokmak için kullanılabilir. procedure TForm1. Panel3. {$j+} const yon:Boolean=false.FormCreate(Sender: TObject). Uygulama 26: Bu uygulamamızda neredeyse tüm bankalarda kullanılmaya başlanan “Qmatik” programının bilgisayar kodunu vereceğim.Timer1Timer(Sender: TObject). Son derece basit olan bu yazılım sayesinde firmaların astronomik miktarda para kazandıklarına şaşıracaksınız.Caption:='0'.Enabled:=false.

Panel2.Caption:='Masa2'.Enabled:=false. BitBtn3. begin Timer1.begin if yon=false Then begin BitBtn1.Caption:='Masa1'.Caption:=IntToStr(numara). end. end. Panel2. Panel3. BitBtn1. inc(numara). begin Timer1. Timer2.Enabled:=false.BitBtn2Click(Sender: TObject).Caption:=''. procedure TForm1. Timer2. 789 . end end. yon:=false. inc(numara).Enabled:=false.BitBtn1Click(Sender: TObject). procedure TForm1. Panel3.Caption:='Masa3'.Enabled:=true.Caption:='Masa3'. Panel2. begin Timer1.Caption:='Masa1'.Caption:=IntToStr(numara). Timer2.BitBtn3Click(Sender: TObject).Caption:=IntToStr(numara). inc(numara). Panel3.Enabled:=true.Enabled:=false. Timer3. yon:=true. procedure TForm1. end else begin BitBtn1.Enabled:=false.Caption:='Masa3'. Timer3.Caption:='Masa2'. BitBtn3.Enabled:=false.Enabled:=true. Timer3. BitBtn2.Caption:='Masa1'.

Aynen bankalardaki sisteme benzer bir durum izleyeceksiniz. procedure TForm1. end end. yon:=true. BitBtn1. kişiyi doğru masaya doğru yönlendirecektir.Caption:=''.Timer3Timer(Sender: TObject).Timer2Timer(Sender: TObject). Programı çalıştırdıktan sonra “Masa” düğmelerinden herhangi bir tanesine tıklayın. yon:=true. end end. {$j+} const yon:Boolean=false.BitBtn2. 790 . begin if yon=false Then begin BitBtn2. yon:=false. end else begin BitBtn3. {$j+} const yon:Boolean=false.Caption:='Masa1'. Müşteriyi çağıran masanın etiketi yanıp sönerek. begin if yon=false Then begin BitBtn3. end else begin BitBtn2.Caption:='Masa2'.Caption:=''. yon:=false. end.Caption:='Masa2'.Caption:='Masa3'. procedure TForm1.

Top:=60. Shape4.FormCreate(Sender: TObject).Top:=180.Enabled:=false.Enabled:=false. Timer1. //Ayarla begin Shape1.Top:=360. procedure TForm2. end.Top:=240. Shape6. Shape3.Top:=120. Shape2. 791 .Top:=300. Aşağıdaki kodlarıda “Unit” pencerenizdeki ilgili yordamlara ekleyiniz. Shape5. Timer2.Uygulama 27: Bu uygulamada Binalarda kullanılan asansörlerin içerisindeki chipe ait yazılımı vereceğim. Öncelikle aşağıdaki tasarımı oluşturunuz.

Enabled:=true.Enabled:=False. end. RadioButton7.Enabled:=False.RadioButton3. RadioButton6.Enabled:=False. RadioButton4. RadioButton2. Form2.Enabled:=False.Enabled:=true. begin if Panel1. end. RadioButton5. RadioButton4.Enabled:=true.Enabled:=true.Enabled:=False.Enabled:=False.Enabled:=True. Form2.RadioButton2.Enabled:=true. RadioButton3.Enabled:=true. Form2.RadioButton1. procedure TForm2.Enabled:=False.Enabled:=False.procedure ata(). RadioButton2. RadioButton3.RadioButton2Click(Sender: TObject). RadioButton7.Enabled:=False. RadioButton6.//siz tanımlayın begin Form2.Enabled:=False.RadioButton7.Enabled:=true. Form2.Enabled:=False.RadioButton1Click(Sender: TObject). RadioButton3. Form2.Enabled:=True. 792 .RadioButton5. RadioButton5.Enabled:=False.Top<360-Panel1.Enabled:=False.Top<384 Then begin Timer1.height Then begin Timer1. RadioButton6. begin if Panel1. RadioButton4.Enabled:=False. procedure TForm2. RadioButton1.Enabled:=true. Form2. end. end else begin Timer2.

Enabled:=False.Enabled:=False. RadioButton6. RadioButton4.Enabled:=False.Enabled:=true.Enabled:=False.Enabled:=False. RadioButton6.Enabled:=False. begin if Panel1.Enabled:=False.Enabled:=False.RadioButton3Click(Sender: TObject). RadioButton4.Enabled:=False. end else begin Timer2.Enabled:=False. RadioButton6. RadioButton3.Enabled:=False.height Then 793 . RadioButton7. RadioButton1. RadioButton1.height Then begin Timer1. RadioButton7.Enabled:=False. RadioButton4. RadioButton5.Enabled:=True.RadioButton4Click(Sender: TObject). RadioButton2.Enabled:=False. RadioButton7. RadioButton7.Enabled:=False. end end. procedure TForm2.Enabled:=False.Enabled:=False. RadioButton2.Enabled:=False.Top<240-Panel1.Enabled:=False. procedure TForm2. end else begin Timer2.Enabled:=False. RadioButton1. RadioButton5.Enabled:=False.Enabled:=true.Top<300-Panel1. RadioButton5. begin if Panel1. end end. RadioButton6.Enabled:=False. RadioButton5.RadioButton4.Enabled:=False.

Enabled:=False.Enabled:=False.Enabled:=False. RadioButton1. RadioButton1. RadioButton5.Enabled:=False.Enabled:=False.Enabled:=True. RadioButton6. RadioButton2.Enabled:=False.height Then begin Timer1.Top<180-Panel1.Enabled:=False.Enabled:=False. RadioButton2.Enabled:=False.Enabled:=False.Enabled:=False.Enabled:=False. RadioButton6.Enabled:=False. RadioButton3. RadioButton4.Enabled:=true. RadioButton7. procedure TForm2. RadioButton3. begin if Panel1.Enabled:=False.Enabled:=False.Enabled:=False. RadioButton3. RadioButton5. RadioButton7. RadioButton6.begin Timer1. RadioButton6.Enabled:=False.Enabled:=True. end else begin Timer2.Enabled:=False.Enabled:=true. RadioButton2.Enabled:=False.Enabled:=False. end end.RadioButton5Click(Sender: TObject). RadioButton1. end 794 . RadioButton4. end else begin Timer2. RadioButton7.Enabled:=False. RadioButton2.Enabled:=False. RadioButton1. RadioButton7.Enabled:=False.Enabled:=False. RadioButton3.

RadioButton3. RadioButton7.Enabled:=true.Enabled:=False. RadioButton2. RadioButton2. procedure TForm2. end else begin Timer2. RadioButton4.Enabled:=False.Enabled:=False.height Then begin Timer1.Enabled:=False. RadioButton6.height Then begin Timer1. RadioButton1. begin if Panel1. RadioButton5.Enabled:=False.Enabled:=False. 795 .Enabled:=False. RadioButton1. RadioButton4. RadioButton2.Enabled:=False.RadioButton6Click(Sender: TObject). RadioButton1.Enabled:=False. RadioButton5.RadioButton7Click(Sender: TObject).Enabled:=False.Enabled:=False.Enabled:=False.Enabled:=true. RadioButton3.Enabled:=False.Enabled:=False.Enabled:=False.Enabled:=False.Top<120-Panel1. RadioButton2.Top<60-Panel1.Enabled:=False. RadioButton7. RadioButton3.Enabled:=False.Enabled:=False.end. RadioButton5. end else begin Timer2. end end. procedure TForm2.Enabled:=True. begin if Panel1.Enabled:=True. RadioButton4.

ata. begin Panel1.height) Then begin Timer1.height) Then begin Timer1. ata.Top+1. end else if RadioButton4. ata. end else if RadioButton6.Top>=120-Panel1.Enabled:=False.Enabled:=false.Top>=180-Panel1.Timer1Timer(Sender: TObject).Top:=Panel1. end end.height) Then begin Timer1. ata. end else if RadioButton2. RadioButton4.Enabled:=false.Enabled:=False.Enabled:=False.Enabled:=false.RadioButton3. end else if RadioButton3. if RadioButton1.height) Then begin 796 .Enabled:=false. end else if RadioButton5.Enabled:=false.Checked and (Panel1.Checked and (Panel1.Checked and (Panel1.Checked and (Panel1. procedure TForm2.Enabled:=False. RadioButton6. ata. RadioButton5. end else if RadioButton7. RadioButton1.Top>=360-Panel1.Enabled:=false. ata.height) Then begin Timer1.Checked and (Panel1.Top>=300-Panel1.Top>=240-Panel1.Checked and (Panel1.Top>=60-Panel1.height) Then begin Timer1.Checked and (Panel1.Top>384) Then begin Timer1.Enabled:=False.

ata. end.Checked and (Panel1. end else if RadioButton7.//prosedürü işlet end.Timer1. end.Top<240-Panel1.Top<360-Panel1.Enabled:=false. end else if RadioButton2.Enabled:=false.Timer2Timer(Sender: TObject).Top<60-Panel1.Checked and (Panel1.height) Then begin Timer2. end else if RadioButton6.Enabled:=false.Checked and (Panel1.Top>=384) Then begin Timer2.Enabled:=false.height) Then begin Timer2.Enabled:=false. ata.height) Then begin Timer2.Checked and (Panel1.Checked and (Panel1. ata.Top<120-Panel1.height) Then begin Timer2.Checked and (Panel1.Checked and (Panel1. end else if RadioButton4.Enabled:=false. begin Panel1.Top-1. if RadioButton1.Enabled:=false. ata. ata. ata. ata.height) Then begin Timer2. ata. procedure TForm2.height) Then begin Timer2. end else if RadioButton3.Enabled:=false.Top<180-Panel1.Top:=Panel1.Top<300-Panel1. end else if RadioButton5. 797 .

Ekran görüntünüz aşağıdaki şekilde gerçekleşecektir. Programı çalıştırıp herhangi bir katın düğmesini aktif hale getirin.end. 798 . Uygulama 28: Aşağıdaki uygulamada girilen iki sayı arasındaki asal sayılar hesaplanıp ListBox içerisine aktarılmaktadır.

ilk:=son. Uygulama 29: Bu uygulamada “LPT1-COM1-COM2-COM3” portlarına nasıl veri gönderebileceğinizi.son. if ceil(sonuc)=floor(sonuc) Then begin yon:=true.'Sayı'. end. sonuc:=i/j. end. yon:Boolean. if ilk>son Then begin sayi:=ilk. if yon=false Then ListBox1.'Sayı'.j:Integer. end.'25')). //Asal Sayıları Bul var ilk.Add(IntToStr(i)). ayrıca porttan ticari cihazlar tarafından gönderilen içerikleri nasıl okuyabileceğinizi göstereceğim.items. for i:=ilk to son do begin for j:=2 to i-1 do begin yon:=false. break.'5')).Button1Click(Sender: TObject). begin ilk:=StrToInt(InputBox('Sayıyı Giriniz'. procedure TForm3. son:=StrToInt(InputBox('Sayıyı Giriniz'. Uygun olan yordamlara ekleyiniz.Uygulamaya ait kod penceresi aşağıda verilmektedir. son:=sayi.i. sonuc:Double. end. 799 .sayi. end.

.Timer1Timer(Sender: TObject).nil.length(veri).'LPT1'). j:integer.miktar.0. Şayet “LPT1” Portuna bağlı bir yazıcınız varsa içerik sayfaya dökülebilecektir. if not evet then//Yazdırmada hata oluşursa showmessage('Herhangi Bir Sebepten Dolayı Yazılamıyor'). yazar kasa vs). veri:String.GENERIC_WRITE . miktar:dword.nil). Delphi için portun paralel (hızlı) veya seri (yavaş) olması önem arz etmez isimlerini değiştirerek diğer portlarada kolayca bağlanabilmekteyiz.OPEN_EXISTING. procedure TForm1.Button1Click(Sender: TObject). var evet:boolean.0).. 800 .//veri değişkenini yazdır. dizi:array[0.10] of char. //LPT1 Portuna yolla var isim:array[0. Uygulama 30: Bu uygulamada da porta gelen veriyi nasıl okuyup değişkene alabileceğinizi göstermek istiyorum. procedure TForm1.veri. x:=CreateFile(isim.Göndereceğiniz içerik ticari bir cihaz olabileceği gibi. end. evet:boolean. printer modem ethernet kartı da olabilir. begin strcopy(isim. veri:string. İlk olrak porta veri yollamak için aşağıdaki kod bloğunu kıullanabilirsiniz. //porta yazmak için oluşturuluyor if x<>1 then //sorun yoksa evet:=WriteFile(x. Ticari cihazlar genellikle sistem cihazları tarafından kullanılmayan “COM3” portunu kullanırlar (Barkod cihazları. var x:THandle.0.4] of char. Şimdi sizlere hem yazdırma hemde okuyma işlemi için kullanabileceğiniz kodları vereceğim.//yazdırılacak port ismi belirlendi veri:='Prestige Educatin Center'.

GENERIC_READ. Aşağıda seçenekleri verilmiştir. x:thandle.nil). //porttan oku for j:=0 to miktar do begin edit1.//okunacak portu belirle //Okunacak olan portu brelirle x:=createfile('ad'.miktar. end.Text:=edit1. //okuma modunda oluştur evet:=ReadFile(x.0.nil.0). miktar:dword. begin strcopy(ad. porta yazdırma işlemleri için kullanılan fonksiyonlar tablo halinde verilmiştir.Text+dizi[j]..dizi.sizeof(dizi). yazma.’COM3’). Parametre GENERIC_READ GENERIC_WRITE GEBERIC_ALL Sadece Okuma Sadece Yazma Hepsi Sonuç Uyarı:Porta yazdırma veya porttan veri okutma işlemleri ile ilgili çok daha fazla detayı bu kitabın hemen ardından çıkaracağım “DELPHI ile VERİTABANI ve NETWORK” isimli kitapta bulabilirsiniz (Bilhassa trojan ların portları nasıl kullanabildikleri ne dair ayrıntılara girilmektedir). ad:Array[0.0. end. 801 . her ikisi) belirler. Aşağıda porttan okuma veya.10] of char.s:string. ikinci parametre ise ne tür bir işlemin yapılacağını (okuma.OPEN_EXISTING. Fonksiyon CreateFile WriteFile ReadFile Sonuç Yazdırma ve ya Okuma işlemi için port belirler CreateFile ile belirlenen porta yazdırma işlemi yapar CreateFile ile belirlenen porttan okuma işlemi yapar CreateFile Fonksiyonu içerisindeki birinci parametre yazdırma veya okuma işleminin yapılacağı portu.

BÖLÜM 22 SETUP PROJESİ OLUŞTURMAK 802 .

803 .

“InstallShield Express” yazılımını kurduktan sonra “Windows” un Start menüsüne aşağıdaki şekilde eklenmiş olması gerekecektir. Bu bölümde sizlere “Delphi” projelerinin setup dosyalarını nasıl oluşturabileceğinizi göstereceğim. Aşağıda pencere gösterilmektedir. Aksi takdirde bilhassa içerisinde “BDE” uygulamaları olan projeler için bir çok hata mesajıyla karşılaşacaksınız. diğe bilgisayarlara oradan yükleme yapmalısınız. Şimdi yukarıdaki adımları izleyerek “InstalShieeld->Expres” uygulamasını başlatınız. 804 .Setup Projesi Oluşturmak: Oluşturduğunuz projeyi başka bilgisaylarda çalıştırmak için setup dosyası haline getirmeli. Setup dosyası oluşturmak için “Delphi” “CD” si içerisinde bulunan “InstallShield Express” yazılımını kurmanız gerekecektir.

Biz yeni baştan bir setup dosyası oluşturacağımız için “Create a new Project” seçeneğini seçerek aşağıdaki pencerenin açılmasını sağladık. yeni baştan bir setup dosyası oluşturacaksanız “Create a new Project” linkine tıklamalısınız. Açılan yukarıdaki pencerede “Blank Setup Project” iconunu seçip “Project Name and Location” kutusuna “Setup dosyanızı kaydedeceğiniz klasörü belirleyin (Herhangi bir klasör olabilir). Bu pencerede daha önceden hazırlamış olduğunuz bir setup projesi varsa ve onu açmak istiyorsanız “Open a Project” seçeneğini. 805 .Karşınıza aşağıdaki pencere açılacaktır.

Ardından projenizin isminide değiştirerek (your project name-1) projenize uygun istediğiniz bir ismi verebilirsiniz. Oluşturacağınız setup dosyasını belirttiğiniz klasörün içerisine kaydedecektir. 806 . Artık “Create” buttonuna tıklayabilirsiniz.

Yukarıda gösterilen hücrelere uygun alan değerleri girerek bir sonraki adıma geçimiz (Bu hücre değerlerine “General Information” Seçeneğine tıklarsanız erişebilirsiniz. Bu adımda “Setup Types” seçeneğini aktif hale geçirip programınızın kurulum seçeneklerini belirleyebilirsiniz. Delphi sizlere kurulum için üç ayrı seçenek sunmaktadır (Typical-Minimal-Custom) Dilediğinizi veya hepsini beraber seçebilirsiniz. 807 . Yukarıdaki seçeneklerden “Typical” olanı seçip diğer adımlara geçiyoruz. “INSTALLDIR” aktivken “projenize ait exe dosyasını.). “DATABASEDIR” aktifkende uygulamanızın kullanacağı veritabanı dosyalarını ekleyin. kurulması zorunlu olan dosyaları bu bölümde yer alan “Destination Computers file’s kısmına ekleyin. Bu adımda “Specify Application Data” bölümünü aktifleştirin. Eğer tüm seçenekleri seçerek diğer adımlara geçerseniz herbiri için kurulması gereken dosyaları ayrı ayrı belirlemek durumunda kalırsınız (Genellikle çok büyük uygulamalar için gerekli olabilecek bir seçenektir). Yukarıda seçmiş olduğunuz kurulumlara ait kullanılacak olan dosya ve klasörlerin tamamını buradan ayarlamalısınız. En üst bölümden “Allways” seçeneğini seçin (Sadece Typical işaretli ise diğerleri gözükmeyecektir).

Uygulamamızda sadece “BDE” Veritabanı tablolarından 808 . Yapmanız gereken tek şey bu seçeneğin işaret düğmesini aktifleştirmekten ibaret olacaktır.Pencerenize ait en son ekran görüntüsü aşağıda verilmiştir. Aşağıdaki ekran görüntüsü “Object/Merge Modules” seçeneği işaretlendikten sonra alınmıştır. Hatırlatalım sayet bir “ADO” kontrolü kullanarak Microsoft ürünlerine veya diğer veritabanı uygulamalarına bağlantı kurduysanız yine bu işlemi uygulamak zorundasınız. Aksi takdirde setup dosyanızı diğer bilgisayarlara yüklediğinizde tabloların bulunamadığına dair çok sıkıcı uyarılarla karşılaşacaksınız. “DataBase Desktop” la oluşturulan bir veritabanı bağlantınız varsa şimdiki bölümde muhakkak bu işlemi yapmanız gerekecektir. Kurulumunuz gerekli dosyaları belirledikten sonra “Object/Merge” bölümüne geçerek şayet varsa “BDE” ayarlarını yapalım. Programınızda kullanabileceğiniz tüm veritabanı seçeneklerini “InstallShield Object/Merge Modules” kısmında bulabilirsiniz.

bulunduğu için. Delphi sizleri yönlendirecektir. “InstallShield Object/Merge Modules” kısmından “BDE_ENT” seçenek düğmesini aktif hale geçirin. “Next” düğmesine tıklayın. Karşınıza “Welcome to the BDE Object Wizard” penceresi açılacak. Bu pencereden programınıza belirleyebilirsiniz. ait ayar dosyalarının tutulacağı bir dosya 809 .

“Alias Name” kısmında programınızın kullandığı tüm “Alias” ları seçerek uygulamanıza ekleyin. Aksi takdirde yine bağlantı sağlanamadığına dair sinir bozucu uyarılar alırsınız. 810 . Bu yüzden tüm client bilgisayarlarda “Alias” ayarlarını teker teker yapmak zorundasınız. Yeni pencereden “BDE” uygulamaları için yeni bir dosya oluşturacağımız için “Launch” düğmesine tıklayın. Hatırlatalım setup projenizi yüklediğiniz bilgisayarlar bu alias isimlerini kullanarak tablolarınıza bağlanabilecektir. Karşınıza aşağıdaki pencere açılacaktır. Aşağıdaki pencere açılacaktır.“Next” düğmesine tıklayarak diğer pencereye geçebilirsiniz. Bu pencerede “Add” düğmesine tıklayarak uygulama içerisinde kullandığınız “Alias” isimlerini belirleyin.

Şayet bu pencerede herhangi bir hata mesajı almazsanız uygulamanızın düzgün bir şekilde Compile edilmiş olduğu anlamını çıkarabilirsiniz. mous ile üzerinde sağ tuşa tıklayınız. Aynı mantıkla şayet Registry ye kayıt yaptıracaksanız “Registy” bölümüne gerekli eklentileri yapmalısınız. Derlenme anında en altta yer alan pencere sayesinde yapılan tüm işlemleri detaylı olarak izleme imkanına sahip olacaksınız. “CD ROM” veya “DVD ROM” seçeneklerinin herbiri burada mevcuttur. Bu pencereden setup dosyasını oluşturacağınız media cihazını belirlemenizi isteyecektir. Bu işlem için “Prepare for Release” seçeneğini seçerek.“Next” ve “Finish” düğmelerine tamamlanmasını sağlayınız. Sağ kısımda yer alan yükleme seçeneğini seçerek. 811 . Birden fazla “DVD ROM” gösterilmesinin sebebi kapasite farkından kaynaklanmaktadır. bu kısım. bir alt klasöründe gösterilen “Build Your Release” penceresinin aktifleşmesini sağlayın. Aşağıdaki pencere açılacaktır. setup projeniz diğer bilgisayara kurulurken oluşturacağı kısayolları belirlemenizi sağlayacaktır. Yukarıdaki pencerede “Program Files” altına ve “Desktop” üzerinde iki adet kısa yolun oluşturulması sağlanmaktadır. tıklayarak “Wizard” işleminizin Gelelim “Configure The Target System” bölümüne. Açılan menüden “Build” sekmesine tıklayarak uygulamanızın derlenmesini sağlayınız. Uygulamanıza ait tüm setup ayarlarını tamamladıktan sonra derlenmesi işlemini başlatabilirsiniz.

Uygulamanızın “Compile” edilmiş halinden sonraki ekran görüntüsü aşağıda verilmiştir. 812 . Setup Dosyanız içerisinde aşağıdaki şekilde gözükecektir. “TeknikServis2003” (vermiş olduğunuz ismi) klasörü üzerinde mous ile çift tıklayın. Setup Projesinin Diğer Bilgisayarlara Yüklenmesi: Derlemiş olduğunuz projeyi diğer bilgisayarlara yükleyebilmek için aşağıdaki adımları izlemelisiniz. Setup projesini oluşturduğunuz klasörü açın (CD ROM ). Aşağıdaki adımları izleyin.

“. Aynı zamanda “Desktop” üzerinde “Migros” isimli kısayolu oluşturduğuna da dikkatinizi çekmek istiyorum.. sonraki ekran görüntünüz yukarıdaki şekilde 813 . “Star->Program Files” seçeneklerini izlerseniz aşağıdaki şekilde bir görüntü elde edersiniz..exe” dosyasını çalıştırıp gerekli adımları izledikten sonra programınız o bilgisayara yüklenmiş olacaktır.Teknikservis2003\Express\cd_rom\DiskImages\Disk1\setup.exe” “Setup. Şimdi “Start->Program Files->Migros->Teknik 2003” adımlarını izleyerek uygulamanızı çalıştırınız.. Programı çalıştırdıktan gerçekleşecektir.

.

II .

ZİRVEDEKİ BEYİNLER Nihat DEMİRLİ Yüksel İNAN Yayınları .

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

.. Serimizin bir sonraki kitabı “Windows 2003 Server” olacaktır. bu yüzden aynı ilgi ve alaka ile isteklerinizi bizlere bildirme alışkanlığınızın devam etmesini istiyoruz... İlgi..... Sibel YANAR Teknik Editör .... Serimizde yer alan Delphi kitaplarının ikincisini okumaktasınız. zorlandığınız hususlarda sizleri bilgilendirmeye çalıştık. Bütün Hayallerinizin Gerçeğe Dönüşmesi Dileğiyle.. alaka.. Gönderdiğiniz e-mailler bizlere atacağımız adımlar konususnda fazlasıyla yardımcı olmaktadır.ÖNSÖZ Zirvedeki Beyinler serisine ait altıncı kitabımızla karşınızdayız. beğeni ve eleştirileriniz için teşekkürlerimizi sunmayı bir borç bilmekteyiz... Her ne kadar yazılım ile ilgili olmasa da network hususunda derinlemesine bilgi edinmenizi sağlayacağına inanıyoruz. Veri Tabanı ve Network hususunda kullanılabilecek gelişmiş kodlara yer vermeye.

VI .

Fak.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. Müh.-Mim.Ü. DEKANI . Prof. Dr. Hüsnü CAN G.

.

Emlak Müd.A.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. KARLIDAĞ Migros Türk T. IX . T. İnş.Ş.

.

.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. Emlak Md. Burak AKTAŞ INTERBANK İnş.

XII .

........................ 5 Paradox Tablolarına Bağlantı........... 35 DataGrid Sütun Başlıklarının Ortalanması...................................................................................................................................................... 10 Resimli veya CheckBox İçeren Tablo Sütunlarıyla Bağlantı ............... 41 DataGrid Nesnesi İçerisinde Sutuna Ait İşlem Yaptırmak ................................................................. 36 DataGrid Sütun Genişliklerini Ayarlamak ......................................................... 46 Filtrelenmiş Kayıtlar Arasında Gezinmek .. 30 Yaratılan Sütun Değerlerini Tablonuzda Hesaplatmak .... 42 DataGrid Nesnesine Ait Yordamlar.............................................................. 4 Database Kontrolü ...................... 15 DBNavigator Kontrolü İçin Tıklanan Düğmeye Kod Yazmak ........................................ 20 Bağlantı İşlemlerinin Kodla Yapmak ............... 43 Kayıt Filtreleme İşlemleri ........ 9 Uygulamanızdan Paradox Tablolarına Bağlanmak ............. 19 Kayıt İşlemlerini Kodla Yapmak ............. 39 DataGrid Kontrolünde Sütun Başlıklarını Gizlemek .......................... 40 Aktif Kayıttaki Satır ve Sütun Değerlerine Ulaşmak.......... 1 Veri Tabanı Uygulamaları ...................................................................... 4 Query Kontrolü ....................................................................................................... 38 DataGrid Font Ayarları ................................................ 37 DataGrid Kontrolüne Ait Sütun Başlıklarını Renklendirmek......................... 37 DataGrid Sutununu ComboBox Şeklinde Kullanmak............ 37 DataGrid Sütunlarını ReadOnly Yapmak .................................................... 49 ................................................................................................................................................................................ 33 DataGrid Kontrolüne Ait Özellikler ............................. 38 DataGrid Kontrolünde İşe Yaramayan Sütunları Gizlemek ......................................................... 5 Alias Tanımlamak ............................................................................................................................. 4 Table Kontrolü ................. 3 BDE Kontrolleri ...................................... 9 DataBase Destop’ı Kullanarak Tabloya Kayıt Girmek .................................................. 17 Kayıtları DataGrid Nesnesinde Göstermek................................................ 38 DataGrid Sütunlarını Renklendirmek................ 22 Veri Tabanında Olmayan Sütunlar Yaratmak.İÇİNDEKİLER BÖLÜM 1 BDE UYGULAMALARI............... 41 DataGrid Nesnesindeki Toplam Satır Sayısını Hesaplamak............................... 11 Wizard Kullanarak Veri Tabanına Bağlanmak ............. 5 Paradox’ta Tablo Oluşturmak......... 4 StoredProc Kontrolü .................................................................................................................................... 34 DataGrid Kontrolüne Ait Sütun Başlıklarını Belirlemek................. 7 Tablo Yapısında Değişiklik Yapmak .................................................................................................................. 11 DBNavigator Kontrolü ...............................................................

............. 82 Matematiksel Sorgu Komutları ............................................................................................................... 56 Locate Methodu ............ 78 Yeni Sütun Başlıkları Belirlemek....................................................................................................................................... 77 Tüm Kayıtları Listelemek ........................................................................................................................... 61 Transaction İşlemi..................... 87 Gruplandırılmış Sütunlara Koşul Koymak(Having) .............................................................................. 86 Gruplandırma Yapmak(Group By) ........................................ 69 Query Kontrolüne Ait Yordamlar .. 50 Filtreli Kayıtlarda Son Kayda Git................................................................................................................................................................... 86 Kayıt Sayısını Bulmak(Count).............. 75 SQL Komutları.......................................................................................................................................................................................... 50 Secondary Index Tanımlamak.......... 74 BÖLÜM 2 STANDART SQL KOMUTLARI ..........Filtreli Kayıtlarda Bir Sonrakini Git ................................... 85 Sütun Ortalamasını Hesaplatmak(Avg) ................................................... 94 XIV ................................................................................................................................................................................................. 79 Yeni Sütun Eklemek .................................... 50 Tarih Aralığına Göre Filtre Uygulamak.............. 80 Aynı Kaydı Birkere Listelemek(Distinct) ................................ 77 Sadece İstenilen Sütunları Listelemek ... 56 Birden Fazla Sütuna Göre Arama Yaptırmak ................................................... 50 Parasal Aralığa Göre Filtre Uygulamak........................ 72 Wizard Kullanarak Query Kontrolüyle Tabloya Bağlanmak .............. 93 İç İçe Select İfadesi Kullanmak ................ 60 Lookup Methodu..................... 63 Database Kontrolü ... 89 Aynı Anda Birden Fazla Koşulu Sağlamak(In) ......... 49 Filtreli Kayıtlarda Bir Öncekine Git.... 50 Filtreli Kayıtlarda İlk Kayda Git ............... 91 Şartlardan Sadece Bir Tanesinin Yeterli Olması(Or)....................... 79 Sıralama Yapmak (Order By) ............................ 83 Sütundaki En Yüksek Değeri Hesaplamak(Max).............................................. 59 SetKey-GotoNearest Methodları ....................................................... 90 Aynı Anda Birden Fazla Şartın Sağlanmaması(Not In) .................................................................................................................................................................... 92 Aralık Sorgulamak(Between) ............................................................................... 83 Sütundaki En Küçük Değeri Bulmak(Min) ................................................................. 58 SetKey-GotoKey Methodları .............................. 84 Sütun Toplamını Bulmak(Sum) .......................................... 63 Query Kontrolü .......................................................................... 88 Sorguya Koşul Koymak(Where) ........................... 53 Kayıt Arama İşlemleri .................................................................................

.................................................................................................. 143 Birden Fazla Seri İçeren Grafik Oluşturmak ................. 130 DBLookupListBox Kontrolü .............................. 155 DataSource Kontrolü .............. 170 QRSubDetail Kontrolü........................ 118 Parametreyi “Like” Komutuyla Beraber Kullanmak ..................................................................... 170 XV ........................................................................ 128 Lookup İşlemleri ............................................ 149 Grafiği Yazdırmak ............. 115 Parametre Olarak Parasal İçerikli Değişken Kullanmak.................................................................................................. 103 Sorguyla Tabloya Kayıt Eklemek .................... 121 Birden Fazla Tablo İle Çalışmak.......Sütun İçerisinde Arama Yapmak(Like) ................................................................................................. 151 Data Modul Yapısı ........ 152 DataModule Kullanarak Tablolara Bağlanmak...... 170 QRBand Kontrolü......................................................................................... 112 Parametre Olarak Tarih İçerikli Değişken Kullanmak............................. 120 BÖLÜM 3 TABLOLAR ARASI İLİŞKİLENDİRME ................................................................................................................................. 136 BÖLÜM 4 GARAFİK ÇİZDİRMEK .................... 141 Tablo Kayıtlarını Grafikte Göstermek .................................................................................................................................................................................................. 167 Rapor Dosyaları Oluşturmak ............... 134 Tabloda Lookup Sütunları Yaratmak ...................................................................................... 157 Kodla Tablo Oluşturmak ............................... 99 Union Komutunu Kullanarak Tabloları Birleştirmek................................... 117 Opsiyonel Parametreli Sorgu Oluşturmak......... 162 BÖLÜM 5 RAPOR DOSYASI OLUŞTURMAK............................................................................................................................................................ 106 Query Kontrolüne Parametre Değeri Göndermek................................. 102 UpdateSQL Kontrolü .................... 127 Master-Detail Tablolarda Kayıt Arama İşlemleri ..................................................................................... 95 İki Tabloyu Aynı Anda Sorgulamak .......... 97 Inner Join Komutu İle Koşul Koymak ...................................................................................... 123 Master Detail Form Yapısını Manuel Oluşturmak ......................... 101 Tablo Yapısında Değişiklik Yapan Sorgular. 98 Outer Join Komutu İle Koşul Koymak ...... 169 QuickRep Kontrolü ..................................................... 116 Birden Fazla Parametre Değeri Göndermek ................................................................................... 130 DBLookupComboBox Kontrolü............. 102 Sorguyla Kayıt Silmek(Delete) .............................. 153 Data Module İçerisinde Parametre Oluşturmak ........................................................................

.. 211 İleri Düzey Stored Procedur Uygulamaları.......................................................................................... 205 ADOQuery Kontrolüne Programdan Parametre Göndermek .. 176 Rapor Dosyasına Uygulamanızdan Erişmek........ 207 Delphi İçerisinden Stored Procedur’lere Ulaşmak.............................................................................. 170 QRLabel Kontrolü ............. 219 String Fonksiyonları ...................... 207 SQL Server’da Stored Procedure Oluşturmak........................................................... 206 ADOStoredProc Kontrolü........................................................................................................................................................ 188 DecisionPivot Kontrolü Kullanarak Senaryo Oluşturmak.......................................................................................... 200 Microsoft Access Veri Tabanına Bağlanmak ....... 170 QRRichText Kontrolü ......QRGroup Kontrolü ........................................... 215 Stored Procedure İle Hesaplanan Değerleri Değişkenlere Aktarmak................... 219 XVI ........................................................................................................................................................... 171 QRDBImage Kontrolü............................... 170 QRExpr Kontrolü ............................................................ 185 Decision Cube Kontrolleri........................................ 201 Adoconnection Kontrolünü Kullanarak SQL Server’a Bağlanmak............................ 183 BÖLÜM 6 DECISION CUBE ILE ÖZET TABLO GÖRÜNTÜLERİ OLUŞTURMAK............................................................................................ 197 ADOTable Kontrolü .................................................... 200 SQL Server İle Çalışmak.................... 187 Tablo Kayıtlarını Özet Tablo Olarak Listelemek.......................................... 171 Gruplandırılmış Rapor Dosyası Oluşturmak................................... 190 BÖLÜM 7 ADO KONTROLLERİ................................................................. 197 Adoconnection Kontrolü .................... 187 Tablo Kayıtlarını Grafik Şeklinde Göstermek ........................................ 171 QRImage Kontrolü ........................................... 202 ADOQuery Kontrolü ............................................................................................................................................. 170 QRSysData Kontrpolü.............................................................................................................................................. 171 QRShape Kontrolü ........................................................................................................................ 213 Stored Procedur Kullanarak Kayıt Silmek ...................... 170 QRMemo Kontrolü................ 170 QRDBText Kontrolü ..................... 217 Stored Procedure Fonksiyonları............................................................................... 195 ADO Kontrolleri................................................................................................................. 213 Stored Procedur Kullanarak Kayıtları Değiştirmek............................................................................................ 209 Parametre İçeren Stored Procedure Oluşturmak ............................................... 211 Programdan Stored Procedur’e Parametre Değeri Göndermek ....................

................ 255 InterBase Kontrolleri İle Kayıt İşlemleri ............................................................................................. 231 ADODataSet Kontrolü İle Aktif Kaydı Silmek............................ 219 Tarih-Zaman Fonksiyonları ... 243 INTERBASE Veri Tabanı İşlemleri....................................................................................... 255 IBTable Kontrolü.......... 261 InterBase Tablolarını Parametre İle Sorgulamak......................................... 252 InterBase Kontrolleri...................................................... 231 ADODataSet ve Transaction.............. 264 BDE Kontrolleriyle InterBase Veri Tabanına Bağlanmak.................................................... 235 ClientDataSet Kontrolü .............Matematiksel Fonksiyonlar . 245 InterBase Kullanarak Veri Tabanı Oluşturmak ............................ 254 IBTransaction Kontrolü............. 231 BÖLÜM 8 XML DOSYALARI OLUŞTURMAK ................................................................................................ 254 IBDataBase Kontrolü .... 223 ADODataSet Kullanarak Kayıtları Filtrelemek.......................................................... 219 ADODataSet Kontrolü .................... 231 ADODataSet Kontrolü İle Kayıt Eklemek ................................................ 267 Yeni Kullanıcılar Tanımlamak ................................... 248 InterBase İçerisinden Tabloya Kayıt Girmek............................................................................................................. 237 ClientDataSet Kontrolü İçerisindeki Kayıtları Xml Uzantılı Kaydetmek .................................. 225 ADODataSet1....................... 250 Delphi Projesinden Yarattığınız Tabloya Bağlanmak .................. 245 InterBase Veri Tabanı İçerisinde Tablo Yaratmak............................................................................................ 266 SYSDBA Kullanıcısına Ait Şifreyi Değiştirmek .............................................................................................................................................. 250 InterBase Veri Tabanında Gelişmiş Tablolar Yaratmak .................................................Locate Methodu.............................................................................................................. 220 ADODataSet Kontrolü İle Kayıt İşlemleri . 240 BÖLÜM 9 INTERBASE KONTROLLERI ................................................................................. 225 ADODataSet Kullanarak Kayıt Arama İşlemleri ......... 269 BÖLÜM 10 RAVE KONTROLLERİ İLE RAPOR DOSYASI OLUŞTURMAK ................................. 271 Rave Kontrollerini Kullanarak Rapor Oluşturmak......... 256 IBQuery Kontrolü....................................................................... 262 InterBase Kontrolleri Kullanarak Master Detail Form Oluşturmak........................................................................................................................................................................................... 226 ADODataSet Kontrolü Kullanarak Master/Detail Form Oluşturmak................................ 227 ADODataSet Kontrolüne Uygulanabilecek Kilitler ................ 273 XVII ....

........................................................................................................ 300 Uygulama 2:Sakıncalı Sayfalar İçin WebBrowser Örneği ........................................................ 350 IdFTP Kontrolü ................................................................ 287 Network Programcılığına Giriş ...................................Programdan Rapor Dosyalarına Ulaşmak ....................................................................................................................................................... 280 Hesaplanan Sütunlara Ait Biçimlendirme İşlemleri ........................ 364 IdDecoderMIME Kontrolü ................................ 308 Uygulama 3:Diğer Bilgisayardaki Tabloyu Sorgulamak........................................................................................................................................................................................................... 321 IdSMTP Kontrolü............................................................................................................................................................................ 289 TCP/IP Protocollerine Genel Bir Bakış ......................... 359 IdEncoderMIME Kontrolü........................................ 365 Uygulama 9:Dosyalara Encript-Decript İşlemleri Uygulamak.......................................................................................................................................... 324 Uygulama 5:E-Mail Göndermek .......... 282 Koşula Uyan Kayıtların Raporunu Oluşturmak ............................................. 319 Indy Kontrolleri ...... 366 XVIII ........................... 310 DataSetTableProducer Kontrolü...................................................... 329 IdMessage Kontrolünün e-mail Alırken Kullanabileceğiniz Methodları ..................................................................... 321 IdMessage Kontrolü............................................................ 344 Uygulama 7:Chat Uygulaması................................................. 326 IdPOP3 Kontrolü ..... 339 IdTCPServer Kontrolü.......................... 315 BÖLÜM 12 INDY KONTROLLERİ .... 281 Calc Text Component Kontrolü ile Yapılabilecek Diğer Hesaplamalar ............ 290 Internet Kontrolleri ................................................................... 353 Uygulama 9:Ftp Sitelerinden Dosya İndirmek ............................................................................................... 297 WebBrowser Kontrolü........................................................................ 302 TcpServer Kontrolü ........... 278 Sütun Değerleri İle Hesap Yapmak............. 283 BÖLÜM 11 NETWORK PROGRAMCILIĞI ....................................................................... 331 Uygulama 6:E-Mail Almak................................... 305 TcpClient Kontrolü............................................................................... 340 IdTCPClient Kontrolü................................... 282 Kayıtları Altı Çizili Hale Getirmek ....... 297 Uygulama 1: WebBrowser Örneği ............................................. 333 IdAntiFreeze Kontrolü ..................................................... 346 Uygulama 8:Dosya Transferi..... 314 Uygulama 4:Tabloları Web Sayfasında Görüntülemek................................................................................................................................................................................................

.............................................................................. 389 Uygulama 15:Network Uygulamalarında Veri Tabanı Kullanmak ................................................... 372 IdNetworkCalculator Kontrolü................................................................................................................................................ 403 Setup Projesinin Diğer Bilgisayarlara Yüklenmesi ... 411 XIX ................ 381 Uygulama 14:Daha Gelişmiş Bir Trojan .......................... 395 BÖLÜM 13 SETUP PROJESİ OLUŞTURMAK................................................... 374 Uygulama 11:IP Numaralandırma ........... 376 Uygulama 12:Bağlanan Bilgisayarın IP Aralığı ................................................................ 370 IdIPWatch Kontrolü............................ 378 Uygulama 13:İlk Trojan..................................................................... 401 Setup Projesi Oluşturmak ............................Uygulama 10:Stream Tip Değişkenlerle Encript-Decript İşlemleri .........................................

SON SÖZ Serimizin altıncı kitabını da tamamlamış bulunuyoruz. Kitaplarımız hkkındaki tüm eleştiri ve önerilerinizi prestige@prestigeturk. TCP/IP Protokolü hususunda bilgisinden faydalandığımız Osman ÇALIŞ’a teşekkürü bir borç bilmekteyiz. Diğer kitaplarımıza göstermiş olduğunuz ilgiyi aynen devam ettirmeniz en büyük temennimiz olacaktır.com adresine gönderebilir. XX . karşılaştığınız problemler için bu adresten çözüm isteyebilirsiniz.

BÖLÜM 1 BDE UYGULAMALARI .

2 .

Şunu unutmayın bilgilerin tutulduğu yer Delphi değildir. Bu yüzden bu verileri daha sonra kullanmak amaçlı bilgisayarınızda saklamalısınız. Bu yapraktaki kontroller sayesinde kolayca veri tabanlarına bağlanabilmektedir. Şayet çok büyük network uygulamaları oluşturacaksanız SQL Server veya Oracle kullanmalısınız.Veri Tabanı Uygulamaları: Geliştireceğiniz uygulamaların neredeyse tamamında kullanacağınız. bilgilerinizi yazdırabileceğiniz (daha sonra tekrar ulaşabilmek için) programlara ihtiyacınız olacak. Profesyonel uygulamalarınızda günlük düzenli olarak rapor tutmanız gerekecektir.Dbase. Biz uygulamalarımızda Delphi’nin en verimli kullanabildiği “Paradox” tablolarından faydalanacağız. Delphi7’de Veitabanı bağlantılarını gerçekleştirmek için “Component Palet” araç çubuğunda bulunan “BDE” Yaprağını kullanır. dolayısıyla veritabanı desteği her zaman karşılaşacağınız vazgeçilmez bir konu olmaktadır. Bilgisayara veri saklama işlemlerini düzenli bir tablo yapısına sahip olan veritabanı programlarıyla gerçekleştirmekteyiz. 3 . Daha sonra Delphi ile bu veritabanı uygulamalarına bağlanıp gerekli bilgilere ulaşabilmekteyiz. Delphi de size sağladığı imkanla bu veri tabanı bilgilerini istediğiniz gibi kullanmanızı sağlar.SQŞL Server vs). Bilgiler veritabanı programlarına kaydedilir (Paradox.Access. Yine “Component Palet” yaprağında bulunan “Data Controls” kontrolleriyle de tabloları yönetmek için kullanıcıya gerekecek olan ara yüz oluşturma seçenekleri sunulmaktadır.

• Table Kontrolü: Bu kontrol sayesinde veritabanında bulunan tablo ile direk bağlantı kurulur. Göreceksiniz bir süre sonra herşeyi otomatik olarak halledebilme seviyesine ulaşacaksınız. bilhassa çok fazla satır içeren tablolarda tavsiye etmiyorum. Bu tür bağlantıda tablonuzdaki tüm satırlara (isterseniz tüm tabloyuda alabilirsiniz) değil sizi ilgilendiren satırlara ulaşmak için kullanılır. Doğrusunu isterseniz bu sistem online gönderimler dışında çok etkili olmuştur. Daha sonra müsait bir zamanda tüm değişiklikler veri tabanı tablosuna tekrar yazdırılır.BDE Kontrolleri: Veritabanı bağlantı işlemlerini gerçekleştiren kontroller bu yaprakta bulunur. Şimdi sizlere bu çalışma imkanlarını oluşturan “BDE” kontrollerine bir göz atalım. Bu yüzden performansı en üst düzeyde tutmak için bilgi girişleri tüm kullanıcıların local mekinelerinde yapılır. Bu kontrolle Table kontrolünün yaptığı gibi hiç bir kriter koymadan tüm tablo bilgilerine de kolayca ulaşabilirsiniz. Lokal bilgisayarda ana tablonun bire bir bir kopyası oluşturularak yapılan değişiklikler bu kontrole yazılırlar. bu da “Query” kontrolüne göre ilk çalıştırılmadan sonra çok daha hızlı sonuç vermesini sağlamaktadır. • StoredProc Kontrolü: Veri Tabanı tablolarına en hızlı ve etkili bağlantı sağlayan “BDE” kontrolüdür. Bu kontrolle yapılan bağlantıdaki amaç. “StoredProc” kontrolünden sonra bağlantı işlemleri için en çok kullanacağınız kontrol olduğunu belirtmek isterim. İlerleyen bölümlerde (bilhassa büyük uygulamalar için) kontrole ait bir çok örneklendirmeler yapılacaktır. Ama bağlantı mantığını anlamanız açısından kesinlikle çok iyi bilinmesi gerektiğini düşünüyorum. trafiği azaltmak için servera sadece parametre göndererek tekrar tekrar tabloların sorgulanmamasını sağlamaktır. Lütfen hiç bir ayrıntıyı kaçırmadan tamamını anlamaya çalışınız. Ben bu kontrolle veritabanına bağlanmanızı (zorunlu kalmadığınız sürece) . • Query Kontrolü: Veri Tabanı tablolarınızı sorgulayarak local makinenize indiren kontroldür. “Stored procedur’ler çalıştırıldıkları andan kapatılana kadar sadece bir kere derlenirler. müsait bir zaman da da servera gönderilir. Direk veritabanıyla çalışmak bir çok durumda (bilhassa network ortamında binlerce kişinin aynı tabloya bilgi girdiğini düşünürseniz) performans açısından sakınca yaratmaktadır. 4 . Tüm dillerin kullandığı yapıda budur.

“Start->Settings->Control Panel” seçeneklerini arka arkaya tıklayın.• Database Kontrolü: Bilhassa Trasaction işlemlerinde kullanılan ve yapılan tüm değişiklikleri kaydedebileceğiniz bir kontroldür. Bu yapı sayesinde her defasında tablonun adresini girmek zorunda kalmazsınız. Karşınıza aşağıdaki pencere açılacaktır. Yukarıda bahsedilen tüm kontroller kullanıcıya oluşturacağınız arayüz ile Veri Tabanı tabloları arasında ki bağlantıyı oluşturmak içindir. Alias Tanımlamak: Alias lar tabloların bulunduğu adresi tutan takma adlardır. Alias tanımlamak için aşağıdaki adımları izleyin. Daha sonra istenildiği vakit ana tabloya da yansımaları sağlanacaktır. 5 . Karşınıza aşağıdaki pencere açılacaktır. Arayüz kontrollerinde yapacağınız değişiklikler öncelikle bu nesnelerde etkili olacaktır. Yapacağınız bağlantılarda tablonun yolunu değilde belirlemiş olduğunuz bu Alias ‘ı kullanırsınız. Uygulamaya başlamadan tablolarınızı kaydedeceğiniz klasöre takma ad (Alias) belirlerseniz. Paradox Tablolarına Bağlantı: Delphi’nin en performanslı çalışma yaptığı Veri Tabanı Paradox’tur. Tablo oluşturmaya geçmeden önce ileride çok işinize yarayacak (muhakkak ilk bu işlemi yapın) olan “Alias” tanımlama işleminden bahsetmek istiyorum. Bu kontrollerden projenize ne kadar çok eklerseniz programınızın o kadar performans kaybedeceğini unutmayınız. Açılan pencereden “BDE Administrator” seçeneğine çift tıklayın. Bu yüzden örneklerimizi (çok büyük yazılımlar hariç en çok bu veri tabanı kullanılır) bu tablolar üzerinde yoğunlaştıracağız.

Açılan bu pencerede “DataBase” üzerine mousun sağ tuşuna tıklayarak menü penceresini açın ve “New” seçeneğine tıklayın. 6 . Alias ismi olarak ta “gazi” seçimini kullandık. Aşağıdaki pencere açılacaktır. Bu pencereyi “OK” Buttonuna tıklayarak geçin. İsmini değiştirip (gazi). Yeni Aliasınız pencerenize “STANDART” ismi ile eklenecektir. “PATH” kısmınada tablonuzu kaydedeciğiniz klasörü girin (veya seçin) Gördüğünüz gibi biz tablonun kaydedileceği klasörü “c:\prestige” olarak belirledik.

Alias tanımlamasını yaptıktan sonra oluşturacağınız tablolara bu aliası kullanarak erişmek istiyorsanız tablolarınızı “c:\prestige” klasörünün içerisine (çünkü bu klasör path olarak gösterildi) kaydetmelisiniz. Aşağıda karakteristik özellikleri verilen sütunları bu pencerede oluşturunuz. üçüncü sütun kaç karakter veri alabileceğini (tarih ve parasal içeriklerde paradox bu 7 .sütun tiplerini. Birincisi Delphi yi hiç açmadan (biz bu yolu tavsiye ediyoruz. Karşınıza aşağıda gösterilen pencere açılacaktır. gelen uyarı penceresine de olumlu cevap verin.sütun uzunluklarını ve index lerinizi belirlemelisiniz. Tablonuzu hangi veri tabanında oluşturacaksanız onu seçmelisiniz. Bu pencerede tablonuzda yer alacak olan sütun isimlerini. Açılan pencereden “File->New->Table” seçeneklerini seçerek aşağıdaki “Create Table” penceresinin açılmasını sağlayın. Biz “Paradox” u kullanacağımız için “Paradox7” seçeneğini seçerek “OK” Buttonuna bastık. ikinci sütun içeriğin tipini (Type kısmında mousun sağ tuşuna basarsanız tüm seçenekler listelenir). Bilhassa bağlantıdaki bir tablo tasarımını değiştirmenize paradox izin vermeyecektir) “Start->Programs->Borland Delphi7->DataBase Destop” adımlarını izleyin.Pencereyi kapatıp. Fieeld Name(Sütun İsmi) SIRANO MAGAZAADI SERVISTARIHI GIDENFIRMA ARIZASEBEBI FATURATUTARI Type(Tipi) + A D A A $ 25 25 25 Size (Kaç Karakter) Otomatik artar Key(Primary ind) * Tabloya dikkat edin ilk sütun kolon başlıklarını. Bu pencerede destek verilen Veri Tabanlarının isimleri bulunmaktadır. Tablolar ile ilgili işlemleri yaparken uygulamanızı kapatmanız oluşabilecek sorunları engelleyecektir. Diğer seçenekler zaten Delphi içerisinden çok kolay halledilebileceği için onlarla fazla kafanızı yormanızı tavsiye etmem. Paradox’ta Tablo Oluşturmak: Paradox’ta tablo oluşturmak için iki yönteminiz mevcut. Aksi takdirde bu alias işinizi görmeyecektir.

Şimdi “Save As” buttonuna tıklayarak tablonuzu “gazi” Aliasının gösterdiği klasörün (“c:\prestige”) içerisine “SERVIS” ismiyle kaydedin. 8 . son sütun ise tablonuzdaki Primary index i belirler. İsmini (SERVIS) yazıp kaydedebilirsiniz. “Save As” buttonuna tıkladıktan sonra açılan yukarıdaki pencerede yer alan “Alias” kısmından “gazi” yi seçmeniz “c:\prestige” klasörünü aktif yapmaya yetecektir.değeri kendisi belirler). “*” koyduğunuz sütun o tablo için Primary index sütunu olacaktır (dikkat edin en üstteki sütunu primary belirleyebilirsini).

Uyarı:Tablonuzu başlangıçta düzgün tasarlamaya önem gösteriniz. 9 . Şimdilik yukarıdaki kayıtları “Edit Data” komutunu vererek “Paradox” Veri Tabanı içerisinden giriniz.Daha sonra yapmak isteyeceğiniz fazla radikal değişiklere “Paradox” izin vermeyebilir. Ardından “Table->Restructure” seçeneklerini seçerek tablonuzu oluşturduğunuz pencereye dönebilirsiniz. Açılan bu pencerede “File->Open->Table” seçeneklerini seçip. dosya aç penceresinin açılmasını sağlayın. Daha önceden kaydettiğiniz tablonuzu (“Alias isminden hemen bulabilirsiniz) seçip “Open” düğmesine basın. tablonuzu tekrar oluşturmak zorunda kalabilirsiniz. Yoksa kullanıcı az önceki ekrandan asla kayıt girmeyecektir. Girdiğimiz kayıtlardaki amaç bağlantının doğru olarak kurulup kurulmadığı içindir. DataBase Desktop’ı açtıktan sonra “File->Open” seçenekleri ile tablonuzu açın. “Table->Edit Data” adımlarını izleyin. DataBase Destop’ı Kullanarak Tabloya Kayıt Girmek: Bu yöntemi fazla kullanmayacaksınız ama örnekleri hızlı denemek için bilmekte fayda var. “Tools->DataBase Destop” adımlarından sonra aynı pencere açılacaktır. Bu aşamadan sonra Delphi’den “BDE” kontrollerini kullanarak bu tabloya bağlantı sağlayacağız. tablonuza bu aşamadan sonra kolayca kayıt girebilirsiniz.Tablo Yapısında Değişiklik Yapmak: Şimdi sizlere ikinci yöntemle (bu yöntemle tabloda oluşturabilirsiniz) tablo yapısında nasıl değişiklik yapabileceğinizi göstermek istiyorum (siz hep birinci yolu takip edin). Burada tablo yapınız için gerekli değişiklikleri yapabilirsiniz.

Yerleştirdiğiniz kontroller ile “Table” nesnesi arasındaki bağlantıyı sağlamak için formunuza bir adet “DataAccess” yaprağında yer alan “DataSource” kontrolü yerleştirin. 10 . “Table” kontrolünün “DataBaseName” özelliğine tablonuzun içerisinde bulunduğu klasörü referans gösteren “Alias” ınızın (bizim örneğimizde “gazi”) ismini aktarın. “DataSource” kontrolünü seçip “Object Inspector” pencersinden “DataSet” özelliğine eklemiş olduğunuz “Table” kontrolünüzün ismini aktarın. Bizim örneğimizde “SERVIS” tablosu olacaktır. Bu adımda “Table” nesnenizin “Active” özelliğine “true” değerini aktarın ve aşağıdaki “DBEdit” kontrolü ayarlarına geçin. Birinci adımda formunuzun üzerine “BDE” Yaprağında bulunan “Table” nesnesinden bir adet yerleştirin. Dördüncü adımda aşağıdaki form tasarımını oluşturup. Üçüncü adımda yine “Table” nesnesini seçerek “Object Inspector” penceresinden “Table Name” özelliğine paradox ta oluşturduğunuz tablonuzun ismini girin (veya seçin).Uygulamanızdan Paradox Tablolarına Bağlanmak: Programınız içerisinden Paradox veri tabanına aşağıdaki adımları izleyerek kolayca bağlanabilirsiniz. altı (6) adet Label kontrolü ile yine altı (6) adet “DataControls” yaprağında yer alan “DBEdit” kontrolü yerleştiriniz. Şayet değiştirmediyseniz “Table1” olarak açılan pencerede gözükecektir.

Açılan bu pencereden “Business” yaprağını aktifleştirin.“DBEdit1” kontrolünüzü seçip “Object Inspector” penceresinden “DataSource” özelliğine formunuza eklemiş olduğunuz “DataSource” nesnenizin ismini aktarın (veya seçin). Tüm kayıt bilgilerinin kontrollere aktarıldığını göreceksiniz.”D” Tarihsel içerikler için. Şimdi aşağıdaki tabloyu oluşturup program içerisinden bu tabloya bağlanalım. “O” harfi ise resim türü verileri barındırmak için kullanılmaktadır. 11 . Şayet ismini değiştirmediyseniz “DataSource1” olarak gözükecektir. Fieeld Name(Sütun İsmi) SIRANO MUSTERIADI MEDENIHALI SATISTARIHI SATILANURUN RESMI Type(Tipi) + A L D A O 25 25 Size (Kaç Karakter) Otomatik artar Key(Primary ind) * Bu tabloda “Type” kısmında kullanılan “A” harfi karakter veriler için. Resimli veya CheckBox İçeren Tablo Sütunlarıyla Bağlantı: Bazı durumlarda tablonuzda kişiye ait resimleri saklamak zorunda kalabilirsiniz. Bu tip durumlarda o sütun için uygun bir tip seçmelisiniz. Yine “Object Inspector” penceresinden “DataField” özelliği için seçmiş olduğunuz tabloya ait uygun sütunu seçin (tüm sütun isimleri bu özellikte gözükecektir). “DataBase Form Wizard” seçeneğini çift tıklayarak sihirbazı işlemleriniz için devreye sokun. “File->New->Other” seçeneklerini izleyerek “New Items” penceresinin açılmasını sağlayın.”+” karakteri otomatik artan sütunlar için. Bizim örneğimizde ilk “DBEdit” kontrolü “SIRANO” yu göstereceği için bu ismi seçtik. Paradox resim alanları için sütun tipinizi “OLE” olarak belirlemenizi ister. Aynı şekilde “MEDENI HAL” gibi evet-hayır seçenekleri içeren sütunlar içinse “Logical” tipini seçmeniz gerekecektir. Son adım olarak diğer “DBEdit” kontrolleri içinde aynı iki ayarı yaparak uygulamanızı çalıştırınız. Wizard Kullanarak Veri Tabanına Bağlanmak: Aşağıdaki adımları izleyerek sihirbaz yardımıyla kolayca oluşturmuş olduğunuz tabloya bağlanabilirsiniz.”L” harfi true-false içerikler için.

Aşağıdaki “Database Form Wizard” penceresi açılacaktır. Bu pencerede “Drive or Alias name” kısmından talonuzun bulunduğu klasörü referans gösteren “Alias” ınızı seçip “MUSTERI” tablosunu işaretleyin (aynı Alias ın içerisinde istediğiniz kadar tablo yaratabilirsiniz). 12 . Bu pencerede “Form Options” kısmından “Create a simple form” seçeneğini “DataSet Options” kısmından da “Create a form using table objects” i seçerek “Next” buttonuna tıklayın. Aşağıdaki yeni pencere açılacaktır.

“Next” buttonuna tıkladıktan sonra açılan pencereden “Vertical” seçeneğini seçin. “Next” buttonuna tıkladıktan sonra açılan pencereden “Left” seçeneğini seçin.“Next” buttonuna tıkladıktan sonra aşağıdaki pencere açılacaktır. “Next” buttonuna tıkladıktan sonra “Form Only” seçeneği işaretli iken “Finish” buttonuyla bitirin. Bu pencerede yer alan “Available Fields” kısmındaki tüm sütun başlıklarını “>>” düğmesine tıklayarak “Order Selected Fields” penceresine aktarın. 13 . Artık programınızı çalıştırabilirsiniz. Delphi yukarıdaki şekilde her şeyin hazır bulunduğu bir form oluşturacaktır.

Bu örnekte “RESIM” sütununun boş olduğu sanıyorum dikkatinizi çekmiştir.ImageRESMIDblClick(Sender: TObject).Edit. Aktif kayıda aşağıdaki şekilde ekleyeceğiniz bir kod bloğuyla kolayca resim ekleyebilirsiniz. OpenDialog1. yine aynı yaprakta yer alan “DBImage” kontrolünü kullanmanız gerekecekti. 14 . Table1.Şayet tasarımı bir önceki örnekte olduğu gibi kendiniz yapmak isterseniz.LoadFromFile(yol).ico|Bmp Dosyaları|*. Diğer işlemleri hiç bir değişiklik yapmadan aynen uygulamalısınız. //değişme moduna al ImageRESMI. begin OpenDialog1.Post. procedure TForm3.Filter:='ico Dosyaları|*.//yazdır end.Picture. Formunuza “Dialog” yaprağında yer alan “OpenDialog” kontrolünden bir adet yerleştirip aşağıdaki kod satırlarını da resmi gösteren kontrolün “OnDblClick” yordamına ekleyiniz.Execute Then begin yol:=OpenDialog1. “MEDENİHAL” Sütunu için “DBEdit” kontrolü yerine aynı yaprakta yer alan “DBCheckBox” kontrolünü kullanmak. aynı şekilde “RESMI” Sütunu için de.FileName. Table1. end.bmp'. var yol:AnsiString.Title:='Resim Seç'. if OpenDialog1.

kayıt güncelleme işlemlerini kolayca yapabilirsiniz. Şayet değiştirmediyseniz sütun ismine yakın bir isim alacaktır. Aksi takdirde Açıklama balon içerikleri var olsa bile kullanıcı tarafından gözükmeyecektir. DBNavigator Kontrolü: Bu kontrolü kullanarak kayıtlar arası gezinti.Edit” satırıyla yapılan işlem budur. Yapılan işlem ise resmin üzerine çift tıklandığı zaman “OpenDialog” penceresi açtırılmaktadır. • Hints Bu özellikle mous kontrolün üzerine geldiğinde o düğmenin ne işe yaradığını gösteren açıklama balonlarının içerikleri belirlenebilir. Üzerindeki buttonlar ve anlamları aşağıda verilmiştir.Kodda kullanılan “ImageRESMI” komutu kontrolün ismidir.Burada hatırlatalım. • DataSource Bu özelliği sayesinde yönetilecek olan kaynak belirlenir (tablo. Tablo kayıtları üzerinde değişiklik yapılabilmesi için muhakkak “Edit” moduna alınması gerekir. balon içeriklerinin gösterilebilmesi için “ShowHint” özelliğinin “true” olması gerekmektedir. Kontrole “DataControls” yaprağından erişebilirsiniz.Post” komutuyla yeni resim veri Tabanına yazdırılmaktadır. 15 . query veya Stored Procedur). kayıt silme. Kullanımı son derece basit olan bu özellikler ile “Navigator” kontrolünü en etkili şekilde kullanabilirsiniz. Yeni kayıt ekleme. Aşağıda sizin yabancı olduğunuz en genel özellikleri verilmiştir. En son olarak “Table1. “Table1. İlk Kayıt Önceki Kayıt Sonraki Kayıt Son Kayıt Kayıt Ekle Kayıt Sil Değiştir Kaydet İptal Güncelle İlk Kayda Gider Bir Önceki Kayda Gider Bir Sonraki Kayda Gider En Son Kayda Gider Yeni Boş Kayıt Ekler Aktif Kaydı Siler Kaydı Değiştirme Moduna Al Kaydı Tabloya Yazar Son Yapılan Değişiklikleri İptal Eder Tabloyla yeniden veri akışı oluşturur. Kodla veya “Object Inspector” penceresinden kolayca ayarlanabilir (Genellikle properties penceresinden ayarlamak yeterli olacaktır).

Bu aşamadan sonra mousu “Navigator” kontrolü üzerinde bekletirseniz açıklama balonlarınız yukarıda belirtilen türkçe karşılıklarıyla kullanıcıyı bilgilendirecektir. Varsayılan olarak ingilizce yazılan bu değerleri sırayı bozmadan Türkçe karşılıklarına çevirebilirsiniz.Aşağıdaki “String List Editor” penceresi açıklama balon içeriklerini göstermektedir. 16 . Pencere içeriklerini aşağıda gösterilen şekilde değiştiriniz. “ShowHint” özelliğini true yapınız ve programınızı çalıştırınız.

• OnClick Yordamı Bu yordam “DBNavigator” kontrolü içerisindeki düğmelerden hangisine tıklarsanız tıklayın işleyen bir yordamdır. Bu yordamda tanımlanan “Button” parametresi tıklanan düğmenin numarasını tutarak programcıya o düğmeye ait ek kod yazma şansı vermektedir. Bu işlem için öncelikle “DBNavigator” kontrolünü seçip “OnClick” yordamını oluşturmasını sağlayın. procedure TForm3. Yani kullanıcı sadece kayıtlar arası gezinti yapabilecek asla kayıtlarınızı değiştiremiyecektir. Aşağıdaki kodu yazıp programı çalıştırın. Button: 17 . begin if Button=nbFirst Then //ilk düğme tıklanırsa ShowMessage('İlk Kayıda Geldiniz') end. DBNavigator Kontrolü İçin Tıklanan Düğmeye Kod Yazmak: Her ne kadar “DBNavigator” düğmeleri kendi kodlarını işletsede sizde bu kodlara ekleme yapabilirsiniz. Bu aşamada “ilk Kayıt” düğmesine tıklayın.DBNavigatorClick(Sender: TNavigateBtn). Bu şekilde salt okunur kayıtlar üretebilirsiniz.• VisibleButtons Bu özellikle gösterilecek olan düğmeleri belirleyebilirsiniz. Kontrolü seçip “Object Inspector” penceresinden gösterilmesini istemediğiniz buttonun özelliğini “false” yapmalısınız. TObject. Özelliğini false yaptığınız button artık kullanıcı tarafından gözükmeyecektir.

kontrol henüz kendi kodlarını işletmeden hemen önce sizin. 18 . Burada tıklanılan düğme.İlk Kayıt Düğmesine tıkladıktan sonra aşağıdaki gibi kullanıcıyı bilgilendirmek amaçlı eklemiş olduğunuz kod işletilecektir. Button nbFirst nbPrior nbNext nbLast nbInsert nbDelete nbEdit nbPost nbCancel nbRefresh Sonuç İlk Kayıt Buttonu Tıklandı Önceki Kayıt Buttonu Tıklandı Sonraki Kayıt Buttonu Tıklandı Son Kayıt Buttonu Tıklandı Kayıt Ekle Tıklandı Kayıt Sil Tıklandı Kayıt Değiştir Tıklandı Kaydet Tıklandı Değişiklikleri İptal Et Tıklandı Güncelle Tıklandı • BeforeAction Yordamı Herhangi bir düğmeye tıklanıldığı anda. “nbFirst” değerini alması ilk düğmenin tıklanıldığı anlamını taşımaktadır. Aşağıda diğer düğmelerin anlamları tablo halinde verilmiştir. prosedür içerisinde tanımlanan “Button” isimli parametrede tutulmaktadır. Bu yordama yazacağınız kodlar. Aynı şekilde burada da “Button” parametresi hangi düğmenin tıklanıldığını belirlemek için kullanılmaktadır. kodlarınızın işletilmesini sağlayan bir yordamdır. kontrolün kendi kodlarını işletmesini engellemez.

Sonuç iki durumda da aynı olacaktır. 19 . Kayıtları DataGrid Nesnesinde Göstermek: Tablonuzda yer alan kayıtları topluca kullanıcıya göstermek için kullanılan en popüler kontrol “DataGrid” nesnesidir. end. Mesela “DBNavigator” kontrolünde yer alan “Kayıt Ekle” düğmesine tıklarsanız ister “DataGrid” nesnesinden. Bunun sebebi kontrollerin kaynak olarak aynı nesneyi yanı “DataSource1” kontrolünü kullanmalarından kaynaklanmaktadır. Uygulamanıza “DataControls” yaprağında yer alan bu kontrolden bir adet yerleştirip “DataSource” özelliğine verilerinizi göstereceğiniz tabloya ait “DataSource” kontrolünü aktarın.procedure TForm3. begin if Button=nbCancel Then//iptal düğmesine basarsa begin ShowMessage('Yapılan En Son Değişiklikler İptal Edilecek'). “DBNavigator” kontrolü ile kayıtlar arasında gezinti yaparsanız hem “DBEdit” kontrolünün hemde “DataGrid” nesnesinin kayıt pozisyonunun beraberce değiştiğini göreceksiniz. end. Programı çalıştırdıktan sonraki pencere görüntüsü yukarıdaki gibi oluşacaktır. Şayet ismini değiştirmediyseniz bizim projemizde “DataSource1” olarak gözükecektir. isterseniz “DBEdit” kontrollerinden kayıtlarınızı kolayca girebilirsiniz. Button: TNavigateBtn).DBNavigatorBeforeAction(Sender: TObject.

FormCreate(Sender: TObject). Düğmelere ait kodlar aşağıda verilmiştir. begin Table1.//Tabloyu aç end.Button1Click(Sender: TObject). procedure TForm4. Aşağıdaki tasarımı oluşturup gerekli bağlantıları yukarıda anlattığımız şekilde yapın. O zaman her şeyi kodla yaptırmak zorunda kalacaksınız. //İlk Kayda Git begin Table1. Tamamını uygulamanıza ait “Unit” penceresine ekleyiniz.Open.Button2Click(Sender: TObject). procedure TForm4.Kayıt İşlemlerini Kodla Yapmak: Bazı durumlarda kayıt işlemleri için “DBNavigator” kontrolünü kullanmak istemeyebilirsiniz (zorunlu kaldığınız durumlar da olabilir). procedure TForm4. //Önceki Kayıt 20 . end.First.

Bof Then //ilk kayıt değilse Table1. procedure TForm4. //Son Kayıt begin Table1. ShowMessage('Kayıt Silindi'). EditMAGAZAADI. //Sonraki Kayıt begin if not Table1. procedure TForm4. end.Insert. end else ShowMessage('Kayıt Silme İşlemi İptal Edildi').Last. if mesaj=mrYes Then begin Table1. procedure TForm4.SetFocus.Button5Click(Sender: TObject). 21 .'Sil'. //Kayıt Değiştir begin Eminmisiniz'. end. begin mesaj:=Application. end. procedure TForm4.Button6Click(Sender: TObject). //Kayıt Sil var mesaj:Integer.//imleç ilk sütuna gitsin end.Delete.Eof Then Table1.Prior else ShowMessage('Zaten İlk Kayıttasınız'). end.Next else ShowMessage('Zaten Son Kayıttasınız').Button3Click(Sender: TObject). procedure TForm4.Button7Click(Sender: TObject). //Kayıt Ekle begin Table1.begin if not Table1.Button4Click(Sender: TObject).MessageBox('Silmek İstediğinizden MB_YesNo).

//Güncelle begin Table1. Bağlantı İşlemlerinin Kodla Yapmak: Bu bölümde “DBEdit” kontrolleri yerine. end. Ardından kayıt işlemlerini “Edit” kontrollerini kullanarak nasıl yapabileceğinizi göstereceğim.Cancel.Edit.Post. end. Aşağıdaki adımları izleyerek gerekli olan tasarımı oluşturunuz.Button9Click(Sender: TObject). procedure TForm4.Button10Click(Sender: TObject).Table1. procedure TForm4. “Table” nesnesinin “DataBase Name” özelliğine “gazi”. //Kaydet begin Table1. end. Dördüncü adımda “BDE” Yaprağında yer alan “Table” nesnesinden bir adet sürükleyip formun üzerine bırakın. İkinci adımda yerleştirdiğiniz “ScrollBox” kontrolünü seçerek “Object Inspector” penceresinden “BorderStyle” özelliğini “bsSingle” yapın. Önceki bağlantı türünden çok daha etkili sonuçlar alabilirsiniz (bazen bu şekilde bağlantıya mecbur kalabilirsiniz).Button8Click(Sender: TObject). Üçüncü adımda yine “ScrollBox” kontrolünü seçip “Align” özelliğini “alClient” yapın (bu üç adımı estetik görünüm açısından gerçekleştirdik. Birinci adımda Formunuzun üzerine “Additional” yaprağında yer alan “ScrollBox” kontrolünden bir adet yerleştirin.Refresh. “Table Name” özelliğine de “SERVIS” değerini aktarın. Bağlantı için zorunlu değildir). end. Standart yaprağında bulunan “Edit” kontrollerini kullanarak kodla veri Tabanı bağlantı işlemlerini göreceğiz. procedure TForm4. 22 . Bu tür bağlantılar size çok büyük esneklik sağlayacaktır. //İptal Et begin Table1.

Dokuzuncu adımda formunuza beş (5) adet “Edit” ve beş (5) adet “Label” kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz. açılan menüden “Add All Fields” seçeneğini seçin. Yedinci adımda “Table1” kontrolünü seçip mousun sağ tuşuna tıklayın. Yukarıdaki tasarımı oluşturduktan sonra program çalıştırıldığı anda aktif kayıttaki bilgilerin “Edit” kontrollerinde gözükebilmesi için aşağıdaki kod bloğunu projenize ekleyiniz.Altıncı adımda formunuzun üzerine “DataAccess” yaprağında yer alan “DataSource” nesnesinden yerleştirerek “DataSet” özelliğine “Table1” değerini aktarın. Aktif kayıttaki tüm sütun değerleri bu değişkenlerde tutulur). Açılan menüden “Fields Editör” seçeneğine tıklayarak aşağıdaki pencerenin açılmasını sağlayın Bu penceredeki beyaz alan üzerinde mousun sağ tuşuna tıklayarak. 23 . Yukarıdaki gibi tüm sütun isimleri pencerede listelenecektir (Bu işlemi sütun isimlerini kullanabilelim diye yaptık.

Edit3.Text:=Table1FATURATUTARI. 24 .Text:=Table1ARIZASEBEBI.procedure TForm5.Text:=Table1SERVISTARIHI.Open. //İlk Kayıt begin Table1. procedure TForm5. end. Edit3.Text. Programı çalıştırdıktan sonraki ekran görüntüsü aşağıdaki gibi olacaktır. Edit2.Text.Text:=Table1FATURATUTARI. Edit4.Text:=Table1MAGAZAADI. Edit5.//ilk kayda git Edit1.Text. Aşağıda bu buttonun “OnClick” yordamına yazacağınız kod verilmiştir.Text. “Edit” kontrollerinin içeriklerinin dolu olduğuna dikkat ediniz.First.Button1Click(Sender: TObject).Text:=Table1GIDENFIRMA.Text.Text:=Table1SERVISTARIHI.Text:=Table1ARIZASEBEBI.Text.Text.Text:=Table1GIDENFIRMA.Text. Şimdi formunuzun üzerine bir adet “Button” kontrolü yerleştirip “Caption” özelliğine “İlk Kayıt” yazın. //Satır Bilgilerini Kontrollere aktar begin Table1. Edit5.Text.//Tabloyu aç Edit1. end.Text:=Table1MAGAZAADI. Edit2.FormCreate(Sender: TObject).Text. Edit4.

Edit4.Next.Text.Şimdide İkinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Önceki Kayıt” yazın.Text:=Table1SERVISTARIHI. Edit2. Edit5.//Önceki kayda git Edit1. Edit2. //Son kayda git Edit1.//Sonraki kayda git Edit1. procedure TForm5.Text. Edit4. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. procedure TForm5. //Önceki Kayıt begin Table1. Edit5.Button4Click(Sender: TObject).Text:=Table1ARIZASEBEBI.Prior.Text.Text.Text:=Table1FATURATUTARI.Text:=Table1ARIZASEBEBI. end.Button2Click(Sender: TObject). Şimdi dördüncü bir “Button” kontrolü yerleştirip “Caption” özelliğine “SonKayıt” değerini girin.Text:=Table1ARIZASEBEBI.Text.Text. Edit3.Last. Edit5. Edit3.Text:=Table1FATURATUTARI. Şimdi üçüncü bir “Button” kontrolü yerleştirip “Caption” özelliğine “Sonraki Kayıt” değerini girin. //Sonraki Kayıt begin Table1. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir.Text:=Table1GIDENFIRMA.Text.Text:=Table1SERVISTARIHI. Edit3.Text:=Table1FATURATUTARI.Text:=Table1MAGAZAADI.Text:=Table1GIDENFIRMA.Text:=Table1SERVISTARIHI.Text.Text.Text:=Table1MAGAZAADI.Text.Text. procedure TForm5. end.Text.Text.Text:=Table1MAGAZAADI. end. Edit2. 25 . //Son Kayıt begin Table1.Text.Text.Text:=Table1GIDENFIRMA.Button3Click(Sender: TObject). Bu buttonun “OnClick” yordamına yazacağınız kod aşağıda verilmiştir. Edit4.

AsString:=Edit3.Button6Click(Sender: TObject). Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. //kayıt aç Table1MAGAZAADI.Text). Edit5. 26 . Table1GIDENFIRMA. Edit1.Button5Click(Sender: TObject). procedure TForm5.'Kayıt Sil'.Post. procedure TForm5. begin mesaj:=Application. Şimdi altıncı bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kaydet” değerini girin.MB_ICONSTOP+MB_YESNO).Text.Şimdi beşinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kayıt Ekle” değerini girin.Text:=''.AsString:=Edit4.AsCurrency:=StrToCurr(Edit5. //Kayıt Sil var mesaj:Integer.Text:=''. Table1ARIZASEBEBI.Text:=''. end. procedure TForm5. Edit3. Table1SERVISTARIHI. Table1.Text.Text:=''.Button7Click(Sender: TObject). Edit4. //Kaydet begin Table1.AsString:=Edit1. Şimdi yedinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kayıt Sil” değerini girin.MessageBox('Silmek İstediğinizden Eminmisiniz'.SetFocus. //Kayıt Ekle begin Edit1.Text:=''. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir.AsDateTime:=StrToDateTime(Edit2. //kaydet end.Text.Text).Insert. Edit2. Table1FATURATUTARI.

Text.Text.Text.Text.Delete. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir. end.if mesaj=mrYes Then begin Table1. Edit4.Text. Şimdi dokuzuncu bir “Button” kontrolü yerleştirip “Caption” özelliğine “Güncelle” değerini girin.Text:=Table1MAGAZAADI. Edit3.Text. Edit3.Text.Text:=Table1GIDENFIRMA. //Kayıt İptal begin Table1. 27 .Text.Text:=Table1FATURATUTARI. end.Text:=Table1ARIZASEBEBI. Bu kontrolün “OnClick” yordamına ekleyeceğiniz kod aşağıda verilmiştir.Refresh.Text:=Table1MAGAZAADI.Text.Text.Text.Button9Click(Sender: TObject). Edit2. Edit4. end else ShowMessage('Silme İşlemi İptal Edildi').Text:=Table1SERVISTARIHI.Text. end. Şimdi sekizinci bir “Button” kontrolü yerleştirip “Caption” özelliğine “Kayıt İptal” değerini girin.Text:=Table1SERVISTARIHI. Edit2. //değişiklikleri iptal et Edit1. Edit5. Edit5.Text. ShowMessage('Kayıt Silindi').Text:=Table1GIDENFIRMA. Edit5. Edit4.Button8Click(Sender: TObject).Text:=Table1ARIZASEBEBI. Edit3.Text:=Table1MAGAZAADI.Text:=Table1FATURATUTARI. procedure TForm5.//Kaydı sil Edit1.Text:=Table1SERVISTARIHI. procedure TForm5.Text:=Table1ARIZASEBEBI.Text. Edit2.Text. //Güncelle begin Table1.Cancel.//Güncelle Edit1.Text:=Table1GIDENFIRMA.Text:=Table1FATURATUTARI.

Aşağıda tüm kod verilmiştir. type TForm6 = class(TForm) private procedure doldur. end.//Burada tanımlamayı Unutmayınız. procedure TForm6.Button1Click(Sender: TObject).//ilk kayda git doldur.First.//prosedürü işlet end.Open. procedure TForm6.//Tabloyu Aç doldur.Button2Click(Sender: TObject).FormCreate(Sender: TObject). //Önceki Kayıt 28 . Bu örnekte tablo sütunlarındaki içerikleri kontrollere aktarma işlemini tek bir prosedüde tanımlayıp kullanırsanız sonuç çok daha teknik olacaktır. procedure TForm6. { Private declarations } public { Public declarations } end. //İlk Kayıt begin Table1. begin Table1.Programın tasarımına ait son görüntü aşağıdaki gibi olacaktır.

Button7Click(Sender: TObject).Insert. Edit5. begin 29 .Text.Next.Post. procedure TForm6.Button4Click(Sender: TObject).SetFocus. procedure TForm6.Button3Click(Sender: TObject). //kayıt aç Table1MAGAZAADI. end.AsDateTime:=StrToDateTime(Edit2. //Son Kayıt begin Table1.Button5Click(Sender: TObject). Table1SERVISTARIHI. Edit4. end.AsCurrency:=StrToCurr(Edit5.AsString:=Edit3. Table1ARIZASEBEBI. end.Text:=''.AsString:=Edit1.Button6Click(Sender: TObject).Text). Table1GIDENFIRMA.Text:=''. //Kayıt Ekle begin Edit1. //Kaydet begin Table1. Edit1. //Son kayda git doldur. //Sonraki Kayıt begin Table1. Table1FATURATUTARI.Text:=''.Text:=''.Text).Prior. Edit3.AsString:=Edit4. //Kayıt Sil var mesaj:Integer. Table1. procedure TForm6. end. procedure TForm6.Text. Edit2.Last. //kaydet end. procedure TForm6.Text:=''.Text.//Önceki kayda git doldur.//Sonraki kayda git doldur.begin Table1.

Delete. procedure TForm6.Button8Click(Sender: TObject). Edit5.Text:=Table1SERVISTARIHI.Button9Click(Sender: TObject).Text.Text:=Table1GIDENFIRMA.Text” şeklinde kullanılması gerekir. //değişiklikleri iptal et Doldur. //Kayıt İptal begin Table1.Text.Text.'Kayıt Sil'. procedure TForm6.//Aktif kaydı sil doldur.//Güncelle doldur. procedure TForm6.mesaj:=Application. if mesaj=mrYes Then begin Table1.Text.MB_ICONSTOP+MB_YESNO). Şayet mecbur kalmazsanız (mecbur kalabileceğiniz bir durum bilmiyorum) bu tür sütunları 30 . //Sütun içeriklerini Edit kontrollerine aktaran prosedür begin Edit1.Text:=Table1ARIZASEBEBI.Text.Text:=Table1FATURATUTARI. //Güncelle begin Table1. end.Edit1. end else ShowMessage('Silme İşlemi İptal Edildi').//prosedürü işlet ShowMessage('Kayıt Silindi'). Edit3. “Form1.MessageBox('Silmek İstediğinizden Eminmisiniz'.//prosedürü işlet end. Edit2. end. Basit bir prosedür gibi tanımlarsanız “Edit” kontrolü için.doldur.Cancel.Text:=Table1MAGAZAADI. Veri Tabanında Olmayan Sütunlar Yaratmak: Diğer sütunlardan yola çıkarak hesaplanabilen sütunları Veri Tabanına koymamak dosyanızın daha az yer tutmasını sağlayacaktır.Refresh. Bu örnekte “doldur” isimli prosedürü “Private” veya “Public” kısmında tanımlayın. Edit4.//prosedürü işlet end.

“BorderStyle” özelliğine de “bsSingle” değerlerini aktarın (estetik görünüm için). Dördüncü adımda formunuza bir adet “Additional” yaprağında yer alan “ScrollBox” kontrolü ekleyerek. Bu adımdan sonra tablonuzda yer almayan “KDV” ile “TOPLAM TUTAR” sütunlarını oluşturmayı göstereceğim. “Align” özelliğine “alClient”. Formunuzun üzerine bir adet “Table” nesnesi yerleştirerek “DatabaseName” özelliğine tanımlamış olduğunuz “Alias” ınızın ismini girin (bizim örneğimizde gazi). Aktif beyaz pencerede mousun sağ tuşuna tıklayarak açılan menüden “Add All Fields” seçeneğini tıklayınız. Yedinci adımda “Table” nesnesi üzerine mousun sağ tuşuyla tıklayın. Altıncı adımda Table kontrolünüzün “Object Inspector” penceresinden “Active” özelliğini “true” yapın. İkinci adımda “Table” kontrolünün “TableName” özelliğine “SERVIS” tablonuzun ismini aktarın. Aşağıdaki adımları dikkatlice takip ediniz. 31 . Daha önce oluşturduğumuz tabloda ki “TUTAR” sütununu kullanarak tabloda mevcut olmayan “KDV” ve “TOPLAMFIYAT” sütunlarını oluşturacağız. Açılan menüden “Fields Editör” seçeneğini seçiniz. “DataAccess” yaprağında yer alan “DataSource” kontrolünden bir adet formunuza sürükleyin. “DataSet” özelliğine “Table1” kontrolünü aktarın.aşağıda göstereceğim şekilde oluşturunuz. Şu aşamada programınızı çalıştırırsanız yukarıdaki şekilde tablonuzda yer alan tüm sütunları “DataGrid” nesnesinde listeletmiş olacaksınız. Beşinci adımda formunuza “DataControls” yaprağında yer alan “DataGrid” kontrolü ekleyerek “DataSource” özelliğine “DataSource1” nesnesini aktarınız.

“Name” kısmına sütun başlığınızı (“KDV”). Bu kısmı değiştirmenize gerek yoktur. “Component” kısmını ise kendisi otomatik olarak dolduracaktır. Aşağıdaki pencere açılacaktır. Girilen değerleri aynen sizde oluşturunuz. Beyaz ekranda tekrar mousun sağ tuşuna tıklayarak açılan menüden“New Fields” seçeneğini seçiniz. “OK” Buttonuna tıklayarak sütunun tabloya eklenmesini sağlayın. “Type” kısmına sütunun içereceği verinin tipini (Currency). 32 .Tüm sütunları ekledikten sonra tekrar mousun sağ tuşuna tıklayın. “Field Type” kısmından nasıl bir veri olacağını (diğer sütun kullanılarak hesaplanacağı için Calculated) seçin. Açılan menüden “New Fields” seçeneğini seçin Aşağıdaki pencere açılacaktır.

33 . Programınızın en son görüntüsü aşağıda verilmiştir.Table1CalcFields(DataSet: TDataSet). Yeni kayıt eklemeniz bu sutünların hesaplanmasını engellemez.AsCurrency:=Table1FATURATUTARI.AsCurrency:=Table1FATURATUTARI.AsCurrency*0. Ekleyeceğiniz her yeni kayıt için sonuç yine otomatik olarak hesaplanacaktır.15. begin Table1KDV. Table1TOPLAMTUTAR. end.Gerekli değerleri girdikten sonra “OK” Buttonuna tıklayarak pencereyi kapatınız. Son adım olarak aşağıdaki kodu “Table” kontrolünüzün “OnCalcFields” yordamına yazmak yeterli olacaktır. Aksi takdirde hesaplatma işleminiz başarısızlıkla sonuçlanacaktır. Aynı şekilde var olan bir kayıt üzerinde değişiklik yaparsanız sonuç bu yeni sütunlara da anında yansıyacaktır.15. Yaratılan Sütun Değerlerini Tablonuzda Hesaplatmak: Eklemiş olduğunuz iki yeni sütunun “Object Inspector” penceresinde bulunan “FieldKind” özelliklerinin “fkCalculated” olduğunu tekrar kontrol ediniz. procedure TForm7. bu sütunların içeriklerini tablonuzda yer alan “FATURATUTARI” sütununa göre hesapladıklarını göreceksiniz. “KDV” ile ”TOPLAMTUTAR” sütunlarının Veri Tabanınızda var olmadığına dikkatinizi çekelim. Bu aşamadan sonra uygulamanızı çalıştırırsanız “DataGrid” nesnenizde iki adet yeni sütunun oluştuğunu.AsCurrency*1.

Şu anda “DataGrid “kontrolü tablo içerisindeki tüm kayıtları göstermektedir. 34 . Öncelikle daha önceden oluşturmuş olduğumuz “SERVIS” tablosuna gerekli bağlantıları yapıp tüm kayıtların aşağıdaki pencerede olduğu gibi “DataGrid” nesnesinde gösterilmesini sağlayın (Bağlantı işlemleri her defasında artık anlatılmayacaktır).DataGrid Kontrolüne Ait Özellikler: Kaynağınızdaki kayıtları topluca kullanıcıya göstermek için kullanılan en popüler kontrol sanıyorum “DataGrid” nesnesidir. Şimdi sizlere bu ayarlardan bahsetmek istiyorum. Bu yüzden kayıtların daha estetik ve güzel görünmesi için yapmanız gereken bir takım ayarlar bulunmaktadır.

Açılan menüden “Columns Editor” seçeneğine tıklayın Karşınıza aşağıdaki pencere açılacaktır. sütun başlıklarınız Veri Tabanın da nasıl belirlendiyse o şekilde gözükmektedir. Bütün sütunlar yukarıdaki pencerede olduğu gibi ekranınıza eklenecektir. Bu adımda sol taraftaki pencereden sütunu seçip “Object Inspector” penceresindeki “Title” özelliğinin solundaki “+” işaretine tıklayın. 35 . açılan menüden “Add All Fields” seçeneğini seçin. Fakat bir çok durumda buradaki sütun başlıklarının daha değişik metinle (kısaltma yapmış olabilirsiniz vs) gösterilmesi istenir.DataGrid Kontrolüne Ait Sütun Başlıklarını Belirlemek: Yukarıdaki pencereye dikkat edecek olursanız. Beyaz alanda mousun sağ tuşuna tıklayın. Bizde şimdi yapacağımız değişiklikle yeni sütun başlıkları belirleyelim (sütun başlıklarını DataGrid nesnesinden değiştirmek veri tabanınıza yansımaz). Açılan bu pencerede ilk etapta hiç bir sütun gözükmeyecektir. “DataGrid” kontrolünü seçip mousun sağ tuşuna tıklayın.

Alt satırları açılan “Title” seçeneğinden “Caption” değerlerini tüm sütun başlıkları için ayrı ayrı belirleyin. Alabileceği diğer seçenekler aşağıda verilmiştir. Bu pencerede ortalatacağınız sütunu seçip “Object Inspector” penceresinde “Title” özelliğinin altında yer alan (diğer Alignment değil)“Alignment” özelliğini “taCenter” olarak değiştirin. Aşağıdaki ekran görüntüsü sütun başlıklarının değiştirilmiş halini göstermektedir. Alignment taCenter taLeftJustify taRightJustify Sonuç Sütun İçerisinde Ortalanmış Sütun İçerisinde Sola Dayalı Sütun İçerisinde Sağa Dayalı 36 . Sütun başlıklarınız artık ortalanmış şekilde gözükecektir. DataGrid Sütun Başlıklarının Ortalanması: Yukarıdaki adımları aynen izleyerek “Columns Editor” penceresinin açılmasını sağlayın.

Bu tip durumlarda o sütuna salt okunur özelliği vermelisiniz. Yukarıdaki adımları izleyerek “Columns Editor” penceresinin açılmasını sağlayınız. içeriğin açılan bir “ComBoBox” kontrolünden seçilebilmesini sağlayabilirsiniz. Aşağıda bu işlemi nasıl yapabileceğiniz açıklanmaktadır. Programı çalıştırdıktan sonra aşağıdaki gibi “DataGrid” kontrolünde yer alam “MAGAZAADI” sütununa mous ile çift tıklayın. DataGrid Sütunlarını ReadOnly Yapmak: Bilhassa kayıt ekleme veya kayıt değişikliklerinin “DataGrid” kontrolünden yapılmasına izin verdiğiniz durumlarda. 37 . DataGrid Sutununu ComboBox Şeklinde Kullanmak: “DataGrid” kontrolü içerisinde kayıt değişikliği veya kayıt ekleme işlemi sırasında. Salt okunur özelliği vereceğiniz sütunu seçip “Object Inspector” penceresinden “ReadOnly” özelliğini true yapın. Aşağıdaki pencere açılacaktır. Şimdi programınızı çalıştırırsanız. Burada kayıt değişikliği (veya kayıt ekleme) anında seçebileceği seçenekleri teker teker girin. Aşağıda bu işlemi nasıl yapabileceğiniz açıklanmaktadır. Aksi takdirde çirkin bir görünümü olacaktır. Bu pencerede genişliğini değiştireceğiniz sütunu seçip “Object Inspector” penceresinden “Width” özelliğine uygun olan genişlik miktarını girerek sütun genişliklerini ayarlayabilirsiniz. Girmiş olduğunuz mağazaların isimlerinin yer aldığı seçenekler ComboBox kontrolünde olduğu gibi açılan bir liste halinde karşınıza gelecektir. diğer sütunlarda kolayca değişiklik yapabilmenize rağmen “ReadOnly” özelliğini “true” yaptığınız sütunda değişiklik yapamayacaksınız. “DataGrid” nesneniz için sütun genişliklerini aşağıdaki şekilde ayarlayabilirsiniz. Biz örneğimiz için “MAGAZAADI” sütununa “MIGROS-DIA-GIMA-BIM-ŞOK” değerlerini girdik. Yukarıdaki adımları aynen izleyip “Columns Editor” penceresini açın. Önceki uygulamada izlediğiniz adımları aynen izleyerek “Columns Editor” penceresinin açılmasını sağlayınız. Sütunlardan “ComboBox” gibi davranmasını istediğinizi seçip “Object Inspector” penceresinden “PickList” özelliğine tıklayın. Buradan mağazanızı seçip değişikliği gerçekleştirebilirsiniz.DataGrid Sütun Genişliklerini Ayarlamak: Düzgün bir görüntü için “DataGrid” nesnenizin sütun genişliklerini en uygun boyuta getirmelisiniz. kullanıcının bazı sütun değerlerini değiştirebilmesini istemeyebilirsiniz.

Daha önce gösterilen şekilde “Columns Editor” penceresini açın. Açılan alt seçeneklerden tüm font ayarlarını yapabilirsiniz. Aşağıda bu işlemi nasıl yapabileceğiniz açıklanmıştır. Aşağıda belirtilen adımları izleyin. Bu pencerede renklendireceğiniz sütunu seçip “Title” özelliğinin solundaki “+” işaretine tıklayın. Yukarıdaki adımları izleyerek “Columns Editor” penceresinin açılmasını sağlayın. Bu pencerede renklendireceğiniz sütunu seçip “Object Inspector” penceresinden “Color” (Title yok artık) özelliğine istediğiniz rengi atayabilirsiniz.Aşağıdaki pencere “PickList” değerlerine mağaza adları girildikten sonra uygulamanın çalıştırılmasından elde edilmiştir. 38 . DataGrid Sütunlarını Renklendirmek: Kontrolde gösterilen tüm sütunları farklı renklerde gösterebilirsiniz. Açılan alt seçeneklerde yer alan “Color” özelliğinden dilediğiniz rengi seçebilirsiniz. DataGrid Kontrolüne Ait Sütun Başlıklarını Renklendirmek: “DataGrid” kontrolünüze ait sütun başlıklarını istediğiniz şekilde renklendirebilirsiniz. DataGrid Font Ayarları: “Columns Editor” penceresini açtıktan sonra font ayarlarını değiştireceğiniz sütunu seçip “Object Inspector” penceresinden “Font” özelliğinin solunda yer alan “+” işaretine tıklayın.

Uygulamanızı çalıştırırsanız “DataGrid” kontrolünüz aşağıdaki şekilde gözükecektir. “DataGrid” kontrolünde sütunların silinmesi tablonuzda hiçbir değişiklik yapmayacaktır. Mousun sağ tuşuna tıklayarak açacağınız menüden “Add All Fields” seçeneğini seçin. Sol taraftaki pencerede tüm sütunlar gösterimde olup. Pencereye dikkatli baktığınız zaman “ARIZASEBEBI” ile “SIRANO” sütunlarının gözükmediğini göreceksiniz.DataGrid Kontrolünde İşe Yaramayan Sütunları Gizlemek: Bazı durumlarda tablonuzda yer alan tüm sütunları “DataGrid” nesnenizde göstermek istemeyebilirsiniz. Böyle durumlarda aşağıdaki adımları izlemelisiniz. Sağ taraftakinde ise “ARIZASEBEBI” ile “SIRANO” sütunları “Delete” tuşuna basılarak pencereden silinmiştir. Önceki uygulamalarda gösterildiği gibi “Columns Editor” penceresini açın. 39 .

40 . kullanıcı sütunlardaki hiç bir kayıt bilgisini değiştiremez. Açılan seçeneklerden “dgTitles” özelliğini false yaparsanız sütun başlıklarınız gözükmeyecektir. “DataGrid” kontrolünü seçip “Object Inspector” penceresinde yer alan “Options” özelliğinin solundaki “+” işaretine tıklayın.DataGrid Kontrolünde Sütun Başlıklarını Gizlemek: Şayet sütun başlıklarının gösterilmesini istemiyorsanız. “dgRowSelect” özelliğini true yaparsanız tüm kaydı aşağıdaki şekilde seçebilirsiniz. “dgRowLines” özelliğini false yaparsanız yatay çizgiler gözükmez. “dgColLines” özelliğini false yaparsanız düşey çizgiler gözükmez. Buradaki “Options” özelliğinden diğer bir çok ayarı yapabilirsiniz. Mesela “dgEditing” özelliğini false yaparsanız. “Options” ta yer alan tüm özellikleri deneyin oldukça kullanışlı ve sevimli özellikler olduklarını göreceksiniz.

end.Col. DataGrid Nesnesindeki Toplam Satır Sayısını Hesaplamak Aşağıdaki şekilde kullanacağınız bir kod bloğu sayesinde “DataGrid” nesnesi içerisinde yer alan satur sayısını kolayca hesaplayabilirsiniz.//yavru grid nesnesi türetildi procedure TForm1. //Herhangi bir hücreye tıklanılması durumunda otomatik olarak işler begin Label1.Aktif Kayıttaki Satır ve Sütun Değerlerine Ulaşmak: Aşağıdaki kod bloğunu kullanarak bulunduğunuz kaydın kaçıncı kayıt olduğunu veya hangi sütuna tıkladığınızı kolayca öğrenebilirsiniz. Satır: %2d'.yenigrid (DbGrid1).DBGrid1CellClick(Column: TColumn). Programa ait kod bloğu aşağıda verilmektedir.Row]). [yenigrid (DbGrid1). type yenigrid=class(tdbgrid).Caption:=Format ('Sütun: %2d. 41 .

Caption:=Format('Toplam Kayıt:%2d'.RowCount]).Next.//kaç satır var end. procedure TForm1.Button1Click(Sender: TObject).Open.[yenigrid(DBGrid1). begin Table1.//sonuca ekle Table1.First. type yenigrid=class(TDBGrid). adet:=StrToInt(Format('%2d'.//satır sayısı Table1.DBGrid1ColEnter(Sender: TObject). toplam:=0.RowCount-1])). //Diğer bir sütuna tıklanılması durumunda işler begin Form1.satir.Fields[5].type yenigrid=class(tdbgrid).//sonraki kayda geç 42 . [yenigrid(DBGrid1).//Yeni class tanımlandı procedure TForm2.AsCurrency. var adet. toplam:Double.i:Integer. DataGrid Nesnesi İçerisinde Sutuna Ait İşlem Yaptırmak: Aşağıdaki uygulamada DataGrid içerisinde “FATURATUTARI” sütununa ait genel toplam miktarı hesaplanmaktadır.//ilk kayıda git for i:=1 to adet do begin toplam:=toplam+DBGrid1.

Programı çalıştırıp değişik hücrelere tıklayın seçili satır sayısı başlıkta yazacaktır.end.Caption:='Toplam Fatura Tutarı='+FloatToStrF(toplam. end.Caption:=Format('Seçili Satır Adedi:%2d'.[yenigrid(DBGrid1). //Seçili satır sayısını bul begin DBGrid1.//seçili satır sayısı end.Options:=DBGrid1.Count]).SelectedRows. 43 . type yenigrid=class(TDBGrid).14.ffCurrency. DataGrid Nesnesine Ait Yordamlar: Şimdi de sizlere DataGrid nesnesine ait tetikleyicilerden bahsetmek istiyorum.DBGrid1CellClick(Column: TColumn). • OnCellClick DataGrid içerisinde herhangi bir hücreye tıklanılması durumunda otomatik olarak işleyen yordamdır. Form2.Options+[dgMultiSelect].//birden fazla satır seç Form2.0).//Yeni class tanımlandı procedure TForm2.

• OnTitleClick DataGrid nesnesine ait sütun başlıklarına tıklanılması durumunda otomatik olarak işleyen bir yordamdır. İkinci kez işletilebilmesi için başka bir sütuna geçiş yapılması gerekecektir. İkinci kez işletilebilmesi için DataGrid içerisinde farklı bir sütuna ait hücreye tıklanılması gerekecektir. 44 . Aşağıdaki uygulamada ilk üç sutuna ait başlıklara tıklanıldığı zaman.DBGrid1ColEnter(Sender: TObject). begin ShowMessage('Sütun Değişti'). begin ShowMessage('Yeni Bir Sütuna Geçiş Yaptınız'). end.• OnColEnter DataGrid nesnesi içerisindeki herhangi bir sütunun aktifleştirilmesi sonucu otomatik olarak işleyen bir yordamdır. procedure TForm2. end. Bu yordamda tanımlanmış olan “Column” parametresi tıklanılan kolon başlığına ait tüm özellikleri tutabilmektedir. • OnColExit DataGrid nesnesi içerisinde aktif sütundan diğer sütuna geçiş anında otomatik olarak işleyen bir yordamdır. o sütuna göre tabloda sıralatma işlemi gerçekleştirilmektedir. procedure TForm2.DBGrid1ColExit(Sender: TObject). Sıralatma yapılacak olan sütunlara ait index tanımlamalarının muhakkak yapılması gerektiğinide hatırlatalım.

end.Index=0 Then//ilk sütu başlığına tıklanırsa begin table1.index=2 Then//üçüncü sütün başlığına tıklanırsa begin Table1. procedure TForm2. 45 . //primary indexe göre sırala Form2. end else if column.Caption:='SIRANO ya Göre Sıralandı'. end.Caption:='SERVISTARIHI ne Göre Sıralandı'. begin if column. Uygulamaya ait kod bloğu aşağıda verilmiştir.index=1 Then//ikinci sütun başlığına tıklanırsa begin Table1. end else if column.IndexName:='MAGAZAINDEX'.Caption:='MAGAZAADI na Göre Sıralandı'. //mağaza adına göre sırala Form2.IndexName:='TARIHINDEX'.DBGrid1TitleClick(Column: TColumn).DefaultIndex:=true .Şayet “SERVISTARIHI” sütun başlığına tıklarsanız tablo görüntünüz aşağıdaki şekilde gerçekleşecektir. //servis tarihine göre sırala Form2.

procedure TForm7. FilterOptions foCaseInsensitive foNoPartialCompare Sonuç Küçük-Büyük Harf Duyarlılığı Yok Alan Parçasına Göre Filtreleme Yapılabilir.Edit1KeyPress(Sender: TObject. “True” değerinin aktarılması filtre kriterinin tabloya uygulanması anlamını taşımaktadır.//kriteri uygula end.Filtered:=true. Fakat bilhassa server-client uygulamalarında serverin devamlı sorguyla zorlanması performansınızı etkileyecektir. • Table1.Kayıt Filtreleme İşlemleri: Tablonuzda bulunan tüm kayıtlar ile değil. Onun yerine (her zaman değil) kendi lokal makinenize aldığınız table nesnesini kullanarak kayıtlarınızı istediğiniz şekilde kolayca filtreleyebilirsiniz. içilerinden belirli özelliği olan kayıtlarla ilgileniyorsanız kullanacağınız yöntem kayıtları filtrelemek olacaktır.Filtered Belirlenen kriterin tabloya uygulanıp uygulanmayacağını belirleyen özelliğidir.//harf duyarlılığı yok end. Alabileceği değerler aşağıda verilmiştir.Edit1KeyPress(Sender: TObject. 46 .FilterOptions:=[foCaseInsensitive].FilterOptions Filtreleme işleminde. var Key: Char). begin Table1. procedure TForm7. Aşağıda Tablo kontrolünde yer alan kayıtları nasıl filtreleyebileceğiniz konusu işlenmektedir.//harf duyarlılığı yok Table1. begin Table1. • Table1.FilterOptions:=[foCaseInsensitive]. küçük büyük harf duyarlılığının olup olmayacağını ve alan parçasına göre filtreleme yapılıp yapılamayacağını belirleyen özelliğidir. var Key: Char). Bu size daha performnslı bir çalışma ortamı yaratabilir. Bu özelliğe “false” değerinin aktarılması tablodaki tüm kayıtların tekrar listelenmesini sağlayacaktır (Filtre iptal). “Query” kontrolü kullanarak daha gelişmiş tablo sorguları oluşturabilirsiniz.

Kodlamada aşağıdaki şekilde bir blok kullanmalısınız. procedure TForm7.Edit1KeyPress(Sender: TObject.bir adet “Label” ve bir adet “Edit” kontrolü yerleştirerek tüm kayıtların “DataGrid” nesnesinde gösterilmesini sağlayın. Kriteri belirlemeniz tablonuzun filtreleneceği anlamını taşımaz.Text). var Key: Char). var Key: Char). İşlemin uygulanışı mağaza adının “Edit” kontrolüne girildikten sonra “Enter” tuşuna basılmasıyla gerçekleşecektir.//kriter end.FilterOptions:=[foCaseInsensitive]. begin Table1. bir adet “DataSource”.• Table1. Muhakkak ardından “Filtered” özelliğine true değerini aktarmalısınız.bir adet “DataGrid”. begin if Key=#13 Then //Enter tuşu tıklanırsa begin Table2.Edit1KeyPress(Sender: TObject. Amacımız sadece “Edit” kutusuna girdiğimiz mağaza ismini listelemek olacaktır.Filter Tabloya uygulanacak olan filtre kriteri bu özellikle belirlenir. Aşağıdaki kod bloğunu “Unit” pencerenize ekleyiniz. procedure TForm7.//harf duyarlılığı yok 47 .İlk olarak formunuza bir adet “Table”. bir adet “GroupBox. Yukarıda anlattığımız özelliklerin daha iyi bir şekilde anlaşılabilmesi için olayı bir örnekle pekiştirelim.Filter:='MAGAZAADI='+QuotedStr(Edit1.

Mağaza adı tamamen yazıldıktan sonra. “DataGrid” kontrolünüzde sadece “MIGROS” mağazalarına yapılmış olan servisler listelenecektir. Burada kodu yine “OnChange” yordamına yazmanız gerektiğini hatırlatıp.Edit1Change(Sender: TObject).Filtered:=true. Aşağıdaki kodlamada “Enter” tuşuna basmanıza gerek yoktur. Projeyi çalıştırdığınız zaman mağaza ismini “Edit” kontrolünün içerisine tamamen yazana kadar hiç bir kayit “DataGrid” nesnesi içerisinde listelenmeyecektir. begin Table2.Filtered:=true. Programı çalıştırıp “MAGAZA ADI” nı Edit kontrolüne girip “Enter” tuşuna basınız.Text).FilterOptions:=[foCaseInsensitive].Text). Her karaktere bastığınız zaman kriter yeniden denenecektir. o mağazaya ait tüm servisler “DataGrid” nesnesi içerisinde listelenmiş olacaktır. end. end. kod satırlarını verelim. Kodu aşağıdaki şekilde değişirseniz gireceğiniz ilk karakterlere göre filtreleme yapabilirsiniz.//kriter Table2.//harf duyarlılığı yok Table2. procedure TForm7. end.Table2.Filter:='MAGAZAADI='+QuotedStr(Edit1. 48 .//kriter Table2.Filter:='MAGAZAADI='+QuotedStr(Edit1.

Filter:='MAGAZAADI='+QuotedStr(Edit1.//harf duyarlılığı yok Table2. Filtrelenmiş Kayıtlar Arasında Gezinmek: Filtrelemiş olduğunuz kayıtlar arasında kolaylıkla dolaşabilirsiniz.//sonraki kayda git end.Filtered:=true.FindNext. İkinci karakter olarak “U” ya basarsanız “GIMA” mağazasıda kayıtlar arasında listelenmeyecektir.Text+'*'). begin Table2.procedure TForm7. 49 .FilterOptions:=[foCaseInsensitive]. end.Edit1Change(Sender: TObject). procedure TForm7. Filtreli Kayıtlarda Bir Sonrakini Git: Aşağıdaki kodlamayla filtreli kayıtlar içerisinde sonraki kayda ulaşabilirsiniz. Prgramı çalıştırıp kriter kısmında “G” Harfine basarsanız “G” ile başlayan tüm Mağaza servislerini listeleyebilirsiniz. begin if Table2.Filtered=true Then//filtre uygulanmışsa table2.Button3Click(Sender: TObject). Yapmanız gereken tek şey tablo nun filtreli olup olmadığını kontrol etmekten ibaret olacaktır.//kriter Table2.

Button4Click(Sender: TObject). Ardından açılan pencereden “File->Open->Table” diyerek daha önce kaydetmiş olduğunuz “SERVIS” tablosunu açın. Filtreli Kayıtlarda İlk Kayda Git: procedure TForm7.FindFirst. begin if Table2.Filtered=true Then table2.Filtered=true Then table2. Yine “Table->Restructure” seçeneklerini izleyerek tablonuzun tasarım anına ulaşın. Filtreli Kayıtlarda Son Kayda Git: procedure TForm7. Şimdi sizlere Tablonuzda (SERVIS) nasıl secondary index tanımlayabileceğinizi göstereceğim.FindPrior.Button5Click(Sender: TObject).//son kayda git end.//bir önceki kayda git end. begin if Table2.Button6Click(Sender: TObject). Tarih Aralığına Göre Filtre Uygulamak: Yukarıdaki örnekte gireceğiniz iki tarih arasını da filtreleyebilirsiniz. Şimdi bu pencereyi kullanarak hem “SERVISTARIHI” sütununu hemde “FATURATUTARI” sütununu secondary index olarak tanımlayacağız. Secondary Index Tanımlamak: “Start->Programs->Borland Delphi->Database Desktop” adımlarını izleyin.FindLast. 50 . begin if Table2.Filtered=true Then table2. Yanlız bu işlemi gerçekleştirebilmeniz için bu sütunun muhakkak Primary veya Secondary index olarak tanıtılmış ve indexin aktifleştirilmiş olması gerekmektedir.Filtreli Kayıtlarda Bir Öncekine Git: procedure TForm7.//ilk kayda git end.

Aşağıdaki pencere açılacaktır. 51 . Ardından “OK” buttonuna tıklayın.Hatırlatalım Seconder index tanımlayabilmeniz için Paradox ta muhakkak primary index tanımlaması yapmış olmanız gerekmektedir. “Restructure Paradox” penceresinde yer alan “Table Properties” kısmından “Secondary Indexes” seçeneğini seçin ve “Define” düğmesine tıklayın. Bu pencerede “SERVISTARIHI” sütununu seçip “Indexed fields” listesine aktarın.

aralık filtrelemesi yapacağınız sütunun muhakkak index olarak tanımlanmış olması gerekmektedir. Şimdi aşağıdaki tasarımı oluşturup aralık filtreleme işlemini örnek üzerinde görelim.ApplyRange “SetRange” komutuyla girilen kriterlere göre tablonun filtrelenmesini sağlayan komuttur.Text]. Bu komutu kullanabilmeniz için. işlemleri Index in bu sefer ismini de Bu şekilde “SERVIS” tablosu için iki adet secondary index tanımlamış olduk. Bu aşamadan sonra kolayca aralık filtrelemesi yapabilirsiniz. Tekrar “Define” buttonuna tıklayarak aynı “FATURATUTARI” sütunu için gerçekleştirin. • Table2.Text]).Karşınıza aşağıdaki pencere açılacak ve sizden indexinizin ismini girmenizi isteyecektir. 52 . procedure TForm7. Daha sonra projeyi incelerken o indexin hangi sütuna ait olduğunu hatırlayabilesiniz. İndex isimlerinizi rasgele vermeyin. Filtreleme işlemini tabloya uygulamanız için kesinlikle gerekli olan bir komuttur.SetRange([Edit2.SetRange Aralık filtrelemek için kriterlerinizi belirleyen özelliğidir. Filtre işlemini tabloya uygulamaz.Button1Click(Sender: TObject). begin Table2. kayıtların “DataGrid” nesnesi içerisinde gösterilmesini sağlayın.[Edit3. Daha önce anlatılan yöntemlerle gerekli tablolara bağlanıp. “SetRange” komutu sadece filtreleme kriterlerini belirler. “TUTARINDEX” şeklinde adlandırın. end. Yukarıdaki kod satırında “Edit1” ve “Edit2” kontrollerine girilen tarih içeriklerinin arasında kalan kayıtları listelemesi söylenmektedir. • Table2.

end.SetRange([Edit2. 53 .[Edit3.//uygula end.Close. Uyguladığınız filtreyi iptal etmek için aşağıdaki şekilde bir kod bloğu kullanabilirsiniz.Button1Click(Sender: TObject). Table2. Filtre kriterini koyacağınız sütunun indexli ve indexinin de aktif olmasına dikkat etmelisiniz. //Tümünü Göster begin Table2.//kriterler Table2.procedure TForm7. Programı çalıştırıp “Edit1” ve “Edit2” kontrolüne tarihlerinizi girip Button kontrolüne tıklayın.Button2Click(Sender: TObject). Parasal Aralığa Göre Filtre Uygulamak: Tablonuzdaki parasal sutunlar için de kolayca filtre uygulayabilirsiniz. Belirttiğiniz aralıktaki kayıtların listelendiğini göreceksiniz.Open.Text].IndexName:='TARIHINDEX'. begin Table2.ApplyRange.//indexi aktifleştir Table2. procedure TForm7.Text]).

AsCurrency:=StrToCurr(Edit3.Aşağıda izlemeniz gereken adımlar ve özellikleri dikkatlice incelenmektedir.ApplyRange Belirtilen aralığı tabloya filtre olarak uygulamayı sağlayan methoddur. 54 . Bu satırdan sonra belirteceğiniz kriteri aralığın alt sınırı olarak kabul edecektir.Text) • Table2.Text) • Table2.FieldByName('FATURATUTARI'). Table2. Üst sınıra ait filtreyi belirlemek için kulanılan bir özelliktir. Table2. • Table2.AsCurrency:=StrToCurr(Edit2.SetRangeEnd. Table2.SetRangeStart. Table2. Bu satırdan sonra belirteceğiniz kriteri aralığın üst sınırı olarak kabul edecektir. Şimdi aşağıdaki şekilde bir tasarım oluşturup gerekli bağlantıları daha önce anlatıldığı şekilde yapın.FieldByName('FATURATUTARI').SetRangeStart Alt sınıra ait filtreyi belirlemek için kulanılan bir özelliktir. Bu satır olmadan kriterleri belirleseniz bile “DataGrid” kontrolünüz filtreli kayıtları göstermeyecektir.SetRangeEnd.

//imdexi aktif yap Table2. Table2. Yanlız o sütuna ait index in “Object Inspector” penceresinden veya kodla muhakkak aktifleştirilmesi gerekecektir.IndexName:='TUTARINDEX'. begin Table2.//alt sınır Table2.AsCurrency:=StrToCurr(Edit2. Kullanılacak olan index in “Primary” veya “Secondary” olması komutlar için önem arz etmez.SetRangeEnd. Table2.ApplyRange.FieldByName('FATURATUTARI').Text).Button7Click(Sender: TObject). Burada yine index in çok önemli olduğunu hatırlatmak isterim.SetRangeStart.procedure TForm7.FieldByName('FATURATUTARI'). 55 .//üst sınır Table2. end.Text).AsCurrency:=StrToCurr(Edit3.

işinize yarayan kaydı bulup aktif yapma işlemini gerçekleştireceğiz. Tabloyu oluşturduktan sonra daha önceki bölümde anlatıldığı gibi içerisine “MIGROS –DIA-GIMA” mağazalarının bulunduğu kayıtları girin (primary index olduğu için aynı mağaza ismini ikinci kayıtta kullanamazsınız). Fazla kayıt içeren tablolarda kayıt arama işlemlerini muhakkak index tanımlayarak yapmalısınız. Her çeşit yöntemi örneklendirmeye çalışacağım.Text. Amacımız button kontrolüne tıkladığımız zaman edit içerisindeki mağazayı bulup aktif hale geçirmek olacaktır. Bu size çok daha hızlı sonuç alma seçeneği yaratacaktır. begin Table1. Lütfen dikkatlice inceleyiniz. Kayıt arama işlemlerinde birden fazla sütuna göre aramada yaptırabilirsiniz.[]). • Locate Methodu Bu method sayesinde indexli veya indexsiz sütunlarda arama yaptırabilirsiniz.Kayıt Arama İşlemleri: Bu bölümde hangi kayıtta olursanız olun. Daha sonra formunuza bir adet “Edit” kontrolü ile bir adet “Button” kontrolü yerleştiriniz. İndexli sütunlarda yaptıracağınız aramalar çok daha hızlı sonuç verecektir. procedure TForm2. Delphi’de kayıt arama işlemleri için kullanılan birkaç yöntem bulunmaktadır. Şimdi aşağıdaki tasarımı oluşturup Table nesnesine aktardığınız kayıtların tamamının “DataGrid” nesnesinde gösterilmesini sağlayın.Edit1. Şimdi aşağıdaki tabloyu paradoxta oluşturup üzerinde işlemler yapalam.Button1Click(Sender: TObject). 56 . Index in primary veya secondary olması önem arz etmeyecektir.Locate('MAGAZAADI'. Fieeld Name(Sütun İsmi) MAGAZAADI ADRES TELEFON MUDUR SEHIR Type(Tipi) A A A A A 25 25 15 25 25 Size (Kaç Karakter) Key(Primary ind) * “MAGAZAADI” sütununu primary index olarak tanımlamayı unutmayınız. Bu yöntemlerin hepsini detaylı olarak anlatmaya çalışacağım.//Kayıt Bul end.

Button1Click(Sender: TObject). procedure TForm2.//primary index aktif Table1.Button1Click(Sender: TObject). Parametre foCaseInsensitive foNoPartialCompare Sonuç Küçük-Büyük Harf Duyarlılığı Yok Alan Parçasına Göre Arama Yapılabilir. Yukarıda verilen tasarımı oluşturduktan sonra “Kayıt Bul” düğmesine aşağıdaki kod satırlarını ekleyiniz.DefaultIndex:=true. 57 . Bu örnekte küçük büyük harf duyarlılığı bulunmaktadır. Şayet bu hassasiyeti ortadan kaldırmak istiyorsanız kullanılan üçüncü parametreyi aşağıdaki şekilde değiştirmelisiniz. procedure TForm2. begin Table1.Edit1. Yani küçük harfle migros yazarsanız kaydı bulamazsınız.Edit1.//duyarsız end.Text.Locate('MAGAZAADI'. Üçüncü parametrenin alabileceği seçenekler aşağıda verilmiştir. begin Table1.DefaultIndex:=true.Bu methodun önemli bir özelliğide bulunan kaydın aktif kayıt haline getirilmesidir.//primary index aktif Table1.Locate('MAGAZAADI'.[loCaseInsensitive]).[]).Text.//Kaydı bul end.

Formunuza ikinci bir “Edit” kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz. var ara:Boolean. if ara=false Then ShowMessage('Kayıt Bulunamadı'). bulunması durumunda ise true değerini almaktadır.Text.Edit1. 58 . kaydın bulunamaması durumunda false.DefaultIndex:=true.Button1Click(Sender: TObject). begin Table1. Daha sonra bu değeri kullanarak kaydın bulunup bulunamadığını kolayca öğrenebilirsiniz. Birden Fazla Sütuna Göre Arama Yaptırmak: Kayıt arama işlemi için tek sütun yeterli değilse.Aranan kaydın bulunamaması sizin için önem arz ediyorsa o zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz.//primary index aktif ara:=Table1.[loCaseInsensitive]). end. o zaman aşağıdaki yöntemi uygulamanız gerekecektir. Aşağıda yazacağımız kodu çalıştırabilmeniz için “Uses” satırına “Variants” kütüphanesini eklemelisiniz. procedure TForm2. birden fazla kriter kullanacaksanız.Locate('MAGAZAADI'. Burada kullanılan “ara” isimli değişken.

Text]). procedure TForm4.[]).MUDUR'. Sadece indexli sütunlar için çalışmaktadır. Table1. Yukarıdaki örnekte “ADRES” ve “MUDUR” sütununa göre arama yaptırılmaktadır. Sadece indexli sütunlar için kullanılabilmektedir. end. //uses satırına Variants ı eklemeyi unutmayınız. 59 .GotoKey.SetKey Kayıt arama işlemini başlatan komuttur. Şayet kaydı bulamazsa “ara” isimli “Boolean” tip değişken “false” değerini alarak kayıt bulunamadı uyarısını kullanıcıya iletecektir.Button1Click(Sender: TObject). Kullanımına ait örneklendirme aşağıda yapılmıştır. var ara:Boolean. begin ara:=Table1. //harf duyarlılığı var end.//Kayıt arama işlemine başla end.Amaç aynı kayıtta ikisine rastlarsa o kaydı aktif hale getirmek olacaktır.GotoKey Aranan kritere uygun kaydı aktifleştirmek için kullanılan komuttur.varArrayOf([Edit1. • SetKey-GotoKey Methodları Index li sütunlara göre kayıt araması yapılabilen ikinci yöntemdir. “Edit2” kontrolüne girilen değerde “MUDUR” sütunu içerisinde aratılacaktır. begin Table1.SetKey.procedure TForm2. begin Table1. Table1. “Edit1” kontrolüne girilen değer “ADRES” içinde. if not ara Then ShowMessage('Kayıt Bulunamadı').Text. procedure TForm4.Button2Click(Sender: TObject).Locate('ADRES.Button1Click(Sender: TObject).Edit2.

Table1. veya tamamını yazmadan arama yapabilmek için kullanılan methodlardır.GotoNearest Belirtilen alan parçasına göre arama yapabilen methoddur. Aşağıdaki kod satırlarını “Kayıt Bul” buttonunun “OnClick” yordamına ekleyiniz.SetKey. 60 . //Kayıt Bul begin Table1.Şimdi aşağıdaki form tasarımını oluşturup SetKey-GotoKey methodlarının örnek içerisinde kullanımını görelim.//Kayıt arama işlemine başla Table1.GotoKey. Aynı şekilde kritere uyan kayıt bulunduğu zaman aktifleştirilecektir. “SetKet” aramaya başlayabilmek için gerekli komut olup önceki örnekle aynı karakteristiği taşımaktadır. procedure TForm4. Aşağıda bu methodların beraber kullanımına ait örneklendirme yapılmıştır.Text.FieldByName('MAGAZAADI').//kriter Table1. //harf duyarlılığı var if Table1. • SetKey-GotoNearest Methodları Aradığınız kaydın içeriğini tam olarak bilmiyorsanız.AsString:=Edit1.GotoKey=false Then ShowMessage('Kayıt Bulunamadı').Button1Click(Sender: TObject). end.

Table1. aktif kayda ait istenilen sütun değeri değişkene aktarılabilir.AsString:=Edit1.SetKey. //harf duyarlılığı yok end. //Alan parçasına göre ara begin Table1.procedure TForm4.Text. • Lookup Methodu Kaydı aktif yapmadan arama işlemi yapabilen methoddur. 61 .//Kayıt arama işlemine başla Table1.GotoNearest.Button2Click(Sender: TObject). Kayıt bulunduktan sonra. Aşağıdaki örnekte bu husus işlenmektedir.FieldByName('MAGAZAADI').

procedure TForm4. var ara:variant.Button3Click(Sender: TObject). “Lookup” methoduyla Mağaza adı sutununda kritere uygun olan değer aranmakta.'ADRES. 62 . Şimdi verdiğimiz kodu açıklamaya çalışalım. “MUDUR” de ara[1] isimli diğer variant tip değişkene aktarılmaktadır (buradaki ara isimli dizi değişkeni kendisi otomatik olarak oluşturmaktadır). begin ara:=Table1. if VarIsNull(ara) Then //boş sa ShowMessage('Kayıt Bulunamadı') else ShowMessage('Mağaza Adresi='+ara[0]+#13#10+'Mağaza Müdürü='+ara[1]).Edit1. kayıt bulunduktan sonra “ADRES” ara[0] isimli variant tip değişkene.Lookup('MAGAZAADI'.Text.MUDUR'). end.

Bilgisayarlar arası bilgi tutarlılığını sağlamak için tüm kayıt değişikliği işlemlerini “Transaction” kullanarak yapmalısınız. Uygulayacağınız işlem başarılı bir şekilde gerçekleşirse sonuçları Database den tablonuza kolayca aktarabilirsiniz. “Transaction” işlemini güvenlik açısından kullanmak zorunda (tam bir zorunluluk yoktur ama çok faydalı olacaktır) diğer bir durumda network uygulamalarıdır. Yapacağınız tüm değişiklikler bu yeni “Database” içerisinde kaydedilecektir. Database Kontrolü “BDE” Yaprağında yer alan bu kontrol sayesinde kolaylıkla “Transaction” işlemini gerçekleştirebilirsiniz. Şayet herhangi bir aksaklık olmazsa tüm değişiklikleri kabul edip diğer işlemlerinize geçebilirsiniz. Şayet bir aksaklık çıkarsa bu durumda “Transaction” işlemini iptal ederek eski konumunuza dönebilirsiniz. başlatıldığı anda boş bir “Database” oluşturmak ve yapılan tüm işlemleri (tablonuza değil) bu database kaydetmekten ibarettir. Bu yüzden formunuza “BDE” yaprağında yer alan “Database” kontrolünden bir adet yerleştirmeyi unutmayınız. arada bir tanesinde oluşabilecek hata çok kötü sonuçlar doğurabilecektir. “Transaction” işleminden sonra yapılan değişiklikleri bir bütün olarak düşünmelisiniz. kaydetmeye başlamadan (veya silmeye) önceki konuma dönüp tekrar deneme şansınız olacaktır. 63 . Tablonuza döngü içerisinde kayıt girdiğinizi düşünün. Ya hepsini geri alırsınız veya hepsini topluca tablonuza yazdırırsınız. Bu size güvenli bir ortam yaratacaktır.Transaction İşlemi: Toplu kayıt işlemlerinde (kayıt ekleme veya değiştirme) veri güvenliğini sağlamak amaçlı kullanılan çok önemli bir yöntemdir. Bu tür sonuçları engellemek amaçlı transaction kullanırsanız. Uyarı:Şayet “Transaction” işlemi uygulayacaksanız tablonuzda muhakkak index bulunmalı ve aktif hale geçirilmelidir. “Transaction” işleminde “Delphi” nin yaptığı işlem. Aşağıda bu işlemleri başarılı bir şekilde gerçekleştirebilmek için “Database” kontrolüne ait kullanabileceğiniz özellik ve methodlar açıklanmaya çalışılmaktadır. Yukarıda da bahsettiğimiz gibi “Transaction” işlemi sırasında yapılan tüm işlemler yenibir “Database” nesnesi içerisinde tutulacaktır. Aşağıda “Transaction” işleminde kullanacağınız komutlar gösterilmektedir.

Button1Click(Sender: TObject). Bu özelliğe kalasörün yolu girilebileceği gibi “Alias” isminide girebilirsiniz (siz hep alias ismini giriniz).• Database1. Table1. end.DatabaseName “Database” kontrolünün oluşturulacağı yeri belirlemek amaçlı kullanılan özelliğidir.Connected:=true. Bu satırdan sonra tabloda yapılacak olan tüm değişiklikler bu “Database” içerisinde kaydedilecektir. DataBase1.StartTransaction Transaction işlemini başlatan methoddur. “Database içerisinde depolanan bilgiler sıfırlanacaktır. procedure TForm2. Bu komuttan sonra “Transaction” işlemi sona erecektir. • Database1.StartTransaction. begin Database1.DatabaseName:='gazi'.Commit “DataBase” içerisinde tutulan değişiklikleri tabloya yansıtmak amaçlı kullanılan komuttur. //Başlat begin Database1.Open.DatabaseName:='gazi'.FormCreate(Sender: TObject). • DataBase1. “True” değerinin aktarılması bağlantının kurulması anlamını içermektedir. procedure TForm2.Connected “Database” bağlantısını açıp kapatmak için kullanılan özelliğidir.//Transactionı başlat end. end. Table1. • Database1.FormCreate(Sender: TObject). procedure TForm2. “False” değeri aktarılırsa bağlantı kapatılacaktır.Open. Yeniden “Transaction” 64 . begin Database1.

//son durumu tabloda göster end. Özelliğin “True” değerini alması “Transaction” işleminin halen uygulandığı anlamını taşımaktadır. end. Bu yüzden belirtilen komutla “Trandsaction” işleminin var olup olmadığını kontrol edebilir.Button3Click(Sender: TObject). //Tabloya yaz begin Database1.Rollback.Button3Click(Sender: TObject). Yine bu komut “Transaction” işlemini bitirecektir.Button2Click(Sender: TObject).//Değişiklikleri iptal et Table1. procedure TForm2.Refresh. Değişikliklerin iptal edilmesinden sonra tabloda son durumu görmek isterseniz. procedure TForm2. 65 . • Database1.uygulanacaksa bu kullanılmalıdır.Rollback “StartTransaction” methodundan sonra “Database” nesnesi içerisinde yapılan tüm değişiklikleri iptal etmek amaçlı kullanılan komuttur. //İptal Et begin if Database1.InTransaction=true Then begin Database1.Commit. tablonuzu “Refresh” etmelisiniz. Şayet tekrar “Transaction” uygulanacaksa “StartTransaction” komutu yeniden verilmelidir. komuttan sonra tekrar “StartTransaction” methodu procedure TForm2.InTransaction “Transaction” işlemi yokken “RoolBack” veya “Commit” komutlarını uygularsanız uygulamanız sizi kendi hata mesajınızla uyaracaktır.Refresh.//uygula end. ona göre komut işletebilirsiniz. //İptal Et begin Database1. end.Rollback. • Database1.//DEĞİŞİKLİKLERİ İPTAL ET Table1.

TransIsolation “Transaction” uygulanacak olan VeriTabanının ağ ortamındamı yoksa lokaldemi olup olmadığını belirleyen özelliğidir.FormCreate(Sender: TObject). Şimdi aşağıdaki tasarımı oluşturarak verilen kodları “Unit” pencerenize ekleyiniz. Bu kodları gerekli yordamlara ekleyiniz. bir adet “GroupBox”. begin Table1.Connected:=true. üç adette button kontrolü yerleştirin. TransIsolation tiReadCommitted tiDirtyRead tiRepeatableRead procedure TForm2.Open.DefaultIndex:=true. bir adet “DataSource”. bir adet “Database”. 66 .//değiştirmeyi unutmayın Database1.• Database1.//index aktif olmalı Database1. Şimdide uygulamanıza ekleyeceğiniz kod bloklarını verelim. bir adet “DataGrid”. Alabileceği seçenekler aşağıda verilmiştir. Uygulama için formunuza bir adet “Table”. Table1. DataBase1.TransIsolation:=tiDirtyRead.DatabaseName:='gazi'. end.

//Tekrar Başlat Form2. //Tabloya yaz var deger:Integer.Caption:='Transaction Açık'.Button1Click(Sender: TObject). 'Transaction Başlat'. //Başlat begin Database1.TransIsolation:=tiDirtyRead. end else begin deger:=Application.MessageBox('Transaction Kapalı Başlatalımmı'. //İptal Et var deger:Integer.//index aktif olmalı Database1.//Verileri yenile 67 . DataBase1. if deger=mrYes Then Database1. procedure TForm2. begin Table1. end. end. procedure TForm2.//uygula ShowMessage('Tüm Değişiklikler Kaydedildi').//bağlan Table1.InTransaction=true Then begin Database1.StartTransaction.Connected:=true. Form2.//Transactionı başlat Form2.Caption:='Transaction Kapalı'.Caption:='Transaction Açık'.//Tüm değişiklikler iptal Table1.Refresh. procedure TForm2.Rollback. end.InTransaction Then//transaction varsa begin Database1.procedure TForm2.Button3Click(Sender: TObject).Button2Click(Sender: TObject). begin if Database1.StartTransaction.DefaultIndex:=true.//kodla yapın end.MB_YESNO). begin if Database1.FormCreate(Sender: TObject).Commit.DatabaseName:='gazi'. Database1.Open.

Caption:='Transaction Açık'. Form2.StartTransaction. if deger=mrYes Then Database1.Caption:='Transaction Kapalı'.MB_YESNO).//Tekrar Başlat Form2.MessageBox('Transaction Kapalı Başlatalımmı'. Tablonuzdan da silinmesi için “Tabloya Yaz” düğmesini tıklayabilirsiniz. end. 'Transaction Başlat'. end else begin deger:=Application. Sildiğiniz kayıtları geri almak için “İptal Et” düğmesini. Uygulamanızı çalıştırdıktan sonra “Başlat” düğmesine tıklayın (Transaction İşlemi başlatılacaktır). end. Ardından tablonuzdaki kayıtlardan arka arkaya bir kaç tanesini silin (sildiğiniz kayıtlar Database nesnesine kaydedildi). 68 .ShowMessage('Değişiklikler İptal Edildi').

Dilerseniz “Query” kontrolüylede tablolarınıza kolayca bağlanabilirsiniz.Query Kontrolü: Veri kaynağına bağlantı yapabilmek için şu ana kadar hep “Table” kontrolünü kullandık. 69 . “OK” Düğmesine bastıktan sonra “Query” kontrolünüzün “Object Inspector” penceresinden (kodlada yapabilirsiniz) “Active” özelliğini true yapın. kontrolü ile Tablonuza nasıl Birinci adımda formunuza bir adet “ScrollBox” kontrolü yerleştirip “Align” özelliğine “alClient” değerini aktarın (Bağlantı için zorunlu değildir. İkinci adımda formunuza bir adet “BDE” Yaprağında yer alan “Query” kontrolünü sürükleyip bırakın. Fakat “Table” kontrolü veritabanı bağlantıları için tek seçenek değildir. Fakat formunuza çok estetik bir görünüm kazandıracaktır). Dördüncü adımda “Object Inspector” penceresinde yer alan “SQL” özelliğine tıklayarak açılan editore sorgu komutlarınızı girin. “Query” kontrolüyle yapacağınız bağlantıdan sonra tablonuza yine kayıt girebilir. “Query” kontrolü uygulamalarınızda sizlere çok daha fazla esneklik sağlayacaktır. Yinede bağlantı seçeneği tamamen sizlere kalmıştır. “Query” kontrolünü seçip “DataBaseName” özelliğine tablonuzun bulunduğu klasörü referans gösteren “Alias” isminizi aktarın. Çok da mantıklıdır). aynı şekilde değişiklikler yapabilirsiniz (Bu işlem her zaman mümkün olmayabilir. Aşağıdaki adımları izleyerek “Query” bağlanabileceğinizi öğrenebilirsiniz. Özellikle birden fazla tabloyu birleştirerek bir sorgu oluşturduysanız kayıt işlemlerinizi yapmanıza izin vermeyebilir.

//Alias ismini aktarın end. procedure TForm1. 70 . Tüm kayıtların “DataGrid” nesnesine aktarıldığını göreceksiniz. Artık uygulamanızı çalıştırabilirsiniz.SQL. “Query” kontrolünüz deki “SQL” sorgusunda yapacağınız her değişiklikten sonra verileri izleyebilmek için “Query1.Open” satırını kullanmalısınız. • Query1. begin Query1. Burada sorgulamak için “DataBaseName” özelliğine aktardığınız alias içerisinde bulunan tüm tablo isimlerini kullanabilirsiniz (birden fazla tabloyu iç içe sorgulayabilirsiniz).FormCreate(Sender: TObject).Formunuza “DataAccess” Yaprağında yer alan “DataSource” nesnesinden bir adet yerleştirip “DataSet” özelliğine “Query1” nesnesini aktarın. Yedinci adımda formunuza bir adet “DataControls” yaprağında yer alan “DataGrid” nesnesi yerleştirip “DataSource” özelliğine “DataSource1” nesnesini aktarın. • Query1. Aksi takdirde düzgün bir “SQL” komutu yazsanız bile sonuçları “DataGrid” nesnesinde göremezsiniz.DatabaseName Tablonuzun bulunduğu klasörü referans gösteren “Alias” ismini bu özelliğe aktarabilirsiniz.Add Sorgu komutunuzu aktarabileceğiniz methoddur. Bu sayede o klasörde bulunan tüm tablolar kolayca sorgulanabilecektir (Klasör yolunuda verebilirsiniz ama siz hep Alias ismini kullanın).DatabaseName:='gazi'.

FormCreate(Sender: TObject).FormCreate(Sender: TObject). • Query1. tablonuza yeni kayıt ekleyebilir.SQL.//kayıt işlemlerine izin ver end. begin Query1.Close. begin Query1. end.Open. • Query1. Query1.Add('Select * From servis').FormCreate(Sender: TObject). procedure TForm1. • Query1. bu komuttan sonra hiç bir kaydı göstermeyecektir.procedure TForm1. begin Query1.RequestLive Varsayılan olarak bu değer “false” dır.Open “Query” kontrolü içerisinde yer alan kayıtları kullanıma açmayı sağlayan methoddur.DatabaseName:='gazi'. procedure TForm1.//DataGrid hiç bir kaydı artık göstermez end. end. Şayet bu özelliğe “True” değerini aktarırsanız. Şayet “DataGrid” nesnesi içeriklerini “Query” den alıyorsa. begin Query1.FormCreate(Sender: TObject).Close Açık olan “Query” kontrolünü kapatmak için kullanılan methoddur.RequestLive:=true.//sorgu komutları Query1.Open. procedure TForm1. Yani “Query” kontrolünden kayıt girme işlemi yapılamaz. Kontrol sorgu komutlarında yapılan her değişiklikten sonra kullanılması gerekecektir (sadece zamanını iyi belirlemelisiniz). 71 . kayıt değiştirebilirsiniz (bilhassa birden fazla tabloyla çalışıyorsanız bu özelliğe true aktarsanız bile kayıt giremiyebilirsiniz).

begin ShowMessage('İşlemi İptal Ettiniz'). • AfterClose Yordamı “Query” kontrolü ile bağlantı koptuğu anda işleyen bir yordamdır. 72 . “Query1. Bu yordamın işletilmesi için “Query1. end. • AfterEdit Yordamı “Query” Edit moduna alındığı anda (Navigator kontrolündeki Edit düğmesine basılırsa) otomatik olarak işleyen bir yordamdır.Query1AfterClose(DataSet: TDataSet). begin ShowMessage('Bağlantıyı Kapattınız'). begin ShowMessage('Kayıt Silindi').Edit” komutunun verilmesi yeterli olacaktır. procedure TForm1.Close” komutu bu yordamı otomatik olarak işletecektir. end. end. procedure TForm1. • AfterCancel Yordamı “DBNavigator” kontrolündeki (kodla oluşturmuş ta olabilirsiniz) Cancel düğmesinin tıklanılması durumunda işleyen bir yordamdır.Query1AfterDelete(DataSet: TDataSet). • AfterDelete Yordamı “Query” kontrolünden bir kaydın silinmesi durumunda otomatik olarak işleyen bir yordamdır.Query1AfterCancel(DataSet: TDataSet).Query Kontrolüne Ait Yordamlar: Query kontrolüyle işlem yaparken kontrolün kullandığı bir çok tetikleyici ile çalışabilirsiniz. procedure TForm1. Aşağıda bu tetikleyicilere değinilmektedir.

end. • AfterPost Yordamı Kaydet düğmesine basıldıktan sonra işleyen yordamdır. • OnCalcFields Yordamı “Query” kontrolünde sütunları hesaplatmak için kullanılan yordamdır. begin ShowMessage('Kayıt Eklemek İstediniz'). end. Örnek verilen yordamların “Before” ile başlayanları da “After” ile aynı zamanda tetiklenmektedir. begin ShowMessage('Kayıt İşlemi Başarıyla Tamamkandı'). Sade birincisi işlem tamamlanmadan önce diğeri ise tamamlandıktan sonra işlemektedir. procedure TForm1.Query1AfterInsert(DataSet: TDataSet). 73 . procedure TForm1. • AfterInsert Yordamı Kayıt ekleme işlemi yapıldığı anda otomatik olarak işleyen bir yordamdır. • AfterRefresh Yordamı “Refresh” düğmesine tıklanıldıktan sonra otomatik olarak işleyen bir yordamdır.procedure TForm1. Bu yüzden tekrar örneklendirilmeyecektir. begin ShowMessage('Kayıt Değiştirme Moduna Geçtiniz). procedure TForm1. begin ShowMessage('Kayıtlar Güncellendi'). end. Table kontrolünde bu yordama örnek verilmiştir.Query1AfterPost(DataSet: TDataSet).Query1AfterRefresh(DataSet: TDataSet). end.Query1AfterEdit(DataSet: TDataSet).

Son adımdan sonraki ekran görüntünüz yukarıdaki şekilde gerçekleşecektir.Wizard Kullanarak Query Kontrolüyle Tabloya Bağlanmak: Aşağıdaki adımları izleyerek “Query” kontrolü sayesinde tablolarınıza bağlanabilirsiniz. Aşağıdaki pencere açılacaktır. Bu pencerede “DataSet Options” kısmından “Create a form using Tquery” objects seçeneğini işaretleyip Next düğmesine tıklayın. Yeni açılan pencereden “SERVIS” tablonuzu bularak “Next” düğmesine tuklayın. “File->New->Other” seçeneklerini seçin. Buradan sonraki adımları “Table” kontrolünde yaptığımız şekilde tamamlayıp “Finish” buttonuna tıklayın. 74 . Açılan “New Item” penceresinden “Business” yaprağında yer alan “Database FormWizard” iconuna çift tıklayın.

BÖLÜM 2 STANDART SQL KOMUTLARI 75 .

76 .

77 . Aşağıdaki kodu formunuzun gerekli yordamına ekleyiniz. Şayet mümkünse aynısını paradox tablosu olarak oluşturunuz. o derece iyi bir Veri Tabanı programcısı sayılırsınız.SQL Komutları: Bu bölümde sizlere Veri Tabanı işlemlerinde en çok kullanılan komutlardan bahsedeceğim. MAGAZAADI SERVISTARIHI FIRMA MIGROS GIMA MIGROS DIA DIA MIGROS GURALLAR GURSOYLAR 01/02/2003 02/03/2003 02/05/2003 03/04/2003 05/04/2003 05/04/2003 06/08/2003 04/07/2003 UGUR MUHENDISLIK ALPSAN ALPYAPI UGUR MUHENDISLIK ALPSAN ALPYAPI UGUR MUHENDISLIK ALPYAPI AÇIKLAMA TUTAR KLIMA TESISAT KLIMA HAVALAND. Aşağıdaki tabloda tüm “SQL” Komutları için kullanacağımız satırlar verilmiştir.00 250000000 125000000 250000000 100000000 150000000 250000000 100000000 Örnekler içinde daha önceden oluşturulmuş olan “gazi” aliası içerisindeki “SERVIS” Tablosu kullanılacaktır. Tüm Kayıtları Listelemek: Tablodaki tüm kayıtları listelemek için aşağıda verilen SQL Komutlarını kullanabilirsiniz. TESISAT KLIMA KLIMA TESISAT 150000000.Hatırlatmak isterim “SQL” Komutlarını ne kadar iyi kullanabilirseniz. Komutlar Standart SQL Komutları olarak adlandırılmakta olup neredeyse bütün dillerde aynı kalıp yapısıyla kullanılmaktadırlar.

DatabaseName:='gazi'. Bu karakterin yerine listelemek istediğiniz sütun isimlerini araya “.procedure TForm3.FormCreate(Sender: TObject). Sadece İstenilen Sütunları Listelemek: Tüm sütunları listelemek istemiyorsanız (“*”) karakterini kullanamazsınız. Query1.SQL. Bu işlem için “Select” ifadesiyle başlayan bir komut satırına ihtiyaç duyulacaktır.DatabaseName:='gazi'. begin Query1. //İstenilen sütunları listele begin Query1. procedure TForm3. Burada yapılan bir seçme sorgusudur.Close. yani tablodan uygun kayıtların sökülüp alınması olayıdır.Open. 78 . Programı çalıştırırsanız sadece yazmış olduğunuz sütunlar listelenecektir.FATURATUTARI From SERVIS').Add('Select MAGAZAADI. Query1. Query1. end. Query1.FormCreate(Sender: TObject).SQL. end.Open.Add('Select * From SERVIS').” koyarak yanyana yazmanız gerekecektir.Close. Query1. Query1.

15 TOPLAM From SERVIS'). Aşağıda bu işlem örneklendirilmektedir. begin Query1.FATURATUTARI*0. Bu tip durumlarda aşağıdaki şekilde bir sorgu komutu kullanmalısınız.Yeni Sütun Başlıkları Belirlemek: Tabloda sütunlar oluşturulurken isimlendirmede genellikle kısıtlamalar uygulanır.Open.SQL. end. Query1. begin Query1.DatabaseName:='gazi'.end.Open.SQL. Yeni Sütun Eklemek: Bazı durumlarda tablonuzda var olmayan fakat diğer sütunlardan hesaplanabilecek sütunlar oluşturmak zorunda kalabilirsiniz.15 KDV.FATURATUTARI*1. Query1. FATURATUTARI.FormCreate(Sender: TObject).FATURATUTARI Tutar From SERVIS'). 79 .FormCreate(Sender: TObject).DatabaseName:='gazi'. Query1. Query1.Add('Select MAGAZAADI Magaza_Adi. Query1. procedure TForm3. procedure TForm3. Query1. Haliyle DataGrid içerisindeki gösterimde kötü bir görünüme sebep olacaktır.Close.Add('Select MAGAZAADI.Close. Bu yüzden oluşturulan sütunlara yeniden isim vermek zorunda kalacaksınız.

80 .Uygulamayı çalıştırırsanız aşağıdaki şekilde tablonuzda yer almayan iki sütununuz DataGrid nesnenizde gözükecektir. Sorgulama sonucuna dikkat edecek olursanız. tablo kayıtları “MAGAZAADI” sütununa göre “A-Z” ye doğru sıralı halde karşınıza gelecektir. Bu tür sıralatma işlemlerini tablo nesnelerinde index ler yapmakta olup. “Query” kontrolü kullanırsanız “Order By” komutuna ihtiyacınız olacaktır. Sıralama Yapmak (Order By): Tablolarınızdaki seçme sorgularının bir sütuna göre sıralı bir şekilde gözükmesini isterseniz o zaman aşağıdaki şekilde bir komut dizisi kullanmalısınız. Dilerseniz bu yöntemle iki (vaya daha fazla) string sütunu da yanyana yazdırabilirsiniz.

FormCreate(Sender: TObject). Aynı örnek için şöyle bir senaryo türetelim. Query1. O zaman sorgu komutlarınızı aşağıdaki şekilde değiştirmeniz gerekecektir. küçükten büyüğe veya “A-Z” ye doğru bir sıralama yaptıracaktır. Query1.Open. end. Query1.Close. begin Query1.Add('Select * From SERVIS Order By MAGAZAADI'). “Order By” komutundan sonra “DESC” bildirisini kullanırsanız sıralatmanın tersten yapılacağını programa bildirmiş olursunuz. Dilerseniz “Z-A” ya doğru bir sıralamada yaptırabilirsiniz.DatabaseName:='gazi'.procedure TForm3. Bu parametre yazılmadığı zaman Delphi “Asc” parametresini varsayılan değer olarak kabul edecek.Open.Close.DatabaseName:='gazi'. Query1. 81 . Mağaza isimleri aynı olan mağazaları da ikinci olarak servis tarihine göre büyükten küçüğe doğru sıralasın.SQL. procedure TForm3.FormCreate(Sender: TObject).Add('Select * From SERVIS Order By MAGAZAADI DESC'). Query1. //Mağaza Adına Göre sırala begin Query1. Kodu aşağıdaki şekilde değiştiriniz. end.SQL. Query1.

bir tanesini yazdırmak için kullanacağınız komut “Distinct” komutudur. Query1. 82 . Query1. Query1. end. Hatırlatalım gösterilecek olan sütunlardan bir tanesi “Primary veya Unique” index özelliğine sahipse zaten böyle bir durumun oluşmasına imkan yoktur. “Distinct” komutunu Select ifadesinden hemen sonra koymalısınız.SQL.Open.procedure TForm3. Daha sonra “Order By” ile belirtilen ikinci parametreye göre mağaza adı aynı olan kayıtları Servis Tarihine göre küçükten büyüğe doğru sıralayacaktır.FormCreate(Sender: TObject). Aşağıdaki örnek sorgulama da “MAGAZAADI” ile “SERVISTARIHI” aynı olan kayıtlar sadece bir kere yazdırılmaktadır.Add('Select * From SERVIS Order By MAGAZAADI DESC.Close. Rasgele bir yerde belirtme şansınız yoktur.DatabaseName:='gazi'.SERVISTARIHI'). Program öncelikle tüm tabloyu mağaza adına göre sıralar (Tersten). //İkili Sıralatma begin Query1. Aynı Kaydı Birkere Listelemek(Distinct): Sorgunuzda göstermek istediğiniz sütun değerlerinin tamamının aynı olması durumunda.

//Aynı Kaydı Bir kere Yaz begin Query1. Aşağıda bu komuta ait örneklendirme gerçekleştirilmiştir.Close.Add('Select Distinct MAGAZAADI.SQL. Sorguda listelenmeyen hücre değerlerindeki eşitliğin “Distinct” komutu için bir önemi yoktur.FormCreate(Sender: TObject). Query1. Sütundaki En Yüksek Değeri Hesaplamak(Max): Tablonuzdaki bir sütuna ait en yüksek değeri hesaplamak için “Max” komutundan faydalanmaktayız.DatabaseName:='gazi'. procedure TForm3. Query1. Query1.DatabaseName:='gazi'.GIDENFIRMA From SERVIS'). //en yüksek maaşı bul begin Query1. 83 . Matematiksel Sorgu Komutları: Şimdi sizlere matematiksel hesap yaptırabileceğiniz SQL komutlarından behsedeceğim. end.FormCreate(Sender: TObject).Open.procedure TForm3.

procedure TForm3.Close. Sütundaki En Küçük Değeri Bulmak(Min): Tablonuzdaki bir sütuna ait en küçük değeri hesaplamak için “Min” komutundan faydalanmaktayız. //en yüksek maaşı bul begin Query1.FormCreate(Sender: TObject). Query1. Bu değer o sütuna ait minimum değere sahiptir.SQL. Programı çalıştırırsanız yukarıda ki pencerede görüldüğü gibi sadece tek bir hücre değerinden oluşan sorgu sonucunu görebilirsiniz. Query1. Programı çalıştırırsanız aşağıda ki pencerede görüldüğü gibi sadece tek bir hücre değerinden oluşan sorgu sonucunu görebilirsiniz.Close. Query1.Add('Select MIN(FATURATUTARI) MAXIMUM_MIKTAR From SERVIS').Open.Open. Query1. end.Add('Select MAX(FATURATUTARI) MAXIMUM_MIKTAR From SERVIS').Query1.SQL.DatabaseName:='gazi'. end. Query1. Aşağıda bu komuta ait örneklendirme gerçekleştirilmiştir. 84 .

end. procedure TForm3. begin Query1.FormCreate(Sender: TObject). Query1. Aşağıda bu komuta ait örneklendirme yapılmaktadır.SQL.Open.DatabaseName:='gazi'.Close. Query1. 85 .Add('Select SUM(FATURATUTARI) FATURA_TOPLAMI From SERVIS').Sütun Toplamını Bulmak(Sum): Sayısal içerikli sütunlara ait değerleri toplatmak için kullanılan SQL Komutudur. Query1.

Kayıt Sayısını Bulmak(Count): Tablonuzdaki kayıt sayısını (veya kriterinize uyan kayıt sayısını)öğrenebilmek için kullanabileceğiniz sorgu komutudur. 86 . end.Sütun Ortalamasını Hesaplatmak(Avg): Sayısal içerikli sütunlara ait değerlerin ortalamasını hesaplamak için kullanılan SQL Komutudur.DatabaseName:='gazi'. Query1.Close. procedure TForm3.FormCreate(Sender: TObject). Query1. Query1. Query1. begin Query1. begin Query1.SQL. procedure TForm3. Aşağıda bu komuta ait örneklendirme yapılmaktadır. Query1.SQL.Open.Close. end.FormCreate(Sender: TObject).Add('Select AVG(FATURATUTARI) ORTALAMA_TUTAR From SERVIS').Add('Select COUNT(MAGAZAADI) KAYIT_SAYISI From SERVIS').DatabaseName:='gazi'.Open. Query1.

Query1. procedure TForm3. Gruplandırma işlemini yaparken dikkatli olmanızı mantıksız gruplandırma işlemleri yapmamanızı tavsiye ederim.Open. begin Query1. Query1. Query1.Gruplandırma Yapmak(Group By): Aynı mağazaya yapılmış olan servislerin tamamını tek kalemde göstermek için kullanılabilecek olan yapıdır. end.SQL. 87 .SUM(FATURATUTARI) MAGAZA_TOPLAMI From SERVIS Group By MAGAZAADI').Add('Select MAGAZAADI.DatabaseName:='gazi'.FormCreate(Sender: TObject).Close.

SQL.Open. Yukarıdaki iki sonucu karşılaştıracak olursanız. Query1. grup toplamı 150. begin Query1. amiriniz sizden toplam fatura tutarı içinde bir kriter belirleyip sonucu ona göre listelemenizi istese ne yaparsınız.Sorgu sonucuna dikkat edecek olursanız. procedure TForm3.000. Bu komutlar arayıp ta bulamayacağınız türden korkunç derecede etkili yapılardır. Query1. Aşağıda bu husus örneklendirilmektedir. Örnekte de görüldüğü gibi “Having” yapısı sayesinde gruplandırılarak oluşturulmuş olan sorgu sonucuna kolayca koşul konulabilmektedir. SQL sorguları için. Query1.Add('Select MAGAZAADI. ardından “Having” komutunu kullanarak koşulunuza uyan kayıtlarınızı listeletin.FormCreate(Sender: TObject).Close. gruplandırılmış sorgulara koşul koymak ancak “Having” komutuyla gerçekleştirilebilmektedir. Gruplandırılmış Sütunlara Koşul Koymak(Having): Yukarıdaki tablo için.000 TL den az olanların ikinci raporda listelenmediğini göreceksiniz. Bu yüzden kullanımına ait mantığı lütfen dikkatlice takip ediniz. gerçekten de tüm mağazalara yapılmış olan servis miktarları tek kalemde doğru bir şekilde hesaplattırılıp yazdırılmıştır.DatabaseName:='gazi'.SUM(FATURATUTARI) MAGAZA_TOPLAMI From SERVIS Group By MAGAZAADI Having Sum(FATURATUTARI)>150000000'). end. 88 . Önce “Group By” komutu ile tabloyu gruplandırın. Hatırlatmakta fayda var Gruplama yapmadan asla “Having” yapısını kullanamazsınız.

SQL. Query1. Şayet koşulu sayısal bir veri içeren sütuna koyacaksanız o zaman kodunuzu aşağıdaki şekilde değiştirmelisiniz.FormCreate(Sender: TObject).Close. begin Query1. Query1. Query1.DatabaseName:='gazi'. Query1. Aşağıda bu komuta ait örneklendirmeler yapılmaktadır.DatabaseName:='gazi'.Open. Sanıyorum en çok kullanacağınız (Select ten sonra) komut bu olacaktır. Sizden istenecek olan sadece “MIGROS” mağazasına ait kayıtları.Add('Select * From SERVIS Where MAGAZAADI="MIGROS"').FormCreate(Sender: TObject). procedure TForm3.Close. 89 . //Kriter koy begin Query1. Sorgu sonucuna dikkat edecek olursanız sadece “MIGROS” Mağazalarına yapılmış olan servislerin listelendiğini göreceksiniz. procedure TForm3. end. veya şu miktarın üzerindeki kayıtları listeleme işlemini gerçekleştirebileceğiniz komuttur.Sorguya Koşul Koymak(Where): Oluşturacağınız sorguya satır bazlı koşul koymak için kullanılan “SQL” Komutudur.

Aynı Anda Birden Fazla Koşulu Sağlamak(In): Önceki tablomuz için mağaza adı “MIGROS” ve fatura tutarı “125. Dikkat edin iki şartın ikiside sağlanmak zorunda olacaktır.Add('Select * From SERVIS Where FATURATUTARI>=80000000').SQL.Open. Query1. end. 90 .000” den büyük olanları listelemeye çalışalım.DatabaseName:='gazi'.Query1. begin Query1.000.FormCreate(Sender: TObject). procedure TForm3.

SQL. Delphi sorgulamada hepsine dikkat edecektir.” karakterini koyarak aynı sütun için istediğiniz kadar kriteri yanyana belirtebilirsiniz. Query1.Add('Select * From SERVIS Where MAGAZAADI="MIGROS" and FATURATUTARI>=80000000'). Query1.Add('Select * From SERVIS Where in("MIGROS". Query1."DIA")').Open.SQL. begin Query1. end. Şayet bu işlem sizin için sıkıcı olursa.Close. Aynı Anda Birden Fazla Şartın Sağlanmaması(Not In): Bu sefer de mağaza adı “MIGROS” ile “DIA” olmayanları listelemeye çalışalım. Query1. aşağıdaki kodlamayı da kullanabilirsiniz.Open.Close.Query1. “SQL” Sorgunuz aşağıdaki şekilde olmalıdır. MAGAZAADI “In” Komutunu ve araya “. end. Query1. Tek değiştireceğiniz bölüm “In” yerine “Notin” komutunu koymak olacaktır. procedure TForm3. Kriterler arasına “and” operatörü koyarak istediğiniz kadar şart belirleyebilirsiniz. ve tek sütun için birden fazla koşul koyacaksanız.FormCreate(Sender: TObject). 91 .DatabaseName:='gazi'.

SQL.FormCreate(Sender: TObject).Close. Query1.SQL.procedure TForm3.Add('Select * From SERVIS Where MAGAZAADI Not in("MIGROS".DatabaseName:='gazi'.Open. Query1. Query1. Programı çalıştırırsanız yukarıdaki pencerede gözüktüğü gibi içerisinde “MIGROS” ve “DIA” mağazalarına yapılan servislerin dahil edilmediği bir raporla karşılaşırsınız.DatabaseName:='gazi'. Query1. Where 92 . Şartlardan Sadece Bir Tanesinin Yeterli Olması(Or): Belirteceğiniz kriterlerden sadece bir tanesinin doğru olmasının (en az bir tanesinin) yeterli olduğu sorgu komutudur."DIA")'). Query1. begin Query1. Query1.FormCreate(Sender: TObject). end. end.Close.Add('Select * From SERVIS MAGAZAADI="MIGROS" or MAGAZAADI="DIA"'). procedure TForm3. begin Query1. Kullanımına ait örneklendirme aşağıda verilmektedir.Open.

begin Query1. Aralık Sorgulamak(Between): Aşağıdaki yöntemlerle bir sütuna ait aralık değerine göre sorgulama yapabilirsiniz. 93 . procedure TForm3.Close.FormCreate(Sender: TObject). Query1.DatabaseName:='gazi'.Sonuca dikkat edecek olursanız mağaza adı “MIGROS” veya “DIA” olan mağazaların tamamı listelenmiştir. Programa ait SQL Sorgusu aşağıda verilmektedir.

Aşağıda bu husus örneklendirilmektedir.DatabaseName:='gazi'. Query1. Şimdi ise “MAX” Fatura tutarının yapıldığı mağazaya ait kaydı belirlemeyi deneyeceğiz. Query1.SQL. Query1. Daha önceki SQL komutlarını kullanarak “MAX” fatura tutarını hesaplatmıştık.DatabaseName:='gazi'. begin Query1.SQL.Close.Close. Query1.Open.Add('Select * From SERVIS Where FATURATUTARI=(Select Max(FATURATUTARI) From SERVIS)').Open. end. procedure TForm3.FormCreate(Sender: TObject). end. Aynı işlevi gerçekleştiren kodu aşağıdaki şekilde de yazdırabilirsiniz.Open. Query1. procedure TForm3. end.Query1.Add('Select * From SERVIS Where FATURATUTARI Between 85000000 AND 150000000'). Query1.FormCreate(Sender: TObject). İç İçe Select İfadesi Kullanmak: Select ifadeleri istenirse iç içe kullanılabilmektedir (belli bir mantık çerçevesinde). Query1. begin Query1. 94 .Add('Select * From SERVIS Where FATURATUTARI>=85000000 AND FATURATUTARI<=150000000').SQL.

Add('Select * From SERVIS Where MAGAZAADI Like "MIGROS"').Close. begin Query1. ortalama fatura tutarının altındakileri listeletelim. Sütun İçerisinde Arama Yapmak(Like): Aranacak içeriğin çok uzun olması durumunda.DatabaseName:='gazi'.Şimdi de aynı mantığı kullanarak. Query1.Open. procedure TForm3.SQL. Aşağıdaki örnekler tüm kullanım çeşitlerine değinmektedir. end. 95 . Query1. Query1.FormCreate(Sender: TObject). veya içeriğin tam olarak hatırlanamaması gibi durumlarda kullanmanız gereken “SQL” komutudur.

FormCreate(Sender: TObject).SQL. Query1.Yukarıdaki kriterin MAGAZAADI=”MIGROS” tan hiç bir farkı yoktur. begin Query1.Close.SQL. end.Open. Query1. Örneği dikkatlice inceleyiniz.Open. Şayet hücre değerinin herhangi bir parçasına göre aratma yaptıracaksanız o zaman da sorguya ait kodunuzu aşağıdaki şekilde değiştirmeniz gerekecektir. Sonuca dikkat edin “G” ile başlayan tüm mağaza servisleri sorguda gözükmektedir.DatabaseName:='gazi'. end. o zaman olay çok farklı bir durum alacaktır.Add('Select * From SERVIS Where MAGAZAADI Like "%G%"'). Query1. Sadece “MIGROS” mağazalarını listelemek için kullanılır. Query1. Query1.FormCreate(Sender: TObject). 96 . procedure TForm3. procedure TForm3. begin Query1. Query1.Close.Add('Select * From SERVIS Where MAGAZAADI Like "G%"').DatabaseName:='gazi'. Şayet sorguyu aşağıdaki şekilde joker karakter kullanarak değiştirirseniz.

Aksi takdirde veri arayacağı tablolarda problem yaşayacaktır. Dikkat etmeniz gereken bir kaç püf noktası olacak. İki Tabloyu Aynı Anda Sorgulamak: Tek bir sorgu içerisinde birden fazla tablo verisini birleştirmeniz mümkündür. 97 . baş taraflarına tablo ismini yazarak belirtmelisiniz. Son adım olarak koşul kısmında.” koyarak tek tek belirtmelisiniz. “From” komutundan sonra sorguda kullandığınız tüm tablo isimlerini araya “. Birincisi birden fazla tabloyu sorgulayacağınız için sütun isimlerini. iki tablo arasında “MAGAZAADI” sütun değerleri eşleştirilerek aradaki bağlantı sağlanmaktadır. Mağaza tablosundaki mağaza adı sütununu ifade edecektir. Aşağıdaki sorgulamada. içerisinde “G” harfi olan tüm mağaza servisleri listelenmektedir (başta veya sonda olması önem arz etmemektedir). Tablo ismiyle sütun ismi arasında “. tablolar arasında ilişkili iki sütunu tablo adlarıyla beraber belirtmeniz gerekecektir. şimdi bu noktalara dikkatinizi çekmek istiyorum.MAGAZAADI” şeklinde yapılacak olan bildirim. “MAGAZA.Sorguda “Like” ile kullanılan kritere dikkat edin. Uygulamaya ait sorgu sonucu ile sorgu komutları aşağıda verilmektedir. “MAGAZA” tablosundaki sütunlar ile “SERVIS” tablosundaki sütunlar arasından seçim yapılmakta. Burada sadece karakter aratması yaptırmak zorunda değilsiniz Dilerseniz daha değişik şekilde “Like “%MIG%”” yazıp string parçasıda arattırabilirsiniz.” Karakteri kullanmalısınız.

Inner Join Komutu İle Koşul Koymak: Bu komut ile farlklı iki tablo içerisinde koşul sutunları ortak olan alanları listelemek için kullanılır.SERVISTARIHI.SERVIS Where MAGAZA. SERVIS. Query1. MAGAZA.Close.Open.FormCreate(Sender: TObject).MAGAZAADI.SQL. 98 .procedure TForm3. Aradaki ilşkiyi belirleyen sütun ismi ise “MAGAZAADI” sütunu olmaktadır.Close.SERVISTARIHI.MAGAZAADI)').Open. MAGAZA.MAGAZAADI= SERVIS. end. begin Query1.Add('Select MAGAZA.MAGAZAADI=SERVIS.FATURATUTARI From SERVIS INNER JOIN MAGAZA ON(MAGAZA. procedure TForm3.FATURATUTARI From MAGAZA.DatabaseName:='gazi'. end.Add('Select SERVIS. Query1. Query1. Query1.SQL. Sonuç penceresinde görüldüğü gibi ilk üç sütun “MAGAZA” Tablosundan son iki sütun da “SERVIS” tablosundaki verilerden elde edilmektedir.SERVIS.DatabaseName:='gazi'.ADRES. //Birden fazla tabloyu sorgulamak begin Query1.MAGAZAADI. Query1. Query1.SERVIS.SERVIS.MAGAZAADI').SEHIR.FormCreate(Sender: TObject).

Kayıtlara dikkat edecek olursanız.MAGAZAADI=SERVIS. procedure TForm3.Open. 99 .SERVISTARIHI. Outer Join Komutu İle Koşul Koymak: Farklı iki tabloda aynı olan sütunlar için birincide yer alıp ikincide bulunmayan kayıtları listelemek için kullanılan komuttur.MAGAZAADI.Close.DatabaseName:='gazi'. Yukarıdaki “SQL” sogusunu içeren programı çalıştırırsanız aşağıdaki şekilde kayıtların yer aldığı bir tablo görüntüsüyle karşılaşırsınız.MAGAZAADI)').SQL. listelenen sütunların “SERVIS” tablosuna ait olduklarını hemen farlk edeceksiniz.SERVIS. Query1.Add('Select SERVIS. Bu şart “Inner Join” komutundan sonraki bölümde belirtilen “MAGAZA” tablosundaki mağaza isimlerine ait servis bilgileri olarak gerçekleşecektir. Peki ama “SERVIS” tablosundaki hangi kayıtlar listelenmiştir. end. SERVIS. Query1.FormCreate(Sender: TObject).Yukarıdaki SQL komutları işletildikten sonra tablo görüntünüz aşağıdaki şekilde gerçekleşecektir. begin Query1.FATURATUTARI From SERVIS LEFT OUTER JOIN MAGAZA ON(MAGAZA. Query1.

Open. Programı çalıştırdıktan sonraki tablo görüntünüz yukarıda verilmiştir.MAGAZAADI.SERVISTARIHI.SERVIS.veya procedure TForm3. Query1.DatabaseName:='gazi'. end.Add('Select SERVIS.FormCreate(Sender: TObject).MAGAZAADI)').MAGAZAADI=SERVIS. begin Query1. Query1.FATURATUTARI From SERVIS RIGHT OUTER JOIN MAGAZA ON(MAGAZA.SQL.Close. Bu sorguda “RIGHT OUTER JOIN” kullanıldığına dikkat ediniz. 100 .SERVIS. Query1.

Query1.MAGAZAADI From SERVIS'). procedure TForm3.FormCreate(Sender: TObject). end. From MAGAZA 101 .Add('Select MAGAZA.SQL. begin Query1. Query1.Open.DatabaseName:='gazi'.Close.Union Komutunu Kullanarak Tabloları Birleştirmek: Bu komutu kullanarak iki farklı select yapısı oluşturabilirsiniz.MAGAZAADI UNION Select SERVIS. Oluşturacağınız iki sorguya ait kayıtlar alt alta eklenerek tek tabloda gösterilecektir. Query1.

//Kayıt Sil begin UpdateSQL1. begin UpdateSQL1.DeleteSQL.ExecSQL(ukDelete). Bu tür seçme sorguları tablo yapısında herhangi bir değişiklik yapmazlar.Button3Click(Sender: TObject).silme veya kayıt değiştirme işlemleri için kullanılmaktadır. procedure TForm4.Button3Click(Sender: TObject). Sadece işimize yarayacak olan kayıtları listeleme işleminde kullanılırlar. “SQL” komutlarını kullanarak tablonuzda istediğiniz işlemi yapabilirsiniz. Aşağıda tablo yapısında değişiklik yapacak olan sorgular tek tek incelenmektedir.Tablo Yapısında Değişiklik Yapan Sorgular: Şu ana kadar yapmış olduğumuz tüm sorgular seçme sorgularıydı ve “Select” ifadesiyle başlıyorlardı. Ayrıca sorgu komutunu uygulamak için bu methoda ihtiyacınız olacaktır.DeleteSQL.silme.Add('Delete From MAGAZA MAGAZAADI="MIGROS"'). UpdateSQL1. • UpdateSQL1.Bu aşamadan sonraki sorgu komutları ise direk tablo da değişiklik yapacaklardır.Add('Delete From MAGAZA MAGAZAADI="MIGROS"').ExecSQL() SQL Komutunu yazmak kaydın silinmesi için yeterli değildir. bu yüzden komutları kullanırken çok dikkatli olmanız gerekecektir.DeleteSQL. Kayıt ekleme.//Uygula end.değiştirme) “UPDateSQL” kontrolü kullanılmaktadır. UpdateSQL Kontrolü: “BDE” Yaprağında bulunan bu kontrol sayesinde. Sorgu ile kayıtlar üzerinde değişiklik yapmak için (ekleme. • UpdateSQL1.Add Tablodan kayıt silmek için kullanacağınız “SQL” komutunu bu özelliğe aktarmalısınız. end. 102 Where Where . procedure TForm4.

103 . Aksi takdirde yapacağınız işlemlerden bir sonuç alamayacaksınız. Son adım olarak formunuza bir adet “BDE” Yaprağında yer alan “UpdateSQL” kontrolünden yerleştirerek aşağıdaki kodları programınıza ekleyiniz. Öncelikle verilen tasarımı oluşturunuz. Hatırlatalım sorguyla kayıt silme işleminde kritere uyan tüm kayıtlar silinecektir.Sorguyla Kayıt Silmek(Delete): Aşağıdaki örnekte sorgu komutları kullanılarak tablodan kayıt silinmektedir. Daha sonra formun üzerine bir adet “BDE” Yaprağında yer alan (“Transaction” işlemi için) “DataBase” kontrolünden yerleştirin (hiç bir özelliğini değiştirmenize gerek yok tamamını kodla yapacağız). “UpdateSQL” kontrolüne eklenecek sorgu komutunun (ekleme-silme-değiştirme) hangi “Query” kontrolünün gösterdiği tabloya yansıyacağı “UpdateObject” özelliğiyle belirlenmelidir. Silinen kayıtlar şayet Trasaction kullanılmazsa artık geriye alınamayacaktır. “Query-DataSource-DataGrid” nesneleri için daha önceden gösterilen ayarları yaparak “MAGAZA” tablosundaki tüm kayıtların “DataGrid” nesnesinde gösterilmesini sağlayın. Burada hatırlatmakta yarar var. isterseniz “Object Inspector” penceresinden. İster kodla yapın (kodu her zaman tercih etmelisiniz).

procedure TForm4. //kesinlikle yapın Try //hata oluşmazsa sil UpdateSQL1.//Tabloya yaz ShowMessage('Kayıt silindi'). end.Rollback.//yapın Query1.UpdateObject:= UpdateSQL1.//iptal et ShowMessage('Silme İşlemi İptal Edildi').Open.ExecSQL(ukDelete).FormCreate(Sender: TObject). DataBase1.TransIsolation:=tiDirtyRead. Except//Hata oluşursa iptal et Database1. 104 Where . UpdateSQL1.DatabaseName:='gazi'. Database1. end. end.//Uygula Database1.Add('Delete From MAGAZA MAGAZAADI="MIGROS"').Button3Click(Sender: TObject).procedure TForm4.DeleteSQL. //Kontrolleri ayarla begin Database1.//ayarlayın Query1.CachedUpdates:=true. //Sil begin Query1.Commit.Connected:=true.

Add Kayıt ekleme işlemi için kullanacağınız SQL Sorgusunu bu özelliğe aktarmalısınız.procedure TForm4."YUKSEL INAN".InsertSQL.StartTransaction. begin if Database1.TELEFON. En son ekran görüntüsü aşağıda verilmiştir. 105 ."ISTANBUL")'). • UpdateSQL1.Add('Insert Into MAGAZA(MAGAZAADI. Programı çalıştırıp “Sil” Buttonuna tıklarsanız “MIGROS” Mağazasına ait kaydın silindiğini göreceksiniz. procedure TForm4.Button1Click(Sender: TObject).InTransaction=False Then //transaction yoksa başlat Database1. Kayıt silme işleminde yaptığımız gibi aşağıdaki parametreyede değer aktarmamız gerekecektir.Button2Click(Sender: TObject)."BOSTANCI".//Transactionu başlat end."2163521425".ADRES.InsertSQL.MUDUR. Yukarıdaki kod bloğu kayıt eklemek için yeterli değildir. end. //Ekle begin UpdateSQL1.SEHIR) VALUES ("MIGROS".

"ISTANBUL")').TELEFON. procedure TForm4.TransIsolation:=tiDirtyRead.StartTransaction.Button1Click(Sender: TObject). Database1. DataBase1.//tabloya yansıt end. UpdateSQL1.Button2Click(Sender: TObject).Add('Insert Into MAGAZA(MAGAZAADI.Button2Click(Sender: TObject). procedure TForm4.//Uygula ShowMessage('Kayıt Eklendi').InTransaction=False Then //transaction yoksa başlat Database1.SEHIR) VALUES ("MIGROS".Add('Insert Into MAGAZA (MAGAZAADI. ADRES.//yapın Query1."2163521425".MUDUR. procedure TForm4. Kayıt ekleme işlemi yapıldığı için “ukInsert” parametresinin aktarılması gerekmektedir."YUKSEL INAN".Connected:=true.Commit. "2163521425"."BOSTANCI".InsertSQL. procedure TForm4. end.• UpdateSQL1. begin if Database1.ExecSQL(ukInsert). begin Query1."YUKSEL INAN".CachedUpdates:=true.ADRES. Örneği lütfen dikkatlice inceleyiniz. //Bu ayarları yapın begin Database1.ExecSQL(ukInsert) Sorgu komutunun tabloya yansımasını sağlayan methodudur.MUDUR.//tabloyayansıt Database1. 106 .InsertSQL.FormCreate(Sender: TObject)."ISTANBUL")'). UpdateSQL1.TELEFON.UpdateObject:=UpdateSQL1."BOSTANCI". Sorguyla Tabloya Kayıt Eklemek: Aşağıdaki kod bloğunu kullanarak kolayca tablonuza kayıt ekleyebilirsiniz.ExecSQL(ukInsert).//ayarlayın Query1. //kesinlikle yapın try UpdateSQL1.//Başlat end.Open. begin UpdateSQL1.SEHIR) VALUES ("MIGROS".DatabaseName:='gazi'.

ModifySQL.except Database1.Rollback. begin UpdateSQL1.Button4Click(Sender: TObject). Yukarıdaki SQL komutu sayesinde tablodaki tüm “SOK” mağazaları “BAKKALIM” olarak değişecektir. procedure TForm4.//iptal et ShowMessage('Ekleme İşlemi İptal Edildi').Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"').ModifySQL. end. Yanlız aşağıdaki parametreyide diğerlerinde olduğu gibi eklemelisiniz. • UpdateSQL1.Add Kayıt değiştirme işlemini gerçekleştirebilmeniz için gerekli “SQL” kodunu aktarabileceğiniz özelliğidir. Programı çalıştırıp “Ekle” isimli buttona tıklarsanız yukarıdaki pencerede olduğu gibi (daha önceden silmiştik)“MIGROS” kaydı tekrar tabloya eklenecektir. end. 107 . end.

//Değiştir begin Query1. begin if Database1.StartTransaction.ExecSQL(ukModify) SQL komutunun tabloya yansıması için gerekli olan parametresidir. procedure TForm4.ModifySQL.Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"'). Kayıt değiştirme işlemi yapacağı için “ukModify” değeri aktarılmıştır.Button1Click(Sender: TObject).ExecSQL(ukModify).DatabaseName:='gazi'. Şimdi de yukarıdaki tasarımımız için “Değiştir” düğmesinin kodunu verelim.//yapın Query1.Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"'). Database1.//tabloya yansıt end. begin UpdateSQL1. except Database1.CachedUpdates:=true.InTransaction=False Then //transaction yoksa başlat Database1.• UpdateSQL1. 108 .//ayarlayın Query1. procedure TForm4.//Uygula ShowMessage('Kayıt Değiştirildi'). end. end.UpdateObject:=UpdateSQL1.Open.Button4Click(Sender: TObject). procedure TForm4. UpdateSQL1.//iptal et ShowMessage('Değiştirme İşlemi İptal Edildi').ExecSQL(ukModify). DataBase1. procedure TForm4.Rollback. begin Database1. end.Connected:=true.Button4Click(Sender: TObject). UpdateSQL1. //kesinlikle yapın try UpdateSQL1.Commit. end.//Değişikliği yansıt Database1.FormCreate(Sender: TObject).TransIsolation:=tiDirtyRead.ModifySQL.

Programı çalıştırıp “Değiştir” isimli buttona tıklarsanız aşağıdaki pencerede gösterildiği gibi “SOK” isimli mağazalar “BAKKALIM” ismiyle değiştirilecektir.ExecSQL(ukDelete).//yapın Query1.DeleteSQL. //Bu bağlantıları yapın begin Database1. Örneği çok dikkatlice inceleyiniz.//ayarlayın Query1.Add('Delete From MAGAZA Where MAGAZAADI="MIGROS"').//Tabloya yansız Database1.Commit.DatabaseName:='gazi'. Şimdide programa ait tüm kod bloğunu aşağıda veriyorum.Open. Query1.TransIsolation:=tiDirtyRead. //kesinlikle yapın end. procedure TForm4.UpdateObject:=UpdateSQL1. //Sorguyla Kayıt Sil begin try UpdateSQL1.FormCreate(Sender: TObject).//Mağaza adı MIGROS olanları sil UpdateSQL1. procedure TForm4.//Uygula 109 . Database1. DataBase1.CachedUpdates:=true.Button3Click(Sender: TObject).Connected:=true.

begin try UpdateSQL1.Button1Click(Sender: TObject)."BOSTANCI". begin try UpdateSQL1.ModifySQL.ADRES. Yaptığınız işlemden sonra “DataGrid” nesnesi içerisinde verilerin güncellenmediği (Kapatıp açarsanız güncellenir) 110 .Rollback. Tamamının başarılı bir şekilde gerçekleştiğini göreceksiniz. procedure TForm4.Add('Insert Into MAGAZA(MAGAZAADI.Commit. end. Database1.ExecSQL(ukInsert). except Database1.StartTransaction. end. end. end.Rollback.Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"')."YUKSEL INAN". UpdateSQL1.//iptal et ShowMessage('Silme İşlemi İptal Edildi').Rollback. except Database1.Commit.//Transactionu başlat end.Button4Click(Sender: TObject).//Ekle Database1. begin if Database1.InTransaction=False Then //transaction yoksa başlat Database1.TELEFON. end.Button2Click(Sender: TObject).//Uygula ShowMessage('Kayıt Eklendi'). procedure TForm4.//iptal et ShowMessage('Değiştirme İşlemi İptal Edildi').InsertSQL. UpdateSQL1.SEHIR) VALUES ("MIGROS".MUDUR."ISTANBUL")').//Uygula ShowMessage('Kayıt Değiştirildi'). Programı çalıştırıp tüm düğmeleri teker teker deneyin.//iptal et ShowMessage('Ekleme İşlemi İptal Edildi').ExecSQL(ukModify).ShowMessage('Kayıt silindi'). except Database1. procedure TForm4. end."2163521425".

//iptal et ShowMessage('Değiştirme İşlemi İptal Edildi').dikkatinizi çekmiş olmalıdır.Button4Click(Sender: TObject).//kayıtların güncellenmesi içinekleyin ShowMessage('Kayıt Değiştirildi').//Uygula Query1.ExecSQL(ukModify). Database1. //kesinlikle yapın try UpdateSQL1.Open. Set Ben sadece “Kayıt Değiştirme” işlemine ekledim. end. UpdateSQL1. end. Query1.Rollback. Siz diğer üç düğmeye daha ekleyebilirsiniz.Commit. except Database1.CachedUpdates:=true. Bu eksikliği gidermek için aşağıdaki gibi iki satırlık kodu eklerseniz probleminiz hallolacaktır.ModifySQL. procedure TForm4.Add('Update MAGAZA MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"').Close. 111 . begin Query1.

procedure TForm2. İkinci parametreyi yaratırsanız oda params[1] olacaktır.Clear.SQL.Clear.SQL.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'). İşin içerisine parametre değeri girdiği zaman aşağıdaki özellik ve methodlarıda öğrenmeniz gerekmektedir. begin Query1. var Key: Char). Sorgu içerisinde parametre belirlemek için “=:” karakterleri kullanılmaktadır (aslında buradaki = kendi görevini yapıyor ama beraber düşünmenizin bir sakıncası yor). Böyle durumlarda “Query” kontrolüne bana sadece göndereceğim parametre değerine uyanları listele demelisiniz.SQL.Query Kontrolüne Parametre Değeri Göndermek: Çoğu durumda tablonuzda yer alan tüm kayıtları değilde. İlk parametreyi “params[0]” veya ismi ile kullanabilirsiniz. Query1. sadece sizin işinize yarayan kayıtları listelemek isteyeceksiniz.Clear Var olan “Query” yi kapatıp tüm parametreleri temizlemek için kullanılan methoddur. Kod satırında yer alan (Where MAGAZAADI=:MAG) bölümü hem parametreyi hemde sorgu koşulunu belirlemektedir. procedure TForm2. 112 . Fakat burada hem sorguyu hemde parametreyi yaratacağımız için tekrar göstermemiz gerekiyor. • Query1.SQL. • Query1. begin if Key=#13 Then begin Query1.SQL. end. Bu işlemi yapmak hiçte zor değil.Edit1KeyPress(Sender: TObject. end. Query1.Add Bu method daha önceden anlatılmıştı. var Key: Char). Daha sonraki adımlarda bu parametreye programınızın içerisinden kolayca değer gönderebilirsiniz.Edit1KeyPress(Sender: TObject.Add('Select * from servis Where MAGAZAADI=:MAG').//parametreleri temizle end.

SQL.FormCreate(Sender: TObject). var Key: Char). Query1.Params[] Sogu komutu içerisinde yaratılan parametrelere değer göndermek için kullanılan methoddur.//temizle Query1. begin if Key=#13 Then begin Query1.Open. Query1. Query1.AsString:=Edit1.Add('Select * from servis Where MAGAZAADI=:MAG').SQL.SQL.DatabaseName:='gazi'.• Query1.Close. procedure TForm2.Text.Edit1KeyPress(Sender: TObject.Add('sELECT * fROM servis'). var Key: Char).Params[0]. procedure TForm2. Query1. procedure TForm2.Clear. Şimdi aşağıdaki tasarımı oluşturup (“Query kontrolüyle oluşturun) yukarıdaki özellik ve methodları örnek üzerinde deneyelim. begin Query1.//parametreye değer al end.Edit1KeyPress(Sender: TObject. Oluşturulma sırasına göre ilk parametre “Params[0]” ikinci parametrede “Params[1]” değişkenleriyle adlandırılacaktır. 113 . end. end.

Open. “Edit” kontrolüne mağaza ismini girip “Enter” tuşuna basın.Clear.Text.Params[0].SQL. Query1. Query1. begin Query1.ParamByName('MAG'). end.Add('Select * from servis Where MAGAZAADI=:MAG').Clear.Open.FormCreate(Sender: TObject). Girdiğiniz değer parametre olarak sorguya gönderilecek.AsString:=Edit1.Open. Query1. end.DatabaseName:='gazi'.Text. Query1. Yukarıdaki örnekte yer alan kodu aşağıdaki şekilde değiştirip uygulamanızı yeniden çalıştırın.Add('Select * from servis Where MAGAZAADI=:MAG').SQL.SQL. procedure TForm2. Query1.SQL.SQL.ParamByName('MAG'). begin if Key=#13 Then begin Query1. end. end.//parametreye değer yolla Query1. • Query1. Query1. Kodları ekleyip programızı çalıştırın.Text.begin if Key=#13 Then//enter tuşuna basarsa begin Query1. yazdığınız mağaza ismini ait kayıtlar listelenecektir.AsString:=Edit1. var Key: Char).Add('Select * from servis Where MAGAZAADI=:MAG'). Query1. Query1. end.AsString:=Edit1. Query1.Add('sELECT * fROM servis'). procedure TForm2. 114 . Query1.Edit1KeyPress(Sender: TObject.ParamByName “Params[]” değişkeni yerine bu özelliği kullanarak ta sorgunuza parametre değeri gönderebilirsiniz.Close.SQL.

Open.Text). Girdiğiniz tarihten sonra yapılmış olan tüm servisler listelenecektir.SQL. end. Query1.Edit2KeyPress(Sender: TObject.Add('sELECT * fROM servis').DatabaseName:='gazi'.SQL. Query1. Query1. var Key: Char). //Bağlantı işlemleri yapılıyor begin Query1.SQL.Add('Select * from servis Where SERVISTARIHI>=:SER'). end. Query1. Programı çalıştırıp “Edit” kontrolüne koşul tarihinizi girip “Enter” tuşuna basın. Query1. Query1. //Tarih değişkenine göre sorgula begin if Key=#13 Then begin Query1. procedure TForm2. end.Open.FormCreate(Sender: TObject).AsDate:=StrToDate(Edit2.Parametre Olarak Tarih İçerikli Değişken Kullanmak: Parametre olarak kullanacağınız değişkenin değeri tarih içerikli olacak ise o zaman kodlamanızı aşağıdaki şekilde değiştirmelisiniz. procedure TForm2.Clear.Close.ParamByName('SER'). 115 .

DatabaseName:='gazi'. Query1. 116 .Open.Close. Query1. procedure TForm2. Query1. //Bağlantı için gerekli olan kod satırları begin Query1. end. //Parametreye göre sorgula begin if Key=#13 Then begin Query1.Add('sELECT * fROM servis').AsCurrency:=StrToCurr(Edit3. Query1.Parametre Olarak Parasal İçerikli Değişken Kullanmak: Parametre değeri olarak parasal değer kullanacaksanız. aşağıdaki şekilde bir kodlama yapmalısınız.Add('Select * from servis Where FATURATUTARI>=:FAT').FormCreate(Sender: TObject). end. end.Clear.Text).SQL.Edit3KeyPress(Sender: TObject.SQL. var Key: Char).SQL. Query1.ParamByName('FAT'). Query1. procedure TForm2.Open.

Params[1].Text). Query1. Programı çalıştırıp “Edit” kontrollerine parasal içerikleri girin. procedure TForm2.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2').Clear. Aşağıdaki şekilde bir kodlama kullanmalısınız. procedure TForm2. end.DatabaseName:='gazi'.FormCreate(Sender: TObject). begin Query1.Params[0].Button1Click(Sender: TObject). Query1. Ardından “Göster” isimli buttona tıklayın.Birden Fazla Parametre Değeri Göndermek: Oluşturacağınız sorguda birden fazla parametre değeri kullanacaksanız.Open.//ikinci parametre Query1.SQL. Query1. 117 .AsCurrency:=StrToCurr(Edit3. Diğer fatura tutarlarına ait satırlar listelenmeyecektir.AsCurrency:=StrToCurr(Edit4. begin Query1. Sadece yazmış olduğunuz kriterlerin arasındaki fatura tutarları listelenecektir. Query1.Text).//ilk parametre Query1.Open.SQL.Add('sELECT * fROM servis').Close. Query1.SQL. end.

end.Add('Select * from servis Where FATURATUTARI<=:FAT').Text='' Then begin Query1. ikiside dolu olursa iki kriteride dikkate alarak sorgulama yapacağız.Clear.Open.Opsiyonel Parametreli Sorgu Oluşturmak: Bu bölümde yine sorgumuz için iki adet “Edit” kontrolü kullanacağız.SQL.FormCreate(Sender: TObject). Öncelikle aşağıdaki tasarımı oluşturunuz.Text='' Then begin 118 .AsCurrency:=StrToCurr(Edit4. Query1. Fakat içlerinden bir tanesi boş olduğu zaman diğer parametreye göre.DatabaseName:='gazi'.Text).Open. Query1. Query1. procedure TForm2. end else if Edit4.Close.Params[0]. Query1. Query1. begin Query1.Text='') and (Edit4.Text='') Then ShowMessage('Lütfen En Az Bir Parametre Giriniz') else if Edit3. //opsiyonel sorgulama begin if (Edit3.SQL. Query1. procedure TForm2.Add('sELECT * fROM servis').Button2Click(Sender: TObject).SQL.

Params[1].Params[0].Text).Query1. end. 119 .SQL. Eğer iki parametreyede değer girilirse bu defa parametre değerlerinin arasındaki fatura tutarlarının yer aldığı kayıtlar listelenecektir.Text). end. Query1. Programı çalıştırın.AsCurrency:=StrToCurr(Edit3. birinci parametre değerinin üzerinde fatura tutarı olan kayıtlar listelenecektir. Query1.Params[0]. Query1.SQL.Open. Query1.Clear. Query1. Şayet iki “Edit” kutusuda boş bırakılırsa “Lütfen En Az Bir Parametre Giriniz” uyarısı kullanıcıya iletilecektir.AsCurrency:=StrToCurr(Edit4. Query1.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2').Open. end else begin Query1.SQL. Aynı şekilde birinci kontrol boş bırakılıp ikinci parametre değeri girilirse o zaman birinci parametre dikkate alınmayarak sadece ikinci parametreye aktarılan tutarın altındaki kayıtlar listelenecektir. Şayet birinci kontrol doldurulup ikincisi boş bırakılırsa bu durumda ikinci kontrol hiç dikkate alınmayacak.Text).Add('Select * from servis Where FATURATUTARI>=:FAT').AsCurrency:=StrToCurr(Edit3.SQL.Clear. Query1.

Add('Select * From SERVIS Where MAGAZAADI Like:MAG').Add('Select * From SERVIS Where MAGAZAADI Like:MAG').SQL.AsString:=Edit1. end.Clear. Query1. Bu örnekte “G” harfine basıldığı zaman “G” ile başlayan tüm mağaza isimleri listelenmektedir (GIMA-GURALLAR-GURSOYLAR).Open.AsString:='%'+Edit1. 120 . “I” harfinede basılırsa sadece “GIMA” mağazasına yapılmış servisler listelenecektir.Edit1Change(Sender: TObject). Query1. begin Query1. Query1. Şayet herhangi bir yerinde arama yaptıracaksanız kodu aşağıdaki şekilde değiştiriniz. Bilhassa sözlük türü uygulamaların örnek gösterilebileceği bu yapı yeri geldiği zaman çok kullanışlı olabilmektedir.Text+'%'. Query1. Aşağıdaki örnekte “Edit” kontrolü içerisine girilen metin parçası “MAGAZAADI” sütunu içerisinde aratılmaktadır. end. procedure TForm2.Parametreyi “Like” Komutuyla Beraber Kullanmak: String içerikli sütunlar içerisinde metin parçası aratabilirsiniz.SQL. Query1.Clear.SQL.//% joker olarak kullanılır.Edit1Change(Sender: TObject).Text+'%'.SQL.Open. begin Query1. procedure TForm2.Params[0]. Query1.Params[0].

BÖLÜM 3 TABLOLAR ARASI İLİŞKİLENDİRME 121 .

122 .

bir çok sütuna gereksiz verileri girmiş olacaktınız. Bu iki 123 .Birden Fazla Tablo İle Çalışmak: Çok fazla sütuna sahip tablolar yerine. Dikkat etmeniz gereken hususlar olacaktır. daha az sütunlu ve fazla tablo ile (tabiiki mümkün olabiliyor ise) çalışmak performansınızı etkileyen çok önemli bir faktördür. Tabloların fazla büyümesi performansı etkileyen çok önemli bir faktördür. Şimdi aşağıdaki iki tabloyu oluşturarak. İki adet tablomuz var. ilişkili tablolarda işlemlerin nasıl yaptırılabileceğini açıklayalım. Ama genellikle statik bilgilerin yer aldığı tabloda primary. Böldüğünüz iki tablo arasında ilişki kurabileceğiniz bir sütunun muhakkak olması gerekecektir. haliylede hem sıkıcı olacaktı. Bu tablolardan birincisi mağazalara ait statik bilgilerin tutulduğu ve mağaza adının “Primary” index olarak tanımlandığı “MAGAZA” tablosu. İkincisi ise mağazalara ait dinamik bilgilerin yer aldığı ve mağaza adı sütununun “Secondary” index olarak tanımlandığı “SERVIS” tablosu. Tabloları bölme işlemi rasgeli bir şekilde yapılamaz. Ayrıca ilişki yaratacağınız sütunların iki tabloda da indexlenmesi gerekecektir. Tablo1:MAGAZA TABLOSU Fieeld Name(Sütun İsmi) MAGAZAADI ADRES TELEFON MUDUR SEHIR Type(Tipi) A A A A A 25 25 15 25 25 Size (Kaç Karakter) Key(Primary ind) * Tablo2:SERVIS TABLOSU Fieeld Name(Sütun İsmi) SIRANO MAGAZAADI SERVISTARIHI GIDENFIRMA ARIZASEBEBI FATURATUTARI Type(Tipi) + A D A A $ 25 25 25 Size (Kaç Karakter) Otomatik artar Key(Primary ind) * Secondary Index Yukarıdaki iki tablo yerine tek bir tablo yapsaydınız. dinamik bilgilerin yer aldığı tabloda da secondary index kullanmak en iyi ve doğru çözümdür (Bu tür ilişkiler Bire-Çok lu ilişki olarak adlandırılmaktadır). (Index lerin Primary veya Secondary olması önem arz etmez. hemde tablonuzu boş yere şişirmiş olacaktınız.

Bu adımda karşınıza gelen pencereden master tablonuzda. Karşınıza ilk olarak “Master” tablonuzu seçebileceğiniz pencere gelecektir. Uyarı:Paradox tablolarında “primary” index oluşturmadan “secondary” index yaratamazsınız. “File->New-Other” adımlarını izleyerek açılan pencereden “Business” yaprağını aktifleştirin. “Form Options” kısmından “Create a master/detail form” seçeneğini. Açılan pencerede. formun üzerine gözükmesini istediğiniz sütunları belirlenizi isteyecektir. “DataBase Form Wizard” seçeneğini seçip “OK” Buttonuna tıklayın.tablo arasında indexli sütunlar kullanılarak “Master-Detail” form yapısı oluşturulacaktır (ilişki yaratılacaktır).”Dataset Options” kısmından da “Create a form using Ttable object” seçeneğini işaretleyip Next düğmesine basın. 124 . Karşınıza aşağıdaki pencere açılacaktır. Aşağıdaki adımları izleyiniz. Formda gözükmesini istediğiniz sütunları “Available Field” listesinden “Ordered selected Fields” listesine aktarıp “Next” düğmesine basın (biz bütün sütunları aldık). Bu pencere aliasınızın (gazi) referans gösterdiği klasörün içerisinde yer alan “MAGAZA” tablosunu seçerek “Next” düğmesine tıklayın. Açılan yeni pencereden “Vertically” işaret düğmesini seçerek “Next” düğmesine tıklayın.

Aşağıdaki pencere açılacaktır. Açılan yeni pencereden “In a Grid” işaret düğmesini seçerek “Next” buttonuna tıklayın. Açılan yeni pencere “Detail” tablonuzdan formun üzerinde gözükmesini istediğiniz sütunları seçmenizi isteyecektir (Biz SIRANO hariç tüm sutunları dahil ettik). Bu pencereden “Detail” olarak kullanacağınız tabloyu seçmenizi isteyecektir. Karşınıza aşağıdaki pencere açılacaktır.Yeni bir pencere açılacaktır bu pencereden “Left” seçeneğini seçip “Next” düğmesine tıklayın. Next düğmesine tıklayın. “SERVIS” tablosunu seçerek “Next” düğmesine tıklayın. 125 .

Bu yapının diğer bir özelliğide var olmayan bir mağazaya yanlışlıkla servisin yapılamayacağıdır. Yukarıdaki adımlardan sonra “Delphi” sizlere “Master-Detail” içeriği olan bir form yapısı oluşturacaktır. “Detail Fields” listesinden “MAGAZAINDEX” ve “Master Fields” listesinden de “MAGAZA ADI” sütununu seçip “Add” buttonuna tıklayın. “Detail Fields” listesinde otomatik olarak gözükecektir. Çünkü “SERVIS” tablosuna kayıt girerken (DataGrid içerisinden) mağaza adını kendisi otomatik olarak belirleyecektir. Master tablonuzdan bir mağaza ismini seçtiğiniz zaman “Detail” tablonuzda (DataGrid içerisinde) sadece o mağazaya yapılmış olan servisleri listeleme şansını bulacaksınız. Bu yapıda çok önemli bir özellik barınmaktadır. “MAGAZAINDEX” (mağazaadı sütunu için tanımlanan secondary index) olanını seçin.Bu pencerede “Available Indexes” listesinde “Detail” tablosundaki tüm index ler gözükecektir. Next düğmesine basın. Haliyle kullanıcının yapabileceği yanlış isim girme işlemlerinin önüne geçmiş olacaksınız. Yarattığınız ilişki “Joined Fields” listesinde aşağıdaki gibi oluşturulacaktır. master tablodaki sütun sayısı kadar “Edit” 126 . iki adet “DataSource”. “Master-Detail” form yapısında “Delphi” sizin yerinize formunuza iki adet “Table” . “Finish” deyip wizardı bitirin.

“DataSource2” kontrolünüde “Table2” nesnesine bağlamalısınız.kontrolü ve “Detail” tablo bilgilerinizi topluca listelemeniz için “DataGrid” nesnesini yerleştirecektir. kodla veya “Object Inspector” penceresinden ayarlamalısınız(“IndexName-MasterFields-MasterSource”). Programı çalıştırdıktan sonraki ekran görüntünüz aşağıda verilmiştir. Koyu renkte yazılmış özellikleri. Söylemeye gerek yo sanırım. 127 .”Detail” tablosu için (şayet manuel olarak siz bağlantı işlemini yapacaksanız) aşağıdaki ayarları yapmanız gerekecektir. “DBNavigator” kontrolünde yapacağınız kayıt gezinti işlemleri “DataGrid” nesnesindeki kayıtların tamamen değişmesine (seçilen mağazaya ait kayıtları gösterecektir) sebep olacaktır. Master Detail Form Yapısını Manuel Oluşturmak: Burada “Master” tablo için yapılan işlem sadece paradox tablosuna bağlantıyı sağlamaktır (Table1-DataSorce1).

Master-Detail Tablolarda Kayıt Arama İşlemleri: Neredeyse bütün projelerinizde kullanacağınız bir uygulama seçeneğidir.Text.[loCaseInsensitive]). //Kayıt Bul Var ara:Boolean. Düşünün yukarıdaki “Master-Detail” yapıda herhangi bir mağazaya servis yapıldığı zaman faturayı nasıl işleyeceksiniz. Yukarıda yapmış olduğunuz form yapısına bir adet “Edit” kontrolü yerleştirerek aşağıdaki yeni tasarımı oluşturunuz. öncelikle “Master” tablodan mağazayı bulacağız.Edit1.Edit1KeyPress(Sender: TObject. kaydı da yeni bir servis olarak “DataGrid” nesnesine ekleyeceğiz. bu mağazaya göre “DataGrid” nesnesinde servisler listelenecek. begin if Key=#13 Then begin ara:=Table1. var Key: Char). procedure TForm2. Aşağıdaki kod bloğonu “Edit” Kontrolünün “OnkeyPress” yordamına ekleyiniz. if ara=false Then begin 128 .Locate('MAGAZAADI'. İzah edelim.

Bilgisayarın yaptığı işlemse “MIGROS” mağazasını “Master tabloda aktifleştirmek. end end. “Master” tablonuz o mağazayı gösterecek. Hatırlatma:”Master-Detail” tablo yapısında iki tabloda da ilişkilendirilecek olan sütunları index olarak tanımlayın. arkasından ona bağlı olarak çalışan “Detail” tablosunda da “MIGROS” mağazasına yapılmış olan servisleri listelemek olmuştur. “Detail” tablonuzda o mağazaya ait yapılmış servisleri listeleyecektir. end. Ardından aradığınız mağaza ismini girip klavyeden “Enter” tuşuna basın. Yukarıdaki örnekte “Edit” kontrolü içerisine aradığımız mağaza ismi olarak “MIGROS” değerini girip “Enter” tuşuna bastık. Programı çalıştırın. Gireceğiniz faturayı DataGrid nesnesinin en son satırına ekleyebilirsiniz.ShowMessage('Kayıt Bulunamadı'). 129 . Aksi takdirde uygulamada bir çok sıkıntı yaşayabilirsiniz. Çalıştırıldıktan sonraki form görüntüsü aşağıda verilmiştir.

Bağlantı işlemlerinde kullanacağınız extra özellikleri aşağıda verilmiştir. 130 . Şimdi bu işlemleri nasıl yapabileceğinizi detaylı olarak izah etm