Anda di halaman 1dari 138

1

nsz
ncelikle unu belirtmeliyim ki Microsoft Visual C++ programlama dilinin renmeye balamadan nce bu kadar karmak bir dil olduunu sanmyordum. Microsoft Visual C++ ile program yazmak, dier programlama dillerine nazaran daha karmak gzkmektedir. Bu yzden programclarn ilk tercihi deildir. Genelde programclarn ilk tercihi Visual Basic veya Delphi gibi tam anlamyla nesneye dayanan programlama dilleridir. zellikle Visual Basic dili esnekliiyle ok kolay yazlabilir bir programlama dilidir. Fakat bir programlama dilinin esneklii onun iyi bir dil olduunu gstermez. Bir programlama dilinde yazlabilirliin yannda yaplabilirlik veya baka bir deyile neyi ne kadar yapabileceiniz ve ne kadar kiiselletirebileceiniz nemlidir. Bir Visaul Basic ve Delphi programcs olarak, bu programlama dillerinde yaplabileceklerin kstl olduunu grdm. Fakat Microsoft Visual C++ size vermi olduu nesnelere kadar tm yapy kendi isteinize gre dzenleme imkan sunmaktadr. Visual C++ renme istei nedenlerinin en nemlisi budur. Benim iinde kiiletirebilme, dzenleyebilme ve yapabileceklerinizin snrsz olmas ok nemlidir. Microsoft Visual C++ programlama dili ok karmak grnmesine ramen adm adm ilerlendiinde o kadarda zor olmad grlecektir. Program yazarken dikkat etmeniz gereken eylerden en nemlisi zaten karmak bir dil olan Microsoft Visual C++ dilini belli standartlarda yazlmam kodlarla kartrmamaktr.

zet
Microsoft Visual C++ programlama dilinin bir ksmnn genel bir anlatmn iermektedir. Neden bir ksmnn genel bir anlatm?. nk, Visual C++ ne bir kitapla nede be kitapla anlatlacak bir dil deildir. Burada az ok C bilgisi olan kiilerin Visual C++ programlama diline gei yapabilecekleri kadar bir bilgi anlatlmakta. Nesneye ynelik bir dilin kullanm ve veritabann bu dilde kullanma genel olarak anlatlmtr. imdi blm ieriklerinin neler olduunu ksaca bakalm. Blm 1: Visual C++ nedir, nasl alr, alma ortam nasldr, basit bir proje nasl oluturulur ve nasl derlenir, operatrler, deyimler, dngler, iaretiler, bavurular vs. anlatlmtr. Bu blmde program yazarken kullanacanz bir ok komut greceksiniz. Bu yzden bu blm ok nemlidir. Anlatlanlarn mutlaka alma ortamnda denenmesi gerekir. Blm 2: Bu blmde Visual C++ nesnelerinin bir blm anlatlmaktadr. Dme kontrolleri, Dzenleme kontrolleri, Liste kontrol vs. anlatlmtr. Nesneye dayal olan bir dile en nemli eyler nesneler yani kontrollerdir. Kontrollerin destekledii zellikler ve bu zelliklerin kullanl ok nemlidir. Bu blmde nesnelerin zellikleri ve kullanllar anlatlmaktadr. Blm 3: Bu blmde nesnelerin yaplarnn tanmlad snflar anlatlmtr. C programlama dilinde snf yaps yoktu snf yaps C++ ile gelmitir. Her nesnenin bir snf vardr. Bu snf ierisinde fonksiyon ve nesneye ait zelliklerin tanmlar ve ilevleri kodlanmtr. Biz bu blmde bir snf nasl oluturulur ve snf yapsnn kullanm hakknda bilgi vereceiz. Blm 4: Bu blmde Visual C++ ile veritaban kullanm hakknda bilgi alacaksnz. Veri taban seimi, karlatrmalar, MFC ve ODBC, veritabanna balant kurmak, veri ekme ve zerinde oynama, veri kaydetme bu blmde anlatlmtr. Blm 5: Bu blmde ise renmi olduumuz bilgileri kullanarak bir Adres Defteri projesini adm adm oluturmak bulunmaktadr.

Giri
C++, ilk olarak 1979 ylnda New Jerseyn Murrey Hill blgesinde bulunan Bell Labaratuarlarnda Bjarne Stroustrup tarafndan oluturuldu. Ona ilkin snfl C ad verildi. 1983 ylnda C++a evrildi. O gnden bu gne C++ evrim geirdi. Bunlardan ilki 1985, ikincisi 1990 ylndadr. ncs ise C++n standartlatrlmas srasnda meydana geldi. Birka yl nce C++ standartlatrmak iin bir alma balatld. O zamanlar ANSI ile ISO birleerek bir standartlatrma komitesi oluturdu. Teklif edilen standardn ilk tasars 25 Ocak 1994te yapld. Bu tasarda ANSI/ISO C++ komitesi, Stroustrup tarafndan tanmlanan zellikleri korudu ve bunlara baz yeni zellikler ekledi. Fakat bu ilk tasar C++n o zamanki durumunu genel olarak yanstmaktadr. lk tasarnn hemen ardndan standardn ok geni bir ekilde yaylmasna neden olan bir olay meydana geldi: Alexander Stepanov tarafndan Standart ablon ktphanesi oluuturldu. STL, verileri ilemek iin kullanabileceimiz genel bir rutinler kmesidir, gl ve sekindir. Fakat ayn zamanda olduka byktr. lk tasardan sonra komite C++n STLyi iermesine karar verdi. STLin eklenmesi ile C++ ilk tanmlanan snrlarn at. unuda belirtmek gerekir ki, STLin eklenmesiyle C++n standartlatrlmasnda bir yavalama ortaya kt. Visual C++, C++ ile program yazmak zere donatlm, grsel ynelimli bir yazlm gelitirme ortamdr. C++ ya da C dilinde yazlmas olas olan her trl program Visual C++ ile yazabilirsiniz. C++, Cnin st kmesidir. C dilinin gelitirilmesi ile oluturulmutur. Bu dil Cnin kapsamakta olduklarna ek olarak nesneye dayal programlamay da (OOP Object Oriented Programming) destekler.

BLM 1 : Visual C++a Giri Visual C++ Nedir ................................................................................. 5 Visual C++ Ortam ve Proje Oluturma .............................................. 6
Visual C++ altrmak ve Visual C++ Ortam ....................................... 6 Visual C++ta Yardm Almak .................................................................... 6 Projeler ve alma Alanlar ...................................................................... 7 Projeler ..................................................................................................... 7 alma Alanlar ....................................................................................... 7 Projenizle almak .................................................................................... 7 Bir Proje Oluturmak ................................................................................ 7 alma Alan Penceresini Kullanmak ..................................................... 8 Proje Dosyalarn Eklemek ve karmak ................................................. 9 Kaynak Kodunu ve Kaynaklar Dzenlemek ........................................... 9 Proje Yapsn Belirtmek .......................................................................... 9 Projenizi Oluturmak ................................................................................ 9 Projeyi altrmak ................................................................................... 10 MERHABA PROJEMZ OLUTURALIM ............................................. 10

VSUAL C++ TEMELLER ............................................................... 12


C++ Aklamalar ....................................................................................... nilemci Ynergeleri ............................................................................... C++ Deimezleri ...................................................................................... C++ Anahtar Szckleri ............................................................................. Hazr Bilgiler .............................................................................................. Deyimler ..................................................................................................... Deikenler ve Veri Trleri ........................................................................ Diziler ......................................................................................................... Deikenler in Bellek Ayrmak ............................................................... levler (Fonksiyonlar) ve Parametreler ..................................................... main ilevi ................................................................................................... fadeler ve leler ...................................................................................... C++ Denetim Deyimleri ............................................................................. 12 12 13 13 13 13 14 16 17 17 18 19 21 if Deyimi ................................................................................................... 21 while Deyimi ............................................................................................ 21 do while Deyimi ....................................................................................... 22 for Deyimi ................................................................................................. 22 switch Deyimi ........................................................................................... 23 iostream Araclyla C++ Girdi/ktlar .................................................. 25

aretiler ve Bavurular ...................................................................... 26


aretiler .................................................................................................... 26 areti Temelleri ...................................................................................... 26 areti ve Diziler ...................................................................................... 28 areti ve Dizeler ..................................................................................... 29 Bavurular .................................................................................................. 30

st Bilgi ve Gerekletirme Dosyalar ................................................ 32

Visual C++ Nedir?


Visual C++, C++ ile program yazmak zere donatlm, grsel ynelimli bir yazlm gelitirme ortamdr. C++ ya da C dilinde yazlmas olas olan her trl program Visual C++ ile yazabilirsiniz. C++, Cnin st kmesidir. C dilinin gelitirilmesi ile oluturulmutur. Bu dil Cnin kapsamakta olduklarna ek olarak nesneye dayal programlamay da (OOP Object Oriented Programming) destekler. C++ dilinin pek ok zellii bir ekilde OOP ile ilgilidir. Fakat unu anlamalyz: C++, nesneye dayal olan ve olmayan programlar yazmak iin kullanabiliriz. Onu nasl kullanacamz tamamen bize baldr. MFC, Visual C++ kullanarak Windows uygulamalar yazmak iin yelenen yoldur. MFC, zelletirmeniz iin hazr olan, iler durumdaki bir sosyal windows uygulamalarndan oluan, C++ snflarnn bir kmesidir. Balang dosyalar kmesi oluturan MFC AppWizard ile ie balarsnz. Daha sonra uygulamanz esiz yapan zellikleri gerekletirecek kodlar eklersiniz. Ksaca MFC hazrlanm kod ktphanesidir.

Visual C++ Ortam ve Proje Oluturma


Visual C++ altrmak ve Visual C++ Ortam
Visual C++ ykledikten sonra, program Windows balat mensnden altrabilirsiniz. Aada Visual C++ program ekrann bir grnts bulunmaktadr.

Menler

Ara ubuklar

alma Alan alma Alan Kontrol Penceresi MFC Standart Nesneleri

ekil 1.1 Microsoft Visual C++ Ekran Grnts Visual C++ altrdktan sonra, yeni bir proje balatmanz ya da var olan bir projeyi yklemeniz gerekmektedir. Proje nasl oluturulur veya nasl alr bunu daha sonra ele alacaz. imdi Visual C++ programndan yardm almak iin ne yapmamz gerekiyor buna bir gz atalm.

Visual C++ta Yardm Almak


Visual C++ pogramnn gelimi bir yardm alma sistemi vardr. Visual C++ta programlama yaparken yardm almann drt yolu vardr. F1 Help, Bu yardm almann en hzl yoludur. Bir szc tklayarak, bir tmceyi vurgulayarak yada bir hata iletisini tklayarak F1 tuuna basmak yeterlidir. Seilen konu hakkndaki yardm metni karmza kacaktr.

7 Help dizini, Help dizinde aradnz konular balklar arasnda veya alt balklarnda dzenli bir ekilde bulunmaktadr. Tm metni arama dzenei, aradnz bir kelimeyi tm yardm konularnda bulmanz salar. indekiler, Helpin ayrntl bir iindekiler tablosu vardr. indekiler ksmn kullanmak bir kitap okumak yada gzden geirmek gibidir.

Projeler ve alma Alanlar


Visual C++ta bir alma alanna birden ok proje yerletirmek mmkndr. Projeler: Yeni bir programa baladnzda, ilk yapacanz i File mensnden New komutunu seerek onun iin bir proje yaratmaktr. Proje dosyas, programnzn hangi kaynak kod dosyalarn ve kaynak dosyalarn kulland ve Visual C++n programnz oluturma biimini denetlemek iin belirttiiniz tm ayarlar hakkndaki bilgileri salar. Visual C++ oluturma sistemi, altrlabilir bir program yaratmak iin dosyalarnz derleyip balantlandrrken bu bilgiyi kullanr. alma Alanlar: Bir proje oluturduunuzda , varsaylan deer olarak birde alma alan dosyas oluturulur. Bu dosya projeismi.dsw dosyasdr. Bu dosyada Visual C++ pencerelerinin ak olduunu ve konumlarn ayrca alma alan iin belirttiiniz ayarlar tutulmaktadr.

Projenizle almak
Uygulamanz gelitirmek iin u admlar izlemeniz gerekecektir. Bir proje yaratn. Bu, almalarnzn temelini oluturacak ilk dosyalar yaratacaktr. Projenizdeki dosyalar ve kaynaklar kontrol edebilmek iin alma alan penceresini kullann. Projeye dosyalar ekleyin yada karn. Projedeki kaynak kodunu ve kaynaklar dzenleyin. Proje iin bir oluturma yaplandrmas belirleyin. Projeyi oluturun (derleyin). Projeyi altrn imdi bu admlar balklar altnda inceleyelim. Bir Proje Oluturmak Bir proje oluturmak iin aadaki admlar yapmanz gerekir. 1. 2. 3. 4. File mensnden New dmesini tklayn. New iletiim kutusu alacaktr bu kutudan Projects sekmesini tklayn. Burda Projeler 16 tr olarak listelenmektedir. Bu listeden istediini proje trn sein. Project Name kutusuna projenin ismini yazn.

8 5. Location kutusuna projenizi oluturacanz dizini girin. Dizini belirtmek iin Browse dmesini kullanabilirsiniz. 6. Create Workspace seneini sein bu sayede yeni bir alma alan oluturulacaktr. Daha sonra istediiniz ayarlar yapabilmek iin options ve customize iletiim kutularn kullanabilirsiniz. 7. Platforms kutusunda Win32nin seili olmasna dikkat edin. 8. OK dmesini tklayn. 9. Alan sihirbazda istediiniz seeneklede projenizi oluturabilirsiniz. Visual C++ size hazr bir proje oluturacaktr. Siz bu proje zerinde dzenlemeler yaparak kendi projenizi oluturacaksnz. Yeni bir proje oluturup bunlarn zerinde dzenleme yapmay Merhaba projesinde ayrntl olarak anlatacaz. Visual C++ Location kutusnda semi olduunuz dizine gerekli kaynak dosyalarn oluturmu olmaldr bu dosyalar incelemek ve dzenleme yapmak iin alma Alan Penceresini kullanmay renmemiz gerekecek. alma Alan Penceresini Kullanmak

ekil 1.2 alma Alan Penceresi alma Alan Penceresinde 3 Sekme bulunmaktadr. ClassView Sekmesini Kullanmak: Projenizdeki C++ snflarndan birinin listesini grmek iin Workspace (alma Alan) penceresindeki ClassView sekmesini tklayn. ClassView araclyla yeni bir snf eklemek iin, CalssViewda en stteki bal farenin sa tuuyla tklayn. Grntlenen ierik mensnden New Class sein. Yeni bir snf oluturmak iin bir iletiim kutusu alacaktr bu iletiim kutusuyla snfnz oluturabilirsiniz. FileView Sekmesini Kullanmak: Kaynak kodu dosyalarn (.cpp), stbilgi dosyalarn (.h) ve kaynak dosyalarn (.rc) ieren klasr kmesini grmek iin WorkSpace penceresinden FileView sekmesini tklayn. Bu listeden istediiniz dosyay ift tklayarak grntlenmesini salayabilirsiniz. ResourceView Sekmesini Kullanmak: Menler, iletiim kutular, formlar, ara ubuklar, simgeler ve iconlar burda listelenmektedir. Yaptnz seime gre yap alma alannda gsterilecektir.

Proje Dosyalarn Eklemek ve karmak Projeler genellikle 3 eit kaynak dosya tr ierir. st bilgi dosyalar (.h uzantl), kaynak kodu dosyalar (.cpp uzantl) ve kaynak dosyalar (.rc uzantl). imdi bu dosyalar Projenize ekleme nasl yaplyor buna bakalm. Yeni bir .h, .cpp dosyas eklemek iin File mensnden New seeneini sein. New iletiim kutusunun Files sekmesini setikten sonra .h dosyas iin Header File, .cpp iin Source File dosya tipini sein eklemek istediiniz projeyi sein eer o anda altnz projeye eklemek istiyorsanz Add to Project seeneini semeyin. File Name kutusuna dosya ismini yazn ve kaydetmek istediiniz dizini location kutusuna girin ve OK tklayn. Varolan bir dosyay eklemek iin Project mensnden Add to Project seeneini ve Files seeneini sein. Alan dialog penceresinden dosyanz seip OK tklayn. Bylece dosyalarnz projenize dahil edilecektir. FileView listesine dosyanzn eklendiini greceksiniz. Dosya silmek iin, FileView listesinde silmek istediiniz dosyay sein ve Delete tuuna basn. Kaynak Kodunu ve Kaynaklar Dzenlemek C++ kaynak kodunu dzenlemek, Kodunu dzenlemek istediiniz dosyay FileView penceresinde ift tklayarak an. Dosyanz Source Code dzenleyicisinde alacaktr. Source Code dzenleyicisi, pogramdaki eitli sz dizim elerini, kayak dosyalarnn daha kolay okunabilmesini salayan renklerle otomatik olarak kodlar. Bu sayede kaynak kodlarnzn okunabilirlii artmaktadr. Kaynaklar dzenlemek, Kanaklar dzenlemek iin ResorceView listesinden dzenleyeceiniz yapy semelisin bu bir men, toolbar, iletiim kutusu vs. olabilir. Her bir kaynak tr iin farkl bir dzenleyici vardr. Bu dzenleyiciler sayesinde yapnz istediiniz gibi dzenleyebilme imkannz vardr. Proje Yapsn Belirtmek Programnz gelitirirken genellikle Debug build yapsyla alacaksnz. Debug ve Release oluturmalar arasnda gei yapmak iin projenizin etkin yapsn deitirmeniz gerekir. Bunu yapmak iin Build mensnden Set Active Project Configuration iletiim kutusunu an. Bu kutudan Win32 Debug yada Win32 Releasei sein. Sonra OK tklayn. Projenizi Oluturmak Projeyi oluturmak derlemek ve exe dosyas haline getirmektir. Visual C++, programnz tek bir komutla derleyip balamanza olanak salayan bir oluturma sistemine sahiptir.

10 Projeyi oluturmak iin Build mensnden projead.exeyi tklayn ya da F7 tuuna basn. Program size projenizi derleyip Debug klasrne kaynak dosyalarla birlikte exe dosyanz oluturacaktr. Projeyi altrmak Projeyi altrmak iin Build mensnden Execute projead.exe komutunu sein ya da Ctrl + F5 tularna basn. Projeniz altrlarak ekrana gelecektir. imdi rendiklerimizi uygulamak ve gerek bir proje zerinde almak iin Merhaba isimli projemizi oluturalm.

MERHABA PROJEMZ OLUTURALIM


Merhaba isimli projemizi oluturup imdiye kadar anlattklarmz uygulamak iin aadaki ilemleri adm adm uygulayn. Program oluturmak iin File mensnden New komutunu sein. Alan New iletiim kutusundan Projects sekmesini sein. 16 Proje tr iinden Win32 Console Application proje trn sein. Project Name kutusuna Merhaba girin. Program oluturmak istediiniz dizini Location kutusuna girin. Create new workspace seili olduuna dikkat edin. Platforms liste kutusundan Win32 seeneinin seili olduundan emin olduktan sonra OK butonuna tklayn. Alan tek admlk sihirbazda An emty projecti sein ve OK tklayn. Proje doyalar hakknda bilgi veren New Project Information penceresini inceledikten sonra OK tkayarak projenizi oluturun. Proje oluturma sihirbaznda girmi olduunuz dizine 3 dosya ve Debug klasr oluturduunu greceksiniz.

imdiye kadar yapm olduumuz admlarda projemizin ana yapsn oluturmu bulunmaktayz imdi yapmamz gereken, projemizin yapaca ilevi kodlayarak projemize ilave etmek. Bunun iin yeni bir kaynak kodu dosyas oluturmalyz. Dosyay oluturmak iin aadaki admlar uygulayn. File mensnden New komutunu sein. Alan New iletiim kutusundan Files sekmesini sein. 13 Dosya tipinden C++ Source File dosya tipini sein. Add To Project seeneini setikten sonra. Merhaba isimli projemizi sein. File Name kutusuna Merhaba.cpp girin. Dosyay kaydetmek istediiniz dizini sein. Projeyle ayn dizinde olmas sizin iin faydal olacaktr. OK butonuna basarak Merhaba.cpp dosyanz oluturup projenize ekleyin.

OK butonuna tkladktan sonra Merhaba.cpp dosyanz projenize eklenmi olacaktr. imdi bu kaynak dosyamza gerekli olan kodlar gireceiz. Aadaki kodu Merhaba.cpp dosyasna girip dosyanz kaydedin. Noktal virgl iaretlerine dikkat edin.
// Merhaba Program in Kaynak Kod Dosyas #include <iostream> using namespace std; int main() {

11
cout << Merhaba Bu Ilk Programimiz << endl; return 0; }

Kaynak dosyamz oluturduumuza gre imdi projemizi derleyip altrabiliriz. Projemizi derlemek iin aadaki ilemleri yapn. Build mensnden Build Merhaba.exe komutunu sein ya da F7 tuuna basarak projenizi derleyin. Hata penceresinde Merhaba.exe - 0 error(s), 0 warning(s) yazsn grdyseniz projeniz hatasz derlenm demektir. Projenizde bir hata var ise kaynak kodu tekrar kontrol edin yazm hatas yapm olabilirsiniz. Projeyi altrmak iin, Build mensnden Execute Merhaba.exe komutunu sein ya da Ctrl + F5 tularna basn. Projeniz MS-DOS ekrannda alarak Merhaba Bu Ilk Programimiz yazsn gsterecektir.

Kk bir program oluturup altrmay rendik. imdi C++ temel elerini renelim.

12

VSUAL C++ TEMELLER


Bu ksmda C++ programlama dilinin en ok kullanlan elerini ele alacaz. Yazm kurallarndan, deikenlere, dizilerden dng ifadelerine bir ok eyi renmi olacaksnz. Aada bu eler listelenmitir. C++ aklamalar st bilgi ve kitapklar iermek iin kullanlan nilemci ynergeler C++ deimezleri C++ anahtar szckleri Hazr bilgiler Deyimler Deikenler ve veri trleri Diziler Deikenler iin bellek ayrmak levler (Fonksiyonlar) ve parametreler main ilevi fadeler ve ileler C++ denetim deyimleri Iostreamler araclyla C++ girdi/ktlar

C++ Aklamalar
Aklamalar programnzn okunabilirliini artrmak ve daha sonra dzenleme yaplabilecei dncesiyle kodlar arasna konulan notlardr. Aklamalar (//) iki eri izgiden sonra yaplr.
// Bu C++ta bir aklamadr.

Aklamalar bir kod satrndan sonrada yaplabilir.


Char* szCpp = C++; // Deiken Bildirimi

Birden fazla satrl aklamalar yapmak iin aklama satrnn bana /* sonuna ise */ iaretleri konmaldr.
/* Aklama iki satrda */

nilemci Ynergeleri
nilemci, derleyiciden nce alan bir programdr. Derleyici, aadakiler gibi nilemci ynergelerine bakar.
#include <iostream.h> #define Numara 1

13 include komutu ile bir dosya kaynak kodu dosyalarna ilave edilir. Bir dosyay dahil etmenin amac, orada tanmlanan ilevleri, snflar, deikenleri ve dier kod elerini kullanmaktr.

C++ Deimezleri
Bir #define ynergesi, nilemciye, program dosyalarnn her yerinde simgeyi deeriyle deitirmesini syler. Tanmlama aadaki kod satrndaki gibi yaplr.
#define Numara 1 // Numara deikenin deeri bir olacaktr

C++ta deimezlerin (sabitlerin) tanmlanmasnn dier bir yolu ise const komutunun kullanlmas ile yaplr.
Const int Numara = 1;

Bu komut satr Numara adnda bir deiken oluturur bu deikenin deeri ise 1dir.

C++ Anahtar Szckleri


C++, kendi kullanm iin baz tantclar ayrr. rnein for, if ve int birka anahtar szcktr. Deikenler, ilevler gibi eyler iin anahtar szcklerini ad olarak kullanamazsnz.

Hazr Bilgiler
Hazr bilgiler deimezlerdir ve bellekte saklansalar da, adreslerine eriemezsiniz. C++ta, yazdrlamayan karakterleri temsil edebilirsiniz. \n yeni satr \t yatay sekme \v dikey sekme \b geri tuu \r satr ba \\ ters eik izgi \ tek trnak \ ift trnak

Deyimler
Noktal virgl imiyle biten tek bir bildiri, komut ya da hesaplamadr. nilemci ynergeleri bu trde deyimler deildir.
const char* PROGRAM_ADI = Microsoft Visual C++; char* szVersion = 6.0;

lk komut satr PROGRAM_ADI isimli bir sabit (deimez) tanmlyor ve deer atamas yapyor. kinci satrda ise szVersion isimli bir deiken oluturuluyor deeri veriliyor. Bu iki komut satr C++ iin deyimlerdir.

Deikenler ve Veri Trleri

14

Bir deiken (variable), bellekte programn bilgi saklamas iin adlandrlm bir blgedir. Deikenleri isimlendirirken tutaca deere uygun bir isim vermeniz programn okunabilirliini artracaktr. rnek bir deiken tanm aada gsterilmitir.
char* szVersion = Version 6.0;

Derleyici bu komut satrn grdnde bellekte bir alan ayracak bu alan szVersion deiken ismiyle adresleyecektir. Bir deikende en nemli ey trdr (type). Burada szVersion char (Karakter Dizini) trndedir. Veri trleri aada gsterilmitir. Tr int, long, short
int n; long l; short s;

Aklama Tam say veri trleridir. Visual C++ dilinde, int ve long 4 byte ve short 2 bytedr.

char
char c; char* string;

1 bit tamsay tr olan char, karakter verisi saklar. Temsil ettii karakter iin char deikeninin ierii saysal ASCII kodudur. Tamsay tr olsa da, Boolean gibi davranr. Olas deerler True yada False dir. Kesirli saylar saklayabilirler. float 4 bit double ve long double ise 8 bittir.

bool
bool b;

float, double, long double


float f; double d; long double ld;

Tablo 1.1 Veri Trleri Bu veri trlerinin bana unsigned deyimi konursa pozitif deerleri tutarlar. Bu veri trlerine ek olarak aadaki trler vardr. Bu tabloda ayrca veri tr oluturmak iin dier yaplar gsterilmitir.

Tr

Aklama

15 Enum
enum renk { Kirmizi Beyaz Mavi = 25 }

Numaralandrlm tr. C++ta enum gerek tr belirleyicidir. Solda bulunan renk tr gibi bir enum, renkler, haftann gnleri, vb. ilgili deimezleri belirlemenizi salar.

struct
struct Ogrenci { char* szAd; int nYas; };

C++ dilinde, bir struct ya da yap tam oturmu veri trdr. Yaplar snflara cok benzer.
Ogrenci myOgrenci; nt age = myOgrenci.nYas;

typedef
typedef double para typedef char* string ..................... para myMaas; string szName;

Var olan trlerden kendi adlarnz oluturmak iin typedef kullanlr. Typedef kodlarnz daha okunabilir yapmak iindir.

pointer reference class array character string

aretiler Bavurular Snflar Diziler Karakter Dizinleri

Tablo 1.2 Veri Trleri Oluturmak in Yaplar Deiken Adlandrlrken Kullanlan Dzenler Hungarian notation kullanarak yaplan deiken isimlendirmesi ok yaygndr. Bu isimlendirme eklinde deikenin veri trnn bir parasn deiken ismine ekleme ile yaplr.
int nYas; char* szAd;

nYas isimli deikenin int tipte bir deiken olduunu bandaki n harfinden anlyoruz.

Aada hangi isimlerin verildii gsterilmitir.

16

Hungarian rnek Veri Tr b bool yada BOOL by BYTE c ya da ch char d ya da dbl double f ya da fl float fn function L ya da l long n ya da i int p pointer sz sfr snrl dizin str MFC String nesnesi ar array pt point rect rectangle wnd window Tablo 1.3 Veri Trlerine Gre simlendirme Ekleri

Diziler
Belirtilmi tipteki bir ok eyi ierebilen deikenlere dizi denir. Dizi bildirimi aadaki gibi yaplr.
int arInts[10]; //arInts isminde dizi tanm

Burada arInts isminde 10 boyutlu bir dizi deikeni tanmlanmtr. Dizi deikenleri indexi 0dan balayan ve belirtilmi boyutta deer saklayabilen deikenlerdir. rnek olarak 5 elemanl bir diziye 1den 5e kadar deer atamas yapalm.
int arInts[5]; for (int i=0: i < 5: i++) { arInts[i]=i+1; }

Bu komut satrlarnda for dngs sayesinde 5 defa komut ilenir her seferinde i deikenin deeri bir artrlr ve inin bir fazlas deikene aktarlr. Bu sayede dizimize 1den 5e kadar deer atam oluruz. ok boyutlu dizi tanmlamas aadaki gibi yaplr.
int arInts[5][5];

Bu tanmlama ile arInts isminde 5e 5 bir dizi tanmlanm olur. Bu sayede 5e 5 bir matrisi bu dizide saklayabiliriz.

Deikenler in Bellek Ayrmak

17 C++ dili tanmlamalarnza gre bellekte otomatik yer ayrr. rnein Version 6.0 dizinindeki her karakter ve bir tanede bo karakteri sonlandrmak iin toplam 12 bit ayrr. Her alan programn gerek duyduu bellek iin kullanlabilir iki bellek havuzu vardr. Yn, sistemin kulland geici bellek alandr. Aslnda yn, bir karalama defteri ya da ksa vadeli bellektir.Ynda veriler en ste yerletirilir ve alrken hep stten alnr. Ynlar, son giren ilk kar veri yaplardr. Son itilen e, ilk kan edir. C++, ynlar ounlukla ilev arlar iin kullanr. lev arldnda, eitli eler ynn stne itilir. levin bittii zamanki dn adresi, ileve geirilen parametrelerin tm, ilevin verdii sonular ve hatta ilevde bildirilen yerel deikenler ynn stne yerleir. Dolaysyla, ilev a, ilev Cyi aran ilev Byi ardnda, yn byr. levlerin her biri dndke, ynda o ileve ait eler silinir. Yn klr. Kme, daha kalc bir saklama alandr. Ona, uzun zamanl bellek de diyebiliriz. Program, C++ new ilecini kullanarak kme bellei ayrr. New ilecine bir ar, istenilen bellei ayrr ve ona bir iareti gnderir. Bir deikende, gerek duyduunuz srece iaretiyi ortalkta tutabilirsiniz. Kmede bellek ayrmak iin, aadaki rneklerde olduu gibi new ilecini arn.
int* pInt = new int; int* arInt = new int [10]; // Kmede tek bir tamsay // Kmede tamsay dizisi

new ileci, belirli bir tipteki nesne iin yeterli bellek ayrr ve ayrlm bellee bir iareti gnderir.

levler (Fonksiyonlar) ve Parametreler


Bir ok dilde olduu gibi C++ dilinde, ilev, programn yapt baz nemli ilemleri korur. levler, programn eitli yerlerinden defalarca arabileceiniz. znel ve bamsz kod ynlardr. Hatta bazen bir ilevi dier progralarda da yeniden kullanabilirsiniz. levler, birka deiik trde olabilir. Baz ilevler parametreler (Parameters) alr. Bazlar almaz paramatreler, ileve geirdiiniz ve ilevin almasnn temelini oluturan deerlerdir. Parametreler, eitli girdi verisi zerinde ilem yapmay geerli klarak, ilevin daha genel amal yaparlar. Baz ilevler sonu (Result) dnm yapar, bazlar yapmaz. C++ dilinde, sonu dnm yapsalar da yapmasalar da bunlarn tmne ilev denilmektedir. levlerin tanm aadaki gibi yaplr.
bool NumberContol (char* szTo, int nCalc);

Yukardaki komut satrn inceleyecek olursak. bool, fonksiyondan geri dnecek olan parametrenin tipidir. NumberControl, fonksiyonun ismidir. Parantez iindeki tanmlamalar ise fonksiyona gnderilen deerleri alan deikenlerin tanmdr. Geriye bir deer dndrmeyen fonksiyonlar tanmlanrken bool yerine void yazlr. Genellikle, bir ilev herhangi bir veri tipinde sonu alabilir. Ayn zamanda ilev, bir pointer (iareti), ya da reference (bavuru) dndrebilir.

18 Return anahtar szcn kullanarak bir sonu alabilirsiniz. Sonu veren bir ilevde, return armalsnz ve doru tip deerini sonu olarak belirtmelisiniz. rnein;
int MyFunction() { return 3; }

Ayn zamanda, sonulanmayan return ilevleri de kullanabilirsiniz. Bu durumda dn deerini belirtmiyorsunuz. Returnn kullanmnn amac, bir ey yanl olduunda bunu erken fark etmek ya da ilevin yrtme gerekmeyen ksmn belirtmektir.

main ilevi
C++ programlarnn hepsi, main adndaki ilevi yani fonksiyonu ileyerek balar. C++ dilindeki main ilevi, her zaman main ad olsada yazdnz zel bir ilevdir. Programn ileyi srasn grmek iin kk bir program yazalm ve bu program satr satr inceleyelim.
int main ( int argc, char* argv[]) { char* szCpp = C++!;

// Deiken bildirimi ve deerinin atamas.

// Boolean sonucu olan bir ilevi arn if (SayHello(szCpp, 2)) { // Sonucu olmayan bir ilev arn SayGoodBye(); } return; }

Bir programn yrtme aamalarn grmeye alalm. 1. C++ baz n hazrlklar yapar. 2. main yrtmeye balar. 3. main, szCpp deikenini bildirir ve sfrlar. Bu, program ynnda szCpp iin bellek ayrr. Bellein toplam miktar, sfrlama dizininin uzunluu ile belirlenir. 4. main, SayHello ilevlerini arr. SayHellonun parametreleri SayHellonun dndrlm sonucuyla (bir bool) birlikte yna yerletirilmitir. 5. SayHello, ilk nce bir ileti yazdrrarak ve sonrada nCalc ilgilendiren deyimi deerlendirip son olarak o deerlendirmenin sonucunu maine dndrerek yrtr. 6. Bu arada mainde SayHellenun sonucu olan boolean deeri, if deyimine koul olarak kullanlr. SayHello, true (doru) dndrrse, if deyimi ktnn iindeki deyim, SayGoodBye ilevine ar yrtr. SayHello, false (yanl) dndrrse, if deyimin gvdesi atlanr. 7. Bu durumda, SayGoodBye, ileti yazdrarak yrtr. Yna yerletirilecek parametreler, yerel deikenler ya da ilev sonular yoktur. Ancak yrtmenin SayGoodBye arldktan hemen sonra main ilevine dnebilmesi iin bi dn adresi saklanr. 8. Bu arada main ilevinde, SayGoodBye dndnde if deyimi tamamlanr ve if deyiminin kvrml kapama ayralaryla karlalr.

19 9. main ilevi return 0 deyimine vardnda, ilev her eyin yolunda gittiini iaret eden 0 deerini dndrr ve bu program biter. Sorun km olsayd, main ilevi baka bir deer dndrebilirdi.

fadeler ve leler
fadeler Deikenler ve saylar arasnda matematiksel ve mantksal ilikiye ifade denir. Aada birka ifade rnei gsteriliyor. ( nCalc + (nCalc * 2 )) < (24/nCalc) //alt ifade 1 < alt ifade 2 Alt ifadelerden her biri, bir sayya ulaan aritmetik bir ifadedir. leler (Operatrler) Saylar arasndaki ilikiyi belirleyen iaretlere ile denir. Ayrca ileler matematiksel ilemleri yapmak iin kullanlr. ki ifadeyi karlatrmak ve deer atamak iin kullanlan ilelerde vardr. C++ ta kullanlan bir ok ile aadaki tabloda rnekleriyle gsterilmitir. le Kategorisi Aritmetik + * / % < > <= >= == != && || ! i++ ++i i --i leler Toplama karma arpma Blme Modls Kktr Byktr Kk ya da eittir Byk ya da eittir Eittir Eit deildir Mantksal AND Mantksal OR Mantksal NOT Sonradan artrma nceden artrma Sonradan azaltma nceden azaltma leler rnekler 2+3 32 3*4 12 / 6 7%2 i < 10 i > 10 i <= 10 i >= 10 i == 10 i != 10 coud1 && cond2 cond1 | | cond2 !bCondition

Mantksal ve ilikisel

oalma ve azaltma le Kategorisi

rnekler

20 Bitwise ~ << >> & | ^ = = += -= *= /= %= <<= >>= &= |= ^= sizeof Bitwise not Ekleme ileci Ayklama ileci Bitwise and Bitwise or Bitwise xor Atama Bileik atama Topla, sonra ata kar, ata arp, ata Bl, ata Modls, ata Sola kaydr, ata Saa Kaydr, ata Bitwise and,ata Bitwise or, ata Bitwise xor, ata Veri tipinin boyutu Aritmetik karlatrr ~myInt myInt << 2 myInt >> 2 myInt & FLAG myInt | FLAG myInt ^ FLAG x = 14 x = y = 17 x += 1 x -= 1 x *= 5 x /= 2 x %=3 vb.

Atama

sizeof

Sizeof(float) >j?i:j

Aritmetik if ?: Tablo 1.4 Operatrler ncelik Sras

fade deerlendirmesi srasnda, baz C++ ilelerinin dierlerine gre yaplma ncelii vardr. lem sras aada gsterilmitir. Parantez iindeki ifadeler Mantksal karlatrmalar arpma, blme, modls Toplama, karma

Sizinde greceiniz gibi ilem srasn bizim belirlememiz iin parantezleri kullanmalyz bu kullanm srasnda yapmak istediiniz ilk ilemi en i parantez haile getirmeniz gerekir. Bunu daha iyi anlamak iin bir rnek yapalm. Yapmak istediimiz x deikeninden 2 karp kan sonucun karesini aldktan sonra x 5 ifadesine blme ilemini yaptralm . Bu ilemi aadaki gibi yaparsak ok yanl bir sonu alrz.
Sonuc = x 2 * x 2 / x - 5; // x, 1 ise Sonuc 8 olacaktr.

Burda bizim istediimiz Sonuc 0.25 olmas gerekiyor. Bunu doru bir ekilde programmza anlatmamz gerekir bu tr ilemlerde parantezleri doru kullanmak ok nemlidir. imdi dorusunu yazalm.
Sonuc = ((x - 2) * (x - 2)) / (x - 5); // x, 1 ise Sonuc 0.25 olacaktr.

Bylece istediimiz sonuca ulam olacaz.

21

C++ Denetim Deyimleri


Denetim deyimleri koula bal olarak komut satrlarnn alp almamasn salamak iin kullanlr. Ayrca tekrarlanmas istenilen komut satrlar iinde denetim deyimler dier bir ifadeyle koullu dngler kullanlr. imdi bu denetim deyimlerini rneklerle inceleyelim. if Deyimi En sk kullanlan denetim deyimidir. Yaps aada gsterildii gibidir. if (Koul1) { Komutlar1; } else if (Koul2) { Komutlar2; } else { Komutlar3; } Bu komut satrlarnda Koul1 doruysa dier bir ifadeyle True deerini geri dndryorsa Komutlar1 satrlar icra edilir. Koul1 yanlsa Koul2 kontrol edilir. Koul2 doru ise Kommutlar2 icra edilir. Koul2 yanlsa Komutlar3 kod satrlar icra edilir. Burada bilmemiz gereken dier bir ey {} iaretlerinin kullanmyla ilgili. {} iaretleri Komutlar1,2,3 kod satrlar bir satrdan ibaret ise kullanlmazlar. Bu {} iareti arasnda kalan kod satrna o ifadenin gvdesi denir. fadenin gvdesi tek satrdan oluuyorsa {} iaretleri kullanlmaz. imdi bir rnekle aklamaya alalm.
if (i < 10) { n = 10; k = 20; } else n = 20;

i deikenin deeri 10dan kkse n deikenine 10, k deikenine 20 deeri atanr. i deikenin deeri 10dan bykse n deikenine 20 deeri atanr. while Deyimi Koula bal olarak bir veya bir ok komut satrnn tekrarlanmas iin kullanlr. while (Koul)

22 { Komutlar; } Bu denetim deyimi bir koula bal dng deyimidir. Koul kontrol edilir doru ise Komutlar icra edilir. Doru deilse dngye hi girilmeden dng gvdesinin son satrna gidilir (}) ve bir sonraki satra geilir. Koul doru ise komutlar icra edilir. Komutlar icra edildikten sonra, dngnn ilk satrna geri gelinir. Koul tekrar kontrol edilir doru ise Komutlar icra edilir. Doru deilse dngden klr. Bu ilem her seferinde tekrarlanr. Dngden kabilmek iin break; komutunun kullanlmas veya koulun yanl olmas gerekir. Bunlarn hibiri yoksa koul deimiyorsa sonsuz dngye girer ve sistem bellek hatas verir. Sonsuz dngye sokmamak iin koulun deitiinden emin olmanz gerekiyor. do while Deyimi do while dngsnn while dngsnden tek fark koulun gvdenin sonunda kontrol edilmesi. Bu dng yapsnda komutlar bir kere mutlaka icra edilir. Bunun sebebi ise koulun son satrda kontrol edilmesidir. Kullanm aadaki gibidir. do { Komutlar; } while (Koul); Program dng gvdesinin ba tarafna geldikten sonra komutlar bir kere icra eder. Komutlar bir kere icra edildikten sonra Koul kontrol edilir. Koul doru ise dngnn bana gidilir ve komutlar bir kez daha icra edilir. Yanl ise bir alt satra geilir ve dolaysyla dngden klm olur. Dngden klmas iin koulun yanl yani false deerini geri dndrmesi gerekir. for Deyimi for dngs, koula bal olarak ayn kod satrlarnn istenilen sayda tekrarlanmasn salar. Kullanm aadaki gibi yaplr. for (Sayac; Koul; Artrm) { Komutlar; } Sayac deikeni bir deer tutar, Koul, Sayac deikeni ile bir deiken veya saynn ilikisel ifadesidir. Artrm, Sayac deikenimizin her dngde ne kadar artrlacan belirler. imdi bir rnekle almasn anladatalm
for (int i = 0; i < n ; i++) { DoFunction(i); AddNumbers(myArray); }

23 rneimizde i deikeni tamsay tipinde tanmlanyor. Ve ilk deer olarak 0 alyor. Dngmzdeki koul ifadesine bakacak olursak sayacmz yani i deikeni bir n deikeniyle karlatrlyor eer i n den kk ise dngye giriliyor. DoFunction fonksiyonuna i deeri gnderilerek 1 kez altrlyor. AddNumbers fonksiyonuna myArray dizisi gnderiliyor ve altrlyor. Dng sonuna gelindiinde dngnn ilk satrna tekrar dnlyor. i deikenin deeri rneimizdeki gibi 1 artrlyor. Koul ifadesi kontrol ediliyor. i deikeni n den kkse dng iindeki iki komut satr tekrar icra ediliyor. Bu dng bu ekilde koul yanl olana kadar icra edilir. i deikeni n den byk olana kadar komut satrlar icra edilecektir. N deeri 10 ise komut satrlar 11 kez icra edilecektir. Bu ekilde bir kod tekrarna neden ihtiyacmz olacaktr diyorsanz rnein bir veri taban dosyasndan veri okumamz gerekiyor ve ilk 100 kayt okuyacaz. Bu ilemi yapabilmek iin 100 kere tekrarlanabilecek bir dng oluturup her dngye girite bir sonraki kayta geip okutursanz veri taban dosyanzdan verileri birka satrla ekebilirsiniz. switch Deyimi Bu denetim deyimi, bir deikenin ald deere bal olarak bir ok olaslkta yaplmas gereken ilemleri belirleyip bunlar ayr ayr icra ettirebilmemizi salar. Bu deyim if deyimine benzer fakat tek koul deil birden fazla koul vardr bu koullara bal olarak birden ok komut satrnn icrasn kontrol edebilirsiniz. Kullanm aadaki gibidir. switch (Degisken) { case Deger1: Komutlar1; break; case Deger2: { Komutlar2; } break; default: Action; break; } switch Degisken isimli deikenimizin deerine bal olarak Komutlar1, Komutlar2 ve Komutlar3 satrlarnn hangisinin icra edileceini belirlememize yarar. Degisken Deger1e eitse Komutlar1 icra edilir ve break komutunu grdkten sonra switch gvdesinden klr. Degisken Deger2ye eitse Komutlar2 icra edilir ve deyimden klr. Degisken hibir degere eit deilse default deyimin altnda kalan komut satrlar icra edilir. if deyiminin else ksmndan sonraki komutlar gibidir. Burada dikkat edilmesi gereken break komutlarnn kullanm, bu komutlarn kullanlmamas sonucu tm deerler karlatrma ilemine tabi tutulur. default deyimine geldiinde ise bir karlatrma ilemi olmadndan bu ksmn altnda kalan komut satrlar da icra edilecektir. Bu yzden break komutunun kullanlmasna dikkat ediniz.

24 imdi bir rnekle aklamaya alalm.


switch (ch) { case a: { DoA(); CallHome(); } break; case b: DoB(); break; case c: DoC(); break; default: DoDefault(); break; }

Bu rnekte ch deikenin deerine bal olarak fonksiyonlara ynlendirme yaplmakta. ch deikenin deeri a ise DoA ve CallHome fonksiyonlar icra edilir. ve klr (break). ch deikenin deeri b ise DoB fonksiyonu icra edilir ve klr. ch deikenin deeri c ise DoC fonksiyonu icra edilir ve klr. ch deeri bu durumlardan hi birine eit deilse DoDefault fonksiyonu icra edilir ve klr. break Komutu Yukardaki rnekte de gsterildii gibi. break komutu for, while, do while ve switch dnglerinden kmak iin kullanlr. ie yaplm dnglerin en iteki deyiminden klr. Yani sadece tek dng terk edilir dierini terk etmek iin ayr bir break komutu kullanmalsnz. continue Komutu continue deyimi while, do while ya da for dngsnn bulunduu yerden son satrna gider ve dngnn bir sonraki iterasyonuna balar. for dngsnde artrma deeri kadar deer artrldktan sonra dngye devam edilir. rnein,
while (i < 100) { i++; if (i % 10 == 0) continue; //Dier Deyimler }

i deikeni dngye girdiinde deeri bir artrlr. i deikeni onun katlarn deer olarak aldnda ilem yapmamas iin bir if denetim deyimi ve continue komutlarn kullanyoruz. goto Komutu goto komutu denetimin koulsuz bir baka satra gnderilmesini salar. Komut satrlarnzn herhangi bir yerinde goto komutunu kullanarak program istediiniz komuta

25 gnderebilirsiniz. Yalnz bu ilemi yapabilmek iin gndereceiniz satrlara etiket koymanz gerekmektedir. Kullanm aadaki gsterilmitir. goto label: //Deyimler label: //Deyimler label:

iostream Araclyla C++ Girdi/ktlar


iostream.h dosyas, C++ girdi ve kt yapma yolunu tanmlar. Bir iostream, girdi ya da ktya veri akm gibi davranan nesnedir. kty kt akmna koyarak gnderirseniz ve girdiyi, girdi akmndan ekerek elde ederiz.
Cout << Merhaba, << szTo << Numara << NUMARA << .\n;

Bu satr, cout olarak adlandrlm k akmna Merhaba, C++! Numara 1. Dizisini yerletirir. cout nesnesi, ekrannza ya da ekrandaki bir pencereye denk den standart output anlamna gelen standart bir C++ iostream nesnesidir. Ayn zamanda cin olarak bilinen, standart input anlamna gelen ve klavyeye denk den bir input stream nesnesi vardr. Visual C++ programnda, ekleme ilecini kullanarak diziyi couta koymak, eklenmi dizinin MS DOS penceresinde grntlenmesini salar. iostream olana, girdi ya da kty bir dosyaya balamak iin dzenek ierir. Dosyalara balamak ve C++ programlarnzda iostreamin farkl zelliklerini kullanmak hakknda daha fazla bilgi almak iin, Help dizininde iostream balna bakn ve iostream Programming baln sein. C++la, iostream nesneleri, Basicteki Print, Pascaldaki WriteLn, Cdeki Printf gibi ilevlerin yerini alr. iostream nesnelerini kullanmak, C++ta girdi ve ktlar gerekletirmenin normal yoludur.

26

aretiler ve Bavurular
aretiler
C ve C++ programnn en ok kullanlan zelliklerinden biri pointerdir (areti). areti, bellekteki bir yerin adresini ieren bir deikendir. Bir ok durumda, baka bir deikenin adresi olur. Aadaki ekil iareti ve iaret ettii hedef (Target) arasndaki ilikiyi gsterir. C++ programdaki iaretiler ayn cdeki iaretiler gibi alr. nVar1 pInt 0x0064FD00 aretinin kendi adresi 0x0064FDF4 areti, iaret ettii deikenin adresini ierir 100 0x0064FDF4 Deikenin Deeri Bellekte iareti hedefinin adresi

aretiler konusunda bilmemiz gerekenler aada sralanmtr. Bir iaretiyi bildirmek ve ilk kullanma hazrlamak aret edilen nesneye erimek ya da nesnenin deerini deitirmek aretileri en iyi ekilde adlandrmak aretiler araclyla ve pointer arithmetic kullanarak dize ve dizinleri beceriyle ynetmek lev parametrelerinde ve ilev sonularnda iaretileri kullanmak aretinin bir ok eye (deikenler, dizinler, diziler, yaplar, snflar, yap ya da snf yeleri, null, void*, ilevler ve dier iaretiler) iaret edebileceini anlamak aretileri kullanrken dikkat etmek

areti Temelleri Aada bulunan ve ksa bir C++ program olan pointer, iaretiyi nasl bildireceiniz ve ilk kullanma hazrlayacanza ek olarak, iaret edilen nesneye nasl erieceinizi ya da deerini deitireceinizi gsterir.
//Pointer.cpp : Konsol uygulamas iin giri noktasn tanmlar. #include <iostream.h> int main (int argc, char* argv []) { // Bir normal tamsay deikeni bildir ve ilk kullanma hazrla. int nVar1 = 100; // nVar1e bir iareti bildir. int* pInt = &nVar1; // aretinin nVar1e iaret ettiini gsterir cout << nVar1 = << nVar1 << *pInt = << *pInt << endl; // nVar1 adresini pIntde saklanan deere == olduunu gsterin. cout << &nVar1 = << &nVar1 << pInt = << pInt << endl; // areti araclyla nVar1in deerini renin int nVar2 = *pInt;

27
// iareti araclyla nVar1 in deerini deitirin *pInt = 200; // areti araclyla dzeltilen deeri gsterin cout << nVar2 = << nVar2 << nVar1 now = << nVar1 << endl; return 0; }

Pointer program, int deikeni olan nVar1i bildirir. Bir sonraki ifade, nVar1 deikenin adresini belleinde tutan bir iareti yaratr. Aada, pIntin nesneye nasl iaret ettii gsteriliyor.
int* pInt = &nVar1;

Atama ilecinin sol tarafnda, pInt deikeni, inte iareti olarak bildirilmitir. ndirection ileci (*), pIntin inte iareti olduunu syler. Atlama iaretinin sa tarafnda, address ileci (&, ve imi), nVar1 deikenin adresini edinir. Adres, iaretinin deerini ilk kullanma hazrlamak iin atanmtr. areti, tam olarak budur. Bellekteki bir yerin adresi. nt* pInt = &nVar1 iareti atamasn iki kt ifadesi izler.
cout << nVar1 = << nVar1 << *pInt = << *pInt << endl; cout << &nVar1 = << &nVar1 << pInt = << pInt << endl;

aretiler hakknda iki gerei ortaya sererler. nVar1 pInt nesnesi ayn deeri iaret eder, dolaysyla pInt, gerekten nVar1er iaret eder. nVar1in adresi ile pIntte saklanan deer ayndr, dolaysyla pIntin nVar1e iaretl etmesini salayan adres budur.

Daha sonra pointer program, nVar1e iaret eden iaretiyi kullanarak, nVar1in deerine erimeyi salayan szdizimini gsterir.
int nVar2 = *pInt;

Burada, * ileci, pointer-derefence ileci olarak kullanlmaktadr. Bu satr, nVarye, pIntin iaret ettii adresteki deer atanmtr. Olarak okuyabilirsiniz. Bu durumda, * ieci, nin deeri anlamna gelmektedir. leci, dereferencing yaptnz sylenir, yani hedefte ne olduunu grmek iin iaretiyi izlersiniz. kiside * karakteriyle gsterilse de, konumlaryla izleyen ileci dolayl ile den ayrabilirsiniz. zleyen ile, iaretinin adn izler ama dolayl ile gibi deiken bildiriminin bir paras deildir. Bir sonraki sayfadaki iki ayr satrda bu ileler gsterilmitir.
int* pInt = &nVar1; int nVar2 = *pInt; // Dolayl ile * // zleyen ile *

areti araclyla nVar1de bir deere eriebilmenin yan sra, iareti araclyla o deeri de deitirebilirsiniz.

28
*pInt = 200;

Bu sefer izleyen ile, atama ifadesinin sol tarafnda grlr. Buradaki anlam pInt tarafndan iaret edilen adreste 200 deerini sakla olmaktadr. Pointer programndaki son kt ifadesi nVar2nin yeni atama deerini ve nVar1in yeni deerini gsterir. nVar1in balang deeri 100d imdi 200 olarak ayarland. areti ve Diziler Dizilerle nceden karlatnz. C ve C++ programnda dizilerin, iaretilerle ilgin ve yararl bir ilikisi vardr. Her iki dilde de, array name, dizinin ilk esine iaretidir. Bunun anlam, dizinin elerini gzden geirmek (dnglemek, yinelemek, zerinden gemek) iin, iaretiler baka bir seenek salarlar. Aadaki Array Program pointer arithmetic kullanarak diziyi gzden geirmeyi gstermektedir.
#include <iostream.h> int main (int argc, char* argv []) { cout << ----1. Using Array Notation-----\n; int arInt[] = {6, 5, 4, 3, 2}; for (int i = 0 ; i < 5 ; i++) cout << arInt[ << i << ] = << arInt[i] << endl; cout << -----2. Using Pointer Arithmetic-----\n; int* pArray = arInt; for (int j = 0 ; j < 5 ; j++) { cout << arInt[ << j << ] = << *pArray++ << endl; } return 0; }

Array programn iki blm vardr. lk blm dizinin elerini gzden geirmek iin for dngsnde normal dizi simgelemesi kullanr. C++ programnn anahtar paras, kt akmnn ortasndaki bu diziye erime simgelemesidir.
ArInt[i]

Kod dizinin, i deerindeki esinde saklayan deeri geri almak iin, diziye array subscript ilecini ([]) uygulanr. Burada deer kt akmnn iine koyulur. Array programnn ikinci blm iki deiiklii ortaya karr. lk olarak, int deikenine pArray adnda bir iareti bildirilir ve yalnzca dizi adyla ilk kullanma hazrlanr. Dizi adnn iareti olduunu unutmayn. lk kullanma hazrlamadan sonra, pArray dizinin ilk esine iaret eder. Sonra, k akmnda dizi eriim simgelemesi, tuhaf grnml bir kodla deitirilir.
*pArray++;

pArraye iki C++ ileci uygulanr. zleyen ile, iareti adndan nce gelir. Dolaysyla yaptmz, pArrayn ilk esinin geerli konumundaki deeri yeniden almaktr. areti adnn

29 arkasnda arkaya konulan ek olan artrma ileci (++) vardr. Bundan sonra yaptmz dier ey iaretiyi artrmak. Buna genelde iareti aritmetii denir. aretide saklanan adres 1 ekleyerek, dizide bir sonraki eye iaret etmesi iin iaretinin yerini deitiriyoruz. areti ve Dizeler C deki dizeler gibi, C++ programndaki dizeler de karakter dizileridir. Dize deikeni ad, dier tm dizilerin ad olduu gibi, iaretidir, String pogram, char* deikeni zerinde iareti aritmetii kullanmay gsterir.
#include <iostream.h> int main (int argc, char* argv []) { cout << Using Pointer Notation on an Array--\n; char arStr1[] = Programming; char* pStr1 = arStr1; cout << arStr1 << endl; // ilk tm diziyi yazar while (*pStr1) cout << *pStr1 = << *pStr1++ << endl; return 0; }

String Program, dizeyi taramak ve srasyla her bir karakteri yazdrmak iin bir iareti kullanlr. Dizenin adnn (arStr1) yalnzca dizenin ilk karakterine iareti olduunu hatrlayn. Dizeyi gzden geirmek iin, bu sefer char*a olmak zere ikinci bir iareti bildiririz ve ilk kullanma dize adyla hazrlarz. kinci iaretiyi gzden geirme amal kullanmak, dize adn hala birinci karaktere iaret eder bir halde brakr. Bunun yerine zgn dize iaretinin (arStr1) yerini deitirmek ise, dize adn gzden geirme sonunda konumsuz brakr. Dolaysyla, diziyi yardmc iaretiyle gzden geirmek ok daha gvenlidir. lev Parametreleri ve lev Sonular Olarak aretiler Deer Araclyla Gei Parametreyi ileve geirmenin varsaylan yoluna passing by value denir. Deer araclyla gei yaptnzda, ilev, ilev arsnda saladnz verinin gereini almaz. Bunun yerine, verinin kopyas yaplr ve ilev bu kopya zerinde alr. lev kopyay istedii gibi deitirebilir ve zgn veri deimeden kalr. Yalnzca deer araclyla geiin kopya geii yaptn hatrlayn. lev sonucunu varsaylan yolla dndrmek, onu deer araclyla dndrmektir. Yine bir kopya yaplr ve ilevden kp dardaki dnyaya giren bu kopyadr. Adres Araclyla Gei levin zerinde almasn istediiniz byk bir veri paranz olduunu varsayn. Bu durumda, ileve geirdiiniz verinin ilev tarafndan deitirmesini bilerek istiyorsunuz. Ancak varsaylan yol ilevin yalnzca kopya zerinde almasna izin veren deer araclyla geitir. Tabii ki zm, veriye iareti geii yapmak, yani pass by address yolunu kullanmaktr. Bu yolla verilerin kopyas kullanlmaz. lev, iaretiyi nerede olduuna bakmakszn zgn veriyi deitirmek iin kullanabilir.

30

Adres araclyla gei, ilev sonularn vermesi iin de ayn biimde alr. Yalnz burada asl gd verimliliktir. Dndrlecek byk bir veri kopyas yoktur. levi dndrmek iin yazlacak bir kod aadakine benzer.
Thing MyFunction() { // Bir Thing yaratmak iin bireyler yapn return &Thing; }

aretileri geirmenin ve dndrmenin baka bir yarar da, birden ok sonucu dndrmenize olanak salamaldr. Ek sonular dndrmek iin iareti tipi parametreler kullanabilirsiniz. Aada ematik olarak gsterilmitir.
Return Return

int AFunction( int nParam1, int* pnParam2) { *pnParam2 = 3; return 4; }

Bir Const aretisi Geirmek aretiler hakknda bir baka eye daha dikkat edin. Deer aracl yerine adres araclyla gei yapmanzn asl nedeni n ilemleri kopyalamaktan saknmak olduunu varsayn ve verinin kendisinin ilev iinde deitirilmesini istiyorsunuz. Bu durumda, aada gsterildii gibi parametreyi const deitiricisiyle bildirebilirsiniz.
Void MyFunctuion (const Thing* pThing)

const iaretisini bu ekilde kullanmak, derleyiciyi isteklerinizi yerine getirmesi iin zorlar. pThing araclyla Thinge iaret edilen, ilevde deitirilemez. levin veriyi deitirmesini amalamyorsanz, const parametreleri geirmek iyi bir alkanlktr.

Bavurular
C++ yeni bir deiken tr tantr: reference (Bavuru) deikeni. Refe1 program basit bir rnek verir.
#include <iostream.h> int main (int argc, char* argv []) { // Bir int deikeni tanmlayn ve ona bavurun int myInt = 3; int& rMyRef = myInt; // rMyRefin mInte bavurduunu gsterin cout << rMyRef << endl; // kt 3tr // myInti deitirerek rMyRefi deitirin. MyInt += 1; // imdi 4e eittir Cout << rMyRef << endl; // kt 4tr // rMyRef araclyla myInti deitirin rMyRef += 1;

31
// Bir sonraki satr rMyRef = 5 myInt=5 karr cout << rMyRef = << rMyRef << myInt = << myInt << endl; return 0; }

Bir bavuru, dier bir deiken iin alias (arma), yani ayn nesne iin farkl bir addr. Bavuru, iareti gibi kendi bana ayr bir nesne deildir. O, yalnzca bir addr. Yukardaki rnekte, rMyRefin myInte iaret (refer) ettii sylenir. Yani myInt iin bir armadr. myInte dorudan yapabileceiniz herhangi bir eyi rMyRef bavurusu ile de yapalirsiniz. aretiye benzese ve biraz onun gibi davransa da belirli bir deikene bavurabilmek iin, bavurunun ilk kullanma hazrlanmas gerekir. Bundan sonra, bavurmas iin farkl bir deikene atanamaz. Unutmayn: bir bavuru varolan (bavuru sresince varln srdrecek) bir nesneye bavurmaldr. Refer1 programnda gsterildii gibi bavurular kullanabilirsiniz. Ancak ilev parametre ve sonular olarak kullanmlar en yaral kullanmlardr. Sz ettiimiz birka kurala uyduunuz srece verimliliinizi ykseltebilirler. Bavuru Araclyla Gei Dier iki parametre geii dzeneklerini iledik: Deer araclyla gei, kopya geirilir ve zgn veri, kopya araclyla deitirilemiyor. Adres araclyla gei, iareti geirilir ve bu iareti araclyla (iareti parametresi const olmad srece) zgn veri deitirilebilir.

C++ programndaki nc ve son parametre geii dzeneini pass by reference denilir. Resmi parametre, bavuru tipini belirtir. Bu rnekte bavuru tipi BigObject& olarak gsterilmektedir.
Void MyFunction(BigObject& rBo);

Ve geirdiiniz bavuru deikeni olmayan (nesneye iareti deil de, nesnenin kendisi) gerek parametre, bavuru parametresini ilk kullanma hazrlar:
BigObject myBo; MyFunction(myBo); // myBo, ynda gerekten nesne olarak vardr // myBo bavuru parametresini sfrlamak iin kullanld

MyFunction, zgn nesne olan myBoyu ona yaplan bavuru araclyla (parametre bildirisinin nne const anahtar szcn koymadmz srece) deitirebilir. Bir sonraki program Refer2, bavuru parametresinin bavurduu nesnesinin nasl deitirileceini gsterir.
#include <iostream.h> struct BigObject { int Var1; double arDd1[2000]; }; void MyFunction (BigObject& bo);

// 2.000 kesirli say iin yer ayrr

32
int main (int argc, char* argv []) { Bigobject myBo; myBo.Var1 = 0; cout << Before MyFunction call, myBo.Var1 = << myBo.Var1 << endl; MyFunction(myBo); cout << After MyFunction call, myBo.Var1 now = << myBo.Var1 << endl; return 0; } void MyFunction (BigObject& bo) { cout << Entering My Function, bo.Var1 = << bo.Var1 << endl; bo.Var1 = 100; }

Refer2 program, BigObject adnda bir struct tipi bildirir. BigObject, iki e deikeni ierir: bir int ve geni bir doubles dizisi, Refer2, maindeki ynda myBo adnda bir BigObject yaratr ve int e deikeni olan, Var1i ilk kullanma hazrlar. Daha sonra main, MyFunction arp bavuru araclyla BigObjecte geirir. lev srasnda & ya da farkl sslemeler yapmadan nesnenin adn geirdiimize dikkat edin.

st Bilgi ve Gerekletirme Dosyalar


imdiye kadar ou yerde, rnek programdaki hereyi (bildiri ve tanmlar) tek bir .cpp dosyas olan C++ implementation dosyas iine koyduk. Ancak, c++ programnda program yazmann genel yolu, bildirileri st bilgi (header) dosyas (.h uzantl) ve tanmlar .cpp dosyas iine koymaktr o zaman .cpp dosyas .h dosyasn, aada gsterildii gibi ierir.
#include myHdr.h

C++ programndaki st bilgi ve gerekletirme dosyalar ayn Cdeki gibidir. Kodu st bilgi dosyas ve gerekletirme dosyas olarak ayran Refer3 programnn farkl bir srmn, Refer4 programn yaratalm. Gerekletirmek (.cpp) dosyas, st bilgiyi iermelidir. Projeyi Refer4 olarak adlandrp sihirbazla bu dosyalar yaratn.
#include <iostream.h> #include Refer4.h int main (int argc, char* argv []) { Object& rMyObj = MyFunction(); cout << rMyObj.a = << rMyObj.a << endl; delete &rMyObj; //Bavurulan nesneyi silin return 0; } Object& MyFunction() { Object* o = new Object; // Kmede nesne yaratn o -> a = 20; // Deerini ayarlayn o -> b= 25; return *o; // Nesnenin kendisini dndrn }

33 st bilgi dosyas olan Refer4.hi yaratn, aadaki kodu ekleyin ve projeyi ona ekleyin. st bilgi dosyasn yaratmak iin, File mensnden New komutunu kullann. New iletiim kutusunda Files sekmesini tklayn C/C++ Header File tklayn ve File Name kutusunda dosyaya bir ad verin (Refer4.h). Add To Project seeneinin iaretli olduundan ve proje adnn Refer4 olduundan emin olun.st bilgi dosyasn Refer4 projesinin bir paras olarak yaratmak iin OK dmesini tklayn.
struct BigObject { int a; int b; }; object MyFunction();

Kodu neden byle blyoruz? Refer4.h deki Object yaps gibi ok yararl bir veri tipi gelitirdiimi varsayalm. Bu tipi dier programlarda yeniden kullanmak isteyebilirim. Program A iin tip bildirisi .cpp dosyasna katlmsa, B programnda onu kullanabilmek iin, onun bir kopyasn yapp B programnn .cpp dosyasna yaptrarak kopyalamalym. Ancak, tip bildirileri, ilev bildirileri, deimezler ve dier yeniden kullanlabilen eler bir ya da daha fazla st bilgi dosyas iindedir ve herhangi bir program, yalnzca st bilgi dosyalarn iererek onlar yeniden kullanabilir.

34

BLM 2 : Visual C++ Nesneleri


Nesne Temelli Program Yazmak .................................................................................... 35 SDI ve MDI Uygulamalar .............................................................................................. 35 letiim Kutusu Nedir? .................................................................................................... 36
Giri in letiim Kutularn Kullanmak ...................................................................... Mesaj Kutular Eklemek ................................................................................................. Bir letiim Kutusu Eklemek .......................................................................................... Kaynaklar Anlama ............................................................................................... 38 Bir letiim Kutusu Kayna Yaratmak ................................................................. 38 letiim Kutusunun zelliklerini Deitirmek ...................................................... 38 letiim Kutusuna Kontrol Eklemek ...................................................................... 40 letiim Kutusu in Snf Yaratmak ...................................................................... 41 letiim Kutusuna lk Deerler Vermek in Bir Mesaj Yneticisi Yaratmak ...... 42 Yeni letiim Kutusu in Men Seenei Eklemek ............................................. 42 Dme Nedir? ................................................................................................................... Dmeler in MFC Destei ............................................................................................ Dme Kontrollerinin zellikleri ................................................................................... letiim Kutularnzda Standart Baslr Dme Dzenleri Kullanmak ...................... ye Deikenleri Bir Dme Kontrol le likilendirme ............................................ Bir letiim Kutusu Snfna Dme Olaylar Eklemek ................................................ Dmeleri Kullanlabilir Ve Kullanlamaz Hale Getirmek ......................................... Dmeleri Gizleme ........................................................................................................... 36 36 38

Dme Kontrolleri ........................................................................................................... 44


44 45 45 47 47 48 48 49 Dzenleme Kontrolleri .................................................................................................... 50 Dzenleme Kontrollerini Anlama ................................................................................... 50 Dzenleme Kontrolleri Niin Kullanlr? ....................................................................... 50 Dzenleme Kontrolleri in MFC Destei ...................................................................... 50 Dzenleme Kontrollerinin zellikleri ............................................................................ 50 Bir CEdit Nesnesini Bir Dzenleme Kontrolne Balamak ......................................... 52 Bir Dzenleme Kontrolne Girilen Metni Almak ......................................................... 52 Girilen Metni Almak in CEdit Fonksiyonlarn Kullanmak ..................................... 52 DDV ve DDX Rutinlerini Kullanarak letiim Kutularna Parametre Aktarm ...... 53 DDV ve DDX Rutinleri Niin Kullanlr? ...................................................................... 53 DDV ve DDX Rutinlerini Kullanmak ............................................................................ 54 Bir Kontroln Deerini Bir ye Deikenle likilendirmek ....................................... 54 Liste Kutusu Kontrol ..................................................................................................... 55 Liste Kutular Niin Kullanlr? ...................................................................................... 55 Liste Kutular in MFC Destei ..................................................................................... 55 Liste Kutusunun zellikleri ............................................................................................ 56 CListBox Snfn Kullanmak .......................................................................................... 57 Liste Kutusuna Madde Eklemek .................................................................................... 57 Liste Kutusu Mesajlarn Almak .................................................................................... 58 Bileik Kutu Kontrol ..................................................................................................... 60 Bileik Kutularn zellikleri ........................................................................................... 60 Bileik Kutular in MFC Destei .................................................................................. 61 Bileik Kutuya Maddeler Eklemek ................................................................................ 61 Bileik Kutunun Deerini renme ............................................................................... 62 Bileik Kutuda Bir Maddeyi Arama .............................................................................. 62 Spin Kontrol ................................................................................................................... 63 Kaydra Kontrol ........................................................................................................... 63 lerleme ubuu Kontrol ............................................................................................. 63 Kontroller Projesi ............................................................................................................ 64

35

Nesne Temelli Program Yazmak


Nesne temelli programlama (OOP), standart yapl programlama tekniklerinin uzants olarak dnlebilir. Class (snf), dosya ve ileve eklenen, modlasyonun yeni esidir. OOP, yazlm nesneleriyle gerek nesnelerin (ekiller, cihazlar, pencereler, belgeler) modellerini yaptnz bir programlama stilidir. C gibi geleneksel programlama dilleriyle bile OOP yapmak olasdr, ancak C++, OOP iin dorudan destek salar ve nesneler asndan dnmeyi ve kodlamay ok daha kolay ve doal hale getirir. OOPyi daha ok ya da az kapsaml kullanabilirsiniz. rnein, dier trl Cye ar benzeyen bir programda tek yeni veri tipi salamak iin kullanabilirsiniz. Ya da, zmeye altnz problemin tmn modellemek iin nesne ynelimli tasarm kullanabilirsiniz. rnein MFC, Windows uygulamalarnn modelini yapar ve pencereleri, belgeleri, iletiim kutularn, dmeleri ve hatta uygulamay tm olarak simgelemek iin snf nesnelerini sk sk kullanr. Nesne ynelimli tasarm ilemi, problemin dikkatle belirlenmesiyle balar. Bir sonraki adm, iyi nesneler yapabilecek eler iin problemi incelemektir. Tasarm srdke, yava yava bu nesnelerin yapsn ve davranlarn gelitirirsiniz. Sonu olarak, sradzendeki C++ snflarnn yapt sklkta, nesneleri gerekletirirsiniz.

SDI ve MDI Uygulamalar


ki temel Dokman/Grnm program tipi vardr. SDI (Single Document Interface Tek Dokmanl Arabirim) MDI (Multiple Document Interface ok Dokmanl Arabirim)

Bir SDI program tek bir dokman destekler ve hemen tek bir grnm destekler. Bir anda tek bir grnm destekler. Bir anda tek bir dokman ak olabilir. Bir SDI uygulamas belli bir greve odaklanr. Bir MDI programnda eitli farkl dokman tipleri kullanlabilir ve bu dokmanlarn her biri bir veya daha fazla grnme sahip olabilir. Bir anda birden fazla dokman ak olabilir ve ak olan dokman o dokmann ihtiyalarna uygun zelletirilmi bir ara ubuu ve menler kullanlr.

36

letiim Kutusu Nedir?


letiim kutusu, kullancya geri besleme salamak veya kullancdan giri almak iin kullanlan zelletirilmi pencerelerdir. letiim kutular tek satrlk mesajlar veren basit mesaj kutularndan karmak kontroller ieren iletiim kutularna kadar deiik biim ve byklkte olabilirler. Ayrca iletiim kutular, bir program balatlrken telif ve balang bilgilerini grntlemek amacyla kullanc ile tek tarafl iletiim iinde kullanlr. Developer Studio ve Microsoft Word programlarnn al ekranlar tek tarafl iletiim iin kullanlan iletiim kutularna iki rnektir. letiim kutular bazen kullancya uzun sren bir ilemin ilerleyii hakknda bilgi vermek iinde kullanlr. eitli farkl tipte iletiim kutular vardr ve her biri zel bir amaca sahiptir. ki ana iletiim kutusu tipi vardr. Modal (Kipli) iletiim kutular Modeless (Kipsiz) iletiim kutular

Modal letiim Kutusu: En yaygn kullanlan iletiim kutusu tipi modal iletiim kutusudur. Modal iletiim kutusu akken kullanc programda herhangi baka bir ilem yapamaz, nce bu iletiim kutusuyla iini bitirmelidir. Modeless letiim Kutusu: Modeless iletiim kutusu akken programda baka ilemler yaplabilir. Modeless iletiim kutusuna bir rnek Developer Studionun kullanld Find and Replace iletiim kutusudur. letiim kutusu akken ana menden seim yapabilir ve hatta baka iletiim kutular aabilirsiniz. Bunu dndaki dier tm Developer Studio iletiim kutlar modaldr. Bunlar ak olduu srece kullanc Developer Studionun dier ksmlaryla etkileimde bulunamaz.

Giri in letiim Kutularn Kullanmak


ou insan iletiim kutlarn dndklerinde kullancdan bilgi girii alan iletiim kutularn dnrler. letiim kutular ounlukla kullanc girileri ile ilgili kontroller ierirler. Bir iletiim kutusuna eitli kontroller ekleyebilirsiniz. Baz iletiim kutularnn kullanlmas Windows programlarnda o kadar sk gerekli olur ki bunlar iletiim sisteminin bir paras olarak iermektedir. Genel iletiim kutular (Common Dialog Boxes) olarak bilinen bu iletiim kutular bir fonksiyon arma yoluyla kullanlabilirler ve sizin bir iletiim kutusu kayna yaratmanz gerekmektedir. Dosya ama, seme, yaz tipi ve renk seme ve kelime bulup deitirme ilemleri iin genel iletiim kutular vardr.

Mesaj Kutular Eklemek


En basit iletiim kutusu tipi bilgi grntlemek iin kullanlan mesaj kutusudur. Bu iletiim kutusu tipi o kadar basittir ki MFC snf ktphanesini kullanarak tek satrl bir kodla iletiim kutusunu yaratabilirsiniz. rnein, parametrelerin MFCnin salad ndeerleri ile bir mesaj kutusu gstermek iin u satr kullanmanz yeterlidir.
AfxMessageBox(Merhaba!);

37

Bu kod satr sar bir gen iinde nlem iareti olan bir mesaj kutusu yaratr. En az tek bir parametre kullanmanz gerekir: Bu, iletiim kutusu iinde grntlenen mesajdr. Seime bal olarak bir ikon stili ve dme dzeni de seebilirsiniz. Aadaki tabloda dme dzenlerine ait parametre deerleri gsterilmektedir Kullanlan kon Anlam nlem ! iareti Warning (Uyar) Daire iindeki i iareti Information (Bilgi) Soru ? iareti Question (Soru) Daire iindeki x iareti Error (Hata) Tablo 2.1 Mesaj Kutusu konlar Mesaj Kutusu Biimi MB_ICONEXCLAMATION MB_ICONINFORMATION MB_ICONQUESTION MB_ICONSTOP

Ayrca mesaj kutusunda kullanlabilecek bir dme dzenlemesi de belirleyebilirsiniz. n deer olarak mesaj kutusunda OK etiketli tek bir dme vardr. Ancak bazen kullancya basit bir soru sorup cevabn almak gerekebilir. Bu dme dzenlemelerinin bir kullanm, bir hata srasnda kullancya ne yaplmas gerektiini sormaktr. rnein, aadaki kod soru iareti ikonu ieren ve kullancya mevcut dosyasnn silinmesinin istenip istenmediini soran bir mesaj kutusu grntler.
int nGeriDonenDeger = AfxMessageBox(Varolan eminmisiniz?, MN_YESNOCANCEL | MB_ICONQUESTION); if (nGeriDonenDeger == IDYES) {//Dosyann zerine Kaydet} dosyann zerine kaydetmek istediinizden

Yukarda verilen kod programda kullanldnda kullanc Yes, No ve Cancel dmelerinden birini seebilir. Aadaki tablo bir mesaj kutusunda bulunabilecek dme dzenlerini gstermektedir. Mesaj Kutusu Biimi Kullanlan Dmeler MB_ABORTRETRYIGNORE Abort, Retry ve Ignore MB_OK OK MB_OKCANCEL OK ve Cancel MB_RETRYCANCEL Retry ve Cancel MB_YESNO Yes ve No MB_YESNOCANCEL Yes, No ve Cancel Tablo 2.2 Mesaj Kutusu Dmeleri Mesaj kutusunun dndrd deer kullancnn hangi dmeye tkladn gsterir. Aadaki tabloda dndrlecek deerler ve tklanlan dme karlatrmas gsterilmitir. Dndrlen Deer Baslan Dme IDABORT Abort IDCANCEL Cancel IDIGNORE Ignore IDNO No IDOK OK IDRETRY Retry IDYES Yes Tablo 2.3 Mesaj Kutusu Dmelerinden Dnen Deerler

38

Bir letiim Kutusu Eklemek


Bir programa bir iletiim kutusu eklemek iin genelde drt adm gereklidir. Developer Studio kaynak aralarn kullanarak iletiim kutusu kayna tasarlayn ve yaratn. CDialog snfndan tretilmi ve iletiim kutusunu ynetecek bir C++ snf yaratmak iin Class Wizard kullann. Gerekirse iletiim kutusuna gnderilecek mesajlar zerinde iletiim yapmak iin fonksiyonlar ekleyin. letiim kutusu ana menden seilirse men kayna zerinde deiiklik yaplmal ve Class Wizard kullanlarak mesaj fonksiyonlar yaratlmaktadr.

Kaynaklar Anlama letiim kutular zelletirilmi pencere tipleridir. Ancak, yaygn olarak ksa sreliine kullanldklarndan genellikle program kayna olarak saklanr ve yalnzca gerektiinde yklenirler. Bunu, az miktarda serbest bellei olan bir makinede bir Windows program altrdnda gerekebilirsiniz. Her iletiim kutusu aldnda EXE dosyadan iletiim kutusu kaynaklarn yklemek iin sabit diske eriim yaplr. Bir letiim Kutusu Kayna Yaratmak Developer Studio bir iletiim kutusunu grsel olarak yaratmanza ve dzenlemenize olanak salar. Fareye kullanarak kontroller ekleyebilir ve byklklerini deitirebilirsiniz. Bir fare dmesine tklamayla iletiim kutusunun ve kontrollerinin zelliklerini ayarlayabilirsiniz. Aadaki admlar izlemeden nce bir MFC App Wizard kullanarak bir SDI projesi oluturun. Insert mensnden Resource komutunu seerek New Resource iletiim kutusunu grntleyin. Sonra kaynak tipi olarak Dialog sein ve OKe tklayn. Resource aacndan Dialog klasrne farenin sa tuu ile tklayn ve alan menden Insert Dialog komutunu sein.

lk bata grntlenen iletiim kutusu, biri OK etiketli dieri Cancel etiketli iki dme kontrol ierir. MFC snf ktphanesi genellikle bu kontrollerin ileyiiyle ilgilidir. Biz bu iletiim kutusuna istediimiz kontrolleri ekleyip istediklerimizi kartabiliriz. letiim Kutusunun zelliklerini Deitirmek Her iletiim kutusu, farenin sa tuuyla tklayarak ve alan menden Properties komutunu seerek grntleyebileceiniz zelliklere sahiptir. General sekmesinin altndaki iletiim kutusu zellikleri unlardr: ID: Normalde IDD_DIALOG1 gibi bir eydir. letiim kutularn IDD_ ile balayan bir tanmlayc ile isimlendirmek bir MFC standarddr. Siz iletiim kutularnza daha anlaml isimler verebilirsiniz: Bu iletiim kutusuna IDD_MERHABA adn verin.

39 Caption: Normalde dialog dmelerine sahiptir. Bunu da daha anlaml bir balkla deitirmelisiniz. Bu rnek iletiim kutusuna Merhaba baln verebilirsiniz. Men: Normalde seili deildir nk iletiim kutularnn ou men kullanmaz. X Pos: Normalde iletiim kutusunun varsaylan konumunu kullanmak iin seili deildir. Y Pos: Normalde iletiim kutusunun varsaylan konumunu kullanmak iin seili deildir. Font Name: letiim kutusunun o anda kulland yaz tipinin ismini ierir. Font Size: letiim kutusunun o anda kulland yaz tipinin bykln ierir. Styles sekmesinin altndaki iletiim kutusu zellikleri unlardr. Style: Genelde ou iletiim kutusu Popup dmesine sahiptir. Form grnmlerinde veya iletiim ubuklarnda kullanlan zel iletiim kutusu ablonlar sz konusu olduunda stil Child olarak belirlenir. Border: ou iletiim kutusu iin Dialog Frame deerine sahiptir. Minimize Box: letiim kutusu iin simge durumuna kltme (minimize) dmesi yaratr. Bu onay kutusu bir ok iletiim kutusu iin seilmemi durumdadr bu sayede iletiim kutusunda minimize etme dmesi bulunmaz. Maximize Box: letiim kutusu iin maximize etme (ekran kapla) dmesi yaratr. Bu onay kutusu bir ok iletiim kutusu iin seilmemi durumdadr, bu sayede iletiim kutusunda maksimize etme dmesi bulunmaz. Title Bar: letiim kutusu iin bir bal ubuu yaratr. Bu onay kutusu hemen her zaman iaretlidir. nk iletiim kutularnn ou balk ubuuna sahiptir. System Menu: letii kutusu iin system mensnn salanmas gerektiini belirtir. Bu onay kutusu normalde iaretli durumdadr. Horizontal Scroll: letiim kutusu iin yatay kaydrma ubuu yaratmak amacyla kullanlr. Bu onay kutusu hemen her zaman seilmemi durumdadr nk iletiim kutular ok nadir olarak kaydrma ubuu kullanrlar. Vetical Scroll: letiim kutusu iin dey kaydrma ubuu yaratmak amacyla kullanlr. Yatay kaydrma ubuu gibi bu zellik de ok nadir kullanlr. Clip Siblings: Sadece ocuk pencerelerinde kullanlr. Clip Children: Ana pencereler iin kullanlr ou iletiim kutusu iin bu onay kutusu seilmemi durumdadr.

40 More Styles sekmesi iletiim kutusu iin ilave zellikler ierir. System Modal: Modal bir iletiim kutusu yaratr. Bu seenek seilirse kullanc baka bir programa geemez. Absolute Align: letiim kutusu ilk grntlendiinde nereye yerletirileceini belirtmek iin kullanlr. Onay kutusu seilirse, iletiim kutusu ana pencere yerine ekrana gre hizalanr. No Idle Message: letiim kutusunun mesaj kuyruu boken belli bir pencere mesajnn, WM_ENTERIDLE mesajnn gnderilmesine engel olur. Bu onay kutusu normalde seilmemi durumdadr. Local Edit: Bir dzeltme kontrol belleinin nasl tahsis edileceini belirtmek iin kullanlr. Bu onay kutusu normal olarak seilmemi durumdadr. Bu durumda dzeltme kontrolleri programn veri blmleri dndaki bellei kullanr. Visible: letiim kutusu ilk grntlendiinde grnr olmasn belirtmek iin kullanlr. Bu onay kutusu normalde iaretli durumdadr. Form grnmlerinde bu onay kutusu seili deildir. Disabled: letiim kutusu ilk grntlendiinde kullanlamaz durumda olmasn salamak iindir. Bu onay kutusu normalde iaretsiz durumdadr. 3D-Look: letiim kutusuna -boyutlu bir grnm verir. Bu onay kutusu normalde iaretsiz durumdadr. Set Foreground: letiim kutusunun n plana yerletirilmesini salar bu onay kutusu normalde iaretsiz durumdadr. No Fail Create: Bir hata olsa bile Windowsa iletiim kutusunu yaratmasn syler. Bu onay kutusu normalde iaretsiz durumdadr. Control: Bir ocuk kontrol olarak kullanlabilecek bir iletiim kutusu kayna yaratr. Bu onay kutusu normalde iaretsiz durumdadr. Center: letiim kutusu ilk grntlendiinde ortada grntlenmesini salar. Bu onay kutusu normalde iaretsiz durumdadr. Center Mouse: Fare imleci iletiim kutusunun ortasna konumlandrr. Bu onay kutusu normalde iaretsiz durumdadr. Context Help: Ortama duyarl yardm iin ara ubuuna bir soru iareti ikonu ekler. Bu onay kutusu normalde iaretsiz durumdadr. letiim Kutusuna Kontrol Eklemek letiim kutusuna ekleyebileceiniz basit bir kontrol statik dzenleme kontroldr. Statik dzenleme kontrol iletiim kutusu ile etkileim gerektirmez. Genellikle iletiim

41 kutusunun ierdii dier kontroller iin dz metin etiketi olarak kullanlr. Statik dzenleme kontrol eklemek iin u admlar izleyin. Kontrol ara ubuundan Static Text kontroln sein. letiim kutusu zerinde hareket edildiinde imle art iaretine dnr. mleci iletiim kutusunun ortasna getirin ve sol tula tklayn. Statik bir dzenleme kontrol yaratlr ve kontrol Static etiketini ierir. Statik dzenleme kontrolnn etiketini deitirmek iin kontrole farenin sa tuuyla tklayn ve ksayol mensnden Properties komutunu sein, bal Merhaba olarak deitirin. letiim grntlendiinde statik dzenleme kontrol grnr haldedir. Dzenleme kontrolleri, kontrollere etiket vermek veya deimesi pek muhtemel olmayan mesajlar grntlemek iin mkemmel bir seimdir. Dzenleme kontrolnn kenarlarn fare ile srkleyerek kontroln bykln ve konumunu deitirmeyi deneyin. letiim Kutusu in Snf Yaratmak Programnzda iletiim kutusu ile etkileimlerin ounu idare etmek iin CDialog snfn kullanabilirsiniz. CDialog snf iletiim kutusunu kullanmay kolaylatran ye fonksiyonlar ierir. zellikle sizin yarattnz iletiim kutusu iin CDialog snfndan bir snf retmek iin ClassWizard kullanmalsnz. ClassWizard balatmak iin u metotlardan herhangi birini kullann: Developer Studioda CTRL+W tularna basn. View mensnden ClassWizaerd sein. letiim kutusunu editrnde herhangi bir yere farenin sa tuuyla tklayn ve alan menden ClassWizard sein.

ClassWizard IDD_MERHABA gibi yeni bir kaynan eklendiini bilirse, bir iletiim kutusu yeni kutusu kayna iin iki seenek arasnda bir seim yapmanz ister. Bu iki seenek: Yeni bir snf yaratmanz ya da Mevcut bir snf semenizdir.

ClassWizard, yeni iletiim kutusu kaynan ynetecek bir snf yaratmak iin New Class iletiim kutusunda girdiiniz deerleri kullanr. IDD_MERHABA iletiim kutusuna ait deerleri girmek iin aadaki tablodaki deerleri kullann. Kontrol Name File Name Base Class Dialog ID Automation Deer CMerhabaDlg MerhabaDlg.cpp CDialog IDD_MERHABA None

OK dmesine tklayn. CMerhabaDlg snf retilecek ve projenize iki dosya eklenecektir:

42 MerhabaDlg.h dosyas snf bildirimini ierir. MerhabaDlg.cpp dosyas snf tanmn ierir

letiim Kutusuna lk Deerler Vermek in Bir Mesaj Yneticisi Yaratmak letiim kutusundaki tm kontroller yaratldnda iletim sistemi iletiim kutusuna WM_INITDIALOG mesajn gnderir. ou iletiim kutusu, gerekli her tr ilk deer verme ilemini gerekletirmek iin WM_INITDIALOG mesajn kullanr. CMerhabaDlg snfn projenize ekledikten sonra, WM_INITDIALOG gibi mesajlar iin bir fonksiyon eklemek amacyla ClassWizard kullanabilirsiniz. WM_INITDIALOG iin bir mesaj yneticisi eklemek zere u admlar izleyin: CTRL+W tularna basarak veya bir kaynak kod penceresinde farenin sa tuuyla tklayp menden ClassWizard seerek ClassWizard an. Message Maps sekmesini setikten sonra Class Name listesinden mesajla ilgili ilem yapacak olan snf (bu rnekte, CMerhabaDlg snfn) sein. Object ID liste kutusundan mesaj reten nesneyi (bu rnekte CMerhabaDlg nesnesini) sein. Messages liste kutusuna gnderilen mesajlarn listesi grntlenecektir. Messages liste kutusundan WM_INITDIALOG mesajn sein ve Add Function dmesine tklayn. ClassWizard CMerhabaDlg snfna otomatik olarak OnInitDialog fonksiyonunu ekleyecektir. ClassWizard kapatmak iin OK dmesine tklayn.

CMerhabaDlg::OnInitDialog fonksiyonunun aslnda deikenlere ilk deer vermesi gerekmez. Bunun yerine bir mesaj kutusu grntleyebilirsiniz. OnInitDialog fonksiyonunu aadaki kod gibi deitirin.
BOOL CMerhabaDlg::OnInitDialog() { CDialog::OnInitDialog(); AfxMessageBox(Merhaba iletiim kutusu alacak!); return TRUE; }

Yeni letiim Kutusu in Men Seenei Eklemek Projeniz tarafndan kullanlan menye bir men maddesi eklemek iin bu ksmdaki admlar izleyin. Menler projenizde kaynaklar olarak saklanr. O anki men kaynaklarn grntlemek iin proje alma alan penceresinde ResourceView sekmesini sein. Kaynak aacn o anki proje iin tanmlanm farkl kaynak tiplerini gsterecek ekilde geniletin; klasrlerden birisi Menu adndadr. IDR_MAINFRAME adl tek meny grmek iin Menu klasrn an. Menkaynak ikonuna ift tklayarak men kaynan an. Men dzeltilmeye hazr biimde kaynak editrnde grntlenir. st seviyeli bir men maddesine tklamak o madde ile ilikilendirilmi alan meny grntler. Her mennn son maddesi men kaynana yeni men maddeleri eklmek iin kullanlan bo bir kutudur. Btn men maddeleri ilk nce bir men kaynann sonuna eklenilir ve sonra doru konumlarna tanr. Yeni bir men maddesi eklemek iin u admlar izleyin:

43

Men Properties iletiim kutusunu grntlemek iin File mensndeki bo kutuya ift tklayn. Bir men maddesi eklemek iin bir men ID ve balk girin. Bu rnek iin men ID olarak ID_FILE_MERHABA ve men bal olarak &Merhaba girin. Editre geri dnmek iin Menu Properties iletiim kutusunun dnda herhangi bir yere tklayn.

Bir men maddesi ekledikten sonra bir sonraki adm yeni men maddesi ile ilgili mesaj yneticisi fonksiyonunu eklemektir. ID_FILE_MERHABA men maddesi iin bir mesaj yneticisi fonksiyonu eklemek zere u admlar izleyin: CTRL+W tularna basarak ve ya kaynak kod penceresinde farenin sa tuu ile tklayp menden ClassWizard seerek ClassWizard an. Message Maps adl sekmeyi sein ve mesajla ilgilenecek snf (bu rnekte CMainFrame snfn) sein. Object ID liste kutusundan mesaj reten nesneyi (bu nekte ID_FILE_MERHABA) sein. Messages liste kutusunda iki tane mesaj yneticisi fonksiyonu grntlenir. Messages liste kutusundan COMMAND mesajn sein ve Add Function dmesine tklayn. Fonksiyon ad olarak ClassWizardn nerdii OnFileMerhaba ismini kabul edin. ClassWizard kapatmak iin OK dmesine tklayn.

CmainFrame::OnFileMerhaba fonksiyonunu aadaki gibi deitirin.


Void CmainFrame::OnFileMerhaba() { ChelloDlg dlgMerhaba; if (dlgMerhaba.DoModal()==IDOK) AfxMessageBox(OK Butonuna Tkland!); Else //IDCANCEL AfxMessageBox(Cancel Butonu Tkland!); }

MainFrm.cpp dosyasna MerhabaDlg.h dosyasnda bulunan CMerhabaDlg snfnn tanmn dahil etmek iin MainFrm.h dosyasn dahil eden include deyiminin hemen zerine aadaki satr ekleyin.
#include MerhabaDlg.h

Projenizi altrn. DoModal ye fonksiyonu arldnda IDD_MERHABA iletiim kutusu grntlenir. letiim kutusunun dmelerinden birine basarak kutuyu kapatmadan fonksiyon sonlanmaz. OK dmesine basarsanz dndrlen deer IDOKdir. Cancel dmesine basarsanz dndrlen deer IDCANCELdr.

Dme Kontrolleri

44

Dme Nedir?
Dme genellikle bir iletiim kutusunda, ara ubuunda veya kontroller ieren dier pencerelerde bulunan, yaz veya bitmap bir etiket ieren zel bir pencere tipidir. Windowsda be tip dme vardr. Baslr Dme: Hemen hemen btn iletiim kutular kullancnn gerekletirebilecei bir ilemi belirtmek iin en az bir baslr dme (pushbutton) ierir. Bunlar yaygn olarak bir iletiim kutusunu kapatmak, bir arama ilemini balatmak veya yardm istemek iin kullanlr. Radyo Dmesi: Birden fazla seenek arasndan sadece birinin seilmesi gerektii durumlarda (rnein kullanc cinsiyet seimi yapacanda) radyo dmeleri (radio button) kullanlr. ounlukla bir arada gruplanm olan radyo dmelerinden belli bir anda yalnzca birisi seilebilir. Onay Kutusu: Onay kutular (check box) beli bir koulun True (doru) ya da False (yanl) olduunu belirtmek iin Boolean gstergeleri olarak kullanlr. Radyo dmelerinden farkl olarak, bir gruptaki ok sayda onay kutusu seilebilir. Seime bal olarak onay kutular nc bir durumu da destekler. Bu, kontroln ne True ne de False olduunu gsteren, onay kutusunun kullanlmaz olduu durumdur. Grup Kutusu: Bir grup kutusu (group box) benzer amalar iin kullanlan kontrolleri mantksal olarak gruplar. Bu sayede kullanc kontroller arasndaki ilikiyi kolaylkla anlayabilir ve iletiim kutusunun kullanm kolaylar. Radyo dmeleri hemen her zaman bir grup kutusu iinde yer alr, bylece hangi kontrollerin birbirleriyle ilikili olduu anlalr.

Grup Kutusu (Group Box) Onay Kutusu (Check Box)

Baslr Dme (Push Button) Radyo Dmesi (Radio Button)

ekil 2.1 Kontroller Penceresi

Dmeler in MFC Destei


Dme kontrolleri normalde bir iletiim kutusunun paras olarak yaratlr. Bir iletiim kutusuna bir dme ekledikten sonra dmeye basldnda ve ya dme seildiinde yaratlan

45 olaylar karsnda ne yaplacan belirleyen fonksiyonlar eklemek iin ClassWizard kullanabilirsiniz. Ayrca dme kontrolleriyle ilikili CButton nesnelerini yaratmak iin ClassWizard kullanabilirsiniz. Hem bir iletiim kutusu kaynana eklenen dmelerle hem de dinamik olarak yaratlan dmelerle etkileim iin MFC CButton snfn kullanabilirsiniz. Bir dme kontroln belli bir CButton nesnesiyle ilikilendirmek iin ClassWizard kullann.

Dme Kontrollerinin zellikleri


Btn kontroller gibi dmelerde her kontroln davrann tamamlayan bir zellikler kmesine sahiptir. Be farkl dme kontrol tipi olmasna ramen bunlar ortak zelliklere sahiptir. Belli bir kontroln zelliklerini grntlemek iin kontrol farenin sa tuuyla tkladnzda kan menden Properties komutunu seebilirsiniz. Dme kontrol aadaki zelliklere sahiptir. ID: Dmenin kaynak IDsi Developer Studio IDC_BUTTON1 gibi varsaylan bir kaynak IDsi verir. Kontrollerin kaynak IDsi olarak IDC_nekini kullanmak Microsoftun bir isimlendirme standarddr. Caption: Dmenin etiketi olarak gzken yazy belirtir. Developer Studio, Button gibi saylan bir deerdir. Dmeyi, bu balktaki harflerden birine basarak klavyeden aktive etmek iin o harfin bana & karakterini ekleyin. Visible: Dmenin balangta grnr olup olmayacan belirler. Bu onay kutusu normalde iaretli durumdadr. Disabled: Dmenin balangta kullanlmaz durumda olacan gsterir. Bu onay kutusu normalde iaretsiz durumdadr. Group: Bir gruptaki ilk kontrol iaretler. Bu onay kutusu iaretlenemezse, bu zellie sahip bir kontrol eden kontroller ayn grubun paras olarak kabul edilir. Kullanc ok tularn kullanarak ayn group iindeki kontroller arasnda gezinebilir. Tab Stop: Bu kontrole klavyedeki Tab tuuna baslarak eriilebileceini gsterir. Bu onay kutusu normalde seilmemitir. Default Button: Bu kontrol iletiim kutusuna varsaylan dmesi olarak belirler. Bir iletiim kutusunda yalnzca bir tane varsaylan dme olabilir ve iletiim kutusunda herhangi baka bir kontrol kullanmadan Entera baslarak bu dme altrlabilir. Bu zellik yalnzca baslr dme kontrolleri iin kullanlabilir. ou durumda bu onay kutusu iaretsiz durumdadr. Owner Draw: Dmenin sahibi tarafndan izileceini belirtir. Bu zellik yalnzca baslr dme kontrolleri iin kullanlabilir. ou durumda bu onay kutusu iaretsiz durumdadr. Help ID: Bu kontrol iin ortama duyarl bir yardm IDsi yaratr. Bu seenek normalde seili deildir.

46 Icon: Bu kontroln yaz yerine bir icon gstereceini belirtir. kon, SetIcon fonksiyonu kullanlarak dmeye atlr. Bu seenek normalde seili deildir. Bitmap: Bu kontroln yaz yerine bir bitmap gstereceini belirtir. Bitmap, SetBitmap fonksiyonu kullanlarak dmeye atanr. Bu seenek normalde seili deildir. Notify: Mesajlarn kontroln sahibine gnderilmesi gerektiini belirtir. Bu seenek seilmese bile dme tklama mesajlar kontrol sahibine gnderilecektir. Bu onay kutusu normalde seili deildir. Horizantal Alignment: Yaznn yatay olarak nasl hizalanacan gsterir. Seilebilecek seenekler Default, Left, Right ve Centerdr. Bu zellik normalde default olarak seilidir. Multiline: Dme zerindeki yaz tek satra smayacak kadar uzunsa yaznn birden fazla satr halinde gsterilmesini salar. Bu zellik grup kutular iin kullanlmaz bu onay kutusu normalde iaretli deildir. Flat: Dmenin 3-boyutlu efektler olmadan izilmesi gerektiini belirtir. Bu stil grup kutular iin kullanlmaz. Bu onay kutusu normalde iaretli deildir. Vertical Alignment: Yaznn dikey olarak nasl hizalanacan gsterir. Seenekler Default, Top, Bottom ve Centerdr. Bu zellik normalde Default olarak seilidir. Auto: Kontroln tklandnda deil seildiinde durum deitirmesi gerektiini belirtir. Bir kontrol tklamadan semek iin Tab tuuna basmanz gerekir bu zellik yalnzca onay kutular ve radyo dmeleri iin kullanlabilir. Bu onay kutusu normalde iaretli deildir. Left Text: Yaznn kontroln sol tarafna yerletirilmesinin gerektiini belirtir. Bu zellik yalnzca onay kutular ve radyo dmeleri iin kullanlabilir. Bu onay kutusu normalde iaretli deildir. Push-Like: Bir radyo dmesi yada onay kutusunun basl dme gibi izileceini belirtir. Kontroln iaretlendiinde veya seildiinde aaya gml grnr. Tri-State: Bir onay kutusunun iki deil durumlu olabileceini gsterir. True ve False durumlarna ek olarak, kontrol kullanlmaz durumda da olabilir. Bu durumda onay kutusunun durumu ne True ne de Falsedur.

letiim Kutularnzda Standart Baslr Dme Dzenleri Kullanmak


Kontroller ieren iletiim kutularnda ok sayda baslr dme yaygn olarak kullanlr. Bu dmelerin her biri zel bir anlam tadndan mmkn olduka standart terminolojiyi

47 kullanmanzda fayda var nk bu sayede programlarnzn kullanclarnn ii en aza indirgenir. Aada bu dmelerin standart anlamlar verilmektedir. OK: letiim kutusundaki bilgileri kabul edip kutuyu kapatmak iin kullanlr. letiim kutusunda kullancnn girdii tm bilgiler program tarafndan kullanlr. OK dmesinin tm harfleri byk harf olan tek dme olduuna dikkat edin. Cancel: letiim kutusu akken yaplan deiiklikleri iptal edip iletiim kutusunu kapatmak iin kullanlr. Geri dndrlmeyecek deiiklikler yapldysa bu dmenin etiketi Close yaplmaldr. Close: iletiim kutusunu kapatmak iin kullanlr. Programn herhangi bir ilem yaptn gstermez. letiim kutusu akken yaplan deiiklikleri iptal etmek iin Cancel dmesi kullanlmadnda Close kullanlr. Bir ok rpogram Cancel dmesini Close olarak deitirir. Help: Ak iletiim kutusu iin ortama duyarl yardm istemek iin kullanlr. Apply: letiim kutusunda girilen verilere dayanarak deiiklik yapmak iin kullanlr. OK dmesinden farkl olarak Apply dmesine basldnda iletiim kutusu ak kalmaldr.

ye Deikenleri Bir Dme Kontrol le likilendirme


Bir deere kontrol atamann veya kontroln deerini renmenin en kolay yolu ClassWizard kullanarak kontrol snfn bir ye deikeniyle ilikilendirmektir. Bir ye deikeni bir kontrol ile ilikilendirirken ye deikeni kontrol ile veya kontroln deeri ile ilikilendirebilirsiniz. Dmeleri temsil eden ye deikenlerin deer zerinden ilikilendirilmesi ok nadirdir. Bunun yerine bir ok dme kontroln temsil etmek iin CButton snf kullanlr. CDialog snfndan tretilmi bir snfa bir ye deiken eklemek iin ua admlar izleyin. ClassWizard an. Member Variables adl sekmeyi sein. letiim kutusunu yneten CDialogdan tretilmi snf sein. Yeni ye deikenle ilikilendirilmi kontrol temsil eden kontrol IDsini sein. Add Variable adl dmeye basn. Add Member Variable iletiim kutusu grnecektir. Kontroln adn, kategorisini ve deiken tipini girdikten sonra OKe tklayn. ClassWizard kapatn.

Bir letiim Kutusu Snfna Dme Olaylar Eklemek


Dmeler iletiim kutusu kaynann paralar olmasna ve iletiim kutusu her gsterildiinde grnmesine ramen dmeler kullanlmadnda bir ey olmaz nk iletiim kutusu snf dme olaylar karsnda ne yaplacan bilmemektedir.

48 Baslr dmeler normalde bir iletiim kutusu snfndaki dme olaylar ile ilikilendirilmitir. Dme tklamas ile gerekleecek bir olay eklemek iin aadaki admlar izleyin. ClassWizard an. Message Maps adl sekmeyi sein. lgili iletiim kutusu snfn sein. Nesne (Dme) IDsini sein. Messages liste kutusundan BN_CLICKED sein. Add Function dmesine basn ve ye fonksiyon iin nerilen varsaylan ismi kabul edin. ClassWizard kapatn.

Dmeleri Kullanlabilir Ve Kullanlamaz Hale Getirmek


ou kontrol varsaylan olarak bata kullanlabilir durumdadr. lgili zellik kontroln zellik listesinde ayarlanarak kontrol kullanlmaz hale getirilir. Bir kontrol yalnzca kullanlabilir haldeyse seilebilir. CWnd snf bir CWnd nesnesinin kullanlabilir veya kullanlamaz olmasn salayan EnableWindow ye fonksiyonunu ierir. CButton ve tm dier kontroller CWnd snfndan tretildiinden CWnd snfndaki tm ye verileri ve ye fonksiyonlar ierirler. Bir dmeyi u ekilde kullanlamaz hale getirebilirsiniz.
PButton -> EnableWindow(FALSE); // Kontrol kullanlmaz hale getirir

Pencere veya kontrol kullanlabilir duruma getirilecekse EnableWindow fonksiyonunun parametresi True, aksi halde False olmaldr. EnableWindowun parametresinin varsaylan deeri Truedur nk kontrol kullanlabilir hale getirmek iin bir parametre gerekmez.
PButton -> EnableWindow(); // Kontrol kullanlabilir hale getirir

Dme ve dier kontrollerin iletiim kutusu tarafndan alnan olaylara bal olarak kullanlabilir veya kullanlamaz hale getirilmesi yaygn bir ilemdir. rnek olarak, bir dmeye basmak baka bir dmenin kullanlabilir veya kullanlamaz hale getirilmesine neden olabilir. rnein:
void CbuttonDlg::OnBtnTest() { static BOOL bEnableControl = FALSE; m_btnAmp.EnableWindow(bEnableControl); if(bEnableControl == TRUE) bEnableControl = FALSE; else bEnableControl = TRUE; }

Dmeleri Gizleme
Bir iletiim kutusundaki bir dmeyi gizlemeniz gerekebilir. CWnd snf gerektiinde bir pencereyi gizlemek veya gstermek iin kullanlabilecek bir ye fonksiyonuna sahiptir. CWnd::ShowWindow ye fonksiyonunu u ekilde kullanlr.
PButton -> ShowWindow (SW_HIDE); //Kontrol gizler

49

Bu kod bir dme kontrol olan pButton penceresini gizler. Gizlenmi bir pencereyi gstermek iin ShowWindow fonksiyonu SW_SHOW parametresiyle kullanlr.
PButton -> ShowWindow (SW_SHOW); //Kontrol gsterir

Bir rnekle kullanalm.


void CbuttonDlg::OnBtnTest() { static int nShowControl = SW_HIDE; m_btnAmp.ShowWindow(nShowControl); if(nShowControl == TRUE) nShowControl = SW_HIDE; else nShowControl = SW_SHOW; }

Sekme Srasn Tanmlama ve Ayarlama


Bir iletiim kutusu kullancya sunulduunda klavye kontrollerden birinde odaklanm olur. Bu kontrol klavyeden giri alr. Bir kontrole odaklandnda o kontroln etrafnda noktal bir ereve izilir. Kullanc klavyeden Tab tuuna basarak yeni bir kontrole odaklanabilir. Her tab tuuna basldnda yeni bir kontrole odaklanr. Bunun nasl altn tam bilmiyorsanz Developer Studiodaki iletiim kutularndan bazlarnda bunu denemek isteyebilirsiniz. Kontroller daima sekme sras (tab order) olarak bilinen sabit bir srada seilirler. Sekme sras kullanclarn fare kullanmadan kontrolleri semesine olanak salar. Hemen hemen tm Windows kullanclar fare kullanmalarna ramen bazen klavyeyi kullanmak daha uygundur. Ayrca Windows iletiim kutularnda kontroller arasnda Tab tuuyla gei yapmak standart bir zellik olduundan bu zellii doru kullanmanz gerekir. Bir iletiim kutusunda sekme srasn kontrollerin kaynak kodunda tanmland sray izler. Yeni kontroller ekledike bunlar sekme srasnn sonuna yerletirilir. Bu sray deitirmek iin Developer Studionun ierdii kaynak aralarn kullanabilirsiniz.

Dzenleme Kontrolleri
Dzenleme Kontrollerini Anlama
Bir dzenleme kontrol kullancnn girdii metni saklamak iin kullanlan bir penceredir.

50 Tek satrlk dzenleme kontrol tek satrlk metin girilmesine izin veren bir dzenleme kontroldr. ok satrl dzenleme kontrol birden fazla metin satr girilmesine izin veren bir dzenleme kontroldr. Dzenleme kontrolleri genellikle iletiim kutularnda bulunurlar. Kullanc girii gerekli olan hemen her yerde bir dzenleme kontrol bulabilirsiniz.

Dzenleme Kontrolleri Niin Kullanlr?


Kullancdan bir metin girii alnmas gerektiinde tek satrlk dzenleme kontrol kullanrsnz. rnein, bir iletiim kutusunda bir isim ya da adres girilmesi gerektiinde o bilgiyi almak iin bir dzenleme kontrol kullanlmaldr. ok satrl dzenleme kontrolleri ounlukla grntlenebilenden daha fazla metin girilmesine olanak salayan kaydrma ubuklarna sahiptir. Bir dzenleme kontrolnde kullancya varsaylan bir metin hazr olarak sunulabilir. Bu baz durumlarda kullancnn girmesi gereken yaz miktarn azaltabilir. Ayrca tm dzenleme kontrolleri sizin fazladan bir programlama yapmanza gerek kalmadan snrl miktarda metin dzeltme ilemini destekler. rnein standart kesme ve yaptrma komutlar bir dzenleme kontrolnde de beklendii gibi alr.

Dzenleme Kontrolleri in MFC Destei


Bir iletiim kutusuna kontrol ekledikten sonra kontrol programda kullanmak zere Class Wizard kullann. Dzenleme kontrolleriyle etkileim ounlukla CEdit adl MFC snf kullanlr. Bir dzenleme kontrol belli bir CEdit nesnesiyle ilikilendirmek iin Class Wizard kullanabilirsiniz. Bir dzenleme kontrol, dzenleme kotnrollerinin iletiim kutularnda kullanmn kolaylatrabilen CString nesnesiylede ilikilendirilebilir.

Dzenleme Kontrollerinin zellikleri


Dzenleme kontrolne farenin sa tuuyla tklayp alan menden Properties komutunu seerek dzenleme kontrolnn zelliklerini inceleyebilirsiniz. Bir dzenleme kontrol aada verilen genel zelliklere sahiptir. ID: Dzenleme kontrolnn kaynak IDsi iin kullanlr. Dier kontrollerde olduu gibi dzenleme kontrol iinde Developer Studio varsaylan bir kaynak IDsi nerir. Visible: Dzenleme kontrolnn balangta grnr olduunu belirtir. Bu seenek normalde seili durumdadr. Disabled: Metin kutusunun balangta kullanlamaz durumda olacan belirtir. Bu seenek normalde seilmemi durumdadr. Group: Bir gruptaki ilk kontrol belirlemek iin kullanlr. Bu zellii olan bir kontrol izleyen tm kontroller eer bu zellik iaretlenmemise ayn grubun paras olarak kabul edilirler. Kullanc ok tularn kullanarak bir grup iindeki kontroller arasnda gezinebilir.

51 Help ID: Bu kontrol iin ortama bal duyarl bir yardm IDsi yaratr. Tab Stop: Bu kontrole Tab tuuna baslarak eriilebileceini gsterir. Bu seenek normalde seili durumdadr. Ayrca yalnzca dzenleme kontrolleri iin geerli zellikler vardr. Properties iletiim kutusundaki Styles sekmesine tklanarak aadaki zellikler grntlenebilir. Align Text: Dzenleme kontrol ok satrl ise kullanlabilen bir alan liste. Metin sola, ortada veya saa hizalanabilir. n deer sola hizalamadr. Multiline: Kontroln ok satrl bir dzenleme kontrol olacan belirtir. Bu seenek normalde seili deildir. Number: Dzenleme kontrolne yalnzca rakam girilebileceini gsterir. Horizontal Scroll: Yalnzca ok satrl dzenleme kontrollerinde kullanlabilir ve yatay bir kaydrma ubuu yaratr. Bu seenek normalde seili deildir. Auto HScroll: Metni gerekirse saa kaydrr. Bu seenek normalde seilidir. Vertical Scroll: Yalnzca ok satrl dzenleme kontrollerinde kullanlabilir ve dey bir kaydrma ubuu yaratr. Bu seenek normalde seili deildir. Password: Kullancn girdii her karakter yerine yldz iareti gstererek kullanc giriini gizler. Bu seenek yalnzca tek satrl dzenleme kontrollerinde geerlidir ve normalde seili deildir. No Hide Selection: Bir dzenleme kontrolne odaklanldnda kontroln davrann deitirir. Bu seenek seildiinde metin hep seili grnr. Bu seenek normalde seili deildir. OEM Convert: Programn AnsiToOem fonksiyonunu armas halinde fonksiyonun doru almasn salamak iin kullanc girii zerinde dnmler gerekletirir. Bu senek normalde seili deildir. Want Return: ok satrl dzenleme kontrollerinde geerlidir. Bu seenek, dzenleme kontrolnn Enter tuuna baslmasn kabul etmesine olanak salarken Enter tuuna baslmas iletiim kutusunun varsaylan baslr dmeyi etkilemesine engel olur. Border: Kontroln evresinde bir snr yaratr. Bu seenek normalde seilidir. Uppercase: Tm girii byk harfe evirir. Bu seenek normalde seili deildir. Lowercase: Tm girii byk harfe evirir. Bu seenek normalde seili deildir. Read-only: Kullancnn dzenleme kontrolne giri yapmasn veya kontroldeki metni deitirmesini nler. Bu seenek normalde seili deildir.

52

Bir CEdit Nesnesini Bir Dzenleme Kontrolne Balamak


Daha nce sz edildii gibi, bir dzenleme kontrol ile etkileimde bulunmann bir yolu kontrole ilitirilmi bir CEdit nesnesi araclyladr. Bir dzenleme kontrolne bir CEdit nesnesi ilitirmek iin daha nceki konuda dme kontrolleri iin yaptnz biimde ClassWizard kullanacaksnz. Class Wizard an. letiim kutsunu yneten CDialog snfndan tretilmi snf sein. Member Variables etiketli sekmeyi sein. Yeni ye ile ilikilendirilmi kontrol temsil eden kontrol IDsini sein. Add Variable dmesini tklayn. Add Variable iletiim kutusu grnecektir. Kontroln adn, kategorisini ve deiken tipini girip OK tklayn. Category kontrolnde grlen varsaylan deer Value dur. Value kategorisi bu daha sonra DDV ve DDX rutinlerini rendiinizde baz ye deikenler iin kullanlacaktr.

Bir Dzenleme Kontrolne Girilen Metni Almak


Dzenleme kontrolleri kullanmann asl amac elbette ki kullancdan bilgi toplamaktr. Bunu yapmak iin dzenleme kontrolne girilen bilgiyi almanz gerekir. CEdit snfn kullanmak bu ilemi kolaylatrr.

Girilen Metni Almak in CEdit Fonksiyonlarn Kullanmak


Bir dzenleme kontrolne girilen bilgiyi alrken GetWindowText ve LineLength ye fonksiyonlar gibi eitli CEdit ye fonksiyonlar kullanlr. rnek olarak u ekilde kullanabilirsiniz.
Void CTestDlg::OnTest () { CString szEdit; CString szResult; int nLength = m_editTest.LineLength(); m_editTest.GetWindowTest( szEdit ); szResult.Format(%s has %d chars, szEdit, nLength); AfxMessageBox(szResult); }

Test dmesine tkladnda m_editTest nesnesi kullanlarak dzenleme kontrolne girilen yaz alnr. Yaz szEdit adl bir CString nesnesine yerletirilir. CString snfnn format ye fonksiyonu, ilk parametrede aktarlan desen kullanarak karakter katarnn ieriini biimlendirir. CStringin ieriini yaratmak zere birletirilen ilave parametreler iin %s ve %d gibi semboller kullanabilirsiniz. %s sembol karakter katarlar iin %d sembol int veri tipi iin kullanlr.

53 Normalde yalnzca OK dmesine tklanrsa metin kutusuna girilen veri ile ilgilenirsiniz. Cancel dmesini tklandysa iletiim kutusu kapanmal ve girilen herhangi bir veri gzard edilmelidir.

DDV ve DDX Rutinlerini Kullanarak letiim Kutularna Parametre Aktarm


DDV ve DDX rutinleri iletiim kutular iin verilen ynetmeye yardmc olan yardmc fonksiyonlardr. DDV (Dialog Data Validation) rutinleri verilerin geerlilii iin kullanlr. DDX (Dialog Data Exchange) rutinleri bir iletiim kutusundaki kontrollere veri aktarmak iin kullanlr.

DDV ve DDX Rutinleri Niin Kullanlr?


DDV rutinleri bir dzenleme kontrolne girilen veriyi alrken ok kullanldr. Genelde kullancnn bir dzenleme kontrolne girdii veri zerinde ok az kontrole sahipsinizdir. DDV deer aral veya karakter katar uzunluuna bal olarak veri geerliliini basit bir biimde test etmenize olanak salar. rnein bir dzenleme kontrolne ksaltlm bir eyalet ismi girilecekse girilen metni iki karakterle snrlandrmak istersiniz. Bir DDV rutini kullanarak yalnzca iki karakter girildiinden emin olmak kolaydr. DDX fonksiyonlar iletiim kutusu snfndaki ye deikenleri iletiim kutusunun ierdii kontrollere baldr. DDX rutinleri verilerin kontrollere aktarlmasn ve kontrollerden alnmasn ok kolaylatrr.
CMyDialog dlgMine; DlgMine.DoModal();

Bu rnekte DoModal arldnda iletiim kutusu yaratlr ve kullanc iletiim kutusunu kapatana kadar fonksiyon sonlanmaz. letiim kutusuna veri aktarmak veya kutudan veri almak gerekirse bu durumda sorun yaratr. letiim kutusu yaratlana kadar hibir kontrol mevcut olmadndan iletiim kutusunun ierdii kontrollerle dorudan etkileimde bulunmak iin SetWindowText, GetWindowText gibi fonksiyonlar kullanmak mmkn deildir. letiim kutusu kapandktan sonra kullanc girilerini almak iin bu fonksiyonlar kullanmak artk ok getir. Bir iletiim kutusuyla bilgi al veriinde bulunmak iin DDX rutinleri kullanldnda iletiim kutusu yle kullanlabilir.
CMyDialog dlgMine; dlgMine.m_szTest = Merhaba Dnya; dlgMine.DoModal();

DDX rutinleri iletiim kutusu yaratlmadan nce ve yaratldktan sonra iletiim kutusunun kontrollerine eriebilmenizi salarlar. Bu durum iletiim kutusunu programlamay kolaylatrr nk bu yntem InitDialog ye fonksiyonuna kod eklemekten ok daha esnek bir yntemdir.

54

DDV ve DDX Rutinlerini Kullanmak


letiim kutusu snfnza DDV ve DDX rutinleri eklemenin en kolay ve en kullanl yolu ClassWizard kullanmaktr. letiim kutusu kontrolleriyle deer zerinden ilikilendirilmi ye deikenleri otomatik olarak MFCnin sunduu DDV ve DDX rutinlerini kullanr. rnein CString ye deikenleri ounlukla dzenleme kontrolleriyle ilikilendirilmitir. ClassWizard veri deiimi ve geerliliini ynetmek iin iki yere kaynak kod ekler. ye deikene ilk deer vermek iin iletiim kutusunun yaplandrcsna kaynak kod eklenir. ClassWizard, bir kontroln deeriyle ilikilendirilmi her ye deikeni iin iletiim kutusunun DoDataExchange ye fonksiyonuna DDV ve DDX rutinleri ekler. DoDataExchange kontrol ile iletiim kutusunun ye deikeni arasnda veri aktarm iin MFC tarafndan arlan sanal bir fonksiyondur. DoDataExchange ye fonksiyonu asla dorudan armazsnz; Bunun yerine UpdateData fonksiyonunu arrsnz ve MFC yaps DoDataExchange fonksiyonunu sizin iin arr. UpdateData fonksiyonu TRUE ve FALSE deerini alabilen tek bir parametre alr. Parametrenin varsaylan deeri TRUEdur. UpdateData (FALSE) arldnda veri ye deikenden kontrole aktarlr. UpdateData (TRUE) arldnda veri kontrolden ye deikene kopyalanr. letiim kutusu CDialog::OnInitDialog srasnda ilk grntlendiinde, ye deikenlerden iletiim kutusunun kontrollerine veri aktarm iin UpdateData(FALSE) arlr. Daha sonra CDialog::OnOK srasnda iletiim kutusunun kontrollerinden ye deikenlere veri aktarmak iin UpdateData() arlr.

Bir Kontroln Deerini Bir ye Deikenle likilendirmek


Bir kontroln deeriyle ilikilendirilmi ye deiken ekleme ilemi daha nce yaptnz kontrol-tip deikeni ekleme ilemine ok benzer. rnein IDD_EDIT_TEST dzenleme kontrolyle ilikilendirilmi bir ye deikeni yaratmak iin u admlar izleyin : ClassWizard an. letiim kutusunu yneten CDialog snfndan tretilmi snf sein. Member Variables sekmesini sein. Yeni ye deikenle ilikilendirilmi kontrol IDsini sein. Add dmesini tklayn. Add Member Variable iletiim kutusu grlecektir. Kontroln adn, kategorisini ve deiken tipini girip OK dmesine tklayn. Add Member Variable iletiim kutusunu kapattktan sonra, ClassWizard ye deiken zerinde kullanlacak geerlilik kriterini belirtmek iin kullanabileceiniz bir dzenleme kontrol grntler. Bir dzenleme kontrolyle bir CString nesnesi ilikilendirilmise maksimum karakter katar uzunluu girilebilir. Saysal bir deiken kullanldysa izin verilen deer aral tanmlana bilir.

55

Liste Kutusu Kontrol


Liste kutusu (List Box) kontrolleri seilebilecek maddeler listesidir. Kullanc klavyeyi kullanarak veya fare ile bir maddeye tklayarak maddeleri seebilir. Tek-seimlik liste kutusu (Single-selection List Box) bir anda tek bir maddenin seilmesine izin verir. Bir liste kutusunun varsaylan ekli budur. ok-seimli liste kutusu (Multiple-selection List Box) bir anda birden fazla maddenin seilmesine izin verir. Bir liste kutusu normalde bir iletiim kutusu, kontrol ubuu veya kontroller ieren herhangi bir pencerede bulunabilir. Liste kutular ounlukla ok sayda e ierir. Baz eler grntlenemiyorsa kullancnn listede gezinmesine yardmc olmak iin bir kaydrma ubuu grnr.

Liste Kutular Niin Kullanlr?


Liste kutular ok sayda maddenin kullancya grntlenmesini salayan en basit kontrollerdir. Genelde liste kutular veri tabanlarndan veya raporlardan elde edilen bilgileri grntlemek iin kullanlr. Liste kutusunun byklnn deitirilmesi gerekmediinden bu tr veriler iin ok uygundur. Sralanm bir liste kutusu kullanldndan, kullancnn ok sayda madde arasnda arama yapp bir seim yapmas kolaylar. Liste kutularn programlarnzda kullanmak ok kolaydr bir liste kutusu nesnesi yarattysanz liste kutusuna tek satrlk bir kodla bir madde ekleyebilirsiniz.
listbox.AddString(Yasin);

Dier kontrollerin hibirinin kullanm hem kullanc hem de programc iin bu kadar kolay ve esnek deildir.

Liste Kutular in MFC Destei


Bir iletiim kutusuna liste kutusu ekleme ilemi, daha nceden yaptnz dme ve dzenleme kontrolleri ekleme ilemine ok benzer. Kontrol ekledikten sonra mesaj ynetim fonksiyonlar eklemek ve kontrol bir CListBox nesnesi ile ilikilendirmek iin ClassWizard kullann. Liste kutusu kontroln ynetmek ve kontrolle etkileimde bulunmak iin MFC CListBox snfn kullanabilirsiniz. Dier kontroller snflar gibi CListBox snf da CWnd snfndan tretilmitir ve CWnd fonksiyonlarnn ou CListBox nesneleriyle kullanlabilir.

Liste Kutusunun zellikleri


Dier kontroller gibi liste kutular da Developer Studio kaynak editrn kullanarak ayarlayabileceiniz zelliklere sahiptir. Bu zelliklerin bazlar dier kontrollerde de vardr,

56 bazlar ise yalnzca liste kutularna zgdr. Bir liste kutusunun sahip olduu zellikler unlardr. ID: Liste kutusunun kaynak IDsi iin kullanlr. Developer Studio IDC_LIST gibi varsaylan bir kaynak IDsi nerir. Visible: Listenin balangta grnr olduunu belirtir. Bu onay kutusu normalde iaretlidir. Disabled: Listenin balangta kullanlamaz durumda olduunu belirtir. Bu onay kutusu normalde iaretli deildir. Group: Bir gruptaki ilk kontrol belirler. Bu onay kutusu normalde iaretli deildir. Tab Stop: Bu kontrole Tab tuuna baslarak eriilebileceini belirtir. Bu onay kutusu normalde iaretlidir. Help ID: Bu kontrol iin ortama duyarl bir yardm IDsi yaratr. Selection: Bir liste kutusundaki maddelerin nasl seilebileceini belirler. Tek-seimlik liste kutusu bir anda tek bir maddenin seilebileceine izin verir. ok-seimlik liste kutular bir anda birden fazla madde seimine izin verir ama Shift ve CTRL tular grmezden gelir. Geniletilmi seimli (extended selection) liste kutular seim srasnda Shift ve CTRL tularn kullanr. Owner Draw: Dmenin sahibi tarafndan izilebileceini belirtir. ou durumda bu seenek NO olarak seilidir. Has Strings: Sahibi tarafndan izilen bir liste kutusunun karakter katarlar ierdiini belirtir. Dier tm liste kutular varsaym olarak karakter katarlar ierir. Border: Liste kutusu iin bir snr izer. Bu seenek balangta seili durumdadr. Sort: Liste kutusunun ieriinin sral olacan belirtir. Bu seenek normalde seilidir. Notify: Bildirme mesajlarn iletiim kutusuna gnderilmesi gerektiini belirtir. Bu seenek normalde seilidir. Multi-Column: ok stunlu bir liste kutusu yaratr bu seenek normalde seili deildir. Horizontal Scroll: Yatay kaydrma ubuu ieren bir liste kutusu yaratr. Bu seenek normalde seili deildir. Vertical Scroll: Dey kaydrma ubuu ieren bir liste kutusu yaratr. Bu seenek normalde seilidir. No Redraw: Liste kutusunun ierii deitiinde grnmnn gncellenmemesi gerektiini belirtir. Bu seenek ok nadir olarak seilir ve balangta seili deildir.

57 Use Tabstops: Liste kutusunda grnen yaz maddelerinin sekme ierebileceini belirtir. Bu sekme normalde seili deildir. Want Key Input: Liste kutusuna odaklanld srada tulara basldnda liste kutusunun sahibine WM_VKEYTOITEM veya WM_CHARTOITEM mesajlarnn gnderilmesi gerektiini belirtir. Bu seenek normalde seili deildir. Disable No Scroll: Gerekmese bile dey yatay ubuu grntler. Bu seenek normalde seili deildir. No Integral Height: Windowsun liste kutusunu ayn kaynak tanmndan belirtildii gibi grntlemesi gerektiini belirtir. Bu seenek normalde seilidir.

CListBox Snfn Kullanmak


nceki kontrollerde kullandmz kontrol snf gibi MFC CListBox snfda kontrol mesajlarn gizleyen bir C++ snf sayesinde yaamnz kolaylatrr ve kullanm kolay bir arabirim sunar. Bir CListBox nesnesini bir liste kutusu kontrolne ilitirmek iin nce ki kontrollerde yaptmz gibi ClassWizard kullann. ClassWizard an. letiim kutusunu yneten CDialog snfndan retilmi snf an. Member Variables sekmesini sein. Yeni ye deikenle ilikilendirilmi kontrol temsil eden kontrol IDsini sein. Add Variable dmesini tklayn. Add Member Variable iletiim kutusu grnecektir. Kontroln ad, kategorisini ve deiken tipini girip OKe klayn.

Liste Kutusuna Madde Eklemek


Bir liste kutusuna bir karakter katar eklemenin iki yolu vardr. Bir liste kutusuna bir karakter katar eklemek iin AddString ye fonksiyonu arlabilir.
m_ListBox.AddString(EFE);

Sral bir liste kutusuna girilen tm karakter katarlar liste kutusuna eklendikleri srada sralanr. Liste kutusu sral deilse eklenen madde listedeki son maddenin altna eklenir. Bir liste kutusunda belirtilen konuma bir madde eklemek iin InsertString ye fonksiyonunu kullann.
m_ListBox.InsertString(0,Yasin EFE);

Bir liste kutusundaki her madde sfrdan balayarak numaralanr. Liste kutusuna yeni madde eklenirken yer amak iin gerekirse dier maddeler aaya kaydrlr.

58 InsertString ve AddString fonksiyonlarnn ikisi de yeni maddenin sra numarasn dndrr. Bir maddeyi eklerken hata oluursa AddString veya InsertString fonksiyonlar LB_ERR hatas dndrr. Liste kutusu doluysa LB_ERRSPACE hatas dndrlr. Bir liste kutusundaki madde saysn belirlemek iin GetCount ye fonksiyonunu kullann.
nItems =ListBox.GetCount(); Liste Kutusundan Madde karmak

Bir liste kutusundan madde karmak iin DeleteString ye fonksiyonunda parametre olaak karlacak maddenin sra numarasn gnderin.
ListBox.DeleteString(8);

Bu satr liste kutusunun 9. Srasndaki maddeyi siler. Liste kutularnda sra numaralarnn 0 dan baladn unutmayn. DeleteString ye fonksiyonu liste kutusunda kalan madde saysn veya bir hata olumas halinde LB_ERR hatas dndrr. Dndrlen deer u ekilde kullanlabilir.
int nItems = ListBox.GetCount(); while (nItems > 3 && nItems != LB_ERR) nItems = ListBox.DeleteString(nItems-1);

Bu kod bir liste kutusundaki ilk 3 madde dnda btn kodlar siler. Liste kutusunu tamamen boaltmak iin ResetContent fonksiyonunu kullann.
ListBox.ResetContent();

ResetContent fonksiyonu void dndrr.

Liste Kutusu Mesajlarn Almak


Belli olaylar olduunda bir liste kutusunun ebeveynine eitli mesajlar gnderilir. Tm bu mesajlar LBN_ nekine sahiptir. Bu mesajlarn gnderilmesi iin liste kutusunun Notify zellii aktif olmaldr. Liste kutusundan ebeveynine u mesajlar gnderilir. Kullanc bir liste kutusu maddesine ift tkladnda LBN_DBLCLK mesaj gnderilir. LBN_ERRSPACE mesaj bellek eksikliinden dolay bir ilemin gerekletirilemediini gsterir. LBN_KILLFOCUS mesaj liste kutusundan baka bir kontrole odaklanlmadan hemen nce gnderilir. LBN_SELCANCEL mesaj kullanc bir kutusu seimini iptal ettiinde gnderilir. LBN_SELCHANGE mesaj liste kutusundaki seim durumu deimek zereyken gnderilir. LBN_SETFOCUS liste kutusuna odaklanldnda gnderilir. LBN_DBLCLK mesaj en sk kullanlan mesajdr. Bir ok kullanc bir liste kutusu maddesine ift tklanldnda varsaylan bir ilemin yrtlmesini bekler. rnein, dosya

59 isimleri listesi grntlendiinde bir dosya ismine ift tkland zaman o dosyann almas beklenebilir. Windowsda kullanlan tm kontrollerle ilgili mesaj yntemi fonksiyonlar eklemek iin gerekli admlar birbirine benzer. LBN_DBLCLK mesaj iin mesaj yntemi fonksiyonu yaratmak zere u admlar izleyin. ClassWizard an ve Message Maps sekmesini tklayn. CListBoxDlg snfn ve IDC_LIST IDsini sein. LBN_DBLCLK mesajn sein ve Add Function dmesine tklayn. nerilen CListBoxDlg::OnDblClkList fonksiyon adn kabul edin. Edit Code dmesine tklayn. Aada verilen kodu CListBoxDlg::OnDblClkList fonksiyonuna ekleyin.

void CListBoxDlg::OnDblClkList() { int nSelection = m_listBox.GetCurSel(); if (nSelection != LB_ERR) { CString szSelection; m_listBox.GetText(nSelection, szSelection); AfxMessageBox( szSelection ); } }

Yukarda gsterildii gibi CListBox::GetCurSel ye fonksiyonunu kullanarak liste kutusunda o anda seilen maddeyi belirleyebilirsiniz. GetCurSel ye fonksiyonu o anda seilen maddenin sra numarasn dndrr. Listedeki ilk maddenin sra numarasnn 0 olduunu unutmayn. Bir madde seilmemise veya liste kutusu oklu-seim zelliine sahipse LB_ERR hata dndrlr.

Bileik Kutu Kontrol

60 Bileik kutu (combo box) kontrol bir dzenleme kontrolyle liste kutusunun birleimidir. Bileik kutu kontrol, kullancnn bir dzenleme kontrolne yaz girer gibi veya bir liste kutusundaki eitli maddelerden birini seer gibi veri girmesine olanak salar. Kullanc yalnzca liste kutusunda sunulan maddelerle snrl olmadndan bileik kutular ok kullanldr. Bileik kutunun liste kutusu ksm kullancya yakn seenekler gstermek iin kullanrken dzenleme kontrol ksm kullancya yeni bir seim girme serbestisi tanr. tip bileik kutu vardr. Basit bileik kutular (simple combo box) bir dzenleme kontrol ve liste kutusu grntler. Dier bileik kutu tiplerinden farkl olarak liste kutusu daima grnrdr. Liste kutusu gsterilebilecek olandan daha fazla madde ierdiinde liste kutusundaki dier maddeleri de grebilmek iin bir kaydrma ubuu kullanlr. Alan bileik kutular (drop-down combo box) kullanc liste kutusunu aana kadar liste kutusunu gizler. Bu tip bileik kutularda liste iletiim kutusunda basit bileik kutulardan ok daha az yer kaplar. Alan liste kutular (drop-down list box) yalnzca kullanc at zaman liste kutusunu grntlemeleri bakmndan alan bileik kutulara benzerler. Ancak seimi gstermek iin dzenleme kontrol yerine bir statik dzenleme kontrol kullanlr. Bu nedenle kullancnn seebilecei maddeler liste kutusundaki maddelerle kstldr.

Bileik Kutularn zellikleri


Bir bileik kutu, bir dzenleme kontrolyle liste kutusunun bileimi olduundan ok sayda zellie sahiptir. Birok dzenleme kontrol ve liste kutusu stili bileik kutularda da geerli olabilecek benzer zelliklere sahiptir. Bu bileik kutu zellikleri daha nce ele alnan liste kutusu zellikleriyle zdetir. ID Visible Disabled Group Tab Stop Owner Draw Has Strings Sort Vetical Scroll No Integral Height Help ID Disable No Scroll

Aadaki bileik kutu zellikleri dzenleme kontrolleri iin geerli olan zelliklerle zdetir. Auto HScroll Uppercase Lowercase

61 OEM Convert u iki zellik yalnzca bileik kutu kontrollerine zgdr. List Choices: letiim kutusu yaratldnda varsaym olarak grntlenen liste maddelerini listelemek iin kullanlr. Her maddeden sonra CTRL+Enter tularna basn. Type: Bileik kutunun tipini belirtmek iin kullanlr. Bileik kutunun tipi Simple, Drop Down veya Drop List olabilir. Varsaym olarak Drop Down seilidir.

Bileik Kutular in MFC Destei


Liste kutularnda ve dier kontrollerde olduu gibi bileik kutular iletiim kutusu kaynaklarna Developer Studio iletiim kutusu editrn kullanarak eklersiniz. Kontrol ekledikten sonra mesaj ynetimi fonksiyonlar eklemek ve kontrol bir CComboBox nesnesiyle ilikilendirmek iin ClassWizard kullann. Bileik kutu kontrolyle etkileimde bulunmak iin MFC CComboBox snfn kullanrsnz. Bu snf ClistBox ve CEdit snflarnda bulunan ye fonksiyonlarndan ounu ierir. rnein, bir bileik kutuda o anda seili maddeyi belirlemek iin bileik kutunun liste kutusu ksmndan GetCurSel fonksiyonunu kullanabilirsiniz.

Bileik Kutuya Maddeler Eklemek


Bileik kutuya karakter katar ekleme ilemi liste kutularna karakter katarlar ekleme ilemine ok benzer. CListBox snf gibi CComboBox snf da AddString ve InsertString ye fonksiyonlarna sahiptir.
ComboBox.AddString (Yasin EFE);

veya
comboBox.InsertString (0, Yasin EFE);

Liste kutularnda olduu gibi bileik kutularda da tm maddeler sfrdan balayarak numaralanr. Ancak bir hata oluursa LB_ERR yerine CB_ERR dndrlr. Yetersiz yer nedeniyle bir madde eklenmezse CB_ERRSPACE ddrlr. Bir bileik kutudaki madde saysn belirlemek iin CComboBox snfn GetCount ye fonksiyonuna sahiptir.
nItems = comboBox.GetCount();

Liste kutularnda farkl olarak bileik kutular bir hata olduunda CB_ERR mesajn ddrr.

Bileik Kutunun Deerini renme

62 Bir bileik kutuya girilen deeri, dzenleme kontrollerinde olduu gibi GetWindowText ye fonksiyonunu kullanarak renebilirsiniz. Basit bileik kutular ve alan bileik kutular iin o anki seimi renmenin en kolay yolu budur. Liste kutusunda kanc maddenin seilmi olduunu renmek iin GetCurSel ye fonksiyonunu da kullanabilirsiniz. Liste kutusunda belli bir konumdaki karakter katarn almak iin GetLBText ye fonksiyonunu kullann. GetLBText fonksiyonunun iki parametresi vardr. Liste sra numaras ve karakter katarn saklayacak olan bir CString ye deikeni.
m_combo.GetLBText( 1, szChoice);

Bileik Kutuda Bir Maddeyi Arama


FindString ve FindStringExact ye fonksiyonlarn kullanarak bir bileik kutuda belli bir karakter katarn arayabilirsiniz. FindString verilen karakter kataryla balayan bir madde arar. int index = m_comboBox.FindString ( -1, szSearch); FindString fonksiyonunun iki parametresi vardr. Aramann balayaca yeri gsteren bir sra numaras ve aranacak neki ieren bir karakter katar. Sra numaras aranacak ilk maddeden nceki sra numarasn gsterir, bu nedenle arama ilemini batan balatmak iin sra numaras olarak 1 gndermeniz gerekir. FindStringExact fonksiyonu bileik kutuda aranacak karakter katarnn aynsn arar ve FindStirng fonksiyonundaki parametrelerin aynsn kullanr. int index = m_comboBox.FindString Exact( -1, szSearch); FindString ve FindStringExact fonksiyonlar aranan katarn bulunduu ilk maddenin sra numarasn, eer madde bulunamazsa CB_ERR mesajn dndrr.

Spin Kontrol

63 ou zaman yukar-aa kontrol de denilen spin kontrol, bir kaydrma ubuunun ularndaki oklar andran ama onlardan daha kk bir ift oktur. Spin kontrolleri genellikle spin kontrolyle ilikilendirilmi bir baka kontroln deerini ayarlamak iin kullanlr. Spin kontrolyle eleen kontrol arkada kontrol (buddy control) olarak bilinir. Bu normal bir dzenleme kontroldr. Bir spin kontrol yatay olarak da durabilir. Yatay bir spin kontrolne sol-sa kontol denmez; Kontroln ismi ayn kalr. Varsaym olarak, yukar oka tklamak arkada kontroln deerini azaltr, aa oku tklamakta arkada kontroln ierdii deeri artrr. Yukar ve aa oklar bir kelime-ileme dokmanndaki bir kaydrma ubuu gibi alr. Spin kontrolleri kullancnn bir grup deeri kaydrarak grebilecei durumlarda idealdir. Kullanc deerleri yalnzca birka birim birden ayarlayabilirse spin kontrol mkemmeldir nk kullancnn yalnzca birka fare tklamasyla yeni bir deer semesini mmkn olur. Bir spin kontrol kullanmak ok kolaydr. Spin kontrolnn varsaylan ilevini kullanmak iin hi kod yazmanz gerekmez! Spin kontrollerinin en gelimi kullanmlar bile yalnzca birka satrlk kod gerektirir. Kodun ounu ClassWizard yazar.

Kaydra Kontrol
Kaydra kontrol (slider control) iki nokta arasnda haraket ettirebileceiniz. Bir kaydrma ubuu ieren bir kontroldr. Windows Control Paneldeki (Denetim Masas) Display(Grnt) ksmnda bir kaydra kontrol kullanlmaktadr. Settings (Ayarlar) sekmesi ekran znrln ayarlamak iin bir kaydra kullanr. Kullanc kaydrac fare ile srkleyerek veya kaydraca odaklanp klavyedeki ok tularn kullanarak kaydrac hareket ettirir. Kullancnn kaydra ubuunun konumunu kolaylkla anlayabilmesine yardmc olacak entik iaretleri ieren kaydralar yaratabilirsiniz.

lerleme ubuu Kontrol


lerleme ubu (progress bar) bir ilemin ilerleyiini gstermek iin kullanlr ve ilem tamamlandka genelde soldan saa doru dolar. Developer Studioda ilerleme ubuklar bir projenin kaydedilme veya yklenme ilemlerinin ilerleyiini gstermek iin kullanlr. lerleme ubuklar Windows Explorerda dosya kopyalama veya tama ilemi srasnda kullanlr.

Kontroller Projesi

64 uana kadar anlatm olduumuz tm kontrolleri kullanacamz bir Kontroller adl program yapmak iin aadaki admlar izleyin. Yeni bir proje oluturmak iin menden File, New komutunu sein Project sekmesini seerek, proje tr listesinden MFC AppWizard sein. Project Name kutusuna Kontroller ismini girin. Projenizi kaydetmek istediiniz dizini Location kutusuna girin. New iletiim kutusunu kapatmak iin OK tklayn. MFC App Wizard iletiim kutusundan Dialog Based seeneini setikten sonra Finish dmesine tklayn. New Project Information iletiim kutusunda projeniz hakknda bilgiler bulunacaktr bu penceredeki bilgileri inceledikten sonra OK dmesine tklayarak pencereyi kapatn. C++ gsterdiiniz dizine zerinde deiiklikler yapabileceiniz iletiim kutusu tabanl Kontroller isimli projenizi oluturacaktr. alma alan penceresinden Resource sekmesini sein. Dialog klasrn an. IDD_KONTROLLER_DIALOG IDli iletiim kutusu kaynan sein. TODO: Place dialog controls here. Etiketli kontrol seip Delete tuuyla silin. Cancel etiketli dme kontroln seerek Delete tklayp silin. letiim kutusuna 3 dme kontrol yerletirin. Properties iletiim kutusunu aarak u deerleri girin. IDC_BTN_HESAP IDC_BTN_MESAJ IDC_BTN_LISTE &Hesap Makinesi &Mesaj Kontrol &Liste Kutular

ClassWizard an. Message Maps sekmesini sein. IDC_BTN_HESAP IDli dme kontroln sein. Messages liste kutusundan BN_CLICKED seeneini sein ve Add Function tklayn. nerilecek olan OnBtnHesap fonksiyon ismini OK tklayarak kabul edin. Bu ilemi dier iki dme iinde yapn. letiim kutusunun grntsn aadaki ekilde deitirin.

ekil 2.2 Kontroller Projesi imdi Mesaj kontrol ilemini yaptracamz iletiim kutusunu oluturmak iin Resource ve Dialog klasrnde sa tklayarak Insert Dialog seeneini sein. letiim kutusunun zelliklerini deitirmek iin zerinde sa tklayp Properties penceresini an. ID kutusuna IDD_MESAJ_DIALOG, Caption kutusuna Mesaj Kontrol girin. Aadaki kontrolleri ekleyerek zelliklerini aadaki ekilde deitirin.

65

ekil 2.3 Mesaj Kontrol Penceresi Dzenleme Kontrol IDC_EDIT_MESAJ Grup Kutusu Kontrolleri IDC_GROUP_ICON IDC_GROUP_BUTTON Icon Button

Grup Kutusu kontrollerinin Group seeneklerini iaretleyin. Radyo Dmesi Kontrol IDC_RADIO_WARNING IDC_RADIO_INFORMATION IDC_RADIO_QUESTION IDC_RADIO_ERROR IDC_RADIO_ABORTRETRYIGNORE IDC_RADIO_OK IDC_RADIO_OKCANCEL IDC_RADIO_RETRYCANCEL IDC_RADIO_YESNO IDC_RADIO_YESNOCANCEL Warning Information Question Error Abort Retry Ignore OK OK Cancel Retry Cancel Yes No Yes No Cancel

Radyo dme kontrollerini group zelliklerini sein. Onay Kutusu Kontrol IDC_CHECK_UZUNLUK Dme Kontrol IDC_BTN_MESAJGOR Etiket Kontrol IDC_STATIC_SECIM Uzunluk Mesaj Grntle Seim:

66 Bu zellikleri girdikten sonra ClassWizard an. ClassWizard atzda yeni bir snf girmenizi isteyecektir bu snf oluturduumuz yeni mesaj kontrol iletiim kutusudur. Snf oluturmak iin OK tklayn. Alan Pencerede Name kutusuna CMesajDlg ismini girip OK tklayn. letiim kutumuz iin snf ve gerekli header ve cpp dosyalar oluturulacaktr. Ana iletiim kutusu kaynanda Mesaj Kontrol dmesine ift tklayarak CKontrollerDlg::OnBtnMesaj() fonksiyonunu grntleyin. Fonksiyonu u ekilde deitirin.
void CKontrollerDlg::OnBtnMesaj() { CMesajDlg dlgMesaj; dlgMesaj.DoModal(); }

KontrollerDlg.cpp dosyasna #include "MesajDlg.h" ekleyerek Mesaj Kontrol balkl iletiim kutusunu link edin. Kontrollerden bilgileri alabilmek iin ye deikenlere balamamz gerekir bunu yapabilmek iin aadaki admlar izleyin. ClassWizard an. ye deikene balamak istediiniz kontrol sein ve Add Variable tklayn. Alan pencerede deiken ismini, kategorisini ve deiken tipini girin OK tklayn. imdi aadaki deerleri kullanarak ye deikenleri girin. IDC_CHECK_UZUNLUK m_checkUzunluk Control CButton IDC_EDIT_MESAJ m_editMesaj Control CEdit IDC_RADIO_ABORTRETRYIGNORE m_radioAbortRetryIgnore Control CButton IDC_RADIO_ERROR m_radioError Control CButton IDC_RADIO_OK m_radioOk Control CButton IDC_RADIO_OKCANCEL m_radioOkCancel Control CButton IDC_RADIO_INFORMATION m_radioInformation Control CButton IDC_RADIO_QUESTION m_radioQuestion Control CButton IDC_RADIO_RETRYCANCEL m_radioRetryCancel Control CButton IDC_RADIO_WARNING m_radioWarning Control CButton IDC_RADIO_YESNO m_radioYesNo Control CButton IDC_RADIO_YESNOCANCEL m_radioYesNoCancel Control CButton IDC_STATIC_SECIM m_staticSecim Control CButton imdi tm radyo dmelerini seip sa tklayarak properties penceresini sein. Group seeneini kaldrn. Mesaj grntle dmesi iin click fonksiyonunu eklemek iin ClassWizard an. Message Maps sekmesine gein. IDC_BTN_MESAJGOR seip BN_CLICKED setikten sonra Add Function tklayn. Alan pencerede fonksiyon ismi gsterilecektir OK tklayarak kabul edin. Dmemizin almas iin CMesajDlg::OnBtnMesajgor() fonksiyonuna gerekli kodu ekleyelim.
CString szMesaj,szTemp; int nIcon, nButton; m_editMesaj.GetWindowText(szTemp); if (m_checkUzunluk.GetCheck()) szMesaj.Format("%s : %d", szTemp, m_editMesaj.LineLength());

67
else szMesaj=szTemp; if (m_radioWarning.GetCheck()) nIcon=MB_ICONEXCLAMATION; else if (m_radioInformation.GetCheck()) nIcon=MB_ICONINFORMATION; else if (m_radioQuestion.GetCheck()) nIcon=MB_ICONQUESTION; else if (m_radioError.GetCheck()) nIcon=MB_ICONSTOP; else nIcon=0; if (m_radioAbortRetryIgnore.GetCheck()) nButton=MB_ABORTRETRYIGNORE; else if (m_radioOk.GetCheck()) nButton=MB_OK; else if (m_radioOkCancel.GetCheck()) nButton=MB_OKCANCEL; else if (m_radioRetryCancel.GetCheck()) nButton=MB_RETRYCANCEL; else if (m_radioYesNo.GetCheck()) nButton=MB_YESNO; else if (m_radioYesNoCancel.GetCheck()) nButton=MB_YESNOCANCEL; else nButton=0; int nSecim = AfxMessageBox(szMesaj, nButton | nIcon); if (nSecim==IDABORT) m_staticSecim.SetWindowText("Seim: Abort"); if (nSecim==IDCANCEL) m_staticSecim.SetWindowText("Seim: Cancel"); if (nSecim==IDIGNORE) m_staticSecim.SetWindowText("Seim: Ignore"); if (nSecim==IDNO) m_staticSecim.SetWindowText("Seim: No"); if (nSecim==IDRETRY) m_staticSecim.SetWindowText("Seim: Retry"); if (nSecim==IDYES) m_staticSecim.SetWindowText("Seim: Yes");

Mesaj kontrol ilemi bylece bitmi olacaktr. altrp programnz deneyebilirisiniz. imdi Hesap Makinesini adm adm yapalm. Kontroller isimli iletiim kutumuzdan Hesap Makinesi balkl dmeyi ift tklayn. Alan fonksiyona u kodu ekleyin.
CHesapDlg dlgHesap; dlgHesap.DoModal();

KontrollerDlg.cpp dosyasna #include "HesapDlg.h" ekleyerek Hesap Makinesi balkl iletiim kutusunu link edin. Hesap makinesi yapmak iin Resorce penceresinden Dialog klasrnn zerinde sa tklayp Insert Dialog sein. Oluturduunuz yeni iletiim kutusunun zelliklerini deitirmek iin zerinde sa tklayp Properties penceresini an. ID kutusuna IDD_HESAP_DIALOG, Caption kutusuna Hesap Makinesi bilgileri girin ve Entera basn. Cancel dmesini seerek Delete tuuna basn ve silin.

68 Aadaki kontrolleri iletiim kutusuna girerek zelliklerini aadaki gibi ayarlayn. Kontrollerin zelliklerini deitirmek iin sa tklayp Propertiesi seebilirsiniz. Dme Kontrolleri IDC_BTN_1 IDC_BTN_2 IDC_BTN_3 IDC_BTN_4 IDC_BTN_5 IDC_BTN_6 IDC_BTN_7 IDC_BTN_8 IDC_BTN_9 IDC_BTN_0 IDC_BTN_ONDALIK IDC_BTN_CE CE IDC_BTN_CIKARMA IDC_BTN_TOPLAMA IDC_BTN_CARPMAx IDC_BTN_BOLME IDC_BTN_ESITTIR IDC_BTN_SIL Dzenleme Kontrol IDC_EDIT_SONUC Konrollerimizi aadaki ekilde olduu gibi dzenleyin. 1 2 3 4 5 6 7 8 9 0 . + / = Sil

ekil 2.5 Hesap Makinesi Penceresi Dmeler Click olayn eklemek iin ClassWizard an. ClassWizard aldnda yeni bir snf yaratmanz gerektiini syleyecektir. Alan pencerede OK tklayn. New Class penceresinin aldn greceksiniz. Bu pencerede Name kutusuna CHesapDlg yazn ve OK dmesine tklayn.

69 imdi dme kontrollerine fonksiyonlar eklemek iin Message Maps sekmesine gein. Object IDs listesinden dmenin IDsini sein. Messages listesinden BN_CLICKED seeneini sein. Add Function dmesine tklayn. Alan pencerede fonksiyon ismini greceksiniz hibir deiiklik yapmadan ismi kabul edin. OK tklayarak kapatn. Yukarda IDlerini gstermi olduumuz tm dmeler iin bu ilemi tekrarlayn. Edit dzenleme kontrolmzdeki deeri bize bildirecek olan ye deikenini tanmlamak iin ClassWizard an. Member Variables sekmesini sein. Object IDs listesinden IDC_EDIT_SONUC seeneini sein. Add Variable dmesine tklayn. Alan pencereden Member Variable Name kutusuna m_editSonuc, Category kutusuna value, Variable Type kutusuna double seeneini girin. OK tklayn. Hesaplama ilemlirinde bir nceki ileme ait bilgileri tutacak olan global deikenleri tanmlamak iin HesapDlg.h dosyasn aarak public ksmna aadaki kodlar ekleyin.
double m_Rakam; double m_Depo; int m_nOnTabani; int m_nOncekiIslem; BOOL m_bSil;

Bu deikenlere ilk deer aktarmn yapabilmek iin HespDlg.cpp dosyasndaki CHesapDlg::CHesapDlg fonksiyonuna u kodlar ekleyin.
m_Depo=0.0; m_nOnTabani=0; m_nOncekiIslem=FALSE; m_bSil;

Dmelere tklandnda gerekli ilemleri yapacak olan kodlar eklemek iin HesapDlg.cpp dosyasn an ve aadaki kodlar ilgili fonksiyonlara ekleyin.
void CHesapDlg::OnBtn0() { // TODO: Add your control notification handler code here if (m_bSil) Temizlik(); if (m_nOnTabani>0) m_nOnTabani *= 10; else m_editSonuc *= 10.0; UpdateData(FALSE); } void CHesapDlg::OnBtn1() { // TODO: Add your control notification handler code here m_Rakam=1.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtn2() { // TODO: Add your control notification handler code here m_Rakam=2.0; RakamIsle(); UpdateData(FALSE);

70
} void CHesapDlg::OnBtn3() { // TODO: Add your control notification handler code here m_Rakam=3.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtn4() { // TODO: Add your control notification handler code here m_Rakam=4.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtn5() { // TODO: Add your control notification handler code here m_Rakam=5.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtn6() { // TODO: Add your control notification handler code here m_Rakam=6.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtn7() { // TODO: Add your control notification handler code here m_Rakam=7.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtn8() { // TODO: Add your control notification handler code here m_Rakam=8.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtn9() { // TODO: Add your control notification handler code here m_Rakam=9.0; RakamIsle(); UpdateData(FALSE); } void CHesapDlg::OnBtnBolme() { // TODO: Add your control notification handler code here OncekiIslemiYap(); m_nOncekiIslem = IDC_BTN_BOLME; m_editSonuc = m_Depo; m_bSil = TRUE; UpdateData(FALSE); } void CHesapDlg::OnBtnCarpma() { // TODO: Add your control notification handler code here OncekiIslemiYap(); m_nOncekiIslem = IDC_BTN_CARPMA; m_editSonuc = m_Depo; m_bSil = TRUE; UpdateData(FALSE);

71
} void CHesapDlg::OnBtnCe() { // TODO: Add your control notification handler code here Temizlik(); m_Depo=0.0; UpdateData(FALSE); } void CHesapDlg::OnBtnCikarma() { // TODO: Add your control notification handler code here OncekiIslemiYap(); m_nOncekiIslem = IDC_BTN_CIKARMA; m_editSonuc = m_Depo; m_bSil = TRUE; UpdateData(FALSE); } void CHesapDlg::OnBtnEsittir() { // TODO: Add your control notification handler code here OncekiIslemiYap(); m_nOncekiIslem = FALSE; m_editSonuc = m_Depo; m_bSil = TRUE; UpdateData(FALSE); } void CHesapDlg::OnBtnOndalik() { // TODO: Add your control notification handler code here if (m_bSil) Temizlik(); if (m_nOnTabani == 0) m_nOnTabani = 10; } void CHesapDlg::OnBtnSil() { // TODO: Add your control notification handler code here Temizlik(); UpdateData(FALSE); } void CHesapDlg::OnBtnToplama() { // TODO: Add your control notification handler code here OncekiIslemiYap(); m_nOncekiIslem = IDC_BTN_TOPLAMA; m_editSonuc = m_Depo; m_bSil = TRUE; UpdateData(FALSE); }

Bu fonksiyonlar ekledikten sonra ara ilemleri yapacak olan aadaki fonksiyonlarn tanmn HesapDlg.h dosyasna giriniz.
void Temizlik(); void OncekiIslemiYap(); void RakamIsle();

imdide bu fonksiyonlarn iletecei kodlar HesapDlg.cpp dosyasna ekleyelim. Aadaki kodlar ekleyin.
void CHesapDlg::Temizlik() { m_editSonuc=0.0;

72
m_nOnTabani=0; m_bSil=FALSE; } void CHesapDlg::OncekiIslemiYap() { switch (m_nOncekiIslem) { case IDC_BTN_TOPLAMA: m_Depo += m_editSonuc; break; case IDC_BTN_CARPMA: m_Depo *= m_editSonuc; break; case IDC_BTN_CIKARMA: m_Depo -= m_editSonuc; break; case IDC_BTN_BOLME: if(m_Depo != 0) m_Depo /= m_editSonuc; break; default: m_Depo = m_editSonuc; break; } } void CHesapDlg::RakamIsle() { if (m_bSil) Temizlik(); if (m_nOnTabani>0) { m_editSonuc += (m_Rakam/(double)m_nOnTabani); m_nOnTabani *= 10; } else { m_editSonuc *= 10.0; m_editSonuc += m_Rakam; } }

Hesap makinesini de tamamladktan sonra Liste kutusunu kullanacamz yeni bir iletiim kutusunu oluturalm. Resource listesinden Dialog klasrn sa tklayarak Insert Dialog seeneini seerek yeni bir iletiim kutusu oluturun. letiim kutusunun zerinde sa tklayarak Properties sein. ID olarak IDD_LISTE_DIALOG, Caption olarak Liste Kutulari bilgilerini girin. ClassWizard an. ClassWizard atnzda yeni bir snf oluturmanz gerektiini syleyecektir. Snf oluturmak iin OK tklayn. Alan pencerede Name kutusuna ClisteDlg girin ve OK tklayn. Ana iletiim kutusu kaynanda Liste Kutular dmesine ift tklayarak CKontrollerDlg::OnBtnListe() fonksiyonunu grntleyin. Fonksiyonu u ekilde deitirin.
void CKontrollerDlg::OnBtnListe() {

73
CListeDlg dlgListe; dlgListe.DoModal(); }

KontrollerDlg.cpp dosyasna #include "ListeDlg.h" ekleyerek Liste Kutular balkl iletiim kutusunu link edin. letiim kutusuna aadaki kontrolleri ekleyerek zelliklerini gsterildii gibi ayarlayn. Dzenleme Kontrolleri IDC_EDIT_YENIEKLE IDC_EDIT_BUL Dme Kontrolleri IDC_BTN_YENIEKLE IDC_BTN_BUL IDC_BTN_EKLE IDC_BTN_HEPEKLE IDC_BTN_CIKAR IDC_BTN_HEPCIKAR Liste Kutular IDC_LIST_1 IDC_LIST_2 Kontrolleri aadaki gibi dzenleyin. Yeni Ekle Bul > >> < <<

ekil 2.4 Liste Kutular Penceresi Kontrolleri ye deikenlerle ilikilendirmek iin ClassWizard an. Member Variables sekmesini sein. Listeden kontroln IDsini sein. Add Variable dmesini tklayn. Deiken ismini, kategorisini ve deiken tipini sein. OK tklayn. Bu ilemler iin aadaki bilgileri kullann.

74

IDC_EDIT_BUL IDC_EDIT_YENIEKLE IDC_LIST_1 IDC_LIST_2

CEdit CEdit CListBox CListBox

m_editBul m_editYeniEkle m_list1 m_list2

Dme kontrolleri iin click fonksiyonlarn eklemek iin ClassWizard an. Message Maps sekmesini sein. Listeden dme kontrollerinin IDsini sein. BN_CLICKED fonksiyonunu sein. Add Function dmesini tklayn. Bu ilemi 6 dme kontrol iin yapn. Ayn ilemi Liste kutlar iin Click ve DblClick olaylarn eklemek iin yapn. Oluturduumuz bu fonksiyonlar aadaki gibi kodlarn ekleyerek deitiri.
void CListeDlg::OnBtnBul() { // TODO: Add your control notification handler code here CString szList, szAranan; m_editBul.GetWindowText(szAranan); int nIndex = m_list2.FindString(-1,szAranan); m_list2.SetCurSel(nIndex); } void CListeDlg::OnBtnCikar() { // TODO: Add your control notification handler code here CString szList; int nSelection = m_list2.GetCurSel(); if (nSelection != LB_ERR) { m_list2.GetText(nSelection,szList); m_list1.AddString(szList); m_list2.DeleteString(nSelection); } } void CListeDlg::OnBtnEkle() { // TODO: Add your control notification handler code here CString szList; int nSelection = m_list1.GetCurSel(); if (nSelection != LB_ERR) { m_list1.GetText(nSelection,szList); m_list2.AddString(szList); m_list1.DeleteString(nSelection); } } void CListeDlg::OnBtnHepcikar() { // TODO: Add your control notification handler code here CString szList; int nSayac = m_list2.GetCount(); while (nSayac>0 && nSayac != LB_ERR) { m_list2.GetText(nSayac-1 , szList); nSayac = m_list2.DeleteString(nSayac - 1); m_list1.AddString(szList); } }

75
void CListeDlg::OnBtnHepekle() { // TODO: Add your control notification handler code here CString szList; int nSayac = m_list1.GetCount(); while (nSayac>0 && nSayac != LB_ERR) { m_list1.GetText(nSayac-1 , szList); nSayac = m_list1.DeleteString(nSayac - 1); m_list2.AddString(szList); } } void CListeDlg::OnBtnYeniekle() { // TODO: Add your control notification handler code here CString szYeniEkle; m_editYeniEkle.GetWindowText(szYeniEkle); if (szYeniEkle != "") m_list1.AddString(szYeniEkle); } void CListeDlg::OnDblclkList1() { // TODO: Add your control notification handler code here CString szList; int nSelection = m_list1.GetCurSel(); if (nSelection != LB_ERR) { m_list1.GetText(nSelection,szList); m_list2.AddString(szList); m_list1.DeleteString(nSelection); } } void CListeDlg::OnDblclkList2() { // TODO: Add your control notification handler code here CString szList; int nSelection = m_list2.GetCurSel(); if (nSelection != LB_ERR) { m_list2.GetText(nSelection,szList); m_list1.AddString(szList); m_list2.DeleteString(nSelection); } }

Kontroller isimli projenizi derleyip altrn.

76

BLM 3 : Visual C++da Snf Yaplar Snf Yaplar .................................................................................................


77 Constructor ve Destructor Fonksiyonlar .......................................................... Parametre Alan Constructor'lar ......................................................................... Snflarda Miras .................................................................................................... Nesne aretileri .................................................................................................. Snf ve Yap Arasndaki Balant ...................................................................... Nesne Atamak ....................................................................................................... Fonksiyonlara Nesne Aktarmak ......................................................................... Arkada Fonksiyonlar ......................................................................................... 77 78 79 81 82 85 86 87

77

Snf Yaplar
Constructor ve Destructor Fonksiyonlar
Program gelitirmekte uzun sredir urayorsanz, programnzn baz elemanlar iin hazrlk yaplmasnn gerektiini bilirsiniz. Nesnelerle alyorsanz bu durumla daha da sk karlayorsunuzdur. Hatta gerek problemler dnlrse, her nesne bu tr bir hazrla gereksinim duyar. C++da bu gereksinim, snf bildirimi ierisine constructor fonksiyonlarnn konulmasyla karlanr. Bir snfn yapcs (constructor), bu snfa ait nesnelerin her oluturuluunda arlr. Bylelikle bir nesne iin gerekletirilmesi gereken tm hazrlklar constructor fonksiyonu tarafndan otomatik olarak yaplabilir. Constructor fonksiyonu ait olduu snf ile ayn addadr ve bu fonksiyonun geri dndrecei bir veri tipi yoktur. Constructor fonksiyonu olan rnek snf aada inceleyelim.
#include <iostream> using namespace std; class myclass { int a; public: myclass(); //constructor void show(); }; myclass::myclass() { cout << constructorda\n; a=10; } void myclass::show() { cout << a; } int main() { myclass ob; ob.show(); return 0; }

Bu basit rnekte a deeri myclass() constructor (yapcs) tarafndan hazr hale getiriliyor. Constructor, ob nesnesi oluturulurken arlr. Nesne, kendisine ait bildirim deyimi istenildiinde oluturulur. C++da, deikeninin bildirim deyiminin bir i deyimi olmas olduka nemli. Cde program gelitirirken, bildirim deyimleri basite deikenlerin oluturulduu yer olarak dnlebilir. Oysa C++da, nesne constructora, sahip olabileceinden deikenin bildirim deyimi dikkate deer sayda iin yaplmasn salayabilir. myclass() nasl tanmladmza dikkat edelim. Daha nce de sylediimiz gibi, bu fonksiyonun return (dndrme) tipi yoktur. C++n resmi yazlm kurallarna gre constructorlarn return tipi olmas doru deildir. Global nesneler iin nesne constructoru, bir kere, program ilk almaya baladnda arlr. Yerel nesneler iin ise constructor, bildirim deyiminin her iletiliinde arlr.

78 Constructorn tersi destructordr. Bu fonksiyon, nesne yok edilirken arlr. Nesnelerle alyorsak onlarn yok edilmeleri esnasnda baz ilemlerin yaplmas gerekir. rnein, oluturulduunda bellekte yer kaplayan bir nesne, yok edilirken bu bellei serbest brakmak isteyecektir. Destructor da snfta ayn addadr, fakat banda iareti vardr. Aadaki snfn destructor fonksiyonunu inceleyelim.
#include <iostream> using namespace std; class myclass { int a; public: myclass(); //constructor myclass(); //destructor void show(); }; myclass::myclass() { cout << constructorda\n; a=10; } myclass:: myclass() { cout << Yokediliyor...\n; } void myclass::show() { cout << a << \n; } int main() { myclass ob; ob.show(); return 0; }

Snfa ait destructor, nesne yok edilirken arlr. Yerel nesneler bulunduklar alandan klnca yok edilirken global nesneler program sona erdiinde yok edilirler. Bir constructorn veya destructorn adresinin alnmas imkanszdr.

Parametre Alan Constructorlar


Bir constructor fonksiyonuna argman gndermeniz mmkndr. Bunun iin constructor fonksiyonunun bildirimine ve tanmna, uygun parametreler eklemeniz yeterlidir. O halde nesneleri deklare ederken argmanlar belirleyeceiz. Bunu yapacamz grmek iin aadaki rnee bir gz atalm.
#include <iostream> using namespace std; class myclass { int a; public: myclass(int x); //constructor void show(); };

79

myclass::myclass(int x) { cout << constructorda\n; a=x; } void myclass::show() { cout << a << \n; } int main() { myclass ob(4); ob.show(); return 0; }

myclassn parametre ald constructor fonksiyonu, myclass()a gnderilen deer ann hazrl iin kullanlmaktadr. obun main()in ierisinde nasl deklare edildiine zellikle dikkat edin. obdan sonra gelen parantezlerin iinde verilen 4 deeri, aya lk deer vermek iin myclass()n x parametresine gnderilen argmandr. Gerekte parametreli bir constructora argman gnderme ilemi u notasyonla yaplmaldr.
myclass ob = myclass(4);

Fakat, C++ programclarnn ou, ksa ekli tercih etmektedir. Bu iki yazm ekli arasnda, aslnda teknik adan kk bir fark bulunmaktadr. Bu fark, consturctorlarn kopyalanmasyla ilgilidir ve daha sonra ele alnacaktr. Fakat aradaki bu fark konusunda u anda endielenmemiz gerekmiyor.

Snflarda Miras
C++ iin miras, bir snfn bir dier snfn zelliklerini mirasla alabildii mekanizmadr. Miras, snflar arasnda en genelden en zele doru bir hiyerarinin olumasn salar. Konuya balamadan nce, sk kullanacamz iki terimi tanyalm. Bir snf, dier snftan miras araclyla oluturulurken, ebeveyn snfa temel snf, mirasla oluturulan snfa ise alt snf diyoruz. Genelde miras sreci, temel snfn tanmlanmasyla balar. Temel snf, tm alt snflarn sahip olaca genel zellikleri tanmlar. Esasen temel snf, bir takm zelliklerin en genel tanmn temsil etmektedir. Alt snf, bu genel zellikleri mirasla alr ve onlara sadece kendisine zg yeni zellikler ekler. Bir snfn bir dier snftan mirasla olumasnn ne anlama geldiini anlamak istiyoruz. Bunun iin ksa ve basit bir rnekle ie balayalm. Bu rnek basit olduu halde mirasn anahtar zelliklerinden pek ounu bize gsterecek. lk olarak temel snfn deklarasyonunu inceleyelim.
// Temel snf tanmlanyor. class B { int i; public: void set_i (int n);

80
int get_i(); };

Bu temel snf kullanlarak bir alt snf oluturuluyor.


// Alt snf tanmlanyor. class D : public B { int j; public: void set_j (int n); int mul(); };

Bu deklarasyonu daha yakndan inceleyelim. D snf adndan sonra public anahtar kelimesi, derleyiciye, temel snfn tm public elemanlarnn alt snfn da public elemanlar olacan sylemektedir. Fakat temel snfn tm private elemanlar kendisine private (zel) kalr ve alt snf onlara dorudan eriemez. B ve D snflarn kullanan programn tamam:
// Mirasa basit bir rnek. #include <iostream> using namespace std; // Temel snfn tanmlanmas. class B { int i; public: void set_i (int n); int get_i(); }; // Alt snfn tanmlanmas. class D : public B { int j; public: void set_j(int n); int mul(); }; // Temel snf iin i deerinin verilmesi. void B::set_i(int n) { i = n; } // Temel snf iin i deerinin dndrlmesi. void D::set_j (int n) { j = n; } // Temel snfn isi arp alt snfn jsi deerinin dndrlmesi. int D::mul() { // Alt snf, temel snfn public fonksiyonlarn arabilir. Return j * get_i(); } int main() { D ob;

81
ob.set_i(10); // Temel snfta iye deer veriliyor. ob.set_j(4); // Alt snfta jye deer veriliyor. cout << ob.mul(); // ekranda 40 gsteriliyor. return 0; }

mul() fonksiyonunu nasl tanmladmza bir bakalm. Bu fonksiyonda, B temel snfna ait olan, Dye ise ait olmayan get_i() fonksiyonunu herhangi bir nesneye balamadan ardmza dikkatinizi ekmek istiyorum. Bu, mmkndr, nk Bnin public yeleri Dnin de public yeleri olmutur. Fakat, mul()un dorudan iye erimek yerine get_i()yi armak zorunda olmasnn nedeni udur: Temel snfa private olarak ait olan yeler (bu durumda i), bu snfa zel yeler olarak kalmaktadr ve herhangi bir alt snf tarafndan bu yelere eriilemez. Bir snfn private yelerine alt snflar tarafndan eriilememesi, depolama zelliinin srdrlmesi iin gereklidir. Eer bir snfa ait private yeler, bu snfn mirasla alnmas ile public yaplabilseydi, depolama (encapsulation) zellii ortadan kalkard. Temel snfn mirasla alnmas, genelde u notasyonla yaplr.
class alt-snf-ismi:eriim-tr alt-snf-ismi { . . . };

Burada eriim-tr yerine anahtar kelimeden birini yazacaz: public, private veya protected.

Nesne aretileri
imdiye kadar nesnelere ait yelere nokta iaretini kullanarak eriiyorduk. Bu yntem, tek nesneyle alyorsak dorudur. Fakat nesnelere eriirken bu nesneye atanan bir iaretiyi de kullanabiliriz. Eriimi iareti ile gerekletiriyorsak, nokta iareti yerine ok iareti (->) kullanacaz.. Nesne iaretilerini herhangi bir deikeni nasl deklare ediyorsak o ekilde deklare edeceiz. Bunun iin snf adn belirledikten sonra deiken adnn bana bir yldz iareti (asteriks) koyacaz. Nesnenin adresini elde etmek iin ise adn bana & iaretini koyacaz, tpk herhangi bir tipteki deikenin adresini alrken yaptmz gibi. Dier tiplerin iaretileri gibi, nesne iaretileri de arttrldklar zaman bu tipteki dier nesneyi iaret edeceklerdir. Basit bir rnekle aklayalm.
#include <iostream> using namespace std; class myclass { int a; public: myclass (int x); // constructor int get(); }; myclass::myclass(int x) {

82
a = x; } int myclass::get() { return a; } int main() { myclass ob(120); // Nesne oluturuluyor. myclass *p; // Nesne iin iareti oluturuluyor. p = &ob; // obnin adresi pye atanyor. cout << Nesneyi kullanan deer: << ob.get(); cout << \n; cout << aretiyi kullanan deer: << p->get(); return 0; }

rnekteki myclass *p; declarasyonu myclass snfna ait bir nesneye iareti oluturuyor. Nesne iaretisi oluturulduunda bir nesne oluturulmaz, sadece mevcut nesne iin bir iareti oluturulur, bu durumu kavramamz ok nemli, obun adresi aadaki bildiri ile pye konuluyor.
p = &ob;

Programda, son olarak, nesne yelerine bir iareti zerinden nasl eriildiini gryoruz.

Snf ve Yap Arasndaki Balant


Snflarn notasyonunun yaplarn notasyonuna benzediini grdk. Snflar ile yaplarn gerekte ayn kapasiteye sahip olduunu renince arabilirsiniz. C++da, snf tanmlar gibi yap tanmlar da, constructor ve destructor fonksiyonlarnn yan sra tm ye fonksiyonlarn ierecek ekilde geniletilmitir. Hatta, bir yap ile bir snf arasndaki tek fark, snflara ait olan yelerin varsaylan olarak private (zel), yaplara ait yelerin ise yine varsaylan olarak public (genel) olmasdr. Yaplarn geniletilmi yazlm eklini aapda gryoruz.
struct tip-ismi { // public fonksiyonlar ve veri yeleri private: // private fonksiyonlar ve veri yeleri } nesne-listesi;

Hatta, C++n resmi yazlm kurallarna gre gerek struct, gerekse class, yeni snf tipleri oluturur. Yeni bir anahtar kelimeyle karlatk: private. Bu kelime derleyiciye, kendisinden sonra gelen yelerin bu snfa private (zel) olduunu sylemektedir. Yzeysel olarak baktmzda, snflarn ve yaplarn fiilen e kapasitede olmas bir fazlalk gibi grnebilir. C++la yeni tananlar bu durumun nedenini merak ediyor olabilirler. Hatta, class anahtar kelimesinin gereksiz olduu da pek sk karlalan bir tartma konusudur. Bunun bir kuvvetli bir de zayf sebebi vardr. Kuvvetli olan sebep (yada zorlayc olan sebep) Cye uyumluluun salanmasdr. C++ programnda, C yaplar geerlidir. Cde

83 yaplara ait tm yeler varsaylan olarak publictir ve bu durum C++da da srdrlmek istenmitir. Daha da tesi, class yazm ekli olarak structdan ayr bir varlk olduundan, snf tanm, Cnin yap tanmna uymayacak ekilde genilemekte serbesttir. Bu ikisi farkl eyler olduu srece, C++n gelecei uyumluluk sorunlaryla kstlanmam olmaktadr. Birbirine benzeyen snf ve yap kavramlarnn her ikisini de kullanmann zayf nedeni ise C++da ye fonksiyonlarn ierilmesi iin yap tanmn geniletmenin hibir dezavantaj bulunmamasdr. Her ne kadar yaplar snflarla ayn kapasiteye sahip olsalar da, programclarn ou Cye olan uyumluluu bozmamak iin yaplarn kullanmn snrlamlardr ve onlar ye fonksiyonlar iermek iin kullanmamaktadrlar. Programclarn ou, hem veri, hem de kod ieren nesneleri tanmlarken class anahtar kelimesini kullanrlar fakat bu sadece stille alakal bir meseledir ve tercihinize kalmtr. Eer snflarla yaplar arasndaki balanty ilgi ekici bulduysanz C++n bir dier zellii de ilginizi ekecek demektir: bileimler ve snflarda birbiriyle balantldr. C++da bileimler, hem fonksiyon hem de veri ierbilen snf tplerini tanmlar. Bileimler bu adan yaplara benzemektedirler, varsaylan olarak tm yeleri private belirleyici kullanlana kadar publictir. Bir bileimde tm veri yeleri ayn bellek yerini paylar (tpk Cde olduu gibi). Bileimler, constructor ve destructor fonksiyonlarn ierebilirle C bileenleri neyse ki, C++ bileimleri ile uyumludurlar. Olaya yzeysel olarak baktmzda snflarn ve yaplarn ikisinin birden kullanlyor olmas fazlalkm gibi grnse de, durum bileimler iin byle deildir. Nesneye dayal bir dilde depolama zelliinin korunmas nemlidir. Bylelikle bileimin kod ve veriyi balayabilme kabiliyeti, iindeki tm verilerin ayn yeri paylat snf tipleri oluturmamza imkan verir. Bunu, snflar kullanarak yapamayz. Bileimler iin C++da eitli snrlamalar bulunmaktadr. Baka snflardan miras araclyla oluturulamazlar ve baka snflarn temel snf olamazlar. Bileimlerin static yeleri olamaz ve constructor veya destructor olan herhangi bir nesnede ieremezler. Bileimin kendisinin constructor ve destuctor olabilir. Son olarak ta, bileimler gerek fonksiyonlara sahip olamazlar. C++da anonim bileim ad verilen zel bir bileim tipi vardr. Anonim bileimlerin tip adlar yoktur ve bu bileim tr iin hibir deiken deklare edilmez. Aksine, anonim bileim, derleyiciye kendine ait olan yelerin ayn bellek yerini paylaacaklarn syler. Fakat, dier alardan, bu yeler, normal deikenler gibi rol oynarlar ve onlara da o ekilde davranlr. Yani, yelere, dorudan, nokta iareti kullanlmakszn eriilir. Aadaki program inceleyerek bunu kavramaya alalm.
union { // bir anonim bileim int i; char ch[4]; }; i = 10; // iye ve chye dorudan eriiliyor ch[0] = X;

Burada i ve chye dorudan eriiyoruz, nk bu deikenler herhangi bir nesnenin paras deildirler. Bellekte ayn yeri paylarlar.

84 Anonim bileimi kullanarak derleyiciye iki veya daha fazla sayda deikenin bellekte ayn yeri paylamasn istediimizi kolayca syleyebilir. Bu zel nitelik haricinde, anonim bileimin yeleri, tamamen dier deikenler gibi davranrlar. Anonim bileimlerin bu tek zellikleri yannda, normal bir bileime konulan tm snrlamalar geerlidir. Global bir anonim bileimi, static olarak deklare etmeliyiz. Anonim bileimler private yelere sahip olamazlar ve onlara ait yelerin adlar ayn alandaki dier belirleyicilerle akmamaldr. Snf oluturmak iin struct kullanan ksa bir program
#include <iostream> #include <cstring> using namespace std; // snf tipi tanmlamak iin struct kullanlyor struct st_type { st_type ( double b, char *n); void show(); private: double balance; char name[40]; }; st_type::st_type (double b, char *n) { balance = b; strcpy(name, n); } void st_type::show() { cout << sim: << name; cout << : $ << balance; if (balance < 0.0 ) cout << ***; cout << \n; } int main () { st_type acc1 (100.12, Johnson); st_type acc2 (-12.34, Hedricks); acc1.show(); acc2.show(); return 0; }

Daha nce belirttiimiz gibi, yapya ait yeler varsaylan olarak publictir. Private yelerin deklare edilmesi iin private anahtar kelimesini kullanmalyz. C ve C++ yaplar arasndaki bir dier farka daha dikkatinizi ekmek istiyorum. C++da yap etiket-ismi, nesnelerin deklare edilmesinde kullanlabilecek bir tip ad haline gelmektedir. Cde etiket-isminin bir tip olmas iin struct anahtar kelimesinin kendisinden nce gelmesi gerekmektedir. Ayn programn snf kullanlarak yazlm hali.
#include <iostream> #include <cstring> using namespace std;

85
class cl_type { double balance; char name[40]; public: cl_type (doble b, char *n); void show(); }; cl_type::cl_type (double b, char *n) { balance = b; strcpy(name, n); } void cl_type::show() { cout << sim: << name; cout << : $ << balance; if (balance < 0.0 ) cout << ***; cout << \n; } int main () { cl_type acc1 (100.12, Johnson); cl_type acc2 (-12.34, Hedricks); acc1.show(); acc2.show(); return 0; }

Nesne Atamak
Bir nesne ayn tipten baka bir nesneye atanabilir. Normalde, nesne dier nesneye atandnda tm veri yelerinin bit bit kopyas alnmaktadr. rnek olarak o1 adndaki nesne o2ne kopyalanr. Bunu aadaki programda inceleyelim.
// Nesne atamalarna bir rnek. # include <iostream> using namespace std; class myclass { int a, b; public: void set(int i, int j) { a=i; b= j; } void show() { cout << a << << b << \n; } }; int main() { myclass o1, o2; o1.set(10, 4); // o1i o2ye ata o2 = o1; o1.show(); o2.show(); return 0; }

86 Burada o1 nesnesi, kendisine ait olan a ve b ye deikenlerine srasyla 10 ve 4 deerlerini atar. Daha sonra, o1, o2ye atanr. Bu, o1.ann o2.aya atanmasn ve o1.bnin de o2.bye atanmasna neden olur. Program altrdnzda, ekranda aadaki sonucu greceksiniz.
10 4 10 4

Bir nesneyi dierine atadnzda bu nesnelerin ierisindeki verilerin eitlendiini aklnzda tutun. ki nesne halen birbirinden ayr durumdadr. rnein atama ileminden sonra o1.aya deer atamak iin o1.set()in arlmas, o2 ve ona ait a deeri zerinde bir etki yapmaz.

Fonksiyonlara Nesne Aktarmak


Nesneler, tpk dier veri tiplerinin aktarlmasnda olduu gibi argmanlar halinde fonksiyonlara aktarlabilir. Fonksiyonun parametresi snf tipinde bildirilir ve sonra fonksiyonun arlnda bu snfa ait bir nesne argman olarak kullanlr. Fonksiyona dier veri tiplerinde olduu gibi varsaylan olarak nesnelerin deerleri aktarlr.
#include <iostream> using namespace std; class samp { int i; public: samp (int n) { i = n; } int get_i() { return i; } }; // o.inin karesi dndrlr. int sqr_it (samp o) { return o.get_i() * o.get_i(); } int main() { samp a(10), b(2); cout << sqr_it(a) << \n; cout << sqr_it(b) << \n; return 0; }

Bu program, i tamsaysn ieren, samp adl bir snf oluturur. sqr_it() fonksiyonunun samp tipinde bir argman vardr ve bu fonksiyon nesneye ait i deerinin karesini dndrr. Bu program, ekranda 4 ve 100 deerlerini gsterecektir.

Fonksiyonlardan Nesne Dndrmek


Tpk fonksiyonlara nesne gnderebildiimiz gibi, fonksiyonlardan nesne de dndrebiliriz. Bunun iin nce fonksiyonu snf tipi dndrr ekilde bildirmeniz gerekir. kinci olarak da bu tipte bir nesneyi normal return deyimini kullanarak dndrrz.

87

Fakat fonksiyonlardan nesne dndrlmesi konusunda anlalmas gereken nemli bir nokta daha var: Bir nesne fonksiyon tarafndan dndrldnde, otomatik olarak, dndrlen deeri saklayan geici bir nesne oluturulur. Gerekte fonksiyon tarafndan dndrlen nesne budur. Deer dndrldkten sonra bu nesne yok edilir.
// Nesne dndrlyor #include <iostream> #include <cstring> using namespace std; class samp { char s[80]; public: void show() { cout << s << \n; } void set(char *str) { strcopy(s, str); } }; // samp tipinde bir nesne dndrlyor samp input() { char s[80]; samp str; cout << Bir katar girin: ; cin >> s; str.set(s); return str; } int main() { samp ob; // Dndrlen nesne oba atanyor. ob = input(); ob.show(); return 0; }

Bu rnekte input() fonksiyonu, str adnda yerel bir nesne oluturur ve sonra da klavyeden bir katar okur. Bu katar str.sin iine kopyalanr. Ve sonra str, fonksiyon tarafndan dndrlr. Nesne, dndrldkten sonra main()in ierisindeki oba atanr.

Arkada Fonksiyonlar
Bir fonksiyonun yesi olmad bir snfa ait private yelere eriim hakk olmasn istediiniz zamanlar olacaktr. Bunun iin C++ size arkada (friend) fonksiyonlarn sunmaktadr. Arkada fonksiyonlar snfa ait deildir, ama bu fonksiyonlarn o snfa ait private elemanlara eriim hakk vardr. Arkada fonksiyonlarnn iimize yarad iki durum vardr. Operatrlerin st ste yklenmesi ve belli tiplerde I/O fonksiyonlarnn oluturulmas. Arkada fonksiyonlarnn bu iki ekilde nasl kullanldn grmek iin bir sre daha beklemeniz gerekecek. Fakat, burada ele alacamz nc bir kullanm ekli daha var: Bir fonksiyonun iki veya daha fazla snfn private yelerine erimesinin istendii durum. Bir arkada fonksiyonu dzgn ama ye olmayan bir fonksiyon olarak tanmlanr. Fakat bu fonksiyonun, kendisine arkada olaca snf bildiriminin ierisinde friend anahtar kelimesi

88 ile belirtilen bir prototipi mevcuttur. Bunun nasl altn anlamak iin aadaki bu ksa rnei inceleyelim.
// Arkada fonksiyonlarna bir rnek #include <iostream> using namespace std; class myclass { int n, d; public: myclass (int i, int j) { n= i; d = j; } //myclassn arkada fonksiyonun deklare edilmesi friend int isfactor(myclass ob); }; /* Arkada fonksiyonun tanm. Eer n dnin tam kat ise true deerini dndrr. friend anahtar kelimesinin isfactor()n tanmlanmas srasnda kullanlmadna dikkat edin. /* int isfactor (myclass ob) { if (!(ob.n % ob.d)) return 1; else return 0; } int main() { myclass ob1(10,2), ob2(13, 3); if (isfactor(ob1)) cout << 10, 2nin katdr\n; else cout << 10, 2nin kat deildir\n; if (isfactor(ob2)) cout << 13, 3n katdr\n; else cout << 13, 3n kat deildir\n; return 0; }

Bu rnekte myclass kendi yapc fonksiyonunu ve snf bildirimi ierisindeki arkada isfactor() bildirmektedir. isfactor(), myclassn arkada olduundan isfactor()un onun private yelerine eriim hakk vardr. Bu, isfacotr()un ierisinde ob.n ve ob.dye dorudan gnderme yapabilmesinin nedenidir. Bir arkada fonksiyonunun arkada olduu snfa ait olmadnn anlalmas nemlidir. Bylece bir arkada fonksiyonunu nesne adn ve snf yesi eriim operatrn (nokta veya ok operatr) kullanarak armamz mmkn deildir. rnein bir nceki rnek iin aadaki deyim yanltr.
ob1.isfactor(); // yanl; isfactor() ye bir fonksiyon deildir.

Halbuki arkadalar normak bir fonksiyon gii arlrlar. Bir arkada fonksiyonu her ne kadar arkada olduu snfn private elemanlarnn bilgisine sahip olsa da onlara sadece bu snfa ait bir nesne zerinden eriebilir. Yani myclassn n veya dye dorudan gnderme yapabilen ye fonksiyonlarnn aksine, bir arkada fonksiyonu bu deikenlere sadece, arkada fonksiyonu ierisinde bildirilmi veya arkada fonksiyona gnderilmi bir nesne araclyla eriilebilir. Arkadalar snflara ait deillerdir, bu yzden arkada olduklar snfa ait bir veya daha fazla nesne kendilerine gnderilecektir. Ayn ey isfactor() iin de geerlidir. Bu fonksiyona ob adnda myclassa ait bir nesne gnderiyoruz. Fakat isfactor(), myclassn arkada olduundan, obnin private elemanlarna eriebilir. isfactor(), myclassa arkada olmasayd n ve d myclassn private yeleri olduu srece ob.d veya ob.nye eriemeyecekti. Arkada fonksiyonlarn miras yoluyla aktarlmalar da mmkn deildir. Yani temel snfn arkada fonksiyonu tretilmi snfn da arkada deildir.

89

Bu fonksiyonlar hakkndaki bir dier nemli nokta da arkada fonksiyonlarnn birden fazla snfla arkada olabilmesidir.

BLM 4 : Visual C++ ile Veritaban DORU VER TABANI TEKNOLOJSN SEM .............................. 91
UYGUN VER TABANI TEKNOLOJSNE KARAR VERME .............................. 91

90 C++ DA KEND VER TABANINIZI YAPMAK ...................................................... VER TABANI ALIMASINI KULLANMAK N BR C++ TABAN SINIFI. OLE YAPISAL DEPOLAMA ...................................................................................... MASA ST VERTABANI ........................................................................................ NESNE VERTABANLARI ......................................................................................... VERTABANI KARILATIRMALARI ................................................................... 91 93 93 95 96 98

ODBC ............................................................................................................ 98
ODBC Fonksiyonlar ..................................................................................................... Initializaiton lemi ........................................................................................................ Data Access Aamas ..................................................................................................... Termination lemi ......................................................................................................... 99 99 100 100

MFC ve ODBC ............................................................................................................. 100


CDatabase Snf ............................................................................................................. Veri yeleri .................................................................................................................... Fonksiyon yeleri .......................................................................................................... Veri Taban Niteliklerini Belirleyen Fonksiyonlar ........................................................ Veri Taban Fonksiyonlar ............................................................................................. CRecordSet Snf ........................................................................................................... ye Dekenleri ............................................................................................................... Tasarmc, Yokedici, Ama ve Kapatma Fonksiyonlar ................................................ Kayt Alan Niteliini Belirleyen Fonksiyonlar ............................................................. Kayt Alan Gncelleme Fonksiyonlar ......................................................................... Kayt Alan Ak Fonksiyonlar ..................................................................................... Genel ye Fonksiyonlar ................................................................................................ CRecordView Snf ....................................................................................................... 101 101 101 101 103 104 104 104 105 106 107 108 108

VSUAL C++ LE VERTABANI .............................................................. 109

DORU VER TABANI TEKNOLOJSN SEM


Veri saklama ou yazlm uygulamasnn zorunlu bir parasdr. Hemen hemen btn C++ uygulamalar baz tip verileri saklanmasn veya srekli kalmasn gerektirir.

91 ou uygulamalarn veriyi verimli bir ekilde tekrar almas gerekir. Bu uygulamalar tipik olarak srayla depo edilmi zel bilgileri geri almak iin veri boyunca arama yapmalar gereklidir. Bu arama yapma ve verinin geri alnmas bir veri tabannn kullanmn gerektirir. C++ programclar iin eitli veri taban teknolojileri vardr. Bugn bu veri taban teknolojilerini aratracak ve uygulamalarnz iin size gerekli olan uygun teknolojiyi semee alacaz.

VISUAL C++ UYGULAMALARINIZ iin UYGUN VER TABANI TEKNOLOJSNE KARAR VERME
Doru veri taban teknolojisi semek demek uygulamanzn gereklerini dolduran bir teknoloji bulmak demektir. eitli veri taban teknolojilerini bilmeden, uygulamanz iin yanl birini seebilirsiniz. lerleyen blmde, her veri taban teknolojisinin yeteneklerini reneceksiniz. Bir veri taban teknolojisi seerken, uygulamanzn verilerinin nemini dikkatlice gz nnde bulundurmanz gereklidir. Sizin uygulamanz tarafndan kullanlmas gerekli olan veriyi dnmek kolay olacaktr. Ancak, eer uygulamanz aklnzdaki bu dnce ile yazarsanz kapal, kimsenin anlayamayaca veya kullanamayaca hususi bir veri tabanna sahip bir uygulama oluturarak bitireceksinizdir. Uygulamanz iin kapal, hususi bir veri tabannn yeterli olup olmayacan dnmelisiniz. nk uygulamanz veriye eriimi gerekli olan bir uygulamadr. Veri iin gerekli deeri ve veriye eriim iin gereini eksik tahmin etmeyin. C++ DA KEND VER TABANINIZI YAPMAK Bir C++ programcs genellikle yazlm yazmak iin kendi yeteneinden emindir. Buna ramen C++ gibi kompleks ve gl bir dili ynetebiliyorsanz, size gerekli olacak kendi veri tabannz ieren bir yazlm aracn yazmakta pheniz olmaz. Ancak u an var olan veri taban teknolojilerinin olgunluundan tr kendi veri tabannz yazmak nadiren verimli bir aba olacaktr. Geri bir elektrik mhendisi muhtemelen kendi cep telefonunu yapabilir. u an var olan cep telefonlar ok bol ve ucuz ve hcresel alar ve dier cep telefonlaryla interaktif olarak iletiim kurmak iin baz standartlara baldrlar. Ayn ekilde, bir C++ programcs kendi veri taban sistemini yapabilir. u an var olan veri tabanlar ok bol ve ucuz ve bilgisayar alar ve dier uygulamalarla interaktif olarak iletiim kurmak iin standartlara ballar. Kendi uygulamanz gelitirmek zerinde younlamalsnz. Liste 1, temel bir veri taban oluturmak ve yapsal veriyi disk zerinde bir dosyaya depolamak iin ne gerektiini gsteriyor. Bu uygulamay oluturmak iin Visual C++ altrn ve bir Win32 konsol uygulamas olarak yeni bir proje oluturun. Yeni projeye bir ad verin. CPPDb gibi bir ad vermek uygun olacaktr. Projede bir kaynak dosya oluturun, muhtemelen main.cpp diye adlandrlacak ve aadaki kodu onun iine girin. Liste 1 Bir dosyaya veri yazan C++ Kodu

92

1: #include <fstream.h> 2: 3: struct Date 4: { 5: int iMonth, iDay, iYear; 6: }; 7: 8: struct Product 9: { 10: int iPartNumber; 11: char szName[80]; 12: double dPrice; 13: }; 14: 15: struct Customer 16: { 17: int iID; 18: char szName[50]; 19: char szAddress[50]; 20: char szCity[20]; 21: char szState[20]; 22: char szZip[9]; 23: }; 24: 25: void main() 26: { 27: Date dt = { 6, 10, 92 }; 28: Product prod = {122, "Vegamatic", 19.95}; 29: Customer cust = {15, "Seymore Hoskins", "300 Oak St", "Boring", "Oregon", "97203"}; 30: ofstream datafile( "data.dat" , ios::binary ); 31: datafile.write( (char *) &dt, sizeof dt ); 32: datafile.write( (char *) &prod, sizeof prod ); 33: datafile.write( (char *) &cust, sizeof cust ); 34: }

Bu kod hakknda bir ift eye dikkat edin. lk olarak, veri yaplarnn 3-23 satrlar aras tanmlandn gryorsunuz. Yaplar, tahmin edilebilir bir ekilde belli bir kalpta dosyaya veri yazmakta kullanlr.(31-33 satrlar) Uygulamadaki dier rutinler, bu yaplar dosyadan veri okurken ve anlarken kullanabilirler. Uygulamay yapn. Hata veya uyarlar almamalsnz. Uygulamay altrdnz zaman, uygulamann bulunduu klasrde data.dat adnda bir dosya oluturacak ve dosyaya veri yazacak. Eer data.dat dosyasn bir hex dosya gstericisi ile aarsanz veya Notepad.exe ile dosyadaki veriyi greceksiniz.

VER TABANI ALIMASINI KULLANMAK N BR C++ TABAN SINIFI


Dikkat edilmesi gereken dier husus Liste 1 deki kaynak kod tam olarak nesneye ynelik deildir.

93 C++ kullanarak, diskteki dosyalara nesne verisinin okunmasn ve yazmasn kullanan bir taban snf yazabilirsiniz. Bu taban snfn Persistent snf diye adlandrabilirsiniz. rnek uygulamada, Persistent snftan bir Orders snf tretebilirsiniz. Maalesef, C++ Persistenet taban snfn allamaz yapan birka kstlamalara daha sahiptir. Persistent taban snf alma zamannda tretilmi bir snfn bir nesnesinin ne kadar byk olduunu bilemez. Bylece tretilmi bir snfn bir nesnesini diske saklayamaz. alma zaman ierii veya iareti ierikleri ile uraan tretilmi bir snfn bir nesnesinde veri yeleri de olabilir. Bir Persistent taban snf iin bu veri yelerini dzgnce kullanmak zor olacaktr. Bu problemler sonunda btn veri taban ilerini kullanmak iin bir C++ taban snf yazamazsnz manasna gelir. Bir snftan veriyi saklamak iin baz kodlar snfn kendi iinde olmaldr. OLE YAPISAL DEPOLAMA Microsoftun OLE teknolojisi, OLE yapsal depolama diye adlandrlan bir teknolojidir. OLE yapsal depolama, dosyalarnzn i yaplarn kefetmenizin potansiyelini dier uygulamalara vermeyi taahht eder. OLE yapsal depolama, disk zerindeki bir dosyann aklar ve depolama hiyerarisi paralarna blnmesini mmkn klan bir depolama mimarisidir. Depolamalar iletim sistemleri klasrlerine ve alt klasrlerine benzerler. Aklar iletim sistemindeki dosyalara benzerler. Bu depolama ve aklar tek bir disk dosyasnda mevcut olabilir. Liste 2 bir OLE yapsal depolama dosyas nasl oluturulur gsteriyor. Kk depolamada bir ak oluturun ve dizi bilgilerini akn iine yazn. Liste 2deki kod, hatalar iin geri dnen deerleri kontrol etmiyor, kod akl ve ksaln temin etmek iin. Bu rnei yapmak iin Visual C++ altrn ve Win32 konsol uygulamas iin yeni bir proje oluturun. Yeni projeye herhangi bir ad verebilirsiniz. OLESS diye adlandrmak uygun olacaktr. Projede bir kaynak dosya oluturur, muhtemelen main.cpp diye adlandrlacaktr ve aadaki kodu onun iine girin. Liste 2 OLE Yapsal Depolama
1: #include <windows.h> 2: #include <ole2.h> 3: struct Date 4: { 5: int iMonth, iDay, iYear; 6: }; 7: 8: struct Product 9: { 10: int iPartNumber; 11: char szName[80]; 12: double dPrice; 13: }; 14: 15: struct Customer 16: { 17: int iID; 18: char szName[50]; 19: char szAddress[50];

94
20: char szCity[20]; 21: char szState[20]; 22: char szZip[9]; 23: }; 24: 25: void main() 26: { 27: Date dt = { 6, 10, 92 }; 28: Product prod = {122, "Vegamatic", 19.95}; 29: Customer cust = {15, "Seymore Hoskins", "300 Oak St", "Boring", "Oregon", "97203"}; 30: 31: IStorage * pRootStorage; 32: IStream * pOrderInfo; 33: 34: CoInitialize(NULL); 35: 36: StgCreateDocfile(L"data.dat", STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &pRootStorage); 37: 38: pRootStorage->CreateStream(L"Order Information", STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pOrderInfo); 39: 40: pOrderInfo->Write(&dt, sizeof(dt), NULL); 41: pOrderInfo->Write(&prod, sizeof(prod), NULL); 42: pOrderInfo->Write(&cust, sizeof(cust), NULL); 43: 44: pOrderInfo->Release(); 45: pRootStorage->Release(); 46: 47: CoUninitialize(); 48: }

Tek bir veri dosyas iinde aklarn ve depolamalarn bir hiyerarisini oluturdunuz. 31. ve 32. satrlar iki OLE ara yz iaretisini tanmlar.(IStorage ve IStream) 34. satr COM ktphanelerini balatmak iin CoInitialize arr. 36.satr OLE yapsal depolama dosyasn oluturmak iin bir API fonksiyonu arr, StgCreateDocFile. Bu arma Istoragen balangcn oluturur ve son parametrede ona bir iareti geri dndrr, pRootStorage. 38.satr kk depoda bir ak oluturmak iin pRootStorage iaretisi iinden IStorage snfnn CreateStream fonksiyonunu arr. CreateStream fonksiyonu geriye bir IStream snf dndrr ve son parametrede ona bir iareti geri dndrr, pOrderInfo. 40-42 satrlar akn iindeki veriye yazmak iin Istreamin Write fonksiyonunu arr. 44. ve 45. satrlar pOrderInfo ve pRootStorage balamalarn silmek iin Releasei arr. 47. satr COM ktphanelerini durdurur. Uygulamay yapn. Hata veya uyar almamalsnz. Uygulamay altrdn zaman, uygulamann olduu klasrde data.dat adnda bir OLE yapsal depolama dosyas oluturacak ve verileri dosyaya yazacaktr. Hala dizi bilgileri iin metadata tanmlamalsnz. rnek uygulama iin metadata OLE yapsal depolama iin temsil etmesi ok komplekstir. Bir sipariin, bir sipari tarihi ierdiini (ay, gn yl olarak) bir rn ierdiini (rn numaras, ismi ve deeriyle beraber) ve bir mteri ierdiini (isim, adres vb ile beraber) belirtmelisiniz. Ayn zamanda veri tiplerini ve uzunluklarn belirtmelisiniz. Bu detay seviyesi aklar ve depolar hiyerarisi kullanarak temsil edilemez.

95 Eer OLE yapsal depolama kullanrsan, baka bir rutin veya veri dosyan amak isteyen ve verinin yapsn grmek isteyen uygulama bunu yapamayacaktr. Grecei tek ey depolarn ve aklarn bir hiyerarisini grecektir. Dier rutinler ve uygulamalar hala veriyi anlamak iin kaynak kodlara erimeleri gerekmektedir. Ayn zamanda OLE yapsal depolama doasnda dosya-kitleme(file-locking) veya kayt-kitleme(record-locking) yeteneine sahip deildir. Bylece yazmanz gereken kilitleme kodlarnn miktarn azaltmayacaktr. OLE yapsal depolama ncelikle dokman-merkezi(document-centric) uygulamas tarafndan, Microsoft Word ve Excel gibi, dokmanlara veri dosyalar oluturmak iin kullanlacaktr. Word ve Excel dosyalar kendilerini tanmlayamazlar. Excel verisi ieren bir OLE yapsal depolama dosyasndaki veriye erimek isteyen herhangi bir uygulama, aklarn iindeki verinin nasl organize olduu bilgisine sahip olmaldr. MASA ST VERTABANI Masast veritaban veri taban yazlmlarnn bir snfdr. Isam dosyalar kullandklar iin isam veritaban diye de adlandrlrlar. Marketlerde birok masast veritaban vardr. Ms access ms foxpro ve borland paradox bunlardandr. Bu veritabanlarnn birok farkllklar olsa da ortak zellikler tamaktadrlar. Masast veritabanlar meta datalarn isam dosyalarnda tarlar. Veri dosyalar kendiliinden tanmlanr. Bu eitli uygulamalarn veri tabanndaki verilere ulamasn salar. Masast veritabanlar kendi dilleri , veri eitleri ve yorumlayclar vardr. Masast veritabannn kendi dilini onunla uygulama gelitirmek iin kullanrz. Masast veritabanlar standart dbms fonksiyonlarn kullanmak iin gelitirilirler. Bunlar veri tanmlamas veri ileme sorgulama gvenlik ve bakmdr. Masast veritabanlar pclerde altrlmak iin tasarlanmtr. C++ programlar masast veritabanlarna erimek iin ODBC APIleri kullanrlar. Bir C++ program veri tabanna veri saklamak ve armak iin ODBC APIlerini arabilirler. ODBCyi access yorumlaycsna (jet database engine) dil komutlarn gnderebilirsiniz. Access bu komutun cevabn gnderecektir. 3 Listesi baz ODBC APIlerini gstermektedir. Bu ksa koddur ve bu hali ile ilenmez.
1: long lResult; 2: SDWORD cbResult; 3: HSTMT hstmt; 4: CDatabase mfcdb; 5: 6: mfcdb.OpenEx( "DSN=MyDataSource; UID=MyUserLogin; PWD=MyPassword;"); 7: 8: AFX_SQL_SYNC(::SQLAllocStmt(mfcdb.m_hdbc,&hstmt)); 9: 10: AFX_ODBC_CALL(::SQLExecDirect(hstmt, (UCHAR FAR*) "SELECT * FROM Orders",SQL_NTS)); 11: 12: while (::SQLFetch(hstmt) != SQL_NO_DATA_FOUND) 13: { 14: ::SQLGetData(hstmt, 1, SQL_C_LONG, &lResult, 0, &cbResult); 15: } 16: 17: AFX_SQL_SYNC(::SQLFreeStmt(hstmt,SQL_CLOSE)); 18:

96
19: mfcdb.Close();

4. satr MFC CDatabase snfn tanmlamaktadr. CDatabase ODBC veritabanlarna balanmak iin gereken kodu kapsar ve basitletirir. 6. satr CDatabasenin openex fonksiyonunu arr. Bu fonksiyon veritabanna balanr. 8. satr veri tabann yorumlamak iin gereken durumlar tutar. 10. satr veritabannda yorumlanp ilenen SELECT * FROM ORDERS SQL cmlesini gnderen sqlexecdirecti arr. 12 ve 15 . satrlar veritabanndan dnen veriyi alr. 14 . satr lResult deikenine dnen kaytlar ilk alanlara datr. 17. satr satr 8 de arlan durumu serbest brakr. 19. satr satr 6 da tanmlanan veritaban balantsn kapatr. Masast veritabanlar verileri daha hzl eriim ve sorgulama iin indexlerler. Masast veritabanlar verileri oklu uygulamalarn sra ile kullanmalar iin kilitleyebilirler. Masast veritabanlar kayda giren verilerin trn kontrol ederler. Bu sayede bir uygulama veri gnderdiinde yanl veri tipi olduunda gerekli hatay verebilirler. Bunu veritabannn kendisi yapar. Masast veritabanlar kendi dillerinde kme tabanl ilemlere izin verirler. Bir komutla binlerce kayt ilenebilir. rnein bir veri tabanndaki toplam miktar bulmak iin u komut yeterlidir.
SELECT SUM(price) FROM Orders

Masast veritabanlarn baz kstlamalar vardr. Veritabannn raw performans btrive gibi direct kayt ynetimli veritabanlar kadar iyi deildir. NESNE VERTABANLARI lkel veri tabanlar veriyi meta dat olmadan saklarlar. Kendinden tanmlanabilir veritaban dosyas oluturmak iin masast veritaban ve ilikili veritabanlar meta datay veritaban dosyas iinde tarlar. Object database bir adm daha ileri gider. Bu tr veri ve ilenecek kodu ayn dosyada tarlar. Bu tre bir ok rnekler marketlerdedir tkenmeden hemen aln... Nesnesel veritabanlar tipik olarak bir programlama diline ihtiya duyarlar. C++ nesnesel veri taban C++ in tip sistemini (ne demekse type system ) destekler. Bir C++ nesnesel veritabann C++ snflarnn rneklerini dorudan veri taban iinde saklamak iin kullanabilirsiniz. Liste 5 C+ nesnesel veri tabann rn bilgilerini nasl saklanacan gsterir. Bu ksa koddur byle ilenmez.
1: #include <string.h> 2: 3: // Header file for the Object Database 4: // Management Group (ODMG) object model. 5: #include <odmg.h> 6: 7: // Derive our Product class from d_Object 8: // so Product can persist itself in the database. 9: class Product : public d_Object 10: {

97
11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: public: int iPartNumber; char szName[80]; double dPrice; private: d_Ref<Product> next; // For iterating instances of Product // in the database. }; d_Database db; // Global instance of the object database. const char * const db_name[] = "Products"; void main() { db.Open(db_name); // Opens the Products database. d_Transaction tx; // Create and begin a transaction. tx.begin(); // Create a new product instance in the database. Product *prod = new(&db, "Product") Product; prod->iPartNumber = 122; strcpy(prod->szName, "Vegamatic"); prod->dPrice = 19.95; tx.commit(); db.close(); } // Commit the additions to the db. // Close the db.

Satr 5 d_object snfnn ierdei tanmlamalar satan odmg.h balk dosyasnn olduunu sylemektedir. d_object snf veri tabanna balanmak iin gereken tanmlamalar ieren c++ ana snflarndandr. Satr 9 d_object snfndan product snfn elde eder. Product snf d_ref<product> diye bir yeye sahiptir(Satr 16). D_ref<> veritaban salaycs tarafndan salanan bir iaretidir.(pointer) Satr 30 daki new le arlan veritabanndaki productta bir rnekleme oluturur. Satr 31-32 product rneklemesindeki veri yelerinin deerlerini deitirirler. 35 deiiklikleri uygular. 36 veritabann kapatr. Grld gibi C++da veritaban fonksiyonlar ok az bir kodla kullanlabilir. Bu sk kaynama byk veri modellerini programlamak iin gl bir imkan salar. C++n full kapsama miras brakma ve ploymorfizm zelliklerini kullanabilirsiniz. Eer nesnesel dbms kullanrsanz sizin uygulamanz karmak veritaban ierebilir. Bunun yannda dezavantajlar da vardr. Nesnesel veritabanlar programlama dili ile ok giriik olduu iin baka uygulamalar tarafndan kullanlmas zordur.

VERTABANI KARILATIRMALARI OLE SS Record Mgr Desktop Db + Object Db -? RDBMS Server +

Veri akl

C++ -

98 Kompleks veri modelleri ok Kullanc Performans Kapasite Kme tabanl ileme Serverda ileme Uygulamaya adaptason + Veri btnl Kod fonksiyonluk oran Tablo 4.1 Veritaban karlatrmalar + + + + + + +? +? +? + -? ? + ++

+ + + + + + +

ODBC
ODBC, Open Database Connectivity kelimesinin ksaltlm eklidir. ODBC, Windows uygulamalarnn oluturulmu veri taban alanlarna balantsn salar. Her ODBC uygulama routini, SQL kelimesi ile balar. rnein, SQLFetch(hstmt); buna rnektir. Aadaki ekil ODBC uygulamas, veri kaynaklar arasndaki ilikiyi aklar: ODBC Application MFC CRecordSet CRecordView ODBC Driver Menager Driver Driver Driver Data Data Data Source Source Source ODBC uygulamalar, MFC classlarn kullanabilir yada dorudan ODBC driver menegeri arabilir. MFC class fonksiyonlarn kullanma konusunda yada ODBC driver menegeri dorudan kullanma konusunda herhangi bir kstlama yoktur. Bununla beraber, uygulamalarn MFC ODBC classlar ile birlikte yazlmasnda ye fonksiyonlar kullanlmaktadr. ODBC Admlar u ekilde gsterilebilir. START Initialization SQLAllocEnv() SQLAllocConnect() SQLConnect() veya

99 SQLDriverConnect() SQLAllocStmt() Data Access Get optional into on data source Set up columns needed Fetch data using SQLFetch() Termination SQLFreetmt() SQLDisconnect() SQLFreeConnect SQLFreeEnv() DONE ODBC Fonksiyonlar ODBC, geni bir fonksiyon ktphanesini sunmaktadr.Genelde veri taban almalarnn ounda birka ODBC fonksiyonu yeterli olmaktadr. ODBCnin ileyii srasyla admla gsterilebilir. 1. Balang olarak, yer ayrma ve balant salanmas ilemi gerekletirirlir. 2. Veri kayna balants, veri okuma, gncelleme, ekleme, islme vb. ilemler gerekletirilir. 3. Balant kesme ve serbest brakma ilemleri yaplr. Veri taban balantlarnda SQLin SELECT FROM gibi basit mantk gruplar kullanlabilecei gibi JOIN gibi daha karmak yaplarda kullanlabilir.

Initializaiton lemi
Bu evrede, yer ayrma ilemi ilk adm tekil eder. SQLAllocEnv() fonksiyonu ile ODBC yaplar iin bellekte yer ayrma ilemi yaplr, bir HENV handle dndrlr. Bu handle, dier fonksiyonlarn arlmas iin gereklidir. Daha sonra, balant admna geilir. Burada SQLAllocConnect() fonksiyonu kullanlr. SQLAllocConnect() SQLAllocEnv() fonksiyonundan sonra kullanlmaldr ve balanty salar. SQLConnect() ve CQLDriverConnect() SQLConnect() veya SQLDriverConnect(), enviromentten sonra arlr ve balanty salarlar. Veri kayna ve uygulama arasnda en iyi performans vereni seilmelidir. kisi arasndaki temel fark.

100 SQLDriverConnect() fonksiyonunun, Network topolojileri blmnde ykl bulunan kullanc arayz glklerini engelleyici veri kayna balants yapmas iin parametre desteine ihtiyacnn olmasdr. Data Access Aamas Veri eriimi aamas, SQLAllocStmt() fonksiyonunu ierir. SQLAllocStmt(): Geerli SQL statement handle iin bellekte yer ayrr. Eriim aamas, veri tabanndaki veriler iin hangi deikenlerin kullanlacann belirlendii aamadr. Her ilem iin deiken kullanm gereksiz klnmtr Veriye eriim SQLFetch() fonksiyonu ile salanr. SQLFetch(): Bir dizi veriyi alp getirme ilemini yapar. SQLFetch(), tanmlanm SQL_SUCCESS veya SQL_SUCCESS_WITH_INFO deimezlerinden deerini geri dndrr. Termination lemi Balant kesme anlamndadr. Bu ksmda, veri kaynandaki verilere eriim tamamlanm, bellek serbest braklmtr. Bu ilemler, SQLFreeStmt(), SQLDisconnect(), SQLFreeConnect, ve SQLFreeEnv() fonksiyonlarnn arlmas ile salanr.

MFC ve ODBC
ODBC fonksiyonlarnn C++ programlama ile ilikisini aklar. ODBC eriimi iin kullanlan iki ana MFC snf CRecordSet ve CRecordView isimlerini tar. CRecordSet, ODBC eriimi iin kullanlan ana snftr. CRecordSetView, yardmc snftr. Bir veri kmesindeki kaytlat grmek iin kullanlr. CRecordView snf her zaman CRecordSete balanr. Kullanc eer CRecordSet* OnGetRecordSet() ye fonksiyonu otomatik olarak balanty salar. ClassWizard, bu fonksiyonun kullanc tarafndan girilmesini beklememektedir. CDatabase Snf CDatabase snf ODBC kullanm iinde temel yaplandrma bloudur. CRecordSet snf nesnesi gncel kayt ile arayz oluturabilmek iin CDatabase class nesnelerini kullanr. Her programda CDatabase nesnesini yaratmaya ihtiya duyulmaktadr. Eer, CRecordSetin, yapcs CDatabase snfnn iaretisi iin NULL deeri retti ise CRecordSet snf yeni bir CDatabase nesne oluturacaktr.

101

Veri yeleri CDatabase snfnda bir adet veri yesi vardr. m_hdbc: SQLAllocConnect() ile arlan bir ODBC balant handlenn ismidir. ye deikeni olan n_hdbcnin tipi HDBCdir Fonksiyon yeleri Ama, kapatma, tasarmc, yok edici yeleri. CDatabase nesnesinin constructor(yapc), destructor(ykc), ama, kapatma fonksiyonlar aada belirtilmitir. CDatabase(): Bir tasarmcdr. Snf yaratld zaman arlr. CDatabase snf yaratldktan sonra Open() fonksiyonunu armak gerekmektedir. Open(): BOOL Open (LPCSTR IpszDSN, BOOL bExclusive=FALSE, BOOL bReadOnly=FALSE, LPCSTR IpszConnect=ODBC;, BOOL bUseCursorLib=TRUE); Open() ye fonksiyonu bir veri kayna ile balanty aar. IpszDSN parametresi gereklidir. Fakat, tm dier parametreler seimliktir. Close():
Virtual void Close();

Bu fonksiyon, veri kaynann almasndan sonra veri kaynan kapatmak iin kullanlr.

CDatabase():
Virtual void CDatabase();

Bir CDatabase nesnesi iin default destructordr. Veri Taban Niteliklerini Belirleyen Fonksiyonlar Veri kayna ile ilgili pek ok fonksiyon ierir. GetConnect(): const CString& GetConnect() const; GetConnect() fonksiyonu, ODBC balant stringi iin bir Cstrin pointer dndrr. Eer Open() fonksiyonu armaz ise bu string botur. IsOpen():
BOOL IsOpen() const;

102 IsOpen() fonksiyonu, ayet CDatabase nesnesine veri kayna balanm ise sfr olmayan bir deer dndrr. Veri kayna CDatabase nesnesine balanmam ise IsOpen() fonksiyonu False dndrr. GetDatabaseName():
CString GetDatabaseName() const:

Veri taban balants iin CString iaretisi dndrr. Geri dndrlen bu isim Open() fonksiyonunun IpszDSN parametreleri ile tanmlanm veri kaynann ismi deildir. Gerek string ODBC zerinden bal olup dnen stringdir. Bilindii gibi pek ok veri taban tablolardan olumaktadr. ODBC tablonun ismini deil de veritabannn ismini geri dndrr. Herhangi bir isimle karlalmaz ise GetDatabaseName() fonksiyonu bo string dndrr. CanUpdate():
BOOL CanUpdate const;

Gncelleme ilemi yapabilen bir CDatabase objesi var ise ve buna balanm ise CanUpdate() fonksiyonu sfr olmayan bir deer dndrr. CanTransact():
BOOL CanTransact() const;

Veri kayna, gncellemeyi destekliyor ise sfr olmayan bir deer dndrr. InWaitForDataSource():
static BOOL PASCAL InWaitForDataSourca();

Kullanc arayz gncellemede yardmc fonksiyondur. SetLoginTimeOut(): void SetLoginTimeOut(DWORD dwSeconds); Veri kayna iin zaman ayarlamada kullanlr. Bu fonksiyon, Open() fonksiyonundan nce arlr ve normalde bekleme 15 saniye olarak belirtilmitir. SetQueryTimeOut():
void SetQueryTimeOut(DWORD dwSeconds);

Bir nceki bekleme sresini deitirmek iin kullanlr. SetSyncronousMode():


Void SetSyncronousMode(BOOL bSyncronous);

SQL fonksiyonlar ile uygulama armlarn ve ODBC geri dnmleri kontrol amac ile kullanlr.

103

Veri Taban Fonksiyonlar BeginTrans():


BOOL BeginTrans();

Bu grup, bir seri ilemi yerine getirmek iin kullanlr. AddNew(), Edit(), Update(), Delete() armlar yaplabilir. BeginTrans fonksiyonu kaytlarn almasndan sonra arlmaldr.. BeginTrans() fonksiyonunun CommtTrans() ya da RollBack() fonksiyonlarndan herhangi biri olmadan arlmas bir hatadr. CommitTrans():
BOOL CommitTrans();

Veri kaynana ekleme, yazma ya da veri kaynandan silme gibi gncelleme ilemleri yaplaca zaman kullanlr. CommitTrans() fonksiyonu arlr ve sonra BeginTrans() fonksiyonu arlr. CommitTrans() fonksiyonun BeginTrans() olmadan arlmas bir hata oluturulur. Ayn ekilde CommitTrans() fonksiyonlarndan sonra RollBack() fonksiyonun arlmasda hataya sebep olur. Cancel():
void Cancel();

Askdaki asenkron ilemleri iptal etmek iin kullanlan bir fonksiyondur. ExecuteSQL():
BOOL ExecuteSQL (LPCSTR IpszSQL);

ExecuteSQL(), SQL komutlarn direkt altrmak iin kullanlan bir yntemdir.. ayet, ExecuteSQL() fonksiyonu baarsz olduunda MFC Database snf nesneleri ilgili hata oluur ve istisna duruma geme anlamna gelen CDBException oluur. OnSetOptions():
virtual void OnSetOptions(HSTMT hstmt);

OnSetOptions() fonksiyonu, ExecuteSQL() ve CRecordSer::OnSetOptions() fonksiyonlar arlr ise ileyen bir fonksiyondur. OnSetOptions(), seimlik bir numara atar.

CRecordSet Snf
ODBC eriimleri iin kullanlan MFC snfdr. ye Dekenleri

104 m_hstmt: CrecorSet snfnn ifade edilmesi iin handle tanmlar. Bu yenin tipi HSTMTdir Bu handle, yalnzca Open() fonksiyonu arldktan sonra geerli hale gelir ve sadece okunabilen bir ye deikendir. Kullanc uygulamalar ile direkt olarak deitirilmez. m_nFields: Veri kaynandaki tablo iindeki alanlarn numarasn gsteren bir deikeni ifade eder. UINT tipindedir. m_nDatabase: CDatabase snfn gsteren pointer trnde bir ye deikendir. m_nParams: Veri kaynann kaytlar iindeki veri yelerinin numaralarn gsteren ye deikendir. UINT tipindedir. ye fonksiyonlar alt gruba ayrlabilir: 1. 2. 3. 4. 5. Tasarmc, yokedici, ama ve kapatma fonksiyonlar. Kayt alann niteliini belirleyen fonksiyonlar. Kayt alan gncelleme fonksiyonlar. Dier kayt fonksiyonlar. Genel ye fonksiyonlar.

Tasarmc, Yokedici, Ama ve Kapatma Fonksiyonlar CRecordSet():


CRecordSet(CDatabase* pDatabase);

CRecord ye deimezi bir CRecordSet nesnesidir. pDatabase parametresi, CDatabase pointer yada NULL deerlerini gsterir.

CRecordSet():
CRecordSet; CRecordSete ait ye yok edici fonksiyondur. Otomatik olarak arlr. Open():
virtual BOOL Open(UNIT dwOptions=defaultOptions); nOpenType=snapshot, LPCSTR IpszSql=NULL, DWORD

Open() fonksiyonu bir kayt aar, tablolar getirir veya kayt sorgulama ilemlerini yerine getirir. nOpenType; dynaset, sanpshot ya da forwardOnly tiplerinden herhangi birine sahiptir. Close():
virtual void Close();

Kayt alann kapatr.

105 Kayt Alan Niteliini Belirleyen Fonksiyonlar CanAppend():


BOOL CanAppend const;

Bu fonksiyon kayt alanna yeni kayt eklenebiliyorsa sfr olmayan bir deer dndrr. Yeni kayt ekleme AddNew() ye fonksiyonu ile salanr. CanRestart():
BOOL CanRestart() const;

Requery() ye fonksiyonun kayt alan sorgulamasn tekrar armas durumunda sfr olmayan bir deer dndrr. CanUpdate():
BOOL CanUpdate() const;

ayet kayt alann ekleme, gncelleme ya da kaytlar silme gibi zellikleri var ise sfr olmayan bir deer dndrr. GetRecordCount():
Long GetRecordCount() const;

GetRecordCount(), kayt alanndaki kaytlarn numaralarn dndren bir ye fonksiyonudur. Eer kayt yok ise 0 (sfr) deerini dndrr. GetStatus():
void GetStatus (CRecordSetStatus& rStatus) const;

CRecordStatus yapsna bir pointer atar. Bu fonksiyon bir deer dndrmez.


CRecordStatus { Long m_lCurrentRecord; BOOL m_bRecordCountFinal; };

m_lCurrentRecord deikeni, kayt alanndaki kaytlarn numaralarn kapsayan long integer tr bir deikendir. m_bRecordCountFinal deikeni, CRecordSet kayt alanndaki toplam kayt saysna sahip olduunda sfr olmayan herhangi bir deer kapsar. GetTableName():
Const CString& GetTableName() const;

Open() fonksiyonundan sonra arlmak zorundadr. Tablo ismini dndren fonksiyondur.

106

GetSQL():
const CString& GetSQL() const;

SQL kullanlarak kayt alanndan seilen kaytlar alp getiren bir ye fonksiyondur. IsOpen():
BOOL IsOpen const;

Kayt alan ak ise sfrdan baka bir deeri geri dndrr. GetTableName() ve GetSQL() gibi fonksiyon armlarnda kullanlan yararl bir ye fonksiyondur.

IsBOF():
BOOL IsBOF() const;

Eer kayt kmesi birinci kayta konumlanrsa sfrdan baka bir deer dndrr. IsEOF();
BOOL IsEOF() const;

Kayt kmesi son kayta konumlanrsa sfrdan baka bir deer dndrr. IsDeleted():
BOOL IsDeleted() const;

Eer geerli olan kayt silindi ise sfrdan farkl bir deer dndrr. Kayt Alan Gncelleme Fonksiyonlar AddNew():
void AddNew();

AddNew() fonksiyonu, CRecordSet nesnesini yeni kayt eklemek iin hazrlar. Delete():
BOOL Delete();

Geerli kaytlar kayt alanndan silmek iin kullanlan ye fonksiyondur. Edit():


void Edit();

107 Kayt yazmak iin kullanlan fonksiyondur. Edit() fonksiyonu ile deikenler deitirilir sonra Update() fonksiyonu ile deiiklikler kayt alanna eklenirler. Update():
BOOL Update();

AddNew() ya da Edit() fonksiyonlarndan sonra arlr. Kayt Alan Ak Fonksiyonlar Move():


virtual void Move (long lRows);

Bir yada daha ok kaytn aktarm iin kullanlr. leri doru aktarm iin lRows parametresi pozitif deerlidir. Geriye doru aktarm iin lRows parametresi negatif deere sahiptir. MoveFirst():
void MoveFirst();

Kayt alanndaki birinci kayta aktarmak iin kullanlr. ayet kayt alannda herhangi bir kayt yok ise bu fonksiyon arlmaz. MoveLast():
void MoveLast();

Kayt alanndaki en son kayta aktarmak iin kullanlr. MoveNext():


void MoveNext();

Bir kayttan sonraki kayta aktarmak iin kullanlan fonksyondur. Dier Baz Kayt Alan Fonksiyonlar: SetFieldNull():
void SetFieldNull (void* pv, BOOL bdrity=TRUE);

Alan silmek, alan bo hale getirmek iin kullanlan fonksiyondur. Eer pv parametresi NULL ise btn alanlar botur. Genel ye Fonksiyonlar DoFieldsExchange():
virtual void DoFieldExchange(CfieldExchange* pFX)=0;

108 Geerli kayt ile her stunun bilgilerini tutan snf ye deikenlerinin arasnda transfer yapmak iin kullanlr. GetDefaultConnect();
virtual CString GetDefaultConnect();

Geerli balant stringini geri dndrr. GetDefaultSQL();


virtual CString GetDefaultSQL()=0;

Geerli SQL stringini altrmak iin kullanlr. CRecordView Snf CRecordView():


CRecordView (LPCSTR lpszTemplateName); CrecordView (UINT nIDTemplate);

Default olan yapc snf dialog box template ismine yada bir dialog box template belirleyicisine ihtiya duyar. Dialog box template bulunamazsa CrecordView() fonksiyonu baarsz olur.

VSUAL C++ LE VERTABANI

109

Adres defteri projesi iin MFC AppWizard ile bir veri tabanl bir proje oluturun. Projede bulunan snflarn kodlar aada bulunmaktadr. Balantnn saland fonksiyon.
CString CAdresDefteriSet::GetDefaultConnect() { return _T("ODBC;DSN=AdresDefteri"); }

Veri tabanndan ekilecek olan veri iin SQL deyiminin girildii fonksiyon.
CString CAdresDefteriSet::GetDefaultSQL() { return _T("[Adres]"); }

Kaytlar aabilmek iin yaratlm olan CRecordSet snf:


class CAdresDefteriSet : public CRecordset { public: CAdresDefteriSet(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CAdresDefteriSet) // Field/Param Data //{{AFX_FIELD(CAdresDefteriSet, CRecordset) long m_ID; CString m_isim; CString m_Soyad; CString m_Adres; CString m_il;

110
CString m_Mail; CString m_Tel; //}}AFX_FIELD // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAdresDefteriSet) public: virtual CString GetDefaultConnect(); // Default connection string virtual CString GetDefaultSQL(); // default SQL for Recordset virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support //}}AFX_VIRTUAL // Implementation #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif };

Kayt ekleme butonu iin fonksiyon.


void CAdresDefteriView::OnBtnAdd() { // TODO: Add your control notification handler code here m_pSet->AddNew(); CEdit* pCtrl = (CEdit*)GetDlgItem(IDC_ADRES_ID); int result = pCtrl->SetReadOnly(FALSE); UpdateData(FALSE);}

Arama butonu iin fonksiyon.


void CAdresDefteriView::OnBtnAra() { // TODO: Add your control notification handler code here CString Deger, str ; m_ara.GetWindowText(Deger); if (m_radioAdres.GetCheck()) str = "Adres = '" + Deger + "'"; if (m_radioisim.GetCheck()) str = "isim = '" + Deger + "'"; if (m_radioil.GetCheck()) str = "il = '" + Deger + "'"; if (m_radioMail.GetCheck()) str = "Mail = '" + Deger + "'"; if (m_radioSoyad.GetCheck()) str = "Soyad = '" + Deger + "'"; m_pSet->Close(); m_pSet->m_strFilter = str; m_pSet->Open(); if (m_pSet->GetRecordCount()>0) m_pSet->MoveFirst(); UpdateData(FALSE);}

Kayt silme butonu iin fonksiyon.


void CAdresDefteriView::OnBtnDelete() { // TODO: Add your control notification handler code here m_pSet->Delete(); m_pSet->MoveNext(); if (m_pSet->IsEOF()) m_pSet->MoveLast(); if (m_pSet->IsBOF()) m_pSet->SetFieldNull(NULL); UpdateData(FALSE);}

111

Birinci kayta gtren fonksiyon.


void CAdresDefteriView::OnBtnFirst() { // TODO: Add your control notification handler code here m_pSet->MoveFirst(); UpdateData(FALSE); }

Kayt ekleyen fonksiyon.


void CAdresDefteriView::OnBtnKaydet() { // TODO: Add your control notification handler code here UpdateData(FALSE); }

Son kayta gtren fonksiyon.


void CAdresDefteriView::OnBtnLast() { // TODO: Add your control notification handler code here m_pSet->MoveLast(); UpdateData(FALSE); }

Bir sonraki kayta gtren fonksiyon.


void CAdresDefteriView::OnBtnNext() { // TODO: Add your control notification handler code here if (m_pSet->IsBOF()==TRUE){ m_pSet->MoveNext(); } if (m_pSet->IsEOF()==FALSE){ m_pSet->MoveNext(); } UpdateData(FALSE); }

Bir nceki kayta gtren fonksiyon.


void CAdresDefteriView::OnBtnPrevious() { // TODO: Add your control notification handler code here if (m_pSet->IsEOF()==TRUE){ m_pSet->MovePrev(); } if (m_pSet->IsBOF()==FALSE){ m_pSet->MovePrev(); } UpdateData(FALSE); }

Kayt gncelleme fonksiyonu.


void CAdresDefteriView::OnBtnUpdate() { // TODO: Add your control notification handler code here m_pSet->Update();

112
UpdateData(FALSE); }

Kaytlar adrese gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresDefteriView::OnRadioAdres() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "Adres"; m_pSet->Open(); UpdateData(FALSE); }

Kaytlar ile gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresDefteriView::OnRadioIl() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "il"; m_pSet->Open(); UpdateData(FALSE); }

Kaytlar maile gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresDefteriView::OnRadioMail() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "Mail"; m_pSet->Open(); UpdateData(FALSE); }

Kaytlar isime gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresDefteriView::OnRadioIsim() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "isim"; m_pSet->Open(); UpdateData(FALSE); }

Kaytlar soyada gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresDefteriView::OnRadioSoyad() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "Soyad"; m_pSet->Open(); UpdateData(FALSE);}

BLM 5 : Adres Defteri Projesi

113 PROJENN VERTABANININ HAZIRLANMASI .................................................... 114 PROJENN ER ...................................................................................................... 115 PROJENN YAPILII .................................................................................................... 115 KODLAR .......................................................................................................................... 119

114

PROJENN VERTABANININ HAZIRLANMASI


Adres defteri projesinin veritaban iin Microsoft Access veritaban programn kullanacaz. imdi adm adm veritabannn oluturulmasna bakalm. Microsoft Access programn an. Size 3 seenek sunacaktr. Birincisi Bo Access veritaban, ikincisi Access veritaban sihirbazlar, sayfalar ve projeleri, ncs ise Varolan bir dosyay a. Bu seenekten birincisini iaretleyin ve veritabannz projenizi yapacanz klasrn bir alt klasrne veya ayn klasre kaydedin. smini Adres olarak deitiriniz. Veritabannz gsterdiiniz klasre oluturulmutur. imdi tablo oluturmak iin Ekle mensnden Tablo seeneini sein. Alan pencereden Tasarm grnmn sein ve Tamam tklayn. Tablo1 balkl pencerede oluturduumuz tablonun ierisinde bulunacak olan alanlarn tanmlamalarn yapacaz. Burada her satr bir alan temsil etmekte. Satrlara gireceimiz 3 tr bilgi bulunmaktadr. Birincisi alann ad, ikincisi veri tr, ncs alanla ilgili ksa bir tanm. Birinci satrn ilk stununu sein ve AdresNo olarak girin. Veri tr bilgisine Otomatik say olarak girin. Tanm ksmna istediiniz tanm girebilirsiniz. rnein Adreslerin index numaras. AdresNo alan index olduundan. Bu alana hibir zaman ayn bilgi girilmez bu yzden bu alan anahtar alan olarak tanmlamalyz. Bunu yapmak iin satrda sa tklayn ve birincil anahtar seeneini sein. imdi aadaki deerleri veri trlerine gre dzenleyin Otomatik Say Metin Metin Metin Metin Metin Say Metin Metin Metin Metin Metin Metin Metin

AdresNo Adresisim AdresSoyad AdresTelefon AdresCepTelefon AdresMail AdresYas AdresMeslek AdresTakmaAd Adresil Adresilce Adres AdresWebSayfa AdresAciklama

Adres, AdresAciklama, AdresWebSayfa alanlarnn boyutunu sol alt kede bulunan alanlarn zelliklerini belirleyen kutulardan ayarlayabiliriz. Burada Alan Boyutu isimli kutunun deerini 250 olarak yukardaki alanlar iin deitirin. Alanlar belirledikten sonra CTRL + S tularna basarak ve Tablo1 olarak verilmi geici ismi Adres olarak deitirin. imdi ise Adres:Veritaban isimli pencerede Adres isimli tablonuzu ift tklayn. Ve birka tane veri girin.

115 Veri taban alannzn grnts u ekilde olacaktr.

ekil 5.1 Projenin Veritabannn Grnts

PROJENN ER
Projemizde bir adres defteri yapacaz. Bu adres defterinde kaytlar arasnda gezme. leri, yani bir sonraki kayta gitme. Geri yani bir nceki kayta gitme. lk kayta ve son kayta gitme gibi kaytlar arasnda gezme ilemini yapacak butonlar bulunacaktr. Adres defteri projesine yeni kiiler ekleme, varolan kiilerin bilgilerini deitirme ilemleri yaplabilecektir. Ayrca veritabannda bulunan kiileri silme ilemleri yaplabilecektir. Projemizde kiiler arasnda kriterlere gre arama ve sralama da bulunacaktr. Kiilerin isim, soyad, telefon, cep telefon, mail, meslek, ya, adres, web sayfa, il ve ileleri tutulacaktr. Ayrca kiiye ait zel bir aklama girebilmek iin birde aklama alan oluturulmutur.

PROJENN YAPILII
Projeye balamadan nce Adres isimli DSN tanmlanm olmasna dikkat ediniz. DSN tanmlamasn Kontrol Panelinden ODBC seerek yapabilirsiniz. imdi adm adm projenin yaplmasna bakalm. Yeni proje oluturmak iin Microsoft Visual C++ an. File ve New seeneini sein. Alan New penceresinin Projects sekmesini sein. Listeden MFC APPWizard (exe) sein. Project Name ksmna Adres yazn ve projeyi kaydetmek istediiniz yolu location kutusuna girinve OK butonunu tklayn. Alan Step 1 penceresini Next diyerek gein. Step 2 penceresinden Database view without file support sein ve Data Source butonuna tklayn. Alan pencerede ODBC kutusunda Adres seeneini sein. Alan pencereden Adres Table sein. OK butonuna basn. Daha sonra Finish Butonuna basarak projenizi oluturun.

116 Projeniz oluturulmutur. Sizin yapmanz gereken projeyi dzenlemek ve kaytlar kontrol edecek komutlar yazmak. imdi kontrolleri yerletirin ve u ekilde ayarlayn.

Tablo 5.2 Projenin Grnts Aadaki fonksiyonlar altlarndaki kodlar girin.

Balantnn saland fonksiyon.


CString CAdresSet::GetDefaultConnect() { return _T("ODBC;DSN=Adres"); }

Veri tabanndan ekilecek olan veri iin SQL deyiminin girildii fonksiyon.
CString CAdresSet::GetDefaultSQL() { return _T("[Adres]"); }

Kaytlar aabilmek iin yaratlm olan CRecordSet snf.


CAdresSet::CAdresSet(CDatabase* pdb): CRecordset(pdb) { //{{AFX_FIELD_INIT(CAdresSet) m_AdresNo = 0; m_Adresisim = _T(""); m_AdresSoyad = _T("");

117
m_AdresTelefon = _T(""); m_AdresCepTelefon = _T(""); m_AdresMail = _T(""); m_AdresYas = 0; m_AdresMeslek = _T(""); m_AdresTakmaAd = _T(""); m_Adresil = _T(""); m_Adres = _T(""); m_Adresilce = _T(""); m_AdresWebSayfa = _T(""); m_AdresAciklama = _T(""); m_nFields = 14; //}}AFX_FIELD_INIT m_nDefaultType = snapshot; }

Kayt ekleme butonu iin fonksiyon.


void CAdresView::OnButtonYenikayit() { // TODO: Add your control notification handler code here m_pSet->AddNew(); CEdit* pCtrl = (CEdit*)GetDlgItem(IDC_EDIT_NO); int result = pCtrl->SetReadOnly(FALSE); UpdateData(FALSE); }

Arama butonu iin fonksiyon.


void CAdresView::OnButtonAra() { // TODO: Add your control notification handler code here CString Deger, str ; m_ara.GetWindowText(Deger); if (m_radioAdres.GetCheck()) str = "Adres = '" + Deger + "'"; if (m_radioisim.GetCheck()) str = "Adresisim = '" + Deger + "'"; if (m_radioSoyad.GetCheck()) str = "AdresSoyad = '" + Deger + "'"; m_pSet->Close(); m_pSet->m_strFilter = str; m_pSet->Open(); if (m_pSet->GetRecordCount()>0) m_pSet->MoveFirst(); UpdateData(FALSE); }

Kayt silme butonu iin fonksiyon.


void CAdresView::OnButtonSil() { // TODO: Add your control notification handler code here m_pSet->Delete(); m_pSet->MoveNext(); if (m_pSet->IsEOF()) m_pSet->MoveLast(); if (m_pSet->IsBOF()) m_pSet->SetFieldNull(NULL); UpdateData(FALSE); }

Birinci kayta gtren fonksiyon.

118

void CAdresView::OnButtonIlkkayit() { // TODO: Add your control notification handler code here m_pSet->MoveFirst(); UpdateData(FALSE); }

Kayt ekleyen fonksiyon.


void CAdresView::OnButtonKaydet() { // TODO: Add your control notification handler code here UpdateData(FALSE); }

Son kayta gtren fonksiyon.


void CAdresView::OnButtonSonkayit() { // TODO: Add your control notification handler code here m_pSet->MoveLast(); UpdateData(FALSE); }

Bir sonraki kayta gtren fonksiyon.


void CAdresView::OnButtonIleri() { // TODO: Add your control notification handler code here if (m_pSet->IsBOF()==TRUE){ m_pSet->MoveNext(); } if (m_pSet->IsEOF()==FALSE){ m_pSet->MoveNext(); } UpdateData(FALSE); }

Bir nceki kayta gtren fonksiyon.


void CAdresView::OnButtonGeri() { // TODO: Add your control notification handler code here if (m_pSet->IsEOF()==TRUE){ m_pSet->MovePrev(); } if (m_pSet->IsBOF()==FALSE){ m_pSet->MovePrev(); } UpdateData(FALSE); }

Kayt gncelleme fonksiyonu.


void CAdresView::OnButtonGuncelle() { // TODO: Add your control notification handler code here m_pSet->Update(); UpdateData(FALSE); }

119

Kaytlar adrese gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresView::OnRadioAdres() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "Adres"; m_pSet->Open(); UpdateData(FALSE); }

Kaytlar isime gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresView::OnRadioIsim() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "Adresisim"; m_pSet->Open(); UpdateData(FALSE); }

Kaytlar soyada gre sralamak iin seim yaptran ve ileten fonksiyon.


void CAdresView::OnRadioSoyad() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "AdresSoyad"; m_pSet->Open(); UpdateData(FALSE); }

KODLAR
Adres.cpp
// Adres.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "Adres.h" #include "MainFrm.h" #include "AdresSet.h" #include "AdresDoc.h" #include "AdresView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAdresApp BEGIN_MESSAGE_MAP(CAdresApp, CWinApp) //{{AFX_MSG_MAP(CAdresApp)

120
ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAdresApp construction CAdresApp::CAdresApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CAdresApp object CAdresApp theApp; ///////////////////////////////////////////////////////////////////////////// // CAdresApp initialization BOOL CAdresApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CAdresDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CAdresView)); AddDocTemplate(pDocTemplate);

// main SDI frame window

// Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it.

121
m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() // App command to run the dialog void CAdresApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CAdresApp message handlers

// DDX/DDV support

AdresDoc.cpp
// AdresDoc.cpp : implementation of the CAdresDoc class

122
// #include "stdafx.h" #include "Adres.h" #include "AdresSet.h" #include "AdresDoc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAdresDoc IMPLEMENT_DYNCREATE(CAdresDoc, CDocument) BEGIN_MESSAGE_MAP(CAdresDoc, CDocument) //{{AFX_MSG_MAP(CAdresDoc) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAdresDoc construction/destruction CAdresDoc::CAdresDoc() { // TODO: add one-time construction code here } CAdresDoc::~CAdresDoc() { } BOOL CAdresDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) return TRUE; }

///////////////////////////////////////////////////////////////////////////// // CAdresDoc diagnostics #ifdef _DEBUG void CAdresDoc::AssertValid() const { CDocument::AssertValid(); } void CAdresDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG

123
///////////////////////////////////////////////////////////////////////////// // CAdresDoc commands

AdresSet.cpp
// AdresSet.cpp : implementation of the CAdresSet class // #include "stdafx.h" #include "Adres.h" #include "AdresSet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAdresSet implementation IMPLEMENT_DYNAMIC(CAdresSet, CRecordset) CAdresSet::CAdresSet(CDatabase* pdb) : CRecordset(pdb) { //{{AFX_FIELD_INIT(CAdresSet) m_AdresNo = 0; m_Adresisim = _T(""); m_AdresSoyad = _T(""); m_AdresTelefon = _T(""); m_AdresCepTelefon = _T(""); m_AdresMail = _T(""); m_AdresYas = 0; m_AdresMeslek = _T(""); m_AdresTakmaAd = _T(""); m_Adresil = _T(""); m_Adres = _T(""); m_Adresilce = _T(""); m_AdresWebSayfa = _T(""); m_AdresAciklama = _T(""); m_nFields = 14; //}}AFX_FIELD_INIT m_nDefaultType = snapshot; } CString CAdresSet::GetDefaultConnect() { return _T("ODBC;DSN=Adres"); } CString CAdresSet::GetDefaultSQL() { return _T("[Adres]"); } void CAdresSet::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CAdresSet) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Long(pFX, _T("[AdresNo]"), m_AdresNo); RFX_Text(pFX, _T("[Adresisim]"), m_Adresisim); RFX_Text(pFX, _T("[AdresSoyad]"), m_AdresSoyad); RFX_Text(pFX, _T("[AdresTelefon]"), m_AdresTelefon); RFX_Text(pFX, _T("[AdresCepTelefon]"), m_AdresCepTelefon); RFX_Text(pFX, _T("[AdresMail]"), m_AdresMail);

124
RFX_Long(pFX, _T("[AdresYas]"), m_AdresYas); RFX_Text(pFX, _T("[AdresMeslek]"), m_AdresMeslek); RFX_Text(pFX, _T("[AdresTakmaAd]"), m_AdresTakmaAd); RFX_Text(pFX, _T("[Adresil]"), m_Adresil); RFX_Text(pFX, _T("[Adres]"), m_Adres); RFX_Text(pFX, _T("[Adresilce]"), m_Adresilce); RFX_Text(pFX, _T("[AdresWebSayfa]"), m_AdresWebSayfa); RFX_Text(pFX, _T("[AdresAciklama]"), m_AdresAciklama); //}}AFX_FIELD_MAP } ///////////////////////////////////////////////////////////////////////////// // CAdresSet diagnostics #ifdef _DEBUG void CAdresSet::AssertValid() const { CRecordset::AssertValid(); } void CAdresSet::Dump(CDumpContext& dc) const { CRecordset::Dump(dc); } #endif //_DEBUG

AdresView.cpp
// AdresView.cpp : implementation of the CAdresView class // #include "stdafx.h" #include "Adres.h" #include "AdresSet.h" #include "AdresDoc.h" #include "AdresView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAdresView IMPLEMENT_DYNCREATE(CAdresView, CRecordView) BEGIN_MESSAGE_MAP(CAdresView, CRecordView) //{{AFX_MSG_MAP(CAdresView) ON_BN_CLICKED(IDC_BUTTON_YENIKAYIT, OnButtonYenikayit) ON_BN_CLICKED(IDC_BUTTON_ARA, OnButtonAra) ON_BN_CLICKED(IDC_BUTTON_SIL, OnButtonSil) ON_BN_CLICKED(IDC_BUTTON_ILKKAYIT, OnButtonIlkkayit) ON_BN_CLICKED(IDC_BUTTON_KAYDET, OnButtonKaydet) ON_BN_CLICKED(IDC_BUTTON_SONKAYIT, OnButtonSonkayit) ON_BN_CLICKED(IDC_BUTTON_ILERI, OnButtonIleri) ON_BN_CLICKED(IDC_BUTTON_GERI, OnButtonGeri) ON_BN_CLICKED(IDC_BUTTON_GUNCELLE, OnButtonGuncelle) ON_BN_CLICKED(IDC_RADIO_ADRES, OnRadioAdres) ON_BN_CLICKED(IDC_RADIO_ISIM, OnRadioIsim) ON_BN_CLICKED(IDC_RADIO_SOYAD, OnRadioSoyad) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)

125
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAdresView construction/destruction CAdresView::CAdresView() : CRecordView(CAdresView::IDD) { //{{AFX_DATA_INIT(CAdresView) m_pSet = NULL; //}}AFX_DATA_INIT // TODO: add construction code here } CAdresView::~CAdresView() { } void CAdresView::DoDataExchange(CDataExchange* pDX) { CRecordView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAdresView) DDX_Control(pDX, IDC_EDIT_ARA, m_ara); DDX_Control(pDX, IDC_RADIO_SOYAD, m_radioSoyad); DDX_Control(pDX, IDC_RADIO_ISIM, m_radioisim); DDX_Control(pDX, IDC_RADIO_ADRES, m_radioAdres); DDX_FieldText(pDX, IDC_EDIT_NO, m_pSet->m_AdresNo, m_pSet); DDX_FieldText(pDX, IDC_EDIT_ACIKLAMA, m_pSet->m_AdresAciklama, m_pSet); DDX_FieldText(pDX, IDC_EDIT_ADRES, m_pSet->m_Adres, m_pSet); DDX_FieldText(pDX, IDC_EDIT_CEPTELEFON, m_pSet->m_AdresCepTelefon, m_pSet); DDX_FieldText(pDX, IDC_EDIT_IL, m_pSet->m_Adresil, m_pSet); DDX_FieldText(pDX, IDC_EDIT_ILCE, m_pSet->m_Adresilce, m_pSet); DDX_FieldText(pDX, IDC_EDIT_ISIM, m_pSet->m_Adresisim, m_pSet); DDX_FieldText(pDX, IDC_EDIT_MAIL, m_pSet->m_AdresMail, m_pSet); DDX_FieldText(pDX, IDC_EDIT_MESLEK, m_pSet->m_AdresMeslek, m_pSet); DDX_FieldText(pDX, IDC_EDIT_SOYAD, m_pSet->m_AdresSoyad, m_pSet); DDX_FieldText(pDX, IDC_EDIT_TAKMAAD, m_pSet->m_AdresTakmaAd, m_pSet); DDX_FieldText(pDX, IDC_EDIT_TELEFON, m_pSet->m_AdresTelefon, m_pSet); DDX_FieldText(pDX, IDC_EDIT_WEBSAYFA, m_pSet->m_AdresWebSayfa, m_pSet); DDX_FieldText(pDX, IDC_EDIT_YAS, m_pSet->m_AdresYas, m_pSet); //}}AFX_DATA_MAP } BOOL CAdresView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CRecordView::PreCreateWindow(cs); } void CAdresView::OnInitialUpdate() { m_pSet = &GetDocument()->m_adresSet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } ///////////////////////////////////////////////////////////////////////////// // CAdresView printing BOOL CAdresView::OnPreparePrinting(CPrintInfo* pInfo)

126
{ // default preparation return DoPreparePrinting(pInfo); } void CAdresView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CAdresView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CAdresView diagnostics #ifdef _DEBUG void CAdresView::AssertValid() const { CRecordView::AssertValid(); } void CAdresView::Dump(CDumpContext& dc) const { CRecordView::Dump(dc); } CAdresDoc* CAdresView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAdresDoc))); return (CAdresDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CAdresView database support CRecordset* CAdresView::OnGetRecordset() { return m_pSet; } ///////////////////////////////////////////////////////////////////////////// // CAdresView message handlers void CAdresView::OnButtonYenikayit() { // TODO: Add your control notification handler code here m_pSet->AddNew(); CEdit* pCtrl = (CEdit*)GetDlgItem(IDC_EDIT_NO); int result = pCtrl->SetReadOnly(FALSE); UpdateData(FALSE); } void CAdresView::OnButtonAra() { // TODO: Add your control notification handler code here CString Deger, str ; m_ara.GetWindowText(Deger); if (m_radioAdres.GetCheck()) str = "Adres = '" + Deger + "'"; if (m_radioisim.GetCheck()) str = "Adresisim = '" + Deger + "'"; if (m_radioSoyad.GetCheck()) str = "AdresSoyad = '" + Deger + "'";

127
m_pSet->Close(); m_pSet->m_strFilter = str; m_pSet->Open(); if (m_pSet->GetRecordCount()>0) m_pSet->MoveFirst(); UpdateData(FALSE); } void CAdresView::OnButtonSil() { // TODO: Add your control notification handler code here m_pSet->Delete(); m_pSet->MoveNext(); if (m_pSet->IsEOF()) m_pSet->MoveLast(); if (m_pSet->IsBOF()) m_pSet->SetFieldNull(NULL); UpdateData(FALSE); } void CAdresView::OnButtonIlkkayit() { // TODO: Add your control notification handler code here m_pSet->MoveFirst(); UpdateData(FALSE); } void CAdresView::OnButtonKaydet() { // TODO: Add your control notification handler code here UpdateData(FALSE); } void CAdresView::OnButtonSonkayit() { // TODO: Add your control notification handler code here m_pSet->MoveLast(); UpdateData(FALSE); } void CAdresView::OnButtonIleri() { // TODO: Add your control notification handler code here if (m_pSet->IsBOF()==TRUE){ m_pSet->MoveNext(); } if (m_pSet->IsEOF()==FALSE){ m_pSet->MoveNext(); } UpdateData(FALSE); } void CAdresView::OnButtonGeri() { // TODO: Add your control notification handler code here if (m_pSet->IsEOF()==TRUE){ m_pSet->MovePrev(); } if (m_pSet->IsBOF()==FALSE){ m_pSet->MovePrev(); } UpdateData(FALSE); } void CAdresView::OnButtonGuncelle()

128
{ // TODO: Add your control notification handler code here m_pSet->Update(); UpdateData(FALSE); } void CAdresView::OnRadioAdres() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "Adres"; m_pSet->Open(); UpdateData(FALSE); } void CAdresView::OnRadioIsim() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "Adresisim"; m_pSet->Open(); UpdateData(FALSE); } void CAdresView::OnRadioSoyad() { // TODO: Add your control notification handler code here m_pSet->Close(); m_pSet->m_strSort = "AdresSoyad"; m_pSet->Open(); UpdateData(FALSE); }

MainFrm.cpp
// MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "Adres.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS,

129
ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const

130
{ CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers

StdAfx.cpp
// stdafx.cpp : source file that includes just the standard includes // Adres.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h"

Adres.h
// Adres.h : main header file for the ADRES application // #if !defined(AFX_ADRES_H__A0FF8B04_732E_11D6_B6BB_9AC656EAB175__INCLUDED_) #define AFX_ADRES_H__A0FF8B04_732E_11D6_B6BB_9AC656EAB175__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols

///////////////////////////////////////////////////////////////////////////// // CAdresApp: // See Adres.cpp for the implementation of this class // class CAdresApp : public CWinApp { public: CAdresApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAdresApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CAdresApp) afx_msg void OnAppAbout(); // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}}

131
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_ADRES_H__A0FF8B04_732E_11D6_B6BB_9AC656EAB175__INCLUDED_)

AdresDoc.h
// AdresDoc.h : interface of the CAdresDoc class // ///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_ADRESDOC_H__A0FF8B0A_732E_11D6_B6BB_9AC656EAB175__INCLUDED_) #define AFX_ADRESDOC_H__A0FF8B0A_732E_11D6_B6BB_9AC656EAB175__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "AdresSet.h" class CAdresDoc : public CDocument { protected: // create from serialization only CAdresDoc(); DECLARE_DYNCREATE(CAdresDoc) // Attributes public: CAdresSet m_adresSet; // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAdresDoc) public: virtual BOOL OnNewDocument(); //}}AFX_VIRTUAL // Implementation public: virtual ~CAdresDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generated message map functions protected: //{{AFX_MSG(CAdresDoc) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // ! defined(AFX_ADRESDOC_H__A0FF8B0A_732E_11D6_B6BB_9AC656EAB175__INCLUDED_)

132

AdresSet.h
// AdresSet.h : interface of the CAdresSet class // ///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_ADRESSET_H__A0FF8B0E_732E_11D6_B6BB_9AC656EAB175__INCLUDED_) #define AFX_ADRESSET_H__A0FF8B0E_732E_11D6_B6BB_9AC656EAB175__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CAdresSet : public CRecordset { public: CAdresSet(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CAdresSet) // Field/Param Data //{{AFX_FIELD(CAdresSet, CRecordset) long m_AdresNo; CString m_Adresisim; CString m_AdresSoyad; CString m_AdresTelefon; CString m_AdresCepTelefon; CString m_AdresMail; long m_AdresYas; CString m_AdresMeslek; CString m_AdresTakmaAd; CString m_Adresil; CString m_Adres; CString m_Adresilce; CString m_AdresWebSayfa; CString m_AdresAciklama; //}}AFX_FIELD // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAdresSet) public: virtual CString GetDefaultConnect(); // Default connection string virtual CString GetDefaultSQL(); // default SQL for Recordset virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support //}}AFX_VIRTUAL // Implementation #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // ! defined(AFX_ADRESSET_H__A0FF8B0E_732E_11D6_B6BB_9AC656EAB175__INCLUDED_)

AdresView.h
// AdresView.h : interface of the CAdresView class //

133
///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_ADRESVIEW_H__A0FF8B0C_732E_11D6_B6BB_9AC656EAB175__INCLUDED_) #define AFX_ADRESVIEW_H__A0FF8B0C_732E_11D6_B6BB_9AC656EAB175__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CAdresSet; class CAdresView : public CRecordView { protected: // create from serialization only CAdresView(); DECLARE_DYNCREATE(CAdresView) public: //{{AFX_DATA(CAdresView) enum { IDD = IDD_ADRES_FORM }; CEdit m_ara; CButton m_radioSoyad; CButton m_radioisim; CButton m_radioAdres; CAdresSet* m_pSet; //}}AFX_DATA // Attributes public: CAdresDoc* GetDocument(); // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAdresView) public: virtual CRecordset* OnGetRecordset(); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support virtual void OnInitialUpdate(); // called first time after construct virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL // Implementation public: virtual ~CAdresView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generated message map functions protected: //{{AFX_MSG(CAdresView) afx_msg void OnButtonYenikayit(); afx_msg void OnButtonAra(); afx_msg void OnButtonSil(); afx_msg void OnButtonIlkkayit(); afx_msg void OnButtonKaydet(); afx_msg void OnButtonSonkayit();

134
afx_msg void OnButtonIleri(); afx_msg void OnButtonGeri(); afx_msg void OnButtonGuncelle(); afx_msg void OnRadioAdres(); afx_msg void OnRadioIsim(); afx_msg void OnRadioSoyad(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // debug version in AdresView.cpp inline CAdresDoc* CAdresView::GetDocument() { return (CAdresDoc*)m_pDocument; } #endif ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // ! defined(AFX_ADRESVIEW_H__A0FF8B0C_732E_11D6_B6BB_9AC656EAB175__INCLUDED_)

MainFrm.h
// MainFrm.h : interface of the CMainFrame class // ///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_MAINFRM_H__A0FF8B08_732E_11D6_B6BB_9AC656EAB175__INCLUDED_) #define AFX_MAINFRM_H__A0FF8B08_732E_11D6_B6BB_9AC656EAB175__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CMainFrame : public CFrameWnd { protected: // create from serialization only CMainFrame(); DECLARE_DYNCREATE(CMainFrame) // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMainFrame) virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL // Implementation public: virtual ~CMainFrame(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar;

135

// Generated message map functions protected: //{{AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_MAINFRM_H__A0FF8B08_732E_11D6_B6BB_9AC656EAB175__INCLUDED_)

Resource.h
//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by Adres.rc // #define IDD_ABOUTBOX 100 #define IDD_ADRES_FORM 101 #define IDP_FAILED_OPEN_DATABASE 103 #define IDR_MAINFRAME 128 #define IDR_ADRESTYPE 129 #define IDC_EDIT_NO 1000 #define IDC_EDIT_ISIM 1001 #define IDC_EDIT_SOYAD 1002 #define IDC_EDIT_TELEFON 1003 #define IDC_EDIT_CEPTELEFON 1004 #define IDC_EDIT_MAIL 1005 #define IDC_EDIT_YAS 1006 #define IDC_EDIT_MESLEK 1007 #define IDC_EDIT_TAKMAAD 1008 #define IDC_EDIT_IL 1009 #define IDC_EDIT_ADRES 1010 #define IDC_EDIT_ILCE 1011 #define IDC_EDIT_WEBSAYFA 1012 #define IDC_EDIT_ACIKLAMA 1013 #define IDC_BUTTON_KAYDET 1014 #define IDC_BUTTON_YENIKAYIT 1015 #define IDC_BUTTON_SIL 1016 #define IDC_BUTTON_GUNCELLE 1017 #define IDC_BUTTON_ILKKAYIT 1018 #define IDC_BUTTON_GERI 1019 #define IDC_BUTTON_ILERI 1020 #define IDC_BUTTON_SONKAYIT 1021 #define IDC_RADIO_ISIM 1022 #define IDC_RADIO_SOYAD 1023 #define IDC_RADIO_ADRES 1024 #define IDC_EDIT_ARA 1025 #define IDC_BUTTON_ARA 1026 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 130 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1027 #define _APS_NEXT_SYMED_VALUE 101

136
#endif #endif

StdAfx.h
// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__A0FF8B06_732E_11D6_B6BB_9AC656EAB175__INCLUDED_) #define AFX_STDAFX_H__A0FF8B06_732E_11D6_B6BB_9AC656EAB175__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

#include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdb.h> // MFC ODBC database classes #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__A0FF8B06_732E_11D6_B6BB_9AC656EAB175__INCLUDED_)

Kaynaklar
Learn Microsoft Visual C++ 6.0 Now / Chuck SPHAR

137 Sams Teach Yourself Visual C++ 6 in 24 Hours / Mickey WILLIAMS C++ Temel renim Klavuzu / Herbert SCHILDT Sams Teach Yourself Database with Visual C++ 6 in 21 Days / Lyn Robison Special Edition Using Microsoft Visual Studio / G. A. Sullivan Special Edition Using Visual C++ 6 / Kate Gregory MSDN Ktphanesi Microsoft Online Help Microsoft Standart C / Bahattin BAYBURAN

zgemi

138 1981de Kartalda dodum. Lise renimine Kartal Meslek Lisesinin Tesviye blmnde baladm. Birinci senenin sonunda Kartal Teknik Lisesinin Makine blmne getim. Lise renimimin 3. senesinde niversite snavlarna girerek Trakya niversitesi Makine Mhendislii blmn kazandm. Fakat Makine Mhendislii blmn istemediim iin snavlara tekrar girmeye karar verdim. Bylece lise renimimin 4. senesinde niversite snavlarna tekrar girerek stanbul niversitesi Bilgisayar Mhendislii blmn kazandm. niversite renimimin 2. senesinin sonunda Gonca Grubu yazlm irketinde programc olarak yazlm stajn yaptm. Staj bitiminden sonra 3 ay daha bu irkette altm. irket Delphi programlama dili zerinde alma yapyordu ve zaten bildiim delphi dilini daha ok gelitirmeme frsat dodu. 3. sene ubat aynda Markum Biliim Teknolojileri isimli irkette ASP programcs olarak almaya baladm. Bu srada www.soruvecevap.com sitesini yaptm ve yaymladm. Bu irkette 5 ay altktan sonra donanm stajn yapmak iin sistem bilgisayara girdim. Stajm tamamladktan sonra tekrar Markumda almaya baladm. 4 ay kadar daha altktan sonra iten ayrldm. uanda ise Dosof irketinde ASP programcs olarak 1 aydr alyorum. Alm olduum projeyi bitirmek zereyim. www.voyagerbook.com sitesinin programlama ksmn ben yapyorum.

Anda mungkin juga menyukai